Compare commits
18 Commits
v1.22.1
...
v1.22.2-rc.2
| Author | SHA1 | Date | |
|---|---|---|---|
| 6aa04118a6 | |||
| 1b32e9f858 | |||
| a523fef78e | |||
| ce2a68622c | |||
| a29605750d | |||
| 5e384c9185 | |||
| a1cc293c21 | |||
| 452daad14b | |||
| fbdaa265d3 | |||
| 46b375e8cc | |||
| 1e9bf17512 | |||
| 413c8cf4ea | |||
| d8296ce111 | |||
| 06a1635d1d | |||
| 36221b70ac | |||
| bf1e418e4a | |||
| 922946683d | |||
| 816354e66b |
@@ -5,16 +5,33 @@ on:
|
||||
push:
|
||||
|
||||
env:
|
||||
# The go version to use for builds.
|
||||
GO_VERSION: "1.19.3"
|
||||
|
||||
# Optimize compatibility on the slow archictures.
|
||||
GO386: softfloat
|
||||
GOARM: "5"
|
||||
GOMIPS: softfloat
|
||||
|
||||
# Avoid hilarious amounts of obscuring log output when running tests.
|
||||
LOGGER_DISCARD: "1"
|
||||
|
||||
# A note on actions and third party code... The actions under actions/ (like
|
||||
# `uses: actions/checkout`) are maintained by GitHub, and we need to trust
|
||||
# GitHub to maintain their code and infrastructure or we're in deep shit in
|
||||
# general. The same doesn't necessarily apply to other actions authors, so
|
||||
# some care needs to be taken when adding steps, especially in the paths
|
||||
# that lead up to code being packaged and signed.
|
||||
|
||||
jobs:
|
||||
|
||||
#
|
||||
# Windows, quick build and test, runs always
|
||||
#
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
name: Build and test on Windows
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Set git to use LF
|
||||
# Without this, the checkout will happen with CRLF line endings,
|
||||
@@ -40,9 +57,16 @@ jobs:
|
||||
go run build.go
|
||||
go run build.go test
|
||||
|
||||
#
|
||||
# Windows, build signed packages
|
||||
#
|
||||
|
||||
package-windows:
|
||||
runs-on: windows-latest
|
||||
name: Create packages for Windows
|
||||
runs-on: windows-latest
|
||||
# We only run this job for release pushes.
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release')
|
||||
# This is also enforced by the environment which contains the secrets.
|
||||
environment: signing
|
||||
needs:
|
||||
- build-windows
|
||||
@@ -62,7 +86,6 @@ jobs:
|
||||
- uses: actions/setup-go@v3
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
|
||||
@@ -18,6 +18,7 @@ Adam Piggott (ProactiveServices) <aD@simplypeachy.co.uk> <simplypeachy@users.nor
|
||||
Adel Qalieh (adelq) <aqalieh95@gmail.com> <adelq@users.noreply.github.com>
|
||||
Alan Pope <alan@popey.com>
|
||||
Alberto Donato <albertodonato@users.noreply.github.com>
|
||||
Aleksey Vasenev <margtu-fivt@ya.ru>
|
||||
Alessandro G. (alessandro.g89) <alessandro.g89@gmail.com>
|
||||
Alex Lindeman <139387+aelindeman@users.noreply.github.com>
|
||||
Alex Xu <alex.hello71@gmail.com>
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@ EXPOSE 8384 22000/tcp 22000/udp 21027/udp
|
||||
|
||||
VOLUME ["/var/syncthing"]
|
||||
|
||||
RUN apk add --no-cache ca-certificates su-exec tzdata libcap
|
||||
RUN apk add --no-cache ca-certificates curl libcap su-exec tzdata
|
||||
|
||||
COPY --from=builder /src/syncthing /bin/syncthing
|
||||
COPY --from=builder /src/script/docker-entrypoint.sh /bin/entrypoint.sh
|
||||
@@ -23,7 +23,7 @@ COPY --from=builder /src/script/docker-entrypoint.sh /bin/entrypoint.sh
|
||||
ENV PUID=1000 PGID=1000 HOME=/var/syncthing
|
||||
|
||||
HEALTHCHECK --interval=1m --timeout=10s \
|
||||
CMD nc -z 127.0.0.1 8384 || exit 1
|
||||
CMD curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
|
||||
|
||||
ENV STGUIADDRESS=0.0.0.0:8384
|
||||
ENTRYPOINT ["/bin/entrypoint.sh", "/bin/syncthing", "-home", "/var/syncthing/config"]
|
||||
|
||||
@@ -169,7 +169,11 @@ table.table-auto td {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
display: inline-block;
|
||||
vertical-align: -20%;
|
||||
vertical-align: -10%;
|
||||
background-size: contain;
|
||||
/* Simulate same width as Fork Awesome icons. */
|
||||
margin-left: .14285715em;
|
||||
margin-right: .14285715em;
|
||||
}
|
||||
|
||||
.remote-devices-panel {
|
||||
@@ -520,6 +524,11 @@ ul.three-columns li, ul.two-columns li {
|
||||
* columns. */
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
/* Move share buttons below device ID on small screens. */
|
||||
#shareDeviceIdButtons {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.form-horizontal .form-group {
|
||||
@@ -549,6 +558,13 @@ html[lang|="ko"] i {
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Prevent buttons from jumping up and down
|
||||
when a tooltip is shown for one of them. */
|
||||
.btn-group-vertical > .tooltip + .btn,
|
||||
.btn-group-vertical > .tooltip + .btn-group {
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.select-on-click {
|
||||
-webkit-user-select: all;
|
||||
user-select: all;
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Не е свързано (неизползвано)",
|
||||
"Disconnected (Unused)": "Не е свързано (неизползвано)",
|
||||
"Discovered": "Открит",
|
||||
"Discovery": "Откриване",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Минимално свободно дисково пространство",
|
||||
"Mod. Device": "Променящо устройство",
|
||||
"Mod. Time": "Дата на промяна",
|
||||
"More than a month ago": "Преди повече от месец",
|
||||
"More than a week ago": "Преди повече от седмица",
|
||||
"More than a year ago": "Преди повече от година",
|
||||
"Move to top of queue": "Премества най-отпред на опашката",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Заместващ символ за няколко нива (съвпада с папки, вложени на няколко нива)",
|
||||
"Never": "никога",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desactiva la comparació i sincronització dels permisos de fitxers. Útil en sistemes amb permisos personalitzats o no existents (p. ex. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Descartar",
|
||||
"Disconnected": "Desconnectat",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Desconnectat (No util·litzat)",
|
||||
"Discovered": "Descobert",
|
||||
"Discovery": "Descobriment",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Espai minim de disc lliure",
|
||||
"Mod. Device": "Dispositiu Modificador",
|
||||
"Mod. Time": "Temps de la Modificació",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Moure al principi de la cua",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Comodí multinivell (coincideix amb múltiples nivells de directoris)",
|
||||
"Never": "Mai",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Zakazuje porovnávání a synchronizaci souborových oprávnění. To je užitečné na systémech, kde oprávnění souborů chybí, nebo jsou nestandardní (např. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Zahodit",
|
||||
"Disconnected": "Odpojeno",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Odpojeno (nepoužité)",
|
||||
"Discovered": "Objeveno",
|
||||
"Discovery": "Objevování",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimální velikost volného místa na úložišti",
|
||||
"Mod. Device": "Zařízení, které provedlo změnu",
|
||||
"Mod. Time": "Okamžik změny",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Přesunout na začátek fronty",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Víceúrovňový zástupný znak (shody i skrz více úrovní složek)",
|
||||
"Never": "Nikdy",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Deaktiverer sammenligning og synkronisering af fil tilladelser. Nyttigt på systemer med ikke-eksisterende eller tilpasset tilladelser (f.eks. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Behold ikke",
|
||||
"Disconnected": "Ikke tilsluttet",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Ikke tilsluttet (ubrugt)",
|
||||
"Discovered": "Opdaget",
|
||||
"Discovery": "Opslag",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Mindst ledig diskplads",
|
||||
"Mod. Device": "Enhed for ændring",
|
||||
"Mod. Time": "Tid for ændring",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Flyt til toppen af køen",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Flerniveau-wildcard (matcher flere mappeniveauer)",
|
||||
"Never": "Aldrig",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Deaktiviert Vergleich und Synchronisierung der Dateiberechtigungen. Dies ist hilfreich für Dateisysteme ohne konfigurierbare Berechtigungsparameter (z. B. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Verwerfen",
|
||||
"Disconnected": "Getrennt",
|
||||
"Disconnected (Inactive)": "Getrennt (Inaktiv)",
|
||||
"Disconnected (Unused)": "Getrennt (Nicht genutzt)",
|
||||
"Discovered": "Ermittelt",
|
||||
"Discovery": "Gerätesuche",
|
||||
@@ -135,7 +136,7 @@
|
||||
"Enter ignore patterns, one per line.": "Geben Sie Ignoriermuster ein, eines pro Zeile.",
|
||||
"Enter up to three octal digits.": "Tragen Sie bis zu drei oktale Ziffern ein.",
|
||||
"Error": "Fehler",
|
||||
"Extended Attributes": "Erweiterte Dateiattribute",
|
||||
"Extended Attributes": "Erweiterte Attribute",
|
||||
"External": "Extern",
|
||||
"External File Versioning": "Externe Dateiversionierung",
|
||||
"Failed Items": "Fehlgeschlagene Elemente",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimal freier Festplattenspeicher",
|
||||
"Mod. Device": "Änd.-gerät",
|
||||
"Mod. Time": "Änd.-zeit",
|
||||
"More than a month ago": "Vor mehr als einem Monat",
|
||||
"More than a week ago": "Vor mehr als einer Woche",
|
||||
"More than a year ago": "Vor mehr als einem Jahr",
|
||||
"Move to top of queue": "An den Anfang der Warteschlange setzen",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Verschachteltes Maskenzeichen (wird für verschachtelte Ordner verwendet)",
|
||||
"Never": "Nie",
|
||||
@@ -250,7 +254,7 @@
|
||||
"Outgoing Rate Limit (KiB/s)": "Ausgehendes Datenratelimit (KiB/s)",
|
||||
"Override": "Überschreiben",
|
||||
"Override Changes": "Änderungen überschreiben",
|
||||
"Ownership": "Besitzer",
|
||||
"Ownership": "Besitzinformation",
|
||||
"Path": "Pfad",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Pfad zum Ordner auf dem lokalen Gerät. Ordner wird erzeugt, wenn er nicht existiert. Das Tilden-Zeichen (~) kann als Abkürzung benutzt werden für",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Pfad in dem Versionen gespeichert werden sollen (leer lassen, wenn der Standard .stversions Ordner für den geteilten Ordner verwendet werden soll).",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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",
|
||||
"Disconnected": "Disconnected",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Disconnected (Unused)",
|
||||
"Discovered": "Discovered",
|
||||
"Discovery": "Discovery",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimum Free Disk Space",
|
||||
"Mod. Device": "Mod. Device",
|
||||
"Mod. Time": "Mod. Time",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Move to top of queue",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Multi level wildcard (matches multiple directory levels)",
|
||||
"Never": "Never",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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",
|
||||
"Disconnected": "Disconnected",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Disconnected (Unused)",
|
||||
"Discovered": "Discovered",
|
||||
"Discovery": "Discovery",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimum Free Disk Space",
|
||||
"Mod. Device": "Mod. Device",
|
||||
"Mod. Time": "Mod. Time",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Move to top of queue",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Multi level wildcard (matches multiple directory levels)",
|
||||
"Never": "Never",
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
"Automatically create or share folders that this device advertises at the default path.": "Automatically create or share folders that this device advertises at the default path.",
|
||||
"Available debug logging facilities:": "Available debug logging facilities:",
|
||||
"Be careful!": "Be careful!",
|
||||
"Body:": "Body:",
|
||||
"Bugs": "Bugs",
|
||||
"Cancel": "Cancel",
|
||||
"Changelog": "Changelog",
|
||||
@@ -67,6 +68,9 @@
|
||||
"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.": "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.",
|
||||
"Copied from elsewhere": "Copied from elsewhere",
|
||||
"Copied from original": "Copied from original",
|
||||
"Copied!": "Copied!",
|
||||
"Copy": "Copy",
|
||||
"Copy failed! Try to select and copy manually.": "Copy failed! Try to select and copy manually.",
|
||||
"Currently Shared With Devices": "Currently Shared With Devices",
|
||||
"Custom Range": "Custom Range",
|
||||
"Danger!": "Danger!",
|
||||
@@ -101,6 +105,7 @@
|
||||
"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",
|
||||
"Disconnected": "Disconnected",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Disconnected (Unused)",
|
||||
"Discovered": "Discovered",
|
||||
"Discovery": "Discovery",
|
||||
@@ -206,6 +211,7 @@
|
||||
"Last seen": "Last seen",
|
||||
"Latest Change": "Latest Change",
|
||||
"Learn more": "Learn more",
|
||||
"Learn more at {%url%}": "Learn more at {{url}}",
|
||||
"Limit": "Limit",
|
||||
"Listener Failures": "Listener Failures",
|
||||
"Listener Status": "Listener Status",
|
||||
@@ -228,6 +234,9 @@
|
||||
"Minimum Free Disk Space": "Minimum Free Disk Space",
|
||||
"Mod. Device": "Mod. Device",
|
||||
"Mod. Time": "Mod. Time",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Move to top of queue",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Multi level wildcard (matches multiple directory levels)",
|
||||
"Never": "Never",
|
||||
@@ -322,6 +331,8 @@
|
||||
"Settings": "Settings",
|
||||
"Share": "Share",
|
||||
"Share Folder": "Share Folder",
|
||||
"Share by Email": "Share by Email",
|
||||
"Share by SMS": "Share by SMS",
|
||||
"Share this folder?": "Share this folder?",
|
||||
"Shared Folders": "Shared Folders",
|
||||
"Shared With": "Shared With",
|
||||
@@ -353,6 +364,7 @@
|
||||
"Statistics": "Statistics",
|
||||
"Stopped": "Stopped",
|
||||
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{{receiveEncrypted}}\" too.",
|
||||
"Subject:": "Subject:",
|
||||
"Support": "Support",
|
||||
"Support Bundle": "Support Bundle",
|
||||
"Sync Extended Attributes": "Sync Extended Attributes",
|
||||
@@ -360,9 +372,11 @@
|
||||
"Sync Protocol Listen Addresses": "Sync Protocol Listen Addresses",
|
||||
"Sync Status": "Sync Status",
|
||||
"Syncing": "Syncing",
|
||||
"Syncthing device ID for \"{%devicename%}\"": "Syncthing device ID for \"{{devicename}}\"",
|
||||
"Syncthing has been shut down.": "Syncthing has been shut down.",
|
||||
"Syncthing includes the following software or portions thereof:": "Syncthing includes the following software or portions thereof:",
|
||||
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing is Free and Open Source Software licensed as MPL v2.0.",
|
||||
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.",
|
||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing is listening on the following network addresses for connection attempts from other devices:",
|
||||
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.",
|
||||
"Syncthing is restarting.": "Syncthing is restarting.",
|
||||
@@ -392,6 +406,7 @@
|
||||
"The following items could not be synchronized.": "The following items could not be synchronized.",
|
||||
"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 methods are used to discover other devices on the network and announce this device to be found by others:",
|
||||
"The following text will automatically be inserted into a new message.": "The following text will automatically be inserted into a new message.",
|
||||
"The following unexpected items were found.": "The following unexpected items were found.",
|
||||
"The interval must be a positive number of seconds.": "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 interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.",
|
||||
@@ -418,6 +433,7 @@
|
||||
"This setting controls the free space required on the home (i.e., index database) disk.": "This setting controls the free space required on the home (i.e., index database) disk.",
|
||||
"Time": "Time",
|
||||
"Time the item was last modified": "Time the item was last modified",
|
||||
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "To connect with the Syncthing device named \"{{devicename}}\", add a new remote device on your end with this ID:",
|
||||
"Today": "Today",
|
||||
"Trash Can": "Trash Can",
|
||||
"Trash Can File Versioning": "Trash Can File Versioning",
|
||||
@@ -469,6 +485,7 @@
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.",
|
||||
"Yes": "Yes",
|
||||
"Yesterday": "Yesterday",
|
||||
"You can also copy and paste the text into a new message manually.": "You can also copy and paste the text into a new message manually.",
|
||||
"You can also select one of these nearby devices:": "You can also select one of these nearby devices:",
|
||||
"You can change your choice at any time in the Settings dialog.": "You can change your choice at any time in the Settings dialog.",
|
||||
"You can read more about the two release channels at the link below.": "You can read more about the two release channels at the link below.",
|
||||
@@ -477,6 +494,8 @@
|
||||
"You have unsaved changes. Do you really want to discard them?": "You have unsaved changes. Do you really want to discard them?",
|
||||
"You must keep at least one version.": "You must keep at least one version.",
|
||||
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "You should never add or change anything locally in a \"{{receiveEncrypted}}\" folder.",
|
||||
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Your SMS app should open to let you choose the recipient and send it from your own number.",
|
||||
"Your email app should open to let you choose the recipient and send it from your own address.": "Your email app should open to let you choose the recipient and send it from your own address.",
|
||||
"days": "days",
|
||||
"directories": "directories",
|
||||
"files": "files",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desactiva la comparación y sincronización de los permisos de los ficheros. Útil en sistemas con permisos inexistentes o personalizados (por ejemplo, FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Descartar",
|
||||
"Disconnected": "Desconectado",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Desconectado (Sin uso)",
|
||||
"Discovered": "Descubierto",
|
||||
"Discovery": "Descubrimiento",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Espacio mínimo libre en disco",
|
||||
"Mod. Device": "Dispositivo modificador",
|
||||
"Mod. Time": "Tiempo de la modificación",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Mover al principio de la cola",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Comodín multinivel (coincide con múltiples niveles de directorio)",
|
||||
"Never": "Nunca",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desactiva la comparación y sincronización de los permisos de los archivos. Útil en sistemas con permisos inexistentes o personalizados (por ejemplo, FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Descartar",
|
||||
"Disconnected": "Desconectado",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Desconectado (Sin Uso)",
|
||||
"Discovered": "Descubierto",
|
||||
"Discovery": "Descubrimiento",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Espacio mínimo libre en disco",
|
||||
"Mod. Device": "Dispositivo mod.",
|
||||
"Mod. Time": "Hora mod.",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Mover al principio de la cola",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Comodín multinivel (coincide con múltiples niveles de directorio)",
|
||||
"Never": "Nunca",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"A device with that ID is already added.": "Jadanik bada Id hori duen tresna bat",
|
||||
"A negative number of days doesn't make sense.": "0 edo zenbaki positiboa onartzen da bakarrik",
|
||||
"A device with that ID is already added.": "Jadanik bada ID hori duen tresna bat",
|
||||
"A negative number of days doesn't make sense.": "Egun kopuru negatibo batek ez du zentzurik",
|
||||
"A new major version may not be compatible with previous versions.": "Aldaketa garrantzitsuak dituen bertsio berri bat ez da beharbada bateragarria izanen bertsio zaharragoekin.",
|
||||
"API Key": "API giltza",
|
||||
"About": "Honi buruz",
|
||||
@@ -19,7 +19,7 @@
|
||||
"Advanced": "Aitzinatua",
|
||||
"Advanced Configuration": "Konfigurazio aitzinatua",
|
||||
"All Data": "Datu guziak",
|
||||
"All Time": "All Time",
|
||||
"All Time": "Denbora guztia",
|
||||
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Gailu honekin partekatutako karpeta guztiak pasahitz baten bidez babestu behar dira, horrela, bidalitako datu guztiak irakurri ezinak izango dira emandako pasahitzik gabe.",
|
||||
"Allow Anonymous Usage Reporting?": "Izenik gabeko erabiltze erreportak baimendu?",
|
||||
"Allowed Networks": "Sare baimenduak",
|
||||
@@ -28,7 +28,7 @@
|
||||
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Kanpoko kontrolagailu batek fitxategien bertsioak kudeatzen ditu. Fitxategiak kendu behar ditu errepertorio sinkronizatuan. Aplikaziorako ibilbideak espazioak baditu, komatxo artean egon behar du.",
|
||||
"Anonymous Usage Reporting": "Izenik gabeko erabiltze erreportak",
|
||||
"Anonymous usage report format has changed. Would you like to move to the new format?": "Erabilera anonimoko txostenaren formatua aldatu egin da. Formatu berria erabili nahi duzu?",
|
||||
"Apply": "Apply",
|
||||
"Apply": "Ezarri",
|
||||
"Are you sure you want to override all remote changes?": "Ziur zaude urruneko aldaketa guztiak gainidatzi nahi dituzula?",
|
||||
"Are you sure you want to permanently delete all these files?": "Ziur zaude fitxategi guzti hauek betirako ezabatu nahi dituzula?",
|
||||
"Are you sure you want to remove device {%name%}?": "Ziur zaude {{name}} gailua ezabatu nahi duzula?",
|
||||
@@ -36,7 +36,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Ziur zaude {{count}} fitxategi berreskuratu nahi dituzula? ",
|
||||
"Are you sure you want to revert all local changes?": "Ziur zaude aldaketa guztiak atzera bota nahi dituzula?",
|
||||
"Are you sure you want to upgrade?": "Ziur zaude eguneratu nahi duzula?",
|
||||
"Authors": "Authors",
|
||||
"Authors": "Egileak",
|
||||
"Auto Accept": "Onartu automatikoki",
|
||||
"Automatic Crash Reporting": "Hutsegite txosten automatikoa",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automatikoki eguneratzeko sistemak bertsio egonkorren eta aurreko bertsioen arteko aukera proposatzen du.",
|
||||
@@ -56,8 +56,8 @@
|
||||
"Command": "Kontrolagailua",
|
||||
"Comment, when used at the start of a line": "Komentarioa, lerro baten hastean delarik",
|
||||
"Compression": "Trinkotze",
|
||||
"Configuration Directory": "Configuration Directory",
|
||||
"Configuration File": "Configuration File",
|
||||
"Configuration Directory": "Ezarpenen direktorioa",
|
||||
"Configuration File": "Ezarpenen fitxategia",
|
||||
"Configured": "Konfiguratua",
|
||||
"Connected (Unused)": "Konektatuta (erabili gabe)",
|
||||
"Connection Error": "Konexio hutsa",
|
||||
@@ -68,9 +68,9 @@
|
||||
"Copied from elsewhere": "Beste nonbaitetik kopiatua",
|
||||
"Copied from original": "Jatorrizkotik kopiatua",
|
||||
"Currently Shared With Devices": "Gaur egun tresnekin partekatua",
|
||||
"Custom Range": "Custom Range",
|
||||
"Custom Range": "Tarte pertsonalizatua",
|
||||
"Danger!": "Lanjera !",
|
||||
"Database Location": "Database Location",
|
||||
"Database Location": "Datu basearen kokapena",
|
||||
"Debugging Facilities": "Arazketa zerbitzuak",
|
||||
"Default Configuration": "Konfigurazio lehenetsia",
|
||||
"Default Device": "Gailu lehenetsia",
|
||||
@@ -79,7 +79,7 @@
|
||||
"Defaults": "Lehenetsiak",
|
||||
"Delete": "Kendu",
|
||||
"Delete Unexpected Items": "Ezabatu ustekabeko elementuak",
|
||||
"Deleted {%file%}": "Deleted {{file}}",
|
||||
"Deleted {%file%}": "Ezabatuta {{file}}",
|
||||
"Deselect All": "Hautaketa guztia kendu",
|
||||
"Deselect devices to stop sharing this folder with.": "Desautatu karpeta honekin partekatu nahi ez dituzun gailuak.",
|
||||
"Deselect folders to stop sharing with this device.": "Desautatu karpetak gailu honekin partekatzeari uzteko.",
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Fitxategien baimenen alderaketa eta sinkronizazioa desaktibatzen du. Erabilgarriak dira baimen pertsonalizatuak dituzten sistemak (p.ex. Fat, exFAT, Synology, Android...).",
|
||||
"Discard": "Baztertu",
|
||||
"Disconnected": "Deskonektatua",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Deskonektatuta (erabili gabe)",
|
||||
"Discovered": "Agertua",
|
||||
"Discovery": "Agertzea",
|
||||
@@ -161,7 +162,7 @@
|
||||
"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}}\" karpeta mota ezin da aldatu karpeta gehitu ondoren. Karpeta kendu, diskoko datuak ezabatu edo deszifratu eta karpeta berriro gehitu behar duzu.",
|
||||
"Folders": "Partekatzeak",
|
||||
"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.": "Hurrengo karpetetan errorea gertatu da aldaketak bilatzen hastean. Berriro saiatuko da minuturo, beraz, akatsak laster konpon daitezke. Jarraitzen badute, saiatu azpiko arazoa konpontzen eta eskatu laguntza, ezin baduzu.",
|
||||
"Forever": "Forever",
|
||||
"Forever": "Betirako",
|
||||
"Full Rescan Interval (s)": "Berriz eskaneatzeko tartea osatu da (s)",
|
||||
"GUI": "Interfaze grafikoa",
|
||||
"GUI / API HTTPS Certificate": "GUI / API HTTPS Certificate",
|
||||
@@ -199,9 +200,9 @@
|
||||
"Keep Versions": "Gorde bertsioak",
|
||||
"LDAP": "LDAP",
|
||||
"Largest First": "Handienak lehenik",
|
||||
"Last 30 Days": "Last 30 Days",
|
||||
"Last 7 Days": "Last 7 Days",
|
||||
"Last Month": "Last Month",
|
||||
"Last 30 Days": "Azken 30 egunak",
|
||||
"Last 7 Days": "Azken 7 egunak",
|
||||
"Last Month": "Azken hilabetea",
|
||||
"Last Scan": "Azken azterketa",
|
||||
"Last seen": "Azken agerraldia",
|
||||
"Latest Change": "Azken aldaketa",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Diskoan gutieneko leku libroa ",
|
||||
"Mod. Device": "Gailu aldatzailea",
|
||||
"Mod. Time": "Ordua aldatu",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Lerro bururat lekuz alda",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Hein anitzerako jokerra (errepertorio eta azpi errepertorioeri dagokiona)",
|
||||
"Never": "Sekulan",
|
||||
@@ -250,7 +254,7 @@
|
||||
"Outgoing Rate Limit (KiB/s)": "Bidaltze emari gehienekoa (KiB/s)",
|
||||
"Override": "Gainidatzi",
|
||||
"Override Changes": "Aldaketak desegin",
|
||||
"Ownership": "Ownership",
|
||||
"Ownership": "Jabetza",
|
||||
"Path": "Bidexka",
|
||||
"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": "Lekuko tresnaren partekatzeari buruzko bidea. Ez balitz, asmatu beharko da bat. Programarenari, baitezpadako bide bat sartzen ahal duzu (adibidez \"/home/ni/Sync/Etsenplua\") edo bestenaz bide errelatibo bat (adibidez \"..\\Partekatzeak\\Etsenplua\" - instalazio mugikor batentzat baliagarria). Tildea (~, edo ~+Espazioa Windows XP+Azerty-n) erabil litzateke laburbide gisa",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Kopiak kontserbatzeko bidea (hutsa utz ezazu, .steversioen ohizko bidearentzat, dosier partekatuan)",
|
||||
@@ -272,7 +276,7 @@
|
||||
"Preparing to Sync": "Sinkronizatzeko prestatzen",
|
||||
"Preview": "Aurrebista",
|
||||
"Preview Usage Report": "Erabiltze estatistika txostenaren aurrebista",
|
||||
"QR code": "QR code",
|
||||
"QR code": "QR kodea",
|
||||
"QUIC": "QUIC",
|
||||
"QUIC connections are in most cases considered suboptimal": "QUIC connections are in most cases considered suboptimal",
|
||||
"Quick guide to supported patterns": "Eredu konpatibleen gidaliburuxka",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Désactive la comparaison et la synchronisation des permissions des fichiers. Utile sur les systèmes avec permissions personnalisées ou qui en sont dépourvus (p.ex. FAT, exFAT, Synology, Android...).",
|
||||
"Discard": "Rejeter",
|
||||
"Disconnected": "Déconnecté",
|
||||
"Disconnected (Inactive)": "Déconnecté (inactif)",
|
||||
"Disconnected (Unused)": "Déconnecté (Non utilisé)",
|
||||
"Discovered": "Découvert",
|
||||
"Discovery": "Découverte",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Espace disque libre minimum",
|
||||
"Mod. Device": "Appareil modificateur",
|
||||
"Mod. Time": "Date de modification",
|
||||
"More than a month ago": "Plus d'un mois",
|
||||
"More than a week ago": "Plus d'une semaine",
|
||||
"More than a year ago": "Plus d'un an",
|
||||
"Move to top of queue": "Déplacer en haut de la file",
|
||||
"Multi level wildcard (matches multiple directory levels)": "N'importe quel nombre, dont 0, de n'importe quels caractères (dont le séparateur de répertoires).",
|
||||
"Never": "Jamais",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Skakelt fergelykjen en syngronisearjen fan bestânrjochten út. Nuttich op systemen mei net-besteande as oanpaste tagongsrjochten (bgl. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Fuortsmite\n",
|
||||
"Disconnected": "Ferbining ferbrutsen",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Ferbining ferbrutsen (Net Brûkt)",
|
||||
"Discovered": "Untdekt",
|
||||
"Discovery": "Untdekking",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimale frije skiifromte",
|
||||
"Mod. Device": "Fer. Apparaat",
|
||||
"Mod. Time": "Fer. Tiid",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Fersette nei boppe oan de rige",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Multi-nivo jokerteken (wildcard) (fergelykt mei meardere map-nivo's)",
|
||||
"Never": "Nea",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Letiltja a fájljogosultságok összehasonlítását és szinkronizálást. Hasznos olyan rendszerek esetén, ahol nincsenek jogosultságok vagy egyediek vannak (pl. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Elvetés",
|
||||
"Disconnected": "Kapcsolat bontva",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Kapcsolat bontva (használaton kívül)",
|
||||
"Discovered": "Felfedezett",
|
||||
"Discovery": "Felfedezés",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimális szabad lemezterület",
|
||||
"Mod. Device": "Módosító eszköz",
|
||||
"Mod. Time": "Módosítási idő",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Sor elejére mozgatás",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Több szintű helyettesítő karakter (több könyvtár szintre érvényesül)",
|
||||
"Never": "Soha",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Menonaktifkan perbandingan dan sinkronisasi ijin berkas. Berguna untuk sistem dengan ijin yang tidak ada atau ijin kustom (contoh FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Buang",
|
||||
"Disconnected": "Terputus",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Terputus (Tidak Digunakan)",
|
||||
"Discovered": "Ditemukan",
|
||||
"Discovery": "Penemuan",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Ruang Penyimpanan Kosong Minimum",
|
||||
"Mod. Device": "Perangkat Pengubah",
|
||||
"Mod. Time": "Waktu Diubah",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Pindah ke daftar tunggu teratas",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Wildcard multi tingkat (cocok dalam tingkat direktori apapun)",
|
||||
"Never": "Tidak Pernah",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Disabilita il confronto e la sincronizzazione delle autorizzazioni dei file. Utile su sistemi con autorizzazioni inesistenti o personalizzate (ad esempio FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Scartare",
|
||||
"Disconnected": "Disconnesso",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Disconnesso (non utilizzato)",
|
||||
"Discovered": "Individuato",
|
||||
"Discovery": "Individuazione",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimo Spazio Libero su Disco",
|
||||
"Mod. Device": "Mod. dispositivo",
|
||||
"Mod. Time": "Mod. tempo",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Posiziona in cima alla coda",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Metacarattere multi-livello (per corrispondenze in più livelli di cartelle)",
|
||||
"Never": "Mai",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"Add Folder": "フォルダーを追加",
|
||||
"Add Remote Device": "接続先デバイスを追加",
|
||||
"Add devices from the introducer to our device list, for mutually shared folders.": "紹介者デバイスから紹介されたデバイスは、相互に共有しているフォルダーがある場合、このデバイス上にも追加されます。",
|
||||
"Add ignore patterns": "Add ignore patterns",
|
||||
"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.": "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.",
|
||||
"Address": "アドレス",
|
||||
@@ -28,7 +28,7 @@
|
||||
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "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": "Apply",
|
||||
"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}} を削除してよろしいですか?",
|
||||
@@ -101,11 +101,12 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "切断中 (未使用)",
|
||||
"Discovered": "探索結果",
|
||||
"Discovery": "探索サーバー",
|
||||
"Discovery Failures": "探索サーバーへの接続失敗",
|
||||
"Discovery Status": "Discovery Status",
|
||||
"Discovery Status": "探索ステータス",
|
||||
"Dismiss": "Dismiss",
|
||||
"Do not add it to the ignore list, so this notification may recur.": "Do not add it to the ignore list, so this notification may recur.",
|
||||
"Do not restore": "Do not restore",
|
||||
@@ -201,14 +202,14 @@
|
||||
"Largest First": "大きい順",
|
||||
"Last 30 Days": "Last 30 Days",
|
||||
"Last 7 Days": "Last 7 Days",
|
||||
"Last Month": "Last Month",
|
||||
"Last Month": "先月",
|
||||
"Last Scan": "最終スキャン日時",
|
||||
"Last seen": "最終接続日時",
|
||||
"Latest Change": "最終変更内容",
|
||||
"Learn more": "詳細を確認する",
|
||||
"Limit": "制限",
|
||||
"Listener Failures": "Listener Failures",
|
||||
"Listener Status": "Listener Status",
|
||||
"Listener Status": "待ち受けポートステータス",
|
||||
"Listeners": "待ち受けポート",
|
||||
"Loading data...": "データの読み込み中...",
|
||||
"Loading...": "読み込み中...",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "同期を停止する最小空きディスク容量",
|
||||
"Mod. Device": "変更デバイス",
|
||||
"Mod. Time": "変更日時",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "最優先にする",
|
||||
"Multi level wildcard (matches multiple directory levels)": "多階層ワイルドカード (複数のディレクトリ階層にマッチします)",
|
||||
"Never": "記録なし",
|
||||
@@ -272,7 +276,7 @@
|
||||
"Preparing to Sync": "同期の準備中",
|
||||
"Preview": "プレビュー",
|
||||
"Preview Usage Report": "使用状況レポートのプレビュー",
|
||||
"QR code": "QR code",
|
||||
"QR code": "QRコード",
|
||||
"QUIC": "QUIC",
|
||||
"QUIC connections are in most cases considered suboptimal": "QUIC connections are in most cases considered suboptimal",
|
||||
"Quick guide to supported patterns": "サポートされているパターンのクイックガイド",
|
||||
@@ -329,7 +333,7 @@
|
||||
"Show ID": "IDを表示",
|
||||
"Show QR": "QRコードを表示",
|
||||
"Show detailed discovery status": "詳細な探索ステータスを表示する",
|
||||
"Show detailed listener status": "Show detailed listener 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.": "ステータス画面でデバイスIDの代わりに表示されます。他のデバイスに対してもデフォルトの名前として通知されます。",
|
||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "ステータス画面でデバイスIDの代わりに表示されます。空欄にすると相手側デバイスが通知してきた名前で更新されます。",
|
||||
@@ -340,7 +344,7 @@
|
||||
"Single level wildcard (matches within a directory only)": "ワイルドカード (単一のディレクトリ内だけでマッチします)",
|
||||
"Size": "サイズ",
|
||||
"Smallest First": "小さい順",
|
||||
"Some discovery methods could not be established for finding other devices or announcing this device:": "Some discovery methods could not be established for finding other devices or announcing this device:",
|
||||
"Some discovery methods could not be established for finding other devices or announcing this device:": "ネットワーク上で他のデバイスを探索し、他のデバイスにこのデバイスの存在をアナウンスするための、以下の探索方式が使用できませんでした:",
|
||||
"Some items could not be restored:": "Some items could not be restored:",
|
||||
"Some listening addresses could not be enabled to accept connections:": "Some listening addresses could not be enabled to accept connections:",
|
||||
"Source Code": "ソースコード",
|
||||
@@ -358,7 +362,7 @@
|
||||
"Sync Extended Attributes": "Sync Extended Attributes",
|
||||
"Sync Ownership": "Sync Ownership",
|
||||
"Sync Protocol Listen Addresses": "同期プロトコルの待ち受けアドレス",
|
||||
"Sync Status": "Sync Status",
|
||||
"Sync Status": "同期ステータス",
|
||||
"Syncing": "同期中",
|
||||
"Syncthing has been shut down.": "Syncthingをシャットダウンしました。",
|
||||
"Syncthing includes the following software or portions thereof:": "Syncthingは以下のソフトウェアまたはその一部を内包しています:",
|
||||
@@ -391,7 +395,7 @@
|
||||
"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.": "保存間隔は次の通りです。初めの1時間は30秒ごとに古いバージョンを保存します。同様に、初めの1日間は1時間ごと、初めの30日間は1日ごと、その後最大保存日数までは1週間ごとに、古いバージョンを保存します。",
|
||||
"The following items could not be synchronized.": "以下の項目は同期できませんでした。",
|
||||
"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 methods are used to discover other devices on the network and announce this device to be found by others:",
|
||||
"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 following unexpected items were found.",
|
||||
"The interval must be a positive number of seconds.": "間隔は0秒以下にはできません。",
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.",
|
||||
@@ -411,14 +415,14 @@
|
||||
"There are no folders to share with this device.": "There are no folders to share with this device.",
|
||||
"They are retried automatically and will be synced when the error is resolved.": "エラーが解決すると、自動的に再試行され同期されます。",
|
||||
"This Device": "このデバイス",
|
||||
"This Month": "This Month",
|
||||
"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 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": "項目を最後に変更した日時",
|
||||
"Today": "Today",
|
||||
"Today": "今日",
|
||||
"Trash Can": "Trash Can",
|
||||
"Trash Can File Versioning": "ゴミ箱によるバージョン管理",
|
||||
"Twitter": "Twitter",
|
||||
@@ -447,8 +451,8 @@
|
||||
"Use notifications from the filesystem to detect changed items.": "Use notifications from the filesystem to detect changed items.",
|
||||
"User Home": "ユーザーホーム",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "GUI認証のためのユーザー名/パスワードが設定されていません。設定を検討してください。",
|
||||
"Using a direct TCP connection over LAN": "Using a direct TCP connection over LAN",
|
||||
"Using a direct TCP connection over WAN": "Using a direct TCP connection over WAN",
|
||||
"Using a direct TCP connection over LAN": "LANで直接TCP接続を使用中",
|
||||
"Using a direct TCP connection over WAN": "WANで直接TCP接続を使用中",
|
||||
"Version": "バージョン",
|
||||
"Versions": "バージョン",
|
||||
"Versions Path": "古いバージョンを保存するパス",
|
||||
@@ -456,7 +460,7 @@
|
||||
"Waiting to Clean": "Waiting to Clean",
|
||||
"Waiting to Scan": "スキャンの待機中",
|
||||
"Waiting to Sync": "同期の待機中",
|
||||
"Warning": "Warning",
|
||||
"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}}」のサブディレクトリです。",
|
||||
@@ -468,7 +472,7 @@
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "新しいデバイスを追加する際は、相手側デバイスにもこのデバイスを追加してください。",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "新しいフォルダーを追加する際、フォルダーIDはデバイス間でフォルダーの対応づけに使われることに注意してください。フォルダーIDは大文字と小文字が区別され、共有するすべてのデバイスの間で完全に一致しなくてはなりません。",
|
||||
"Yes": "はい",
|
||||
"Yesterday": "Yesterday",
|
||||
"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.": "2種類のリリースチャネルについての詳細は、以下のリンク先を参照してください。",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "연결 끊김(비활성)",
|
||||
"Disconnected (Unused)": "연결 끊김(미사용)",
|
||||
"Discovered": "탐지됨",
|
||||
"Discovery": "탐지",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "저장 장치 최소 여유 공간",
|
||||
"Mod. Device": "수정 기기",
|
||||
"Mod. Time": "수정 시간",
|
||||
"More than a month ago": "1달이 넘게 지났습니다.",
|
||||
"More than a week ago": "1주일이 넘게 지났습니다.",
|
||||
"More than a year ago": "1년이 넘게 지났습니다.",
|
||||
"Move to top of queue": "대기열 상단으로 이동",
|
||||
"Multi level wildcard (matches multiple directory levels)": "다중 수준 와일드카드(여러 단계의 디렉토리에서 적용됨)",
|
||||
"Never": "기록 없음",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Išjungia palyginimą bei failų leidimų sinchronizavimą. Naudinga sistemose, kuriose nėra leidimų, arba jie yra tinkinti (pvz., FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Atmesti",
|
||||
"Disconnected": "Atsijungęs",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Atsijungęs (Nenaudojamas)",
|
||||
"Discovered": "Atrastas",
|
||||
"Discovery": "Lokacija",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimum laisvos vietos diske",
|
||||
"Mod. Device": "Mod. įrenginys",
|
||||
"Mod. Time": "Mod. laikas",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Perkelti į eilės priekį",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Keleto lygių pakaitos simbolis (atitinka keletą katalogų lygių)",
|
||||
"Never": "Niekada",
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
"Connection Error": "Verbindingsfout",
|
||||
"Connection Type": "Soort verbinding",
|
||||
"Connections": "Verbindingen",
|
||||
"Connections via relays might be rate limited by the relay": "QUIC-verbindingen worden in de meeste gevallen als suboptimaal beschouwd",
|
||||
"Connections via relays might be rate limited by the relay": "Verbindingen via relays kunnen worden beperkt door de relay",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Voortdurend opvolgen van wijzigingen is nu beschikbaar in Syncthing. Dit zal wijzigingen op een schijf detecteren en alleen een scan uitvoeren op de gewijzigde paden. De voordelen zijn dat wijzigingen sneller doorgevoerd worden en dat minder volledige scans nodig zijn.",
|
||||
"Copied from elsewhere": "Gekopieerd van elders",
|
||||
"Copied from original": "Gekopieerd van origineel",
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Schakelt het vergelijken en synchroniseren van bestandsrechten uit. Nuttig op systemen met niet-bestaande of aangepaste rechten (bijvoorbeeld FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Verwerpen",
|
||||
"Disconnected": "Niet verbonden",
|
||||
"Disconnected (Inactive)": "Niet verbonden (niet actief)",
|
||||
"Disconnected (Unused)": "Niet verbonden (niet gebruikt)",
|
||||
"Discovered": "Gedetecteerd",
|
||||
"Discovery": "Netwerkdetectie",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimale vrije schijfruimte",
|
||||
"Mod. Device": "Wijzigend apparaat",
|
||||
"Mod. Time": "Tijdstip van wijziging",
|
||||
"More than a month ago": "Meer dan een maand geleden",
|
||||
"More than a week ago": "Meer dan een week geleden",
|
||||
"More than a year ago": "Meer dan een jaar geleden",
|
||||
"Move to top of queue": "Naar begin van wachtrij verplaatsen",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Wildcard op meerdere niveaus (komt overeen met meerdere mapniveaus)",
|
||||
"Never": "Nooit",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Wyłącza porównywanie i synchronizację uprawnień plików. Przydatne w systemach, w których uprawnienia nie istnieją bądź są one niestandardowe (np. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Odrzuć",
|
||||
"Disconnected": "Rozłączony",
|
||||
"Disconnected (Inactive)": "Rozłączony (nieaktywny)",
|
||||
"Disconnected (Unused)": "Rozłączony (nieużywany)",
|
||||
"Discovered": "Odnaleziony",
|
||||
"Discovery": "Odnajdywanie",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimum wolnego miejsca na dysku",
|
||||
"Mod. Device": "Urządzenie mod.",
|
||||
"Mod. Time": "Czas mod.",
|
||||
"More than a month ago": "ponad miesiąc temu",
|
||||
"More than a week ago": "ponad tydzień temu",
|
||||
"More than a year ago": "ponad rok temu",
|
||||
"Move to top of queue": "Przenieś na początek kolejki",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Wieloznacznik wielopoziomowy (wyszukuje na wielu poziomach katalogów)",
|
||||
"Never": "Nigdy",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desativa a comparação e sincronização de permissões de arquivo. Útil em sistemas com permissões inexistentes ou personalizadas (por exemplo, FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Descartar",
|
||||
"Disconnected": "Desconectado",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Desconectado (Não usado)",
|
||||
"Discovered": "Descoberto",
|
||||
"Discovery": "Descoberta",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Espaço livre mínimo no disco",
|
||||
"Mod. Device": "Dispositivo Modificado",
|
||||
"Mod. Time": "Hora da Modificação",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Mover para o topo da lista",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Coringa multi-nível (faz corresponder a vários níveis de pastas)",
|
||||
"Never": "Nunca",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desactiva a comparação e a sincronização das permissões dos ficheiros. É útil em sistemas onde as permissões não existem ou são personalizadas (ex.: FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Descartar",
|
||||
"Disconnected": "Desconectado",
|
||||
"Disconnected (Inactive)": "Desconectado (inactivo)",
|
||||
"Disconnected (Unused)": "Desconectado (não usado)",
|
||||
"Discovered": "Descoberto",
|
||||
"Discovery": "Descoberta",
|
||||
@@ -125,10 +126,10 @@
|
||||
"Enable NAT traversal": "Activar travessia de NAT",
|
||||
"Enable Relaying": "Permitir retransmissão",
|
||||
"Enabled": "Activada",
|
||||
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Habilita o envio de atributos estendidos para os outros dispositivos e o aplicar dos atributos estendidos recebidos. Pode exigir que se corra com privilégios elevados.",
|
||||
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Habilita o envio de atributos estendidos para outros dispositivos, mas sem aplicar os atributos estendidos recebidos. Isto pode ter um impacto de desempenho significativo. Fica sempre habilitado quando \"Sincronizar atributos estendidos\" é habilitado.",
|
||||
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Habilita o envio de atributos estendidos para os outros dispositivos e a aplicação dos atributos estendidos recebidos. Pode exigir que se corra com privilégios elevados.",
|
||||
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Habilita o envio de atributos estendidos para outros dispositivos, mas não a aplicação dos atributos estendidos recebidos. Isto pode ter um impacto de desempenho significativo. Fica sempre habilitado quando \"Sincronizar atributos estendidos\" é habilitado.",
|
||||
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Habilita o envio de informação sobre propriedade para os outros dispositivos e a aplicação da informação recebida sobre propriedade. Requer, tipicamente, que se execute com privilégios elevados.",
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Habilita o envio da informação de propriedade para outros dispositivos, mas não aplica a informação de propriedade recebida. Pode ter um impacto significativo no desempenho. Fica sempre habilitado quando \"Sincronizar a propriedade\" é habilitada.",
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Habilita o envio da informação de propriedade para outros dispositivos, mas não a aplicação da informação de propriedade recebida. Pode ter um impacto significativo no desempenho. Fica sempre habilitado quando \"Sincronizar a propriedade\" é habilitada.",
|
||||
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Escreva um número positivo (ex.: \"2.35\") e seleccione uma unidade. Percentagens são relativas ao tamanho total do disco.",
|
||||
"Enter a non-privileged port number (1024 - 65535).": "Escreva um número de porto não-privilegiado (1024-65535).",
|
||||
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Introduza endereços separados por vírgulas (\"tcp://ip:porto\", \"tcp://máquina:porto\") ou \"dynamic\" para descobrir automaticamente os endereços.",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Espaço livre mínimo no disco",
|
||||
"Mod. Device": "Dispositivo mod.",
|
||||
"Mod. Time": "Quando foi mod.",
|
||||
"More than a month ago": "Há mais de um mês",
|
||||
"More than a week ago": "Há mais de uma semana",
|
||||
"More than a year ago": "Há mais de um ano",
|
||||
"Move to top of queue": "Mover para o topo da fila",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Símbolo polivalente multi-nível (faz corresponder a vários níveis de pastas)",
|
||||
"Never": "Nunca",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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",
|
||||
"Disconnected": "Deconectat",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Disconnected (Unused)",
|
||||
"Discovered": "Discovered",
|
||||
"Discovery": "Discovery",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimum Free Disk Space",
|
||||
"Mod. Device": "Mod. Device",
|
||||
"Mod. Time": "Mod. Time",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Mută la începutul listei",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Asterisc de nivel multiplu (corespunde fișierelor și sub-fișierelor)",
|
||||
"Never": "Niciodată",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Отключено (не используется)",
|
||||
"Discovered": "Обнаружено",
|
||||
"Discovery": "Обнаружение",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Минимальное свободное место на диске",
|
||||
"Mod. Device": "Изм. устройство",
|
||||
"Mod. Time": "Посл. изм.",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Поместить в начало очереди",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Многоуровневая маска (поиск совпадений во всех подпапках)",
|
||||
"Never": "Никогда",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "විසන්ධියි (භාවිතයේ නැත)",
|
||||
"Discovered": "සොයා ගන්නා ලදී",
|
||||
"Discovery": "සොයාගැනීම",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "අවම නිදහස් තැටි ඉඩ",
|
||||
"Mod. Device": "mod. උපාංගය",
|
||||
"Mod. Time": "mod. කාලය",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "පෝලිමේ ඉහළට යන්න",
|
||||
"Multi level wildcard (matches multiple directory levels)": "බහු මට්ටමේ වයිල්ඩ්කාඩ් (බහු ඩිරෙක්ටරි මට්ටම් වලට ගැලපේ)",
|
||||
"Never": "කවදාවත්",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Onemogoči primerjavo in sinhronizacijo dovoljenj za datoteke. Uporabno v sistemih z neobstoječimi dovoljenji ali dovoljenji po meri (npr. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Zavrzi",
|
||||
"Disconnected": "Brez povezave",
|
||||
"Disconnected (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Ni povezave (neuporabljeno)",
|
||||
"Discovered": "Odkrito",
|
||||
"Discovery": "Odkritje",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minimalen nezaseden prostor na disku",
|
||||
"Mod. Device": "Spremenjeno od naprave",
|
||||
"Mod. Time": "Čas spremembe",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Premakni na vrh čakalne vrste",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Več ravni map (sklada se z več ravni map in podmap)",
|
||||
"Never": "Nikoli",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Inaktiverar att jämföra och synkronisera filbehörigheter. Användbart för system med obefintliga eller anpassade behörigheter (t.ex. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Kassera",
|
||||
"Disconnected": "Frånkopplad",
|
||||
"Disconnected (Inactive)": "Frånkopplad (inaktiv)",
|
||||
"Disconnected (Unused)": "Frånkopplad (oanvänd)",
|
||||
"Discovered": "Upptäckt",
|
||||
"Discovery": "Annonsering",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Minsta lediga diskutrymme",
|
||||
"Mod. Device": "Enhet som utförde ändring",
|
||||
"Mod. Time": "Tid för ändring",
|
||||
"More than a month ago": "Mer än en månad sedan",
|
||||
"More than a week ago": "Mer än en vecka sedan",
|
||||
"More than a year ago": "Mer än ett år sedan",
|
||||
"Move to top of queue": "Flytta till överst i kön",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Flernivå jokertecken (matchar flera mappnivåer)",
|
||||
"Never": "Aldrig",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Dosya izinlerini karşılaştırmayı ve eşitlemeyi etkisizleştirir. Varolmayan veya özel izinlere sahip sistemlerde kullanışlıdır (örn. FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Yoksay",
|
||||
"Disconnected": "Bağlantı Kesildi",
|
||||
"Disconnected (Inactive)": "Bağlantı Kesildi (Etkin Değil)",
|
||||
"Disconnected (Unused)": "Bağlantı Kesildi (Kullanımda Değil)",
|
||||
"Discovered": "Keşfedildi",
|
||||
"Discovery": "Keşif",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "En Az Boş Disk Alanı",
|
||||
"Mod. Device": "Değiştiren Cihaz",
|
||||
"Mod. Time": "Değiştirilme Zamanı",
|
||||
"More than a month ago": "Bir aydan fazla bir süre önce",
|
||||
"More than a week ago": "Bir haftadan fazla bir süre önce",
|
||||
"More than a year ago": "Bir yıldan fazla bir süre önce",
|
||||
"Move to top of queue": "Kuyruğun başına taşı",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Çok seviyeli joker karakter (birden çok dizin seviyesiyle eşleşir)",
|
||||
"Never": "Yok",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "Від'єднано (не використовується)",
|
||||
"Discovered": "Виявлено",
|
||||
"Discovery": "Сервери координації NAT",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "Мінімальний вільний простір на диску",
|
||||
"Mod. Device": "Модифікований пристрій:",
|
||||
"Mod. Time": "Час модифікації:",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "Пересунути у початок черги",
|
||||
"Multi level wildcard (matches multiple directory levels)": "Багаторівнева маска (пошук збігів в усіх піддиректоріях) ",
|
||||
"Never": "Ніколи",
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "断开连接(未使用)",
|
||||
"Discovered": "已发现",
|
||||
"Discovery": "设备发现",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "最低可用磁盘空间",
|
||||
"Mod. Device": "修改设备",
|
||||
"Mod. Time": "修改时间",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "移动到队列顶端",
|
||||
"Multi level wildcard (matches multiple directory levels)": "多级通配符(用以匹配多层文件夹)",
|
||||
"Never": "从未",
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "確定要恢復這 {%count%} 個文件嗎?",
|
||||
"Are you sure you want to revert all local changes?": "確定要還原所有本地更改嗎?",
|
||||
"Are you sure you want to upgrade?": "確定要升級嗎?",
|
||||
"Authors": "Authors",
|
||||
"Authors": "作者",
|
||||
"Auto Accept": "自動接受",
|
||||
"Automatic Crash Reporting": "自動發送崩潰報告",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "自動升級現在提供了穩定版本和候選發佈版的選項。",
|
||||
@@ -56,14 +56,14 @@
|
||||
"Command": "命令",
|
||||
"Comment, when used at the start of a line": "註釋,在行首使用",
|
||||
"Compression": "壓縮",
|
||||
"Configuration Directory": "Configuration Directory",
|
||||
"Configuration Directory": "配置目錄",
|
||||
"Configuration File": "配置文件",
|
||||
"Configured": "已配置",
|
||||
"Connected (Unused)": "已連接(未使用)",
|
||||
"Connection Error": "連接出錯",
|
||||
"Connection Type": "連接類型",
|
||||
"Connections": "連接",
|
||||
"Connections via relays might be rate limited by the relay": "Connections via relays might be rate limited by the relay",
|
||||
"Connections via relays might be rate limited by the relay": "通過中繼的連接可能受到中繼的速率限制",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Syncthing 現在可以持續監視更改了。這將檢測磁盤上的更改,然後對有修改的路徑發起掃瞄。這樣的好處是更改可以更快地傳播,且需要的完整掃瞄會更少。",
|
||||
"Copied from elsewhere": "從其他設備複製",
|
||||
"Copied from original": "從源複製",
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "斷開連接(未使用)",
|
||||
"Discovered": "已發現",
|
||||
"Discovery": "設備發現",
|
||||
@@ -125,10 +126,10 @@
|
||||
"Enable NAT traversal": "啟用 NAT 遍歷",
|
||||
"Enable Relaying": "開啟中繼",
|
||||
"Enabled": "已啟用",
|
||||
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.",
|
||||
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.",
|
||||
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.",
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.",
|
||||
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "允許將擴展屬性發送到其他設備,並應用傳入的擴展屬性。可能需要以提升的權限運行。",
|
||||
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "允許將擴展屬性發送到其他設備,但不應用傳入的擴展屬性。這可能會對性能產生重大影響。啟用“同步擴展屬性”時始終啟用。",
|
||||
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "允許向其他設備發送所有權信息,並應用傳入的所有權信息。通常需要以提升的權限運行。",
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "允許將所有權信息發送到其他設備,但不應用傳入的所有權信息。這可能會對性能產生重大影響。啟用“同步所有權”時始終啟用。",
|
||||
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "輸入一個非負數(例如「2.35」)並選擇單位。%表示占磁盤總容量的百分比。",
|
||||
"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」以自動發現設備地址。",
|
||||
@@ -164,7 +165,7 @@
|
||||
"Forever": "永久",
|
||||
"Full Rescan Interval (s)": "完整掃瞄間隔",
|
||||
"GUI": "圖形用戶界面",
|
||||
"GUI / API HTTPS Certificate": "GUI / API HTTPS Certificate",
|
||||
"GUI / API HTTPS Certificate": "GUI / API HTTPS 證書",
|
||||
"GUI Authentication Password": "圖形管理界面密碼",
|
||||
"GUI Authentication User": "圖形管理界面用戶名",
|
||||
"GUI Authentication: Set User and Password": "GUI身份驗證:設置用戶和密碼",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "最低可用磁盤空間",
|
||||
"Mod. Device": "修改設備",
|
||||
"Mod. Time": "修改時間",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "移動到隊列頂端",
|
||||
"Multi level wildcard (matches multiple directory levels)": "多級通配符(用以匹配多層文件夾)",
|
||||
"Never": "從未",
|
||||
@@ -274,7 +278,7 @@
|
||||
"Preview Usage Report": "預覽使用報告",
|
||||
"QR code": "二維碼",
|
||||
"QUIC": "QUIC",
|
||||
"QUIC connections are in most cases considered suboptimal": "QUIC connections are in most cases considered suboptimal",
|
||||
"QUIC connections are in most cases considered suboptimal": "QUIC 連接在大多數情況下被認為是次優的",
|
||||
"Quick guide to supported patterns": "支持的通配符的簡單教程:",
|
||||
"Random": "隨機順序",
|
||||
"Receive Encrypted": "接收加密",
|
||||
@@ -282,7 +286,7 @@
|
||||
"Received data is already encrypted": "接收到的數據已經加密",
|
||||
"Recent Changes": "最近更改",
|
||||
"Reduced by ignore patterns": "已由忽略模式縮減",
|
||||
"Relay": "Relay",
|
||||
"Relay": "中繼",
|
||||
"Release Notes": "發佈說明",
|
||||
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "發佈候選版包含最新的特性和修復。它們跟傳統的 Syncthing 雙周發佈版類似。",
|
||||
"Remote Devices": "遠程設備",
|
||||
@@ -370,8 +374,8 @@
|
||||
"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。",
|
||||
"TCP LAN": "TCP LAN",
|
||||
"TCP WAN": "TCP WAN",
|
||||
"TCP LAN": "TCP 局域網",
|
||||
"TCP WAN": "TCP 互聯網",
|
||||
"Take me back": "帶我回去",
|
||||
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "GUI 地址已被啟動選項覆蓋。當覆蓋存在時,此處的更改就不會生效。",
|
||||
"The Syncthing Authors": "Syncthing的作者",
|
||||
@@ -447,8 +451,8 @@
|
||||
"Use notifications from the filesystem to detect changed items.": "使用來自文件系統的通知來檢測更改的項目。",
|
||||
"User Home": "用戶主頁",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "尚未為GUI身份驗證設置用戶名/密碼。 請考慮進行設置。",
|
||||
"Using a direct TCP connection over LAN": "Using a direct TCP connection over LAN",
|
||||
"Using a direct TCP connection over WAN": "Using a direct TCP connection over WAN",
|
||||
"Using a direct TCP connection over LAN": "通過內聯網使用直接 TCP 連接",
|
||||
"Using a direct TCP connection over WAN": "通過互聯網網使用直接 TCP 連接",
|
||||
"Version": "版本",
|
||||
"Versions": "歷史版本",
|
||||
"Versions Path": "歷史版本路徑",
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
"Connection Error": "連線錯誤",
|
||||
"Connection Type": "連線類型",
|
||||
"Connections": "連線",
|
||||
"Connections via relays might be rate limited by the relay": "Connections via relays might be rate limited by the relay",
|
||||
"Connections via relays might be rate limited by the relay": "通過中繼的連線可能會受到中繼的速率限制",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Syncthing 現在能持續地監視變動了。此機制將偵測到磁碟上的變動並僅對修改過的項目發起掃描。優點是檔案的變動將更快地傳播,並且減少完整掃描的需求。",
|
||||
"Copied from elsewhere": "從別處複製",
|
||||
"Copied from original": "從原處複製",
|
||||
@@ -101,6 +101,7 @@
|
||||
"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 (Inactive)": "Disconnected (Inactive)",
|
||||
"Disconnected (Unused)": "斷線(未使用)",
|
||||
"Discovered": "已發現",
|
||||
"Discovery": "探索",
|
||||
@@ -228,6 +229,9 @@
|
||||
"Minimum Free Disk Space": "最少閒置磁碟空間",
|
||||
"Mod. Device": "修改裝置",
|
||||
"Mod. Time": "修改時間",
|
||||
"More than a month ago": "More than a month ago",
|
||||
"More than a week ago": "More than a week ago",
|
||||
"More than a year ago": "More than a year ago",
|
||||
"Move to top of queue": "移到隊列頂端",
|
||||
"Multi level wildcard (matches multiple directory levels)": "多階層萬用字元 (可比對多層資料夾)",
|
||||
"Never": "從未",
|
||||
@@ -282,7 +286,7 @@
|
||||
"Received data is already encrypted": "接收到的數據已經加密",
|
||||
"Recent Changes": "最近變動",
|
||||
"Reduced by ignore patterns": "已由忽略樣式縮減",
|
||||
"Relay": "Relay",
|
||||
"Relay": "中繼",
|
||||
"Release Notes": "版本資訊",
|
||||
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "候選發行版包含最新的功能及修補。與傳統 Syncthing 雙週發行版相似。",
|
||||
"Remote Devices": "遠端裝置",
|
||||
@@ -370,8 +374,8 @@
|
||||
"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。",
|
||||
"TCP LAN": "TCP LAN",
|
||||
"TCP WAN": "TCP WAN",
|
||||
"TCP LAN": "TCP 區域網路",
|
||||
"TCP WAN": "TCP 廣域網路",
|
||||
"Take me back": "帶我回去",
|
||||
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "GUI 位址已被自啟動選項覆寫。當覆寫啟用時,此處變更將不會生效。",
|
||||
"The Syncthing Authors": "Syncthing 作者們",
|
||||
@@ -447,8 +451,8 @@
|
||||
"Use notifications from the filesystem to detect changed items.": "使用來自檔案系統的通知以檢測變動的項目。",
|
||||
"User Home": "User Home",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "尚未設定GUI 驗證的使用者名稱/密碼。請考慮進行設定。",
|
||||
"Using a direct TCP connection over LAN": "Using a direct TCP connection over LAN",
|
||||
"Using a direct TCP connection over WAN": "Using a direct TCP connection over WAN",
|
||||
"Using a direct TCP connection over LAN": "通過區域網路使用直接 TCP 連線",
|
||||
"Using a direct TCP connection over WAN": "通過廣域網路使用直接 TCP 連線",
|
||||
"Version": "版本",
|
||||
"Versions": "版本",
|
||||
"Versions Path": "歷史版本路徑",
|
||||
|
||||
+19
-4
@@ -748,6 +748,7 @@
|
||||
<span ng-switch-when="paused"><span class="hidden-xs" translate>Paused</span><span class="visible-xs" aria-label="{{'Paused' | translate}}"><i class="fas fa-fw fa-pause"></i></span></span>
|
||||
<span ng-switch-when="unused-paused"><span class="hidden-xs" translate>Paused (Unused)</span><span class="visible-xs" aria-label="{{'Paused (Unused)' | translate}}"><i class="fas fa-fw fa-unlink"></i></span></span>
|
||||
<span ng-switch-when="disconnected"><span class="hidden-xs" translate>Disconnected</span><span class="visible-xs" aria-label="{{'Disconnected' | translate}}"><i class="fas fa-fw fa-power-off"></i></span></span>
|
||||
<span ng-switch-when="disconnected-inactive"><span class="hidden-xs" translate>Disconnected (Inactive)</span><span class="visible-xs" aria-label="{{'Disconnected (Inactive)' | translate}}"><i class="fas fa-fw fa-power-off"></i></span></span>
|
||||
<span ng-switch-when="unused-disconnected"><span class="hidden-xs" translate>Disconnected (Unused)</span><span class="visible-xs" aria-label="{{'Disconnected (Unused)' | translate}}"><i class="fas fa-fw fa-unlink"></i></span></span>
|
||||
</span>
|
||||
<span ng-switch="rdConnType(deviceCfg.deviceID)" class="remote-devices-panel">
|
||||
@@ -767,14 +768,27 @@
|
||||
<tbody>
|
||||
<tr ng-if="!connections[deviceCfg.deviceID].connected">
|
||||
<th><span class="fas fa-fw fa-eye"></span> <span translate>Last seen</span></th>
|
||||
<td translate ng-if="!deviceStats[deviceCfg.deviceID].lastSeenDays || deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" class="text-right">Never</td>
|
||||
<td ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays < 365" class="text-right">{{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm:ss"}}</td>
|
||||
<td class="text-right">
|
||||
<div ng-if="!deviceStats[deviceCfg.deviceID].lastSeenDays" translate>
|
||||
Never
|
||||
</div>
|
||||
<div ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays">
|
||||
<div>
|
||||
{{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm:ss"}}
|
||||
</div>
|
||||
<div ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 7">
|
||||
<i ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays < 30" translate>More than a week ago</i>
|
||||
<i class="text-warning" ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 30 && deviceStats[deviceCfg.deviceID].lastSeenDays < 365" translate>More than a month ago</i>
|
||||
<i class="text-danger" ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" translate>More than a year ago</i>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="!connections[deviceCfg.deviceID].connected && deviceFolders(deviceCfg).length > 0">
|
||||
<th><span class="fas fa-fw fa-cloud"></span> <span translate>Sync Status</span></th>
|
||||
<td translate ng-if="completion[deviceCfg.deviceID]._total == 100" class="text-right">Up to Date</td>
|
||||
<td ng-if="completion[deviceCfg.deviceID]._total < 100" class="text-right">
|
||||
<span class="hidden-xs" translate>Out of Sync</span> ({{completion[deviceCfg.deviceID]._total | percent}}, {{completion[deviceCfg.deviceID]._needBytes | binary}}B)
|
||||
<span class="hidden-xs" translate>Out of Sync</span> ({{completion[deviceCfg.deviceID]._total | percent}})
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="connections[deviceCfg.deviceID].connected">
|
||||
@@ -809,7 +823,7 @@
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="deviceStatus(deviceCfg) == 'syncing'">
|
||||
<tr ng-if="completion[deviceCfg.deviceID]._needItems">
|
||||
<th><span class="fas fa-fw fa-exchange-alt"></span> <span translate>Out of Sync Items</span></th>
|
||||
<td class="text-right">
|
||||
<a href="" ng-click="showRemoteNeed(deviceCfg)">{{completion[deviceCfg.deviceID]._needItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{completion[deviceCfg.deviceID]._needBytes | binary}}B</a>
|
||||
@@ -976,6 +990,7 @@
|
||||
<ng-include src="'syncthing/folder/revertOverrideView.html'"></ng-include>
|
||||
<ng-include src="'syncthing/device/removeDeviceDialogView.html'"></ng-include>
|
||||
<ng-include src="'syncthing/core/logViewerModalView.html'"></ng-include>
|
||||
<ng-include src="'syncthing/device/shareDeviceIdDialogView.html'"></ng-include>
|
||||
|
||||
<!-- vendor scripts -->
|
||||
<script type="text/javascript" src="vendor/jquery/jquery-2.2.2.js"></script>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<h4 class="text-center" translate>The Syncthing Authors</h4>
|
||||
<div class="row">
|
||||
<div class="col-md-12" id="contributor-list">
|
||||
Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, Caleb Callaway, Daniel Harte, Evgeny Kuznetsov, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Nate Morrison, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Tomasz Wilczyński, Wulf Weich, greatroar, Aaron Bieber, Adam Piggott, Adel Qalieh, Alan Pope, Alberto Donato, Alessandro G., Alex Lindeman, Alex Xu, Aman Gupta, Andrew Dunham, Andrew Meyer, Andrew Rabert, Andrey D, Anjan Momi, Antoine Lamielle, Anur, Aranjedeath, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Ben Curthoys, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benedikt Morbach, Benjamin Nater, Benno Fünfstück, Benny Ng, Boqin Qin, Boris Rybalkin, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Chris Tonkinson, Christian Prescott, Colin Kennedy, Cromefire_, Cyprien Devillez, Dale Visser, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Darshil Chanpura, David Rimmer, Denis A., Dennis Wilson, Devon G. Redekopp, Dmitry Saveliev, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Eng Zer Jun, Eric Lesiuta, Eric P, Erik Meitner, Evan Spensley, Federico Castagnini, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, Han Boetes, HansK-p, Harrison Jones, Heiko Zuerker, Hugo Locurcio, Iain Barnett, Ian Johnson, Ikko Ashimine, Ilya Brin, Iskander Sharipov, Jaakko Hannikainen, Jacek Szafarkiewicz, Jack Croft, Jacob, Jake Peterson, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jauder Ho, Jaya Chithra, Jeffery To, Jens Diemer, Jerry Jacobs, Jochen Voss, Johan Andersson, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jonathan Cross, Jonta, Jose Manuel Delicado, Jörg Thalheim, Jędrzej Kula, Kalle Laine, Karol Różycki, Kebin Liu, Keith Turner, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., Kurt Fitzner, LSmithx2, Lars Lehtonen, Laurent Arnoud, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, Lukas Lihotzki, Majed Abdulaziz, Marc Laporte, Marc Pujol, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maxime Thirouin, MichaIng, Michael Jephcote, Michael Rienstra, Michael Tilli, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, Naveen, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, Otiel, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Pawel Palenica, Paweł Rozlach, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Phill Luby, Pier Paolo Ramon, Piotr Bejda, Pramodh KP, Quentin Hibon, Rahmi Pruitt, Richard Hartmann, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, Ross Smith II, Ruslan Yevdokymov, Ryan Qian, Sacheendra Talluri, Scott Klupfel, Shaarad Dalvi, Simon Mwepu, Sly_tom_cat, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Taylor Khan, Thomas Hipp, Tim Abell, Tim Howes, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tommy Thorn, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, Veeti Paananen, Victor Buinsky, Vil Brekin, Vladimir Rusinov, William A. Kennington III, Xavier O., Yannic A., andresvia, andyleap, boomsquared, bt90, chenrui, chucic, cui fliter, derekriemer, desbma, entity0xfe, georgespatton, ghjklw, ignacy123, janost, jaseg, jelle van der Waa, jtagcat, klemens, luzpaz, marco-m, mclang, mv1005, otbutz, overkill, perewa, red_led, rubenbe, sec65, villekalliomaki, wangguoliang, wouter bolsterlee, xarx00, xjtdy888, 佛跳墙, 落心
|
||||
Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, Caleb Callaway, Daniel Harte, Evgeny Kuznetsov, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Nate Morrison, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Tomasz Wilczyński, Wulf Weich, greatroar, Aaron Bieber, Adam Piggott, Adel Qalieh, Alan Pope, Alberto Donato, Aleksey Vasenev, Alessandro G., Alex Lindeman, Alex Xu, Aman Gupta, Andrew Dunham, Andrew Meyer, Andrew Rabert, Andrey D, Anjan Momi, Antoine Lamielle, Anur, Aranjedeath, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Ben Curthoys, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benedikt Morbach, Benjamin Nater, Benno Fünfstück, Benny Ng, Boqin Qin, Boris Rybalkin, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Chris Tonkinson, Christian Prescott, Colin Kennedy, Cromefire_, Cyprien Devillez, Dale Visser, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Darshil Chanpura, David Rimmer, Denis A., Dennis Wilson, Devon G. Redekopp, Dmitry Saveliev, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Eng Zer Jun, Eric Lesiuta, Eric P, Erik Meitner, Evan Spensley, Federico Castagnini, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, Han Boetes, HansK-p, Harrison Jones, Heiko Zuerker, Hugo Locurcio, Iain Barnett, Ian Johnson, Ikko Ashimine, Ilya Brin, Iskander Sharipov, Jaakko Hannikainen, Jacek Szafarkiewicz, Jack Croft, Jacob, Jake Peterson, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jauder Ho, Jaya Chithra, Jeffery To, Jens Diemer, Jerry Jacobs, Jochen Voss, Johan Andersson, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jonathan Cross, Jonta, Jose Manuel Delicado, Jörg Thalheim, Jędrzej Kula, Kalle Laine, Karol Różycki, Kebin Liu, Keith Turner, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., Kurt Fitzner, LSmithx2, Lars Lehtonen, Laurent Arnoud, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, Lukas Lihotzki, Majed Abdulaziz, Marc Laporte, Marc Pujol, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maxime Thirouin, MichaIng, Michael Jephcote, Michael Rienstra, Michael Tilli, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, Naveen, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, Otiel, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Pawel Palenica, Paweł Rozlach, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Phill Luby, Pier Paolo Ramon, Piotr Bejda, Pramodh KP, Quentin Hibon, Rahmi Pruitt, Richard Hartmann, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, Ross Smith II, Ruslan Yevdokymov, Ryan Qian, Sacheendra Talluri, Scott Klupfel, Shaarad Dalvi, Simon Mwepu, Sly_tom_cat, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Taylor Khan, Thomas Hipp, Tim Abell, Tim Howes, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tommy Thorn, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, Veeti Paananen, Victor Buinsky, Vil Brekin, Vladimir Rusinov, William A. Kennington III, Xavier O., Yannic A., andresvia, andyleap, boomsquared, bt90, chenrui, chucic, cui fliter, derekriemer, desbma, entity0xfe, georgespatton, ghjklw, ignacy123, janost, jaseg, jelle van der Waa, jtagcat, klemens, luzpaz, marco-m, mclang, mv1005, otbutz, overkill, perewa, red_led, rubenbe, sec65, villekalliomaki, wangguoliang, wouter bolsterlee, xarx00, xjtdy888, 佛跳墙, 落心
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -537,7 +537,7 @@ angular.module('syncthing.core')
|
||||
&& guiCfg.authMode !== 'ldap'
|
||||
&& !guiCfg.insecureAdminAccess;
|
||||
|
||||
if (guiCfg.user && guiCfg.password) {
|
||||
if ((guiCfg.user && guiCfg.password) || guiCfg.authMode === 'ldap') {
|
||||
$scope.dismissNotification('authenticationUserAndPassword');
|
||||
}
|
||||
}
|
||||
@@ -865,7 +865,9 @@ angular.module('syncthing.core')
|
||||
$scope.deviceStats = data;
|
||||
for (var device in $scope.deviceStats) {
|
||||
$scope.deviceStats[device].lastSeen = new Date($scope.deviceStats[device].lastSeen);
|
||||
$scope.deviceStats[device].lastSeenDays = (new Date() - $scope.deviceStats[device].lastSeen) / 1000 / 86400;
|
||||
if ($scope.deviceStats[device].lastSeen.toISOString() !== '1970-01-01T00:00:00.000Z') {
|
||||
$scope.deviceStats[device].lastSeenDays = (new Date() - $scope.deviceStats[device].lastSeen) / 1000 / 86400;
|
||||
}
|
||||
}
|
||||
console.log("refreshDeviceStats", data);
|
||||
}).error($scope.emitHTTPError);
|
||||
@@ -1073,8 +1075,9 @@ angular.module('syncthing.core')
|
||||
|
||||
$scope.deviceStatus = function (deviceCfg) {
|
||||
var status = '';
|
||||
var unused = $scope.deviceFolders(deviceCfg).length === 0;
|
||||
|
||||
if ($scope.deviceFolders(deviceCfg).length === 0) {
|
||||
if (unused) {
|
||||
status = 'unused-';
|
||||
}
|
||||
|
||||
@@ -1095,7 +1098,11 @@ angular.module('syncthing.core')
|
||||
}
|
||||
|
||||
// Disconnected
|
||||
return status + 'disconnected';
|
||||
if (!unused && $scope.deviceStats[deviceCfg.deviceID].lastSeenDays >= 7) {
|
||||
return status + 'disconnected-inactive';
|
||||
} else {
|
||||
return status + 'disconnected';
|
||||
}
|
||||
};
|
||||
|
||||
$scope.deviceClass = function (deviceCfg) {
|
||||
@@ -1979,10 +1986,10 @@ angular.module('syncthing.core')
|
||||
return;
|
||||
}
|
||||
var idx;
|
||||
if ($scope.currentFolder.fsWatcherEnabled) {
|
||||
idx = 1;
|
||||
} else if ($scope.currentFolder.type === 'receiveencrypted') {
|
||||
if ($scope.currentFolder.type === 'receiveencrypted') {
|
||||
idx = 2;
|
||||
} else if ($scope.currentFolder.fsWatcherEnabled) {
|
||||
idx = 1;
|
||||
} else {
|
||||
idx = 0;
|
||||
}
|
||||
@@ -3171,6 +3178,132 @@ angular.module('syncthing.core')
|
||||
address.indexOf('unix://') == 0 ||
|
||||
address.indexOf('unixs://') == 0);
|
||||
};
|
||||
|
||||
$scope.shareDeviceIdDialog = function (method) {
|
||||
// This function can be used to share both user's own and remote
|
||||
// device IDs. Three sharing methods are used - copy to clipboard,
|
||||
// send by email, and send by SMS.
|
||||
var params = {
|
||||
method: method,
|
||||
};
|
||||
var deviceID = $scope.currentDevice.deviceID;
|
||||
var deviceName = $scope.deviceName($scope.currentDevice);
|
||||
|
||||
// Title and footer can be reused between different sharing
|
||||
// methods, hence we define them separately before the body.
|
||||
var title = $translate.instant('Syncthing device ID for "{%devicename%}"', {devicename: deviceName});
|
||||
var footer = $translate.instant("Learn more at {%url%}", {url: "https://syncthing.net"});
|
||||
|
||||
switch (method) {
|
||||
case "email":
|
||||
params.heading = $translate.instant("Share by Email");
|
||||
params.icon = "fa fa-envelope-o";
|
||||
// Email message format requires using CRLF for line breaks.
|
||||
// Ref: https://datatracker.ietf.org/doc/html/rfc5322
|
||||
params.subject = title;
|
||||
params.body = [
|
||||
$translate.instant('To connect with the Syncthing device named "{%devicename%}", add a new remote device on your end with this ID:', {devicename: deviceName}),
|
||||
deviceID,
|
||||
$translate.instant("Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet."),
|
||||
footer
|
||||
].join('\r\n\r\n');
|
||||
break;
|
||||
case "sms":
|
||||
params.heading = $translate.instant("Share by SMS");
|
||||
params.icon = "fa fa-comments-o";
|
||||
// SMS is limited to 160 characters (non-Unicode), so we keep
|
||||
// it as short as possible, e.g. by stripping hyphens from
|
||||
// device ID. The current minimum length is around 140 chars,
|
||||
// but some room is required for longer sharing device names.
|
||||
params.body = [
|
||||
title,
|
||||
deviceID.replace(/-/g, ''),
|
||||
footer
|
||||
].join('\n');
|
||||
break;
|
||||
}
|
||||
|
||||
$scope.shareDeviceIdParams = params;
|
||||
$('#share-device-id-dialog').modal('show');
|
||||
};
|
||||
|
||||
$scope.shareDeviceId = function () {
|
||||
switch ($scope.shareDeviceIdParams.method) {
|
||||
case 'email':
|
||||
location.href = 'mailto:?subject=' + encodeURIComponent($scope.shareDeviceIdParams.subject) + '&body=' + encodeURIComponent($scope.shareDeviceIdParams.body);
|
||||
break;
|
||||
case 'sms':
|
||||
// Ref1: https://rfc-editor.org/rfc/rfc5724
|
||||
// Ref2: https://stackoverflow.com/questions/6480462/how-to-pre-populate-the-sms-body-text-via-an-html-link
|
||||
location.href = 'sms:?&body=' + encodeURIComponent($scope.shareDeviceIdParams.body);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$scope.showTemporaryTooltip = function (event, tooltip) {
|
||||
// This function can be used to display a temporary tooltip above
|
||||
// the current element. This way, we can dynamically add a tooltip
|
||||
// with explanatory text after the user performs an interactive
|
||||
// operation, e.g. clicks a button. If the element already has a
|
||||
// tooltip, it will be saved first and then restored once the user
|
||||
// moves focus to a different element.
|
||||
var e = event.currentTarget;
|
||||
var oldTooltip = e.getAttribute('data-original-title');
|
||||
|
||||
e.setAttribute('data-original-title', tooltip);
|
||||
$(e).tooltip('show');
|
||||
|
||||
if (oldTooltip) {
|
||||
e.setAttribute('data-original-title', oldTooltip);
|
||||
} else {
|
||||
e.removeAttribute('data-original-title');
|
||||
}
|
||||
};
|
||||
|
||||
$scope.copyToClipboard = function (event, content) {
|
||||
var success = $translate.instant("Copied!");
|
||||
var failure = $translate.instant("Copy failed! Try to select and copy manually.");
|
||||
var message = success;
|
||||
|
||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||
// Default for modern browsers on localhost or HTTPS. Doesn't
|
||||
// work on unencrypted HTTP for security reasons.
|
||||
navigator.clipboard.writeText(content);
|
||||
} else if (window.clipboardData && window.clipboardData.setData) {
|
||||
// Fallback for Internet Explorer. Needs to go second before
|
||||
// "document.queryCommandSupported", as the browser supports the
|
||||
// other method too, yet it can often be disabled for security
|
||||
// reasons, causing the copy to fail. The IE-specific method is
|
||||
// more reliable.
|
||||
window.clipboardData.setData('Text', content);
|
||||
} else if (document.queryCommandSupported) {
|
||||
// Fallback for modern browsers on HTTP and non-IE old browsers.
|
||||
// Check for document.queryCommandSupported("copy") support is
|
||||
// omitted on purpose, as old Chrome versions reported "false"
|
||||
// despite supporting the feature. The position and opacity
|
||||
// hacks are needed to work inside Bootstrap modals.
|
||||
var e = event.currentTarget;
|
||||
var textarea = document.createElement("textarea");
|
||||
|
||||
e.appendChild(textarea);
|
||||
textarea.style.position = "fixed";
|
||||
textarea.style.opacity = "0";
|
||||
textarea.textContent = content;
|
||||
textarea.select();
|
||||
|
||||
try {
|
||||
document.execCommand("copy");
|
||||
} catch (ex) {
|
||||
message = failure;
|
||||
} finally {
|
||||
e.removeChild(textarea);
|
||||
}
|
||||
} else {
|
||||
message = failure;
|
||||
}
|
||||
|
||||
$scope.showTemporaryTooltip(event, message);
|
||||
};
|
||||
})
|
||||
.directive('shareTemplate', function () {
|
||||
return {
|
||||
|
||||
@@ -13,9 +13,18 @@
|
||||
<div class="input-group">
|
||||
<input ng-if="editingDeviceNew()" name="deviceID" id="deviceID" class="form-control text-monospace" type="text" ng-model="currentDevice.deviceID" required="" valid-deviceid list="discovery-list" aria-required="true" />
|
||||
<div ng-if="!editingDeviceNew()" class="well well-sm form-control text-monospace" style="height: auto;" select-on-click>{{currentDevice.deviceID}}</div>
|
||||
<div class="input-group-btn">
|
||||
<button type="button" class="btn btn-default" data-toggle="modal" data-target="#idqr" ng-disabled="editingDeviceNew() && !deviceEditor.deviceID.$valid">
|
||||
<span class="fas fa-qrcode"></span> <span translate>Show QR</span>
|
||||
<div id="shareDeviceIdButtons" class="input-group-btn">
|
||||
<button type="button" class="btn btn-default" ng-click="copyToClipboard($event, currentDevice.deviceID)" ng-disabled="editingDeviceNew() && !deviceEditor.deviceID.$valid" tooltip data-original-title="{{ 'Copy' | translate }}">
|
||||
<span class="fa fa-lg fa-clone"></span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="shareDeviceIdDialog('email')" ng-disabled="editingDeviceNew() && !deviceEditor.deviceID.$valid" tooltip data-original-title="{{ 'Share by Email' | translate }}">
|
||||
<span class="fa fa-lg fa-envelope-o"></span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="shareDeviceIdDialog('sms')" ng-disabled="editingDeviceNew() && !deviceEditor.deviceID.$valid" tooltip data-original-title="{{ 'Share by SMS' | translate }}">
|
||||
<span class="fa fa-lg fa-comments-o"></span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" data-toggle="modal" data-target="#idqr" ng-disabled="editingDeviceNew() && !deviceEditor.deviceID.$valid" tooltip data-original-title="{{ 'Show QR' | translate }}">
|
||||
<span class="fa fa-lg fa-qrcode"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,20 @@
|
||||
<modal id="idqr" status="info" icon="fas fa-qrcode" heading="{{'Device Identification' | translate}} - {{deviceName(currentDevice)}}" large="yes" closeable="yes">
|
||||
<div class="modal-body">
|
||||
<div class="well well-sm text-monospace text-center select-on-click">{{currentDevice.deviceID}}</div>
|
||||
<img ng-if="currentDevice.deviceID" class="center-block img-thumbnail" ng-src="qr/?text={{currentDevice.deviceID}}" height="328" width="328" alt="{{'QR code' | translate}}" />
|
||||
<div class="modal-body text-center">
|
||||
<div class="well well-sm text-monospace" select-on-click>{{currentDevice.deviceID}}</div>
|
||||
<div ng-if="currentDevice.deviceID">
|
||||
<img class="img-thumbnail" ng-src="qr/?text={{currentDevice.deviceID}}" height="328" width="328" alt="{{'QR code' | translate}}" />
|
||||
<div class="btn-group-vertical" style="vertical-align: top;">
|
||||
<button type="button" class="btn btn-default" ng-click="copyToClipboard($event, currentDevice.deviceID)">
|
||||
<span class="fa fa-lg fa-clone text-left"></span> <span translate>Copy</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="shareDeviceIdDialog('email')">
|
||||
<span class="fa fa-lg fa-envelope-o"></span> <span translate>Share by Email</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" ng-click="shareDeviceIdDialog('sms')">
|
||||
<span class="fa fa-lg fa-comments-o"></span> <span translate>Share by SMS</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<modal id="share-device-id-dialog" status="warning" icon="{{shareDeviceIdParams.icon}}" heading="{{shareDeviceIdParams.heading}}" large="{{ shareDeviceIdParams.method == 'email' ? 'yes' : 'no' }}" closeable="yes">
|
||||
<div class="modal-body" ng-switch="shareDeviceIdParams.method">
|
||||
<p>
|
||||
<span translate>The following text will automatically be inserted into a new message.</span>
|
||||
<span>
|
||||
<span ng-switch-when="email">
|
||||
<span translate>Your email app should open to let you choose the recipient and send it from your own address.</span>
|
||||
</span>
|
||||
<span ng-switch-when="sms">
|
||||
<span translate>Your SMS app should open to let you choose the recipient and send it from your own number.</span>
|
||||
</span>
|
||||
</span>
|
||||
<span translate>You can also copy and paste the text into a new message manually.</span>
|
||||
</p>
|
||||
<div ng-switch-when="email">
|
||||
<hr>
|
||||
<h5 translate>Subject:</h5>
|
||||
<pre style="word-break: normal; white-space: pre-wrap;">{{shareDeviceIdParams.subject}}<button type="button" class="btn btn-default pull-right" ng-click="copyToClipboard($event, shareDeviceIdParams.subject)" tooltip data-original-title="{{ 'Copy' | translate }}">
|
||||
<span class="fa fa-clone"></span>
|
||||
</button></pre>
|
||||
<h5 translate>Body:</h5>
|
||||
</div>
|
||||
<pre style="word-break: normal; white-space: pre-wrap;">{{shareDeviceIdParams.body}}<button type="button" class="btn btn-default pull-right" ng-click="copyToClipboard($event, shareDeviceIdParams.body)" tooltip data-original-title="{{ 'Copy' | translate }}">
|
||||
<span class="fa fa-clone"></span>
|
||||
</button></pre>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary btn-sm" ng-click="shareDeviceId()">
|
||||
<span class="{{shareDeviceIdParams.icon}}"></span> <span translate>Share</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default btn-sm" data-dismiss="modal">
|
||||
<span class="fas fa-times"></span> <span translate>Cancel</span>
|
||||
</button>
|
||||
</div>
|
||||
</modal>
|
||||
@@ -37,8 +37,7 @@ type waiter interface {
|
||||
}
|
||||
|
||||
const (
|
||||
limiterBurstSize = 4 * 128 << 10
|
||||
maxSingleWriteSize = 8 << 10
|
||||
limiterBurstSize = 4 * 128 << 10
|
||||
)
|
||||
|
||||
func newLimiter(myId protocol.DeviceID, cfg config.Wrapper) *limiter {
|
||||
@@ -251,10 +250,20 @@ func (w *limitedWriter) Write(buf []byte) (int, error) {
|
||||
}
|
||||
|
||||
// This does (potentially) multiple smaller writes in order to be less
|
||||
// bursty with large writes and slow rates.
|
||||
// bursty with large writes and slow rates. At the same time we don't
|
||||
// want to do hilarious amounts of tiny writes when the rate is high, so
|
||||
// try to be a bit adaptable. We range from the minimum write size of 1
|
||||
// KiB up to the limiter burst size, aiming for about a write every
|
||||
// 10ms.
|
||||
singleWriteSize := int(w.waiter.Limit() / 100) // 10ms worth of data
|
||||
singleWriteSize = ((singleWriteSize / 1024) + 1) * 1024 // round up to the next kibibyte
|
||||
if singleWriteSize > limiterBurstSize {
|
||||
singleWriteSize = limiterBurstSize
|
||||
}
|
||||
|
||||
written := 0
|
||||
for written < len(buf) {
|
||||
toWrite := maxSingleWriteSize
|
||||
toWrite := singleWriteSize
|
||||
if toWrite > len(buf)-written {
|
||||
toWrite = len(buf) - written
|
||||
}
|
||||
@@ -294,7 +303,7 @@ func (w waiterHolder) take(tokens int) {
|
||||
// into the lower level reads so we might get a large amount of data and
|
||||
// end up in the loop further down.
|
||||
|
||||
if tokens < limiterBurstSize {
|
||||
if tokens <= limiterBurstSize {
|
||||
// Fast path. We won't get an error from WaitN as we don't pass a
|
||||
// context with a deadline.
|
||||
_ = w.waiter.WaitN(context.TODO(), tokens)
|
||||
|
||||
@@ -218,7 +218,7 @@ func TestLimitedWriterWrite(t *testing.T) {
|
||||
|
||||
// A buffer with random data that is larger than the write size and not
|
||||
// a precise multiple either.
|
||||
src := make([]byte, int(12.5*maxSingleWriteSize))
|
||||
src := make([]byte, int(12.5*8192))
|
||||
if _, err := crand.Reader.Read(src); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -242,9 +242,14 @@ func TestLimitedWriterWrite(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Verify there were lots of writes and that the end result is identical.
|
||||
if cw.writeCount != 13 {
|
||||
t.Error("expected lots of smaller writes, but not too many")
|
||||
// Verify there were lots of writes (we expect one kilobyte write size
|
||||
// for the very low rate in this test) and that the end result is
|
||||
// identical.
|
||||
if cw.writeCount < 10*8 {
|
||||
t.Error("expected lots of smaller writes")
|
||||
}
|
||||
if cw.writeCount > 15*8 {
|
||||
t.Error("expected fewer larger writes")
|
||||
}
|
||||
if !bytes.Equal(src, dst.Bytes()) {
|
||||
t.Error("results should be equal")
|
||||
@@ -319,8 +324,11 @@ func TestLimitedWriterWrite(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify there were lots of writes and that the end result is identical.
|
||||
if cw.writeCount != 13 {
|
||||
t.Error("expected just the one write")
|
||||
if cw.writeCount < 10*8 {
|
||||
t.Error("expected lots of smaller writes")
|
||||
}
|
||||
if cw.writeCount > 15*8 {
|
||||
t.Error("expected fewer larger writes")
|
||||
}
|
||||
if !bytes.Equal(src, dst.Bytes()) {
|
||||
t.Error("results should be equal")
|
||||
|
||||
@@ -178,14 +178,6 @@ func (f *BasicFilesystem) Lstat(name string) (FileInfo, error) {
|
||||
return basicFileInfo{fi}, err
|
||||
}
|
||||
|
||||
func (f *BasicFilesystem) Remove(name string) error {
|
||||
name, err := f.rooted(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.Remove(name)
|
||||
}
|
||||
|
||||
func (f *BasicFilesystem) RemoveAll(name string) error {
|
||||
name, err := f.rooted(name)
|
||||
if err != nil {
|
||||
|
||||
+10
-8
@@ -591,12 +591,12 @@ func TestXattr(t *testing.T) {
|
||||
}
|
||||
|
||||
// Set the xattrs, read them back and compare
|
||||
if err := tfs.SetXattr("/test", attrs, noopXattrFilter{}); errors.Is(err, ErrXattrsNotSupported) || errors.Is(err, syscall.EOPNOTSUPP) {
|
||||
if err := tfs.SetXattr("/test", attrs, testXattrFilter{}); errors.Is(err, ErrXattrsNotSupported) || errors.Is(err, syscall.EOPNOTSUPP) {
|
||||
t.Skip("xattrs not supported")
|
||||
} else if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
res, err := tfs.GetXattr("/test", noopXattrFilter{})
|
||||
res, err := tfs.GetXattr("/test", testXattrFilter{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -631,10 +631,10 @@ func TestXattr(t *testing.T) {
|
||||
sort.Slice(attrs, func(i, j int) bool { return attrs[i].Name < attrs[j].Name })
|
||||
|
||||
// Set the xattrs, read them back and compare
|
||||
if err := tfs.SetXattr("/test", attrs, noopXattrFilter{}); err != nil {
|
||||
if err := tfs.SetXattr("/test", attrs, testXattrFilter{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
res, err = tfs.GetXattr("/test", noopXattrFilter{})
|
||||
res, err = tfs.GetXattr("/test", testXattrFilter{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -666,8 +666,10 @@ func TestWalkInfiniteRecursion(t *testing.T) {
|
||||
testWalkInfiniteRecursion(t, FilesystemTypeBasic, dir)
|
||||
}
|
||||
|
||||
type noopXattrFilter struct{}
|
||||
type testXattrFilter struct{}
|
||||
|
||||
func (noopXattrFilter) Permit(string) bool { return true }
|
||||
func (noopXattrFilter) GetMaxSingleEntrySize() int { return 0 }
|
||||
func (noopXattrFilter) GetMaxTotalSize() int { return 0 }
|
||||
// Permit only xattrs generated by our test, avoiding issues with SELinux etc.
|
||||
func (testXattrFilter) Permit(name string) bool { return strings.HasPrefix(name, "user.test-") }
|
||||
|
||||
func (testXattrFilter) GetMaxSingleEntrySize() int { return 0 }
|
||||
func (testXattrFilter) GetMaxTotalSize() int { return 0 }
|
||||
|
||||
@@ -74,6 +74,14 @@ func (f *BasicFilesystem) Lchown(name, uid, gid string) error {
|
||||
return os.Lchown(name, nuid, ngid)
|
||||
}
|
||||
|
||||
func (f *BasicFilesystem) Remove(name string) error {
|
||||
name, err := f.rooted(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.Remove(name)
|
||||
}
|
||||
|
||||
// unrootedChecked returns the path relative to the folder root (same as
|
||||
// unrooted) or an error if the given path is not a subpath and handles the
|
||||
// special case when the given path is the folder root without a trailing
|
||||
|
||||
@@ -190,6 +190,21 @@ func (f *BasicFilesystem) Lchown(name, uid, gid string) error {
|
||||
return windows.SetSecurityInfo(hdl, windows.SE_FILE_OBJECT, si, (*windows.SID)(ownerSID), (*windows.SID)(groupSID), nil, nil)
|
||||
}
|
||||
|
||||
func (f *BasicFilesystem) Remove(name string) error {
|
||||
name, err := f.rooted(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Remove(name)
|
||||
if os.IsPermission(err) {
|
||||
// Try to remove the read-only attribute and try again
|
||||
if os.Chmod(name, 0600) == nil {
|
||||
err = os.Remove(name)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// unrootedChecked returns the path relative to the folder root (same as
|
||||
// unrooted) or an error if the given path is not a subpath and handles the
|
||||
// special case when the given path is the folder root without a trailing
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"syscall"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -192,3 +193,25 @@ func TestGetFinalPath(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemoveWindowsDirIcon(t *testing.T) {
|
||||
//Try to delete a folder with a custom icon with os.Remove (simulated by the readonly file attribute)
|
||||
|
||||
fs, dir := setup(t)
|
||||
relativePath := "folder_with_icon"
|
||||
path := filepath.Join(dir, relativePath)
|
||||
|
||||
if err := os.Mkdir(path, os.ModeDir); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
ptr, err := syscall.UTF16PtrFromString(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := syscall.SetFileAttributes(ptr, uint32(syscall.FILE_ATTRIBUTE_DIRECTORY+syscall.FILE_ATTRIBUTE_READONLY)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := fs.Remove(relativePath); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -626,8 +626,8 @@ func (f *sendReceiveFolder) handleDir(file protocol.FileInfo, snap *db.Snapshot,
|
||||
return err
|
||||
}
|
||||
|
||||
// Adjust the ownership, if we are supposed to do that.
|
||||
if err := f.maybeAdjustOwnership(&file, path); err != nil {
|
||||
// Set the platform data (ownership, xattrs, etc).
|
||||
if err := f.setPlatformData(&file, path); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -655,7 +655,7 @@ func (f *sendReceiveFolder) handleDir(file protocol.FileInfo, snap *db.Snapshot,
|
||||
return
|
||||
}
|
||||
|
||||
// The directory already exists, so we just correct the mode bits. (We
|
||||
// The directory already exists, so we just correct the metadata. (We
|
||||
// don't handle modification times on directories, because that sucks...)
|
||||
// It's OK to change mode bits on stuff within non-writable directories.
|
||||
if !f.IgnorePerms && !file.NoPermissions {
|
||||
@@ -663,6 +663,10 @@ func (f *sendReceiveFolder) handleDir(file protocol.FileInfo, snap *db.Snapshot,
|
||||
f.newPullError(file.Name, fmt.Errorf("handling dir (setting permissions): %w", err))
|
||||
return
|
||||
}
|
||||
if err := f.setPlatformData(&file, file.Name); err != nil {
|
||||
f.newPullError(file.Name, fmt.Errorf("handling dir (setting metadata): %w", err))
|
||||
return
|
||||
}
|
||||
}
|
||||
dbUpdateChan <- dbUpdateJob{file, dbUpdateHandleDir}
|
||||
}
|
||||
@@ -753,7 +757,7 @@ func (f *sendReceiveFolder) handleSymlink(file protocol.FileInfo, snap *db.Snaps
|
||||
if err := f.mtimefs.CreateSymlink(file.SymlinkTarget, path); err != nil {
|
||||
return err
|
||||
}
|
||||
return f.maybeAdjustOwnership(&file, path)
|
||||
return f.setPlatformData(&file, path)
|
||||
}
|
||||
|
||||
if err = f.inWritableDir(createLink, file.Name); err == nil {
|
||||
@@ -1233,17 +1237,8 @@ func (f *sendReceiveFolder) shortcutFile(file protocol.FileInfo, dbUpdateChan ch
|
||||
}
|
||||
}
|
||||
|
||||
if f.SyncXattrs {
|
||||
if err = f.mtimefs.SetXattr(file.Name, file.Platform.Xattrs(), f.XattrFilter); errors.Is(err, fs.ErrXattrsNotSupported) {
|
||||
l.Debugf("Cannot set xattrs on %q: %v", file.Name, err)
|
||||
} else if err != nil {
|
||||
f.newPullError(file.Name, fmt.Errorf("shortcut file (setting xattrs): %w", err))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if err := f.maybeAdjustOwnership(&file, file.Name); err != nil {
|
||||
f.newPullError(file.Name, fmt.Errorf("shortcut file (setting ownership): %w", err))
|
||||
if err := f.setPlatformData(&file, file.Name); err != nil {
|
||||
f.newPullError(file.Name, fmt.Errorf("shortcut file (setting metadata): %w", err))
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1612,18 +1607,9 @@ func (f *sendReceiveFolder) performFinish(file, curFile protocol.FileInfo, hasCu
|
||||
}
|
||||
}
|
||||
|
||||
// Set extended attributes
|
||||
if f.SyncXattrs {
|
||||
if err := f.mtimefs.SetXattr(tempName, file.Platform.Xattrs(), f.XattrFilter); errors.Is(err, fs.ErrXattrsNotSupported) {
|
||||
l.Debugf("Cannot set xattrs on %q: %v", file.Name, err)
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("setting xattrs: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Set ownership based on file metadata or parent, maybe.
|
||||
if err := f.maybeAdjustOwnership(&file, tempName); err != nil {
|
||||
return fmt.Errorf("setting ownership: %w", err)
|
||||
// Set file xattrs and ownership.
|
||||
if err := f.setPlatformData(&file, tempName); err != nil {
|
||||
return fmt.Errorf("setting metadata: %w", err)
|
||||
}
|
||||
|
||||
if stat, err := f.mtimefs.Lstat(file.Name); err == nil {
|
||||
@@ -2128,7 +2114,19 @@ func (f *sendReceiveFolder) checkToBeDeleted(file, cur protocol.FileInfo, hasCur
|
||||
return f.scanIfItemChanged(file.Name, stat, cur, hasCur, scanChan)
|
||||
}
|
||||
|
||||
func (f *sendReceiveFolder) maybeAdjustOwnership(file *protocol.FileInfo, name string) error {
|
||||
// setPlatformData makes adjustments to the metadata that should happen for
|
||||
// all types (files, directories, symlinks). This should be one of the last
|
||||
// things we do to a file when syncing changes to it.
|
||||
func (f *sendReceiveFolder) setPlatformData(file *protocol.FileInfo, name string) error {
|
||||
if f.SyncXattrs {
|
||||
// Set extended attributes.
|
||||
if err := f.mtimefs.SetXattr(name, file.Platform.Xattrs(), f.XattrFilter); errors.Is(err, fs.ErrXattrsNotSupported) {
|
||||
l.Debugf("Cannot set xattrs on %q: %v", file.Name, err)
|
||||
} else if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if f.SyncOwnership {
|
||||
// Set ownership based on file metadata.
|
||||
if err := f.syncOwnership(file, name); err != nil {
|
||||
@@ -2140,7 +2138,7 @@ func (f *sendReceiveFolder) maybeAdjustOwnership(file *protocol.FileInfo, name s
|
||||
return err
|
||||
}
|
||||
}
|
||||
// Nothing to do
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ import (
|
||||
|
||||
"github.com/syncthing/syncthing/lib/build"
|
||||
"github.com/syncthing/syncthing/lib/config"
|
||||
"github.com/syncthing/syncthing/lib/fs"
|
||||
"github.com/syncthing/syncthing/lib/protocol"
|
||||
)
|
||||
|
||||
type unifySubsCase struct {
|
||||
@@ -149,3 +151,43 @@ func BenchmarkUnifySubs(b *testing.B) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSetPlatformData(t *testing.T) {
|
||||
// Checks that setPlatformData runs without error when applied to a temp
|
||||
// file, named differently than the given FileInfo.
|
||||
|
||||
dir := t.TempDir()
|
||||
fs := fs.NewFilesystem(fs.FilesystemTypeBasic, dir)
|
||||
if fd, err := fs.Create("file.tmp"); err != nil {
|
||||
t.Fatal(err)
|
||||
} else {
|
||||
fd.Close()
|
||||
}
|
||||
|
||||
xattr := []protocol.Xattr{{Name: "user.foo", Value: []byte("bar")}}
|
||||
fi := &protocol.FileInfo{
|
||||
Name: "should be ignored",
|
||||
Permissions: 0400,
|
||||
ModifiedS: 1234567890,
|
||||
Platform: protocol.PlatformData{
|
||||
Linux: &protocol.XattrData{Xattrs: xattr},
|
||||
Darwin: &protocol.XattrData{Xattrs: xattr},
|
||||
FreeBSD: &protocol.XattrData{Xattrs: xattr},
|
||||
NetBSD: &protocol.XattrData{Xattrs: xattr},
|
||||
},
|
||||
}
|
||||
|
||||
// Minimum required to support setPlatformData
|
||||
sr := &sendReceiveFolder{
|
||||
folder: folder{
|
||||
FolderConfiguration: config.FolderConfiguration{
|
||||
SyncXattrs: true,
|
||||
},
|
||||
mtimefs: fs,
|
||||
},
|
||||
}
|
||||
|
||||
if err := sr.setPlatformData(fi, "file.tmp"); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,9 +244,9 @@ func (f FileInfo) isEquivalent(other FileInfo, comp FileInfoComparison) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// If we are recording inode change times and it changed, they are not
|
||||
// equal.
|
||||
if (f.InodeChangeNs != 0 && other.InodeChangeNs != 0) && f.InodeChangeNs != other.InodeChangeNs {
|
||||
// If we care about either ownership or xattrs, are recording inode change
|
||||
// times and it changed, they are not equal.
|
||||
if !(comp.IgnoreOwnership && comp.IgnoreXattrs) && f.InodeChangeNs != 0 && other.InodeChangeNs != 0 && f.InodeChangeNs != other.InodeChangeNs {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user