Merge branch 'master' into upstream/pr/6656

This commit is contained in:
Roeland Jago Douma 2018-11-01 08:07:55 +01:00 committed by GitHub
commit 3b5d8f0277
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
99 changed files with 16229 additions and 4199 deletions

View File

@ -14,7 +14,7 @@ pipeline:
cd /tmp &&
git clone https://github.com/frankosterfeld/qtkeychain.git &&
cd qtkeychain &&
git checkout v0.8.0 &&
git checkout v0.9.1 &&
mkdir build &&
cd build &&
cmake ../ &&
@ -42,7 +42,7 @@ pipeline:
cd /tmp &&
git clone https://github.com/frankosterfeld/qtkeychain.git &&
cd qtkeychain &&
git checkout v0.8.0 &&
git checkout v0.9.1 &&
mkdir build &&
cd build &&
cmake ../ &&
@ -70,7 +70,7 @@ pipeline:
cd /tmp &&
git clone https://github.com/frankosterfeld/qtkeychain.git &&
cd qtkeychain &&
git checkout v0.8.0 &&
git checkout v0.9.1 &&
mkdir build &&
cd build &&
cmake ../ &&
@ -100,7 +100,7 @@ pipeline:
cd /tmp &&
git clone https://github.com/frankosterfeld/qtkeychain.git &&
cd qtkeychain &&
git checkout v0.8.0 &&
git checkout v0.9.1 &&
mkdir build &&
cd build &&
cmake ../ &&
@ -132,7 +132,7 @@ pipeline:
cd /tmp &&
git clone https://github.com/frankosterfeld/qtkeychain.git &&
cd qtkeychain &&
git checkout v0.8.0 &&
git checkout v0.9.1 &&
mkdir build &&
cd build &&
cmake ../ &&
@ -165,7 +165,7 @@ pipeline:
cd /tmp &&
git clone https://github.com/frankosterfeld/qtkeychain.git &&
cd qtkeychain &&
git checkout v0.8.0 &&
git checkout v0.9.1 &&
mkdir build &&
cd build &&
cmake ../ &&

64
.github/issue_template.md vendored Normal file
View 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
View File

@ -164,3 +164,10 @@ UpgradeLog*.htm
# Microsoft Fakes
FakesAssemblies/
#cmake temporary stuff
CMakeCache.txt
CMakeFiles/
CPackConfig.cmake
CPackOptions.cmake
CPackSourceConfig.cmake

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[ca]=Directori de sincronització

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
Icon[cs_CZ]=@APPLICATION_EXECUTABLE@
Name[cs_CZ]=@APPLICATION_NAME@ desktopový synchronizační klient
Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
Icon[cs_CZ]=@NAZEV_IKONY_APLIKACE@
Name[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop
GenericName[cs_CZ]=Synchronizace složek

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
Icon[de_DE]=@APPLICATION_EXECUTABLE@
Icon[de_DE]=@APPLICATION_ICON_NAME@
Name[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisation
GenericName[de_DE]=Synchronisationsordner

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
Icon[en_GB]=@APPLICATION_EXECUTABLE@
Name[en_GB]=@APPLICATION_NAME@ desktop sync client
GenericName[en_GB]=Folder Sync

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_CL]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_CO]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_CR]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_DO]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_EC]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_GT]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_MX]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[es_SV]=Sincronización de carpeta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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@
GenericName[es]=Sincronización de carpetas

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -198,7 +198,7 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[fr]=Client desktop de synchronisation @APPLICATION_NAME@
Icon[fr]=@APPLICATION_EXECUTABLE@
Comment[fr]=Client de synchronisation @APPLICATION_NAME@ desktop
Icon[fr]=@APPLICATION_ICON_NAME@
Name[fr]=Client desktop de synchronisation @APPLICATION_NAME@
GenericName[fr]=Synchronisation du dossier

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
Icon[he]=@APPLICATION_EXECUTABLE@
Name[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה
GenericName[he]=סנכרון תיקיות

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[is]=Samstilling á möppum

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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@
GenericName[it]=Sincronizzazione cartelle

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
GenericName[ja_JP]=フォルダーを同期する

View 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

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[lv]=Mapju Sinhronizēšana

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
Icon[nb_NO]=@APPLICATION_EXECUTABLE@
Name[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
GenericName[nb_NO]=Mappe synkroinisering

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient
Icon[nl]=@APPLICATION_EXECUTABLE@
Icon[nl]=@APPLICATION_ICON_NAME@
Name[nl]=@APPLICATION_NAME@ desktop sync client
GenericName[nl]=Map synchronisatie

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
Icon[pl]=@APPLICATION_EXECUTABLE@
Icon[pl]=@APPLICATION_ICON_NAME@
Name[pl]=@APPLICATION_NAME@ desktopowy klient synchronizacji
GenericName[pl]=Katalog synchronizacji

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[pt_BR]=Sincronizar Pasta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[pt_PT]=Sincronização de Pasta

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
Icon[ru]=@APPLICATION_EXECUTABLE@
Icon[ru]=@APPLICATION_ICON_NAME@
Name[ru]=@APPLICATION_NAME@ клиент для ПК
GenericName[ru]=Синхронизация папок

View 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

View 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

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
Icon[sr]=@APPLICATION_EXECUTABLE@
Icon[sr]=@APPLICATION_ICON_NAME@
Name[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију
GenericName[sr]=Синхронизација фасцикли

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,6 @@ X-GNOME-Autostart-Delay=3
# Translations
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
GenericName[tr]=Klasör Eşitleme

View 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]=文件夹同步

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -199,6 +199,5 @@ X-GNOME-Autostart-Delay=3
# Translations
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
Icon[zh_TW]=@APPLICATION_EXECUTABLE@
Name[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
GenericName[zh_TW]=資料夾同步

View File

@ -32,7 +32,7 @@ you want to install system wide you could use `/usr/local` or `/opt/nextcloud/`.
##### Linux
```
$ cmake "-GVisual Studio 15 2017 Win64" .. -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
$ 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
```

View File

@ -18,11 +18,11 @@ if [ $SUFFIX != "master" ]; then
SUFFIX="PR-$SUFFIX"
fi
#QtKeyChain 0.8.0
#QtKeyChain 0.9.1
cd /build
git clone https://github.com/frankosterfeld/qtkeychain.git
cd qtkeychain
git checkout v0.8.0
git checkout v0.9.1
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr ../

View File

@ -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
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
-----------------------------------

View File

@ -24,7 +24,9 @@ The other options are:
``--logflush``
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>`
Uses the specified configuration directory.

View File

@ -5,7 +5,7 @@ Exec=@APPLICATION_EXECUTABLE@
Name=@APPLICATION_NAME@ desktop sync client
Comment=@APPLICATION_NAME@ desktop synchronization client
GenericName=Folder Sync
Icon=@APPLICATION_EXECUTABLE@
Icon=@APPLICATION_ICON_NAME@
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
X-GNOME-Autostart-Delay=3
# Translations
@ -198,185 +198,185 @@ X-GNOME-Autostart-Delay=3
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
GenericName[oc]=Dorsièr de Sincronizacion
Name[oc]=@APPLICATION_NAME@ sincronizacion del client
Icon[oc]=@APPLICATION_EXECUTABLE@
Icon[oc]=@APPLICATION_ICON_NAME@
Comment[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
GenericName[ar]=مزامنة المجلد
Name[ar]=@APPLICATION_NAME@ زبون مزامنة مكتبي
Icon[ar]=@APPLICATION_EXECUTABLE@
Icon[ar]=@APPLICATION_ICON_NAME@
Comment[bg_BG]=@APPLICATION_NAME@ клиент за десктоп синхронизация
GenericName[bg_BG]=Синхронизиране на папката
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@
GenericName[ca]=Sincronització de carpetes
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
GenericName[da]=Mappesynkronisering
Name[da]=@APPLICATION_NAME@ skrivebordsklient til synk
Icon[da]=@APPLICATION_EXECUTABLE@
Icon[da]=@APPLICATION_ICON_NAME@
Comment[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
GenericName[de]=Ordner-Synchronisation
Name[de]=@APPLICATION_NAME@ Desktop-Synchronisationsclient
Icon[de]=@APPLICATION_EXECUTABLE@
Icon[de]=@APPLICATION_ICON_NAME@
Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
GenericName[ja_JP]=フォルダー同期
Name[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント
Icon[ja_JP]=@APPLICATION_EXECUTABLE@
Icon[ja_JP]=@APPLICATION_ICON_NAME@
Comment[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
GenericName[el]=Συγχρονισμός φακέλου
Name[el]=@ΟΝΟΜΑ_ΕΦΑΡΜΟΓΗΣ@ συγχρονισμός επιφάνειας εργασίας πελάτη
Icon[el]=@APPLICATION_EXECUTABLE@
Icon[el]=@APPLICATION_ICON_NAME@
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
GenericName[en_GB]=Folder Sync
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
GenericName[es]=Sincronización de carpeta
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
GenericName[de_DE]=Ordner-Synchronisation
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
GenericName[eu]=Karpetaren sinkronizazioa
Name[eu]=@APPLICATION_NAME@ mahaigaineko sinkronizazio bezeroa
Icon[eu]=@APPLICATION_EXECUTABLE@
Icon[eu]=@APPLICATION_ICON_NAME@
GenericName[fa]=همسان سازی پوشه‌ها
Name[fa]=@APPLICATION_EXECUTABLE@ نسخه‌ی همسان سازی مشتری
Icon[fa]=@APPLICATION_EXECUTABLE@
Icon[fa]=@APPLICATION_ICON_NAME@
Comment[fr]=Synchronisez vos dossiers avec un serveur @APPLICATION_NAME@
GenericName[fr]=Synchronisation de dossier
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
GenericName[gl]=Sincronizar Cartafol
Name[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio
Icon[gl]=@APPLICATION_EXECUTABLE@
Icon[gl]=@APPLICATION_ICON_NAME@
Comment[he]=@APPLICATION_NAME@ לקוח סנכון שולחן עבודה
GenericName[he]=סנכון תיקייה
Name[he]=@APPLICATION_NAME@ לקוח סנכרון שולחן עבודה
Icon[he]=@APPLICATION_EXECUTABLE@
Icon[he]=@APPLICATION_ICON_NAME@
Comment[ia]=@APPLICATION_NAME@ cliente de synchronisation pro scriptorio
GenericName[ia]=Synchronisar Dossier
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@
GenericName[id]=Folder Sync
Name[id]=Klien sync desktop @APPLICATION_NAME@
Icon[id]=@APPLICATION_EXECUTABLE@
Icon[id]=@APPLICATION_ICON_NAME@
Comment[is]=@APPLICATION_NAME@ skjáborðsforrit samstillingar
GenericName[is]=Samstilling möppu
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@
GenericName[it]=Sincronizzazione cartella
Name[it]=Client di sincronizzazione del desktop di @APPLICATION_NAME@
Icon[it]=@APPLICATION_EXECUTABLE@
Icon[it]=@APPLICATION_ICON_NAME@
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
GenericName[ko]=폴더 동기화
Name[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
Icon[ko]=@APPLICATION_EXECUTABLE@
Icon[ko]=@APPLICATION_ICON_NAME@
Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizációs kliens
GenericName[hu_HU]=Könyvtár szinkronizálás
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
GenericName[af_ZA]=Vouersinchronisering
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
GenericName[nl]=Mappen sync
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
GenericName[et_EE]=Kaustade sünkroonimine
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
GenericName[pl]=Folder Synchronizacji
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
GenericName[pt_BR]=Sincronização de Pasta
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
GenericName[cs_CZ]=Synchronizace adresáře
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@
GenericName[ru]=Синхронизация каталогов
Name[ru]=Настольный клиент синхронизации @APPLICATION_NAME@
Icon[ru]=@APPLICATION_EXECUTABLE@
Icon[ru]=@APPLICATION_ICON_NAME@
Comment[sl]=@APPLICATION_NAME@ Program za usklajevanje datotek z namizjem
GenericName[sl]=Usklajevanje map
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
GenericName[sq]=Njëkohësim Dosjesh
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
GenericName[fi_FI]=Kansion synkronointi
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
GenericName[sv]=Mappsynk
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
GenericName[tr]=Dosya Eşitleme
Name[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi
Icon[tr]=@APPLICATION_EXECUTABLE@
Icon[tr]=@APPLICATION_ICON_NAME@
Comment[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
GenericName[uk]=Синхронізація теки
Name[uk]=Настільний клієнт синхронізації @APPLICATION_NAME@
Icon[uk]=@APPLICATION_EXECUTABLE@
Icon[uk]=@APPLICATION_ICON_NAME@
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
GenericName[ro]=Sincronizare director
Name[ro]=@APPLICATION_NAME@ client de sincronizare pe desktop
Icon[ro]=@APPLICATION_EXECUTABLE@
Icon[ro]=@APPLICATION_ICON_NAME@
Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
GenericName[zh_CN]=文件夹同步
Name[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端
Icon[zh_CN]=@APPLICATION_EXECUTABLE@
Icon[zh_CN]=@APPLICATION_ICON_NAME@
Comment[zh_HK]=桌面版同步客户端
Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端
GenericName[zh_TW]=資料夾同步
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@
GenericName[es_AR]=Sincronización de directorio
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
GenericName[lt_LT]=Katalogo sinchnorizacija
Name[lt_LT]=@APPLICATION_NAME@ darbalaukio programa
Icon[lt_LT]=@APPLICATION_EXECUTABLE@
Icon[lt_LT]=@APPLICATION_ICON_NAME@
Comment[th_TH]=@APPLICATION_NAME@ ไคลเอนต์ประสานข้อมูลเดสก์ท็อป
GenericName[th_TH]=ประสานข้อมูลโฟลเดอร์
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@
GenericName[es_MX]=Sincronización de Carpetas
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
GenericName[nb_NO]=Mappesynkronisering
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
GenericName[nn_NO]=Mappe synkronisering
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
GenericName[pt_PT]=Sincronizar Pasta
Name[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização para PC
Icon[pt_PT]=@APPLICATION_EXECUTABLE@
Icon[km]=@APPLICATION_EXECUTABLE@
Icon[pt_PT]=@APPLICATION_ICON_NAME@
Icon[km]=@APPLICATION_ICON_NAME@
Comment[lb]=@APPLICATION_NAME@ Desktop Synchronisatioun Client
GenericName[lb]=Dossier Dync
Name[lb]=@APPLICATION_NAME@ Desktop Sync Client
Icon[lb]=@APPLICATION_EXECUTABLE@
Icon[lb]=@APPLICATION_ICON_NAME@

View File

@ -63,7 +63,7 @@ class SocketConnect(GObject.GObject):
self._watch_id = 0
self._sock = None
self._listeners = [self._update_registered_paths, self._get_version]
self._remainder = ''.encode()
self._remainder = ''.encode() if python3 else ''
self.protocolVersion = '1.0'
self.nautilusVFSFile_table = {} # not needed in this object actually but shared
# all over the other objects.
@ -82,7 +82,7 @@ class SocketConnect(GObject.GObject):
# print("Server command: " + cmd)
if self.connected:
try:
self._sock.send(cmd.encode())
self._sock.send(cmd.encode() if python3 else cmd)
except:
print("Sending failed.")
self.reconnect()
@ -134,7 +134,8 @@ class SocketConnect(GObject.GObject):
return []
data = self._remainder[:end]
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
def _handle_notify(self, source, condition):
@ -233,7 +234,7 @@ class MenuExtension(GObject.GObject, Nautilus.MenuProvider):
def ask_for_menu_items(self, files):
record_separator = '\x1e'
filesstring = record_separator.join(files)
socketConnect.sendCommand('GET_MENU_ITEMS:{}\n'.format(filesstring))
socketConnect.sendCommand(u'GET_MENU_ITEMS:{}\n'.format(filesstring))
done = False
start = time.time()

@ -1 +1 @@
Subproject commit 4ffbff5d5fca7332f6390ddc2fe74cd29e8675f8
Subproject commit ebc7ec6f681c0ae52c9443dbf63c4d1224bf3aec

File diff suppressed because it is too large Load Diff

View File

@ -123,9 +123,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
#define SQLITE_VERSION "3.23.1"
#define SQLITE_VERSION_NUMBER 3023001
#define SQLITE_SOURCE_ID "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
#define SQLITE_VERSION "3.24.0"
#define SQLITE_VERSION_NUMBER 3024000
#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"
/*
** 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_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<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_SNAPSHOT (SQLITE_BUSY | (2<<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_CONVPATH (SQLITE_CANTOPEN | (4<<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_CANTLOCK (SQLITE_READONLY | (2<<8))
#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8))
@ -1930,6 +1932,22 @@ struct sqlite3_mem_methods {
** I/O required to support statement rollback.
** The default value for this setting is controlled by the
** [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>
*/
#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_STMTJRNL_SPILL 26 /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */
#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */
/*
** 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
** it is not disabled, 1 if it is.
** </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>
*/
#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_ENABLE_QPSG 1007 /* 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
@ -5492,6 +5527,41 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_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
** KEYWORDS: {autocommit mode}
@ -6224,6 +6294,10 @@ struct sqlite3_index_info {
/*
** 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 */
@ -6999,7 +7073,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
#define SQLITE_TESTCTRL_ALWAYS 13
#define SQLITE_TESTCTRL_RESERVE 14
#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_LOCALTIME_FAULT 18
#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_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 &#91;...&#93;. 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
**
@ -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
** column is being fetched as part of an UPDATE operation during which the
** column value will not change. Applications might use this to substitute
** a lighter-weight value to return that the corresponding [xUpdate] method
** understands as a "no-change" value.
** a return value that is less expensive to compute and that the corresponding
** [xUpdate] method understands as a "no-change" value.
**
** 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
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
** 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
** values of D and S.
** 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.
**
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the

View File

@ -272,10 +272,12 @@ bool FileSystem::openAndSeekFileSharedRead(QFile *file, QString *errorOrNull, qi
int fd = _open_osfhandle((intptr_t)fileHandle, _O_RDONLY);
if (fd == -1) {
error = "could not make fd from handle";
CloseHandle(fileHandle);
return false;
}
if (!file->open(fd, QIODevice::ReadOnly, QFile::AutoCloseHandle)) {
error = file->errorString();
_close(fd); // implicitly closes fileHandle
return false;
}

View File

@ -602,7 +602,7 @@ void SyncJournalDb::close()
commitTransaction();
_db.close();
_avoidReadFromDbOnNextSyncFilter.clear();
clearEtagStorageFilter();
_metadataTableIsEmpty = false;
}
@ -824,10 +824,10 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
SyncJournalFileRecord record = _record;
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
QByteArray prefix = record._path + "/";
foreach (const QByteArray &it, _avoidReadFromDbOnNextSyncFilter) {
foreach (const QByteArray &it, _etagStorageFilter) {
if (it.startsWith(prefix)) {
qCInfo(lcDb) << "Filtered writing the etag of" << prefix << "because it is a prefix of" << it;
record._etag = "_invalid_";
@ -1816,7 +1816,12 @@ void SyncJournalDb::avoidReadFromDbOnNextSync(const QByteArray &fileName)
// Prevent future overwrite of the etags of this folder and all
// parent folders for this sync
argument.append('/');
_avoidReadFromDbOnNextSyncFilter.append(argument);
_etagStorageFilter.append(argument);
}
void SyncJournalDb::clearEtagStorageFilter()
{
_etagStorageFilter.clear();
}
void SyncJournalDb::forceRemoteDiscoveryNextSync()

View File

@ -178,10 +178,18 @@ public:
* 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
* 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 QByteArray &fileName);
/**
* Wipe _etagStorageFilter. Also done implicitly on close().
*/
void clearEtagStorageFilter();
/**
* Ensures full remote discovery happens on the next sync.
*
@ -295,13 +303,20 @@ private:
SqlQuery _setConflictRecordQuery;
SqlQuery _deleteConflictRecordQuery;
/* This is the list of paths we called avoidReadFromDbOnNextSync on.
* 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
/* Storing etags to these folders, or their parent folders, is filtered out.
*
* 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 /.
*/
QList<QByteArray> _avoidReadFromDbOnNextSyncFilter;
QList<QByteArray> _etagStorageFilter;
/** The journal mode to use for the db.
*

View File

@ -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) */
if (our_tree->findFile(basePath)) {
other = nullptr;
qCDebug(lcReconcile, "Origin found in our tree : %s", basePath.constData());
qCInfo(lcReconcile, "Origin found in our tree : %s", basePath.constData());
} else {
/* 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
@ -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.
*/
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");
}
@ -185,7 +185,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
// Some other EVAL_RENAME already claimed other.
// We do nothing: maybe a different candidate for
// 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());
} else if (cur->type == ItemTypeDirectory
// 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_UPDATE_METADATA
|| 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->instruction = CSYNC_INSTRUCTION_RENAME;
other->rename_path = cur->path;
if( !cur->file_id.isEmpty() ) {
other->file_id = cur->file_id;
}
if (ctx->current == LOCAL_REPLICA) {
// Keep the local mtime.
other->modtime = cur->modtime;
}
other->inode = cur->inode;
cur->instruction = CSYNC_INSTRUCTION_NONE;
// 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.
// Remote: The local replica has already dealt with this.
// 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);
cur->instruction = CSYNC_INSTRUCTION_NONE;
} 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
// due to a remote move of the same file. In these scenarios we just
// want the instruction to stay NEW.
qCDebug(lcReconcile, "Other already has instruction %d",
qCInfo(lcReconcile, "Other already has instruction %d",
other->instruction);
}
};
@ -233,7 +237,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
if (ctx->current == LOCAL_REPLICA) {
/* use the old name to find the "other" node */
OCC::SyncJournalFileRecord base;
qCDebug(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
qCInfo(lcReconcile, "Finding rename origin through inode %" PRIu64 "",
cur->inode);
ctx->statedb->getFileRecordByInode(cur->inode, &base);
renameCandidateProcessing(base._path);
@ -246,7 +250,7 @@ static void _csync_merge_algorithm_visitor(csync_file_stat_t *cur, CSYNC * ctx)
// line.
auto basePath = csync_rename_adjust_full_path_source(ctx, 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());
// We go through getFileRecordsByFileId to ensure the basePath
// 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
if (!processedRename) {
qCDebug(lcReconcile, "Finding rename origin through file ID %s",
qCInfo(lcReconcile, "Finding rename origin through file ID %s",
cur->file_id.constData());
ctx->statedb->getFileRecordsByFileId(cur->file_id,
[&](const OCC::SyncJournalFileRecord &base) { renameCandidateProcessing(base._path); });

View File

@ -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.
* Keep it here for now */
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;
}
} else {
/* 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) {
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);
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());
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->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;
}
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;
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
* 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;
}
/* 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) {
/* 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;
} else {
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 {
/* check if it's a file and has been renamed */
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;
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,
ctx->callbacks.checksum_userdata);
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;
}
}
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 */
fs->instruction = CSYNC_INSTRUCTION_EVAL_RENAME;
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;
} else {
qCInfo(lcUpdate, "Checking for rename based on fileid %s", fs->file_id.constData());
/* Remote Replica Rename check */
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;
}
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;
done = true;
};
@ -484,11 +487,11 @@ int csync_walker(CSYNC *ctx, std::unique_ptr<csync_file_stat_t> fs) {
}
break;
case ItemTypeSoftLink:
qCDebug(lcUpdate, "symlink: %s - not supported", fs->path.constData());
qCInfo(lcUpdate, "symlink: %s - not supported", fs->path.constData());
break;
default:
qCInfo(lcUpdate, "item: %s - item type %d not iterated", fs->path.constData(), fs->type);
return 0;
break;
}
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.
*/
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 += '/';
return;
@ -663,7 +666,21 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
goto error;
}
while ((dirent = csync_vio_readdir(ctx, dh))) {
while (true) {
// Get the next item in the directory
errno = 0;
dirent = csync_vio_readdir(ctx, dh);
if (!dirent) {
if (errno != 0) {
// Note: Windows vio converts any error into EACCES
qCWarning(lcUpdate, "readdir failed for file in %s - errno %d", uri, errno);
goto error;
}
// Normal case: End of items in directory
break;
}
/* Conversion error */
if (dirent->path.isEmpty() && !dirent->original_path.isEmpty()) {
ctx->status_code = CSYNC_STATUS_INVALID_CHARACTERS;
@ -757,7 +774,7 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
}
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;

View File

@ -156,6 +156,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *d
// might be error, check!
int dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES) {
qCWarning(lcCSyncVIOLocal, "FindNextFile error %d", dwError);
errno = EACCES; // no more files is fine. Otherwise EACCESS
}
return nullptr;
@ -181,7 +182,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
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE
|| handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) {
) {
file_stat->type = ItemTypeSkip;
} else if (handle->ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
file_stat->type = ItemTypeDirectory;

View File

@ -335,10 +335,10 @@ void AccountState::slotInvalidCredentials()
if (account()->credentials()->ready()) {
account()->credentials()->invalidateToken();
if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
if (creds->refreshAccessToken())
return;
}
}
if (auto creds = qobject_cast<HttpCredentials *>(account()->credentials())) {
if (creds->refreshAccessToken())
return;
}
account()->credentials()->askFromUser();
}

View File

@ -71,7 +71,7 @@ namespace {
" --logexpire <hours> : removes logs older than <hours> hours.\n"
" (to be used with --logdir)\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";
QString applicationTrPath()
@ -125,7 +125,8 @@ Application::Application(int &argc, char **argv)
setAttribute(Qt::AA_UseHighDpiPixmaps, true);
auto confDir = ConfigFile().configPath();
if (!QFileInfo(confDir).exists()) {
if (confDir.endsWith('/')) confDir.chop(1); // macOS 10.11.x does not like trailing slash for rename/move.
if (!QFileInfo(confDir).isDir()) {
// Migrate from version <= 2.4
setApplicationName(_theme->appNameGUI());
#ifndef QT_WARNING_DISABLE_DEPRECATED // Was added in Qt 5.9
@ -136,6 +137,7 @@ Application::Application(int &argc, char **argv)
// We need to use the deprecated QDesktopServices::storageLocation because of its Qt4
// behavior of adding "data" to the path
QString oldDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
if (oldDir.endsWith('/')) oldDir.chop(1); // macOS 10.11.x does not like trailing slash for rename/move.
QT_WARNING_POP
setApplicationName(_theme->appName());
if (QFileInfo(oldDir).isDir()) {
@ -202,9 +204,8 @@ Application::Application(int &argc, char **argv)
_theme->setSystrayUseMonoIcons(cfg.monoIcons());
connect(_theme, &Theme::systrayUseMonoIconsChanged, this, &Application::slotUseMonoIconsChanged);
FolderMan::instance()->setupFolders();
_proxy.setupQtProxyFromConfig(); // folders have to be defined first, than we set up the Qt proxy.
// Setting up the gui class will allow tray notifications for the
// setup that follows, like folder setup
_gui = new ownCloudGui(this);
if (_showLogWindow) {
_gui->slotToggleLogBrowser(); // _showLogWindow is set in parseOptions.
@ -213,6 +214,9 @@ Application::Application(int &argc, char **argv)
_gui->setupCloudProviders();
#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)
setStyleSheet("QInputDialog QLabel { qproperty-wordWrap:1; }");

View File

@ -150,7 +150,6 @@ void OAuth::start()
});
}
});
QTimer::singleShot(5 * 60 * 1000, this, [this] { result(Error); });
}
QUrl OAuth::authorisationLink() const

View File

@ -645,9 +645,13 @@ void Folder::startSync(const QStringList &pathList)
}
return interval;
}();
if (_folderWatcher && _folderWatcher->isReliable() && _timeSinceLastFullLocalDiscovery.isValid()
&& (fullLocalDiscoveryInterval.count() < 0
|| _timeSinceLastFullLocalDiscovery.hasExpired(fullLocalDiscoveryInterval.count()))) {
bool hasDoneFullLocalDiscovery = _timeSinceLastFullLocalDiscovery.isValid();
bool periodicFullLocalDiscoveryNow =
fullLocalDiscoveryInterval.count() >= 0 // negative means we don't require periodic full runs
&& _timeSinceLastFullLocalDiscovery.hasExpired(fullLocalDiscoveryInterval.count());
if (_folderWatcher && _folderWatcher->isReliable()
&& hasDoneFullLocalDiscovery
&& !periodicFullLocalDiscoveryNow) {
qCInfo(lcFolder) << "Allowing local discovery to read from the database";
_engine->setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, _localDiscoveryPaths);
@ -1015,6 +1019,20 @@ void Folder::warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QS
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()
{
if (!_scheduleSelfTimer.isActive()) {
@ -1034,11 +1052,14 @@ void Folder::registerFolderWatcher()
if (!QDir(path()).exists())
return;
_folderWatcher.reset(new FolderWatcher(path(), this));
_folderWatcher.reset(new FolderWatcher(this));
connect(_folderWatcher.data(), &FolderWatcher::pathChanged,
this, &Folder::slotWatchedPathChanged);
connect(_folderWatcher.data(), &FolderWatcher::lostChanges,
this, &Folder::slotNextSyncFullLocalDiscovery);
connect(_folderWatcher.data(), &FolderWatcher::becameUnreliable,
this, &Folder::slotWatcherUnreliable);
_folderWatcher->init(path());
}
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction dir, bool *cancel)

View File

@ -325,6 +325,9 @@ private slots:
/** Warn users if they create a file or folder that is selective-sync excluded */
void warnOnNewExcludedItem(const SyncJournalFileRecord &record, const QStringRef &path);
/** Warn users about an unreliable folder watcher */
void slotWatcherUnreliable(const QString &message);
private:
bool reloadExcludes();

View File

@ -38,19 +38,22 @@ namespace OCC {
Q_LOGGING_CATEGORY(lcFolderWatcher, "nextcloud.gui.folderwatcher", QtInfoMsg)
FolderWatcher::FolderWatcher(const QString &root, Folder *folder)
FolderWatcher::FolderWatcher(Folder *folder)
: QObject(folder)
, _folder(folder)
{
_d.reset(new FolderWatcherPrivate(this, root));
_timer.start();
}
FolderWatcher::~FolderWatcher()
{
}
void FolderWatcher::init(const QString &root)
{
_d.reset(new FolderWatcherPrivate(this, root));
_timer.start();
}
bool FolderWatcher::pathIsIgnored(const QString &path)
{
if (path.isEmpty())

View File

@ -55,11 +55,14 @@ class FolderWatcher : public QObject
{
Q_OBJECT
public:
// Construct, connect signals, call init()
explicit FolderWatcher(Folder *folder = 0L);
virtual ~FolderWatcher();
/**
* @param root Path of the root of the folder
*/
FolderWatcher(const QString &root, Folder *folder = 0L);
virtual ~FolderWatcher();
void init(const QString &root);
/**
* Not all backends are recursive by default.
@ -96,6 +99,12 @@ signals:
*/
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:
// called from the implementations to indicate a change in path
void changeDetected(const QString &path);

View File

@ -81,8 +81,11 @@ void FolderWatcherPrivate::inotifyRegisterPath(const QString &path)
} else {
// If we're running out of memory or inotify watches, become
// unreliable.
if (errno == ENOMEM || errno == ENOSPC) {
if (_parent->_isReliable && (errno == ENOMEM || errno == ENOSPC)) {
_parent->_isReliable = false;
emit _parent->becameUnreliable(
tr("This problem usually happens when the inotify watches are exhausted. "
"Check the FAQ for details."));
}
}
}

View File

@ -62,21 +62,16 @@ const char propertyAccountC[] = "oc_account";
ownCloudGui::ownCloudGui(Application *parent)
: QObject(parent)
, _tray(0)
,
#if defined(Q_OS_MAC)
_settingsDialog(new SettingsDialogMac(this))
,
, _settingsDialog(new SettingsDialogMac(this))
#else
_settingsDialog(new SettingsDialog(this))
,
, _settingsDialog(new SettingsDialog(this))
#endif
_logBrowser(0)
, _contextMenuVisibleOsx(false)
, _logBrowser(0)
#ifdef WITH_LIBCLOUDPROVIDERS
, _bus(QDBusConnection::sessionBus())
#endif
, _recentActionsMenu(0)
, _qdbusmenuWorkaround(false)
, _app(parent)
{
_tray = new Systray();
@ -154,7 +149,7 @@ void ownCloudGui::slotOpenSettingsDialog()
void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
{
if (_qdbusmenuWorkaround) {
if (_workaroundFakeDoubleClick) {
static QElapsedTimer last_click;
if (last_click.isValid() && last_click.elapsed() < 200) {
return;
@ -439,17 +434,19 @@ void ownCloudGui::addAccountContextMenu(AccountStatePtr accountState, QMenu *men
void ownCloudGui::slotContextMenuAboutToShow()
{
// For some reason on OS X _contextMenu->isVisible returns always false
_contextMenuVisibleOsx = true;
_contextMenuVisibleManual = true;
// Update icon in sys tray, as it might change depending on the context menu state
slotComputeOverallSyncStatus();
if (!_workaroundNoAboutToShowUpdate) {
updateContextMenu();
}
}
void ownCloudGui::slotContextMenuAboutToHide()
{
// For some reason on OS X _contextMenu->isVisible returns always false
_contextMenuVisibleOsx = false;
_contextMenuVisibleManual = false;
// Update icon in sys tray, as it might change depending on the context menu state
slotComputeOverallSyncStatus();
@ -457,11 +454,11 @@ void ownCloudGui::slotContextMenuAboutToHide()
bool ownCloudGui::contextMenuVisible() const
{
#ifdef Q_OS_MAC
return _contextMenuVisibleOsx;
#else
// On some platforms isVisible doesn't work and always returns false,
// elsewhere aboutToHide is unreliable.
if (_workaroundManualVisibility)
return _contextMenuVisibleManual;
return _contextMenu->isVisible();
#endif
}
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");
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()
{
if (_contextMenu) {
@ -512,51 +533,65 @@ void ownCloudGui::setupContextMenu()
return;
}
// Enables workarounds for bugs introduced in Qt 5.5.0
// In particular QTBUG-47863 #3672 (tray menu fails to update and
// becomes unresponsive) and QTBUG-48068 #3722 (click signal is
// emitted several times)
// The Qt version check intentionally uses 5.0.0 (where platformMenu()
// 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
auto applyEnvVariable = [](bool *sw, const QByteArray &value) {
if (value == "1")
*sw = true;
if (value == "0")
*sw = false;
};
if (forceQDBusTrayWorkaround() == "1") {
_qdbusmenuWorkaround = true;
} else if (forceQDBusTrayWorkaround() == "0") {
_qdbusmenuWorkaround = false;
// This is an old compound flag that people might still depend on
bool qdbusmenuWorkarounds = false;
applyEnvVariable(&qdbusmenuWorkarounds, envForceQDBusTrayWorkaround());
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
// https://bugreports.qt.io/browse/QTBUG-54633
connect(_contextMenu.data(), SIGNAL(aboutToShow()), SLOT(slotContextMenuAboutToShow()));
connect(_contextMenu.data(), SIGNAL(aboutToHide()), SLOT(slotContextMenuAboutToHide()));
#else
connect(_contextMenu.data(), &QMenu::aboutToShow, this, &ownCloudGui::updateContextMenu);
// https://bugreports.qt.io/browse/QTBUG-54633
_workaroundNoAboutToShowUpdate = true;
_workaroundManualVisibility = true;
#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.
updateContextMenu();
@ -568,13 +603,21 @@ void ownCloudGui::updateContextMenu()
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)
// we need to hide and show the tray icon. We don't want to do that
// while it's visible!
if (contextMenuVisible()) {
if (!_workaroundBatchTrayUpdate.isActive()) {
_workaroundBatchTrayUpdate.start();
if (!_delayedTrayUpdateTimer.isActive()) {
_delayedTrayUpdateTimer.start();
}
return;
}
@ -667,35 +710,30 @@ void ownCloudGui::updateContextMenu()
}
_contextMenu->addAction(_actionQuit);
if (_qdbusmenuWorkaround) {
if (_workaroundShowAndHideTray) {
_tray->show();
}
}
void ownCloudGui::updateContextMenuNeeded()
{
// For the workaround case updating while visible is impossible. Instead
// occasionally update the menu when it's invisible.
if (_qdbusmenuWorkaround) {
if (!_workaroundBatchTrayUpdate.isActive()) {
_workaroundBatchTrayUpdate.start();
}
// if it's visible and we can update live: update now
if (contextMenuVisible() && updateWhileVisible()) {
// Note: don't update while visible on OSX
// https://bugreports.qt.io/browse/QTBUG-54845
updateContextMenu();
return;
}
#ifdef Q_OS_MAC
// https://bugreports.qt.io/browse/QTBUG-54845
// We cannot update on demand or while visible -> update when invisible.
if (!contextMenuVisible()) {
updateContextMenu();
// if we can't lazily update: update later
if (_workaroundNoAboutToShowUpdate) {
// Note: don't update immediately even in the invisible case
// as that can lead to extremely frequent menu updates
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)

View File

@ -140,9 +140,11 @@ private:
// tray's menu
QScopedPointer<QMenu> _contextMenu;
// Manually tracking whether the context menu is visible, but only works
// on OSX because aboutToHide is not reliable everywhere.
bool _contextMenuVisibleOsx;
// Manually tracking whether the context menu is visible via aboutToShow
// and aboutToHide. Unfortunately aboutToHide isn't reliable everywhere
// so this only gets used with _workaroundManualVisibility (when the tray's
// isVisible() is unreliable)
bool _contextMenuVisibleManual = false;
#ifdef WITH_LIBCLOUDPROVIDERS
QDBusConnection _bus;
@ -150,8 +152,11 @@ private:
QMenu *_recentActionsMenu;
QVector<QMenu *> _accountMenus;
bool _qdbusmenuWorkaround;
QTimer _workaroundBatchTrayUpdate;
bool _workaroundShowAndHideTray = false;
bool _workaroundNoAboutToShowUpdate = false;
bool _workaroundFakeDoubleClick = false;
bool _workaroundManualVisibility = false;
QTimer _delayedTrayUpdateTimer;
QMap<QString, QPointer<ShareDialog>> _shareDialogs;
QAction *_actionNewAccountWizard;

View File

@ -244,6 +244,7 @@ void SettingsDialog::accountAdded(AccountState *s)
_actionGroup->addAction(accountAction);
_actionGroupWidgets.insert(accountAction, accountSettings);
_actionForAccount.insert(s->account().data(), accountAction);
accountAction->trigger();
connect(accountSettings, &AccountSettings::folderChanged, _gui, &ownCloudGui::slotFoldersChanged);
connect(accountSettings, &AccountSettings::openFolderAlias,

View File

@ -167,6 +167,7 @@ void SettingsDialogMac::accountAdded(AccountState *s)
_activitySettings[s]->setNotificationRefreshInterval(cfg.notificationRefreshInterval());
slotRefreshActivity(s);
setCurrentPanelIndex(0);
}
void SettingsDialogMac::accountRemoved(AccountState *s)

View File

@ -87,6 +87,7 @@ ShareUserGroupWidget::ShareUserGroupWidget(AccountPtr account,
connect(_manager, &ShareManager::shareCreated, this, &ShareUserGroupWidget::getShares);
connect(_manager, &ShareManager::serverError, this, &ShareUserGroupWidget::displayError);
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);
// By making the next two QueuedConnections we can override

View File

@ -1,5 +1,4 @@
// This file is generated by kxml_compiler from occinfo.xml.
// All changes you do to this file will be lost.
#include "updateinfo.h"
#include "updater.h"
@ -83,24 +82,6 @@ UpdateInfo UpdateInfo::parseElement(const QDomElement &element, bool *ok)
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)
{
QFile file(filename);
@ -149,23 +130,4 @@ UpdateInfo UpdateInfo::parseString(const QString &xml, bool *ok)
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

View File

@ -1,5 +1,4 @@
// This file is generated by kxml_compiler from occinfo.xml.
// All changes you do to this file will be lost.
#ifndef UPDATEINFO_H
#define UPDATEINFO_H
@ -24,10 +23,8 @@ public:
Parse XML object from DOM element.
*/
static UpdateInfo parseElement(const QDomElement &element, bool *ok);
void writeElement(QXmlStreamWriter &xml);
static UpdateInfo parseFile(const QString &filename, bool *ok);
static UpdateInfo parseString(const QString &xml, bool *ok);
bool writeFile(const QString &filename);
private:
QString mVersion;

View File

@ -390,10 +390,9 @@ QByteArray decryptStringSymmetric(const QByteArray& key, const QByteArray& data)
return result;
}
QByteArray privateKeyToPem(const QSslKey key) {
QByteArray privateKeyToPem(const QByteArray key) {
BIO *privateKeyBio = BIO_new(BIO_s_mem());
QByteArray privateKeyPem = key.toPem();
BIO_write(privateKeyBio, privateKeyPem.constData(), privateKeyPem.size());
BIO_write(privateKeyBio, key.constData(), key.size());
EVP_PKEY *pkey = PEM_read_bio_PrivateKey(privateKeyBio, NULL, NULL, NULL);
BIO *pemBio = BIO_new(BIO_s_mem());
@ -694,7 +693,8 @@ void ClientSideEncryption::privateKeyFetched(Job *incoming) {
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()) {
getPrivateKeyFromServer();
@ -723,7 +723,7 @@ void ClientSideEncryption::mnemonicKeyFetched(QKeychain::Job *incoming) {
if (readJob->error() != NoError || readJob->textData().length() == 0) {
_certificate = QSslCertificate();
_publicKey = QSslKey();
_privateKey = QSslKey();
_privateKey = QByteArray();
getPublicKeyFromServer();
return;
}
@ -745,7 +745,7 @@ void ClientSideEncryption::writePrivateKey() {
WritePasswordJob *job = new WritePasswordJob(Theme::instance()->appName());
job->setInsecureFallback(false);
job->setKey(kck);
job->setBinaryData(_privateKey.toPem());
job->setBinaryData(_privateKey);
connect(job, &WritePasswordJob::finished, [this](Job *incoming) {
Q_UNUSED(incoming);
qCInfo(lcCse()) << "Private key stored in keychain";
@ -791,7 +791,7 @@ void ClientSideEncryption::writeMnemonic() {
void ClientSideEncryption::forgetSensitiveData()
{
_privateKey = QSslKey();
_privateKey = QByteArray();
_certificate = QSslCertificate();
_publicKey = QSslKey();
_mnemonic = QString();
@ -859,7 +859,8 @@ void ClientSideEncryption::generateKeyPair()
return;
}
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.";
generateCSR(localKeyPair);
@ -1025,9 +1026,10 @@ void ClientSideEncryption::decryptPrivateKey(const QByteArray &key) {
qCInfo(lcCse()) << "Generated key:" << pass;
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()) {
writePrivateKey();
@ -1037,7 +1039,7 @@ void ClientSideEncryption::decryptPrivateKey(const QByteArray &key) {
}
} else {
_mnemonic = QString();
_privateKey = QSslKey();
_privateKey = QByteArray();
qCInfo(lcCse()) << "Cancelled";
break;
}
@ -1226,7 +1228,7 @@ QByteArray FolderMetadata::encryptMetadataKey(const QByteArray& data) const {
QByteArray FolderMetadata::decryptMetadataKey(const QByteArray& encryptedMetadata) const
{
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());
EVP_PKEY *key = PEM_read_bio_PrivateKey(privateKeyBio, NULL, NULL, NULL);

View File

@ -47,7 +47,7 @@ namespace EncryptionHelper {
const QByteArray& data
);
QByteArray privateKeyToPem(const QSslKey key);
QByteArray privateKeyToPem(const QByteArray key);
//TODO: change those two EVP_PKEY into QSslKey.
QByteArray encryptStringAsymmetric(
@ -122,7 +122,8 @@ private:
QMap<QString, bool> _folder2encryptedStatus;
public:
QSslKey _privateKey;
//QSslKey _privateKey;
QByteArray _privateKey;
QSslKey _publicKey;
QSslCertificate _certificate;
QString _mnemonic;

View File

@ -379,11 +379,12 @@ bool HttpCredentials::refreshAccessToken()
QJsonParseError jsonParseError;
QJsonObject json = QJsonDocument::fromJson(jsonData, &jsonParseError).object();
QString accessToken = json["access_token"].toString();
if (reply->error() != QNetworkReply::NoError || jsonParseError.error != QJsonParseError::NoError || json.isEmpty()) {
// Network error maybe?
if (jsonParseError.error != QJsonParseError::NoError || json.isEmpty()) {
// Invalid or empty JSON: Network error maybe?
qCWarning(lcHttpCredentials) << "Error while refreshing the token" << reply->errorString() << jsonData << jsonParseError.errorString();
} else if (accessToken.isEmpty()) {
// The token is no longer valid.
// If the json was valid, but the reply did not contain an access token, the token
// is considered expired. (Usually the HTTP reply code is 400)
qCDebug(lcHttpCredentials) << "Expired refresh token. Logging out";
_refreshToken.clear();
} else {

View File

@ -361,6 +361,10 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, con
}
if (map.contains("data-fingerprint")) {
_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 {
// Remove <webDAV-Url>/folder/ from <webDAV-Url>/folder/subfile.txt
@ -377,13 +381,11 @@ void DiscoverySingleDirectoryJob::directoryListingIteratedSlot(QString file, con
std::unique_ptr<csync_file_stat_t> file_stat(new csync_file_stat_t);
file_stat->path = file.toUtf8();
file_stat->size = -1;
file_stat->modtime = -1;
propertyMapToFileStat(map, file_stat.get());
if (file_stat->type == ItemTypeDirectory)
file_stat->size = 0;
if (file_stat->type == ItemTypeSkip
|| file_stat->size == -1
|| file_stat->modtime == -1
|| file_stat->remotePerm.isNull()
|| file_stat->etag.isEmpty()
|| file_stat->file_id.isEmpty()) {

View File

@ -149,6 +149,7 @@ void GETFileJob::newReplyHook(QNetworkReply *reply)
connect(reply, &QNetworkReply::metaDataChanged, this, &GETFileJob::slotMetaDataChanged);
connect(reply, &QIODevice::readyRead, this, &GETFileJob::slotReadyRead);
connect(reply, &QNetworkReply::finished, this, &GETFileJob::slotReadyRead);
connect(reply, &QNetworkReply::downloadProgress, this, &GETFileJob::downloadProgress);
}

View File

@ -837,6 +837,11 @@ void SyncEngine::startSync()
// 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();
_excludedFiles->setExcludeConflictFiles(!_account->capabilities().uploadConflictFiles());
@ -1042,10 +1047,9 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult)
}
auto databaseFingerprint = _journal->dataFingerprint();
// If databaseFingerprint is null, this means that there was no information in the database
// (for example, upgrading from a previous version, or first sync)
// Note that an empty ("") fingerprint is valid and means it was empty on the server before.
if (!databaseFingerprint.isNull()
// If databaseFingerprint is empty, this means that there was no information in the database
// (for example, upgrading from a previous version, or first sync, or server not supporting fingerprint)
if (!databaseFingerprint.isEmpty()
&& _discoveryMainThread->_dataFingerprint != databaseFingerprint) {
qCInfo(lcEngine) << "data fingerprint changed, assume restore from backup" << databaseFingerprint << _discoveryMainThread->_dataFingerprint;
restoreOldFiles(syncItems);

View File

@ -141,7 +141,7 @@ QIcon Theme::themeIcon(const QString &name, bool sysTray, bool sysTrayMenuVisibl
}
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) {
QString pixmapName = QString::fromLatin1(":/client/theme/%1/%2-%3.png").arg(flavor).arg(name).arg(size);
if (QFile::exists(pixmapName)) {

View File

@ -728,9 +728,18 @@ public:
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, _httpErrorCode);
setError(InternalServerError, "Internal Server Fake Error");
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();
}
public:
void abort() override { }
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
namespace OCC {
inline char *toString(const SyncFileStatus &s) {

View File

@ -151,6 +151,76 @@ private slots:
QCOMPARE(fakeFolder.currentLocalState(), 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)

View File

@ -113,7 +113,8 @@ public:
Utility::writeRandomFile( _rootPath+"/a2/renamefile");
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))));
}

View File

@ -22,7 +22,7 @@ signals:
void hooked(const QUrl &);
public:
DesktopServiceHook() { QDesktopServices::setUrlHandler("oauthtest", this, "hooked"); }
} desktopServiceHook;
};
static const QUrl sOAuthTestServer("oauthtest://someserver/owncloud");
@ -90,6 +90,7 @@ public:
class OAuthTestCase : public QObject
{
Q_OBJECT
DesktopServiceHook desktopServiceHook;
public:
enum State { StartState, BrowserOpened, TokenAsked, CustomState } state = StartState;
Q_ENUM(State);

292
test/testpermissions.cpp Normal file
View 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"

View File

@ -255,7 +255,8 @@ private slots:
} else if(item->_file == "Y/Z/d3") {
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.
}
}

View File

@ -576,6 +576,51 @@ private slots:
//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)

4193
translations/client_bg.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -388,7 +388,7 @@
<message>
<location filename="../src/gui/accountstate.cpp" line="138"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
<translation>Ερώτηση πιστοποιητικών</translation>
</message>
<message>
<location filename="../src/gui/accountstate.cpp" line="140"/>

View File

@ -388,7 +388,7 @@
<message>
<location filename="../src/gui/accountstate.cpp" line="138"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
<translation>Kysytään tilitietoja</translation>
</message>
<message>
<location filename="../src/gui/accountstate.cpp" line="140"/>
@ -1389,7 +1389,7 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<message>
<location filename="../src/gui/issueswidget.ui" line="20"/>
<source>List of issues</source>
<translation type="unfinished"/>
<translation>Lista ongelmista</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="34"/>
@ -1426,7 +1426,7 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<message>
<location filename="../src/gui/issueswidget.ui" line="155"/>
<source>Copy the issues list to the clipboard.</source>
<translation type="unfinished"/>
<translation>Kopioi ongelmalista leikepöydälle.</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="158"/>
@ -1446,7 +1446,7 @@ Kohteet, joiden poisto on sallittu, poistetaan, jos ne estävät kansion poistam
<message>
<location filename="../src/gui/issueswidget.cpp" line="84"/>
<source>Issue</source>
<translation type="unfinished"/>
<translation>Ongelma</translation>
</message>
</context>
<context>
@ -1878,7 +1878,7 @@ for additional privileges during the process.</source>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
<translation>Kirjaudu selaimellasi</translation>
</message>
</context>
<context>

View File

@ -2082,7 +2082,7 @@ Il est déconseillé de l&apos;utiliser.</translation>
<message>
<location filename="../src/gui/wizard/owncloudwizard.cpp" line="93"/>
<source>Skip folders configuration</source>
<translation>Passer outre la configuration des dossiers</translation>
<translation>Ignorer la configuration des dossiers</translation>
</message>
</context>
<context>

View File

@ -373,7 +373,7 @@
<message>
<location filename="../src/gui/accountstate.cpp" line="132"/>
<source>Maintenance mode</source>
<translation>Karbantartó üzemmód</translation>
<translation>Karbantartási üzemmód</translation>
</message>
<message>
<location filename="../src/gui/accountstate.cpp" line="134"/>
@ -2005,7 +2005,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="526"/>
<source>The remote folder %1 already exists. Connecting it for syncing.</source>
<translation>A %1 távoli mappa már létezik. Csatlakoztassa a szinkronizációhoz.</translation>
<translation>A %1 távoli mappa már létezik. Csatlakoztasd a szinkronizációhoz!</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="528"/>
@ -3673,7 +3673,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="710"/>
<source>New account...</source>
<translation type="unfinished"/>
<translation>Új fiók...</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="728"/>

View File

@ -3653,7 +3653,7 @@ Ekki er mælt með því að hún sé notuð.
<message>
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
<source>Resume all folders</source>
<translation type="unfinished"/>
<translation>Halda áfram með allar möppur</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
@ -3663,12 +3663,12 @@ Ekki er mælt með því að hún sé notuð.
<message>
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
<source>Resume all synchronization</source>
<translation type="unfinished"/>
<translation>Halda áfram með alla samstillingu</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
<source>Resume synchronization</source>
<translation type="unfinished"/>
<translation>Halda áfram með samstillingu</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="609"/>

View File

@ -335,7 +335,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="605"/>
<source>%1 of %2 in use</source>
<translation>%1% di %2 in uso</translation>
<translation>%1 di %2 in uso</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="614"/>

4207
translations/client_lt_LT.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -768,7 +768,10 @@
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 delete the files, they will be unavailable to you, unless you are the owner.</source>
<translation type="unfinished"/>
<translation>Alle bestanden in de syncmap &apos;%1&apos; werden verwijderd van de server.
Deze verwijderingen worden gesynchroniseerd naar uw lokale syncmap, waardoor deze bestanden niet meer beschikbaar zijn, tenzij u het recht hebt om ze te herstellen.
Als u de bestanden wilt behouden, worden ze opnieuw gesynchroniseerd met de server als u die autorisatie hebt.
Als u de bestanden wilt verwijderen, worden ze niet beschikbaar, tenzij u de eigenaar bent.</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="932"/>
@ -2758,7 +2761,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Wil je echt de openbare deellink &lt;i&gt;%1&lt;/i&gt; verwijderen?&lt;/p&gt;&lt;p&gt;let op: Dit kan niet ongedaan worden gemaakt.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
@ -2774,7 +2777,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
<source>Delete link share</source>
<translation type="unfinished"/>
<translation>Verwijder deellink</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
@ -2802,12 +2805,12 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Je kunt mensen naar dit gedeelde bestand of deze gedeeld map sturen &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;door ze een privé-link te geven&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
<translation>Dit wordt niet gedeeld met enige gebruikers of groepen</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
@ -3218,7 +3221,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="264"/>
<source>%1 (skipped due to earlier error, trying again in %2)</source>
<translation type="unfinished"/>
<translation>%1 (overgeslagen wegens een eerdere fout, probeer opnieuw over %2)</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="474"/>
@ -3228,7 +3231,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="477"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
<translation>Mappenhiërarchie is te diep</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="493"/>
@ -3244,7 +3247,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="812"/>
<source>Unable to open or create the local sync database. Make sure you have write access in the sync folder.</source>
<translation type="unfinished"/>
<translation>Kon de lokale sync-database niet openen of aanmaken. Zorg ervoor dat je schrijf-toegang hebt in de sync-map</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1290"/>
@ -3259,12 +3262,12 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1600"/>
<source>Disk space is low: Downloads that would reduce free space below %1 were skipped.</source>
<translation type="unfinished"/>
<translation>Schijfruimte laa: Downloads die de vrije ruimte tot onder %1 zouden reduceren, zijn overgeslagen.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1607"/>
<source>There is insufficient space available on the server for some uploads.</source>
<translation type="unfinished"/>
<translation>Onvoldoende schijfruimte op de server voor sommige uploads.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="167"/>
@ -3354,7 +3357,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="480"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
<translation>De bestandsnaam kan je bestandssysteem niet worden gecodeerd.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="489"/>
@ -3641,12 +3644,12 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="314"/>
<source>No sync folders configured</source>
<translation type="unfinished"/>
<translation>Geen syncmappen geconfigureerd</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
<source>Resume all folders</source>
<translation type="unfinished"/>
<translation>Doorgaan met alle mappen</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
@ -3656,12 +3659,12 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
<source>Resume all synchronization</source>
<translation type="unfinished"/>
<translation>Doorgaan met alle synchronisaties</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
<source>Resume synchronization</source>
<translation type="unfinished"/>
<translation>Doorgaan met synchronisatie</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
@ -3846,12 +3849,12 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="36"/>
<source>Please switch to your browser to proceed.</source>
<translation type="unfinished"/>
<translation>Schakel om naar je browser om door te gaan.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="46"/>
<source>An error occured while connecting. Please try again.</source>
<translation type="unfinished"/>
<translation>Er trad een verbindingsfout op. Probeer nogmaals.</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.ui" line="56"/>
@ -4188,7 +4191,7 @@ We adviseren deze site niet te gebruiken.</translation>
<message>
<location filename="../src/gui/guiutility.cpp" line="34"/>
<source>There was an error when launching the browser to go to URL %1. Maybe no default browser is configured?</source>
<translation type="unfinished"/>
<translation>Er trad een fout op bij het starten van de browser om naar URL %1 te gaan. Misschien is er geen standaardbrowser geconfigureerd?</translation>
</message>
<message>
<location filename="../src/gui/guiutility.cpp" line="55"/>

View File

@ -2063,7 +2063,7 @@ Não é aconselhável usá-la.</translation>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
<source>Can&apos;t remove and back up the folder because the folder or a file in it is open in another program. Please close the folder or file and hit retry or cancel the setup.</source>
<translation>Não é possível remover e fazer backup da pasta porque a pasta ou um arquivo estão abertos em outro programa. Por favor, feche a pasta ou arquivo e tente novamente ou cancele a operação.</translation>
<translation>Não é possível remover e fazer backup da pasta porque a pasta ou um arquivo estão abertos em outro programa. Feche a pasta ou arquivo e tente novamente ou cancele a operação.</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
@ -3941,7 +3941,7 @@ Não é aconselhável usá-la.</translation>
<message numerus="yes">
<location filename="../src/common/utility.cpp" line="456"/>
<source>%n minute(s) ago</source>
<translation><numerusform>%n minuto atrás</numerusform><numerusform>%n minutos atrás</numerusform></translation>
<translation><numerusform>%n minuto(s) atrás</numerusform><numerusform>%n minuto(s) atrás</numerusform></translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="459"/>

View File

@ -253,7 +253,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="667"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
<translation>Získavam autorizáciu z prehliadača. &lt;a href=&apos;%1&apos;&gt;Kliknite sem&lt;/a&gt; na opätovné otvorenie prehliadača.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="671"/>
@ -388,7 +388,7 @@
<message>
<location filename="../src/gui/accountstate.cpp" line="138"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
<translation>Zisťujem prihlasovacie údaje</translation>
</message>
<message>
<location filename="../src/gui/accountstate.cpp" line="140"/>
@ -496,22 +496,22 @@
<message numerus="yes">
<location filename="../src/gui/activitywidget.cpp" line="349"/>
<source>You received %n new notification(s) from %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Prijali ste %n novú notifikáciu od %2.</numerusform><numerusform>Prijali ste %n nové notifikácie od %2.</numerusform><numerusform>Prijali ste %n nových notifikácií od %2.</numerusform><numerusform>Prijali ste %n nových notifikácií od %2.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/activitywidget.cpp" line="356"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Prijali ste %n novú notifikáciu od %1 a %2.</numerusform><numerusform>Prijali ste %n nové notifikácie od %1 a %2.</numerusform><numerusform>Prijali ste %n nových notifikácií od %1 a %2.</numerusform><numerusform>Prijali ste %n nových notifikácií od %1 a %2.</numerusform></translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="358"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
<translation>Prijali ste nové notifikácie od %1, %2 a iných účtov.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="362"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
<translation>%1 Notifikácií - vyžaduje sa akcia</translation>
</message>
</context>
<context>
@ -562,7 +562,7 @@
<message>
<location filename="../src/gui/application.cpp" line="165"/>
<source>There was an error while accessing the configuration file at %1.</source>
<translation type="unfinished"/>
<translation>Chyba pri prístupe ku konfiguračnému súboru %1.</translation>
</message>
<message>
<location filename="../src/gui/application.cpp" line="168"/>
@ -691,42 +691,42 @@
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="364"/>
<source>%1 and %n other file(s) have been removed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 a %n iný súbor bol odstránený.</numerusform><numerusform>%1 a %n iné súbory boli odstránené.</numerusform><numerusform>%1 a %n iných súborov bolo odstránených.</numerusform><numerusform>%1 a %n iných súborov bolo odstránených.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="371"/>
<source>%1 and %n other file(s) have been downloaded.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 a %n iný súbor bol stiahnutý.</numerusform><numerusform>%1 a %n iné súbory boli stiahnuté.</numerusform><numerusform>%1 a %n iných súborov bolo stiahnutých.</numerusform><numerusform>%1 a %n iných súborov bolo stiahnutých.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="378"/>
<source>%1 and %n other file(s) have been updated.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 a %n iný súbor bol nahratý.</numerusform><numerusform>%1 a %n iné súbory boli nahraté.</numerusform><numerusform>%1 a %n iných súborov bolo nahratých.</numerusform><numerusform>%1 a %n iných súborov bolo nahratých.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="385"/>
<source>%1 has been renamed to %2 and %n other file(s) have been renamed.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 bol premenovaný na %2 a %n iný súbor bol premenovaný.</numerusform><numerusform>%1 bol premenovaný na %2 a %n iné súbory boli premenované.</numerusform><numerusform>%1 bol premenovaný na %2 a %n iných súborov bolo premenovaných.</numerusform><numerusform>%1 bol premenovaný na %2 a %n iných súborov bolo premenovaných.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="392"/>
<source>%1 has been moved to %2 and %n other file(s) have been moved.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 bol presunuý do %2 a %n iných súbor bol presunutý.</numerusform><numerusform>%1 bol presunuý do %2 a %n iné súbory boli presunuté.</numerusform><numerusform>%1 bol presunuý do %2 a %n iných súborov bolo presunutých.</numerusform><numerusform>%1 bol presunuý do %2 a %n iných súborov bolo presunutých.</numerusform></translation>
</message>
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="399"/>
<source>%1 has and %n other file(s) have sync conflicts.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 a %n iný súbor synchronizačný konflikt.</numerusform><numerusform>%1 a %n iné súbory majú synchronizačný konflikt.</numerusform><numerusform>%1 a %n iných súborov synchronizačný konflikt.</numerusform><numerusform>%1 a %n iných súborov synchronizačný konflikt.</numerusform></translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="401"/>
<source>%1 has a sync conflict. Please check the conflict file!</source>
<translation type="unfinished"/>
<translation>%1 synchronizačný konflikt. Prosím skontrolujte konfliktný súbor!</translation>
</message>
<message numerus="yes">
<location filename="../src/gui/folder.cpp" line="406"/>
<source>%1 and %n other file(s) could not be synced due to errors. See the log for details.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>%1 a %n iný súbor nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.</numerusform><numerusform>%1 a %n iné súbory nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.</numerusform><numerusform>%1 a %n iných súborov nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.</numerusform><numerusform>%1 a %n iných súborov nie je možné synchronizovať kvôli chybe. Skontrolujte log pre podrobnosti.</numerusform></translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="408"/>
@ -933,7 +933,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="46"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
<translation>Pridať prepojenie priečinka</translation>
</message>
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
@ -993,7 +993,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
<translation>Zosúladenie zmien</translation>
</message>
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
@ -1091,7 +1091,7 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/folderwizard.cpp" line="548"/>
<source>Add Folder Sync Connection</source>
<translation type="unfinished"/>
<translation>Pridať prepojenie priečinka</translation>
</message>
<message>
<location filename="../src/gui/folderwizard.cpp" line="550"/>
@ -1242,12 +1242,12 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<message>
<location filename="../src/gui/generalsettings.ui" line="26"/>
<source>&amp;Launch on System Startup</source>
<translation type="unfinished"/>
<translation>Spustiť pri štarte systému</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="33"/>
<source>Show &amp;Desktop Notifications</source>
<translation type="unfinished"/>
<translation>Zobrazovať notifikácie</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="43"/>
@ -1400,7 +1400,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<location filename="../src/gui/issueswidget.ui" line="42"/>
<location filename="../src/gui/issueswidget.ui" line="61"/>
<source>&lt;no filter&gt;</source>
<translation type="unfinished"/>
<translation>&lt;no filter&gt;</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="50"/>
@ -1446,7 +1446,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/issueswidget.cpp" line="84"/>
<source>Issue</source>
<translation type="unfinished"/>
<translation>Problémy</translation>
</message>
</context>
<context>
@ -2891,7 +2891,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/gui/creds/shibboleth/shibbolethwebview.cpp" line="93"/>
<source>SSL Chipher Debug View</source>
<translation type="unfinished"/>
<translation>Debug zobrazenie šifrovania SSL</translation>
</message>
<message>
<location filename="../src/gui/creds/shibboleth/shibbolethwebview.cpp" line="101"/>
@ -2915,7 +2915,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/gui/socketapi.cpp" line="557"/>
<source>I shared something with you</source>
<translation type="unfinished"/>
<translation>Niečo som vám sprístupnil</translation>
</message>
<message>
<location filename="../src/gui/socketapi.cpp" line="565"/>
@ -3035,7 +3035,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/gui/sslbutton.cpp" line="215"/>
<source>No support for SSL session tickets/identifiers</source>
<translation type="unfinished"/>
<translation>Nie je dostupná podpora tiketov/identifikátorov SSL sedenia</translation>
</message>
<message>
<location filename="../src/gui/sslbutton.cpp" line="225"/>
@ -3070,7 +3070,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="132"/>
<source>Cannot connect securely to &lt;i&gt;%1&lt;/i&gt;:</source>
<translation type="unfinished"/>
<translation>Nie je možné sa bezpečne pripojiť k &lt;i&gt;%1&lt;/i&gt;:</translation>
</message>
<message>
<location filename="../src/gui/sslerrordialog.cpp" line="166"/>
@ -3865,7 +3865,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="86"/>
<source>Ser&amp;ver Address</source>
<translation type="unfinished"/>
<translation>Adresa servera</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudsetupnocredspage.ui" line="102"/>
@ -4070,7 +4070,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="50"/>
<source>Updated local metadata</source>
<translation type="unfinished"/>
<translation>Aktualizované lokálne metadáta</translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="53"/>
@ -4112,7 +4112,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="81"/>
<source>updating local metadata</source>
<translation type="unfinished"/>
<translation>aktualizujú sa lokálne metadáta</translation>
</message>
</context>
<context>
@ -4183,7 +4183,7 @@ Nie je vhodné ju používať.</translation>
<message>
<location filename="../src/gui/guiutility.cpp" line="55"/>
<source>Could not open email client</source>
<translation type="unfinished"/>
<translation>Nepodarilo sa otvoriť emailového klienta</translation>
</message>
<message>
<location filename="../src/gui/guiutility.cpp" line="56"/>

View File

@ -14,7 +14,7 @@
<message>
<location filename="../src/gui/folderwizardsourcepage.ui" line="44"/>
<source>&amp;Choose...</source>
<translation>&amp;Izberi ...</translation>
<translation>&amp;Izbor ...</translation>
</message>
</context>
<context>
@ -27,7 +27,7 @@
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="131"/>
<source>Select a remote destination folder</source>
<translation>Izberite oddaljeno ciljno mapo.</translation>
<translation>Izbor oddaljene ciljne mape</translation>
</message>
<message>
<location filename="../src/gui/folderwizardtargetpage.ui" line="143"/>
@ -153,12 +153,12 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="195"/>
<source>Add new</source>
<translation>Dodaj novo</translation>
<translation>Dodaj nov račun</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="203"/>
<source>Remove</source>
<translation>Odstrani</translation>
<translation>Odstrani račun</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="207"/>
@ -183,7 +183,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="316"/>
<source>Remove folder sync connection</source>
<translation>Odstrani povezavo mape usklajevanja</translation>
<translation>Odstrani povezavo za usklajevanje mape</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="387"/>
@ -203,7 +203,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="445"/>
<source>Remove Folder Sync Connection</source>
<translation>Odstrani povezavo usklajevanja mape</translation>
<translation>Odstrani povezavo za usklajevanje mape</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="527"/>
@ -233,7 +233,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="652"/>
<source>Connected to %1.</source>
<translation>Povezano z %1.</translation>
<translation>Vzpostavljena je povezava z %1.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="654"/>
@ -243,7 +243,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="656"/>
<source>Server %1 is currently in maintenance mode.</source>
<translation type="unfinished"/>
<translation>Strežnik %1 je trenutno v načinu vzdrževanja.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="658"/>
@ -253,7 +253,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="667"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
<translation>Poteka pridobitev overitve prek brskalnika. &lt;a href=&apos;%1&apos;&gt;Kliknite&lt;/a&gt; to za ponovno odpiranje brskalnika.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="671"/>
@ -263,7 +263,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="674"/>
<source>No connection to %1 at %2.</source>
<translation>Ni povezave z %1 pri %2.</translation>
<translation>S strežnikom %1 ni vzpostavljene povezave (%2).</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="698"/>
@ -288,12 +288,12 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="834"/>
<source>Confirm Account Removal</source>
<translation>Potrdi odstranitev računa</translation>
<translation>Potrdi odstranjevanje računa</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="835"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation>&lt;p&gt;Ali res želite odstraniti povezavo z računom &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Opomba:&lt;/b&gt; S tem &lt;b&gt;ne bo&lt;/b&gt; izbrisana nobena datoteka.&lt;/p&gt;</translation>
<translation>&lt;p&gt;Ali res želite odstraniti povezavo z računom &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Opomba:&lt;/b&gt; odstranitev ovezave &lt;b&gt;ne izbriše&lt;/b&gt; nobene datoteke.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="841"/>
@ -310,7 +310,7 @@
<location filename="../src/gui/accountsettings.cpp" line="199"/>
<location filename="../src/gui/accountsettings.cpp" line="700"/>
<source>Log out</source>
<translation>Odjava</translation>
<translation>Odjavi račun</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="313"/>
@ -425,13 +425,13 @@
<message>
<location filename="../src/gui/activitywidget.cpp" line="571"/>
<source>Not Synced</source>
<translation>Ni usklajeno</translation>
<translation>Neusklajeno</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="574"/>
<source>Not Synced (%1)</source>
<extracomment>%1 is the number of not synced files.</extracomment>
<translation>Ni usklajeno (%1)</translation>
<translation>Neusklajeno ( %1 )</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="606"/>
@ -768,7 +768,10 @@
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 delete the files, they will be unavailable to you, unless you are the owner.</source>
<translation type="unfinished"/>
<translation>Vse datoteke v usklajevani mapi »%1« so bile na strežniku izbrisane.
Sprememba bo usklajena tudi s krajevno mapo na disku, zato bodo te datoteke, če ni ustreznih dovoljenj za obnovitev, izgubljene.
V kolikor se odločite datoteke ohraniti in so na voljo ustrezna dovoljenja, bodo te spet usklajene s strežnikom.
Nasprotno, če potrdite izbris in niste lastnik datotek, te ne bodo več na voljo.</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="932"/>
@ -829,7 +832,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/folderman.cpp" line="312"/>
<source>An old sync journal &apos;%1&apos; was found, but could not be removed. Please make sure that no application is currently using it.</source>
<translation>Obstaja starejši dnevnik usklajevanja &apos;%1&apos;, vendar ga ni mogoče odstraniti. Preverite, ali je datoteka v uporabi.</translation>
<translation>Obstaja star dnevnik usklajevanja »%1«, ki pa ga ni mogoče odstraniti. Preverite, ali je datoteka morda v uporabi.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1054"/>
@ -854,7 +857,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<source>Preparing for sync.</source>
<translation>Poteka priprava za usklajevanje.</translation>
<translation>Poteka priprava na usklajevanje.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1274"/>
@ -942,7 +945,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="249"/>
<source>Synchronizing with local folder</source>
<translation>Poteka usklajevanje s krajevno mapo</translation>
<translation>Datoteke so usklajene v krajevni mapi</translation>
</message>
<message>
<location filename="../src/gui/folderstatusdelegate.cpp" line="296"/>
@ -1230,7 +1233,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/generalsettings.ui" line="171"/>
<source>Ask for confirmation before synchronizing folders larger than</source>
<translation>Vprašaj za potrditev pred usklajevanjem map, večjih kot</translation>
<translation>Zahtevaj potrditev pred usklajevanjem map, večjih od</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="191"/>
@ -1261,7 +1264,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/generalsettings.ui" line="147"/>
<source>Edit &amp;Ignored Files</source>
<translation>Uredi &amp;prezrte datoteke</translation>
<translation>Uredi &amp;neusklajevane datoteke</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="232"/>
@ -1272,7 +1275,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<location filename="../src/gui/generalsettings.ui" line="53"/>
<location filename="../src/gui/generalsettings.ui" line="65"/>
<source>About</source>
<translation>O programu...</translation>
<translation>O programu ...</translation>
</message>
<message>
<location filename="../src/gui/generalsettings.ui" line="75"/>
@ -1313,22 +1316,22 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="14"/>
<source>Ignored Files Editor</source>
<translation>Urejevalnik prezrtih datotek</translation>
<translation>Urejevalnik neusklajevanih datotek</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="20"/>
<source>Global Ignore Settings</source>
<translation>Splošne nastavitve prezrtih datotek</translation>
<translation>Splošne nastavitve neusklajevanih datotek</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="26"/>
<source>Sync hidden files</source>
<translation>Uskladi tudi skrite datoteke</translation>
<translation>Usklajuj tudi skrite datoteke</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="36"/>
<source>Files Ignored by Patterns</source>
<translation>Datoteke, prezrte po vzorcu</translation>
<translation>Maske neusklajevanih datotek</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="55"/>
@ -1338,7 +1341,7 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="75"/>
<source>Pattern</source>
<translation>Vzorec</translation>
<translation>Maska</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.ui" line="80"/>
@ -1355,9 +1358,9 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<source>Files or folders matching a pattern will not be synchronized.
Items where deletion is allowed will be deleted if they prevent a directory from being removed. This is useful for meta data.</source>
<translation>Datoteke in mape, ki so skladne z vzorcem, ne bodo usklajevane.
<translation>Datoteke in mape, ki so skladne z masko, ne bodo usklajevane.
Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi njih brisanje mape ni mogoče. Možnost je uporabna pri metapodatkih.</translation>
Predmeti v mapah, ki jih je dovoljeno izbrisati, bodo odstranjeni, če preprečujejo brisanje mape. Možnost je uporabna pri odstranjevanju metapodatkov.</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="117"/>
@ -1372,12 +1375,12 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="145"/>
<source>Add Ignore Pattern</source>
<translation>Dodaj vzorec za izpuščanje</translation>
<translation>Dodaj masko za neusklajevanje</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="146"/>
<source>Add a new ignore pattern:</source>
<translation>Dodaj nov vzorec za izpuščanje:</translation>
<translation>Dodaj novo masko za neusklajevanje:</translation>
</message>
<message>
<location filename="../src/gui/ignorelisteditor.cpp" line="47"/>
@ -1422,7 +1425,7 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<message>
<location filename="../src/gui/issueswidget.ui" line="83"/>
<source>Show ignored files</source>
<translation>Pokaži prezrte datoteke</translation>
<translation>Pokaži neusklajevane datoteke</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="133"/>
@ -1475,7 +1478,7 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<message>
<location filename="../src/gui/logbrowser.cpp" line="89"/>
<source>&amp;Capture debug messages</source>
<translation type="unfinished"/>
<translation>&amp;Zajemi sporočila razhroščevanja</translation>
</message>
<message>
<location filename="../src/gui/logbrowser.cpp" line="101"/>
@ -1599,7 +1602,7 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<message>
<location filename="../src/gui/networksettings.ui" line="190"/>
<source>Download Bandwidth</source>
<translation>Pasovna širina prejemanja</translation>
<translation>Hitrost prejemanja</translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="196"/>
@ -1611,24 +1614,24 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<location filename="../src/gui/networksettings.ui" line="241"/>
<location filename="../src/gui/networksettings.ui" line="320"/>
<source>KBytes/s</source>
<translation>KBajtov/s</translation>
<translation>kbajtov/s</translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="203"/>
<location filename="../src/gui/networksettings.ui" line="292"/>
<source>No limit</source>
<translation>Ni omejitve</translation>
<translation>Brez omejitve</translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="250"/>
<location filename="../src/gui/networksettings.ui" line="282"/>
<source>Limit to 3/4 of estimated bandwidth</source>
<translation>Omeji prenos na 3/4 ocenjene pasovne širine</translation>
<translation>Omeji prenos na 3/4 ocenjene hitrosti</translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="269"/>
<source>Upload Bandwidth</source>
<translation>Pasovna širina pošiljanja</translation>
<translation>Hitrost pošiljanja</translation>
</message>
<message>
<location filename="../src/gui/networksettings.ui" line="253"/>
@ -1692,7 +1695,7 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<message>
<location filename="../src/gui/creds/oauth.cpp" line="112"/>
<source>Error returned from the server: &lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
<translation>S strežnika je prejet odziv o napaki: &lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
<location filename="../src/gui/creds/oauth.cpp" line="115"/>
@ -1712,7 +1715,7 @@ Predmeti na mestu, kjer je brisanje dovoljeno, bodo izbisani, v kolikor zaradi n
<message>
<location filename="../src/gui/creds/oauth.cpp" line="125"/>
<source>&lt;h1&gt;Login Error&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;Napaka prijave&lt;/h1&gt;&lt;p&gt;%1&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/creds/oauth.cpp" line="131"/>
@ -1885,7 +1888,7 @@ zahteva skrbniška dovoljenja za dokončanje opravila.</translation>
<message>
<location filename="../src/gui/wizard/owncloudoauthcredspage.cpp" line="44"/>
<source>Login in your browser</source>
<translation type="unfinished"/>
<translation>Prijava v brskalniku</translation>
</message>
</context>
<context>
@ -1963,7 +1966,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="297"/>
<source>The server reported the following error:</source>
<translation type="unfinished"/>
<translation>Strežnik je vrnil napako:</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="452"/>
@ -2060,7 +2063,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="586"/>
<source>Can&apos;t remove and back up the folder because the folder or a file in it is open in another program. Please close the folder or file and hit retry or cancel the setup.</source>
<translation>Mape ni mogoče odstraniti niti ni mogoče ustvariti varnostne kopije, saj je mapa oziroma dokument v njej odprt z drugim programom. Zaprite mapo/dokument ali prekinite namestitev.</translation>
<translation>Mape ni mogoče odstraniti niti ni mogoče ustvariti varnostne kopije, ker je mapa, oziroma dokument v njej, odprt v drugem programu. Zaprite mapo oziroma dokument, ali pa prekinite namestitev.</translation>
</message>
<message>
<location filename="../src/gui/owncloudsetupwizard.cpp" line="631"/>
@ -2125,7 +2128,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="459"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
<translation>Prejem predmetov bi zmanjšal prostor na krajevnem disku pod omejitev.</translation>
</message>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="463"/>
@ -2209,12 +2212,12 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/propagatorjobs.cpp" line="101"/>
<source>Could not remove folder &apos;%1&apos;</source>
<translation>Ni mogoče odstraniti mape &apos;%1&apos;</translation>
<translation>Mape »%1« ni mogoče odstraniti.</translation>
</message>
<message>
<location filename="../src/libsync/propagatorjobs.cpp" line="120"/>
<source>Could not remove %1 because of a local file name clash</source>
<translation>Ni mogoče odstraniti %1 zaradi neskladja s krajevnim imenom datoteke</translation>
<translation>Predmeta »%1« ni mogoče odstraniti zaradi neskladja s krajevnim imenom datoteke.</translation>
</message>
</context>
<context>
@ -2312,7 +2315,7 @@ Uporaba ni priporočljiva.</translation>
<location filename="../src/libsync/propagateupload.cpp" line="186"/>
<location filename="../src/libsync/propagateupload.cpp" line="549"/>
<source>Upload of %1 exceeds the quota for the folder</source>
<translation type="unfinished"/>
<translation>Pošiljanje %1 preseže omejitev, določeno za mapo.</translation>
</message>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="622"/>
@ -2770,7 +2773,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
<source>Delete link share</source>
<translation type="unfinished"/>
<translation>Izbriši povezavo za souporabo</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
@ -2931,12 +2934,12 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/socketapi.cpp" line="567"/>
<source>Copy private link to clipboard</source>
<translation type="unfinished"/>
<translation>Kopiraj zasebno povezavo v odložišče</translation>
</message>
<message>
<location filename="../src/gui/socketapi.cpp" line="568"/>
<source>Send private link by email...</source>
<translation type="unfinished"/>
<translation>Pošlji zasebno povezavo po elektronski pošti ...</translation>
</message>
</context>
<context>
@ -3219,12 +3222,12 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="474"/>
<source>File/Folder is ignored because it&apos;s hidden.</source>
<translation>Datoteka/Mapa je prezrta, ker je skrita.</translation>
<translation>Datoteka/Mapa ni usklajevana, ker je skrita.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="477"/>
<source>Folder hierarchy is too deep</source>
<translation type="unfinished"/>
<translation>Zaznano je preveliko število ravni map</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="493"/>
@ -3320,7 +3323,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="446"/>
<source>File is listed on the ignore list.</source>
<translation>Datoteka je na seznamu prezrtih datotek.</translation>
<translation>Datoteka je na seznamu neusklajevanih datotek.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="450"/>
@ -3396,7 +3399,7 @@ Uporaba ni priporočljiva.</translation>
<location filename="../src/libsync/syncengine.cpp" line="1216"/>
<location filename="../src/libsync/syncengine.cpp" line="1256"/>
<source>Ignored because of the &quot;choose what to sync&quot; blacklist</source>
<translation>Prezrto, ker je predmet označen na črni listi za usklajevanje</translation>
<translation>Predmet ni usklajevan, ker je na »črnem seznamu datotek« za usklajevanje</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="1275"/>
@ -3461,7 +3464,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/theme.cpp" line="315"/>
<source>&lt;p&gt;Version %1. For more information please visit &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</source>
<translation>&lt;p&gt;Različica %1. Za več podrobnosti si oglejte &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
<translation>&lt;p&gt;Različica %1. Podrobnosti so na voljo na spletišču &lt;a href=&apos;%2&apos;&gt;%3&lt;/a&gt;.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/libsync/theme.cpp" line="320"/>
@ -3642,7 +3645,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
<source>Resume all folders</source>
<translation type="unfinished"/>
<translation>Nadaljuj z usklajevanjem vseh map</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
@ -3652,12 +3655,12 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
<source>Resume all synchronization</source>
<translation type="unfinished"/>
<translation>Nadaljuj z vsemi usklajevanji</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
<source>Resume synchronization</source>
<translation type="unfinished"/>
<translation>Nadaljuj z usklajevanjem</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="609"/>
@ -3731,7 +3734,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/owncloudtheme.cpp" line="46"/>
<source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Različica %2. Več podrobnosti je mogoče najti na &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Znane težave in pomoč je na voljo na povezavi &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;small&gt;Avtorstvo: Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt in drugi.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Avtorske pravice ownCloud GmbH&lt;/p&gt;&lt;p&gt;Programski paket je objavljen z dovoljenjem GNU General Public License (GPL), različice 2.0.&lt;br/&gt;Znamka in logotip ownCloud sta blagovni znamki družbe ownCloud GmbH v Združenih državah, drugih državah ali obojih.&lt;/p&gt;</translation>
<translation>&lt;p&gt;Različica %2. Podrobnosti so na voljo na spletišču &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Pomoč za znane težave je na voljo na povezavi &lt;a href=&quot;https://central.owncloud.org/c/desktop-client&quot;&gt;https://central.owncloud.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;small&gt;Avtorstvo: Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt in drugi.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Avtorske pravice ownCloud GmbH&lt;/p&gt;&lt;p&gt;Programski paket je objavljen z dovoljenjem GNU General Public License (GPL), različice 2.0.&lt;br/&gt;Znamka in logotip ownCloud sta blagovni znamki družbe ownCloud GmbH v Združenih državah, drugih državah ali obojih.&lt;/p&gt;</translation>
</message>
</context>
<context>
@ -3770,7 +3773,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="301"/>
<source>Ask for confirmation before synchroni&amp;zing folders larger than</source>
<translation>Vprašaj za potrditev pred usklajevan&amp;jem map, večjih kot</translation>
<translation>Zahtevaj potrditev pred usklajevan&amp;jem map, večjih od</translation>
</message>
<message>
<location filename="../src/gui/wizard/owncloudadvancedsetuppage.ui" line="318"/>
@ -3967,7 +3970,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/common/utility.cpp" line="138"/>
<source>%L1 KB</source>
<translation>%L1 KB</translation>
<translation>%L1 kb</translation>
</message>
<message>
<location filename="../src/common/utility.cpp" line="141"/>
@ -4061,7 +4064,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="44"/>
<source>Ignored</source>
<translation>Prezrto</translation>
<translation>Neusklajeno</translation>
</message>
<message>
<location filename="../src/libsync/progressdispatcher.cpp" line="46"/>
@ -4146,7 +4149,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/theme.cpp" line="72"/>
<source>Sync Success, some files were ignored.</source>
<translation>Usklajevanje je končano, ostajajo pa nerešene težave s posameznimi datotekami.</translation>
<translation>Usklajevanje je končano, nekatere datoteke niso bile usklajene.</translation>
</message>
<message>
<location filename="../src/libsync/theme.cpp" line="75"/>

View File

@ -253,7 +253,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="667"/>
<source>Obtaining authorization from the browser. &lt;a href=&apos;%1&apos;&gt;Click here&lt;/a&gt; to re-open the browser.</source>
<translation type="unfinished"/>
<translation>Дохватам ауторизацију из веб читача. &lt;a href=&apos;%1&apos;&gt;Кликните овде&lt;/a&gt; да поново отворите веб читач.</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="671"/>
@ -293,7 +293,7 @@
<message>
<location filename="../src/gui/accountsettings.cpp" line="835"/>
<source>&lt;p&gt;Do you really want to remove the connection to the account &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; This will &lt;b&gt;not&lt;/b&gt; delete any files.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Да ли стварно желите да уклоните везу ка налогу &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;&lt;b&gt;Белешка:&lt;/b&gt; Овим &lt;b&gt;нећете&lt;/b&gt;обрисати ниједан фајл.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/accountsettings.cpp" line="841"/>
@ -436,17 +436,17 @@
<message>
<location filename="../src/gui/activitywidget.cpp" line="606"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
<translation>Списак серверских активности копиран у бележницу.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="610"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation type="unfinished"/>
<translation>Списак синхронизационих активности копиран у бележницу.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="613"/>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
<translation>Списак несинхронизованих ставки копиран у бележницу.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="618"/>
@ -501,17 +501,17 @@
<message numerus="yes">
<location filename="../src/gui/activitywidget.cpp" line="356"/>
<source>You received %n new notification(s) from %1 and %2.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
<translation><numerusform>Примили сте %n ново обавештење од %1 и %2.</numerusform><numerusform>Примили сте %n нова обавештења од %1 и %2.</numerusform><numerusform>Примили сте %n нових обавештења од %1 и %2.</numerusform></translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="358"/>
<source>You received new notifications from %1, %2 and other accounts.</source>
<translation type="unfinished"/>
<translation>Примили сте нова обавештења од %1, %2 и других налога.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="362"/>
<source>%1 Notifications - Action Required</source>
<translation type="unfinished"/>
<translation>%1 обавештење - потребно је Ваше ангажовање</translation>
</message>
</context>
<context>
@ -529,7 +529,7 @@
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="35"/>
<source>Certificate &amp; Key (pkcs12) :</source>
<translation type="unfinished"/>
<translation>Сертификат &amp; Кључ (pkcs12) :</translation>
</message>
<message>
<location filename="../src/gui/addcertificatedialog.ui" line="51"/>

View File

@ -388,7 +388,7 @@
<message>
<location filename="../src/gui/accountstate.cpp" line="138"/>
<source>Asking Credentials</source>
<translation type="unfinished"/>
<translation>Frågar efter inloggningsuppgifter</translation>
</message>
<message>
<location filename="../src/gui/accountstate.cpp" line="140"/>
@ -768,14 +768,19 @@
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 delete the files, they will be unavailable to you, unless you are the owner.</source>
<translation type="unfinished"/>
<translation>Alla filer i den synkade mappen &apos;%1&apos; raderades servern.
Dessa raderingar kommer att synkroniseras till din lokalt synkade mapp och göra filerna otillgängliga, om du inte har möjlighet att återställa.
Om du vill behålla dessa filer kommer dom att synkroniseras till servern nytt, om du har rättighet att göra det.
Om du raderar filerna kommer dom att vara otillgängliga för dig, om du inte är ägaren.</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="932"/>
<source>All the files in your local sync folder '%1' were deleted. These deletes will be synchronized with your server, making such files unavailable unless restored.
Are you sure you want to sync those actions with the server?
If this was an accident and you decide to keep your files, they will be re-synced from the server.</source>
<translation type="unfinished"/>
<translation>Alla filer i din lokalt synkade mappen &apos;%1&apos; raderades. Dessa raderingar kommer att synkroniseras med servern och göra filerna otillgängliga, om dom inte återställs.
Är du säker att du vill synka ändringarna till servern?
Om detta var ett misstag och du vill behålla dina filer, kommer dom att synkroniseras nytt från servern.</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="936"/>
@ -995,7 +1000,7 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="884"/>
<source>Reconciling changes</source>
<translation type="unfinished"/>
<translation>slå ihop förärändringar</translation>
</message>
<message>
<location filename="../src/gui/folderstatusmodel.cpp" line="919"/>
@ -1425,7 +1430,7 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<message>
<location filename="../src/gui/issueswidget.ui" line="133"/>
<source>There were too many issues. Not all will be visible here.</source>
<translation type="unfinished"/>
<translation>Det var för många problem. Alla kommer inte att vara synliga här.</translation>
</message>
<message>
<location filename="../src/gui/issueswidget.ui" line="155"/>
@ -1695,7 +1700,7 @@ Objekt som tillåter radering kommer tas bort om de förhindrar en mapp att tas
<message>
<location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
<translation>Fel uppstod vid åtkomst till &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
<location filename="../src/gui/creds/oauth.cpp" line="118"/>
@ -2289,7 +2294,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="175"/>
<source>File %1 cannot be uploaded because another file with the same name, differing only in case, exists</source>
<translation type="unfinished"/>
<translation>Fil %1 kan inte laddas upp eftersom en annan fil med samma namn, där endast stora/små bokstäver skiljer sig, existerar</translation>
</message>
<message>
<location filename="../src/libsync/propagateupload.cpp" line="291"/>
@ -2747,12 +2752,12 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="520"/>
<source>Confirm Link Share Deletion</source>
<translation type="unfinished"/>
<translation>Bekräfta radering av delad länk</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Vill du verkligen radera den publikt delade länken &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Obs: Den här åtgärden kan inte ångras.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
@ -2768,7 +2773,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="254"/>
<source>Delete link share</source>
<translation type="unfinished"/>
<translation>Radera delad länk</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
@ -2796,12 +2801,12 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Du kan hänvisa till den delade filen eller mappen &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;genom att ge en privat länk&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
<source>The item is not shared with any users or groups</source>
<translation type="unfinished"/>
<translation>Objektet delas inte med några användare eller grupper</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
@ -3348,7 +3353,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/libsync/syncengine.cpp" line="480"/>
<source>The filename cannot be encoded on your file system.</source>
<translation type="unfinished"/>
<translation>Filnamnet kan inte kodas ditt filsystem.</translation>
</message>
<message>
<location filename="../src/libsync/syncengine.cpp" line="489"/>
@ -3599,7 +3604,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="240"/>
<source>Disconnected from some accounts</source>
<translation type="unfinished"/>
<translation>Nedkopplad från vissa konton</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="251"/>
@ -3625,7 +3630,7 @@ Det är inte lämpligt använda den.</translation>
<location filename="../src/gui/owncloudgui.cpp" line="273"/>
<location filename="../src/gui/owncloudgui.cpp" line="304"/>
<source>Synchronization is paused</source>
<translation type="unfinished"/>
<translation>Synkroniseringen är pausad</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="306"/>
@ -3640,7 +3645,7 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
<source>Resume all folders</source>
<translation type="unfinished"/>
<translation>Återuppta alla mappar</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
@ -3650,12 +3655,12 @@ Det är inte lämpligt använda den.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
<source>Resume all synchronization</source>
<translation type="unfinished"/>
<translation>Återuppta all synkronisering</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
<source>Resume synchronization</source>
<translation type="unfinished"/>
<translation>Återuppta synkronisering</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="609"/>

View File

@ -415,7 +415,7 @@
<location filename="../src/gui/activitywidget.cpp" line="515"/>
<location filename="../src/gui/activitywidget.cpp" line="563"/>
<source>Server Activity</source>
<translation>Sunucu Etkinliği</translation>
<translation>Sunucu İşlemleri</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="522"/>
@ -436,12 +436,12 @@
<message>
<location filename="../src/gui/activitywidget.cpp" line="606"/>
<source>The server activity list has been copied to the clipboard.</source>
<translation>Sunucu etkinliği listesi panoya kopyalandı.</translation>
<translation>Sunucu işlemleri listesi panoya kopyalandı.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="610"/>
<source>The sync activity list has been copied to the clipboard.</source>
<translation>Eşitleme etkinliği listesi panoya kopyalandı.</translation>
<translation>Eşitleme işlemi listesi panoya kopyalandı.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="613"/>
@ -481,7 +481,7 @@
<message>
<location filename="../src/gui/activitywidget.cpp" line="88"/>
<source>Copy the activity list to the clipboard.</source>
<translation>Etkinlik listesini panoya kopyala.</translation>
<translation>İşlem listesini panoya kopyala.</translation>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="135"/>
@ -736,7 +736,7 @@
<message>
<location filename="../src/gui/folder.cpp" line="414"/>
<source>Sync Activity</source>
<translation>Eşitleme Etkinliği</translation>
<translation>Eşitleme İşlemi</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="640"/>
@ -2526,7 +2526,7 @@ Kullanmanız önerilmez.</translation>
<message>
<location filename="../src/gui/settingsdialog.cpp" line="109"/>
<source>Activity</source>
<translation>Etkinlik</translation>
<translation>İşlem</translation>
</message>
<message>
<location filename="../src/gui/settingsdialog.cpp" line="118"/>
@ -2554,7 +2554,7 @@ Kullanmanız önerilmez.</translation>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="97"/>
<source>Activity</source>
<translation>Etkinlik</translation>
<translation>İşlem</translation>
</message>
<message>
<location filename="../src/gui/settingsdialogmac.cpp" line="111"/>

View File

@ -768,7 +768,10 @@
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 delete the files, they will be unavailable to you, unless you are the owner.</source>
<translation type="unfinished"/>
<translation>%1
</translation>
</message>
<message>
<location filename="../src/gui/folder.cpp" line="932"/>
@ -1698,12 +1701,12 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/creds/oauth.cpp" line="115"/>
<source>There was an error accessing the &apos;token&apos; endpoint: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
<translation>访token&lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
<location filename="../src/gui/creds/oauth.cpp" line="118"/>
<source>Could not parse the JSON returned from the server: &lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</source>
<translation type="unfinished"/>
<translation>JSON信息&lt;br&gt;&lt;em&gt;%1&lt;/em&gt;</translation>
</message>
<message>
<location filename="../src/gui/creds/oauth.cpp" line="121"/>
@ -1718,7 +1721,7 @@ Items where deletion is allowed will be deleted if they prevent a directory from
<message>
<location filename="../src/gui/creds/oauth.cpp" line="131"/>
<source>&lt;h1&gt;Wrong user&lt;/h1&gt;&lt;p&gt;You logged-in with user &lt;em&gt;%1&lt;/em&gt;, but must login with user &lt;em&gt;%2&lt;/em&gt;.&lt;br&gt;Please log out of %3 in another tab, then &lt;a href=&apos;%4&apos;&gt;click here&lt;/a&gt; and log in as user %2&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h1&gt;&lt;/h1&gt;&lt;p&gt;&lt;em&gt;%2&lt;/em&gt;&lt;em&gt;%1&lt;/em&gt;&lt;br&gt;%3&lt;a href=&apos;%4&apos;&gt;&lt;/a&gt;%2&lt;/p&gt;</translation>
</message>
</context>
<context>
@ -2124,7 +2127,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="459"/>
<source>The download would reduce free local disk space below the limit</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagatedownload.cpp" line="463"/>
@ -2271,7 +2274,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="141"/>
<source>The file was renamed but is part of a read only share. The original file was restored.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagateremotemove.cpp" line="158"/>
@ -2352,7 +2355,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateuploadv1.cpp" line="191"/>
<source>The file was edited locally but is part of a read only share. It is restored and your edit is in the conflict file.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/libsync/propagateuploadv1.cpp" line="205"/>
@ -2578,7 +2581,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.ui" line="28"/>
<source>share label</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharedialog.ui" line="14"/>
@ -2593,7 +2596,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharedialog.cpp" line="109"/>
<source>%1 Sharing</source>
<translation>%1 </translation>
<translation>%1 </translation>
</message>
<message>
<location filename="../src/gui/sharedialog.cpp" line="84"/>
@ -2636,7 +2639,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="14"/>
<source>Share NewDocument.odt</source>
<translation> NewDocument.odt</translation>
<translation> NewDocument.odt</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.ui" line="276"/>
@ -2707,12 +2710,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="93"/>
<source>Link shares have been disabled</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="107"/>
<source>Create public link share</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="168"/>
@ -2753,7 +2756,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="521"/>
<source>&lt;p&gt;Do you really want to delete the public link share &lt;i&gt;%1&lt;/i&gt;?&lt;/p&gt;&lt;p&gt;Note: This action cannot be undone.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt; &lt;i&gt;%1&lt;/i&gt;: .&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="528"/>
@ -2774,7 +2777,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="459"/>
<source>Public sh&amp;aring requires a password</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/sharelinkwidget.cpp" line="477"/>
@ -2787,22 +2790,22 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="14"/>
<source>Share NewDocument.odt</source>
<translation> NewDocument.odt</translation>
<translation> NewDocument.odt</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="22"/>
<source>Share with users or groups ...</source>
<translation> ...</translation>
<translation> ...</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.ui" line="108"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;You can direct people to this shared file or folder &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;by giving them a private link&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"/>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;访 &lt;a href=&quot;private link menu&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="186"/>
<source>The item is not shared with any users or groups</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="235"/>
@ -2827,7 +2830,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/shareusergroupwidget.cpp" line="337"/>
<source>I shared something with you</source>
<translation>西</translation>
<translation>西</translation>
</message>
</context>
<context>
@ -2920,12 +2923,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/socketapi.cpp" line="557"/>
<source>I shared something with you</source>
<translation>西</translation>
<translation>西</translation>
</message>
<message>
<location filename="../src/gui/socketapi.cpp" line="565"/>
<source>Share...</source>
<translation>...</translation>
<translation>...</translation>
</message>
<message>
<location filename="../src/gui/socketapi.cpp" line="567"/>
@ -3641,7 +3644,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="360"/>
<source>Resume all folders</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="365"/>
@ -3651,12 +3654,12 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="599"/>
<source>Resume all synchronization</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="601"/>
<source>Resume synchronization</source>
<translation type="unfinished"/>
<translation></translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="609"/>