mirror of
https://github.com/chylex/Nextcloud-Desktop.git
synced 2026-04-20 16:06:07 +02:00
Compare commits
179 Commits
v2.5.0-bet
...
v2.5.0-rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
58302e9fc0 | ||
|
|
8acc5573ff | ||
|
|
6224f6a1fa | ||
|
|
44bc637237 | ||
|
|
99d4f81892 | ||
|
|
98bedf1031 | ||
|
|
eb31e9205c | ||
|
|
c8204f1725 | ||
|
|
174f99728f | ||
|
|
dcdf6d966d | ||
|
|
3e79ebed60 | ||
|
|
5237a2c3e2 | ||
|
|
6e0d636989 | ||
|
|
d246c1e8b9 | ||
|
|
96541d8ab8 | ||
|
|
091c4fd9b0 | ||
|
|
8098566140 | ||
|
|
21dc97b809 | ||
|
|
0f9b8daa57 | ||
|
|
cddb9aa8ba | ||
|
|
24606c0105 | ||
|
|
3384f7e28b | ||
|
|
6b7328bb87 | ||
|
|
f3529e3dd7 | ||
|
|
305952e32e | ||
|
|
c37186cc56 | ||
|
|
4e866123c5 | ||
|
|
35c0c9c0b1 | ||
|
|
d3bc9fbdf3 | ||
|
|
0cf2970134 | ||
|
|
206f081505 | ||
|
|
1c8307f264 | ||
|
|
2d65091f27 | ||
|
|
a492ab8294 | ||
|
|
3da6f45ba9 | ||
|
|
856d40fd99 | ||
|
|
846075704e | ||
|
|
156308c72e | ||
|
|
c99a35a8a5 | ||
|
|
f937fdd624 | ||
|
|
1f8c3074a6 | ||
|
|
11673005db | ||
|
|
df24a25829 | ||
|
|
2dc7ff7332 | ||
|
|
7ace48d5de | ||
|
|
56ccff4ee8 | ||
|
|
9d9f96a685 | ||
|
|
052c37acda | ||
|
|
fd2e88e13b | ||
|
|
28b399ec2b | ||
|
|
4bb936f876 | ||
|
|
6805d91033 | ||
|
|
8da2b9dbf8 | ||
|
|
45ff3385c7 | ||
|
|
53cc6a1611 | ||
|
|
bfc8154e68 | ||
|
|
74d8f32f37 | ||
|
|
a5e329a1c5 | ||
|
|
3fe44f0d25 | ||
|
|
e207c91228 | ||
|
|
cdf922f51d | ||
|
|
45ffc0ae09 | ||
|
|
e214234001 | ||
|
|
54e58b51ab | ||
|
|
debe37308f | ||
|
|
7c096d08aa | ||
|
|
ac631d008c | ||
|
|
f1cad3443b | ||
|
|
cacde7a3aa | ||
|
|
b533c3582e | ||
|
|
69f18f6b7d | ||
|
|
de80f7d6ca | ||
|
|
38ec3b8972 | ||
|
|
52d40235b6 | ||
|
|
0ee662bb0e | ||
|
|
5733e90b09 | ||
|
|
95d2c64c1b | ||
|
|
b71c753a94 | ||
|
|
bd88ddfa07 | ||
|
|
373c6cd631 | ||
|
|
a464ad2c71 | ||
|
|
f3dd97f29c | ||
|
|
6587955668 | ||
|
|
9013036685 | ||
|
|
ebd632f582 | ||
|
|
ce22007b16 | ||
|
|
6a1043cef0 | ||
|
|
82f3b4c91f | ||
|
|
d0b6a611f2 | ||
|
|
714a4090a7 | ||
|
|
63d7e54ef3 | ||
|
|
a2f4917daf | ||
|
|
a09f1d14ba | ||
|
|
96c37b1fac | ||
|
|
f4dfdf5889 | ||
|
|
08e4ba3363 | ||
|
|
4f83bba829 | ||
|
|
90d3917481 | ||
|
|
d9cc362258 | ||
|
|
0a5f890bf9 | ||
|
|
b873311bc5 | ||
|
|
eaa4e77626 | ||
|
|
7a7799407d | ||
|
|
a4e23e7655 | ||
|
|
56ea525499 | ||
|
|
e84bdd59c7 | ||
|
|
b5f484aaf5 | ||
|
|
264b77c634 | ||
|
|
23d64dd3ac | ||
|
|
67f793a49e | ||
|
|
d202942a2c | ||
|
|
d338c130af | ||
|
|
283c4b13a1 | ||
|
|
40007537ea | ||
|
|
6122a47241 | ||
|
|
ce3339a00f | ||
|
|
14df7a3273 | ||
|
|
9330d2b178 | ||
|
|
87dd198b52 | ||
|
|
a68c95522d | ||
|
|
cba0627a9c | ||
|
|
cb69944b5c | ||
|
|
f80517d719 | ||
|
|
13cfd80093 | ||
|
|
17ac41377e | ||
|
|
0b8459ca14 | ||
|
|
537fac70bf | ||
|
|
cf150caa2b | ||
|
|
23d276021e | ||
|
|
599f6f0228 | ||
|
|
bddc573c54 | ||
|
|
1a73d3323a | ||
|
|
2bfb99f174 | ||
|
|
f4a704164f | ||
|
|
e730f95a71 | ||
|
|
9f1f99f4db | ||
|
|
d236c3c011 | ||
|
|
73ccccb8a7 | ||
|
|
7ab2a9bfcb | ||
|
|
b19abe9c86 | ||
|
|
44026763b8 | ||
|
|
617cd6dfdb | ||
|
|
3a489b73f9 | ||
|
|
07013783ea | ||
|
|
7c77864396 | ||
|
|
3b8dde601d | ||
|
|
d9f79215a7 | ||
|
|
309b0b6382 | ||
|
|
9d021d004d | ||
|
|
452f64221e | ||
|
|
72419a1149 | ||
|
|
ab5c4749c1 | ||
|
|
5cdf8a2997 | ||
|
|
bfd8897f22 | ||
|
|
8c19be7213 | ||
|
|
4a47d1c8ef | ||
|
|
e3d7c9f1ea | ||
|
|
fbd8438072 | ||
|
|
efc2f0eded | ||
|
|
3e839b2e44 | ||
|
|
678e2c873e | ||
|
|
121c0d8433 | ||
|
|
881c7f804f | ||
|
|
2e55702258 | ||
|
|
964470fc11 | ||
|
|
c4d01b6aea | ||
|
|
0f80ecbb39 | ||
|
|
bf35821bc0 | ||
|
|
d896edeee8 | ||
|
|
328f82297a | ||
|
|
cafdcf77cb | ||
|
|
ed705ba98c | ||
|
|
2844c925eb | ||
|
|
ea8676ad2c | ||
|
|
028da61824 | ||
|
|
16337bf656 | ||
|
|
d8bf20310b | ||
|
|
cdd84dce6e | ||
|
|
09f83f4fa9 |
64
.github/issue_template.md
vendored
Normal file
64
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<!---
|
||||||
|
Please try to only report a bug if it happens with the latest version
|
||||||
|
The latest version can be seen by checking https://download.nextcloud.com/desktop/
|
||||||
|
For support try our forums: https://help.nextcloud.com
|
||||||
|
--->
|
||||||
|
|
||||||
|
|
||||||
|
### Expected behaviour
|
||||||
|
Tell us what should happen
|
||||||
|
|
||||||
|
### Actual behaviour
|
||||||
|
Tell us what happens instead
|
||||||
|
|
||||||
|
### Steps to reproduce
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
### Client configuration
|
||||||
|
Client version:
|
||||||
|
|
||||||
|
Operating system:
|
||||||
|
|
||||||
|
OS language:
|
||||||
|
|
||||||
|
Qt version used by client package (Linux only, see also Settings dialog):
|
||||||
|
|
||||||
|
Client package (From Nextcloud or distro) (Linux only):
|
||||||
|
|
||||||
|
Installation path of client:
|
||||||
|
|
||||||
|
|
||||||
|
### Server configuration
|
||||||
|
<!---
|
||||||
|
Optional section. It depends on the issue.
|
||||||
|
--->
|
||||||
|
|
||||||
|
Operating system:
|
||||||
|
|
||||||
|
Web server:
|
||||||
|
|
||||||
|
Database:
|
||||||
|
|
||||||
|
PHP version:
|
||||||
|
|
||||||
|
Nextcloud version:
|
||||||
|
|
||||||
|
Storage backend (external storage):
|
||||||
|
|
||||||
|
### Logs
|
||||||
|
|
||||||
|
Please use Gist (https://gist.github.com/) or a similar code paster for longer
|
||||||
|
logs.
|
||||||
|
|
||||||
|
```Template for output < 10 lines```
|
||||||
|
|
||||||
|
1. Client logfile: Output of `nextcloud --logwindow` or `nextcloud --logfile log.txt`
|
||||||
|
(On Windows using `cmd.exe`, you might need to first `cd` into the Nextcloud directory)
|
||||||
|
(See also https://docs.nextcloud.com/desktop/2.3/troubleshooting.html#log-files)
|
||||||
|
|
||||||
|
2. Web server error log:
|
||||||
|
|
||||||
|
3. Server logfile: nextcloud log (data/nextcloud.log):
|
||||||
|
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -164,3 +164,10 @@ UpgradeLog*.htm
|
|||||||
# Microsoft Fakes
|
# Microsoft Fakes
|
||||||
FakesAssemblies/
|
FakesAssemblies/
|
||||||
|
|
||||||
|
#cmake temporary stuff
|
||||||
|
CMakeCache.txt
|
||||||
|
CMakeFiles/
|
||||||
|
CPackConfig.cmake
|
||||||
|
CPackOptions.cmake
|
||||||
|
CPackSourceConfig.cmake
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[ca]=@APPLICATION_NAME@ client de sincronització d'escriptori
|
Comment[ca]=@APPLICATION_NAME@ client de sincronització d'escriptori
|
||||||
Icon[ca]=@APPLICATION_EXECUTABLE@
|
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||||
Name[ca]=@APPLICATION_NAME@ client de sincro d'escriptori
|
Name[ca]=@APPLICATION_NAME@ client de sincro d'escriptori
|
||||||
GenericName[ca]=Directori de sincronització
|
GenericName[ca]=Directori de sincronització
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
|
Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||||
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
|
Icon[cs_CZ]=@NAZEV_IKONY_APLIKACE@
|
||||||
Name[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
|
Name[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
|
||||||
GenericName[cs_CZ]=Synchronizace složek
|
GenericName[cs_CZ]=Synchronizace složek
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||||
Icon[de]=@APPLICATION_EXECUTABLE@
|
Icon[de]=@APPLICATION_ICON_NAME@
|
||||||
Name[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
Name[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
|
||||||
GenericName[de]=Synchronisationsordner
|
GenericName[de]=Synchronisationsordner
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||||
Icon[en_GB]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||||
GenericName[en_GB]=Folder Sync
|
GenericName[en_GB]=Folder Sync
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_CL]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_CL]=Sincronización de carpeta
|
GenericName[es_CL]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_CO]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_CO]=Sincronización de carpeta
|
GenericName[es_CO]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_CR]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_CR]=Sincronización de carpeta
|
GenericName[es_CR]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_DO]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_DO]=Sincronización de carpeta
|
GenericName[es_DO]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_EC]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_EC]=Sincronización de carpeta
|
GenericName[es_EC]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_GT]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_GT]=Sincronización de carpeta
|
GenericName[es_GT]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_MX]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_MX]=Sincronización de carpeta
|
GenericName[es_MX]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
Icon[es_SV]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
Name[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio
|
||||||
GenericName[es_SV]=Sincronización de carpeta
|
GenericName[es_SV]=Sincronización de carpeta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
Comment[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||||
Icon[es]=@APPLICATION_EXECUTABLE@
|
Icon[es]=@APPLICATION_ICON_NAME@
|
||||||
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
Name[es]=Cliente de sincronización de escritorio @APPLICATION_NAME@
|
||||||
GenericName[es]=Sincronización de carpetas
|
GenericName[es]=Sincronización de carpetas
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
Comment[fr]=Client de synchronisation @APPLICATION_NAME@ desktop
|
||||||
Icon[fr]=@APPLICATION_EXECUTABLE@
|
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||||
Name[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
Name[fr]=Client desktop de synchronisation @APPLICATION_NAME@
|
||||||
GenericName[fr]=Synchronisation du dossier
|
GenericName[fr]=Synchronisation du dossier
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||||
Icon[he]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
|
||||||
GenericName[he]=סנכרון תיקיות
|
GenericName[he]=סנכרון תיקיות
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||||
Icon[is]=@APPLICATION_EXECUTABLE@
|
Icon[is]=@APPLICATION_ICON_NAME@
|
||||||
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu
|
||||||
GenericName[is]=Samstilling á möppum
|
GenericName[is]=Samstilling á möppum
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||||
Icon[it]=@APPLICATION_EXECUTABLE@
|
Icon[it]=@APPLICATION_ICON_NAME@
|
||||||
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
Name[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@
|
||||||
GenericName[it]=Sincronizzazione cartelle
|
GenericName[it]=Sincronizzazione cartelle
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
GenericName[ja_JP]=フォルダーを同期する
|
GenericName[ja_JP]=フォルダーを同期する
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/lt_LT_translation
Normal file
204
.tx/nextcloud.client-desktop/lt_LT_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||||
|
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa
|
||||||
|
GenericName[lt_LT]=Aplankų sinchronizavimas
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||||
Icon[lv]=@APPLICATION_EXECUTABLE@
|
Icon[lv]=@APPLICATION_ICON_NAME@
|
||||||
Name[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
Name[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients
|
||||||
GenericName[lv]=Mapju Sinhronizēšana
|
GenericName[lv]=Mapju Sinhronizēšana
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||||
Icon[nb_NO]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||||
GenericName[nb_NO]=Mappe synkroinisering
|
GenericName[nb_NO]=Mappe synkroinisering
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
|
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
|
||||||
Icon[nl]=@APPLICATION_EXECUTABLE@
|
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||||
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||||
GenericName[nl]=Map synchronisatie
|
GenericName[nl]=Map synchronisatie
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/pl_translation
Normal file
204
.tx/nextcloud.client-desktop/pl_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||||
|
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
|
||||||
|
GenericName[pl]=Katalog synchronizacji
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||||
Icon[pt_BR]=@APPLICATION_EXECUTABLE@
|
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop
|
||||||
GenericName[pt_BR]=Sincronizar Pasta
|
GenericName[pt_BR]=Sincronizar Pasta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||||
Icon[pt_PT]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho
|
||||||
GenericName[pt_PT]=Sincronização de Pasta
|
GenericName[pt_PT]=Sincronização de Pasta
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
||||||
Icon[ru]=@APPLICATION_EXECUTABLE@
|
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||||
Name[ru]=@APPLICATION_NAME@ клиент для ПК
|
Name[ru]=@APPLICATION_NAME@ клиент для ПК
|
||||||
GenericName[ru]=Синхронизация папок
|
GenericName[ru]=Синхронизация папок
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/sk_translation
Normal file
204
.tx/nextcloud.client-desktop/sk_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[sk_SK]=@APPLICATION_NAME@ Synchronizačný klient pre PC
|
||||||
|
Icon[sk_SK]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[sk_SK]=@APPLICATION_NAME@ Synchronizačný klient pre PC
|
||||||
|
GenericName[sk_SK]=Synchnonizácia priečinka
|
||||||
204
.tx/nextcloud.client-desktop/sl_translation
Normal file
204
.tx/nextcloud.client-desktop/sl_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[sl]=@APPLICATION_NAME@ odjemalec za usklajevanje
|
||||||
|
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[sl]=@APPLICATION_NAME@ odjemalec za usklajevanje
|
||||||
|
GenericName[sl]=Usklajevanje map
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||||
Icon[sr]=@APPLICATION_EXECUTABLE@
|
Icon[sr]=@APPLICATION_ICON_NAME@
|
||||||
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
|
||||||
GenericName[sr]=Синхронизација фасцикли
|
GenericName[sr]=Синхронизација фасцикли
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||||
Icon[tr]=@APPLICATION_EXECUTABLE@
|
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
|
Name[tr]=@APPLICATION_NAME@ masaüstü eşiteme istemcisi
|
||||||
GenericName[tr]=Klasör Eşitleme
|
GenericName[tr]=Klasör Eşitleme
|
||||||
|
|||||||
204
.tx/nextcloud.client-desktop/zh_CN_translation
Normal file
204
.tx/nextcloud.client-desktop/zh_CN_translation
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Utility;X-SuSE-SyncUtility;
|
||||||
|
Type=Application
|
||||||
|
Exec=@APPLICATION_EXECUTABLE@
|
||||||
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
|
GenericName=Folder Sync
|
||||||
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
|
X-GNOME-Autostart-Delay=3
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
|
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||||
|
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
|
GenericName[zh_CN]=文件夹同步
|
||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
|
|||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
|
|
||||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
GenericName[zh_TW]=資料夾同步
|
GenericName[zh_TW]=資料夾同步
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ if(APPLE)
|
|||||||
set( CPACK_GENERATOR "DragNDrop" )
|
set( CPACK_GENERATOR "DragNDrop" )
|
||||||
set( CPACK_SOURCE_GENERATOR "")
|
set( CPACK_SOURCE_GENERATOR "")
|
||||||
set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_SHORTNAME}-${CPACK_PACKAGE_VERSION} )
|
set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_SHORTNAME}-${CPACK_PACKAGE_VERSION} )
|
||||||
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/gui/ownCloud.icns)
|
set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/gui/${APPLICATION_ICON_NAME}.icns)
|
||||||
|
|
||||||
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
|
set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in")
|
||||||
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
|
# set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" )
|
||||||
|
|||||||
18
README.md
18
README.md
@@ -17,30 +17,36 @@ with your computer.
|
|||||||
|
|
||||||
##### Clone the repo and create build directory
|
##### Clone the repo and create build directory
|
||||||
```
|
```
|
||||||
$ git clone git@github.com:nextcloud/desktop.git
|
$ git clone https://github.com/nextcloud/desktop.git
|
||||||
$ cd desktop
|
$ cd desktop
|
||||||
$ mkdir build
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
```
|
```
|
||||||
##### Compile and install
|
##### Compile and install
|
||||||
|
|
||||||
|
For development reasons it is better to install the client on user space
|
||||||
|
instead on the global system. For example you could use in the next
|
||||||
|
instructions `path-to-install-folder/` as `~/.local/` in a linux system. If
|
||||||
|
you want to install system wide you could use `/usr/local` or `/opt/nextcloud/`.
|
||||||
|
|
||||||
##### Linux
|
##### Linux
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib64/libqt5keychain.so -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||||
$ make install
|
$ make install
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Windows
|
##### Windows
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
$ cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DPng2Ico_EXECUTABLE=/path-to-install-png2ico/png2ico.exe -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib/qt5keychain.lib -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||||
$ cmake --build . --config Debug --target install
|
$ cmake --build . --config Debug --target install
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Mac OS
|
##### Mac OS
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=path-to-install-folder/ -DCMAKE_BUILD_TYPE=Debug -DNO_SHIBBOLETH=1 -DQTKEYCHAIN_LIBRARY=/path-to-qt5keychain-folder/lib/libqt5keychain.dylib -DQTKEYCHAIN_INCLUDE_DIR=/path-to-qt5keychain-folder/include/qt5keychain/ -DOPENSSL_ROOT_DIR=/path-to-openssl-folder/ -DOPENSSL_INCLUDE_DIR=path-to-openssl-folder/include -DOPENSSL_LIBRARIES=path-to-openssl-folder/lib
|
||||||
$ make install
|
$ make install
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -69,6 +75,8 @@ of your report being lost. :boom:
|
|||||||
|
|
||||||
- If you created a patch :heart_eyes:, please submit a [Pull
|
- If you created a patch :heart_eyes:, please submit a [Pull
|
||||||
Request](https://github.com/nextcloud/client/pulls).
|
Request](https://github.com/nextcloud/client/pulls).
|
||||||
|
- How to create a pull request? This guide will help you get started: [Opening a pull request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) :heart:
|
||||||
|
|
||||||
|
|
||||||
## :satellite: Contact us
|
## :satellite: Contact us
|
||||||
|
|
||||||
@@ -99,5 +107,3 @@ https://github.com/nextcloud/desktop.
|
|||||||
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
for more details.
|
for more details.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ macro (KDE4_ADD_APP_ICON appsources pattern)
|
|||||||
if (fn MATCHES ".*128.*" )
|
if (fn MATCHES ".*128.*" )
|
||||||
list (APPEND _icons ${it})
|
list (APPEND _icons ${it})
|
||||||
endif (fn MATCHES ".*128.*")
|
endif (fn MATCHES ".*128.*")
|
||||||
|
if (fn MATCHES ".*256.*" )
|
||||||
|
list (APPEND _icons ${it})
|
||||||
|
endif (fn MATCHES ".*256.*")
|
||||||
endforeach (it)
|
endforeach (it)
|
||||||
if (_icons)
|
if (_icons)
|
||||||
add_custom_command(OUTPUT ${_outfilename}.ico ${_outfilename}.rc
|
add_custom_command(OUTPUT ${_outfilename}.ico ${_outfilename}.rc
|
||||||
|
|||||||
@@ -168,7 +168,8 @@ function(ecm_add_app_icon appsources)
|
|||||||
${icons_at_32px}
|
${icons_at_32px}
|
||||||
${icons_at_48px}
|
${icons_at_48px}
|
||||||
${icons_at_64px}
|
${icons_at_64px}
|
||||||
${icons_at_128px})
|
${icons_at_128px}
|
||||||
|
${icons_at_256px})
|
||||||
if (NOT windows_icons)
|
if (NOT windows_icons)
|
||||||
message(AUTHOR_WARNING "No icons suitable for use on Windows provided")
|
message(AUTHOR_WARNING "No icons suitable for use on Windows provided")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>@APPLICATION_EXECUTABLE@</string>
|
<string>@APPLICATION_EXECUTABLE@</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>ownCloud.icns</string>
|
<string>@APPLICATION_ICON_NAME@.icns</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>@APPLICATION_REV_DOMAIN@</string>
|
<string>@APPLICATION_REV_DOMAIN@</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
|||||||
19
doc/faq.rst
19
doc/faq.rst
@@ -21,6 +21,25 @@ When a deeply nested directory is excluded from synchronization it will be
|
|||||||
listed with other ignored files and directories in the "Not synced" tab of
|
listed with other ignored files and directories in the "Not synced" tab of
|
||||||
the "Activity" pane.
|
the "Activity" pane.
|
||||||
|
|
||||||
|
There Was A Warning About Changes In Synchronized Folders Not Being Tracked Reliably.
|
||||||
|
-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
On linux when the synchronized folder contains very many subfolders the
|
||||||
|
operating system may not allow for enough inotify watches to monitor the
|
||||||
|
changes in all of them.
|
||||||
|
|
||||||
|
In this case the client will not be able to immediately start the
|
||||||
|
synchronization process when a file in one of the unmonitored folders changes.
|
||||||
|
Instead, the client will show the warning and manually scan folders for changes
|
||||||
|
in a regular interval (two hours by default).
|
||||||
|
|
||||||
|
This problem can be solved by setting the fs.inotify.max_user_watches
|
||||||
|
sysctl to a higher value. This can usually be done either temporarily::
|
||||||
|
|
||||||
|
echo 524288 > /proc/sys/fs/inotify/max_user_watches
|
||||||
|
|
||||||
|
or permanently by adjusting ``/etc/sysctl.conf``.
|
||||||
|
|
||||||
I Want To Move My Local Sync Folder
|
I Want To Move My Local Sync Folder
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ The other options are:
|
|||||||
``--logflush``
|
``--logflush``
|
||||||
Clears (flushes) the log file after each write action.
|
Clears (flushes) the log file after each write action.
|
||||||
|
|
||||||
|
``--logdebug``
|
||||||
|
Also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES="qt.*=true;*.debug=true").
|
||||||
|
)
|
||||||
|
|
||||||
``--confdir`` `<dirname>`
|
``--confdir`` `<dirname>`
|
||||||
Uses the specified configuration directory.
|
Uses the specified configuration directory.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
|
|||||||
Name=@APPLICATION_NAME@ desktop sync client
|
Name=@APPLICATION_NAME@ desktop sync client
|
||||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||||
GenericName=Folder Sync
|
GenericName=Folder Sync
|
||||||
Icon=@APPLICATION_EXECUTABLE@
|
Icon=@APPLICATION_ICON_NAME@
|
||||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||||
X-GNOME-Autostart-Delay=3
|
X-GNOME-Autostart-Delay=3
|
||||||
# Translations
|
# Translations
|
||||||
@@ -198,185 +198,185 @@ X-GNOME-Autostart-Delay=3
|
|||||||
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||||
GenericName[oc]=Dorsièr de Sincronizacion
|
GenericName[oc]=Dorsièr de Sincronizacion
|
||||||
Name[oc]=@APPLICATION_NAME@ sincronizacion del client
|
Name[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||||
Icon[oc]=@APPLICATION_EXECUTABLE@
|
Icon[oc]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
Comment[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
||||||
GenericName[ar]=مزامنة المجلد
|
GenericName[ar]=مزامنة المجلد
|
||||||
Name[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
Name[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
|
||||||
Icon[ar]=@APPLICATION_EXECUTABLE@
|
Icon[ar]=@APPLICATION_ICON_NAME@
|
||||||
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
|
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
|
||||||
GenericName[bg_BG]=Синхронизиране на папката
|
GenericName[bg_BG]=Синхронизиране на папката
|
||||||
Name[bg_BG]=@APPLICATION_NAME@ клиент десктоп синхронизация
|
Name[bg_BG]=@APPLICATION_NAME@ клиент десктоп синхронизация
|
||||||
Icon[bg_BG]=@APPLICATION_EXECUTABLE@
|
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
Comment[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
||||||
GenericName[ca]=Sincronització de carpetes
|
GenericName[ca]=Sincronització de carpetes
|
||||||
Name[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
Name[ca]=Client de sincronització d'escriptori @APPLICATION_NAME@
|
||||||
Icon[ca]=@APPLICATION_EXECUTABLE@
|
Icon[ca]=@APPLICATION_ICON_NAME@
|
||||||
Comment[da]=@APPLICATION_NAME@ skrivebordsklient til synkronisering
|
Comment[da]=@APPLICATION_NAME@ skrivebordsklient til synkronisering
|
||||||
GenericName[da]=Mappesynkronisering
|
GenericName[da]=Mappesynkronisering
|
||||||
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
|
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
|
||||||
Icon[da]=@APPLICATION_EXECUTABLE@
|
Icon[da]=@APPLICATION_ICON_NAME@
|
||||||
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
GenericName[de]=Ordner-Synchronisation
|
GenericName[de]=Ordner-Synchronisation
|
||||||
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
Icon[de]=@APPLICATION_EXECUTABLE@
|
Icon[de]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
GenericName[ja_JP]=フォルダー同期
|
GenericName[ja_JP]=フォルダー同期
|
||||||
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
|
||||||
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
|
Icon[ja_JP]=@APPLICATION_ICON_NAME@
|
||||||
Comment[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
Comment[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
||||||
GenericName[el]=Συγχρονισμός φακέλου
|
GenericName[el]=Συγχρονισμός φακέλου
|
||||||
Name[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
Name[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
|
||||||
Icon[el]=@APPLICATION_EXECUTABLE@
|
Icon[el]=@APPLICATION_ICON_NAME@
|
||||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||||
GenericName[en_GB]=Folder Sync
|
GenericName[en_GB]=Folder Sync
|
||||||
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
|
||||||
Icon[en_GB]=@APPLICATION_EXECUTABLE@
|
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
||||||
Comment[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
Comment[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||||
GenericName[es]=Sincronización de carpeta
|
GenericName[es]=Sincronización de carpeta
|
||||||
Name[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
Name[es]=@APPLICATION_NAME@ cliente de sincronización de escritorio
|
||||||
Icon[es]=@APPLICATION_EXECUTABLE@
|
Icon[es]=@APPLICATION_ICON_NAME@
|
||||||
Comment[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Comment[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
GenericName[de_DE]=Ordner-Synchronisation
|
GenericName[de_DE]=Ordner-Synchronisation
|
||||||
Name[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
Name[de_DE]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
|
||||||
Icon[de_DE]=@APPLICATION_EXECUTABLE@
|
Icon[de_DE]=@APPLICATION_ICON_NAME@
|
||||||
Comment[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
Comment[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
||||||
GenericName[eu]=Karpetaren sinkronizazioa
|
GenericName[eu]=Karpetaren sinkronizazioa
|
||||||
Name[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
Name[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
|
||||||
Icon[eu]=@APPLICATION_EXECUTABLE@
|
Icon[eu]=@APPLICATION_ICON_NAME@
|
||||||
GenericName[fa]=همسان سازی پوشهها
|
GenericName[fa]=همسان سازی پوشهها
|
||||||
Name[fa]=@APPLICATION_EXECUTABLE@ نسخهی همسان سازی مشتری
|
Name[fa]=@APPLICATION_EXECUTABLE@ نسخهی همسان سازی مشتری
|
||||||
Icon[fa]=@APPLICATION_EXECUTABLE@
|
Icon[fa]=@APPLICATION_ICON_NAME@
|
||||||
Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
|
Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
|
||||||
GenericName[fr]=Synchronisation de dossier
|
GenericName[fr]=Synchronisation de dossier
|
||||||
Name[fr]=Client de synchronisation @APPLICATION_NAME@
|
Name[fr]=Client de synchronisation @APPLICATION_NAME@
|
||||||
Icon[fr]=@APPLICATION_EXECUTABLE@
|
Icon[fr]=@APPLICATION_ICON_NAME@
|
||||||
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||||
GenericName[gl]=Sincronizar Cartafol
|
GenericName[gl]=Sincronizar Cartafol
|
||||||
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
|
||||||
Icon[gl]=@APPLICATION_EXECUTABLE@
|
Icon[gl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
|
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
|
||||||
GenericName[he]=סנכון תיקייה
|
GenericName[he]=סנכון תיקייה
|
||||||
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
|
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
|
||||||
Icon[he]=@APPLICATION_EXECUTABLE@
|
Icon[he]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
Comment[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
||||||
GenericName[ia]=Synchronisar Dossier
|
GenericName[ia]=Synchronisar Dossier
|
||||||
Name[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
Name[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
|
||||||
Icon[ia]=@APPLICATION_EXECUTABLE@
|
Icon[ia]=@APPLICATION_ICON_NAME@
|
||||||
Comment[id]=Klien sinkronisasi desktop @APPLICATION_NAME@
|
Comment[id]=Klien sinkronisasi desktop @APPLICATION_NAME@
|
||||||
GenericName[id]=Folder Sync
|
GenericName[id]=Folder Sync
|
||||||
Name[id]=Klien sync desktop @APPLICATION_NAME@
|
Name[id]=Klien sync desktop @APPLICATION_NAME@
|
||||||
Icon[id]=@APPLICATION_EXECUTABLE@
|
Icon[id]=@APPLICATION_ICON_NAME@
|
||||||
Comment[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
Comment[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
||||||
GenericName[is]=Samstilling möppu
|
GenericName[is]=Samstilling möppu
|
||||||
Name[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
Name[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
|
||||||
Icon[is]=@APPLICATION_EXECUTABLE@
|
Icon[is]=@APPLICATION_ICON_NAME@
|
||||||
Comment[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
Comment[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
||||||
GenericName[it]=Sincronizzazione cartella
|
GenericName[it]=Sincronizzazione cartella
|
||||||
Name[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
Name[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
|
||||||
Icon[it]=@APPLICATION_EXECUTABLE@
|
Icon[it]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||||
GenericName[ko]=폴더 동기화
|
GenericName[ko]=폴더 동기화
|
||||||
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||||
Icon[ko]=@APPLICATION_EXECUTABLE@
|
Icon[ko]=@APPLICATION_ICON_NAME@
|
||||||
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
|
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
|
||||||
GenericName[hu_HU]=Könyvtár szinkronizálás
|
GenericName[hu_HU]=Könyvtár szinkronizálás
|
||||||
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkr. kliens
|
Name[hu_HU]=@APPLICATION_NAME@ asztali szinkr. kliens
|
||||||
Icon[hu_HU]=@APPLICATION_EXECUTABLE@
|
Icon[hu_HU]=@APPLICATION_ICON_NAME@
|
||||||
Comment[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
Comment[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
||||||
GenericName[af_ZA]=Vouersinchronisering
|
GenericName[af_ZA]=Vouersinchronisering
|
||||||
Name[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
Name[af_ZA]=@APPLICATION_NAME@ werkskermsinchroniseerkliënt
|
||||||
Icon[af_ZA]=@APPLICATION_EXECUTABLE@
|
Icon[af_ZA]=@APPLICATION_ICON_NAME@
|
||||||
Comment[nl]=@APPLICATION_NAME@ desktop synchronisatie client
|
Comment[nl]=@APPLICATION_NAME@ desktop synchronisatie client
|
||||||
GenericName[nl]=Mappen sync
|
GenericName[nl]=Mappen sync
|
||||||
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
Name[nl]=@APPLICATION_NAME@ desktop sync client
|
||||||
Icon[nl]=@APPLICATION_EXECUTABLE@
|
Icon[nl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
Comment[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
||||||
GenericName[et_EE]=Kaustade sünkroonimine
|
GenericName[et_EE]=Kaustade sünkroonimine
|
||||||
Name[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
Name[et_EE]=@APPLICATION_NAME@ sünkroonimise klient töölauale
|
||||||
Icon[et_EE]=@APPLICATION_EXECUTABLE@
|
Icon[et_EE]=@APPLICATION_ICON_NAME@
|
||||||
Comment[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
Comment[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
||||||
GenericName[pl]=Folder Synchronizacji
|
GenericName[pl]=Folder Synchronizacji
|
||||||
Name[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
Name[pl]=@APPLICATION_NAME@ klient synchronizacji dla komputerów stacjonarnych
|
||||||
Icon[pl]=@APPLICATION_EXECUTABLE@
|
Icon[pl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização do computador
|
Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização do computador
|
||||||
GenericName[pt_BR]=Sincronização de Pasta
|
GenericName[pt_BR]=Sincronização de Pasta
|
||||||
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização de desktop
|
Name[pt_BR]=@APPLICATION_NAME@ cliente de sincronização de desktop
|
||||||
Icon[pt_BR]=@APPLICATION_EXECUTABLE@
|
Icon[pt_BR]=@APPLICATION_ICON_NAME@
|
||||||
Comment[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
Comment[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
||||||
GenericName[cs_CZ]=Synchronizace adresáře
|
GenericName[cs_CZ]=Synchronizace adresáře
|
||||||
Name[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
Name[cs_CZ]=@APPLICATION_NAME@ počítačový synchronizační klient
|
||||||
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
|
Icon[cs_CZ]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
Comment[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
||||||
GenericName[ru]=Синхронизация каталогов
|
GenericName[ru]=Синхронизация каталогов
|
||||||
Name[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
Name[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
|
||||||
Icon[ru]=@APPLICATION_EXECUTABLE@
|
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||||
Comment[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
Comment[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
||||||
GenericName[sl]=Usklajevanje map
|
GenericName[sl]=Usklajevanje map
|
||||||
Name[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
Name[sl]=@APPLICATION_NAME@ ‒ Program za usklajevanje datotek z namizjem
|
||||||
Icon[sl]=@APPLICATION_EXECUTABLE@
|
Icon[sl]=@APPLICATION_ICON_NAME@
|
||||||
Comment[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
Comment[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
||||||
GenericName[sq]=Njëkohësim Dosjesh
|
GenericName[sq]=Njëkohësim Dosjesh
|
||||||
Name[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
Name[sq]=Klient njëkohësimesh @APPLICATION_NAME@ për desktop
|
||||||
Icon[sq]=@APPLICATION_EXECUTABLE@
|
Icon[sq]=@APPLICATION_ICON_NAME@
|
||||||
Comment[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
Comment[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
||||||
GenericName[fi_FI]=Kansion synkronointi
|
GenericName[fi_FI]=Kansion synkronointi
|
||||||
Name[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
Name[fi_FI]=@APPLICATION_NAME@ työpöytäsynkronointisovellus
|
||||||
Icon[fi_FI]=@APPLICATION_EXECUTABLE@
|
Icon[fi_FI]=@APPLICATION_ICON_NAME@
|
||||||
Comment[sv]=@APPLICATION_NAME@ desktop synkroniseringsklient
|
Comment[sv]=@APPLICATION_NAME@ desktop synkroniseringsklient
|
||||||
GenericName[sv]=Mappsynk
|
GenericName[sv]=Mappsynk
|
||||||
Name[sv]=@APPLICATION_NAME@ desktop synk-klient
|
Name[sv]=@APPLICATION_NAME@ desktop synk-klient
|
||||||
Icon[sv]=@APPLICATION_EXECUTABLE@
|
Icon[sv]=@APPLICATION_ICON_NAME@
|
||||||
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||||
GenericName[tr]=Dosya Eşitleme
|
GenericName[tr]=Dosya Eşitleme
|
||||||
Name[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
Name[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
|
||||||
Icon[tr]=@APPLICATION_EXECUTABLE@
|
Icon[tr]=@APPLICATION_ICON_NAME@
|
||||||
Comment[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
Comment[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
||||||
GenericName[uk]=Синхронізація теки
|
GenericName[uk]=Синхронізація теки
|
||||||
Name[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
Name[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
|
||||||
Icon[uk]=@APPLICATION_EXECUTABLE@
|
Icon[uk]=@APPLICATION_ICON_NAME@
|
||||||
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
||||||
GenericName[ro]=Sincronizare director
|
GenericName[ro]=Sincronizare director
|
||||||
Name[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
Name[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
|
||||||
Icon[ro]=@APPLICATION_EXECUTABLE@
|
Icon[ro]=@APPLICATION_ICON_NAME@
|
||||||
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
GenericName[zh_CN]=文件夹同步
|
GenericName[zh_CN]=文件夹同步
|
||||||
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
|
||||||
Icon[zh_CN]=@APPLICATION_EXECUTABLE@
|
Icon[zh_CN]=@APPLICATION_ICON_NAME@
|
||||||
Comment[zh_HK]=桌面版同步客户端
|
Comment[zh_HK]=桌面版同步客户端
|
||||||
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
GenericName[zh_TW]=資料夾同步
|
GenericName[zh_TW]=資料夾同步
|
||||||
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
|
||||||
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
|
Icon[zh_TW]=@APPLICATION_ICON_NAME@
|
||||||
Comment[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
Comment[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
||||||
GenericName[es_AR]=Sincronización de directorio
|
GenericName[es_AR]=Sincronización de directorio
|
||||||
Name[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
Name[es_AR]=Cliente de sincronización para escritorio @APPLICATION_NAME@
|
||||||
Icon[es_AR]=@APPLICATION_EXECUTABLE@
|
Icon[es_AR]=@APPLICATION_ICON_NAME@
|
||||||
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo programa
|
Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo programa
|
||||||
GenericName[lt_LT]=Katalogo sinchnorizacija
|
GenericName[lt_LT]=Katalogo sinchnorizacija
|
||||||
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
|
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
|
||||||
Icon[lt_LT]=@APPLICATION_EXECUTABLE@
|
Icon[lt_LT]=@APPLICATION_ICON_NAME@
|
||||||
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
||||||
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
|
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
|
||||||
Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
Name[th_TH]= @APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
|
||||||
Icon[th_TH]=@APPLICATION_EXECUTABLE@
|
Icon[th_TH]=@APPLICATION_ICON_NAME@
|
||||||
Comment[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
Comment[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
||||||
GenericName[es_MX]=Sincronización de Carpetas
|
GenericName[es_MX]=Sincronización de Carpetas
|
||||||
Name[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
Name[es_MX]=Cliente de escritorio para sincronziación de @APPLICATION_NAME@
|
||||||
Icon[es_MX]=@APPLICATION_EXECUTABLE@
|
Icon[es_MX]=@APPLICATION_ICON_NAME@
|
||||||
Comment[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
Comment[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
||||||
GenericName[nb_NO]=Mappesynkronisering
|
GenericName[nb_NO]=Mappesynkronisering
|
||||||
Name[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
Name[nb_NO]=@APPLICATION_NAME@ skrivebordssynkroniseringsklient
|
||||||
Icon[nb_NO]=@APPLICATION_EXECUTABLE@
|
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
||||||
Comment[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
Comment[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
||||||
GenericName[nn_NO]=Mappe synkronisering
|
GenericName[nn_NO]=Mappe synkronisering
|
||||||
Name[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
Name[nn_NO]=@APPLICATION_NAME@ klient for å synkronisera frå skrivebord
|
||||||
Icon[nn_NO]=@APPLICATION_EXECUTABLE@
|
Icon[nn_NO]=@APPLICATION_ICON_NAME@
|
||||||
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
||||||
GenericName[pt_PT]=Sincronizar Pasta
|
GenericName[pt_PT]=Sincronizar Pasta
|
||||||
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
|
||||||
Icon[pt_PT]=@APPLICATION_EXECUTABLE@
|
Icon[pt_PT]=@APPLICATION_ICON_NAME@
|
||||||
Icon[km]=@APPLICATION_EXECUTABLE@
|
Icon[km]=@APPLICATION_ICON_NAME@
|
||||||
Comment[lb]=@APPLICATION_NAME@ Desktop Synchronisatioun Client
|
Comment[lb]=@APPLICATION_NAME@ Desktop Synchronisatioun Client
|
||||||
GenericName[lb]=Dossier Dync
|
GenericName[lb]=Dossier Dync
|
||||||
Name[lb]=@APPLICATION_NAME@ Desktop Sync Client
|
Name[lb]=@APPLICATION_NAME@ Desktop Sync Client
|
||||||
Icon[lb]=@APPLICATION_EXECUTABLE@
|
Icon[lb]=@APPLICATION_ICON_NAME@
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class SocketConnect(GObject.GObject):
|
|||||||
self._watch_id = 0
|
self._watch_id = 0
|
||||||
self._sock = None
|
self._sock = None
|
||||||
self._listeners = [self._update_registered_paths, self._get_version]
|
self._listeners = [self._update_registered_paths, self._get_version]
|
||||||
self._remainder = ''.encode()
|
self._remainder = ''.encode() if python3 else ''
|
||||||
self.protocolVersion = '1.0'
|
self.protocolVersion = '1.0'
|
||||||
self.nautilusVFSFile_table = {} # not needed in this object actually but shared
|
self.nautilusVFSFile_table = {} # not needed in this object actually but shared
|
||||||
# all over the other objects.
|
# all over the other objects.
|
||||||
@@ -82,7 +82,7 @@ class SocketConnect(GObject.GObject):
|
|||||||
# print("Server command: " + cmd)
|
# print("Server command: " + cmd)
|
||||||
if self.connected:
|
if self.connected:
|
||||||
try:
|
try:
|
||||||
self._sock.send(cmd.encode())
|
self._sock.send(cmd.encode() if python3 else cmd)
|
||||||
except:
|
except:
|
||||||
print("Sending failed.")
|
print("Sending failed.")
|
||||||
self.reconnect()
|
self.reconnect()
|
||||||
@@ -134,7 +134,8 @@ class SocketConnect(GObject.GObject):
|
|||||||
return []
|
return []
|
||||||
data = self._remainder[:end]
|
data = self._remainder[:end]
|
||||||
self._remainder = self._remainder[end+1:]
|
self._remainder = self._remainder[end+1:]
|
||||||
return data.decode().split('\n')
|
data = data.decode() if python3 else data
|
||||||
|
return data.split('\n')
|
||||||
|
|
||||||
# Notify is the raw answer from the socket
|
# Notify is the raw answer from the socket
|
||||||
def _handle_notify(self, source, condition):
|
def _handle_notify(self, source, condition):
|
||||||
@@ -233,7 +234,7 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
|
|||||||
def ask_for_menu_items(self, files):
|
def ask_for_menu_items(self, files):
|
||||||
record_separator = '\x1e'
|
record_separator = '\x1e'
|
||||||
filesstring = record_separator.join(files)
|
filesstring = record_separator.join(files)
|
||||||
socketConnect.sendCommand('GET_MENU_ITEMS:{}\n'.format(filesstring))
|
socketConnect.sendCommand(u'GET_MENU_ITEMS:{}\n'.format(filesstring))
|
||||||
|
|
||||||
done = False
|
done = False
|
||||||
start = time.time()
|
start = time.time()
|
||||||
|
|||||||
2
src/3rdparty/qtmacgoodies
vendored
2
src/3rdparty/qtmacgoodies
vendored
Submodule src/3rdparty/qtmacgoodies updated: 4ffbff5d5f...ebc7ec6f68
8833
src/3rdparty/sqlite3/sqlite3.c
vendored
8833
src/3rdparty/sqlite3/sqlite3.c
vendored
File diff suppressed because it is too large
Load Diff
275
src/3rdparty/sqlite3/sqlite3.h
vendored
275
src/3rdparty/sqlite3/sqlite3.h
vendored
@@ -123,9 +123,9 @@ extern "C" {
|
|||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||||
** [sqlite_version()] and [sqlite_source_id()].
|
** [sqlite_version()] and [sqlite_source_id()].
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.23.1"
|
#define SQLITE_VERSION "3.24.0"
|
||||||
#define SQLITE_VERSION_NUMBER 3023001
|
#define SQLITE_VERSION_NUMBER 3024000
|
||||||
#define SQLITE_SOURCE_ID "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
|
#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers
|
** CAPI3REF: Run-Time Library Version Numbers
|
||||||
@@ -504,6 +504,7 @@ SQLITE_API int sqlite3_exec(
|
|||||||
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
|
#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8))
|
||||||
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
||||||
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
||||||
|
#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
|
||||||
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
||||||
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
|
#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8))
|
||||||
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
|
#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
|
||||||
@@ -511,6 +512,7 @@ SQLITE_API int sqlite3_exec(
|
|||||||
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
||||||
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
||||||
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
||||||
|
#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8))
|
||||||
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
||||||
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
||||||
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
|
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
|
||||||
@@ -1930,6 +1932,22 @@ struct sqlite3_mem_methods {
|
|||||||
** I/O required to support statement rollback.
|
** I/O required to support statement rollback.
|
||||||
** The default value for this setting is controlled by the
|
** The default value for this setting is controlled by the
|
||||||
** [SQLITE_STMTJRNL_SPILL] compile-time option.
|
** [SQLITE_STMTJRNL_SPILL] compile-time option.
|
||||||
|
**
|
||||||
|
** [[SQLITE_CONFIG_SORTERREF_SIZE]]
|
||||||
|
** <dt>SQLITE_CONFIG_SORTERREF_SIZE
|
||||||
|
** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter
|
||||||
|
** of type (int) - the new value of the sorter-reference size threshold.
|
||||||
|
** Usually, when SQLite uses an external sort to order records according
|
||||||
|
** to an ORDER BY clause, all fields required by the caller are present in the
|
||||||
|
** sorted records. However, if SQLite determines based on the declared type
|
||||||
|
** of a table column that its values are likely to be very large - larger
|
||||||
|
** than the configured sorter-reference size threshold - then a reference
|
||||||
|
** is stored in each sorted record and the required column values loaded
|
||||||
|
** from the database as records are returned in sorted order. The default
|
||||||
|
** value for this option is to never use this optimization. Specifying a
|
||||||
|
** negative value for this option restores the default behaviour.
|
||||||
|
** This option is only available if SQLite is compiled with the
|
||||||
|
** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option.
|
||||||
** </dl>
|
** </dl>
|
||||||
*/
|
*/
|
||||||
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
|
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
|
||||||
@@ -1959,6 +1977,7 @@ struct sqlite3_mem_methods {
|
|||||||
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
|
#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */
|
||||||
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
|
#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */
|
||||||
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
|
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
|
||||||
|
#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Database Connection Configuration Options
|
** CAPI3REF: Database Connection Configuration Options
|
||||||
@@ -2095,6 +2114,21 @@ struct sqlite3_mem_methods {
|
|||||||
** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
|
** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if
|
||||||
** it is not disabled, 1 if it is.
|
** it is not disabled, 1 if it is.
|
||||||
** </dd>
|
** </dd>
|
||||||
|
**
|
||||||
|
** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt>
|
||||||
|
** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run
|
||||||
|
** [VACUUM] in order to reset a database back to an empty database
|
||||||
|
** with no schema and no content. The following process works even for
|
||||||
|
** a badly corrupted database file:
|
||||||
|
** <ol>
|
||||||
|
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
|
||||||
|
** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0);
|
||||||
|
** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
|
||||||
|
** </ol>
|
||||||
|
** Because resetting a database is destructive and irreversible, the
|
||||||
|
** process requires the use of this obscure API and multiple steps to help
|
||||||
|
** ensure that it does not happen by accident.
|
||||||
|
** </dd>
|
||||||
** </dl>
|
** </dl>
|
||||||
*/
|
*/
|
||||||
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */
|
||||||
@@ -2106,7 +2140,8 @@ struct sqlite3_mem_methods {
|
|||||||
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
|
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */
|
||||||
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
|
#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */
|
||||||
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */
|
||||||
#define SQLITE_DBCONFIG_MAX 1008 /* Largest DBCONFIG */
|
#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */
|
||||||
|
#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Enable Or Disable Extended Result Codes
|
** CAPI3REF: Enable Or Disable Extended Result Codes
|
||||||
@@ -5492,6 +5527,41 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory;
|
|||||||
*/
|
*/
|
||||||
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
|
SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Win32 Specific Interface
|
||||||
|
**
|
||||||
|
** These interfaces are available only on Windows. The
|
||||||
|
** [sqlite3_win32_set_directory] interface is used to set the value associated
|
||||||
|
** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to
|
||||||
|
** zValue, depending on the value of the type parameter. The zValue parameter
|
||||||
|
** should be NULL to cause the previous value to be freed via [sqlite3_free];
|
||||||
|
** a non-NULL value will be copied into memory obtained from [sqlite3_malloc]
|
||||||
|
** prior to being used. The [sqlite3_win32_set_directory] interface returns
|
||||||
|
** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported,
|
||||||
|
** or [SQLITE_NOMEM] if memory could not be allocated. The value of the
|
||||||
|
** [sqlite3_data_directory] variable is intended to act as a replacement for
|
||||||
|
** the current directory on the sub-platforms of Win32 where that concept is
|
||||||
|
** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and
|
||||||
|
** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the
|
||||||
|
** sqlite3_win32_set_directory interface except the string parameter must be
|
||||||
|
** UTF-8 or UTF-16, respectively.
|
||||||
|
*/
|
||||||
|
SQLITE_API int sqlite3_win32_set_directory(
|
||||||
|
unsigned long type, /* Identifier for directory being set or reset */
|
||||||
|
void *zValue /* New value for directory being set or reset */
|
||||||
|
);
|
||||||
|
SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue);
|
||||||
|
SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Win32 Directory Types
|
||||||
|
**
|
||||||
|
** These macros are only available on Windows. They define the allowed values
|
||||||
|
** for the type argument to the [sqlite3_win32_set_directory] interface.
|
||||||
|
*/
|
||||||
|
#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1
|
||||||
|
#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Test For Auto-Commit Mode
|
** CAPI3REF: Test For Auto-Commit Mode
|
||||||
** KEYWORDS: {autocommit mode}
|
** KEYWORDS: {autocommit mode}
|
||||||
@@ -6224,6 +6294,10 @@ struct sqlite3_index_info {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Virtual Table Scan Flags
|
** CAPI3REF: Virtual Table Scan Flags
|
||||||
|
**
|
||||||
|
** Virtual table implementations are allowed to set the
|
||||||
|
** [sqlite3_index_info].idxFlags field to some combination of
|
||||||
|
** these bits.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
|
#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */
|
||||||
|
|
||||||
@@ -6999,7 +7073,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|||||||
#define SQLITE_TESTCTRL_ALWAYS 13
|
#define SQLITE_TESTCTRL_ALWAYS 13
|
||||||
#define SQLITE_TESTCTRL_RESERVE 14
|
#define SQLITE_TESTCTRL_RESERVE 14
|
||||||
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
||||||
#define SQLITE_TESTCTRL_ISKEYWORD 16
|
#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
|
||||||
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
||||||
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
|
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
|
||||||
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
|
#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */
|
||||||
@@ -7013,6 +7087,189 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|||||||
#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
|
#define SQLITE_TESTCTRL_PARSER_COVERAGE 26
|
||||||
#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
|
#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: SQL Keyword Checking
|
||||||
|
**
|
||||||
|
** These routines provide access to the set of SQL language keywords
|
||||||
|
** recognized by SQLite. Applications can uses these routines to determine
|
||||||
|
** whether or not a specific identifier needs to be escaped (for example,
|
||||||
|
** by enclosing in double-quotes) so as not to confuse the parser.
|
||||||
|
**
|
||||||
|
** The sqlite3_keyword_count() interface returns the number of distinct
|
||||||
|
** keywords understood by SQLite.
|
||||||
|
**
|
||||||
|
** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and
|
||||||
|
** makes *Z point to that keyword expressed as UTF8 and writes the number
|
||||||
|
** of bytes in the keyword into *L. The string that *Z points to is not
|
||||||
|
** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns
|
||||||
|
** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z
|
||||||
|
** or L are NULL or invalid pointers then calls to
|
||||||
|
** sqlite3_keyword_name(N,Z,L) result in undefined behavior.
|
||||||
|
**
|
||||||
|
** The sqlite3_keyword_check(Z,L) interface checks to see whether or not
|
||||||
|
** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero
|
||||||
|
** if it is and zero if not.
|
||||||
|
**
|
||||||
|
** The parser used by SQLite is forgiving. It is often possible to use
|
||||||
|
** a keyword as an identifier as long as such use does not result in a
|
||||||
|
** parsing ambiguity. For example, the statement
|
||||||
|
** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and
|
||||||
|
** creates a new table named "BEGIN" with three columns named
|
||||||
|
** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid
|
||||||
|
** using keywords as identifiers. Common techniques used to avoid keyword
|
||||||
|
** name collisions include:
|
||||||
|
** <ul>
|
||||||
|
** <li> Put all identifier names inside double-quotes. This is the official
|
||||||
|
** SQL way to escape identifier names.
|
||||||
|
** <li> Put identifier names inside [...]. This is not standard SQL,
|
||||||
|
** but it is what SQL Server does and so lots of programmers use this
|
||||||
|
** technique.
|
||||||
|
** <li> Begin every identifier with the letter "Z" as no SQL keywords start
|
||||||
|
** with "Z".
|
||||||
|
** <li> Include a digit somewhere in every identifier name.
|
||||||
|
** </ul>
|
||||||
|
**
|
||||||
|
** Note that the number of keywords understood by SQLite can depend on
|
||||||
|
** compile-time options. For example, "VACUUM" is not a keyword if
|
||||||
|
** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also,
|
||||||
|
** new keywords may be added to future releases of SQLite.
|
||||||
|
*/
|
||||||
|
SQLITE_API int sqlite3_keyword_count(void);
|
||||||
|
SQLITE_API int sqlite3_keyword_name(int,const char**,int*);
|
||||||
|
SQLITE_API int sqlite3_keyword_check(const char*,int);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Dynamic String Object
|
||||||
|
** KEYWORDS: {dynamic string}
|
||||||
|
**
|
||||||
|
** An instance of the sqlite3_str object contains a dynamically-sized
|
||||||
|
** string under construction.
|
||||||
|
**
|
||||||
|
** The lifecycle of an sqlite3_str object is as follows:
|
||||||
|
** <ol>
|
||||||
|
** <li> ^The sqlite3_str object is created using [sqlite3_str_new()].
|
||||||
|
** <li> ^Text is appended to the sqlite3_str object using various
|
||||||
|
** methods, such as [sqlite3_str_appendf()].
|
||||||
|
** <li> ^The sqlite3_str object is destroyed and the string it created
|
||||||
|
** is returned using the [sqlite3_str_finish()] interface.
|
||||||
|
** </ol>
|
||||||
|
*/
|
||||||
|
typedef struct sqlite3_str sqlite3_str;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Create A New Dynamic String Object
|
||||||
|
** CONSTRUCTOR: sqlite3_str
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_new(D)] interface allocates and initializes
|
||||||
|
** a new [sqlite3_str] object. To avoid memory leaks, the object returned by
|
||||||
|
** [sqlite3_str_new()] must be freed by a subsequent call to
|
||||||
|
** [sqlite3_str_finish(X)].
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_new(D)] interface always returns a pointer to a
|
||||||
|
** valid [sqlite3_str] object, though in the event of an out-of-memory
|
||||||
|
** error the returned object might be a special singleton that will
|
||||||
|
** silently reject new text, always return SQLITE_NOMEM from
|
||||||
|
** [sqlite3_str_errcode()], always return 0 for
|
||||||
|
** [sqlite3_str_length()], and always return NULL from
|
||||||
|
** [sqlite3_str_finish(X)]. It is always safe to use the value
|
||||||
|
** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter
|
||||||
|
** to any of the other [sqlite3_str] methods.
|
||||||
|
**
|
||||||
|
** The D parameter to [sqlite3_str_new(D)] may be NULL. If the
|
||||||
|
** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum
|
||||||
|
** length of the string contained in the [sqlite3_str] object will be
|
||||||
|
** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead
|
||||||
|
** of [SQLITE_MAX_LENGTH].
|
||||||
|
*/
|
||||||
|
SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Finalize A Dynamic String
|
||||||
|
** DESTRUCTOR: sqlite3_str
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X
|
||||||
|
** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()]
|
||||||
|
** that contains the constructed string. The calling application should
|
||||||
|
** pass the returned value to [sqlite3_free()] to avoid a memory leak.
|
||||||
|
** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any
|
||||||
|
** errors were encountered during construction of the string. ^The
|
||||||
|
** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the
|
||||||
|
** string in [sqlite3_str] object X is zero bytes long.
|
||||||
|
*/
|
||||||
|
SQLITE_API char *sqlite3_str_finish(sqlite3_str*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Add Content To A Dynamic String
|
||||||
|
** METHOD: sqlite3_str
|
||||||
|
**
|
||||||
|
** These interfaces add content to an sqlite3_str object previously obtained
|
||||||
|
** from [sqlite3_str_new()].
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_appendf(X,F,...)] and
|
||||||
|
** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf]
|
||||||
|
** functionality of SQLite to append formatted text onto the end of
|
||||||
|
** [sqlite3_str] object X.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S
|
||||||
|
** onto the end of the [sqlite3_str] object X. N must be non-negative.
|
||||||
|
** S must contain at least N non-zero bytes of content. To append a
|
||||||
|
** zero-terminated string in its entirety, use the [sqlite3_str_appendall()]
|
||||||
|
** method instead.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of
|
||||||
|
** zero-terminated string S onto the end of [sqlite3_str] object X.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the
|
||||||
|
** single-byte character C onto the end of [sqlite3_str] object X.
|
||||||
|
** ^This method can be used, for example, to add whitespace indentation.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_reset(X)] method resets the string under construction
|
||||||
|
** inside [sqlite3_str] object X back to zero bytes in length.
|
||||||
|
**
|
||||||
|
** These methods do not return a result code. ^If an error occurs, that fact
|
||||||
|
** is recorded in the [sqlite3_str] object and can be recovered by a
|
||||||
|
** subsequent call to [sqlite3_str_errcode(X)].
|
||||||
|
*/
|
||||||
|
SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...);
|
||||||
|
SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list);
|
||||||
|
SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N);
|
||||||
|
SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn);
|
||||||
|
SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C);
|
||||||
|
SQLITE_API void sqlite3_str_reset(sqlite3_str*);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** CAPI3REF: Status Of A Dynamic String
|
||||||
|
** METHOD: sqlite3_str
|
||||||
|
**
|
||||||
|
** These interfaces return the current status of an [sqlite3_str] object.
|
||||||
|
**
|
||||||
|
** ^If any prior errors have occurred while constructing the dynamic string
|
||||||
|
** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return
|
||||||
|
** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns
|
||||||
|
** [SQLITE_NOMEM] following any out-of-memory error, or
|
||||||
|
** [SQLITE_TOOBIG] if the size of the dynamic string exceeds
|
||||||
|
** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_length(X)] method returns the current length, in bytes,
|
||||||
|
** of the dynamic string under construction in [sqlite3_str] object X.
|
||||||
|
** ^The length returned by [sqlite3_str_length(X)] does not include the
|
||||||
|
** zero-termination byte.
|
||||||
|
**
|
||||||
|
** ^The [sqlite3_str_value(X)] method returns a pointer to the current
|
||||||
|
** content of the dynamic string under construction in X. The value
|
||||||
|
** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X
|
||||||
|
** and might be freed or altered by any subsequent method on the same
|
||||||
|
** [sqlite3_str] object. Applications must not used the pointer returned
|
||||||
|
** [sqlite3_str_value(X)] after any subsequent method call on the same
|
||||||
|
** object. ^Applications may change the content of the string returned
|
||||||
|
** by [sqlite3_str_value(X)] as long as they do not write into any bytes
|
||||||
|
** outside the range of 0 to [sqlite3_str_length(X)] and do not read or
|
||||||
|
** write any byte after any subsequent sqlite3_str method call.
|
||||||
|
*/
|
||||||
|
SQLITE_API int sqlite3_str_errcode(sqlite3_str*);
|
||||||
|
SQLITE_API int sqlite3_str_length(sqlite3_str*);
|
||||||
|
SQLITE_API char *sqlite3_str_value(sqlite3_str*);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: SQLite Runtime Status
|
** CAPI3REF: SQLite Runtime Status
|
||||||
**
|
**
|
||||||
@@ -8282,11 +8539,11 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
|
|||||||
** method of a [virtual table], then it returns true if and only if the
|
** method of a [virtual table], then it returns true if and only if the
|
||||||
** column is being fetched as part of an UPDATE operation during which the
|
** column is being fetched as part of an UPDATE operation during which the
|
||||||
** column value will not change. Applications might use this to substitute
|
** column value will not change. Applications might use this to substitute
|
||||||
** a lighter-weight value to return that the corresponding [xUpdate] method
|
** a return value that is less expensive to compute and that the corresponding
|
||||||
** understands as a "no-change" value.
|
** [xUpdate] method understands as a "no-change" value.
|
||||||
**
|
**
|
||||||
** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
|
** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
|
||||||
** the column is not changed by the UPDATE statement, they the xColumn
|
** the column is not changed by the UPDATE statement, then the xColumn
|
||||||
** method can optionally return without setting a result, without calling
|
** method can optionally return without setting a result, without calling
|
||||||
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
|
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
|
||||||
** In that case, [sqlite3_value_nochange(X)] will return true for the
|
** In that case, [sqlite3_value_nochange(X)] will return true for the
|
||||||
@@ -8781,7 +9038,7 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c
|
|||||||
** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
|
** been a prior call to [sqlite3_deserialize(D,S,...)] with the same
|
||||||
** values of D and S.
|
** values of D and S.
|
||||||
** The size of the database is written into *P even if the
|
** The size of the database is written into *P even if the
|
||||||
** SQLITE_SERIALIZE_NOCOPY bit is set but no contigious copy
|
** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
|
||||||
** of the database exists.
|
** of the database exists.
|
||||||
**
|
**
|
||||||
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
|
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
|
||||||
|
|||||||
@@ -319,7 +319,7 @@ int main(int argc, char **argv)
|
|||||||
options.trustSSL = false;
|
options.trustSSL = false;
|
||||||
options.useNetrc = false;
|
options.useNetrc = false;
|
||||||
options.interactive = true;
|
options.interactive = true;
|
||||||
options.ignoreHiddenFiles = true;
|
options.ignoreHiddenFiles = false; // Default is to sync hidden files
|
||||||
options.nonShib = false;
|
options.nonShib = false;
|
||||||
options.restartTimes = 3;
|
options.restartTimes = 3;
|
||||||
options.uplimit = 0;
|
options.uplimit = 0;
|
||||||
|
|||||||
@@ -602,7 +602,7 @@ void SyncJournalDb::close()
|
|||||||
commitTransaction();
|
commitTransaction();
|
||||||
|
|
||||||
_db.close();
|
_db.close();
|
||||||
_avoidReadFromDbOnNextSyncFilter.clear();
|
clearEtagStorageFilter();
|
||||||
_metadataTableIsEmpty = false;
|
_metadataTableIsEmpty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -824,10 +824,10 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
|
|||||||
SyncJournalFileRecord record = _record;
|
SyncJournalFileRecord record = _record;
|
||||||
QMutexLocker locker(&_mutex);
|
QMutexLocker locker(&_mutex);
|
||||||
|
|
||||||
if (!_avoidReadFromDbOnNextSyncFilter.isEmpty()) {
|
if (!_etagStorageFilter.isEmpty()) {
|
||||||
// If we are a directory that should not be read from db next time, don't write the etag
|
// If we are a directory that should not be read from db next time, don't write the etag
|
||||||
QByteArray prefix = record._path + "/";
|
QByteArray prefix = record._path + "/";
|
||||||
foreach (const QByteArray &it, _avoidReadFromDbOnNextSyncFilter) {
|
foreach (const QByteArray &it, _etagStorageFilter) {
|
||||||
if (it.startsWith(prefix)) {
|
if (it.startsWith(prefix)) {
|
||||||
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
|
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
|
||||||
record._etag = "_invalid_";
|
record._etag = "_invalid_";
|
||||||
@@ -1816,7 +1816,12 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QByteArray &fileName)
|
|||||||
// Prevent future overwrite of the etags of this folder and all
|
// Prevent future overwrite of the etags of this folder and all
|
||||||
// parent folders for this sync
|
// parent folders for this sync
|
||||||
argument.append('/');
|
argument.append('/');
|
||||||
_avoidReadFromDbOnNextSyncFilter.append(argument);
|
_etagStorageFilter.append(argument);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SyncJournalDb::clearEtagStorageFilter()
|
||||||
|
{
|
||||||
|
_etagStorageFilter.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncJournalDb::forceRemoteDiscoveryNextSync()
|
void SyncJournalDb::forceRemoteDiscoveryNextSync()
|
||||||
|
|||||||
@@ -178,10 +178,18 @@ public:
|
|||||||
* Since folders in the selective sync list will not be rediscovered (csync_ftw,
|
* Since folders in the selective sync list will not be rediscovered (csync_ftw,
|
||||||
* _csync_detect_update skip them), the _invalid_ marker will stay. And any
|
* _csync_detect_update skip them), the _invalid_ marker will stay. And any
|
||||||
* child items in the db will be ignored when reading a remote tree from the database.
|
* child items in the db will be ignored when reading a remote tree from the database.
|
||||||
|
*
|
||||||
|
* Any setFileRecord() call to affected directories before the next sync run will be
|
||||||
|
* adjusted to retain the invalid etag via _etagStorageFilter.
|
||||||
*/
|
*/
|
||||||
void avoidReadFromDbOnNextSync(const QString &fileName) { avoidReadFromDbOnNextSync(fileName.toUtf8()); }
|
void avoidReadFromDbOnNextSync(const QString &fileName) { avoidReadFromDbOnNextSync(fileName.toUtf8()); }
|
||||||
void avoidReadFromDbOnNextSync(const QByteArray &fileName);
|
void avoidReadFromDbOnNextSync(const QByteArray &fileName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wipe _etagStorageFilter. Also done implicitly on close().
|
||||||
|
*/
|
||||||
|
void clearEtagStorageFilter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensures full remote discovery happens on the next sync.
|
* Ensures full remote discovery happens on the next sync.
|
||||||
*
|
*
|
||||||
@@ -295,13 +303,20 @@ private:
|
|||||||
SqlQuery _setConflictRecordQuery;
|
SqlQuery _setConflictRecordQuery;
|
||||||
SqlQuery _deleteConflictRecordQuery;
|
SqlQuery _deleteConflictRecordQuery;
|
||||||
|
|
||||||
/* This is the list of paths we called avoidReadFromDbOnNextSync on.
|
/* Storing etags to these folders, or their parent folders, is filtered out.
|
||||||
* It means that they should not be written to the DB in any case since doing
|
*
|
||||||
* that would write the etag and would void the purpose of avoidReadFromDbOnNextSync
|
* When avoidReadFromDbOnNextSync() is called some etags to _invalid_ in the
|
||||||
|
* database. If this is done during a sync run, a later propagation job might
|
||||||
|
* undo that by writing the correct etag to the database instead. This filter
|
||||||
|
* will prevent this write and instead guarantee the _invalid_ etag stays in
|
||||||
|
* place.
|
||||||
|
*
|
||||||
|
* The list is cleared on close() (end of sync run) and explicitly with
|
||||||
|
* clearEtagStorageFilter() (start of sync run).
|
||||||
*
|
*
|
||||||
* The contained paths have a trailing /.
|
* The contained paths have a trailing /.
|
||||||
*/
|
*/
|
||||||
QList<QByteArray> _avoidReadFromDbOnNextSyncFilter;
|
QList<QByteArray> _etagStorageFilter;
|
||||||
|
|
||||||
/** The journal mode to use for the db.
|
/** The journal mode to use for the db.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
/* First, check that the file is NOT in our tree (another file with the same name was added) */
|
/* First, check that the file is NOT in our tree (another file with the same name was added) */
|
||||||
if (our_tree->findFile(basePath)) {
|
if (our_tree->findFile(basePath)) {
|
||||||
other = nullptr;
|
other = nullptr;
|
||||||
qCDebug(lcReconcile, "Origin found in our tree : %s", basePath.constData());
|
qCInfo(lcReconcile, "Origin found in our tree : %s", basePath.constData());
|
||||||
} else {
|
} else {
|
||||||
/* Find the potential rename source file in the other tree.
|
/* Find the potential rename source file in the other tree.
|
||||||
* If the renamed file could not be found in the opposite tree, that is because it
|
* If the renamed file could not be found in the opposite tree, that is because it
|
||||||
@@ -174,7 +174,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
* The journal is cleaned up later after propagation.
|
* The journal is cleaned up later after propagation.
|
||||||
*/
|
*/
|
||||||
other = other_tree->findFile(basePath);
|
other = other_tree->findFile(basePath);
|
||||||
qCDebug(lcReconcile, "Rename origin in other tree (%s) %s",
|
qCInfo(lcReconcile, "Rename origin in other tree (%s) %s",
|
||||||
basePath.constData(), other ? "found" : "not found");
|
basePath.constData(), other ? "found" : "not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +185,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// Some other EVAL_RENAME already claimed other.
|
// Some other EVAL_RENAME already claimed other.
|
||||||
// We do nothing: maybe a different candidate for
|
// We do nothing: maybe a different candidate for
|
||||||
// other is found as well?
|
// other is found as well?
|
||||||
qCDebug(lcReconcile, "Other has already been renamed to %s",
|
qCInfo(lcReconcile, "Other has already been renamed to %s",
|
||||||
other->rename_path.constData());
|
other->rename_path.constData());
|
||||||
} else if (cur->type == ItemTypeDirectory
|
} else if (cur->type == ItemTypeDirectory
|
||||||
// The local replica is reconciled first, so the remote tree would
|
// The local replica is reconciled first, so the remote tree would
|
||||||
@@ -197,13 +197,17 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
|| other->instruction == CSYNC_INSTRUCTION_NONE
|
|| other->instruction == CSYNC_INSTRUCTION_NONE
|
||||||
|| other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA
|
|| other->instruction == CSYNC_INSTRUCTION_UPDATE_METADATA
|
||||||
|| other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
|| other->instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||||
qCDebug(lcReconcile, "Switching %s to RENAME to %s",
|
qCInfo(lcReconcile, "Switching %s to RENAME to %s",
|
||||||
other->path.constData(), cur->path.constData());
|
other->path.constData(), cur->path.constData());
|
||||||
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
other->instruction = CSYNC_INSTRUCTION_RENAME;
|
||||||
other->rename_path = cur->path;
|
other->rename_path = cur->path;
|
||||||
if( !cur->file_id.isEmpty() ) {
|
if( !cur->file_id.isEmpty() ) {
|
||||||
other->file_id = cur->file_id;
|
other->file_id = cur->file_id;
|
||||||
}
|
}
|
||||||
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
|
// Keep the local mtime.
|
||||||
|
other->modtime = cur->modtime;
|
||||||
|
}
|
||||||
other->inode = cur->inode;
|
other->inode = cur->inode;
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
// We have consumed 'other': exit this loop to not consume another one.
|
// We have consumed 'other': exit this loop to not consume another one.
|
||||||
@@ -217,7 +221,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// Local: The remote reconcile will be able to deal with this.
|
// Local: The remote reconcile will be able to deal with this.
|
||||||
// Remote: The local replica has already dealt with this.
|
// Remote: The local replica has already dealt with this.
|
||||||
// See the EVAL_RENAME case when other was found directly.
|
// See the EVAL_RENAME case when other was found directly.
|
||||||
qCDebug(lcReconcile, "File in a renamed directory, other side's instruction: %d",
|
qCInfo(lcReconcile, "File in a renamed directory, other side's instruction: %d",
|
||||||
other->instruction);
|
other->instruction);
|
||||||
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
cur->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
} else {
|
} else {
|
||||||
@@ -225,7 +229,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// and the instruction in the local tree is NEW while cur has EVAL_RENAME
|
// and the instruction in the local tree is NEW while cur has EVAL_RENAME
|
||||||
// due to a remote move of the same file. In these scenarios we just
|
// due to a remote move of the same file. In these scenarios we just
|
||||||
// want the instruction to stay NEW.
|
// want the instruction to stay NEW.
|
||||||
qCDebug(lcReconcile, "Other already has instruction %d",
|
qCInfo(lcReconcile, "Other already has instruction %d",
|
||||||
other->instruction);
|
other->instruction);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -233,7 +237,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
if (ctx->current == LOCAL_REPLICA) {
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
/* use the old name to find the "other" node */
|
/* use the old name to find the "other" node */
|
||||||
OCC::SyncJournalFileRecord base;
|
OCC::SyncJournalFileRecord base;
|
||||||
qCDebug(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
|
qCInfo(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
|
||||||
cur->inode);
|
cur->inode);
|
||||||
ctx->statedb->getFileRecordByInode(cur->inode, &base);
|
ctx->statedb->getFileRecordByInode(cur->inode, &base);
|
||||||
renameCandidateProcessing(base._path);
|
renameCandidateProcessing(base._path);
|
||||||
@@ -246,7 +250,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
// line.
|
// line.
|
||||||
auto basePath = csync_rename_adjust_full_path_source(ctx, cur->path);
|
auto basePath = csync_rename_adjust_full_path_source(ctx, cur->path);
|
||||||
if (basePath != cur->path) {
|
if (basePath != cur->path) {
|
||||||
qCDebug(lcReconcile, "Trying rename origin by csync_rename mapping %s",
|
qCInfo(lcReconcile, "Trying rename origin by csync_rename mapping %s",
|
||||||
basePath.constData());
|
basePath.constData());
|
||||||
// We go through getFileRecordsByFileId to ensure the basePath
|
// We go through getFileRecordsByFileId to ensure the basePath
|
||||||
// computed in this way also has the expected fileid.
|
// computed in this way also has the expected fileid.
|
||||||
@@ -259,7 +263,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
|
|||||||
|
|
||||||
// Also feed all the other files with the same fileid if necessary
|
// Also feed all the other files with the same fileid if necessary
|
||||||
if (!processedRename) {
|
if (!processedRename) {
|
||||||
qCDebug(lcReconcile, "Finding rename origin through file ID %s",
|
qCInfo(lcReconcile, "Finding rename origin through file ID %s",
|
||||||
cur->file_id.constData());
|
cur->file_id.constData());
|
||||||
ctx->statedb->getFileRecordsByFileId(cur->file_id,
|
ctx->statedb->getFileRecordsByFileId(cur->file_id,
|
||||||
[&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); });
|
[&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); });
|
||||||
|
|||||||
@@ -125,12 +125,12 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
* This code should probably be in csync_exclude, but it does not have the fs parameter.
|
* This code should probably be in csync_exclude, but it does not have the fs parameter.
|
||||||
* Keep it here for now */
|
* Keep it here for now */
|
||||||
if (ctx->ignore_hidden_files && (fs->is_hidden)) {
|
if (ctx->ignore_hidden_files && (fs->is_hidden)) {
|
||||||
qCDebug(lcUpdate, "file excluded because it is a hidden file: %s", fs->path.constData());
|
qCInfo(lcUpdate, "file excluded because it is a hidden file: %s", fs->path.constData());
|
||||||
excluded = CSYNC_FILE_EXCLUDE_HIDDEN;
|
excluded = CSYNC_FILE_EXCLUDE_HIDDEN;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* File is ignored because it's matched by a user- or system exclude pattern. */
|
/* File is ignored because it's matched by a user- or system exclude pattern. */
|
||||||
qCDebug(lcUpdate, "%s excluded (%d)", fs->path.constData(), excluded);
|
qCInfo(lcUpdate, "%s excluded (%d)", fs->path.constData(), excluded);
|
||||||
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
|
if (excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -155,7 +155,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
*/
|
*/
|
||||||
QTextEncoder encoder(localCodec, QTextCodec::ConvertInvalidToNull);
|
QTextEncoder encoder(localCodec, QTextCodec::ConvertInvalidToNull);
|
||||||
if (encoder.fromUnicode(QString::fromUtf8(fs->path)).contains('\0')) {
|
if (encoder.fromUnicode(QString::fromUtf8(fs->path)).contains('\0')) {
|
||||||
qCDebug(lcUpdate, "cannot encode %s to local encoding %d",
|
qCInfo(lcUpdate, "cannot encode %s to local encoding %d",
|
||||||
fs->path.constData(), localCodec->mibEnum());
|
fs->path.constData(), localCodec->mibEnum());
|
||||||
excluded = CSYNC_FILE_EXCLUDE_CANNOT_ENCODE;
|
excluded = CSYNC_FILE_EXCLUDE_CANNOT_ENCODE;
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
|
|
||||||
if (fs->type == ItemTypeFile ) {
|
if (fs->type == ItemTypeFile ) {
|
||||||
if (fs->modtime == 0) {
|
if (fs->modtime == 0) {
|
||||||
qCDebug(lcUpdate, "file: %s - mtime is zero!", fs->path.constData());
|
qCInfo(lcUpdate, "file: %s - mtime is zero!", fs->path.constData());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +245,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
checksumIdentical = fs->checksumHeader == base._checksumHeader;
|
checksumIdentical = fs->checksumHeader == base._checksumHeader;
|
||||||
}
|
}
|
||||||
if (checksumIdentical) {
|
if (checksumIdentical) {
|
||||||
qCDebug(lcUpdate, "NOTE: Checksums are identical, file did not actually change: %s", fs->path.constData());
|
qCInfo(lcUpdate, "NOTE: Checksums are identical, file did not actually change: %s", fs->path.constData());
|
||||||
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -269,7 +269,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
* The metadata comparison ensure that we fetch all the file id or permission when
|
* The metadata comparison ensure that we fetch all the file id or permission when
|
||||||
* upgrading owncloud
|
* upgrading owncloud
|
||||||
*/
|
*/
|
||||||
qCDebug(lcUpdate, "Reading from database: %s", fs->path.constData());
|
qCInfo(lcUpdate, "Reading from database: %s", fs->path.constData());
|
||||||
ctx->remote.read_from_db = true;
|
ctx->remote.read_from_db = true;
|
||||||
}
|
}
|
||||||
/* If it was remembered in the db that the remote dir has ignored files, store
|
/* If it was remembered in the db that the remote dir has ignored files, store
|
||||||
@@ -280,7 +280,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
}
|
}
|
||||||
if (metadata_differ) {
|
if (metadata_differ) {
|
||||||
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
/* file id or permissions has changed. Which means we need to update them in the DB. */
|
||||||
qCDebug(lcUpdate, "Need to update metadata for: %s", fs->path.constData());
|
qCInfo(lcUpdate, "Need to update metadata for: %s", fs->path.constData());
|
||||||
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
fs->instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
|
||||||
} else {
|
} else {
|
||||||
fs->instruction = CSYNC_INSTRUCTION_NONE;
|
fs->instruction = CSYNC_INSTRUCTION_NONE;
|
||||||
@@ -288,7 +288,7 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
} else {
|
} else {
|
||||||
/* check if it's a file and has been renamed */
|
/* check if it's a file and has been renamed */
|
||||||
if (ctx->current == LOCAL_REPLICA) {
|
if (ctx->current == LOCAL_REPLICA) {
|
||||||
qCDebug(lcUpdate, "Checking for rename based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
qCInfo(lcUpdate, "Checking for rename based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
||||||
|
|
||||||
OCC::SyncJournalFileRecord base;
|
OCC::SyncJournalFileRecord base;
|
||||||
if(!ctx->statedb->getFileRecordByInode(fs->inode, &base)) {
|
if(!ctx->statedb->getFileRecordByInode(fs->inode, &base)) {
|
||||||
@@ -315,13 +315,13 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
_rel_to_abs(ctx, fs->path), base._checksumHeader,
|
_rel_to_abs(ctx, fs->path), base._checksumHeader,
|
||||||
ctx->callbacks.checksum_userdata);
|
ctx->callbacks.checksum_userdata);
|
||||||
if (!fs->checksumHeader.isEmpty()) {
|
if (!fs->checksumHeader.isEmpty()) {
|
||||||
qCDebug(lcUpdate, "checking checksum of potential rename %s %s <-> %s", fs->path.constData(), fs->checksumHeader.constData(), base._checksumHeader.constData());
|
qCInfo(lcUpdate, "checking checksum of potential rename %s %s <-> %s", fs->path.constData(), fs->checksumHeader.constData(), base._checksumHeader.constData());
|
||||||
isRename = fs->checksumHeader == base._checksumHeader;
|
isRename = fs->checksumHeader == base._checksumHeader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isRename) {
|
if (isRename) {
|
||||||
qCDebug(lcUpdate, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
qCInfo(lcUpdate, "pot rename detected based on inode # %" PRId64 "", (uint64_t) fs->inode);
|
||||||
/* inode found so the file has been renamed */
|
/* inode found so the file has been renamed */
|
||||||
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
||||||
if (fs->type == ItemTypeDirectory) {
|
if (fs->type == ItemTypeDirectory) {
|
||||||
@@ -331,6 +331,8 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
qCInfo(lcUpdate, "Checking for rename based on fileid %s", fs->file_id.constData());
|
||||||
|
|
||||||
/* Remote Replica Rename check */
|
/* Remote Replica Rename check */
|
||||||
fs->instruction = CSYNC_INSTRUCTION_NEW;
|
fs->instruction = CSYNC_INSTRUCTION_NEW;
|
||||||
|
|
||||||
@@ -376,7 +378,8 @@ static int _csync_detect_update(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> f
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qCDebug(lcUpdate, "remote rename detected based on fileid %s --> %s", qPrintable(base._path), qPrintable(fs->path.constData()));
|
qCInfo(lcUpdate, "remote rename detected based on fileid %s --> %s", base._path.constData(), fs->path.constData());
|
||||||
|
|
||||||
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
|
||||||
done = true;
|
done = true;
|
||||||
};
|
};
|
||||||
@@ -484,11 +487,11 @@ int csync_walker(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> fs) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ItemTypeSoftLink:
|
case ItemTypeSoftLink:
|
||||||
qCDebug(lcUpdate, "symlink: %s - not supported", fs->path.constData());
|
qCInfo(lcUpdate, "symlink: %s - not supported", fs->path.constData());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
qCInfo(lcUpdate, "item: %s - item type %d not iterated", fs->path.constData(), fs->type);
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = _csync_detect_update(ctx, std::move(fs));
|
rc = _csync_detect_update(ctx, std::move(fs));
|
||||||
@@ -511,7 +514,7 @@ static bool fill_tree_from_db(CSYNC *ctx, const char *uri)
|
|||||||
* their correct etags again and we don't run into this case.
|
* their correct etags again and we don't run into this case.
|
||||||
*/
|
*/
|
||||||
if (rec._etag == "_invalid_") {
|
if (rec._etag == "_invalid_") {
|
||||||
qCDebug(lcUpdate, "%s selective sync excluded", rec._path.constData());
|
qCInfo(lcUpdate, "%s selective sync excluded", rec._path.constData());
|
||||||
skipbase = rec._path;
|
skipbase = rec._path;
|
||||||
skipbase += '/';
|
skipbase += '/';
|
||||||
return;
|
return;
|
||||||
@@ -757,7 +760,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
csync_vio_closedir(ctx, dh);
|
csync_vio_closedir(ctx, dh);
|
||||||
qCDebug(lcUpdate, " <= Closing walk for %s with read_from_db %d", uri, read_from_db);
|
qCInfo(lcUpdate, " <= Closing walk for %s with read_from_db %d", uri, read_from_db);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *d
|
|||||||
}
|
}
|
||||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DEVICE
|
||||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|
||||||
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
|
) {
|
||||||
file_stat->type = ItemTypeSkip;
|
file_stat->type = ItemTypeSkip;
|
||||||
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
file_stat->type = ItemTypeDirectory;
|
file_stat->type = ItemTypeDirectory;
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ if(NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
|||||||
add_executable( ${APPLICATION_EXECUTABLE} WIN32 main.cpp ${final_src})
|
add_executable( ${APPLICATION_EXECUTABLE} WIN32 main.cpp ${final_src})
|
||||||
else()
|
else()
|
||||||
# set(CMAKE_INSTALL_PREFIX ".") # Examples use /Applications. hurmpf.
|
# set(CMAKE_INSTALL_PREFIX ".") # Examples use /Applications. hurmpf.
|
||||||
set(MACOSX_BUNDLE_ICON_FILE "ownCloud.icns")
|
set(MACOSX_BUNDLE_ICON_FILE "${APPLICATION_ICON_NAME}.icns")
|
||||||
|
|
||||||
# we must add MACOSX_BUNDLE only if building a bundle
|
# we must add MACOSX_BUNDLE only if building a bundle
|
||||||
add_executable( ${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${final_src})
|
add_executable( ${APPLICATION_EXECUTABLE} WIN32 MACOSX_BUNDLE main.cpp ${final_src})
|
||||||
|
|||||||
@@ -680,7 +680,7 @@ void AccountSettings::slotFolderWizardAccepted()
|
|||||||
|
|
||||||
/* take the value from the definition of already existing folders. All folders have
|
/* take the value from the definition of already existing folders. All folders have
|
||||||
* the same setting so far.
|
* the same setting so far.
|
||||||
* The default is to not sync hidden files
|
* The default is to sync hidden files
|
||||||
*/
|
*/
|
||||||
definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
|
definition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
|
||||||
|
|
||||||
|
|||||||
@@ -335,10 +335,10 @@ void AccountState::slotInvalidCredentials()
|
|||||||
|
|
||||||
if (account()->credentials()->ready()) {
|
if (account()->credentials()->ready()) {
|
||||||
account()->credentials()->invalidateToken();
|
account()->credentials()->invalidateToken();
|
||||||
if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
|
}
|
||||||
if (creds->refreshAccessToken())
|
if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
|
||||||
return;
|
if (creds->refreshAccessToken())
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
account()->credentials()->askFromUser();
|
account()->credentials()->askFromUser();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ QVariant ActivityListModel::data(const QModelIndex &index, int role) const
|
|||||||
return type;
|
return type;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Qt::ToolTipRole:
|
|
||||||
case ActivityItemDelegate::ActionTextRole:
|
case ActivityItemDelegate::ActionTextRole:
|
||||||
return a._subject;
|
return a._subject;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace {
|
|||||||
" --logexpire <hours> : removes logs older than <hours> hours.\n"
|
" --logexpire <hours> : removes logs older than <hours> hours.\n"
|
||||||
" (to be used with --logdir)\n"
|
" (to be used with --logdir)\n"
|
||||||
" --logflush : flush the log file after every write.\n"
|
" --logflush : flush the log file after every write.\n"
|
||||||
" --logdebug : also output debug-level messages in the log (equivalent to setting the env var QT_LOGGING_RULES=\"qt.*=true;*.debug=true\").\n"
|
" --logdebug : also output debug-level messages in the log.\n"
|
||||||
" --confdir <dirname> : Use the given configuration folder.\n";
|
" --confdir <dirname> : Use the given configuration folder.\n";
|
||||||
|
|
||||||
QString applicationTrPath()
|
QString applicationTrPath()
|
||||||
@@ -202,9 +202,8 @@ Application::Application(int &argc, char **argv)
|
|||||||
_theme->setSystrayUseMonoIcons(cfg.monoIcons());
|
_theme->setSystrayUseMonoIcons(cfg.monoIcons());
|
||||||
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
|
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
|
||||||
|
|
||||||
FolderMan::instance()->setupFolders();
|
// Setting up the gui class will allow tray notifications for the
|
||||||
_proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
|
// setup that follows, like folder setup
|
||||||
|
|
||||||
_gui = new ownCloudGui(this);
|
_gui = new ownCloudGui(this);
|
||||||
if (_showLogWindow) {
|
if (_showLogWindow) {
|
||||||
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
|
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
|
||||||
@@ -213,6 +212,9 @@ Application::Application(int &argc, char **argv)
|
|||||||
_gui->setupCloudProviders();
|
_gui->setupCloudProviders();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
FolderMan::instance()->setupFolders();
|
||||||
|
_proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
|
||||||
|
|
||||||
// Enable word wrapping of QInputDialog (#4197)
|
// Enable word wrapping of QInputDialog (#4197)
|
||||||
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
|
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,6 @@ void OAuth::start()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
QTimer::singleShot(5 * 60 * 1000, this, [this] { result(Error); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QUrl OAuth::authorisationLink() const
|
QUrl OAuth::authorisationLink() const
|
||||||
|
|||||||
@@ -24,6 +24,35 @@ namespace OCC {
|
|||||||
|
|
||||||
Q_LOGGING_CATEGORY(lcWebFlowCredentials, "sync.credentials.webflow", QtInfoMsg)
|
Q_LOGGING_CATEGORY(lcWebFlowCredentials, "sync.credentials.webflow", QtInfoMsg)
|
||||||
|
|
||||||
|
class WebFlowCredentialsAccessManager : public AccessManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WebFlowCredentialsAccessManager(const WebFlowCredentials *cred, QObject *parent = nullptr)
|
||||||
|
: AccessManager(parent)
|
||||||
|
, _cred(cred)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData) Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
QNetworkRequest req(request);
|
||||||
|
if (!req.attribute(HttpCredentials::DontAddCredentialsAttribute).toBool()) {
|
||||||
|
if (_cred && !_cred->password().isEmpty()) {
|
||||||
|
QByteArray credHash = QByteArray(_cred->user().toUtf8() + ":" + _cred->password().toUtf8()).toBase64();
|
||||||
|
req.setRawHeader("Authorization", "Basic " + credHash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return AccessManager::createRequest(op, req, outgoingData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The credentials object dies along with the account, while the QNAM might
|
||||||
|
// outlive both.
|
||||||
|
QPointer<const WebFlowCredentials> _cred;
|
||||||
|
};
|
||||||
|
|
||||||
WebFlowCredentials::WebFlowCredentials()
|
WebFlowCredentials::WebFlowCredentials()
|
||||||
: _ready(false),
|
: _ready(false),
|
||||||
_credentialsValid(false)
|
_credentialsValid(false)
|
||||||
@@ -56,7 +85,7 @@ QString WebFlowCredentials::password() const {
|
|||||||
|
|
||||||
QNetworkAccessManager *WebFlowCredentials::createQNAM() const {
|
QNetworkAccessManager *WebFlowCredentials::createQNAM() const {
|
||||||
qCInfo(lcWebFlowCredentials()) << "Get QNAM";
|
qCInfo(lcWebFlowCredentials()) << "Get QNAM";
|
||||||
AccessManager *qnam = new AccessManager();
|
AccessManager *qnam = new WebFlowCredentialsAccessManager(this);
|
||||||
|
|
||||||
connect(qnam, &AccessManager::authenticationRequired, this, &WebFlowCredentials::slotAuthentication);
|
connect(qnam, &AccessManager::authenticationRequired, this, &WebFlowCredentials::slotAuthentication);
|
||||||
connect(qnam, &AccessManager::finished, this, &WebFlowCredentials::slotFinished);
|
connect(qnam, &AccessManager::finished, this, &WebFlowCredentials::slotFinished);
|
||||||
|
|||||||
@@ -1015,6 +1015,20 @@ void Folder::warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QS
|
|||||||
Logger::instance()->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
|
Logger::instance()->postOptionalGuiLog(Theme::instance()->appNameGUI(), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Folder::slotWatcherUnreliable(const QString &message)
|
||||||
|
{
|
||||||
|
qCWarning(lcFolder) << "Folder watcher for" << path() << "became unreliable:" << message;
|
||||||
|
auto fullMessage =
|
||||||
|
tr("Changes in synchronized folders could not be tracked reliably.\n"
|
||||||
|
"\n"
|
||||||
|
"This means that the synchronization client might not upload local changes "
|
||||||
|
"immediately and will instead only scan for local changes and upload them "
|
||||||
|
"occasionally (every two hours by default).\n"
|
||||||
|
"\n"
|
||||||
|
"%1").arg(message);
|
||||||
|
Logger::instance()->postGuiLog(Theme::instance()->appNameGUI(), fullMessage);
|
||||||
|
}
|
||||||
|
|
||||||
void Folder::scheduleThisFolderSoon()
|
void Folder::scheduleThisFolderSoon()
|
||||||
{
|
{
|
||||||
if (!_scheduleSelfTimer.isActive()) {
|
if (!_scheduleSelfTimer.isActive()) {
|
||||||
@@ -1034,11 +1048,14 @@ void Folder::registerFolderWatcher()
|
|||||||
if (!QDir(path()).exists())
|
if (!QDir(path()).exists())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_folderWatcher.reset(new FolderWatcher(path(), this));
|
_folderWatcher.reset(new FolderWatcher(this));
|
||||||
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
|
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
|
||||||
this, &Folder::slotWatchedPathChanged);
|
this, &Folder::slotWatchedPathChanged);
|
||||||
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
|
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
|
||||||
this, &Folder::slotNextSyncFullLocalDiscovery);
|
this, &Folder::slotNextSyncFullLocalDiscovery);
|
||||||
|
connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable,
|
||||||
|
this, &Folder::slotWatcherUnreliable);
|
||||||
|
_folderWatcher->init(path());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, bool *cancel)
|
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, bool *cancel)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class FolderDefinition
|
|||||||
public:
|
public:
|
||||||
FolderDefinition()
|
FolderDefinition()
|
||||||
: paused(false)
|
: paused(false)
|
||||||
, ignoreHiddenFiles(true)
|
, ignoreHiddenFiles(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,6 +325,9 @@ private slots:
|
|||||||
/** Warn users if they create a file or folder that is selective-sync excluded */
|
/** Warn users if they create a file or folder that is selective-sync excluded */
|
||||||
void warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path);
|
void warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path);
|
||||||
|
|
||||||
|
/** Warn users about an unreliable folder watcher */
|
||||||
|
void slotWatcherUnreliable(const QString &message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool reloadExcludes();
|
bool reloadExcludes();
|
||||||
|
|
||||||
|
|||||||
@@ -1372,8 +1372,10 @@ QString FolderMan::findGoodPathForNewSyncFolder(const QString &basePath, const Q
|
|||||||
bool FolderMan::ignoreHiddenFiles() const
|
bool FolderMan::ignoreHiddenFiles() const
|
||||||
{
|
{
|
||||||
if (_folderMap.empty()) {
|
if (_folderMap.empty()) {
|
||||||
return true;
|
// Currently no folders in the manager -> return default
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
// Since the hiddenFiles settings is the same for all folders, just return the settings of the first folder
|
||||||
return _folderMap.begin().value()->ignoreHiddenFiles();
|
return _folderMap.begin().value()->ignoreHiddenFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,19 +38,22 @@ namespace OCC {
|
|||||||
|
|
||||||
Q_LOGGING_CATEGORY(lcFolderWatcher, "nextcloud.gui.folderwatcher", QtInfoMsg)
|
Q_LOGGING_CATEGORY(lcFolderWatcher, "nextcloud.gui.folderwatcher", QtInfoMsg)
|
||||||
|
|
||||||
FolderWatcher::FolderWatcher(const QString &root, Folder *folder)
|
FolderWatcher::FolderWatcher(Folder *folder)
|
||||||
: QObject(folder)
|
: QObject(folder)
|
||||||
, _folder(folder)
|
, _folder(folder)
|
||||||
{
|
{
|
||||||
_d.reset(new FolderWatcherPrivate(this, root));
|
|
||||||
|
|
||||||
_timer.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FolderWatcher::~FolderWatcher()
|
FolderWatcher::~FolderWatcher()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FolderWatcher::init(const QString &root)
|
||||||
|
{
|
||||||
|
_d.reset(new FolderWatcherPrivate(this, root));
|
||||||
|
_timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
bool FolderWatcher::pathIsIgnored(const QString &path)
|
bool FolderWatcher::pathIsIgnored(const QString &path)
|
||||||
{
|
{
|
||||||
if (path.isEmpty())
|
if (path.isEmpty())
|
||||||
|
|||||||
@@ -55,11 +55,14 @@ class FolderWatcher : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
// Construct, connect signals, call init()
|
||||||
|
explicit FolderWatcher(Folder *folder = 0L);
|
||||||
|
virtual ~FolderWatcher();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param root Path of the root of the folder
|
* @param root Path of the root of the folder
|
||||||
*/
|
*/
|
||||||
FolderWatcher(const QString &root, Folder *folder = 0L);
|
void init(const QString &root);
|
||||||
virtual ~FolderWatcher();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Not all backends are recursive by default.
|
* Not all backends are recursive by default.
|
||||||
@@ -96,6 +99,12 @@ signals:
|
|||||||
*/
|
*/
|
||||||
void lostChanges();
|
void lostChanges();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals when the watcher became unreliable. The string is a translated
|
||||||
|
* message that can be shown to users.
|
||||||
|
*/
|
||||||
|
void becameUnreliable(const QString &message);
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
// called from the implementations to indicate a change in path
|
// called from the implementations to indicate a change in path
|
||||||
void changeDetected(const QString &path);
|
void changeDetected(const QString &path);
|
||||||
|
|||||||
@@ -81,8 +81,11 @@ void FolderWatcherPrivate::inotifyRegisterPath(const QString &path)
|
|||||||
} else {
|
} else {
|
||||||
// If we're running out of memory or inotify watches, become
|
// If we're running out of memory or inotify watches, become
|
||||||
// unreliable.
|
// unreliable.
|
||||||
if (errno == ENOMEM || errno == ENOSPC) {
|
if (_parent->_isReliable && (errno == ENOMEM || errno == ENOSPC)) {
|
||||||
_parent->_isReliable = false;
|
_parent->_isReliable = false;
|
||||||
|
emit _parent->becameUnreliable(
|
||||||
|
tr("This problem usually happens when the inotify watches are exhausted. "
|
||||||
|
"Check the FAQ for details."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,21 +62,16 @@ const char propertyAccountC[] = "oc_account";
|
|||||||
ownCloudGui::ownCloudGui(Application *parent)
|
ownCloudGui::ownCloudGui(Application *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, _tray(0)
|
, _tray(0)
|
||||||
,
|
|
||||||
#if defined(Q_OS_MAC)
|
#if defined(Q_OS_MAC)
|
||||||
_settingsDialog(new SettingsDialogMac(this))
|
, _settingsDialog(new SettingsDialogMac(this))
|
||||||
,
|
|
||||||
#else
|
#else
|
||||||
_settingsDialog(new SettingsDialog(this))
|
, _settingsDialog(new SettingsDialog(this))
|
||||||
,
|
|
||||||
#endif
|
#endif
|
||||||
_logBrowser(0)
|
, _logBrowser(0)
|
||||||
, _contextMenuVisibleOsx(false)
|
|
||||||
#ifdef WITH_LIBCLOUDPROVIDERS
|
#ifdef WITH_LIBCLOUDPROVIDERS
|
||||||
, _bus(QDBusConnection::sessionBus())
|
, _bus(QDBusConnection::sessionBus())
|
||||||
#endif
|
#endif
|
||||||
, _recentActionsMenu(0)
|
, _recentActionsMenu(0)
|
||||||
, _qdbusmenuWorkaround(false)
|
|
||||||
, _app(parent)
|
, _app(parent)
|
||||||
{
|
{
|
||||||
_tray = new Systray();
|
_tray = new Systray();
|
||||||
@@ -154,7 +149,7 @@ void ownCloudGui::slotOpenSettingsDialog()
|
|||||||
|
|
||||||
void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
|
void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
|
||||||
{
|
{
|
||||||
if (_qdbusmenuWorkaround) {
|
if (_workaroundFakeDoubleClick) {
|
||||||
static QElapsedTimer last_click;
|
static QElapsedTimer last_click;
|
||||||
if (last_click.isValid() && last_click.elapsed() < 200) {
|
if (last_click.isValid() && last_click.elapsed() < 200) {
|
||||||
return;
|
return;
|
||||||
@@ -415,7 +410,7 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
|
|||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
if (separateMenu) {
|
if (separateMenu) {
|
||||||
if (onePaused) {
|
if (onePaused) {
|
||||||
QAction *enable = menu->addAction(tr("Unpause all folders"));
|
QAction *enable = menu->addAction(tr("Resume all folders"));
|
||||||
enable->setProperty(propertyAccountC, QVariant::fromValue(accountState));
|
enable->setProperty(propertyAccountC, QVariant::fromValue(accountState));
|
||||||
connect(enable, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
connect(enable, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
||||||
}
|
}
|
||||||
@@ -439,17 +434,19 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
|
|||||||
|
|
||||||
void ownCloudGui::slotContextMenuAboutToShow()
|
void ownCloudGui::slotContextMenuAboutToShow()
|
||||||
{
|
{
|
||||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
_contextMenuVisibleManual = true;
|
||||||
_contextMenuVisibleOsx = true;
|
|
||||||
|
|
||||||
// Update icon in sys tray, as it might change depending on the context menu state
|
// Update icon in sys tray, as it might change depending on the context menu state
|
||||||
slotComputeOverallSyncStatus();
|
slotComputeOverallSyncStatus();
|
||||||
|
|
||||||
|
if (!_workaroundNoAboutToShowUpdate) {
|
||||||
|
updateContextMenu();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ownCloudGui::slotContextMenuAboutToHide()
|
void ownCloudGui::slotContextMenuAboutToHide()
|
||||||
{
|
{
|
||||||
// For some reason on OS X _contextMenu->isVisible returns always false
|
_contextMenuVisibleManual = false;
|
||||||
_contextMenuVisibleOsx = false;
|
|
||||||
|
|
||||||
// Update icon in sys tray, as it might change depending on the context menu state
|
// Update icon in sys tray, as it might change depending on the context menu state
|
||||||
slotComputeOverallSyncStatus();
|
slotComputeOverallSyncStatus();
|
||||||
@@ -457,11 +454,11 @@ void ownCloudGui::slotContextMenuAboutToHide()
|
|||||||
|
|
||||||
bool ownCloudGui::contextMenuVisible() const
|
bool ownCloudGui::contextMenuVisible() const
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_MAC
|
// On some platforms isVisible doesn't work and always returns false,
|
||||||
return _contextMenuVisibleOsx;
|
// elsewhere aboutToHide is unreliable.
|
||||||
#else
|
if (_workaroundManualVisibility)
|
||||||
|
return _contextMenuVisibleManual;
|
||||||
return _contextMenu->isVisible();
|
return _contextMenu->isVisible();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool minimalTrayMenu()
|
static bool minimalTrayMenu()
|
||||||
@@ -484,12 +481,36 @@ static bool updateWhileVisible()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static QByteArray forceQDBusTrayWorkaround()
|
static QByteArray envForceQDBusTrayWorkaround()
|
||||||
{
|
{
|
||||||
static QByteArray var = qgetenv("OWNCLOUD_FORCE_QDBUS_TRAY_WORKAROUND");
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_QDBUS_TRAY_WORKAROUND");
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundShowAndHideTray()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_SHOW_HIDE");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundNoAboutToShowUpdate()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_NO_ABOUT_TO_SHOW");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundFakeDoubleClick()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_FAKE_DOUBLE_CLICK");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QByteArray envForceWorkaroundManualVisibility()
|
||||||
|
{
|
||||||
|
static QByteArray var = qgetenv("OWNCLOUD_FORCE_TRAY_MANUAL_VISIBILITY");
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
void ownCloudGui::setupContextMenu()
|
void ownCloudGui::setupContextMenu()
|
||||||
{
|
{
|
||||||
if (_contextMenu) {
|
if (_contextMenu) {
|
||||||
@@ -512,51 +533,65 @@ void ownCloudGui::setupContextMenu()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enables workarounds for bugs introduced in Qt 5.5.0
|
auto applyEnvVariable = [](bool *sw, const QByteArray &value) {
|
||||||
// In particular QTBUG-47863 #3672 (tray menu fails to update and
|
if (value == "1")
|
||||||
// becomes unresponsive) and QTBUG-48068 #3722 (click signal is
|
*sw = true;
|
||||||
// emitted several times)
|
if (value == "0")
|
||||||
// The Qt version check intentionally uses 5.0.0 (where platformMenu()
|
*sw = false;
|
||||||
// was introduced) instead of 5.5.0 to avoid issues where the Qt
|
};
|
||||||
// version used to build is different from the one used at runtime.
|
|
||||||
// If we build with 5.6.1 or newer, we can skip this because the
|
|
||||||
// bugs should be fixed there.
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) && (QT_VERSION < QT_VERSION_CHECK(5, 6, 0))
|
|
||||||
if (qVersion() == QByteArray("5.5.0")) {
|
|
||||||
QObject *platformMenu = reinterpret_cast<QObject *>(_tray->contextMenu()->platformMenu());
|
|
||||||
if (platformMenu
|
|
||||||
&& platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
|
|
||||||
_qdbusmenuWorkaround = true;
|
|
||||||
qCWarning(lcApplication) << "Enabled QDBusPlatformMenu workaround";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (forceQDBusTrayWorkaround() == "1") {
|
// This is an old compound flag that people might still depend on
|
||||||
_qdbusmenuWorkaround = true;
|
bool qdbusmenuWorkarounds = false;
|
||||||
} else if (forceQDBusTrayWorkaround() == "0") {
|
applyEnvVariable(&qdbusmenuWorkarounds, envForceQDBusTrayWorkaround());
|
||||||
_qdbusmenuWorkaround = false;
|
if (qdbusmenuWorkarounds) {
|
||||||
|
_workaroundFakeDoubleClick = true;
|
||||||
|
_workaroundNoAboutToShowUpdate = true;
|
||||||
|
_workaroundShowAndHideTray = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// When the qdbusmenuWorkaround is necessary, we can't do on-demand updates
|
|
||||||
// because the workaround is to hide and show the tray icon.
|
|
||||||
if (_qdbusmenuWorkaround) {
|
|
||||||
connect(&_workaroundBatchTrayUpdate, &QTimer::timeout, this, &ownCloudGui::updateContextMenu);
|
|
||||||
_workaroundBatchTrayUpdate.setInterval(30 * 1000);
|
|
||||||
_workaroundBatchTrayUpdate.setSingleShot(true);
|
|
||||||
} else {
|
|
||||||
// Update the context menu whenever we're about to show it
|
|
||||||
// to the user.
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
// https://bugreports.qt.io/browse/QTBUG-54633
|
// https://bugreports.qt.io/browse/QTBUG-54633
|
||||||
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
|
_workaroundNoAboutToShowUpdate = true;
|
||||||
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
|
_workaroundManualVisibility = true;
|
||||||
#else
|
|
||||||
connect(_contextMenu.data(), &QMenu::aboutToShow, this, &ownCloudGui::updateContextMenu);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_LINUX
|
||||||
|
// For KDE sessions if the platform plugin is missing,
|
||||||
|
// neither aboutToShow() updates nor the isVisible() call
|
||||||
|
// work. At least aboutToHide is reliable.
|
||||||
|
// https://github.com/owncloud/client/issues/6545
|
||||||
|
static QByteArray xdgCurrentDesktop = qgetenv("XDG_CURRENT_DESKTOP");
|
||||||
|
static QByteArray desktopSession = qgetenv("DESKTOP_SESSION");
|
||||||
|
bool isKde =
|
||||||
|
xdgCurrentDesktop.contains("KDE")
|
||||||
|
|| desktopSession.contains("plasma")
|
||||||
|
|| desktopSession.contains("kde");
|
||||||
|
QObject *platformMenu = reinterpret_cast<QObject *>(_tray->contextMenu()->platformMenu());
|
||||||
|
if (isKde && platformMenu && platformMenu->metaObject()->className() == QLatin1String("QDBusPlatformMenu")) {
|
||||||
|
_workaroundManualVisibility = true;
|
||||||
|
_workaroundNoAboutToShowUpdate = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
applyEnvVariable(&_workaroundNoAboutToShowUpdate, envForceWorkaroundNoAboutToShowUpdate());
|
||||||
|
applyEnvVariable(&_workaroundFakeDoubleClick, envForceWorkaroundFakeDoubleClick());
|
||||||
|
applyEnvVariable(&_workaroundShowAndHideTray, envForceWorkaroundShowAndHideTray());
|
||||||
|
applyEnvVariable(&_workaroundManualVisibility, envForceWorkaroundManualVisibility());
|
||||||
|
|
||||||
|
qCInfo(lcApplication) << "Tray menu workarounds:"
|
||||||
|
<< "noabouttoshow:" << _workaroundNoAboutToShowUpdate
|
||||||
|
<< "fakedoubleclick:" << _workaroundFakeDoubleClick
|
||||||
|
<< "showhide:" << _workaroundShowAndHideTray
|
||||||
|
<< "manualvisibility:" << _workaroundManualVisibility;
|
||||||
|
|
||||||
|
|
||||||
|
connect(&_delayedTrayUpdateTimer, &QTimer::timeout, this, &ownCloudGui::updateContextMenu);
|
||||||
|
_delayedTrayUpdateTimer.setInterval(2 * 1000);
|
||||||
|
_delayedTrayUpdateTimer.setSingleShot(true);
|
||||||
|
|
||||||
|
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
|
||||||
|
// unfortunately aboutToHide is unreliable, it seems to work on OSX though
|
||||||
|
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
|
||||||
|
|
||||||
// Populate the context menu now.
|
// Populate the context menu now.
|
||||||
updateContextMenu();
|
updateContextMenu();
|
||||||
@@ -568,13 +603,21 @@ void ownCloudGui::updateContextMenu()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_qdbusmenuWorkaround) {
|
// If it's visible, we can't update live, and it won't be updated lazily: reschedule
|
||||||
|
if (contextMenuVisible() && !updateWhileVisible() && _workaroundNoAboutToShowUpdate) {
|
||||||
|
if (!_delayedTrayUpdateTimer.isActive()) {
|
||||||
|
_delayedTrayUpdateTimer.start();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_workaroundShowAndHideTray) {
|
||||||
// To make tray menu updates work with these bugs (see setupContextMenu)
|
// To make tray menu updates work with these bugs (see setupContextMenu)
|
||||||
// we need to hide and show the tray icon. We don't want to do that
|
// we need to hide and show the tray icon. We don't want to do that
|
||||||
// while it's visible!
|
// while it's visible!
|
||||||
if (contextMenuVisible()) {
|
if (contextMenuVisible()) {
|
||||||
if (!_workaroundBatchTrayUpdate.isActive()) {
|
if (!_delayedTrayUpdateTimer.isActive()) {
|
||||||
_workaroundBatchTrayUpdate.start();
|
_delayedTrayUpdateTimer.start();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -648,9 +691,9 @@ void ownCloudGui::updateContextMenu()
|
|||||||
if (atLeastOnePaused) {
|
if (atLeastOnePaused) {
|
||||||
QString text;
|
QString text;
|
||||||
if (accountList.count() > 1) {
|
if (accountList.count() > 1) {
|
||||||
text = tr("Unpause all synchronization");
|
text = tr("Resume all synchronization");
|
||||||
} else {
|
} else {
|
||||||
text = tr("Unpause synchronization");
|
text = tr("Resume synchronization");
|
||||||
}
|
}
|
||||||
QAction *action = _contextMenu->addAction(text);
|
QAction *action = _contextMenu->addAction(text);
|
||||||
connect(action, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
connect(action, &QAction::triggered, this, &ownCloudGui::slotUnpauseAllFolders);
|
||||||
@@ -667,35 +710,30 @@ void ownCloudGui::updateContextMenu()
|
|||||||
}
|
}
|
||||||
_contextMenu->addAction(_actionQuit);
|
_contextMenu->addAction(_actionQuit);
|
||||||
|
|
||||||
if (_qdbusmenuWorkaround) {
|
if (_workaroundShowAndHideTray) {
|
||||||
_tray->show();
|
_tray->show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ownCloudGui::updateContextMenuNeeded()
|
void ownCloudGui::updateContextMenuNeeded()
|
||||||
{
|
{
|
||||||
// For the workaround case updating while visible is impossible. Instead
|
// if it's visible and we can update live: update now
|
||||||
// occasionally update the menu when it's invisible.
|
if (contextMenuVisible() && updateWhileVisible()) {
|
||||||
if (_qdbusmenuWorkaround) {
|
// Note: don't update while visible on OSX
|
||||||
if (!_workaroundBatchTrayUpdate.isActive()) {
|
// https://bugreports.qt.io/browse/QTBUG-54845
|
||||||
_workaroundBatchTrayUpdate.start();
|
updateContextMenu();
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
// if we can't lazily update: update later
|
||||||
// https://bugreports.qt.io/browse/QTBUG-54845
|
if (_workaroundNoAboutToShowUpdate) {
|
||||||
// We cannot update on demand or while visible -> update when invisible.
|
// Note: don't update immediately even in the invisible case
|
||||||
if (!contextMenuVisible()) {
|
// as that can lead to extremely frequent menu updates
|
||||||
updateContextMenu();
|
if (!_delayedTrayUpdateTimer.isActive()) {
|
||||||
|
_delayedTrayUpdateTimer.start();
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (updateWhileVisible() && contextMenuVisible())
|
|
||||||
updateContextMenu();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// If no update was done here, we might update it on-demand due to
|
|
||||||
// the aboutToShow() signal.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
|
void ownCloudGui::slotShowTrayMessage(const QString &title, const QString &msg)
|
||||||
|
|||||||
@@ -140,9 +140,11 @@ private:
|
|||||||
// tray's menu
|
// tray's menu
|
||||||
QScopedPointer<QMenu> _contextMenu;
|
QScopedPointer<QMenu> _contextMenu;
|
||||||
|
|
||||||
// Manually tracking whether the context menu is visible, but only works
|
// Manually tracking whether the context menu is visible via aboutToShow
|
||||||
// on OSX because aboutToHide is not reliable everywhere.
|
// and aboutToHide. Unfortunately aboutToHide isn't reliable everywhere
|
||||||
bool _contextMenuVisibleOsx;
|
// so this only gets used with _workaroundManualVisibility (when the tray's
|
||||||
|
// isVisible() is unreliable)
|
||||||
|
bool _contextMenuVisibleManual = false;
|
||||||
|
|
||||||
#ifdef WITH_LIBCLOUDPROVIDERS
|
#ifdef WITH_LIBCLOUDPROVIDERS
|
||||||
QDBusConnection _bus;
|
QDBusConnection _bus;
|
||||||
@@ -150,8 +152,11 @@ private:
|
|||||||
|
|
||||||
QMenu *_recentActionsMenu;
|
QMenu *_recentActionsMenu;
|
||||||
QVector<QMenu *> _accountMenus;
|
QVector<QMenu *> _accountMenus;
|
||||||
bool _qdbusmenuWorkaround;
|
bool _workaroundShowAndHideTray = false;
|
||||||
QTimer _workaroundBatchTrayUpdate;
|
bool _workaroundNoAboutToShowUpdate = false;
|
||||||
|
bool _workaroundFakeDoubleClick = false;
|
||||||
|
bool _workaroundManualVisibility = false;
|
||||||
|
QTimer _delayedTrayUpdateTimer;
|
||||||
QMap<QString, QPointer<ShareDialog>> _shareDialogs;
|
QMap<QString, QPointer<ShareDialog>> _shareDialogs;
|
||||||
|
|
||||||
QAction *_actionNewAccountWizard;
|
QAction *_actionNewAccountWizard;
|
||||||
|
|||||||
@@ -244,6 +244,7 @@ void SettingsDialog::accountAdded(AccountState *s)
|
|||||||
_actionGroup->addAction(accountAction);
|
_actionGroup->addAction(accountAction);
|
||||||
_actionGroupWidgets.insert(accountAction, accountSettings);
|
_actionGroupWidgets.insert(accountAction, accountSettings);
|
||||||
_actionForAccount.insert(s->account().data(), accountAction);
|
_actionForAccount.insert(s->account().data(), accountAction);
|
||||||
|
accountAction->trigger();
|
||||||
|
|
||||||
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
|
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
|
||||||
connect(accountSettings, &AccountSettings::openFolderAlias,
|
connect(accountSettings, &AccountSettings::openFolderAlias,
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ void SettingsDialogMac::accountAdded(AccountState *s)
|
|||||||
_activitySettings[s]->setNotificationRefreshInterval(cfg.notificationRefreshInterval());
|
_activitySettings[s]->setNotificationRefreshInterval(cfg.notificationRefreshInterval());
|
||||||
|
|
||||||
slotRefreshActivity(s);
|
slotRefreshActivity(s);
|
||||||
|
setCurrentPanelIndex(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsDialogMac::accountRemoved(AccountState *s)
|
void SettingsDialogMac::accountRemoved(AccountState *s)
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account,
|
|||||||
connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares);
|
connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares);
|
||||||
connect(_manager, &ShareManager::serverError, this, &ShareUserGroupWidget::displayError);
|
connect(_manager, &ShareManager::serverError, this, &ShareUserGroupWidget::displayError);
|
||||||
connect(_ui->shareeLineEdit, &QLineEdit::returnPressed, this, &ShareUserGroupWidget::slotLineEditReturn);
|
connect(_ui->shareeLineEdit, &QLineEdit::returnPressed, this, &ShareUserGroupWidget::slotLineEditReturn);
|
||||||
|
connect(_ui->confirmShare, &QPushButton::clicked, this, &ShareUserGroupWidget::slotLineEditReturn);
|
||||||
//TODO connect(_ui->privateLinkText, &QLabel::linkActivated, this, &ShareUserGroupWidget::slotPrivateLinkShare);
|
//TODO connect(_ui->privateLinkText, &QLabel::linkActivated, this, &ShareUserGroupWidget::slotPrivateLinkShare);
|
||||||
|
|
||||||
// By making the next two QueuedConnections we can override
|
// By making the next two QueuedConnections we can override
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// This file is generated by kxml_compiler from occinfo.xml.
|
// This file is generated by kxml_compiler from occinfo.xml.
|
||||||
// All changes you do to this file will be lost.
|
|
||||||
|
|
||||||
#include "updateinfo.h"
|
#include "updateinfo.h"
|
||||||
#include "updater.h"
|
#include "updater.h"
|
||||||
@@ -83,24 +82,6 @@ UpdateInfo UpdateInfo::parseElement(const QDomElement &element, bool *ok)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateInfo::writeElement(QXmlStreamWriter &xml)
|
|
||||||
{
|
|
||||||
xml.writeStartElement(QLatin1String("owncloudclient"));
|
|
||||||
if (!version().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("version"), version());
|
|
||||||
}
|
|
||||||
if (!versionString().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("versionstring"), versionString());
|
|
||||||
}
|
|
||||||
if (!web().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("web"), web());
|
|
||||||
}
|
|
||||||
if (!downloadUrl().isEmpty()) {
|
|
||||||
xml.writeTextElement(QLatin1String("downloadurl"), web());
|
|
||||||
}
|
|
||||||
xml.writeEndElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateInfo UpdateInfo::parseFile(const QString &filename, bool *ok)
|
UpdateInfo UpdateInfo::parseFile(const QString &filename, bool *ok)
|
||||||
{
|
{
|
||||||
QFile file(filename);
|
QFile file(filename);
|
||||||
@@ -149,23 +130,4 @@ UpdateInfo UpdateInfo::parseString(const QString &xml, bool *ok)
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UpdateInfo::writeFile(const QString &filename)
|
|
||||||
{
|
|
||||||
QFile file(filename);
|
|
||||||
if (!file.open(QIODevice::WriteOnly)) {
|
|
||||||
qCCritical(lcUpdater) << "Unable to open file '" << filename << "'";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QXmlStreamWriter xml(&file);
|
|
||||||
xml.setAutoFormatting(true);
|
|
||||||
xml.setAutoFormattingIndent(2);
|
|
||||||
xml.writeStartDocument(QLatin1String("1.0"));
|
|
||||||
writeElement(xml);
|
|
||||||
xml.writeEndDocument();
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace OCC
|
} // namespace OCC
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// This file is generated by kxml_compiler from occinfo.xml.
|
// This file is generated by kxml_compiler from occinfo.xml.
|
||||||
// All changes you do to this file will be lost.
|
|
||||||
#ifndef UPDATEINFO_H
|
#ifndef UPDATEINFO_H
|
||||||
#define UPDATEINFO_H
|
#define UPDATEINFO_H
|
||||||
|
|
||||||
@@ -24,10 +23,8 @@ public:
|
|||||||
Parse XML object from DOM element.
|
Parse XML object from DOM element.
|
||||||
*/
|
*/
|
||||||
static UpdateInfo parseElement(const QDomElement &element, bool *ok);
|
static UpdateInfo parseElement(const QDomElement &element, bool *ok);
|
||||||
void writeElement(QXmlStreamWriter &xml);
|
|
||||||
static UpdateInfo parseFile(const QString &filename, bool *ok);
|
static UpdateInfo parseFile(const QString &filename, bool *ok);
|
||||||
static UpdateInfo parseString(const QString &xml, bool *ok);
|
static UpdateInfo parseString(const QString &xml, bool *ok);
|
||||||
bool writeFile(const QString &filename);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString mVersion;
|
QString mVersion;
|
||||||
|
|||||||
@@ -61,22 +61,11 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="hostButton">
|
<widget class="QLabel" name="installLink">
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<underline>true</underline>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Host your own server</string>
|
<string><a href="https://docs.nextcloud.com/server/13/admin_manual/installation/index.html#installation"><span style=" text-decoration: underline; color:#0000ff;">Host your own server</span></a></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="flat">
|
<property name="openExternalLinks">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
|||||||
@@ -97,16 +97,15 @@ OwncloudSetupPage::OwncloudSetupPage(QWidget *parent)
|
|||||||
_ui.slideImage->hide();
|
_ui.slideImage->hide();
|
||||||
_ui.slideLabel->hide();
|
_ui.slideLabel->hide();
|
||||||
_ui.loginButton->hide();
|
_ui.loginButton->hide();
|
||||||
_ui.hostButton->hide();
|
_ui.installLink->hide();
|
||||||
#endif
|
#endif
|
||||||
setStyleSheet(QString("background-color:%1; color:%2 QLabel { color:%2; } QSpacerItem { color: red; }").arg(theme->wizardHeaderBackgroundColor().name(), theme->wizardHeaderTitleColor().name()));
|
setStyleSheet(QString("background-color:%1; color:%2 QLabel { color:%2; } QSpacerItem { color: red; }").arg(theme->wizardHeaderBackgroundColor().name(), theme->wizardHeaderTitleColor().name()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WITH_PROVIDERS
|
#ifdef WITH_PROVIDERS
|
||||||
void OwncloudSetupPage::nextSlide()
|
void OwncloudSetupPage::nextSlide()
|
||||||
{
|
{
|
||||||
if (_currentSlide < _slideshow.length()-1) {
|
if (_currentSlide < _slideshow.length() - 1) {
|
||||||
_currentSlide++;
|
_currentSlide++;
|
||||||
} else {
|
} else {
|
||||||
_currentSlide = 0;
|
_currentSlide = 0;
|
||||||
@@ -155,6 +154,7 @@ void OwncloudSetupPage::slotLogin()
|
|||||||
animation->setStartValue(500);
|
animation->setStartValue(500);
|
||||||
animation->setEndValue(500);
|
animation->setEndValue(500);
|
||||||
_ui.login->show();
|
_ui.login->show();
|
||||||
|
_ui.loginButton->hide();
|
||||||
wizard()->resize(wizard()->sizeHint());
|
wizard()->resize(wizard()->sizeHint());
|
||||||
animation->start();
|
animation->start();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
|
<sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
|
|||||||
@@ -390,10 +390,9 @@ QByteArray decryptStringSymmetric(const QByteArray& key, const QByteArray& data)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray privateKeyToPem(const QSslKey key) {
|
QByteArray privateKeyToPem(const QByteArray key) {
|
||||||
BIO *privateKeyBio = BIO_new(BIO_s_mem());
|
BIO *privateKeyBio = BIO_new(BIO_s_mem());
|
||||||
QByteArray privateKeyPem = key.toPem();
|
BIO_write(privateKeyBio, key.constData(), key.size());
|
||||||
BIO_write(privateKeyBio, privateKeyPem.constData(), privateKeyPem.size());
|
|
||||||
EVP_PKEY *pkey = PEM_read_bio_PrivateKey(privateKeyBio, NULL, NULL, NULL);
|
EVP_PKEY *pkey = PEM_read_bio_PrivateKey(privateKeyBio, NULL, NULL, NULL);
|
||||||
|
|
||||||
BIO *pemBio = BIO_new(BIO_s_mem());
|
BIO *pemBio = BIO_new(BIO_s_mem());
|
||||||
@@ -694,7 +693,8 @@ void ClientSideEncryption::privateKeyFetched(Job *incoming) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_privateKey = QSslKey(readJob->binaryData(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
|
//_privateKey = QSslKey(readJob->binaryData(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
|
||||||
|
_privateKey = readJob->binaryData();
|
||||||
|
|
||||||
if (_privateKey.isNull()) {
|
if (_privateKey.isNull()) {
|
||||||
getPrivateKeyFromServer();
|
getPrivateKeyFromServer();
|
||||||
@@ -723,7 +723,7 @@ void ClientSideEncryption::mnemonicKeyFetched(QKeychain::Job *incoming) {
|
|||||||
if (readJob->error() != NoError || readJob->textData().length() == 0) {
|
if (readJob->error() != NoError || readJob->textData().length() == 0) {
|
||||||
_certificate = QSslCertificate();
|
_certificate = QSslCertificate();
|
||||||
_publicKey = QSslKey();
|
_publicKey = QSslKey();
|
||||||
_privateKey = QSslKey();
|
_privateKey = QByteArray();
|
||||||
getPublicKeyFromServer();
|
getPublicKeyFromServer();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -745,7 +745,7 @@ void ClientSideEncryption::writePrivateKey() {
|
|||||||
WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
|
WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
|
||||||
job->setInsecureFallback(false);
|
job->setInsecureFallback(false);
|
||||||
job->setKey(kck);
|
job->setKey(kck);
|
||||||
job->setBinaryData(_privateKey.toPem());
|
job->setBinaryData(_privateKey);
|
||||||
connect(job, &WritePasswordJob::finished, [this](Job *incoming) {
|
connect(job, &WritePasswordJob::finished, [this](Job *incoming) {
|
||||||
Q_UNUSED(incoming);
|
Q_UNUSED(incoming);
|
||||||
qCInfo(lcCse()) << "Private key stored in keychain";
|
qCInfo(lcCse()) << "Private key stored in keychain";
|
||||||
@@ -791,7 +791,7 @@ void ClientSideEncryption::writeMnemonic() {
|
|||||||
|
|
||||||
void ClientSideEncryption::forgetSensitiveData()
|
void ClientSideEncryption::forgetSensitiveData()
|
||||||
{
|
{
|
||||||
_privateKey = QSslKey();
|
_privateKey = QByteArray();
|
||||||
_certificate = QSslCertificate();
|
_certificate = QSslCertificate();
|
||||||
_publicKey = QSslKey();
|
_publicKey = QSslKey();
|
||||||
_mnemonic = QString();
|
_mnemonic = QString();
|
||||||
@@ -859,7 +859,8 @@ void ClientSideEncryption::generateKeyPair()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QByteArray key = BIO2ByteArray(privKey);
|
QByteArray key = BIO2ByteArray(privKey);
|
||||||
_privateKey = QSslKey(key, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
|
//_privateKey = QSslKey(key, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
|
||||||
|
_privateKey = key;
|
||||||
|
|
||||||
qCInfo(lcCse()) << "Keys generated correctly, sending to server.";
|
qCInfo(lcCse()) << "Keys generated correctly, sending to server.";
|
||||||
generateCSR(localKeyPair);
|
generateCSR(localKeyPair);
|
||||||
@@ -1025,9 +1026,10 @@ void ClientSideEncryption::decryptPrivateKey(const QByteArray &key) {
|
|||||||
qCInfo(lcCse()) << "Generated key:" << pass;
|
qCInfo(lcCse()) << "Generated key:" << pass;
|
||||||
|
|
||||||
QByteArray privateKey = EncryptionHelper::decryptPrivateKey(pass, key2);
|
QByteArray privateKey = EncryptionHelper::decryptPrivateKey(pass, key2);
|
||||||
_privateKey = QSslKey(privateKey, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
|
//_privateKey = QSslKey(privateKey, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);
|
||||||
|
_privateKey = privateKey;
|
||||||
|
|
||||||
qCInfo(lcCse()) << "Private key: " << _privateKey.toPem();
|
qCInfo(lcCse()) << "Private key: " << _privateKey;
|
||||||
|
|
||||||
if (!_privateKey.isNull()) {
|
if (!_privateKey.isNull()) {
|
||||||
writePrivateKey();
|
writePrivateKey();
|
||||||
@@ -1037,7 +1039,7 @@ void ClientSideEncryption::decryptPrivateKey(const QByteArray &key) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_mnemonic = QString();
|
_mnemonic = QString();
|
||||||
_privateKey = QSslKey();
|
_privateKey = QByteArray();
|
||||||
qCInfo(lcCse()) << "Cancelled";
|
qCInfo(lcCse()) << "Cancelled";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1226,7 +1228,7 @@ QByteArray FolderMetadata::encryptMetadataKey(const QByteArray& data) const {
|
|||||||
QByteArray FolderMetadata::decryptMetadataKey(const QByteArray& encryptedMetadata) const
|
QByteArray FolderMetadata::decryptMetadataKey(const QByteArray& encryptedMetadata) const
|
||||||
{
|
{
|
||||||
BIO *privateKeyBio = BIO_new(BIO_s_mem());
|
BIO *privateKeyBio = BIO_new(BIO_s_mem());
|
||||||
QByteArray privateKeyPem = _account->e2e()->_privateKey.toPem();
|
QByteArray privateKeyPem = _account->e2e()->_privateKey;
|
||||||
BIO_write(privateKeyBio, privateKeyPem.constData(), privateKeyPem.size());
|
BIO_write(privateKeyBio, privateKeyPem.constData(), privateKeyPem.size());
|
||||||
EVP_PKEY *key = PEM_read_bio_PrivateKey(privateKeyBio, NULL, NULL, NULL);
|
EVP_PKEY *key = PEM_read_bio_PrivateKey(privateKeyBio, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace EncryptionHelper {
|
|||||||
const QByteArray& data
|
const QByteArray& data
|
||||||
);
|
);
|
||||||
|
|
||||||
QByteArray privateKeyToPem(const QSslKey key);
|
QByteArray privateKeyToPem(const QByteArray key);
|
||||||
|
|
||||||
//TODO: change those two EVP_PKEY into QSslKey.
|
//TODO: change those two EVP_PKEY into QSslKey.
|
||||||
QByteArray encryptStringAsymmetric(
|
QByteArray encryptStringAsymmetric(
|
||||||
@@ -122,7 +122,8 @@ private:
|
|||||||
QMap<QString, bool> _folder2encryptedStatus;
|
QMap<QString, bool> _folder2encryptedStatus;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QSslKey _privateKey;
|
//QSslKey _privateKey;
|
||||||
|
QByteArray _privateKey;
|
||||||
QSslKey _publicKey;
|
QSslKey _publicKey;
|
||||||
QSslCertificate _certificate;
|
QSslCertificate _certificate;
|
||||||
QString _mnemonic;
|
QString _mnemonic;
|
||||||
|
|||||||
@@ -361,6 +361,10 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, con
|
|||||||
}
|
}
|
||||||
if (map.contains("data-fingerprint")) {
|
if (map.contains("data-fingerprint")) {
|
||||||
_dataFingerprint = map.value("data-fingerprint").toUtf8();
|
_dataFingerprint = map.value("data-fingerprint").toUtf8();
|
||||||
|
if (_dataFingerprint.isEmpty()) {
|
||||||
|
// Placeholder that means that the server supports the feature even if it did not set one.
|
||||||
|
_dataFingerprint = "[empty]";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Remove <webDAV-Url>/folder/ from <webDAV-Url>/folder/subfile.txt
|
// Remove <webDAV-Url>/folder/ from <webDAV-Url>/folder/subfile.txt
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ void GETFileJob::newReplyHook(QNetworkReply *reply)
|
|||||||
|
|
||||||
connect(reply, &QNetworkReply::metaDataChanged, this, &GETFileJob::slotMetaDataChanged);
|
connect(reply, &QNetworkReply::metaDataChanged, this, &GETFileJob::slotMetaDataChanged);
|
||||||
connect(reply, &QIODevice::readyRead, this, &GETFileJob::slotReadyRead);
|
connect(reply, &QIODevice::readyRead, this, &GETFileJob::slotReadyRead);
|
||||||
|
connect(reply, &QNetworkReply::finished, this, &GETFileJob::slotReadyRead);
|
||||||
connect(reply, &QNetworkReply::downloadProgress, this, &GETFileJob::downloadProgress);
|
connect(reply, &QNetworkReply::downloadProgress, this, &GETFileJob::downloadProgress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -837,6 +837,11 @@ void SyncEngine::startSync()
|
|||||||
// database creation error!
|
// database creation error!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Functionality like selective sync might have set up etag storage
|
||||||
|
// filtering via avoidReadFromDbOnNextSync(). This *is* the next sync, so
|
||||||
|
// undo the filter to allow this sync to retrieve and store the correct etags.
|
||||||
|
_journal->clearEtagStorageFilter();
|
||||||
|
|
||||||
_csync_ctx->upload_conflict_files = _account->capabilities().uploadConflictFiles();
|
_csync_ctx->upload_conflict_files = _account->capabilities().uploadConflictFiles();
|
||||||
_excludedFiles->setExcludeConflictFiles(!_account->capabilities().uploadConflictFiles());
|
_excludedFiles->setExcludeConflictFiles(!_account->capabilities().uploadConflictFiles());
|
||||||
|
|
||||||
@@ -1042,10 +1047,9 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto databaseFingerprint = _journal->dataFingerprint();
|
auto databaseFingerprint = _journal->dataFingerprint();
|
||||||
// If databaseFingerprint is null, this means that there was no information in the database
|
// If databaseFingerprint is empty, this means that there was no information in the database
|
||||||
// (for example, upgrading from a previous version, or first sync)
|
// (for example, upgrading from a previous version, or first sync, or server not supporting fingerprint)
|
||||||
// Note that an empty ("") fingerprint is valid and means it was empty on the server before.
|
if (!databaseFingerprint.isEmpty()
|
||||||
if (!databaseFingerprint.isNull()
|
|
||||||
&& _discoveryMainThread->_dataFingerprint != databaseFingerprint) {
|
&& _discoveryMainThread->_dataFingerprint != databaseFingerprint) {
|
||||||
qCInfo(lcEngine) << "data fingerprint changed, assume restore from backup" << databaseFingerprint << _discoveryMainThread->_dataFingerprint;
|
qCInfo(lcEngine) << "data fingerprint changed, assume restore from backup" << databaseFingerprint << _discoveryMainThread->_dataFingerprint;
|
||||||
restoreOldFiles(syncItems);
|
restoreOldFiles(syncItems);
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ QIcon Theme::themeIcon(const QString &name, bool sysTray, bool sysTrayMenuVisibl
|
|||||||
}
|
}
|
||||||
|
|
||||||
QList<int> sizes;
|
QList<int> sizes;
|
||||||
sizes << 16 << 22 << 32 << 48 << 64 << 128 << 256;
|
sizes << 16 << 22 << 32 << 48 << 64 << 128 << 256 << 512 << 1024;
|
||||||
foreach (int size, sizes) {
|
foreach (int size, sizes) {
|
||||||
QString pixmapName = QString::fromLatin1(":/client/theme/%1/%2-%3.png").arg(flavor).arg(name).arg(size);
|
QString pixmapName = QString::fromLatin1(":/client/theme/%1/%2-%3.png").arg(flavor).arg(name).arg(size);
|
||||||
if (QFile::exists(pixmapName)) {
|
if (QFile::exists(pixmapName)) {
|
||||||
|
|||||||
@@ -728,9 +728,18 @@ public:
|
|||||||
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, _httpErrorCode);
|
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, _httpErrorCode);
|
||||||
setError(InternalServerError, "Internal Server Fake Error");
|
setError(InternalServerError, "Internal Server Fake Error");
|
||||||
emit metaDataChanged();
|
emit metaDataChanged();
|
||||||
|
emit readyRead();
|
||||||
|
// finishing can come strictly after readyRead was called
|
||||||
|
QTimer::singleShot(5, this, &FakeErrorReply::slotSetFinished);
|
||||||
|
}
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void slotSetFinished() {
|
||||||
|
setFinished(true);
|
||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
void abort() override { }
|
void abort() override { }
|
||||||
qint64 readData(char *, qint64) override { return 0; }
|
qint64 readData(char *, qint64) override { return 0; }
|
||||||
|
|
||||||
@@ -1001,6 +1010,23 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Return the FileInfo for a conflict file for the specified relative filename */
|
||||||
|
inline const FileInfo *findConflict(FileInfo &dir, const QString &filename)
|
||||||
|
{
|
||||||
|
QFileInfo info(filename);
|
||||||
|
const FileInfo *parentDir = dir.find(info.path());
|
||||||
|
if (!parentDir)
|
||||||
|
return nullptr;
|
||||||
|
QString start = info.baseName() + " (conflicted copy";
|
||||||
|
for (const auto &item : parentDir->children) {
|
||||||
|
if (item.name.startsWith(start)) {
|
||||||
|
return &item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// QTest::toString overloads
|
// QTest::toString overloads
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
inline char *toString(const SyncFileStatus &s) {
|
inline char *toString(const SyncFileStatus &s) {
|
||||||
|
|||||||
@@ -151,6 +151,76 @@ private slots:
|
|||||||
QCOMPARE(fakeFolder.currentLocalState(), expectedState);
|
QCOMPARE(fakeFolder.currentLocalState(), expectedState);
|
||||||
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
|
QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testDataFingetPrint_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<bool>("hasInitialFingerPrint");
|
||||||
|
QTest::newRow("initial finger print") << true;
|
||||||
|
QTest::newRow("no initial finger print") << false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void testDataFingetPrint()
|
||||||
|
{
|
||||||
|
QFETCH(bool, hasInitialFingerPrint);
|
||||||
|
FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
|
||||||
|
fakeFolder.remoteModifier().setContents("C/c1", 'N');
|
||||||
|
fakeFolder.remoteModifier().setModTime("C/c1", QDateTime::currentDateTimeUtc().addDays(-2));
|
||||||
|
fakeFolder.remoteModifier().remove("C/c2");
|
||||||
|
if (hasInitialFingerPrint) {
|
||||||
|
fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint>initial_finger_print</oc:data-fingerprint>";
|
||||||
|
} else {
|
||||||
|
//Server support finger print, but none is set.
|
||||||
|
fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint></oc:data-fingerprint>";
|
||||||
|
}
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
// First sync, we did not change the finger print, so the file should be downloaded as normal
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
QCOMPARE(fakeFolder.currentRemoteState().find("C/c1")->contentChar, 'N');
|
||||||
|
QVERIFY(!fakeFolder.currentRemoteState().find("C/c2"));
|
||||||
|
|
||||||
|
/* Simulate a backup restoration */
|
||||||
|
|
||||||
|
// A/a1 is an old file
|
||||||
|
fakeFolder.remoteModifier().setContents("A/a1", 'O');
|
||||||
|
fakeFolder.remoteModifier().setModTime("A/a1", QDateTime::currentDateTimeUtc().addDays(-2));
|
||||||
|
// B/b1 did not exist at the time of the backup
|
||||||
|
fakeFolder.remoteModifier().remove("B/b1");
|
||||||
|
// B/b2 was uploaded by another user in the mean time.
|
||||||
|
fakeFolder.remoteModifier().setContents("B/b2", 'N');
|
||||||
|
fakeFolder.remoteModifier().setModTime("B/b2", QDateTime::currentDateTimeUtc().addDays(2));
|
||||||
|
|
||||||
|
// C/c3 was removed since we made the backup
|
||||||
|
fakeFolder.remoteModifier().insert("C/c3_removed");
|
||||||
|
// C/c4 was moved to A/a2 since we made the backup
|
||||||
|
fakeFolder.remoteModifier().rename("A/a2", "C/old_a2_location");
|
||||||
|
|
||||||
|
// The admin sets the data-fingerprint property
|
||||||
|
fakeFolder.remoteModifier().extraDavProperties = "<oc:data-fingerprint>new_finger_print</oc:data-fingerprint>";
|
||||||
|
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
auto currentState = fakeFolder.currentLocalState();
|
||||||
|
// Altough the local file is kept as a conflict, the server file is downloaded
|
||||||
|
QCOMPARE(currentState.find("A/a1")->contentChar, 'O');
|
||||||
|
auto conflict = findConflict(currentState, "A/a1");
|
||||||
|
QVERIFY(conflict);
|
||||||
|
QCOMPARE(conflict->contentChar, 'W');
|
||||||
|
fakeFolder.localModifier().remove(conflict->path());
|
||||||
|
// b1 was restored (re-uploaded)
|
||||||
|
QVERIFY(currentState.find("B/b1"));
|
||||||
|
|
||||||
|
// b2 has the new content (was not restored), since its mode time goes forward in time
|
||||||
|
QCOMPARE(currentState.find("B/b2")->contentChar, 'N');
|
||||||
|
conflict = findConflict(currentState, "B/b2");
|
||||||
|
QVERIFY(conflict); // Just to be sure, we kept the old file in a conflict
|
||||||
|
QCOMPARE(conflict->contentChar, 'W');
|
||||||
|
fakeFolder.localModifier().remove(conflict->path());
|
||||||
|
|
||||||
|
// We actually do not remove files that technically should have been removed (we don't want data-loss)
|
||||||
|
QVERIFY(currentState.find("C/c3_removed"));
|
||||||
|
QVERIFY(currentState.find("C/old_a2_location"));
|
||||||
|
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
QTEST_GUILESS_MAIN(TestAllFilesDeleted)
|
QTEST_GUILESS_MAIN(TestAllFilesDeleted)
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ public:
|
|||||||
Utility::writeRandomFile( _rootPath+"/a2/renamefile");
|
Utility::writeRandomFile( _rootPath+"/a2/renamefile");
|
||||||
Utility::writeRandomFile( _rootPath+"/a1/movefile");
|
Utility::writeRandomFile( _rootPath+"/a1/movefile");
|
||||||
|
|
||||||
_watcher.reset(new FolderWatcher(_rootPath));
|
_watcher.reset(new FolderWatcher);
|
||||||
|
_watcher->init(_rootPath);
|
||||||
_pathChangedSpy.reset(new QSignalSpy(_watcher.data(), SIGNAL(pathChanged(QString))));
|
_pathChangedSpy.reset(new QSignalSpy(_watcher.data(), SIGNAL(pathChanged(QString))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
292
test/testpermissions.cpp
Normal file
292
test/testpermissions.cpp
Normal file
@@ -0,0 +1,292 @@
|
|||||||
|
/*
|
||||||
|
* This software is in the public domain, furnished "as is", without technical
|
||||||
|
* support, and with no warranty, express or implied, as to its usefulness for
|
||||||
|
* any purpose.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QtTest>
|
||||||
|
#include "syncenginetestutils.h"
|
||||||
|
#include <syncengine.h>
|
||||||
|
#include "common/ownsql.h"
|
||||||
|
|
||||||
|
using namespace OCC;
|
||||||
|
|
||||||
|
static void applyPermissionsFromName(FileInfo &info) {
|
||||||
|
static QRegularExpression rx("_PERM_([^_]*)_[^/]*$");
|
||||||
|
auto m = rx.match(info.name);
|
||||||
|
if (m.hasMatch()) {
|
||||||
|
info.permissions = RemotePermissions(m.captured(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (FileInfo &sub : info.children)
|
||||||
|
applyPermissionsFromName(sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the expected rows in the DB are non-empty. Note that in some cases they might be, then we cannot use this function
|
||||||
|
// https://github.com/owncloud/client/issues/2038
|
||||||
|
static void assertCsyncJournalOk(SyncJournalDb &journal)
|
||||||
|
{
|
||||||
|
SqlDatabase db;
|
||||||
|
QVERIFY(db.openReadOnly(journal.databaseFilePath()));
|
||||||
|
SqlQuery q("SELECT count(*) from metadata where length(fileId) == 0", db);
|
||||||
|
QVERIFY(q.exec());
|
||||||
|
QVERIFY(q.next());
|
||||||
|
QCOMPARE(q.intValue(0), 0);
|
||||||
|
#if defined(Q_OS_WIN) // Make sure the file does not appear in the FileInfo
|
||||||
|
FileSystem::setFileHidden(journal.databaseFilePath() + "-shm", true);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TestPermissions : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void t7pl()
|
||||||
|
{
|
||||||
|
FakeFolder fakeFolder{ FileInfo() };
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
|
const int cannotBeModifiedSize = 133;
|
||||||
|
const int canBeModifiedSize = 144;
|
||||||
|
|
||||||
|
//create some files
|
||||||
|
auto insertIn = [&](const QString &dir) {
|
||||||
|
fakeFolder.remoteModifier().insert(dir + "normalFile_PERM_WVND_.data", 100 );
|
||||||
|
fakeFolder.remoteModifier().insert(dir + "cannotBeRemoved_PERM_WVN_.data", 101 );
|
||||||
|
fakeFolder.remoteModifier().insert(dir + "canBeRemoved_PERM_D_.data", 102 );
|
||||||
|
fakeFolder.remoteModifier().insert(dir + "cannotBeModified_PERM_DVN_.data", cannotBeModifiedSize , 'A');
|
||||||
|
fakeFolder.remoteModifier().insert(dir + "canBeModified_PERM_W_.data", canBeModifiedSize );
|
||||||
|
};
|
||||||
|
|
||||||
|
//put them in some directories
|
||||||
|
fakeFolder.remoteModifier().mkdir("normalDirectory_PERM_CKDNV_");
|
||||||
|
insertIn("normalDirectory_PERM_CKDNV_/");
|
||||||
|
fakeFolder.remoteModifier().mkdir("readonlyDirectory_PERM_M_" );
|
||||||
|
insertIn("readonlyDirectory_PERM_M_/" );
|
||||||
|
fakeFolder.remoteModifier().mkdir("readonlyDirectory_PERM_M_/subdir_PERM_CK_");
|
||||||
|
fakeFolder.remoteModifier().mkdir("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_");
|
||||||
|
fakeFolder.remoteModifier().insert("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data", 100);
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
qInfo("Do some changes and see how they propagate");
|
||||||
|
|
||||||
|
//1. remove the file than cannot be removed
|
||||||
|
// (they should be recovered)
|
||||||
|
fakeFolder.localModifier().remove("normalDirectory_PERM_CKDNV_/cannotBeRemoved_PERM_WVN_.data");
|
||||||
|
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data");
|
||||||
|
|
||||||
|
//2. remove the file that can be removed
|
||||||
|
// (they should properly be gone)
|
||||||
|
auto removeReadOnly = [&] (const QString &file) {
|
||||||
|
QVERIFY(!QFileInfo(fakeFolder.localPath() + file).permission(QFile::WriteOwner));
|
||||||
|
QFile(fakeFolder.localPath() + file).setPermissions(QFile::WriteOwner | QFile::ReadOwner);
|
||||||
|
fakeFolder.localModifier().remove(file);
|
||||||
|
};
|
||||||
|
removeReadOnly("normalDirectory_PERM_CKDNV_/canBeRemoved_PERM_D_.data");
|
||||||
|
removeReadOnly("readonlyDirectory_PERM_M_/canBeRemoved_PERM_D_.data");
|
||||||
|
|
||||||
|
//3. Edit the files that cannot be modified
|
||||||
|
// (they should be recovered, and a conflict shall be created)
|
||||||
|
auto editReadOnly = [&] (const QString &file) {
|
||||||
|
QVERIFY(!QFileInfo(fakeFolder.localPath() + file).permission(QFile::WriteOwner));
|
||||||
|
QFile(fakeFolder.localPath() + file).setPermissions(QFile::WriteOwner | QFile::ReadOwner);
|
||||||
|
fakeFolder.localModifier().appendByte(file);
|
||||||
|
};
|
||||||
|
editReadOnly("normalDirectory_PERM_CKDNV_/cannotBeModified_PERM_DVN_.data");
|
||||||
|
editReadOnly("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
|
||||||
|
|
||||||
|
//4. Edit other files
|
||||||
|
// (they should be uploaded)
|
||||||
|
fakeFolder.localModifier().appendByte("normalDirectory_PERM_CKDNV_/canBeModified_PERM_W_.data");
|
||||||
|
fakeFolder.localModifier().appendByte("readonlyDirectory_PERM_M_/canBeModified_PERM_W_.data");
|
||||||
|
|
||||||
|
//5. Create a new file in a read write folder
|
||||||
|
// (should be uploaded)
|
||||||
|
fakeFolder.localModifier().insert("normalDirectory_PERM_CKDNV_/newFile_PERM_WDNV_.data", 106 );
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
|
||||||
|
//do the sync
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
auto currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
|
||||||
|
//1.
|
||||||
|
// File should be recovered
|
||||||
|
QVERIFY(currentLocalState.find("normalDirectory_PERM_CKDNV_/cannotBeRemoved_PERM_WVN_.data"));
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data"));
|
||||||
|
|
||||||
|
//2.
|
||||||
|
// File should be deleted
|
||||||
|
QVERIFY(!currentLocalState.find("normalDirectory_PERM_CKDNV_/canBeRemoved_PERM_D_.data"));
|
||||||
|
QVERIFY(!currentLocalState.find("readonlyDirectory_PERM_M_/canBeRemoved_PERM_D_.data"));
|
||||||
|
|
||||||
|
//3.
|
||||||
|
// File should be recovered
|
||||||
|
QCOMPARE(currentLocalState.find("normalDirectory_PERM_CKDNV_/cannotBeModified_PERM_DVN_.data")->size, cannotBeModifiedSize);
|
||||||
|
QCOMPARE(currentLocalState.find("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data")->size, cannotBeModifiedSize);
|
||||||
|
// and conflict created
|
||||||
|
auto c1 = findConflict(currentLocalState, "normalDirectory_PERM_CKDNV_/cannotBeModified_PERM_DVN_.data");
|
||||||
|
QVERIFY(c1);
|
||||||
|
QCOMPARE(c1->size, cannotBeModifiedSize + 1);
|
||||||
|
auto c2 = findConflict(currentLocalState, "readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
|
||||||
|
QVERIFY(c2);
|
||||||
|
QCOMPARE(c2->size, cannotBeModifiedSize + 1);
|
||||||
|
// remove the conflicts for the next state comparison
|
||||||
|
fakeFolder.localModifier().remove(c1->path());
|
||||||
|
fakeFolder.localModifier().remove(c2->path());
|
||||||
|
|
||||||
|
//4. File should be updated, that's tested by assertLocalAndRemoteDir
|
||||||
|
QCOMPARE(currentLocalState.find("normalDirectory_PERM_CKDNV_/canBeModified_PERM_W_.data")->size, canBeModifiedSize + 1);
|
||||||
|
QCOMPARE(currentLocalState.find("readonlyDirectory_PERM_M_/canBeModified_PERM_W_.data")->size, canBeModifiedSize + 1);
|
||||||
|
|
||||||
|
//5.
|
||||||
|
// the file should be in the server and local
|
||||||
|
QVERIFY(currentLocalState.find("normalDirectory_PERM_CKDNV_/newFile_PERM_WDNV_.data"));
|
||||||
|
|
||||||
|
// Both side should still be the same
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
|
// Next test
|
||||||
|
|
||||||
|
//6. Create a new file in a read only folder
|
||||||
|
// (they should not be uploaded)
|
||||||
|
fakeFolder.localModifier().insert("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data", 105 );
|
||||||
|
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
// error: can't upload to readonly
|
||||||
|
QVERIFY(!fakeFolder.syncOnce());
|
||||||
|
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
|
||||||
|
//6.
|
||||||
|
// The file should not exist on the remote, but still be there
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data"));
|
||||||
|
QVERIFY(!fakeFolder.currentRemoteState().find("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data"));
|
||||||
|
// remove it so next test succeed.
|
||||||
|
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/newFile_PERM_WDNV_.data");
|
||||||
|
// Both side should still be the same
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
|
qInfo( "remove the read only directory" );
|
||||||
|
// -> It must be recovered
|
||||||
|
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_");
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/cannotBeRemoved_PERM_WVN_.data"));
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data"));
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
|
qInfo( "move a directory in a outside read only folder" );
|
||||||
|
|
||||||
|
//Missing directory should be restored
|
||||||
|
//new directory should be uploaded
|
||||||
|
fakeFolder.localModifier().rename("readonlyDirectory_PERM_M_/subdir_PERM_CK_", "normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_");
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
fakeFolder.syncOnce();
|
||||||
|
if (fakeFolder.syncEngine().isAnotherSyncNeeded() == ImmediateFollowUp) {
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
}
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
|
||||||
|
// old name restored
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_"));
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data"));
|
||||||
|
|
||||||
|
// new still exist (and is uploaded)
|
||||||
|
QVERIFY(currentLocalState.find("normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data"));
|
||||||
|
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
|
qInfo( "rename a directory in a read only folder and move a directory to a read-only" );
|
||||||
|
|
||||||
|
// do a sync to update the database
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
|
||||||
|
//1. rename a directory in a read only folder
|
||||||
|
//Missing directory should be restored
|
||||||
|
//new directory should stay but not be uploaded
|
||||||
|
fakeFolder.localModifier().rename("readonlyDirectory_PERM_M_/subdir_PERM_CK_", "readonlyDirectory_PERM_M_/newname_PERM_CK_" );
|
||||||
|
|
||||||
|
//2. move a directory from read to read only (move the directory from previous step)
|
||||||
|
fakeFolder.localModifier().rename("normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_", "readonlyDirectory_PERM_M_/moved_PERM_CK_" );
|
||||||
|
|
||||||
|
// error: can't upload to readonly!
|
||||||
|
QVERIFY(!fakeFolder.syncOnce());
|
||||||
|
if (fakeFolder.syncEngine().isAnotherSyncNeeded() == ImmediateFollowUp) {
|
||||||
|
QVERIFY(!fakeFolder.syncOnce());
|
||||||
|
}
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
|
||||||
|
//1.
|
||||||
|
// old name restored
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/subdir_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
||||||
|
// new still exist
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/newname_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
||||||
|
// but is not on server: so remove it localy for the future comarison
|
||||||
|
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/newname_PERM_CK_");
|
||||||
|
|
||||||
|
//2.
|
||||||
|
// old removed
|
||||||
|
QVERIFY(!currentLocalState.find("normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_"));
|
||||||
|
// new still there
|
||||||
|
QVERIFY(currentLocalState.find("readonlyDirectory_PERM_M_/moved_PERM_CK_/subsubdir_PERM_CKDNV_/normalFile_PERM_WVND_.data" ));
|
||||||
|
//but not on server
|
||||||
|
fakeFolder.localModifier().remove("readonlyDirectory_PERM_M_/moved_PERM_CK_");
|
||||||
|
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
|
||||||
|
|
||||||
|
//######################################################################
|
||||||
|
qInfo( "multiple restores of a file create different conflict files" );
|
||||||
|
|
||||||
|
editReadOnly("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
|
||||||
|
fakeFolder.localModifier().setContents("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data", 's');
|
||||||
|
//do the sync
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
|
||||||
|
QThread::sleep(1); // make sure changes have different mtime
|
||||||
|
editReadOnly("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data");
|
||||||
|
fakeFolder.localModifier().setContents("readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data", 'd');
|
||||||
|
|
||||||
|
//do the sync
|
||||||
|
applyPermissionsFromName(fakeFolder.remoteModifier());
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
assertCsyncJournalOk(fakeFolder.syncJournal());
|
||||||
|
|
||||||
|
// there should be two conflict files
|
||||||
|
currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
int count = 0;
|
||||||
|
while (auto i = findConflict(currentLocalState, "readonlyDirectory_PERM_M_/cannotBeModified_PERM_DVN_.data")) {
|
||||||
|
QVERIFY((i->contentChar == 's') || (i->contentChar == 'd'));
|
||||||
|
fakeFolder.localModifier().remove(i->path());
|
||||||
|
currentLocalState = fakeFolder.currentLocalState();
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
QCOMPARE(count, 2);
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
QTEST_GUILESS_MAIN(TestPermissions)
|
||||||
|
#include "testpermissions.moc"
|
||||||
@@ -255,7 +255,8 @@ private slots:
|
|||||||
} else if(item->_file == "Y/Z/d3") {
|
} else if(item->_file == "Y/Z/d3") {
|
||||||
QVERIFY(item->_status != SyncFileItem::Success);
|
QVERIFY(item->_status != SyncFileItem::Success);
|
||||||
}
|
}
|
||||||
QVERIFY(item->_file != "Y/Z/d9"); // we should have aborted the sync before d9 starts
|
// We do not know about the other files - maybe the sync was aborted,
|
||||||
|
// maybe they finished before the error caused the abort.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -576,6 +576,51 @@ private slots:
|
|||||||
//QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
//QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/owncloud/client/issues/6629#issuecomment-402450691
|
||||||
|
// When a file is moved and the server mtime was not in sync, the local mtime should be kept
|
||||||
|
void testMoveAndMTimeChange()
|
||||||
|
{
|
||||||
|
FakeFolder fakeFolder{ FileInfo::A12_B12_C12_S12() };
|
||||||
|
int nPUT = 0;
|
||||||
|
int nDELETE = 0;
|
||||||
|
int nGET = 0;
|
||||||
|
int nMOVE = 0;
|
||||||
|
fakeFolder.setServerOverride([&](QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *) {
|
||||||
|
if (op == QNetworkAccessManager::PutOperation)
|
||||||
|
++nPUT;
|
||||||
|
if (op == QNetworkAccessManager::DeleteOperation)
|
||||||
|
++nDELETE;
|
||||||
|
if (op == QNetworkAccessManager::GetOperation)
|
||||||
|
++nGET;
|
||||||
|
if (req.attribute(QNetworkRequest::CustomVerbAttribute) == "MOVE")
|
||||||
|
++nMOVE;
|
||||||
|
return nullptr;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Changing the mtime on the server (without invalidating the etag)
|
||||||
|
fakeFolder.remoteModifier().find("A/a1")->lastModified = QDateTime::currentDateTimeUtc().addSecs(-50000);
|
||||||
|
fakeFolder.remoteModifier().find("A/a2")->lastModified = QDateTime::currentDateTimeUtc().addSecs(-40000);
|
||||||
|
|
||||||
|
// Move a few files
|
||||||
|
fakeFolder.remoteModifier().rename("A/a1", "A/a1_server_renamed");
|
||||||
|
fakeFolder.localModifier().rename("A/a2", "A/a2_local_renamed");
|
||||||
|
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
QCOMPARE(nGET, 0);
|
||||||
|
QCOMPARE(nPUT, 0);
|
||||||
|
QCOMPARE(nMOVE, 1);
|
||||||
|
QCOMPARE(nDELETE, 0);
|
||||||
|
|
||||||
|
// Another sync should do nothing
|
||||||
|
QVERIFY(fakeFolder.syncOnce());
|
||||||
|
QCOMPARE(nGET, 0);
|
||||||
|
QCOMPARE(nPUT, 0);
|
||||||
|
QCOMPARE(nMOVE, 1);
|
||||||
|
QCOMPARE(nDELETE, 0);
|
||||||
|
|
||||||
|
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
QTEST_GUILESS_MAIN(TestSyncMove)
|
QTEST_GUILESS_MAIN(TestSyncMove)
|
||||||
|
|||||||
4193
translations/client_bg.ts
Normal file
4193
translations/client_bg.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3639,8 +3639,8 @@ No és aconsellada usar-la.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation>Reprén totes les carpetes</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
||||||
@@ -3649,13 +3649,13 @@ No és aconsellada usar-la.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation>Reprèn totes les sincronitzacions</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation>Reprèn la sincronització</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3643,8 +3643,8 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation>Setze alle Ordner fort</translation>
|
<translation>Alle Ordner fortsetzen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
||||||
@@ -3653,13 +3653,13 @@ Es ist nicht ratsam, diese zu benutzen.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation>Setze gesamte Synchronisation fort</translation>
|
<translation>Alle Synchronisierungen fortsetzen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation>Setze Synchronisation fort</translation>
|
<translation>Synchronisation fortsetzen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
||||||
|
|||||||
@@ -388,7 +388,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountstate.cpp" line="138"/>
|
<location filename="../src/gui/accountstate.cpp" line="138"/>
|
||||||
<source>Asking Credentials</source>
|
<source>Asking Credentials</source>
|
||||||
<translation type="unfinished"/>
|
<translation>Ερώτηση πιστοποιητικών</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountstate.cpp" line="140"/>
|
<location filename="../src/gui/accountstate.cpp" line="140"/>
|
||||||
@@ -768,10 +768,7 @@
|
|||||||
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
||||||
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
||||||
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
||||||
<translation>Όλα τα αρχεία στο φάκελο συγχρονισμού '%1' έχουν διαγραφεί στον διακομιστή.
|
<translation type="unfinished"/>
|
||||||
Αυτές οι διαγραφές θα συγχρονιστούν στον τοπικό σας φάκελο συγχρονισμού, κάνοντας τέτοιου είδους αρχεία μη διαθέσιμα, εκτός εάν έχετε δικαίωμα επαναφοράς.
|
|
||||||
Εάν αποφασίσετε να διατηρήσετε αυτά τα αρχεία, θα συγχρονιστούν εκ νέου με το διακομιστή, εφόσον έχετε δικαιώματα να το κάνετε.
|
|
||||||
Εφόσον επιλέξετε να διαγράψετε τα αρχεία, δε θα είναι διαθέσιμα σε εσάς, εκτός εάν είστε ο ιδιοκτήτης τους. </translation>
|
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="932"/>
|
<location filename="../src/gui/folder.cpp" line="932"/>
|
||||||
@@ -3644,8 +3641,8 @@ It is not advisable to use it.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation>Αναίρεση παύσης όλων των φακέλων</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
||||||
@@ -3654,13 +3651,13 @@ It is not advisable to use it.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation>Αναίρεση παύσης όλων των συγχρονισμών</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation>Αναίρεση παύσης συγχρονσμού</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
||||||
|
|||||||
@@ -3661,7 +3661,7 @@ It is not advisable to use it.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
@@ -3671,12 +3671,12 @@ It is not advisable to use it.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
|||||||
@@ -768,10 +768,7 @@
|
|||||||
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
||||||
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
||||||
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
||||||
<translation>All files in the sync folder '%1' folder were deleted on the server.
|
<translation type="unfinished"/>
|
||||||
These deletes will be synchronised to your local sync folder, making such files unavailable unless you have a right to restore.
|
|
||||||
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
|
||||||
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="932"/>
|
<location filename="../src/gui/folder.cpp" line="932"/>
|
||||||
@@ -3644,8 +3641,8 @@ It is not advisable to use it.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation>Unpause all folders</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
||||||
@@ -3654,13 +3651,13 @@ It is not advisable to use it.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation>Unpause all synchronisation</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation>Unpause synchronisation</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="163"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="163"/>
|
||||||
<source>Refresh</source>
|
<source>Refresh</source>
|
||||||
<translation>Refrescar</translation>
|
<translation>Actualizar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizardtargetpage.ui" line="177"/>
|
<location filename="../src/gui/folderwizardtargetpage.ui" line="177"/>
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/notificationwidget.ui" line="89"/>
|
<location filename="../src/gui/notificationwidget.ui" line="89"/>
|
||||||
<source>TextLabel</source>
|
<source>TextLabel</source>
|
||||||
<translation>Etiqueta de texto</translation>
|
<translation>EtiquetaDeTexto</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="152"/>
|
<location filename="../src/gui/accountsettings.ui" line="152"/>
|
||||||
<source>Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore</source>
|
<source>Unchecked folders will be <b>removed</b> from your local file system and will not be synchronized to this computer anymore</source>
|
||||||
<translation>Las carpetas no seleccionadas serán <b>eliminadas</b> de su sistema de archivos local y ya no serán sincronizadas con este ordenador</translation>
|
<translation>Las carpetas no seleccionadas serán <b>eliminadas</b> de su carpeta local y ya no serán sincronizadas en este ordenador</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.ui" line="198"/>
|
<location filename="../src/gui/accountsettings.ui" line="198"/>
|
||||||
@@ -228,7 +228,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="650"/>
|
<location filename="../src/gui/accountsettings.cpp" line="650"/>
|
||||||
<source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
|
<source>The server version %1 is old and unsupported! Proceed at your own risk.</source>
|
||||||
<translation>La versión del servidor %1 es antigua, ¡y no está soportada! Si continúas, lo haces bajo tu propio riesgo.</translation>
|
<translation>¡La versión del servidor %1 es antigua y no está soportada! Si continúas, lo haces bajo tu propio riesgo.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/accountsettings.cpp" line="652"/>
|
<location filename="../src/gui/accountsettings.cpp" line="652"/>
|
||||||
@@ -446,7 +446,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/activitywidget.cpp" line="613"/>
|
<location filename="../src/gui/activitywidget.cpp" line="613"/>
|
||||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||||
<translation>La lista de elementos sin sincronizar, ha sido copiada al portapapeles.</translation>
|
<translation>La lista de elementos sin sincronizar se ha copiado al portapapeles.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/activitywidget.cpp" line="618"/>
|
<location filename="../src/gui/activitywidget.cpp" line="618"/>
|
||||||
@@ -466,7 +466,7 @@
|
|||||||
<location filename="../src/gui/activitywidget.ui" line="68"/>
|
<location filename="../src/gui/activitywidget.ui" line="68"/>
|
||||||
<location filename="../src/gui/activitywidget.ui" line="94"/>
|
<location filename="../src/gui/activitywidget.ui" line="94"/>
|
||||||
<source>TextLabel</source>
|
<source>TextLabel</source>
|
||||||
<translation>Etiqueta de texto</translation>
|
<translation>EtiquetaDeTexto</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/activitywidget.cpp" line="131"/>
|
<location filename="../src/gui/activitywidget.cpp" line="131"/>
|
||||||
@@ -496,12 +496,12 @@
|
|||||||
<message numerus="yes">
|
<message numerus="yes">
|
||||||
<location filename="../src/gui/activitywidget.cpp" line="349"/>
|
<location filename="../src/gui/activitywidget.cpp" line="349"/>
|
||||||
<source>You received %n new notification(s) from %2.</source>
|
<source>You received %n new notification(s) from %2.</source>
|
||||||
<translation><numerusform>Ha recibido %n nueva notificación de %2.</numerusform><numerusform>Ha recibido %n nueva notificacióne(s) de %2.</numerusform></translation>
|
<translation><numerusform>Ha recibido %n nueva notificación de %2.</numerusform><numerusform>Ha recibido %n nueva notificación(es) de %2.</numerusform></translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<message numerus="yes">
|
||||||
<location filename="../src/gui/activitywidget.cpp" line="356"/>
|
<location filename="../src/gui/activitywidget.cpp" line="356"/>
|
||||||
<source>You received %n new notification(s) from %1 and %2.</source>
|
<source>You received %n new notification(s) from %1 and %2.</source>
|
||||||
<translation><numerusform>Ha recibido %n nueva notificación de %1 y de %2.</numerusform><numerusform>Ha recibido %n nuevas notificacióne(s) de %1 y de %2.</numerusform></translation>
|
<translation><numerusform>Ha recibido %n nueva notificación de %1 y de %2.</numerusform><numerusform>Ha recibido %n nuevas notificación(es) de %1 y de %2.</numerusform></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/activitywidget.cpp" line="358"/>
|
<location filename="../src/gui/activitywidget.cpp" line="358"/>
|
||||||
@@ -611,12 +611,12 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="310"/>
|
||||||
<source>The configured server for this client is too old</source>
|
<source>The configured server for this client is too old</source>
|
||||||
<translation>La configuración del servidor para este cliente está obsoleta</translation>
|
<translation>La configuración del servidor para este cliente es demasiado antigua</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="311"/>
|
||||||
<source>Please update to the latest server and restart the client.</source>
|
<source>Please update to the latest server and restart the client.</source>
|
||||||
<translation>Por favor, actualice a la última versión del servidor y reinicie el cliente</translation>
|
<translation>Por favor, actualice a la última versión del servidor y reinicie el cliente.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
|
<location filename="../src/libsync/connectionvalidator.cpp" line="172"/>
|
||||||
@@ -652,7 +652,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="139"/>
|
<location filename="../src/gui/folder.cpp" line="139"/>
|
||||||
<source>%1 should be a folder but is not.</source>
|
<source>%1 should be a folder but is not.</source>
|
||||||
<translation>%1 debería ser un directorio, pero no lo es.</translation>
|
<translation>%1 debería ser una carpeta, pero no lo es.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="142"/>
|
<location filename="../src/gui/folder.cpp" line="142"/>
|
||||||
@@ -721,7 +721,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="401"/>
|
<location filename="../src/gui/folder.cpp" line="401"/>
|
||||||
<source>%1 has a sync conflict. Please check the conflict file!</source>
|
<source>%1 has a sync conflict. Please check the conflict file!</source>
|
||||||
<translation>Conflicto al sincronizar %1. Por favor compruebe el archivo!</translation>
|
<translation>Conflicto al sincronizar %1. ¡Por favor compruebe el archivo!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message numerus="yes">
|
<message numerus="yes">
|
||||||
<location filename="../src/gui/folder.cpp" line="406"/>
|
<location filename="../src/gui/folder.cpp" line="406"/>
|
||||||
@@ -768,10 +768,10 @@
|
|||||||
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
||||||
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
||||||
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
||||||
<translation>Todos los archivos en la carpeta %1 serán borrados en el servidor.
|
<translation>Todos los archivos de la carpeta sincronizada '% 1' fueron eliminados del servidor.
|
||||||
Esto será sincronizado en su carpeta local, haciendo imposible su recuperación a menos que disponga de archivos de respaldo.
|
Estos archivos eliminados se sincronizarán con su carpeta local, por lo que no estarán disponibles a menos que tenga derecho a restaurarlos.
|
||||||
Si decide mantener estos archivos, serán re-sincronizados con el servidor si dispone de permisos para ello.
|
Si decides conservar los archivos, se volverán a sincronizar con el servidor si tienes los derechos para hacerlo.
|
||||||
Si decide borrarlos, no serán visibles para usted a menos que sea el propietario.</translation>
|
Si decides eliminar los archivos, no estarán disponibles para ti, a menos que seas el propietario.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="932"/>
|
<location filename="../src/gui/folder.cpp" line="932"/>
|
||||||
@@ -802,7 +802,7 @@ Si ha sido un accidente, y decide mantener los archivos, serán re-sincronizados
|
|||||||
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
|
<source>This sync would reset the files to an earlier time in the sync folder '%1'.
|
||||||
This might be because a backup was restored on the server.
|
This might be because a backup was restored on the server.
|
||||||
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
|
Continuing the sync as normal will cause all your files to be overwritten by an older file in an earlier state. Do you want to keep your local most recent files as conflict files?</source>
|
||||||
<translation>Esta sincronización reseteará los archivos en la carpeta '%1' a una versión previa.
|
<translation>Esta sincronización restablecerá los archivos en la carpeta '%1' a una versión previa.
|
||||||
Esto puede deberse a que una copia de seguridad fue restaurada en el servidor.
|
Esto puede deberse a que una copia de seguridad fue restaurada en el servidor.
|
||||||
Si continua con la sincronización todos los archivos serán remplazados por su versión previa. ¿Desea mantener los archivos locales en su versión actual como archivos en conflicto?</translation>
|
Si continua con la sincronización todos los archivos serán remplazados por su versión previa. ¿Desea mantener los archivos locales en su versión actual como archivos en conflicto?</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -902,17 +902,17 @@ Si continua con la sincronización todos los archivos serán remplazados por su
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1315"/>
|
<location filename="../src/gui/folderman.cpp" line="1315"/>
|
||||||
<source>The selected path is not a folder!</source>
|
<source>The selected path is not a folder!</source>
|
||||||
<translation>¡La ruta seleccionada no es un directorio!</translation>
|
<translation>¡La ruta seleccionada no es una carpeta!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1319"/>
|
<location filename="../src/gui/folderman.cpp" line="1319"/>
|
||||||
<source>You have no permission to write to the selected folder!</source>
|
<source>You have no permission to write to the selected folder!</source>
|
||||||
<translation>¡Usted no tiene permiso para escribir en la carpeta seleccionada!</translation>
|
<translation>¡No tiene permiso para escribir en la carpeta seleccionada!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1369"/>
|
<location filename="../src/gui/folderman.cpp" line="1369"/>
|
||||||
<source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
|
<source>The local folder %1 contains a symbolic link. The link target contains an already synced folder Please pick another one!</source>
|
||||||
<translation>El directorio local %1 es un enlace simbólico. El destino del enlace ya contiene un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
|
<translation>La carpeta local %1 es un enlace simbólico. El destino del enlace ya contiene una carpeta usada en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderman.cpp" line="1384"/>
|
<location filename="../src/gui/folderman.cpp" line="1384"/>
|
||||||
@@ -1090,7 +1090,7 @@ Si continua con la sincronización todos los archivos serán remplazados por su
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
|
<location filename="../src/gui/folderstatusmodel.cpp" line="1064"/>
|
||||||
<source>Preparing to sync...</source>
|
<source>Preparing to sync...</source>
|
||||||
<translation>Preparándose para sincronizar...</translation>
|
<translation>Preparando la sincronizarción..</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -1111,7 +1111,7 @@ Si continua con la sincronización todos los archivos serán remplazados por su
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="67"/>
|
<location filename="../src/gui/folderwizard.cpp" line="67"/>
|
||||||
<source>Click to select a local folder to sync.</source>
|
<source>Click to select a local folder to sync.</source>
|
||||||
<translation>Haga clic para seleccionar una carpeta local para sincronizar.</translation>
|
<translation>Haga clic para seleccionar una carpeta local que sincronizar.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="72"/>
|
<location filename="../src/gui/folderwizard.cpp" line="72"/>
|
||||||
@@ -1164,7 +1164,7 @@ Si continua con la sincronización todos los archivos serán remplazados por su
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="445"/>
|
<location filename="../src/gui/folderwizard.cpp" line="445"/>
|
||||||
<source>This folder is already being synced.</source>
|
<source>This folder is already being synced.</source>
|
||||||
<translation>Este directorio ya se ha sincronizado.</translation>
|
<translation>Esta carpeta ya se ha sincronizado.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folderwizard.cpp" line="447"/>
|
<location filename="../src/gui/folderwizard.cpp" line="447"/>
|
||||||
@@ -1190,12 +1190,12 @@ Si continua con la sincronización todos los archivos serán remplazados por su
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="183"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="183"/>
|
||||||
<source>No E-Tag received from server, check Proxy/Gateway</source>
|
<source>No E-Tag received from server, check Proxy/Gateway</source>
|
||||||
<translation>No se ha recibido ninguna e-tag del servidor, revise el proxy/puerta de enlace</translation>
|
<translation>No se ha recibido ninguna E-Tag del servidor, revise el proxy/puerta de enlace</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="190"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="190"/>
|
||||||
<source>We received a different E-Tag for resuming. Retrying next time.</source>
|
<source>We received a different E-Tag for resuming. Retrying next time.</source>
|
||||||
<translation>Se ha recibido una e-tag distinta para reanudar. Se volverá a intentar.</translation>
|
<translation>Se ha recibido una E-Tag distinta para reanudar. Se volverá a intentar.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatedownload.cpp" line="217"/>
|
<location filename="../src/libsync/propagatedownload.cpp" line="217"/>
|
||||||
@@ -1498,7 +1498,7 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="109"/>
|
<location filename="../src/gui/logbrowser.cpp" line="109"/>
|
||||||
<source>Save the log file to a file on disk for debugging.</source>
|
<source>Save the log file to a file on disk for debugging.</source>
|
||||||
<translation>Guardar el archivo de registro a un archivo en disco para depuración.</translation>
|
<translation>Guardar el registro en un archivo en el disco para su depuración.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/logbrowser.cpp" line="198"/>
|
<location filename="../src/gui/logbrowser.cpp" line="198"/>
|
||||||
@@ -1602,7 +1602,7 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/networksettings.ui" line="190"/>
|
<location filename="../src/gui/networksettings.ui" line="190"/>
|
||||||
<source>Download Bandwidth</source>
|
<source>Download Bandwidth</source>
|
||||||
<translation>Ancho de banda de descarga</translation>
|
<translation>Velocidad de descarga</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/networksettings.ui" line="196"/>
|
<location filename="../src/gui/networksettings.ui" line="196"/>
|
||||||
@@ -1626,12 +1626,12 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
|
|||||||
<location filename="../src/gui/networksettings.ui" line="250"/>
|
<location filename="../src/gui/networksettings.ui" line="250"/>
|
||||||
<location filename="../src/gui/networksettings.ui" line="282"/>
|
<location filename="../src/gui/networksettings.ui" line="282"/>
|
||||||
<source>Limit to 3/4 of estimated bandwidth</source>
|
<source>Limit to 3/4 of estimated bandwidth</source>
|
||||||
<translation>Limitar a 3/4 de la banda ancha estimada</translation>
|
<translation>Limitar a 3/4 de la velocidad estimada</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/networksettings.ui" line="269"/>
|
<location filename="../src/gui/networksettings.ui" line="269"/>
|
||||||
<source>Upload Bandwidth</source>
|
<source>Upload Bandwidth</source>
|
||||||
<translation>Ancho de banda para subidas</translation>
|
<translation>Velocidad de subida</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/networksettings.ui" line="253"/>
|
<location filename="../src/gui/networksettings.ui" line="253"/>
|
||||||
@@ -1728,7 +1728,7 @@ Los elementos cuya eliminación está permitida serán eliminados si impiden que
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
|
<location filename="../src/gui/updater/ocupdater.cpp" line="103"/>
|
||||||
<source>New %1 Update Ready</source>
|
<source>New %1 Update Ready</source>
|
||||||
<translation>Nueva %1 actualización está lista</translation>
|
<translation>La nueva %1 actualización está lista</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
|
<location filename="../src/gui/updater/ocupdater.cpp" line="104"/>
|
||||||
@@ -1807,7 +1807,7 @@ for additional privileges during the process.</source>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="159"/>
|
||||||
<source>Sync the folder '%1'</source>
|
<source>Sync the folder '%1'</source>
|
||||||
<translation>Sincronizar el directorio '%1'</translation>
|
<translation>Sincronizar la carpeta '%1'</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
|
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.cpp" line="164"/>
|
||||||
@@ -1955,12 +1955,12 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
|
<location filename="../src/gui/owncloudsetupwizard.cpp" line="398"/>
|
||||||
<source>Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser.</source>
|
<source>Access forbidden by server. To verify that you have proper access, <a href="%1">click here</a> to access the service with your browser.</source>
|
||||||
<translation>Acceso denegado por el servidor. Para verificar que usted tiene acceso, <a href="%1">haga clic aquí</a> para acceder al servicio con su navegador.</translation>
|
<translation>Acceso denegado por el servidor. Para verificar que tiene acceso, <a href="%1">haga clic aquí</a> para acceder al servicio desde el navegador.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
|
<location filename="../src/gui/owncloudsetupwizard.cpp" line="278"/>
|
||||||
<source>Invalid URL</source>
|
<source>Invalid URL</source>
|
||||||
<translation>URL inválida.</translation>
|
<translation>URL no válida.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
|
<location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
|
||||||
@@ -2193,7 +2193,7 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
|
<location filename="../src/libsync/propagatorjobs.cpp" line="172"/>
|
||||||
<source>could not create folder %1</source>
|
<source>could not create folder %1</source>
|
||||||
<translation>No se ha podido crear el directorio %1</translation>
|
<translation>No se ha podido crear la carpeta %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
|
<location filename="../src/libsync/propagatorjobs.cpp" line="184"/>
|
||||||
@@ -2461,7 +2461,7 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/proxyauthdialog.ui" line="74"/>
|
<location filename="../src/gui/proxyauthdialog.ui" line="74"/>
|
||||||
<source>TextLabel</source>
|
<source>TextLabel</source>
|
||||||
<translation>Etiqueta de texto</translation>
|
<translation>EtiquetaDeTexto</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
@@ -2644,7 +2644,7 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharelinkwidget.ui" line="276"/>
|
<location filename="../src/gui/sharelinkwidget.ui" line="276"/>
|
||||||
<source>TextLabel</source>
|
<source>TextLabel</source>
|
||||||
<translation>Etiqueta de texto</translation>
|
<translation>EtiquetaDeTexto</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharelinkwidget.ui" line="139"/>
|
<location filename="../src/gui/sharelinkwidget.ui" line="139"/>
|
||||||
@@ -2664,7 +2664,7 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
|
<location filename="../src/gui/sharelinkwidget.ui" line="105"/>
|
||||||
<source>Set &expiration date</source>
|
<source>Set &expiration date</source>
|
||||||
<translation>Establecer fecha de v&encimiento</translation>
|
<translation>Establecer fecha de &vencimiento</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sharelinkwidget.ui" line="156"/>
|
<location filename="../src/gui/sharelinkwidget.ui" line="156"/>
|
||||||
@@ -2971,7 +2971,7 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="109"/>
|
<location filename="../src/gui/sslbutton.cpp" line="109"/>
|
||||||
<source>State/Province:</source>
|
<source>State/Province:</source>
|
||||||
<translation>Estado/provincia:</translation>
|
<translation>Estado/Provincia:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/sslbutton.cpp" line="110"/>
|
<location filename="../src/gui/sslbutton.cpp" line="110"/>
|
||||||
@@ -3211,7 +3211,7 @@ No se recomienda usarla.</translation>
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="188"/>
|
<location filename="../src/libsync/syncengine.cpp" line="188"/>
|
||||||
<source>Error while reading folder.</source>
|
<source>Error while reading folder.</source>
|
||||||
<translation>Error al leer el directorio.</translation>
|
<translation>Error al leer la carpeta.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/libsync/syncengine.cpp" line="264"/>
|
<location filename="../src/libsync/syncengine.cpp" line="264"/>
|
||||||
@@ -3643,7 +3643,7 @@ No se recomienda usarla.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation>Reanudar todas las carpetas</translation>
|
<translation>Reanudar todas las carpetas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
@@ -3653,12 +3653,12 @@ No se recomienda usarla.</translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation>Reanudar toda la sincronización</translation>
|
<translation>Reanudar toda la sincronización</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation>Reanudar la sincronización</translation>
|
<translation>Reanudar la sincronización</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
|||||||
@@ -3629,7 +3629,7 @@ It is not advisable to use it.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
@@ -3639,12 +3639,12 @@ It is not advisable to use it.</source>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation type="unfinished"/>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
|||||||
@@ -768,10 +768,7 @@
|
|||||||
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
These deletes will be synchronized to your local sync folder, making such files unavailable unless you have a right to restore.
|
||||||
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
If you decide to keep the files, they will be re-synced with the server if you have rights to do so.
|
||||||
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
If you decide to delete the files, they will be unavailable to you, unless you are the owner.</source>
|
||||||
<translation>Todos los archivos en la carpeta de sincronizacion '%1' fueron borrados en el servidor.
|
<translation type="unfinished"/>
|
||||||
Este borrado se sincronizara a tu carpeta de sincronización local, haciendo que estos archivos no sean disponibles a menos que tengas privilegio para restaurar.
|
|
||||||
Si decides mantener estos archivos, estos se re-sincronizaran con el servidor si tienes los privilegios para hacerlo.
|
|
||||||
Si decides borrar los archivos, estos ya no estarán disponibles para ti, a menos que seas el dueño.</translation>
|
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/folder.cpp" line="932"/>
|
<location filename="../src/gui/folder.cpp" line="932"/>
|
||||||
@@ -3645,8 +3642,8 @@ No es recomendable usarlo. </translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
|
||||||
<source>Unpause all folders</source>
|
<source>Resume all folders</source>
|
||||||
<translation>Despasuar todas las carpetas</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
|
||||||
@@ -3655,13 +3652,13 @@ No es recomendable usarlo. </translation>
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
|
||||||
<source>Unpause all synchronization</source>
|
<source>Resume all synchronization</source>
|
||||||
<translation>Despausar toda la sincronización</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
|
||||||
<source>Unpause synchronization</source>
|
<source>Resume synchronization</source>
|
||||||
<translation>Despausar la sincronización</translation>
|
<translation type="unfinished"/>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user