Codebase list seafile-client / upstream/7.0.7
New upstream version 7.0.7 Moritz Schlarb 4 years ago
54 changed file(s) with 1407 addition(s) and 566 deletion(s). Raw diff Collapse all Expand all
22 PROJECT(seafile-client)
33 SET(SEAFILE_CLIENT_VERSION_MAJOR 7)
44 SET(SEAFILE_CLIENT_VERSION_MINOR 0)
5 SET(SEAFILE_CLIENT_VERSION_PATCH 6)
5 SET(SEAFILE_CLIENT_VERSION_PATCH 7)
66 SET(PROJECT_VERSION "${SEAFILE_CLIENT_VERSION_MAJOR}.${SEAFILE_CLIENT_VERSION_MINOR}.${SEAFILE_CLIENT_VERSION_PATCH}")
77 ADD_DEFINITIONS(-DSEAFILE_CLIENT_VERSION=${PROJECT_VERSION})
88 INCLUDE(FindPkgConfig)
1414 <key>CFBundleName</key>
1515 <string>Seafile</string>
1616 <key>CFBundleShortVersionString</key>
17 <string>7.0.6</string>
17 <string>7.0.7</string>
1818 <key>CFBundleVersion</key>
19 <string>7.0.6</string>
19 <string>7.0.7</string>
2020 <key>CFBundleSignature</key>
2121 <string>????</string>
2222 <key>CFBundleURLTypes</key>
512512 </message>
513513 </context>
514514 <context>
515 <name>DataManager</name>
516 <message>
517 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
518 <translation type="unfinished"/>
519 </message>
520 </context>
521 <context>
515522 <name>DownloadRepoDialog</name>
516523 <message>
517524 <source>Please enter the password</source>
13681375 <translation type="unfinished"/>
13691376 </message>
13701377 <message>
1371 <source>Failed to save current account</source>
1372 <translation type="unfinished"/>
1373 </message>
1374 <message>
13751378 <source>%1 Server Address</source>
13761379 <translation type="unfinished"/>
13771380 </message>
25062509 <context>
25072510 <name>SeafileApplet</name>
25082511 <message>
2509 <source>failed to add default account</source>
2510 <translation type="unfinished"/>
2511 </message>
2512 <message>
25132512 <source>Failed to initialize log: %s</source>
25142513 <translation type="unfinished"/>
25152514 </message>
31233122 </message>
31243123 </context>
31253124 <context>
3125 <name>SyncErrorsTableView</name>
3126 <message>
3127 <source>Delete file sync error failed</source>
3128 <translation type="unfinished"/>
3129 </message>
3130 <message>
3131 <source>delete</source>
3132 <translation type="unfinished"/>
3133 </message>
3134 </context>
3135 <context>
31263136 <name>TwoFactorDialog</name>
31273137 <message>
31283138 <source>Enter the two factor authentication token</source>
518518 </message>
519519 </context>
520520 <context>
521 <name>DataManager</name>
522 <message>
523 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
524 <translation type="unfinished"/>
525 </message>
526 </context>
527 <context>
521528 <name>DownloadRepoDialog</name>
522529 <message>
523530 <source>Please enter the password</source>
13801387 <translation type="unfinished"/>
13811388 </message>
13821389 <message>
1383 <source>Failed to save current account</source>
1384 <translation>No s&apos;ha pogut guardar el compte actual</translation>
1385 </message>
1386 <message>
13871390 <source>%1 Server Address</source>
13881391 <translation type="unfinished"/>
13891392 </message>
25202523 <context>
25212524 <name>SeafileApplet</name>
25222525 <message>
2523 <source>failed to add default account</source>
2524 <translation type="unfinished"/>
2525 </message>
2526 <message>
25272526 <source>Failed to initialize log: %s</source>
25282527 <translation type="unfinished"/>
25292528 </message>
31373136 </message>
31383137 </context>
31393138 <context>
3139 <name>SyncErrorsTableView</name>
3140 <message>
3141 <source>Delete file sync error failed</source>
3142 <translation type="unfinished"/>
3143 </message>
3144 </context>
3145 <context>
31403146 <name>TwoFactorDialog</name>
31413147 <message>
31423148 <source>Enter the two factor authentication token</source>
66 </message>
77 <message>
88 <source>&lt;h2&gt;%1 Client %2&lt;/h2&gt;</source>
9 <translation type="unfinished"/>
9 <translation>&lt;h2&gt;%1 Klient %2&lt;/h2&gt;</translation>
1010 </message>
1111 <message>
1212 <source>&lt;h5&gt; REV %1 &lt;/h5&gt;</source>
13 <translation type="unfinished"/>
13 <translation>&lt;h5&gt; REV %1 &lt;/h5&gt;</translation>
1414 </message>
1515 <message>
1616 <source>About</source>
3737 </message>
3838 <message>
3939 <source>Failed to remove local repos sync token: %1</source>
40 <translation type="unfinished"/>
40 <translation>Nepodařilo se odstranit token synchronizace lokálního úložiště: %1</translation>
4141 </message>
4242 <message>
4343 <source>Failed to get repo sync information from server: %1</source>
44 <translation type="unfinished"/>
44 <translation>Nepodařilo se získat informace o synchronizaci ze server: %1</translation>
4545 </message>
4646 </context>
4747 <context>
9595 <name>AccountView</name>
9696 <message>
9797 <source>Are you sure you want to remove account %1?&lt;br&gt;&lt;br&gt;The account will be removed locally. All syncing configuration will be removed too. The account at the server will not be affected.</source>
98 <translation type="unfinished"/>
98 <translation>Opravdu chceš smazat účet %1?&lt;br&gt;&lt;br&gt;Účet bude lokálně odstraněn. Budou také odstraněna veškerá nastavení synchronizace. Účet na serveru nebude ovlivněn.</translation>
9999 </message>
100100 <message>
101101 <source>Failed to unsync libraries of this account: %1</source>
205205 </message>
206206 <message>
207207 <source>The file is locked by %1, please try again later</source>
208 <translation type="unfinished"/>
208 <translation>Soubor je uzamčen uživatelem %1, zkus to prosím znovu poději</translation>
209209 </message>
210210 <message>
211211 <source>Upload Failure: %1</source>
516516 </message>
517517 <message>
518518 <source>%1 exited unexpectedly</source>
519 <translation>%1 byl neočekávaně ukončen</translation>
520 </message>
521 </context>
522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
519526 <translation type="unfinished"/>
520527 </message>
521528 </context>
840847 </message>
841848 <message>
842849 <source>Failed to upload file %1: %2</source>
843 <translation type="unfinished"/>
850 <translation>Nepodařilo se nahrát soubor %1: %2</translation>
844851 </message>
845852 <message>
846853 <source>Unable to create cache folder</source>
847 <translation type="unfinished"/>
854 <translation>Nepodařilo se vytvořit složku mezipaměti</translation>
848855 </message>
849856 <message>
850857 <source>Unable to open cache folder</source>
851 <translation type="unfinished"/>
858 <translation>Nepodařilo se otevřít složku mezipaměti</translation>
852859 </message>
853860 <message>
854861 <source>Search files</source>
856863 </message>
857864 <message>
858865 <source>Failed to get link</source>
859 <translation type="unfinished"/>
866 <translation>Nepodařilo se získat odkaz</translation>
860867 </message>
861868 <message>
862869 <source>Failed to get upload link information for file &quot;%1&quot;</source>
863 <translation type="unfinished"/>
870 <translation>Nepodařilo se získat odkaz pro nahrání souboru &quot;%1&quot; ze serveru</translation>
864871 </message>
865872 </context>
866873 <context>
13891396 <translation>Název počítače</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Chyba při ukládání informací o účtu</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>%1 adresa serveru</translation>
13981401 </message>
17511754 </message>
17521755 <message>
17531756 <source>Storage quota full</source>
1754 <translation type="unfinished"/>
1757 <translation>Limit úložiště vyčerpán</translation>
17551758 </message>
17561759 <message>
17571760 <source>Library deleted on server</source>
17991802 </message>
18001803 <message>
18011804 <source>checking server info...</source>
1802 <translation type="unfinished"/>
1805 <translation>kontroluji informace ze serveru...</translation>
18031806 </message>
18041807 <message>
18051808 <source>Canceling</source>
20472050 </message>
20482051 <message>
20492052 <source>Path ends with space or period character</source>
2050 <translation type="unfinished"/>
2053 <translation>Cesta končí mezerou nebo znakem tečky</translation>
20512054 </message>
20522055 <message>
20532056 <source>Path contains invalid characters like &apos;|&apos; or &apos;:&apos;</source>
2054 <translation type="unfinished"/>
2057 <translation>Cesta obsahuje nepovolený znak jako &apos;|&apos; nebo &apos;:&apos;</translation>
20552058 </message>
20562059 <message>
20572060 <source>failed to open file cache database</source>
2058 <translation type="unfinished"/>
2061 <translation>Nepovedlo se otevřít databázi dočasných souborů</translation>
20592062 </message>
20602063 <message>
20612064 <source>Library name contains invalid characters such as &apos;:&apos;, &apos;*&apos;, &apos;|&apos;, &apos;?&apos;</source>
2062 <translation type="unfinished"/>
2065 <translation>Knihovna obsahuje nepovolené znaky, jako třeba &apos;:&apos;, &apos;*&apos;, &apos;|&apos;, &apos;?&apos;</translation>
20632066 </message>
20642067 <message>
20652068 <source>Update to file denied by folder permission setting</source>
2066 <translation type="unfinished"/>
2069 <translation>Aktualizace souboru odmítnuta nastavením oprávnění složky</translation>
20672070 </message>
20682071 <message>
20692072 <source>%1 Client is already running</source>
2070 <translation type="unfinished"/>
2073 <translation>%1 klient již běží</translation>
20712074 </message>
20722075 <message>
20732076 <source>Internal data corrupt on the client. Please try to resync the library</source>
2074 <translation type="unfinished"/>
2077 <translation>Interní data v klientovi jsou poškozená. Pokus se přesynchronizovat knihovnu prosím</translation>
20752078 </message>
20762079 <message>
20772080 <source>Do not have write permission to the library</source>
2078 <translation type="unfinished"/>
2081 <translation>Nemáš oprávnění zapisovat do této knihovny</translation>
20792082 </message>
20802083 <message>
20812084 <source>No permission to sync this folder</source>
2082 <translation type="unfinished"/>
2085 <translation>Nemáš oprávnění synchronizovat tuto složku</translation>
20832086 </message>
20842087 <message>
20852088 <source>Removed all items from trash</source>
2086 <translation type="unfinished"/>
2089 <translation>Odstraněny všechny předměty z koše</translation>
20872090 </message>
20882091 <message>
20892092 <source>Removed items older than days %1 from trash</source>
2090 <translation type="unfinished"/>
2093 <translation>Odstraněny předměty starší než %1 dní z koše</translation>
20912094 </message>
20922095 <message>
20932096 <source>Published draft</source>
2094 <translation type="unfinished"/>
2097 <translation>Publikovaný koncept</translation>
20952098 </message>
20962099 <message>
20972100 <source>Created draft</source>
2098 <translation type="unfinished"/>
2101 <translation>Vytvořený koncept</translation>
20992102 </message>
21002103 <message>
21012104 <source>Created file</source>
2102 <translation type="unfinished"/>
2105 <translation>Vytvořený soubor</translation>
21032106 </message>
21042107 <message>
21052108 <source>Renamed file</source>
2106 <translation type="unfinished"/>
2109 <translation>Přejmenovaný soubor</translation>
21072110 </message>
21082111 <message>
21092112 <source>Deleted draft</source>
2110 <translation type="unfinished"/>
2113 <translation>Smazaný koncept</translation>
21112114 </message>
21122115 <message>
21132116 <source>Deleted file</source>
2114 <translation type="unfinished"/>
2117 <translation>Smazaný soubor</translation>
21152118 </message>
21162119 <message>
21172120 <source>Restored file</source>
2118 <translation type="unfinished"/>
2121 <translation>Obnovený soubor</translation>
21192122 </message>
21202123 <message>
21212124 <source>Moved file</source>
2122 <translation type="unfinished"/>
2125 <translation>Přesunutý soubor</translation>
21232126 </message>
21242127 <message>
21252128 <source>Updated file</source>
2126 <translation type="unfinished"/>
2129 <translation>Aktualizovaný soubor</translation>
21272130 </message>
21282131 <message>
21292132 <source>Created folder</source>
2130 <translation type="unfinished"/>
2133 <translation>Vytvořená složka</translation>
21312134 </message>
21322135 <message>
21332136 <source>Renamed folder</source>
2134 <translation type="unfinished"/>
2137 <translation>Přejmenovaná složka</translation>
21352138 </message>
21362139 <message>
21372140 <source>Deleted folder</source>
2138 <translation type="unfinished"/>
2141 <translation>Smazaná složka</translation>
21392142 </message>
21402143 <message>
21412144 <source>Restored folder</source>
2142 <translation type="unfinished"/>
2145 <translation>Obnovená složka</translation>
21432146 </message>
21442147 <message>
21452148 <source>Moved folder</source>
2146 <translation type="unfinished"/>
2149 <translation>Přesunutá složka</translation>
21472150 </message>
21482151 <message>
21492152 <source>Created library</source>
2150 <translation type="unfinished"/>
2153 <translation>Vytvořená knihovna</translation>
21512154 </message>
21522155 <message>
21532156 <source>Renamed library</source>
2154 <translation type="unfinished"/>
2157 <translation>Přejmenovaná knihovna</translation>
21552158 </message>
21562159 <message>
21572160 <source>Deleted library</source>
2158 <translation type="unfinished"/>
2161 <translation>Smazaná knihovna</translation>
21592162 </message>
21602163 <message>
21612164 <source>Restored library</source>
2162 <translation type="unfinished"/>
2165 <translation>Obnovená knihovna</translation>
21632166 </message>
21642167 <message>
21652168 <source>Created or updated a file in a non-writable library or folder</source>
2166 <translation type="unfinished"/>
2169 <translation>Soubor byl vytvořen nebo upraven v nezapisovatelné knihovně, nebo složce</translation>
21672170 </message>
21682171 <message>
21692172 <source>Permission denied on server</source>
2170 <translation type="unfinished"/>
2173 <translation>Oprávnění na serveru nepřiděleno</translation>
21712174 </message>
21722175 <message>
21732176 <source>Concurrent updates to file. File is saved as conflict file</source>
2174 <translation type="unfinished"/>
2177 <translation>Souběžné aktualizace souboru. Soubor je uložen jako konfliktní</translation>
21752178 </message>
21762179 <message>
21772180 <source>A folder that may contain not-yet-uploaded files is moved to seafile-recycle-bin folder.</source>
2178 <translation type="unfinished"/>
2181 <translation>Složka, která může obsahovat nedokončeně nahrané soubory byla přesunuta do složky seafile-recycle-bin.</translation>
21792182 </message>
21802183 <message>
21812184 <source>failed to open sync error id database</source>
2182 <translation type="unfinished"/>
2185 <translation>nepovedlo se otevřít id databáze chyby synchronizace</translation>
21832186 </message>
21842187 </context>
21852188 <context>
24412444 </message>
24422445 <message>
24432446 <source>set sync interval for this library</source>
2444 <translation type="unfinished"/>
2447 <translation>nastavit interval synchronizace pro tuto knihovnu</translation>
24452448 </message>
24462449 <message>
24472450 <source>Are you sure to unsync the library &quot;%1&quot;?</source>
2448 <translation type="unfinished"/>
2451 <translation>Chceš opravdu zrušit synchronizaci knihovny &quot;%1&quot;?</translation>
24492452 </message>
24502453 <message>
24512454 <source>Are you sure to resync the library &quot;%1&quot;?</source>
2452 <translation type="unfinished"/>
2455 <translation>Chceš opravdu znovu zesynchronizovat knihovnu &quot;%1&quot;?</translation>
24532456 </message>
24542457 <message>
24552458 <source>Are you sure to overwrite the file &quot;%1&quot;</source>
2456 <translation type="unfinished"/>
2459 <translation>Chceš opravdu přepsat soubor &quot;%1&quot;</translation>
24572460 </message>
24582461 <message>
24592462 <source>Failed to unsync library &quot;%1&quot;</source>
24612464 </message>
24622465 <message>
24632466 <source>Are you sure you want to leave the share &quot;%1&quot;?</source>
2464 <translation type="unfinished"/>
2467 <translation>Jsi si jistý, že chceš opustit sdílený disk &quot;%1&quot;?</translation>
24652468 </message>
24662469 <message>
24672470 <source>Leaving share failed</source>
2468 <translation type="unfinished"/>
2471 <translation>Nepovedlo se opustit sdílený disk</translation>
24692472 </message>
24702473 <message>
24712474 <source>Failed to cancel this task:
24812484 </message>
24822485 <message>
24832486 <source>You do not have permission to upload to this folder</source>
2484 <translation type="unfinished"/>
2487 <translation>Nemáš oprávnění nahrávat do této složky</translation>
24852488 </message>
24862489 <message>
24872490 <source>Unable to overwrite file &quot;%1&quot; with itself</source>
25082511 <name>ReposTab</name>
25092512 <message>
25102513 <source>Search libraries</source>
2511 <translation type="unfinished"/>
2514 <translation>Prohledat knihovny</translation>
25122515 </message>
25132516 <message>
25142517 <source>retry</source>
25292532 <context>
25302533 <name>SeafileApplet</name>
25312534 <message>
2532 <source>failed to add default account</source>
2533 <translation>přidání základního účtu se nezdařilo</translation>
2534 </message>
2535 <message>
25362535 <source>Failed to initialize log: %s</source>
25372536 <translation>Nezdařilo se spuštění logu: %s</translation>
25382537 </message>
25542553 </message>
25552554 <message>
25562555 <source>failed to save client id</source>
2557 <translation type="unfinished"/>
2556 <translation>nepovedlo se uložit id klienta</translation>
25582557 </message>
25592558 <message>
25602559 <source>failed to access %1</source>
2561 <translation type="unfinished"/>
2560 <translation>nepovedlo se získat %1</translation>
25622561 </message>
25632562 <message>
25642563 <source>incorrect client id</source>
2565 <translation type="unfinished"/>
2564 <translation>nesprávné id klienta</translation>
25662565 </message>
25672566 <message>
25682567 <source>failed to read %1</source>
2569 <translation type="unfinished"/>
2568 <translation>nepovedlo se přečíst %1</translation>
25702569 </message>
25712570 </context>
25722571 <context>
25892588 </message>
25902589 <message>
25912590 <source>%1 Desktop Access Link:</source>
2592 <translation type="unfinished"/>
2591 <translation>%1 Přístupový odkaz plochy</translation>
25932592 </message>
25942593 </context>
25952594 <context>
26002599 </message>
26012600 <message>
26022601 <source>internal error: failed to connect to daemon</source>
2603 <translation type="unfinished"/>
2602 <translation>Interní chyba: nepovedlo se spojit s démonem</translation>
26042603 </message>
26052604 </context>
26062605 <context>
26392638 </message>
26402639 <message>
26412640 <source>Show file sync errors</source>
2642 <translation type="unfinished"/>
2641 <translation>Zobrazit chyby synchronizace souborů</translation>
26432642 </message>
26442643 <message>
26452644 <source>&amp;About</source>
26832682 </message>
26842683 <message>
26852684 <source>Upload log files</source>
2686 <translation type="unfinished"/>
2685 <translation>Nahrát soubory záznamu</translation>
26872686 </message>
26882687 <message>
26892688 <source>upload %1 log files</source>
2690 <translation type="unfinished"/>
2689 <translation>nahrát %1 souborů záznamu</translation>
26912690 </message>
26922691 <message>
26932692 <source>Please login first</source>
2694 <translation type="unfinished"/>
2693 <translation>Nejdřív se prosím přihlašte</translation>
26952694 </message>
26962695 <message>
26972696 <source>Repair explorer extension</source>
2698 <translation type="unfinished"/>
2697 <translation>Opravit rozšíření Průzkumníku</translation>
26992698 </message>
27002699 <message>
27012700 <source>Successfully fixed sync status icons for Explorer</source>
2702 <translation type="unfinished"/>
2701 <translation>Ikony v Průzkumníku byli úspěšně opraveny.</translation>
27032702 </message>
27042703 <message>
27052704 <source>Faild to fix sync status icons for Explorer</source>
2706 <translation type="unfinished"/>
2705 <translation>Nepovedlo se opravit ikony synchronizace v Průzkumníku</translation>
27072706 </message>
27082707 <message>
27092708 <source>have some sync error</source>
2710 <translation type="unfinished"/>
2709 <translation>máš nějaké problémy se synchronizací</translation>
27112710 </message>
27122711 </context>
27132712 <context>
27252724 <name>SearchTab</name>
27262725 <message>
27272726 <source>Search files</source>
2728 <translation type="unfinished"/>
2727 <translation>Hledat soubory</translation>
27292728 </message>
27302729 <message>
27312730 <source>retry</source>
28982897 </message>
28992898 <message>
29002899 <source>Check for updates automatically</source>
2901 <translation type="unfinished"/>
2900 <translation>Automaticky kontrolovat aktualizace</translation>
29022901 </message>
29032902 <message>
29042903 <source>Do not verify server certificate in HTTPS syncing</source>
29802979 <name>SharedItemsTableModel</name>
29812980 <message>
29822981 <source>Click to edit</source>
2983 <translation type="unfinished"/>
2982 <translation>Klikni pro úpravu</translation>
29842983 </message>
29852984 <message>
29862985 <source>Created by %1</source>
30353034 </message>
30363035 <message>
30373036 <source>Upload Link</source>
3038 <translation type="unfinished"/>
3037 <translation>Odkaz pro nahrání:</translation>
30393038 </message>
30403039 <message>
30413040 <source>Upload link:</source>
3042 <translation type="unfinished"/>
3041 <translation>Odkaz pro nahrání:</translation>
30433042 </message>
30443043 </context>
30453044 <context>
31193118 </message>
31203119 <message>
31213120 <source>No sync errors.</source>
3122 <translation type="unfinished"/>
3121 <translation>Žádné chyby synchronizace.</translation>
31233122 </message>
31243123 </context>
31253124 <context>
31263125 <name>SyncErrorsTableModel</name>
31273126 <message>
31283127 <source>Double click to open the library</source>
3129 <translation type="unfinished"/>
3128 <translation>Dvakrát klikni pro otevření knihovny</translation>
31303129 </message>
31313130 <message>
31323131 <source>Library</source>
31343133 </message>
31353134 <message>
31363135 <source>Path</source>
3137 <translation type="unfinished"/>
3136 <translation>Cesta</translation>
31383137 </message>
31393138 <message>
31403139 <source>Error</source>
31423141 </message>
31433142 <message>
31443143 <source>Time</source>
3144 <translation>Čas</translation>
3145 </message>
3146 </context>
3147 <context>
3148 <name>SyncErrorsTableView</name>
3149 <message>
3150 <source>Delete file sync error failed</source>
31453151 <translation type="unfinished"/>
31463152 </message>
31473153 </context>
31493155 <name>TwoFactorDialog</name>
31503156 <message>
31513157 <source>Enter the two factor authentication token</source>
3152 <translation type="unfinished"/>
3158 <translation>Zadej druhý dvoufaktorový token</translation>
31533159 </message>
31543160 <message>
31553161 <source>Two Factor Authentication</source>
3156 <translation type="unfinished"/>
3162 <translation>Dvoufaktorové ověření</translation>
31573163 </message>
31583164 <message>
31593165 <source>Please enter the two factor authentication token</source>
3160 <translation type="unfinished"/>
3166 <translation>Zadej prosím token pro dvoufaktorové ověření</translation>
31613167 </message>
31623168 <message>
31633169 <source>Dialog</source>
3164 <translation type="unfinished"/>
3170 <translation>Dialog</translation>
31653171 </message>
31663172 <message>
31673173 <source>mText</source>
3168 <translation type="unfinished"/>
3174 <translation>mText</translation>
31693175 </message>
31703176 <message>
31713177 <source>Remember this device</source>
3172 <translation type="unfinished"/>
3178 <translation>Zapamatovat si toto zařízení</translation>
31733179 </message>
31743180 <message>
31753181 <source>Cancel</source>
3176 <translation type="unfinished"/>
3182 <translation>Zrušit</translation>
31773183 </message>
31783184 <message>
31793185 <source>OK</source>
3180 <translation type="unfinished"/>
3186 <translation>OK</translation>
31813187 </message>
31823188 </context>
31833189 <context>
519519 </message>
520520 </context>
521521 <context>
522 <name>DataManager</name>
523 <message>
524 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
525 <translation type="unfinished"/>
526 </message>
527 </context>
528 <context>
522529 <name>DownloadRepoDialog</name>
523530 <message>
524531 <source>Please enter the password</source>
858865 </message>
859866 <message>
860867 <source>Failed to get upload link information for file &quot;%1&quot;</source>
861 <translation type="unfinished"/>
868 <translation>Informationen zum Upload-Link von Datei „%1“ konnten nicht abgerufen werden.</translation>
862869 </message>
863870 </context>
864871 <context>
10931100 </message>
10941101 <message>
10951102 <source>&amp;Generate %1 Upload Link</source>
1096 <translation type="unfinished"/>
1103 <translation>%1 &amp;Upload-Link erstellen</translation>
10971104 </message>
10981105 </context>
10991106 <context>
11001107 <name>FinderSyncHost</name>
11011108 <message>
11021109 <source>Failed to get link</source>
1103 <translation type="unfinished"/>
1110 <translation>Fehler beim Ermitteln des Links</translation>
11041111 </message>
11051112 <message>
11061113 <source>File &quot;%1&quot; is locked by %2</source>
1107 <translation type="unfinished"/>
1114 <translation>Die Datei „%1“ ist von %2 gesperrt</translation>
11081115 </message>
11091116 <message>
11101117 <source>Failed to get lock information for file &quot;%1&quot;</source>
1111 <translation type="unfinished"/>
1118 <translation>Datei „%1“ ist gesperrt. Nähere Informationen konnten nicht abgerufen werden.</translation>
11121119 </message>
11131120 <message>
11141121 <source>Failed to get upload link for file &quot;%1&quot;</source>
1115 <translation type="unfinished"/>
1122 <translation>Upload-Link von Datei „%1“ konnte nicht abgerufen werden.</translation>
11161123 </message>
11171124 </context>
11181125 <context>
13881395 <translation>Bitte geben Sie den Rechnernamen ein</translation>
13891396 </message>
13901397 <message>
1391 <source>Failed to save current account</source>
1392 <translation>Aktuelles Konto konnte nicht gespeichert werden</translation>
1393 </message>
1394 <message>
13951398 <source>%1 Server Address</source>
13961399 <translation>%1-Serveradresse</translation>
13971400 </message>
21842187 </message>
21852188 <message>
21862189 <source>failed to open sync error id database</source>
2187 <translation type="unfinished"/>
2190 <translation>Fehler beim Öffnen der Datenbank zu Problemen bei der Synchronisation</translation>
21882191 </message>
21892192 </context>
21902193 <context>
25342537 <context>
25352538 <name>SeafileApplet</name>
25362539 <message>
2537 <source>failed to add default account</source>
2538 <translation>Standardkonto konnte nicht hingefügt werden</translation>
2539 </message>
2540 <message>
25412540 <source>Failed to initialize log: %s</source>
25422541 <translation>Log konnte nicht initialisiert werden: %s</translation>
25432542 </message>
30403039 </message>
30413040 <message>
30423041 <source>Upload Link</source>
3043 <translation type="unfinished"/>
3042 <translation>Upload-Link</translation>
30443043 </message>
30453044 <message>
30463045 <source>Upload link:</source>
3047 <translation type="unfinished"/>
3046 <translation>Upload-Link:</translation>
30483047 </message>
30493048 </context>
30503049 <context>
31513150 </message>
31523151 </context>
31533152 <context>
3153 <name>SyncErrorsTableView</name>
3154 <message>
3155 <source>Delete file sync error failed</source>
3156 <translation type="unfinished"/>
3157 </message>
3158 </context>
3159 <context>
31543160 <name>TwoFactorDialog</name>
31553161 <message>
31563162 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13871394 <translation>Παρακαλώ συμπληρώστε το όνομα του υπολογιστή</translation>
13881395 </message>
13891396 <message>
1390 <source>Failed to save current account</source>
1391 <translation>Αποτυχία αποθήκευσης του λογαριασμού</translation>
1392 </message>
1393 <message>
13941397 <source>%1 Server Address</source>
13951398 <translation>%1 Διεύθυνση διακομιστή</translation>
13961399 </message>
25272530 <context>
25282531 <name>SeafileApplet</name>
25292532 <message>
2530 <source>failed to add default account</source>
2531 <translation>αποτυχία προσθήκης προεπιλεγμένου λογαριασμού</translation>
2532 </message>
2533 <message>
25342533 <source>Failed to initialize log: %s</source>
25352534 <translation>Αποτυχία αρχικοποιήσης αρχείου καταγραφής: %s</translation>
25362535 </message>
31443143 </message>
31453144 </context>
31463145 <context>
3146 <name>SyncErrorsTableView</name>
3147 <message>
3148 <source>Delete file sync error failed</source>
3149 <translation type="unfinished"/>
3150 </message>
3151 </context>
3152 <context>
31473153 <name>TwoFactorDialog</name>
31483154 <message>
31493155 <source>Enter the two factor authentication token</source>
514514 </message>
515515 </context>
516516 <context>
517 <name>DataManager</name>
518 <message>
519 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
520 <translation type="unfinished"></translation>
521 </message>
522 </context>
523 <context>
517524 <name>DownloadRepoDialog</name>
518525 <message>
519526 <source>Please enter the password</source>
13701377 <translation type="unfinished"></translation>
13711378 </message>
13721379 <message>
1373 <source>Failed to save current account</source>
1374 <translation type="unfinished"></translation>
1375 </message>
1376 <message>
13771380 <source>%1 Server Address</source>
13781381 <translation type="unfinished"></translation>
13791382 </message>
25082511 <context>
25092512 <name>SeafileApplet</name>
25102513 <message>
2511 <source>failed to add default account</source>
2512 <translation type="unfinished"></translation>
2513 </message>
2514 <message>
25152514 <source>Failed to initialize log: %s</source>
25162515 <translation type="unfinished"></translation>
25172516 </message>
31253124 </message>
31263125 </context>
31273126 <context>
3127 <name>SyncErrorsTableView</name>
3128 <message>
3129 <source>Delete file sync error failed</source>
3130 <translation type="unfinished"></translation>
3131 </message>
3132 <message>
3133 <source>delete</source>
3134 <translation type="unfinished"></translation>
3135 </message>
3136 </context>
3137 <context>
31283138 <name>TwoFactorDialog</name>
31293139 <message>
31303140 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
859866 </message>
860867 <message>
861868 <source>Failed to get upload link information for file &quot;%1&quot;</source>
862 <translation type="unfinished"/>
869 <translation>Fallo al obtener información del enlace de subida para el archivo &quot;%1&quot;</translation>
863870 </message>
864871 </context>
865872 <context>
10941101 </message>
10951102 <message>
10961103 <source>&amp;Generate %1 Upload Link</source>
1097 <translation type="unfinished"/>
1104 <translation>&amp;Generar Enlace %1 para Subir</translation>
10981105 </message>
10991106 </context>
11001107 <context>
11011108 <name>FinderSyncHost</name>
11021109 <message>
11031110 <source>Failed to get link</source>
1104 <translation type="unfinished"/>
1111 <translation>Fallo al obtener enlace</translation>
11051112 </message>
11061113 <message>
11071114 <source>File &quot;%1&quot; is locked by %2</source>
1108 <translation type="unfinished"/>
1115 <translation>El archivo &quot;%1&quot; está bloqueado por %2</translation>
11091116 </message>
11101117 <message>
11111118 <source>Failed to get lock information for file &quot;%1&quot;</source>
1112 <translation type="unfinished"/>
1119 <translation>Fallo al obtener información de bloqueo para el archivo &quot;%1&quot;</translation>
11131120 </message>
11141121 <message>
11151122 <source>Failed to get upload link for file &quot;%1&quot;</source>
1116 <translation type="unfinished"/>
1123 <translation>Fallo al obtener el enlace de subida para el archivo &quot;%1&quot;</translation>
11171124 </message>
11181125 </context>
11191126 <context>
13891396 <translation>Ingrese el nombre del equipo</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Fallo al modificar la cuenta actual</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>Dirección del Servidor %1</translation>
13981401 </message>
21852188 </message>
21862189 <message>
21872190 <source>failed to open sync error id database</source>
2188 <translation type="unfinished"/>
2191 <translation>fallo al abrir la base de datos de id de errores de sincronización</translation>
21892192 </message>
21902193 </context>
21912194 <context>
25352538 <context>
25362539 <name>SeafileApplet</name>
25372540 <message>
2538 <source>failed to add default account</source>
2539 <translation>fallo al agregar la cuenta predefinida</translation>
2540 </message>
2541 <message>
25422541 <source>Failed to initialize log: %s</source>
25432542 <translation>Fallo al crear registro: %s</translation>
25442543 </message>
30413040 </message>
30423041 <message>
30433042 <source>Upload Link</source>
3044 <translation type="unfinished"/>
3043 <translation>Enlace de Subida</translation>
30453044 </message>
30463045 <message>
30473046 <source>Upload link:</source>
3048 <translation type="unfinished"/>
3047 <translation>Enlace de subida:</translation>
30493048 </message>
30503049 </context>
30513050 <context>
31523151 </message>
31533152 </context>
31543153 <context>
3154 <name>SyncErrorsTableView</name>
3155 <message>
3156 <source>Delete file sync error failed</source>
3157 <translation type="unfinished"/>
3158 </message>
3159 </context>
3160 <context>
31553161 <name>TwoFactorDialog</name>
31563162 <message>
31573163 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
859866 </message>
860867 <message>
861868 <source>Failed to get upload link information for file &quot;%1&quot;</source>
862 <translation type="unfinished"/>
869 <translation>Fallo al obtener información del enlace de subida para el archivo &quot;%1&quot;</translation>
863870 </message>
864871 </context>
865872 <context>
10941101 </message>
10951102 <message>
10961103 <source>&amp;Generate %1 Upload Link</source>
1097 <translation type="unfinished"/>
1104 <translation>&amp;Generar Enlace %1 para Subir</translation>
10981105 </message>
10991106 </context>
11001107 <context>
11011108 <name>FinderSyncHost</name>
11021109 <message>
11031110 <source>Failed to get link</source>
1104 <translation type="unfinished"/>
1111 <translation>Fallo al obtener enlace</translation>
11051112 </message>
11061113 <message>
11071114 <source>File &quot;%1&quot; is locked by %2</source>
1108 <translation type="unfinished"/>
1115 <translation>El archivo &quot;%1&quot; está bloqueado por %2</translation>
11091116 </message>
11101117 <message>
11111118 <source>Failed to get lock information for file &quot;%1&quot;</source>
1112 <translation type="unfinished"/>
1119 <translation>Fallo al obtener información de bloqueo para el archivo &quot;%1&quot;</translation>
11131120 </message>
11141121 <message>
11151122 <source>Failed to get upload link for file &quot;%1&quot;</source>
1116 <translation type="unfinished"/>
1123 <translation>Fallo al obtener el enlace de subida para el archivo &quot;%1&quot;</translation>
11171124 </message>
11181125 </context>
11191126 <context>
13891396 <translation>Ingrese el nombre del equipo</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Fallo al modificar la cuenta actual</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>Dirección del Servidor %1</translation>
13981401 </message>
21852188 </message>
21862189 <message>
21872190 <source>failed to open sync error id database</source>
2188 <translation type="unfinished"/>
2191 <translation>fallo al abrir la base de datos de id de errores de sincronización</translation>
21892192 </message>
21902193 </context>
21912194 <context>
25352538 <context>
25362539 <name>SeafileApplet</name>
25372540 <message>
2538 <source>failed to add default account</source>
2539 <translation>fallo al agregar la cuenta predefinida</translation>
2540 </message>
2541 <message>
25422541 <source>Failed to initialize log: %s</source>
25432542 <translation>Fallo al crear registro: %s</translation>
25442543 </message>
30413040 </message>
30423041 <message>
30433042 <source>Upload Link</source>
3044 <translation type="unfinished"/>
3043 <translation>Enlace de Subida</translation>
30453044 </message>
30463045 <message>
30473046 <source>Upload link:</source>
3048 <translation type="unfinished"/>
3047 <translation>Enlace de subida:</translation>
30493048 </message>
30503049 </context>
30513050 <context>
31523151 </message>
31533152 </context>
31543153 <context>
3154 <name>SyncErrorsTableView</name>
3155 <message>
3156 <source>Delete file sync error failed</source>
3157 <translation type="unfinished"/>
3158 </message>
3159 </context>
3160 <context>
31553161 <name>TwoFactorDialog</name>
31563162 <message>
31573163 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
859866 </message>
860867 <message>
861868 <source>Failed to get upload link information for file &quot;%1&quot;</source>
862 <translation type="unfinished"/>
869 <translation>Fallo al obtener información del enlace de subida para el archivo &quot;%1&quot;</translation>
863870 </message>
864871 </context>
865872 <context>
10941101 </message>
10951102 <message>
10961103 <source>&amp;Generate %1 Upload Link</source>
1097 <translation type="unfinished"/>
1104 <translation>&amp;Generar Enlace %1 para Subir</translation>
10981105 </message>
10991106 </context>
11001107 <context>
11011108 <name>FinderSyncHost</name>
11021109 <message>
11031110 <source>Failed to get link</source>
1104 <translation type="unfinished"/>
1111 <translation>Fallo al obtener enlace</translation>
11051112 </message>
11061113 <message>
11071114 <source>File &quot;%1&quot; is locked by %2</source>
1108 <translation type="unfinished"/>
1115 <translation>El archivo &quot;%1&quot; está bloqueado por %2</translation>
11091116 </message>
11101117 <message>
11111118 <source>Failed to get lock information for file &quot;%1&quot;</source>
1112 <translation type="unfinished"/>
1119 <translation>Fallo al obtener información de bloqueo para el archivo &quot;%1&quot;</translation>
11131120 </message>
11141121 <message>
11151122 <source>Failed to get upload link for file &quot;%1&quot;</source>
1116 <translation type="unfinished"/>
1123 <translation>Fallo al obtener el enlace de subida para el archivo &quot;%1&quot;</translation>
11171124 </message>
11181125 </context>
11191126 <context>
13891396 <translation>Ingrese el nombre del equipo</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Fallo al modificar la cuenta actual</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>Dirección del Servidor %1</translation>
13981401 </message>
21852188 </message>
21862189 <message>
21872190 <source>failed to open sync error id database</source>
2188 <translation type="unfinished"/>
2191 <translation>fallo al abrir la base de datos de id de errores de sincronización</translation>
21892192 </message>
21902193 </context>
21912194 <context>
25352538 <context>
25362539 <name>SeafileApplet</name>
25372540 <message>
2538 <source>failed to add default account</source>
2539 <translation>fallo al agregar la cuenta predefinida</translation>
2540 </message>
2541 <message>
25422541 <source>Failed to initialize log: %s</source>
25432542 <translation>Fallo al crear registro: %s</translation>
25442543 </message>
30413040 </message>
30423041 <message>
30433042 <source>Upload Link</source>
3044 <translation type="unfinished"/>
3043 <translation>Enlace de Subida</translation>
30453044 </message>
30463045 <message>
30473046 <source>Upload link:</source>
3048 <translation type="unfinished"/>
3047 <translation>Enlace de subida:</translation>
30493048 </message>
30503049 </context>
30513050 <context>
31523151 </message>
31533152 </context>
31543153 <context>
3154 <name>SyncErrorsTableView</name>
3155 <message>
3156 <source>Delete file sync error failed</source>
3157 <translation type="unfinished"/>
3158 </message>
3159 </context>
3160 <context>
31553161 <name>TwoFactorDialog</name>
31563162 <message>
31573163 <source>Enter the two factor authentication token</source>
512512 </message>
513513 </context>
514514 <context>
515 <name>DataManager</name>
516 <message>
517 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
518 <translation type="unfinished"/>
519 </message>
520 </context>
521 <context>
515522 <name>DownloadRepoDialog</name>
516523 <message>
517524 <source>Please enter the password</source>
13681375 <translation type="unfinished"/>
13691376 </message>
13701377 <message>
1371 <source>Failed to save current account</source>
1372 <translation type="unfinished"/>
1373 </message>
1374 <message>
13751378 <source>%1 Server Address</source>
13761379 <translation type="unfinished"/>
13771380 </message>
25062509 <context>
25072510 <name>SeafileApplet</name>
25082511 <message>
2509 <source>failed to add default account</source>
2510 <translation type="unfinished"/>
2511 </message>
2512 <message>
25132512 <source>Failed to initialize log: %s</source>
25142513 <translation type="unfinished"/>
25152514 </message>
31233122 </message>
31243123 </context>
31253124 <context>
3125 <name>SyncErrorsTableView</name>
3126 <message>
3127 <source>Delete file sync error failed</source>
3128 <translation type="unfinished"/>
3129 </message>
3130 <message>
3131 <source>delete</source>
3132 <translation type="unfinished"/>
3133 </message>
3134 </context>
3135 <context>
31263136 <name>TwoFactorDialog</name>
31273137 <message>
31283138 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
859866 </message>
860867 <message>
861868 <source>Failed to get upload link information for file &quot;%1&quot;</source>
862 <translation type="unfinished"/>
869 <translation>Impossible d&apos;obtenir les informations du lien d&apos;envoi du fichier &quot;%1&quot;</translation>
863870 </message>
864871 </context>
865872 <context>
10941101 </message>
10951102 <message>
10961103 <source>&amp;Generate %1 Upload Link</source>
1097 <translation type="unfinished"/>
1104 <translation>&amp;Générer %1 un lien d&apos;envoi</translation>
10981105 </message>
10991106 </context>
11001107 <context>
11011108 <name>FinderSyncHost</name>
11021109 <message>
11031110 <source>Failed to get link</source>
1104 <translation type="unfinished"/>
1111 <translation>Impossible d&apos;obtenir le lien</translation>
11051112 </message>
11061113 <message>
11071114 <source>File &quot;%1&quot; is locked by %2</source>
1108 <translation type="unfinished"/>
1115 <translation>Le fichier &quot;%1&quot; est verrouillé par %2</translation>
11091116 </message>
11101117 <message>
11111118 <source>Failed to get lock information for file &quot;%1&quot;</source>
1112 <translation type="unfinished"/>
1119 <translation>Impossible d&apos;obtenir l&apos;information de verrouillage du fichier &quot;%1&quot;</translation>
11131120 </message>
11141121 <message>
11151122 <source>Failed to get upload link for file &quot;%1&quot;</source>
1116 <translation type="unfinished"/>
1123 <translation>Impossible d&apos;obtenir le lien d&apos;envoi du fichier &quot;%1&quot;</translation>
11171124 </message>
11181125 </context>
11191126 <context>
13881395 <translation>Veuillez entrer le nom de l&apos;ordinateur</translation>
13891396 </message>
13901397 <message>
1391 <source>Failed to save current account</source>
1392 <translation>Impossible d&apos;enregistrer le compte actuel</translation>
1393 </message>
1394 <message>
13951398 <source>%1 Server Address</source>
13961399 <translation>%1 adresse serveur</translation>
13971400 </message>
25342537 <context>
25352538 <name>SeafileApplet</name>
25362539 <message>
2537 <source>failed to add default account</source>
2538 <translation>Échec de l&apos;ajout du compte par défaut</translation>
2539 </message>
2540 <message>
25412540 <source>Failed to initialize log: %s</source>
25422541 <translation>Échec de l&apos;initialisation du log: %s</translation>
25432542 </message>
31513150 </message>
31523151 </context>
31533152 <context>
3153 <name>SyncErrorsTableView</name>
3154 <message>
3155 <source>Delete file sync error failed</source>
3156 <translation type="unfinished"/>
3157 </message>
3158 </context>
3159 <context>
31543160 <name>TwoFactorDialog</name>
31553161 <message>
31563162 <source>Enter the two factor authentication token</source>
517517 </message>
518518 </context>
519519 <context>
520 <name>DataManager</name>
521 <message>
522 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
523 <translation type="unfinished"/>
524 </message>
525 </context>
526 <context>
520527 <name>DownloadRepoDialog</name>
521528 <message>
522529 <source>Please enter the password</source>
13791386 <translation type="unfinished"/>
13801387 </message>
13811388 <message>
1382 <source>Failed to save current account</source>
1383 <translation>נכשל בשמירת החשבון הנוכחי</translation>
1384 </message>
1385 <message>
13861389 <source>%1 Server Address</source>
13871390 <translation type="unfinished"/>
13881391 </message>
25192522 <context>
25202523 <name>SeafileApplet</name>
25212524 <message>
2522 <source>failed to add default account</source>
2523 <translation type="unfinished"/>
2524 </message>
2525 <message>
25262525 <source>Failed to initialize log: %s</source>
25272526 <translation type="unfinished"/>
25282527 </message>
31363135 </message>
31373136 </context>
31383137 <context>
3138 <name>SyncErrorsTableView</name>
3139 <message>
3140 <source>Delete file sync error failed</source>
3141 <translation type="unfinished"/>
3142 </message>
3143 </context>
3144 <context>
31393145 <name>TwoFactorDialog</name>
31403146 <message>
31413147 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13891396 <translation>Kérem adja meg a számítógép nevét</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>A fiók mentése nem sikerült.</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>%1 szerver cím</translation>
13981401 </message>
25292532 <context>
25302533 <name>SeafileApplet</name>
25312534 <message>
2532 <source>failed to add default account</source>
2533 <translation>nem sikerült hozzáadni az alapértelmezett fiókot </translation>
2534 </message>
2535 <message>
25362535 <source>Failed to initialize log: %s</source>
25372536 <translation>A naplózás elindítása nem sikerült: %S</translation>
25382537 </message>
31463145 </message>
31473146 </context>
31483147 <context>
3148 <name>SyncErrorsTableView</name>
3149 <message>
3150 <source>Delete file sync error failed</source>
3151 <translation type="unfinished"/>
3152 </message>
3153 </context>
3154 <context>
31493155 <name>TwoFactorDialog</name>
31503156 <message>
31513157 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13871394 <translation>Vinsamlegast skráðu heiti tölvunnar</translation>
13881395 </message>
13891396 <message>
1390 <source>Failed to save current account</source>
1391 <translation>Mistókst að vista reikninginn</translation>
1392 </message>
1393 <message>
13941397 <source>%1 Server Address</source>
13951398 <translation>%1 Veffang Þjóns</translation>
13961399 </message>
25272530 <context>
25282531 <name>SeafileApplet</name>
25292532 <message>
2530 <source>failed to add default account</source>
2531 <translation>mistókst að bæta við sjálfgefnum reikningi</translation>
2532 </message>
2533 <message>
25342533 <source>Failed to initialize log: %s</source>
25352534 <translation>Mistókst að frumstilla skrá: %s</translation>
25362535 </message>
31443143 </message>
31453144 </context>
31463145 <context>
3146 <name>SyncErrorsTableView</name>
3147 <message>
3148 <source>Delete file sync error failed</source>
3149 <translation type="unfinished"/>
3150 </message>
3151 </context>
3152 <context>
31473153 <name>TwoFactorDialog</name>
31483154 <message>
31493155 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13891396 <translation>Per favore inserisci il nome del computer</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Impossibile salvare l&apos;account corrente</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>%1 Indirizzo del Server</translation>
13981401 </message>
25292532 <context>
25302533 <name>SeafileApplet</name>
25312534 <message>
2532 <source>failed to add default account</source>
2533 <translation>Impossibile aggiungere l&apos;account predefinito</translation>
2534 </message>
2535 <message>
25362535 <source>Failed to initialize log: %s</source>
25372536 <translation>Fallita inizializzazione log: %s</translation>
25382537 </message>
31463145 </message>
31473146 </context>
31483147 <context>
3148 <name>SyncErrorsTableView</name>
3149 <message>
3150 <source>Delete file sync error failed</source>
3151 <translation type="unfinished"/>
3152 </message>
3153 </context>
3154 <context>
31493155 <name>TwoFactorDialog</name>
31503156 <message>
31513157 <source>Enter the two factor authentication token</source>
519519 </message>
520520 </context>
521521 <context>
522 <name>DataManager</name>
523 <message>
524 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
525 <translation type="unfinished"/>
526 </message>
527 </context>
528 <context>
522529 <name>DownloadRepoDialog</name>
523530 <message>
524531 <source>Please enter the password</source>
13761383 <message>
13771384 <source>Please enter the computer name</source>
13781385 <translation>コンピュータ名を入力してください</translation>
1379 </message>
1380 <message>
1381 <source>Failed to save current account</source>
1382 <translation type="unfinished"/>
13831386 </message>
13841387 <message>
13851388 <source>%1 Server Address</source>
25182521 <context>
25192522 <name>SeafileApplet</name>
25202523 <message>
2521 <source>failed to add default account</source>
2522 <translation type="unfinished"/>
2523 </message>
2524 <message>
25252524 <source>Failed to initialize log: %s</source>
25262525 <translation type="unfinished"/>
25272526 </message>
31353134 </message>
31363135 </context>
31373136 <context>
3137 <name>SyncErrorsTableView</name>
3138 <message>
3139 <source>Delete file sync error failed</source>
3140 <translation type="unfinished"/>
3141 </message>
3142 </context>
3143 <context>
31383144 <name>TwoFactorDialog</name>
31393145 <message>
31403146 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13901397 <translation>컴퓨터 이름을 입력해주세요</translation>
13911398 </message>
13921399 <message>
1393 <source>Failed to save current account</source>
1394 <translation>현재 계정 저장에 실패했습니다</translation>
1395 </message>
1396 <message>
13971400 <source>%1 Server Address</source>
13981401 <translation>%1 서버 주소</translation>
13991402 </message>
25362539 <context>
25372540 <name>SeafileApplet</name>
25382541 <message>
2539 <source>failed to add default account</source>
2540 <translation>기본 계정 추가에 실패했습니다</translation>
2541 </message>
2542 <message>
25432542 <source>Failed to initialize log: %s</source>
25442543 <translation>로그 초기화에 실패했습니다: %1</translation>
25452544 </message>
31543153 </message>
31553154 </context>
31563155 <context>
3156 <name>SyncErrorsTableView</name>
3157 <message>
3158 <source>Delete file sync error failed</source>
3159 <translation type="unfinished"/>
3160 </message>
3161 </context>
3162 <context>
31573163 <name>TwoFactorDialog</name>
31583164 <message>
31593165 <source>Enter the two factor authentication token</source>
516516 </message>
517517 </context>
518518 <context>
519 <name>DataManager</name>
520 <message>
521 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
522 <translation type="unfinished"/>
523 </message>
524 </context>
525 <context>
519526 <name>DownloadRepoDialog</name>
520527 <message>
521528 <source>Please enter the password</source>
13731380 <translation type="unfinished"/>
13741381 </message>
13751382 <message>
1376 <source>Failed to save current account</source>
1377 <translation type="unfinished"/>
1378 </message>
1379 <message>
13801383 <source>%1 Server Address</source>
13811384 <translation type="unfinished"/>
13821385 </message>
25112514 <context>
25122515 <name>SeafileApplet</name>
25132516 <message>
2514 <source>failed to add default account</source>
2515 <translation type="unfinished"/>
2516 </message>
2517 <message>
25182517 <source>Failed to initialize log: %s</source>
25192518 <translation type="unfinished"/>
25202519 </message>
31283127 </message>
31293128 </context>
31303129 <context>
3130 <name>SyncErrorsTableView</name>
3131 <message>
3132 <source>Delete file sync error failed</source>
3133 <translation type="unfinished"/>
3134 </message>
3135 </context>
3136 <context>
31313137 <name>TwoFactorDialog</name>
31323138 <message>
31333139 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13871394 <translation>Skriv inn datamaskinnavnet</translation>
13881395 </message>
13891396 <message>
1390 <source>Failed to save current account</source>
1391 <translation>Kunne ikke lagre nåværende konto</translation>
1392 </message>
1393 <message>
13941397 <source>%1 Server Address</source>
13951398 <translation type="unfinished"/>
13961399 </message>
25272530 <context>
25282531 <name>SeafileApplet</name>
25292532 <message>
2530 <source>failed to add default account</source>
2531 <translation type="unfinished"/>
2532 </message>
2533 <message>
25342533 <source>Failed to initialize log: %s</source>
25352534 <translation>Kunne ikke initialisere loggen: %s</translation>
25362535 </message>
31443143 </message>
31453144 </context>
31463145 <context>
3146 <name>SyncErrorsTableView</name>
3147 <message>
3148 <source>Delete file sync error failed</source>
3149 <translation type="unfinished"/>
3150 </message>
3151 </context>
3152 <context>
31473153 <name>TwoFactorDialog</name>
31483154 <message>
31493155 <source>Enter the two factor authentication token</source>
518518 </message>
519519 </context>
520520 <context>
521 <name>DataManager</name>
522 <message>
523 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
524 <translation type="unfinished"/>
525 </message>
526 </context>
527 <context>
521528 <name>DownloadRepoDialog</name>
522529 <message>
523530 <source>Please enter the password</source>
13841391 <translation>Vul de computernaam in</translation>
13851392 </message>
13861393 <message>
1387 <source>Failed to save current account</source>
1388 <translation>Mislukt om de huidige account op te slaan</translation>
1389 </message>
1390 <message>
13911394 <source>%1 Server Address</source>
13921395 <translation type="unfinished"/>
13931396 </message>
25242527 <context>
25252528 <name>SeafileApplet</name>
25262529 <message>
2527 <source>failed to add default account</source>
2528 <translation type="unfinished"/>
2529 </message>
2530 <message>
25312530 <source>Failed to initialize log: %s</source>
25322531 <translation>Mislukt om de log te initialiseren: %s</translation>
25332532 </message>
31413140 </message>
31423141 </context>
31433142 <context>
3143 <name>SyncErrorsTableView</name>
3144 <message>
3145 <source>Delete file sync error failed</source>
3146 <translation type="unfinished"/>
3147 </message>
3148 </context>
3149 <context>
31443150 <name>TwoFactorDialog</name>
31453151 <message>
31463152 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13861393 <translation>Geef de computernaam op</translation>
13871394 </message>
13881395 <message>
1389 <source>Failed to save current account</source>
1390 <translation>Kon huidige account niet opslaan</translation>
1391 </message>
1392 <message>
13931396 <source>%1 Server Address</source>
13941397 <translation>%1 serveradres</translation>
13951398 </message>
25262529 <context>
25272530 <name>SeafileApplet</name>
25282531 <message>
2529 <source>failed to add default account</source>
2530 <translation>Kon standaardaccount niet toevoegen</translation>
2531 </message>
2532 <message>
25332532 <source>Failed to initialize log: %s</source>
25342533 <translation>Kon logbestand niet initialiseren: %s</translation>
25352534 </message>
31443143 </message>
31453144 </context>
31463145 <context>
3146 <name>SyncErrorsTableView</name>
3147 <message>
3148 <source>Delete file sync error failed</source>
3149 <translation type="unfinished"/>
3150 </message>
3151 </context>
3152 <context>
31473153 <name>TwoFactorDialog</name>
31483154 <message>
31493155 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13891396 <translation>Podaj nazwę komputera</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Nie udało się zapisać aktualnego konta</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>Adres serwera %1</translation>
13981401 </message>
25352538 <context>
25362539 <name>SeafileApplet</name>
25372540 <message>
2538 <source>failed to add default account</source>
2539 <translation>nie udało się dodać konta domyślnego</translation>
2540 </message>
2541 <message>
25422541 <source>Failed to initialize log: %s</source>
25432542 <translation>Nie udało się zainicjować logu: %s</translation>
25442543 </message>
31523151 </message>
31533152 </context>
31543153 <context>
3154 <name>SyncErrorsTableView</name>
3155 <message>
3156 <source>Delete file sync error failed</source>
3157 <translation type="unfinished"/>
3158 </message>
3159 </context>
3160 <context>
31553161 <name>TwoFactorDialog</name>
31563162 <message>
31573163 <source>Enter the two factor authentication token</source>
515515 <message>
516516 <source>%1 exited unexpectedly</source>
517517 <translation>%1 saiu inesperadamente</translation>
518 </message>
519 </context>
520 <context>
521 <name>DataManager</name>
522 <message>
523 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
524 <translation type="unfinished"/>
518525 </message>
519526 </context>
520527 <context>
13861393 <translation>Por favor, digite o nome do computador</translation>
13871394 </message>
13881395 <message>
1389 <source>Failed to save current account</source>
1390 <translation>Falha ao salvar a conta atual</translation>
1391 </message>
1392 <message>
13931396 <source>%1 Server Address</source>
13941397 <translation type="unfinished"/>
13951398 </message>
25262529 <context>
25272530 <name>SeafileApplet</name>
25282531 <message>
2529 <source>failed to add default account</source>
2530 <translation>Falha ao adicionar conta padrão</translation>
2531 </message>
2532 <message>
25332532 <source>Failed to initialize log: %s</source>
25342533 <translation>Falho ao inicializar o histórico: %s</translation>
25352534 </message>
31443143 </message>
31453144 </context>
31463145 <context>
3146 <name>SyncErrorsTableView</name>
3147 <message>
3148 <source>Delete file sync error failed</source>
3149 <translation type="unfinished"/>
3150 </message>
3151 </context>
3152 <context>
31473153 <name>TwoFactorDialog</name>
31483154 <message>
31493155 <source>Enter the two factor authentication token</source>
517517 </message>
518518 </context>
519519 <context>
520 <name>DataManager</name>
521 <message>
522 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
523 <translation type="unfinished"/>
524 </message>
525 </context>
526 <context>
520527 <name>DownloadRepoDialog</name>
521528 <message>
522529 <source>Please enter the password</source>
13791386 <translation type="unfinished"/>
13801387 </message>
13811388 <message>
1382 <source>Failed to save current account</source>
1383 <translation>Falha ao guardar conta atual</translation>
1384 </message>
1385 <message>
13861389 <source>%1 Server Address</source>
13871390 <translation type="unfinished"/>
13881391 </message>
25192522 <context>
25202523 <name>SeafileApplet</name>
25212524 <message>
2522 <source>failed to add default account</source>
2523 <translation type="unfinished"/>
2524 </message>
2525 <message>
25262525 <source>Failed to initialize log: %s</source>
25272526 <translation type="unfinished"/>
25282527 </message>
31363135 </message>
31373136 </context>
31383137 <context>
3138 <name>SyncErrorsTableView</name>
3139 <message>
3140 <source>Delete file sync error failed</source>
3141 <translation type="unfinished"/>
3142 </message>
3143 </context>
3144 <context>
31393145 <name>TwoFactorDialog</name>
31403146 <message>
31413147 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
859866 </message>
860867 <message>
861868 <source>Failed to get upload link information for file &quot;%1&quot;</source>
862 <translation type="unfinished"/>
869 <translation>Не удалось получить информацию о ссылке для загрузки файла &quot;%1&quot;</translation>
863870 </message>
864871 </context>
865872 <context>
10941101 </message>
10951102 <message>
10961103 <source>&amp;Generate %1 Upload Link</source>
1097 <translation type="unfinished"/>
1104 <translation>&amp;Создать %1 ссылку для загрузки</translation>
10981105 </message>
10991106 </context>
11001107 <context>
11011108 <name>FinderSyncHost</name>
11021109 <message>
11031110 <source>Failed to get link</source>
1104 <translation type="unfinished"/>
1111 <translation>Не удалось получить ссылку</translation>
11051112 </message>
11061113 <message>
11071114 <source>File &quot;%1&quot; is locked by %2</source>
1108 <translation type="unfinished"/>
1115 <translation>Файл &quot;%1&quot; заблокирован %2</translation>
11091116 </message>
11101117 <message>
11111118 <source>Failed to get lock information for file &quot;%1&quot;</source>
1112 <translation type="unfinished"/>
1119 <translation>Не удалось получить информацию о блокировке файла &quot;%1&quot;</translation>
11131120 </message>
11141121 <message>
11151122 <source>Failed to get upload link for file &quot;%1&quot;</source>
1116 <translation type="unfinished"/>
1123 <translation>Не удалось получить ссылку для загрузки файла &quot;%1&quot;</translation>
11171124 </message>
11181125 </context>
11191126 <context>
13891396 <translation>Пожалуйста, введите имя компьютера</translation>
13901397 </message>
13911398 <message>
1392 <source>Failed to save current account</source>
1393 <translation>Не удалось сохранить текущий аккаунт</translation>
1394 </message>
1395 <message>
13961399 <source>%1 Server Address</source>
13971400 <translation>%1 Адрес сервера</translation>
13981401 </message>
21852188 </message>
21862189 <message>
21872190 <source>failed to open sync error id database</source>
2188 <translation type="unfinished"/>
2191 <translation>не удалось открыть базу данных с кодом ошибки синхронизации</translation>
21892192 </message>
21902193 </context>
21912194 <context>
25332536 <context>
25342537 <name>SeafileApplet</name>
25352538 <message>
2536 <source>failed to add default account</source>
2537 <translation>не удалось добавить аккаунт по умолчанию</translation>
2538 </message>
2539 <message>
25402539 <source>Failed to initialize log: %s</source>
25412540 <translation>Ошибка инициализации лога: %s</translation>
25422541 </message>
30393038 </message>
30403039 <message>
30413040 <source>Upload Link</source>
3042 <translation type="unfinished"/>
3041 <translation>Ссылка для загрузки</translation>
30433042 </message>
30443043 <message>
30453044 <source>Upload link:</source>
3046 <translation type="unfinished"/>
3045 <translation>Ссылка для загрузки:</translation>
30473046 </message>
30483047 </context>
30493048 <context>
31503149 </message>
31513150 </context>
31523151 <context>
3152 <name>SyncErrorsTableView</name>
3153 <message>
3154 <source>Delete file sync error failed</source>
3155 <translation type="unfinished"/>
3156 </message>
3157 </context>
3158 <context>
31533159 <name>TwoFactorDialog</name>
31543160 <message>
31553161 <source>Enter the two factor authentication token</source>
517517 </message>
518518 </context>
519519 <context>
520 <name>DataManager</name>
521 <message>
522 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
523 <translation type="unfinished"/>
524 </message>
525 </context>
526 <context>
520527 <name>DownloadRepoDialog</name>
521528 <message>
522529 <source>Please enter the password</source>
13791386 <translation type="unfinished"/>
13801387 </message>
13811388 <message>
1382 <source>Failed to save current account</source>
1383 <translation>Nepodarilo sa uložiť aktuálny účet</translation>
1384 </message>
1385 <message>
13861389 <source>%1 Server Address</source>
13871390 <translation type="unfinished"/>
13881391 </message>
25192522 <context>
25202523 <name>SeafileApplet</name>
25212524 <message>
2522 <source>failed to add default account</source>
2523 <translation type="unfinished"/>
2524 </message>
2525 <message>
25262525 <source>Failed to initialize log: %s</source>
25272526 <translation type="unfinished"/>
25282527 </message>
31363135 </message>
31373136 </context>
31383137 <context>
3138 <name>SyncErrorsTableView</name>
3139 <message>
3140 <source>Delete file sync error failed</source>
3141 <translation type="unfinished"/>
3142 </message>
3143 </context>
3144 <context>
31393145 <name>TwoFactorDialog</name>
31403146 <message>
31413147 <source>Enter the two factor authentication token</source>
512512 </message>
513513 </context>
514514 <context>
515 <name>DataManager</name>
516 <message>
517 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
518 <translation type="unfinished"/>
519 </message>
520 </context>
521 <context>
515522 <name>DownloadRepoDialog</name>
516523 <message>
517524 <source>Please enter the password</source>
13681375 <translation type="unfinished"/>
13691376 </message>
13701377 <message>
1371 <source>Failed to save current account</source>
1372 <translation type="unfinished"/>
1373 </message>
1374 <message>
13751378 <source>%1 Server Address</source>
13761379 <translation type="unfinished"/>
13771380 </message>
25062509 <context>
25072510 <name>SeafileApplet</name>
25082511 <message>
2509 <source>failed to add default account</source>
2510 <translation type="unfinished"/>
2511 </message>
2512 <message>
25132512 <source>Failed to initialize log: %s</source>
25142513 <translation type="unfinished"/>
25152514 </message>
31193118 </message>
31203119 <message>
31213120 <source>Time</source>
3121 <translation type="unfinished"/>
3122 </message>
3123 </context>
3124 <context>
3125 <name>SyncErrorsTableView</name>
3126 <message>
3127 <source>Delete file sync error failed</source>
31223128 <translation type="unfinished"/>
31233129 </message>
31243130 </context>
521521 </message>
522522 </context>
523523 <context>
524 <name>DataManager</name>
525 <message>
526 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
527 <translation type="unfinished"/>
528 </message>
529 </context>
530 <context>
524531 <name>DownloadRepoDialog</name>
525532 <message>
526533 <source>Please enter the password</source>
13871394 <translation>Lütfen bilgisayar adını giriniz</translation>
13881395 </message>
13891396 <message>
1390 <source>Failed to save current account</source>
1391 <translation>Mevcut hesabı kaydetme başarısız</translation>
1392 </message>
1393 <message>
13941397 <source>%1 Server Address</source>
13951398 <translation type="unfinished"/>
13961399 </message>
25272530 <context>
25282531 <name>SeafileApplet</name>
25292532 <message>
2530 <source>failed to add default account</source>
2531 <translation type="unfinished"/>
2532 </message>
2533 <message>
25342533 <source>Failed to initialize log: %s</source>
25352534 <translation>Log %s başlatılamadı</translation>
25362535 </message>
31443143 </message>
31453144 </context>
31463145 <context>
3146 <name>SyncErrorsTableView</name>
3147 <message>
3148 <source>Delete file sync error failed</source>
3149 <translation type="unfinished"/>
3150 </message>
3151 </context>
3152 <context>
31473153 <name>TwoFactorDialog</name>
31483154 <message>
31493155 <source>Enter the two factor authentication token</source>
517517 </message>
518518 </context>
519519 <context>
520 <name>DataManager</name>
521 <message>
522 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
523 <translation type="unfinished"/>
524 </message>
525 </context>
526 <context>
520527 <name>DownloadRepoDialog</name>
521528 <message>
522529 <source>Please enter the password</source>
13791386 <translation>Будь ласка, введіть ім&apos;я комп&apos;ютера</translation>
13801387 </message>
13811388 <message>
1382 <source>Failed to save current account</source>
1383 <translation>Не вдалося зберігти поточний аккаунт</translation>
1384 </message>
1385 <message>
13861389 <source>%1 Server Address</source>
13871390 <translation type="unfinished"/>
13881391 </message>
25192522 <context>
25202523 <name>SeafileApplet</name>
25212524 <message>
2522 <source>failed to add default account</source>
2523 <translation type="unfinished"/>
2524 </message>
2525 <message>
25262525 <source>Failed to initialize log: %s</source>
25272526 <translation type="unfinished"/>
25282527 </message>
31363135 </message>
31373136 </context>
31383137 <context>
3138 <name>SyncErrorsTableView</name>
3139 <message>
3140 <source>Delete file sync error failed</source>
3141 <translation type="unfinished"/>
3142 </message>
3143 </context>
3144 <context>
31393145 <name>TwoFactorDialog</name>
31403146 <message>
31413147 <source>Enter the two factor authentication token</source>
513513 <message>
514514 <source>%1 exited unexpectedly</source>
515515 <translation>%1意外退出</translation>
516 </message>
517 </context>
518 <context>
519 <name>DataManager</name>
520 <message>
521 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
522 <translation>另一个复制或移动操作正在进行中。请等待操作完成。</translation>
516523 </message>
517524 </context>
518525 <context>
13811388 <translation>请填写计算机名</translation>
13821389 </message>
13831390 <message>
1384 <source>Failed to save current account</source>
1385 <translation>保存帐户失败</translation>
1386 </message>
1387 <message>
13881391 <source>%1 Server Address</source>
13891392 <translation>%1 云盘网址</translation>
13901393 </message>
25252528 <context>
25262529 <name>SeafileApplet</name>
25272530 <message>
2528 <source>failed to add default account</source>
2529 <translation>添加默认帐户失败</translation>
2530 </message>
2531 <message>
25322531 <source>Failed to initialize log: %s</source>
25332532 <translation>初始化日志失败: %s</translation>
25342533 </message>
31423141 </message>
31433142 </context>
31443143 <context>
3144 <name>SyncErrorsTableView</name>
3145 <message>
3146 <source>Delete file sync error failed</source>
3147 <translation>删除文件同步错误失败</translation>
3148 </message>
3149 <message>
3150 <source>delete</source>
3151 <translation>删除</translation>
3152 </message>
3153 </context>
3154 <context>
31453155 <name>TwoFactorDialog</name>
31463156 <message>
31473157 <source>Enter the two factor authentication token</source>
520520 </message>
521521 </context>
522522 <context>
523 <name>DataManager</name>
524 <message>
525 <source>Another copy or move operation is in progress. Please wait until it finishes.</source>
526 <translation type="unfinished"/>
527 </message>
528 </context>
529 <context>
523530 <name>DownloadRepoDialog</name>
524531 <message>
525532 <source>Please enter the password</source>
13881395 <translation>請輸入此計算機的代號</translation>
13891396 </message>
13901397 <message>
1391 <source>Failed to save current account</source>
1392 <translation>無法儲存目前帳號</translation>
1393 </message>
1394 <message>
13951398 <source>%1 Server Address</source>
13961399 <translation type="unfinished"/>
13971400 </message>
25292532 <context>
25302533 <name>SeafileApplet</name>
25312534 <message>
2532 <source>failed to add default account</source>
2533 <translation type="unfinished"/>
2534 </message>
2535 <message>
25362535 <source>Failed to initialize log: %s</source>
25372536 <translation>無法初始化日誌: %s</translation>
25382537 </message>
31463145 </message>
31473146 </context>
31483147 <context>
3148 <name>SyncErrorsTableView</name>
3149 <message>
3150 <source>Delete file sync error failed</source>
3151 <translation type="unfinished"/>
3152 </message>
3153 </context>
3154 <context>
31493155 <name>TwoFactorDialog</name>
31503156 <message>
31513157 <source>Enter the two factor authentication token</source>
269269 return accounts_;
270270 }
271271
272 int AccountManager::saveAccount(const Account& account)
273 {
272 void AccountManager::setCurrentAccount(const Account& account)
273 {
274 Q_ASSERT(account.isValid());
275
276 emit beforeAccountSwitched();
277
274278 Account new_account = account;
275279 bool account_exist = false;
276280 {
277281 QMutexLocker lock(&accounts_mutex_);
278 for (size_t i = 0; i < accounts_.size(); i++) {
282 size_t i;
283 for (i = 0; i < accounts_.size(); i++) {
279284 if (accounts_[i] == account) {
280285 accounts_.erase(accounts_.begin() + i);
281286 account_exist = true;
284289 }
285290 accounts_.insert(accounts_.begin(), new_account);
286291 }
287 updateServerInfo(0);
292 AccountInfoService::instance()->refresh();
293 updateAccountServerInfo(new_account);
288294
289295 qint64 timestamp = QDateTime::currentMSecsSinceEpoch();
290296
330336 sqlite3_free(zql);
331337
332338 emit accountsChanged();
333
334 return 0;
335339 }
336340
337341 int AccountManager::removeAccount(const Account& account)
401405 sqlite3_free(zql);
402406 }
403407
404 bool AccountManager::accountExists(const QUrl& url, const QString& username)
408 bool AccountManager::accountExists(const QUrl& url, const QString& username) const
405409 {
406410 for (size_t i = 0; i < accounts_.size(); i++) {
407411 if (accounts_[i].serverUrl == url && accounts_[i].username == username) {
412416 return false;
413417 }
414418
415 bool AccountManager::validateAndUseAccount(const Account& account)
419 void AccountManager::validateAndUseAccount(const Account& account)
416420 {
417421 if (!account.isAutomaticLogin) {
418422 clearAccountToken(account);
419 return reloginAccount(account);
420 }
421 else if (!account.isValid()) {
422 return reloginAccount(account);
423 }
424 else {
425 return setCurrentAccount(account);
426 }
427 }
428
429 bool AccountManager::setCurrentAccount(const Account& account)
430 {
431 Q_ASSERT(account.isValid());
432
433 if (account == currentAccount()) {
434 return false;
435 }
436
437 emit beforeAccountSwitched();
438
439 // Would emit "accountsChanged" signal
440 saveAccount(account);
441
442 AccountInfoService::instance()->refresh();
443
444 return true;
423 reloginAccount(account);
424 } else if (!account.isValid()) {
425 reloginAccount(account);
426 } else {
427 setCurrentAccount(account);
428 }
445429 }
446430
447431 int AccountManager::replaceAccount(const Account& old_account, const Account& new_account)
453437 // TODO copy new_account and old_account before this operation
454438 // we might have invalid old_account or new_account after it
455439 accounts_[i] = new_account;
456 updateServerInfo(i);
440 updateAccountServerInfo(new_account);
457441 break;
458442 }
459443 }
521505 return Account();
522506 }
523507
524 void AccountManager::updateServerInfo()
508 void AccountManager::updateServerInfoForAllAccounts()
525509 {
526510 for (size_t i = 0; i < accounts_.size(); i++)
527 updateServerInfo(i);
528 }
529
530 void AccountManager::updateServerInfo(unsigned index)
531 {
532 ServerInfoRequest *request;
533 // request is taken owner by Account object
534 request = accounts_[index].createServerInfoRequest();
511 updateAccountServerInfo(accounts_[i]);
512 }
513
514 void AccountManager::updateAccountServerInfo(const Account& account)
515 {
516 ServerInfoRequest *request = new ServerInfoRequest(account);
535517 connect(request, SIGNAL(success(const Account&, const ServerInfo &)),
536518 this, SLOT(serverInfoSuccess(const Account&, const ServerInfo &)));
537519 connect(request, SIGNAL(failed(const ApiError&)),
561543
562544 void AccountManager::serverInfoSuccess(const Account &_account, const ServerInfo &info)
563545 {
546 ServerInfoRequest *req = (ServerInfoRequest *)(sender());
547 req->deleteLater();
548
564549 Account account = _account;
565550 account.serverInfo = info;
566551
593578
594579 void AccountManager::serverInfoFailed(const ApiError &error)
595580 {
581 ServerInfoRequest *req = (ServerInfoRequest *)(sender());
582 req->deleteLater();
583
596584 qWarning("update server info failed %s\n", error.toString().toUtf8().data());
597585 }
598586
599 bool AccountManager::clearAccountToken(const Account& account)
587 void AccountManager::clearAccountToken(const Account& account)
600588 {
601589 for (size_t i = 0; i < accounts_.size(); i++) {
602590 if (accounts_[i] == account) {
619607 sqlite3_free(zql);
620608
621609 emit accountsChanged();
622
623 return true;
624 }
625
626 bool AccountManager::clearSyncToken(const Account& account)
610 }
611
612 void AccountManager::clearSyncToken(const Account& account)
627613 {
628614 QString error;
629615 QUrl url = account.serverUrl;
633619 &error) < 0) {
634620 seafApplet->warningBox(
635621 tr("Failed to remove local repos sync token: %1").arg(error));
636 return false;
637 } else {
638 return true;
639622 }
640623 }
641624
709692 emit accountRequireRelogin(account);
710693 }
711694
712 bool AccountManager::reloginAccount(const Account &account_in)
695 void AccountManager::reloginAccount(const Account &account_in)
713696 {
714697 qWarning("Relogin to account %s", account_in.username.toUtf8().data());
715698 bool accepted;
740723 // current account is the newly relogged in account.
741724 getSyncedReposToken(currentAccount());
742725 }
743
744 return accepted;
745726 }
746727
747728 void AccountManager::getSyncedReposToken(const Account& account)
800781 }
801782 req->deleteLater();
802783 }
784
785 const std::vector<Account>& AccountManager::accounts() const
786 {
787 return accounts_;
788 }
789
790 bool AccountManager::hasAccount() const {
791 return !accounts_.empty();
792 }
793
794 const Account AccountManager::currentAccount() const {
795 return hasAccount() ? accounts_[0] : Account();
796 }
1313 class ApiError;
1414 class SeafileRpcClient;
1515
16 /**
17 * Load/Save seahub accounts
18 */
16
1917 class AccountManager : public QObject {
2018 Q_OBJECT
2119
2422 ~AccountManager();
2523
2624 int start();
27 void updateServerInfo();
2825
29 int saveAccount(const Account& account);
26 // Load the accounts from local db when client starts.
27 const std::vector<Account>& loadAccounts();
28
29 /**
30 * Account operations
31 */
32
33 // Use the given account. This account would also be persisted to
34 // the accounts db.
35 void setCurrentAccount(const Account& account);
36
37 // Remove the account. Used when user removes an account from the
38 // account menu.
3039 int removeAccount(const Account& account);
3140
41 // Update the account details. Currently it's only used to update
42 // the server address in AccountSettingsDialog.
43 // TODO: replace this with a more restricted `updateAccountURL` interface.
44 int replaceAccount(const Account& old_account,
45 const Account& new_account);
46
47 // Use the account if it's valid, otherwise require a re-login.
48 void validateAndUseAccount(const Account& account);
49
50 // Called when API returns 401 and we need to re-login current
51 // account.
52 void invalidateCurrentLogin();
53
54 // Update AccountInfo (e.g. nick name, quota etc.) for the given
55 // account.
56 void updateAccountInfo(const Account& account,
57 const AccountInfo& info);
58
59 // Trigger server info refresh for all accounts when client
60 // starts.
61 void updateServerInfoForAllAccounts();
62
63 /**
64 * Logout
65 */
66
67 // Called When the user chooses to log out current account.
3268 void logoutDevice(const Account& account);
33 void logoutDeviceNonautoLogin();
34
35 bool clearAccountToken(const Account& account);
36 bool clearSyncToken(const Account& account);
69 // Before client exits, remove sync tokens for all accounts that
70 // doesn't have auot-login set.
3771 void removeNonautoLoginSyncTokens();
3872
39 const std::vector<Account>& loadAccounts();
40 bool accountExists(const QUrl& url, const QString& username);
73 /**
74 * Accessors
75 */
4176
42 bool hasAccount() const { return !accounts_.empty(); }
77 const std::vector<Account>& accounts() const;
4378
44 Account currentAccount() const { return hasAccount() ? accounts_[0] : Account(); }
79 const Account currentAccount() const;
4580
46 bool setCurrentAccount(const Account& account);
81 bool hasAccount() const;
4782
48 int replaceAccount(const Account& old_account,
49 const Account& new_account);
83 bool accountExists(const QUrl& url, const QString& username) const;
5084
5185 Account getAccountByHostAndUsername(const QString& host,
5286 const QString& username) const;
5387
5488 Account getAccountBySignature(const QString& account_sig) const;
5589
56 /// \brief find the Account By Repo ID
57 /// return an invalid Account if failed
5890 Account getAccountByRepo(const QString& repo_id);
5991
60 // Also used by extension handler
6192 Account getAccountByRepo(const QString& repo_id, SeafileRpcClient *rpc);
62
63 void updateAccountInfo(const Account& account, const AccountInfo& info);
64
65 bool validateAndUseAccount(const Account& account);
66
67 // accessors
68 const std::vector<Account>& accounts() const { return accounts_; }
69
70 // invalidate current login and emit a re-login signal
71 void invalidateCurrentLogin();
7293
7394 signals:
7495 /**
83104 void accountInfoUpdated(const Account& account);
84105
85106 public slots:
86 bool reloginAccount(const Account &account);
107 void reloginAccount(const Account &account);
87108
88109 private slots:
89110 void serverInfoSuccess(const Account &account, const ServerInfo &info);
99120 private:
100121 Q_DISABLE_COPY(AccountManager)
101122
102 void updateServerInfo(unsigned index);
123 void updateAccountServerInfo(const Account& account);
103124 static bool loadAccountsCB(struct sqlite3_stmt *stmt, void *data);
104125 static bool loadServerInfoCB(struct sqlite3_stmt *stmt, void *data);
105126
106127 void updateAccountLastVisited(const Account& account);
107128 void getSyncedReposToken(const Account& account);
108129 void sendGetRepoTokensRequet(const Account& account, const QStringList& repo_ids, int max_retries);
130
131 void logoutDeviceNonautoLogin();
132 void clearAccountToken(const Account& account);
133 void clearSyncToken(const Account& account);
109134
110135 QHash<QString, Account> accounts_cache_;
111136
00 #include "account.h"
11 #include "utils/utils.h"
22 #include "api/requests.h"
3
4 Account::~Account()
5 {
6 if (serverInfoRequest)
7 serverInfoRequest->deleteLater();
8 }
9
10 ServerInfoRequest* Account::createServerInfoRequest()
11 {
12 if (serverInfoRequest)
13 serverInfoRequest->deleteLater();
14 return serverInfoRequest = new ServerInfoRequest(*this);
15 }
163
174 QUrl Account::getAbsoluteUrl(const QString& relativeUrl) const
185 {
55 #include <QMetaType>
66
77 #include "api/server-info.h"
8
9 class ServerInfoRequest;
108
119 class AccountInfo {
1210 public:
1816
1917 class Account {
2018 friend class AccountManager;
21 ServerInfoRequest *serverInfoRequest;
22 ServerInfoRequest* createServerInfoRequest();
2319 public:
2420 ServerInfo serverInfo;
2521 AccountInfo accountInfo;
3127 bool isAutomaticLogin;
3228 QString s2fa_token;
3329
34 ~Account();
35 Account() : serverInfoRequest(NULL),
36 serverInfo(),
30 Account() : serverInfo(),
3731 lastVisited(0),
3832 isShibboleth(false),
3933 isAutomaticLogin(true) {}
4034 Account(QUrl serverUrl, QString username, QString token,
4135 qint64 lastVisited=0, bool isShibboleth = false,
4236 bool isAutomaticLogin = true, QString s2fa_token = QString())
43 : serverInfoRequest(NULL),
44 serverInfo(),
37 : serverInfo(),
4538 accountInfo(),
4639 serverUrl(serverUrl),
4740 username(username),
5245 s2fa_token(s2fa_token) {}
5346
5447 Account(const Account &rhs)
55 : serverInfoRequest(NULL),
56 serverInfo(rhs.serverInfo),
48 : serverInfo(rhs.serverInfo),
5749 accountInfo(rhs.accountInfo),
5850 serverUrl(rhs.serverUrl),
5951 username(rhs.username),
6658 }
6759
6860 Account& operator=(const Account&rhs) {
69 serverInfoRequest = NULL;
7061 serverInfo = rhs.serverInfo;
7162 accountInfo = rhs.accountInfo;
7263 serverUrl = rhs.serverUrl;
119110 (majorVersion << 20) + (minorVersion << 10) + (patchVersion);
120111 }
121112
122 int getEncryptedLibraryVersion() {
113 int getEncryptedLibraryVersion() const {
123114 return serverInfo.encryptedLibraryVersion;
124115 }
125116 // require pro edtions and version at least at ...
138138 QNetworkRequest request(url);
139139 prepareRequest(&request);
140140
141 request.setHeader(QNetworkRequest::ContentTypeHeader, kContentTypeForm);
141 if (!headers_.contains("Content-Type")) {
142 request.setHeader(QNetworkRequest::ContentTypeHeader, kContentTypeForm);
143 }
142144
143145 if (is_put)
144146 reply_ = qnam_->put(request, body_);
3737 form_params_[name] = value;
3838 }
3939
40 void SeafileApiRequest::setRequestBody(const QByteArray& content)
41 {
42 if (method_ != METHOD_PUT && method_ != METHOD_POST) {
43 qWarning("warning: calling setRequestBody on a request with method %d\n", method_);
44 }
45 post_data_ = content;
46 }
47
4048 void SeafileApiRequest::setUseCache(bool use_cache)
4149 {
4250 api_client_->setUseCache(use_cache);
6876 break;
6977 case METHOD_POST:
7078 case METHOD_PUT:
71 post_data = ::buildFormData(form_params_);
72 api_client_->post(url_, post_data, method_ == METHOD_PUT);
79 if (!post_data_.isEmpty()) {
80 api_client_->post(url_, post_data_, method_ == METHOD_PUT);
81 } else {
82 post_data = ::buildFormData(form_params_);
83 api_client_->post(url_, post_data, method_ == METHOD_PUT);
84 }
7385 break;
7486 default:
7587 qWarning("unknown method %d\n", method_);
7688 return;
7789 }
7890
91 post_data_.clear();
7992 connect(api_client_, SIGNAL(requestSuccess(QNetworkReply&)),
8093 this, SLOT(requestSuccess(QNetworkReply&)));
8194
2929 void setUrlParam(const QString& name, const QString& value);
3030 // set param k-v pair which appears in url-encoded form
3131 void setFormParam(const QString& name, const QString& value);
32 // set http request body directly
33 void setRequestBody(const QByteArray& content);
3234 // useful for static resources like images
3335 void setUseCache(bool use_cache);
3436
7981 QHash<QString, QString> form_params_;
8082 Method method_;
8183 QString token_;
84 QByteArray post_data_;
85
8286 SeafileApiClient* api_client_;
8387 };
8488
417417
418418 private:
419419 Q_DISABLE_COPY(ServerInfoRequest);
420 const Account& account_;
420 const Account account_;
421421 };
422422
423423 class LogoutDeviceRequest : public SeafileApiRequest
2525 const char *kSparkleAppcastURIForCN = "https://www.seafile.com/api/client-updates/seafile-client-mac-cn/appcast.xml";
2626 #endif
2727 const char *kSparkleAlreadyEnableUpdateByDefault = "SparkleAlreadyEnableUpdateByDefault";
28 const char *kPreconfigureEnableAutoUpdate = "PreconfigureEnableAutoUpdate";
2829
2930 QString getAppcastURI() {
3031 QString url_from_env = qgetenv("SEAFILE_CLIENT_APPCAST_URI");
138139 QSettings settings;
139140 settings.beginGroup("Misc");
140141 bool already_enable_update_by_default = settings.value(kSparkleAlreadyEnableUpdateByDefault, false).toBool();
142 #if defined(Q_OS_WIN32)
143 QString enable_auto_update = seafApplet->readPreconfigureExpandedString(kPreconfigureEnableAutoUpdate);
141144
145 if (enable_auto_update == "1") {
146 setAutoUpdateEnabled(true);
147 } else if (enable_auto_update == "0") {
148 setAutoUpdateEnabled(false);
149 } else if (!already_enable_update_by_default && enable_auto_update.isEmpty()) {
150 settings.setValue(kSparkleAlreadyEnableUpdateByDefault, true);
151 setAutoUpdateEnabled(true);
152 }
153 #else
142154 if (!already_enable_update_by_default) {
143155 settings.setValue(kSparkleAlreadyEnableUpdateByDefault, true);
144156 setAutoUpdateEnabled(true);
145157 }
158 #endif
146159
147160 settings.endGroup();
148161 }
2525 const char *kFileCacheTopDirName = "file-cache";
2626 const int kPasswordCacheExpirationMSecs = 30 * 60 * 1000;
2727
28 const int kQueryAsyncOperationProgressInterval = 1000;
2829 } // namespace
2930
3031 /**
177178
178179 void DataManager::copyDirents(const QString &repo_id,
179180 const QString &dir_path,
180 const QStringList &file_names,
181 const QMap<QString, int> &dict_file_names,
181182 const QString &dst_repo_id,
182183 const QString &dst_dir_path)
183184 {
184 CopyMultipleFilesRequest *req =
185 new CopyMultipleFilesRequest(account_, repo_id, dir_path, file_names,
186 dst_repo_id,
187 dst_dir_path);
188 connect(req, SIGNAL(success(const QString&)),
189 SLOT(onCopyDirentsSuccess(const QString&)));
190
191 connect(req, SIGNAL(failed(const ApiError&)),
192 SIGNAL(copyDirentsFailed(const ApiError&)));
193 reqs_.push_back(req);
194 req->send();
185 if(copy_move_in_progress_) {
186 seafApplet->warningBox(tr("Another copy or move operation is in progress. Please wait until it finishes."));
187 return;
188 }
189
190 copy_move_in_progress_ = true;
191
192 repo_id_ = repo_id;
193 dir_path_ = dir_path;
194 dst_repo_id_ = dst_repo_id;
195 dst_dir_path_ = dst_dir_path;
196 src_dirents_ = dict_file_names;
197
198 query_async_opera_progress_timer_ = new QTimer(this);
199 query_async_opera_progress_timer_->setInterval(kQueryAsyncOperationProgressInterval);
200 connect(query_async_opera_progress_timer_, SIGNAL(timeout()),
201 this, SLOT(slotQueryAsyncCopyOperaProgress()));
202
203 if (repo_id == dst_repo_id) {
204 QStringList file_names;
205 for(const QString &file_name : dict_file_names.keys()) {
206 file_names.push_back(file_name);
207 }
208
209 CopyMultipleFilesRequest *req =
210 new CopyMultipleFilesRequest(account_,
211 repo_id,
212 dir_path,
213 file_names,
214 dst_repo_id,
215 dst_dir_path);
216
217 connect(req, SIGNAL(success(const QString&)),
218 SLOT(onCopyDirentsSuccess(const QString&)));
219
220 connect(req, SIGNAL(failed(const ApiError&)),
221 SIGNAL(copyDirentsFailed(const ApiError&)));
222 reqs_.push_back(req);
223 req->send();
224
225 } else {
226 // First to invoke ssync api v2.1 if async api return 404 ,then invoke v2.0 async api
227 AsyncCopyMultipleItemsRequest *req =
228 new AsyncCopyMultipleItemsRequest(account_,
229 repo_id,
230 dir_path,
231 dict_file_names,
232 dst_repo_id,
233 dst_dir_path);
234
235 connect(req, SIGNAL(success(const QString&)),
236 SLOT(slotAsyncCopyMutipleItemsSuccess(const QString&)));
237 connect(req, SIGNAL(failed(const ApiError&)),
238 SLOT(slotAsyncCopyMutipleItemsFailed(const ApiError&)));
239 reqs_.push_back(req);
240 req->send();
241 }
242 }
243
244 void DataManager::slotAsyncCopyMutipleItemsSuccess(const QString& task_id)
245 {
246 task_id_ = task_id;
247 is_batch_operation_ = true;
248 query_async_opera_progress_timer_->start();
249 }
250
251 void DataManager::slotAsyncCopyMutipleItemsFailed(const ApiError& error)
252 {
253 if (error.httpErrorCode() == 404) {
254 qWarning("new async copy API is not available on server, use old async copy single item API");
255 asyncCopyOneItemApi();
256 is_batch_operation_ = false;
257 } else {
258 emit copyDirentsFailed(error);
259 copy_move_in_progress_ = false;
260 }
261 }
262
263 void DataManager::asyncCopyOneItemApi()
264 {
265 qWarning("use old sync copy task api");
266 if(src_dirents_.isEmpty()) {
267 copy_move_in_progress_ = false;
268 return ;
269 }
270
271 const QString& filename = src_dirents_.firstKey();
272 async_copy_one_item_req_.reset(new AsyncCopyAndMoveOneItemRequest(account_,
273 repo_id_,
274 dir_path_,
275 filename,
276 dst_repo_id_,
277 dst_dir_path_,
278 "copy",
279 src_dirents_[filename] == 1 ? "DIR" : "FILE"));
280
281 connect(async_copy_one_item_req_.data(), SIGNAL(success(const QString&)),
282 this, SLOT(slotAsyncCopyOneItemSuccess(const QString&)));
283
284 connect(async_copy_one_item_req_.data(), SIGNAL(failed( const ApiError&)),
285 SLOT(slotAsyncCopyOneItemFailed( const ApiError&)));
286
287 async_copy_one_item_req_->send();
288 src_dirents_.remove(filename);
289 }
290 void DataManager::slotAsyncCopyOneItemSuccess(const QString& task_id)
291 {
292 task_id_ = task_id;
293 query_async_opera_progress_timer_->start();
294 }
295
296 void DataManager::slotAsyncCopyOneItemFailed(const ApiError& error)
297 {
298 query_async_opera_progress_timer_->stop();
299 emit copyDirentsFailed(error);
300 copy_move_in_progress_ = false;
301 }
302
303 void DataManager::slotQueryAsyncCopyOperaProgress()
304 {
305 QueryAsyncOperationProgress* query_async_opera_progress_req = new QueryAsyncOperationProgress(account_,
306 task_id_);
307 connect(query_async_opera_progress_req, SIGNAL(success()),
308 this, SLOT(slotQueryAsyncCopyOperationProgressSuccess()));
309
310 connect(query_async_opera_progress_req, SIGNAL(failed(const ApiError&)),
311 this, SLOT(slotQueryAsyncCopyOperationProgressFailed(const ApiError&)));
312
313 query_async_opera_progress_req->send();
314 }
315
316 void DataManager::slotQueryAsyncCopyOperationProgressSuccess()
317 {
318 QueryAsyncOperationProgress * req = qobject_cast<QueryAsyncOperationProgress *>(sender());
319 req->deleteLater();
320 query_async_opera_progress_timer_->stop();
321 onCopyDirentsSuccess(dst_repo_id_);
322 if (!is_batch_operation_) {
323 asyncCopyOneItemApi();
324 } else {
325 copy_move_in_progress_ = false;
326 }
327 }
328
329 void DataManager::slotQueryAsyncCopyOperationProgressFailed(const ApiError& error)
330 {
331 QueryAsyncOperationProgress * req = qobject_cast<QueryAsyncOperationProgress *>(sender());
332 req->deleteLater();
333 query_async_opera_progress_timer_->stop();
334 emit copyDirentsFailed(error);
335 copy_move_in_progress_ = false;
195336 }
196337
197338 void DataManager::moveDirents(const QString &repo_id,
198339 const QString &dir_path,
199 const QStringList &file_names,
340 const QMap<QString, int> &dict_file_names,
200341 const QString &dst_repo_id,
201342 const QString &dst_dir_path)
202343 {
203 MoveMultipleFilesRequest *req =
204 new MoveMultipleFilesRequest(account_, repo_id, dir_path, file_names,
205 dst_repo_id,
206 dst_dir_path);
207 connect(req, SIGNAL(success(const QString&)),
208 SLOT(onMoveDirentsSuccess(const QString&)));
209
210 connect(req, SIGNAL(failed(const ApiError&)),
211 SIGNAL(moveDirentsFailed(const ApiError&)));
212 reqs_.push_back(req);
213 req->send();
214 }
344
345 if(copy_move_in_progress_) {
346 seafApplet->warningBox(tr("Another copy or move operation is in progress. Please wait until it finishes."));
347 return;
348 }
349
350 copy_move_in_progress_ = true;
351
352 repo_id_ = repo_id;
353 dir_path_ = dir_path;
354 dst_repo_id_ = dst_repo_id;
355 dst_dir_path_ = dst_dir_path;
356 src_dirents_ = dict_file_names;
357
358
359 query_async_opera_progress_timer_ = new QTimer(this);
360 query_async_opera_progress_timer_->setInterval(kQueryAsyncOperationProgressInterval);
361 connect(query_async_opera_progress_timer_, SIGNAL(timeout()),
362 this, SLOT(slotQueryAsyncMoveOperaProgress()));
363
364 if (repo_id == dst_repo_id) {
365 QStringList file_names;
366 for(const QString &file_name : dict_file_names.keys()) {
367 file_names.push_back(file_name);
368 }
369
370 MoveMultipleFilesRequest *req =
371 new MoveMultipleFilesRequest(account_,
372 repo_id, dir_path, file_names,
373 dst_repo_id,
374 dst_dir_path);
375
376 connect(req, SIGNAL(success(const QString&)),
377 SLOT(onMoveDirentsSuccess(const QString&)));
378
379 connect(req, SIGNAL(failed(const ApiError&)),
380 SIGNAL(moveDirentsFailed(const ApiError&)));
381 reqs_.push_back(req);
382 req->send();
383 } else {
384 // First to invoke ssync api v2.1 if async api return 404 ,then invoke v2.0 async api
385 AsyncMoveMultipleItemsRequest *req =
386 new AsyncMoveMultipleItemsRequest(account_,
387 repo_id,
388 dir_path,
389 dict_file_names,
390 dst_repo_id,
391 dst_dir_path);
392
393 connect(req, SIGNAL(success(const QString&)),
394 SLOT(slotAsyncMoveMutipleItemsSuccess(const QString&)));
395 connect(req, SIGNAL(failed(const ApiError&)),
396 SLOT(slotAsyncMoveMutipleItemsFailed(const ApiError&)));
397 reqs_.push_back(req);
398 req->send();
399 }
400 }
401
402 void DataManager::slotAsyncMoveMutipleItemsSuccess(const QString& task_id)
403 {
404 task_id_ = task_id;
405 is_batch_operation_ = true;
406 query_async_opera_progress_timer_->start();
407 }
408
409 void DataManager::slotAsyncMoveMutipleItemsFailed(const ApiError& error)
410 {
411 if (error.httpErrorCode() == 404) {
412 qWarning("new async move API is not available on server, use old async move single item API");
413 asyncMoveOneItemApi();
414 is_batch_operation_ = false;
415 } else {
416 emit moveDirentsFailed(error);
417 copy_move_in_progress_ = false;
418 }
419 }
420
421 void DataManager::asyncMoveOneItemApi()
422 {
423 qWarning("use async move one item API");
424 if(src_dirents_.isEmpty()) {
425 copy_move_in_progress_ = false;
426 return ;
427 }
428
429 const QString& filename = src_dirents_.firstKey();
430 async_copy_one_item_req_.reset(new AsyncCopyAndMoveOneItemRequest(account_,
431 repo_id_,
432 dir_path_,
433 filename,
434 dst_repo_id_,
435 dst_dir_path_,
436 "move",
437 src_dirents_[filename] == 1 ? "DIR" : "FILE"));
438
439 connect(async_copy_one_item_req_.data(), SIGNAL(success(const QString&)),
440 this, SLOT(slotAsyncMoveOneItemSuccess(const QString&)));
441
442 connect(async_copy_one_item_req_.data(), SIGNAL(failed( const ApiError&)),
443 SLOT(slotAsyncMoveOneItemFailed( const ApiError&)));
444
445 async_copy_one_item_req_->send();
446 src_dirents_.remove(filename);
447 }
448
449 void DataManager::slotAsyncMoveOneItemSuccess(const QString& task_id)
450 {
451 task_id_ = task_id;
452 query_async_opera_progress_timer_->start();
453 }
454
455 void DataManager::slotAsyncMoveOneItemFailed(const ApiError& error)
456 {
457 query_async_opera_progress_timer_->stop();
458 emit moveDirentsFailed(error);
459 copy_move_in_progress_ = false;
460 }
461
462 void DataManager::slotQueryAsyncMoveOperaProgress()
463 {
464 QueryAsyncOperationProgress* query_async_opera_progress_req = new QueryAsyncOperationProgress(account_,
465 task_id_);
466 connect(query_async_opera_progress_req, SIGNAL(success()),
467 this, SLOT(slotQueryAsyncMoveOperationProgressSuccess()));
468
469 connect(query_async_opera_progress_req, SIGNAL(failed(const ApiError&)),
470 this, SLOT(slotQueryAsyncMoveOperationProgressFailed(const ApiError&)));
471
472 query_async_opera_progress_req->send();
473 }
474
475 void DataManager::slotQueryAsyncMoveOperationProgressSuccess()
476 {
477 QueryAsyncOperationProgress * req = qobject_cast<QueryAsyncOperationProgress *>(sender());
478 req->deleteLater();
479 query_async_opera_progress_timer_->stop();
480 dirents_cache_->expireCachedDirents(repo_id_, dir_path_);
481 moveDirentsSuccess(dst_repo_id_);
482 if (!is_batch_operation_) {
483 asyncMoveOneItemApi();
484 } else {
485 copy_move_in_progress_ = false;
486 }
487 }
488
489 void DataManager::slotQueryAsyncMoveOperationProgressFailed(const ApiError& error)
490 {
491 QueryAsyncOperationProgress * req = qobject_cast<QueryAsyncOperationProgress *>(sender());
492 req->deleteLater();
493 query_async_opera_progress_timer_->stop();
494 emit moveDirentsFailed(error);
495 copy_move_in_progress_ = false;
496 }
497
215498
216499 void DataManager::onGetDirentsSuccess(bool current_readonly, const QList<SeafDirent> &dirents, const QString& repo_id)
217500 {
2323 class FileNetworkTask;
2424 class FileUploadTask;
2525 class FileDownloadTask;
26 class QueryAsyncOperationProgress;
27 class AsyncCopyAndMoveOneItemRequest;
2628
2729 /**
2830 * DataManager is responsible for getting dirents/files from seahub, as well
7577
7678 void copyDirents(const QString &repo_id,
7779 const QString &dir_path,
78 const QStringList &file_names,
80 const QMap<QString, int> &dict_file_names,
7981 const QString &dst_repo_id,
8082 const QString &dst_dir_path);
8183
8284 void moveDirents(const QString &repo_id,
8385 const QString &dir_path,
84 const QStringList &file_names,
86 const QMap<QString, int> &dict_file_names,
8587 const QString &dst_repo_id,
8688 const QString &dst_dir_path);
8789
174176
175177 void onAccountChanged();
176178
179 public slots:
180 // async copy operation
181 void slotAsyncCopyMutipleItemsSuccess(const QString& task_id);
182 void slotAsyncCopyMutipleItemsFailed(const ApiError& error);
183 void asyncCopyOneItemApi();
184 void slotAsyncCopyOneItemSuccess(const QString& task_id);
185 void slotAsyncCopyOneItemFailed(const ApiError& error);
186 void slotQueryAsyncCopyOperaProgress();
187 void slotQueryAsyncCopyOperationProgressSuccess();
188 void slotQueryAsyncCopyOperationProgressFailed(const ApiError& error);
189
190 // async move operations
191 void slotAsyncMoveMutipleItemsSuccess(const QString& task_id);
192 void slotAsyncMoveMutipleItemsFailed(const ApiError& error);
193 void asyncMoveOneItemApi();
194 void slotAsyncMoveOneItemSuccess(const QString& task_id);
195 void slotAsyncMoveOneItemFailed(const ApiError& error);
196 void slotQueryAsyncMoveOperaProgress();
197 void slotQueryAsyncMoveOperationProgressSuccess();
198 void slotQueryAsyncMoveOperationProgressFailed(const ApiError& error);
199
177200 private:
178201 void removeDirentsCache(const QString& repo_id,
179202 const QString& path,
193216 DirentsCache *dirents_cache_;
194217 QString old_repo_id_;
195218
219 // copy and move struct
220 QMap<QString, int> src_dirents_;
221 QString repo_id_;
222 QString dir_path_;
223 QString dst_repo_id_;
224 QString dst_dir_path_;
225 bool is_batch_operation_;
226 QString task_id_;
227
196228 static QHash<QString, std::pair<qint64, QString> > passwords_cache_;
229 QTimer* query_async_opera_progress_timer_;
230 QScopedPointer<AsyncCopyAndMoveOneItemRequest, QScopedPointerDeleteLater> async_copy_one_item_req_;
231 bool copy_move_in_progress_;
197232 };
198233
199234
7979
8080 } // namespace
8181
82 QStringList FileBrowserDialog::file_names_to_be_pasted_;
82 QMap<QString, int> FileBrowserDialog::file_names_to_be_pasted_;
8383 QString FileBrowserDialog::dir_path_to_be_pasted_from_;
8484 QString FileBrowserDialog::repo_id_to_be_pasted_from_;
8585 Account FileBrowserDialog::account_to_be_pasted_from_;
14331433 return !file_names_to_be_pasted_.empty();
14341434 }
14351435
1436 void FileBrowserDialog::setFilesToBePasted(bool is_copy, const QStringList &file_names)
1436 void FileBrowserDialog::setFilesToBePasted(bool is_copy, const QMap<QString, int> &file_names)
14371437 {
14381438 is_copyed_when_pasted_ = is_copy;
14391439 dir_path_to_be_pasted_from_ = current_path_;
14551455 }
14561456
14571457 // Paste /a/ into /a/b/ is not allowed
1458 for (const QString& name : file_names_to_be_pasted_) {
1458 for (const QString& name : file_names_to_be_pasted_.keys()) {
14591459 const QString file_path_to_be_pasted =
14601460 appendTrailingSlash(::pathJoin(dir_path_to_be_pasted_from_, name));
14611461 if (appendTrailingSlash(current_path_).startsWith(file_path_to_be_pasted)) {
158158
159159 void done(int retval);
160160 bool hasFilesToBePasted();
161 void setFilesToBePasted(bool is_copy, const QStringList &file_names);
161 void setFilesToBePasted(bool is_copy, const QMap<QString ,int> &file_names);
162162
163163 void createToolBar();
164164 void createStatusBar();
203203 qint64 search_text_last_modified_;
204204
205205 // copy-paste related items between different instances of FileBrowserDialog
206 static QStringList file_names_to_be_pasted_;
206 static QMap<QString, int> file_names_to_be_pasted_;
207207 static QString dir_path_to_be_pasted_from_;
208208 static QString repo_id_to_be_pasted_from_;
209209 static Account account_to_be_pasted_from_;
22 #include <jansson.h>
33 #include <QtNetwork>
44 #include <QScopedPointer>
5 #include <QMapIterator>
56
67 #include "account.h"
78 #include "api/api-error.h"
910 #include "utils/utils.h"
1011 #include "utils/file-utils.h"
1112 #include "src/open-local-helper.h"
13 #include "utils/json-utils.h"
14 #include "seafile-applet.h"
1215
1316 namespace {
1417
1821 const char kGetFileUploadUrl[] = "api2/repos/%1/upload-link/";
1922 const char kGetFileUpdateUrl[] = "api2/repos/%1/update-link/";
2023 const char kGetStarredFilesUrl[] = "api2/starredfiles/";
24 const char kQueryAsyncOperationProgressUrl[] = "api/v2.1/query-copy-move-progress/";
25 const char kCopyMoveSingleItemUrl[] = "api/v2.1/copy-move-task/";
2126 const char kFileOperationCopy[] = "api2/repos/%1/fileops/copy/";
27 const char kAsyncCopyMultipleItems[] = "api/v2.1/repos/async-batch-copy-item/";
28 const char kAsyncMoveMultipleItems[] = "api/v2.1/repos/async-batch-move-item/";
2229 const char kFileOperationMove[] = "api2/repos/%1/fileops/move/";
2330 const char kRemoveDirentsURL[] = "api2/repos/%1/fileops/delete/";
2431 const char kGetFileUploadedBytesUrl[] = "api/v2.1/repos/%1/file-uploaded-bytes/";
2835 //const char kGetFileFromRevisionUrl[] = "api2/repos/%1/file/revision/";
2936 //const char kGetFileDetailUrl[] = "api2/repos/%1/file/detail/";
3037 //const char kGetFileHistoryUrl[] = "api2/repos/%1/file/history/";
38
39 QByteArray assembleJsonReq(const QString& repo_id, const QString& src_dir_path,
40 const QStringList& src_file_names, const QString& dst_repo_id,
41 const QString& dst_dir_path)
42 {
43 QJsonObject json_obj;
44 QJsonArray dirents_array;
45 json_obj.insert("src_repo_id", repo_id);
46 json_obj.insert("src_parent_dir", src_dir_path);
47 Q_FOREACH(const QString & src_file_name, src_file_names) {
48 dirents_array.append(src_file_name);
49 }
50 json_obj.insert("src_dirents", dirents_array);
51 json_obj.insert("dst_repo_id", dst_repo_id);
52 json_obj.insert("dst_parent_dir", dst_dir_path);
53
54 QJsonDocument json_document(json_obj);
55 return json_document.toJson(QJsonDocument::Compact);
56 }
3157
3258 } // namespace
3359
173199 emit failed(ApiError::fromHttpError(500));
174200 }
175201
202
176203 RenameDirentRequest::RenameDirentRequest(const Account &account,
177204 const QString &repo_id,
178205 const QString &path,
232259 emit success(repo_id_);
233260 }
234261
262
235263 MoveFileRequest::MoveFileRequest(const Account &account,
236264 const QString &repo_id,
237265 const QString &path,
252280 {
253281 emit success();
254282 }
283
284
285 QueryAsyncOperationProgress::QueryAsyncOperationProgress(const Account &account,
286 const QString& task_id)
287 : SeafileApiRequest(
288 account.getAbsoluteUrl(kQueryAsyncOperationProgressUrl),
289 SeafileApiRequest::METHOD_GET, account.token)
290 {
291 setUrlParam("task_id", task_id);
292 }
293
294 void QueryAsyncOperationProgress::requestSuccess(QNetworkReply& reply)
295 {
296 json_error_t error;
297 json_t* root = parseJSON(reply, &error);
298 if (!root) {
299 qWarning("failed to parse json:%s\n", error.text);
300 return;
301 }
302
303 Json json(root);
304 bool is_success = json.getBool("successful");
305 bool is_failed = json.getBool("failed");
306 if (is_success) {
307 emit success();
308 } else if (is_failed) {
309 qWarning("operation failed");
310 emit failed(ApiError::fromHttpError(500));
311 }
312 }
313
314
315 AsyncCopyAndMoveOneItemRequest::AsyncCopyAndMoveOneItemRequest(const Account &account,
316 const QString &src_repo_id,
317 const QString &src_parent_dir,
318 const QString &src_dirent_name,
319 const QString &dst_repo_id,
320 const QString &dst_parent_dir,
321 const QString &operation,
322 const QString &dirent_type)
323 : SeafileApiRequest(
324 account.getAbsoluteUrl(QString(kCopyMoveSingleItemUrl)),
325 SeafileApiRequest::METHOD_POST, account.token),
326 account_(account),
327 repo_id_(src_repo_id),
328 src_dir_path_(src_parent_dir),
329 src_dirent_name_(src_dirent_name),
330 dst_repo_id_(dst_repo_id),
331 dst_repo_path_(dst_parent_dir),
332 operation_(operation),
333 dirent_type_(dirent_type)
334 {
335 setFormParam("src_repo_id", src_repo_id);
336 setFormParam("src_parent_dir", src_parent_dir);
337 setFormParam("src_dirent_name", src_dirent_name);
338 setFormParam("dst_repo_id", dst_repo_id);
339 setFormParam("dst_parent_dir", dst_parent_dir);
340 setFormParam("operation", operation);
341 setFormParam("dirent_type", dirent_type);
342 }
343
344 void AsyncCopyAndMoveOneItemRequest::requestSuccess(QNetworkReply& reply)
345 {
346 json_error_t error;
347 json_t* root = parseJSON(reply, &error);
348 if (!root) {
349 qWarning("failed to parse json:%s\n", error.text);
350 return;
351 }
352
353 Json json(root);
354 QString task_id= json.getString("task_id");
355 emit success(task_id);
356 }
357
358
359 // Asynchronous copy multiple items
360 AsyncCopyMultipleItemsRequest::AsyncCopyMultipleItemsRequest(const Account &account,
361 const QString &repo_id,
362 const QString &src_dir_path,
363 const QMap<QString, int>&src_dirents,
364 const QString &dst_repo_id,
365 const QString &dst_dir_path)
366 : SeafileApiRequest(
367 account.getAbsoluteUrl(QString(kAsyncCopyMultipleItems)),
368 SeafileApiRequest::METHOD_POST, account.token),
369 account_(account),
370 repo_id_(repo_id),
371 src_dir_path_(src_dir_path),
372 src_dirents_(src_dirents),
373 dst_repo_id_(dst_repo_id),
374 dst_repo_path_(dst_dir_path)
375
376 {
377
378 setHeader("Content-Type","application/json");
379 setHeader("Accept", "application/json");
380
381 QStringList file_names;
382 for ( const QString & file_name : src_dirents.keys()) {
383 file_names.push_back(file_name);
384 }
385 QByteArray byte_array = assembleJsonReq(repo_id, src_dir_path, file_names,
386 dst_repo_id, dst_dir_path);
387 setRequestBody(byte_array);
388 }
389
390 void AsyncCopyMultipleItemsRequest::requestSuccess(QNetworkReply& reply)
391 {
392 json_error_t error;
393 json_t* root = parseJSON(reply, &error);
394 if (!root) {
395 qWarning("failed to parse json:%s\n", error.text);
396 return;
397 }
398
399 Json json(root);
400 QString task_id = json.getString("task_id");
401 emit success(task_id);
402 }
403
404
405 // Asynchronous api for move multiple items
406 AsyncMoveMultipleItemsRequest::AsyncMoveMultipleItemsRequest(const Account &account,
407 const QString &repo_id,
408 const QString &src_dir_path,
409 const QMap<QString, int> &src_dirents,
410 const QString &dst_repo_id,
411 const QString &dst_dir_path)
412 : SeafileApiRequest(
413 account.getAbsoluteUrl(QString(kAsyncMoveMultipleItems)),
414 SeafileApiRequest::METHOD_POST, account.token),
415 account_(account),
416 repo_id_(repo_id),
417 src_dir_path_(src_dir_path),
418 src_dirents_(src_dirents),
419 dst_repo_id_(dst_repo_id),
420 dst_repo_path_(dst_dir_path)
421 {
422 setHeader("Content-Type","application/json");
423 setHeader("Accept", "application/json");
424
425 QStringList file_names;
426 for ( const QString & file_name : src_dirents.keys()) {
427 file_names.push_back(file_name);
428 }
429
430 QByteArray byte_array = assembleJsonReq(repo_id, src_dir_path, file_names,
431 dst_repo_id, dst_dir_path);
432 setRequestBody(byte_array);
433 }
434
435 void AsyncMoveMultipleItemsRequest::requestSuccess(QNetworkReply& reply)
436 {
437 json_error_t error;
438 json_t* root = parseJSON(reply, &error);
439 if (!root) {
440 qWarning("failed to parse json:%s\n", error.text);
441 return;
442 }
443
444 Json json(root);
445 QString task_id = json.getString("task_id");
446 emit success(task_id);
447 }
448
255449
256450 CopyMultipleFilesRequest::CopyMultipleFilesRequest(const Account &account,
257451 const QString &repo_id,
22
33 #include <QList>
44 #include <QStringList>
5 #include <QTimer>
56
67 #include "api/api-request.h"
78 #include "seaf-dirent.h"
265266 const QString dst_repo_id_;
266267 };
267268
269
270 // Query asynchronous operation progress
271 class QueryAsyncOperationProgress : public SeafileApiRequest {
272 Q_OBJECT
273 public:
274 QueryAsyncOperationProgress(const Account &account,
275 const QString &task_id);
276 signals:
277 void success();
278
279 private slots:
280 void requestSuccess(QNetworkReply& reply);
281
282 };
283
284 // Async copy and move a single item
285 class AsyncCopyAndMoveOneItemRequest : public SeafileApiRequest {
286 Q_OBJECT
287 public:
288 AsyncCopyAndMoveOneItemRequest(const Account &account,
289 const QString &src_repo_id,
290 const QString &src_parent_dir,
291 const QString &src_dirent_name,
292 const QString &dst_repo_id,
293 const QString &dst_parent_dir,
294 const QString &operation,
295 const QString &dirent_type);
296
297 signals:
298 void success(const QString& task_id);
299
300 protected slots:
301 void requestSuccess(QNetworkReply& reply);
302
303 private:
304 const Account& account_;
305 const QString repo_id_;
306 const QString src_dir_path_;
307 const QString src_dirent_name_;
308 const QString dst_repo_id_;
309 const QString dst_repo_path_;
310 const QString operation_;
311 const QString dirent_type_;
312 Q_DISABLE_COPY(AsyncCopyAndMoveOneItemRequest)
313 };
314
315
316 // Batch copy items asynchronously
317 class AsyncCopyMultipleItemsRequest : public SeafileApiRequest {
318 Q_OBJECT
319 public:
320
321 AsyncCopyMultipleItemsRequest (const Account &account, const QString &repo_id,
322 const QString &src_dir_path,
323 const QMap<QString, int>&src_dirents,
324 const QString &dst_repo_id,
325 const QString &dst_dir_path);
326 signals:
327 void success(const QString& task_id);
328
329 protected slots:
330 void requestSuccess(QNetworkReply& reply);
331
332 private:
333 const Account& account_;
334 const QString repo_id_;
335 const QString src_dir_path_;
336 QMap<QString, int> src_dirents_;
337 const QString dst_repo_id_;
338 const QString dst_repo_path_;
339 Q_DISABLE_COPY(AsyncCopyMultipleItemsRequest)
340 };
341
342 // Batch move items asynchronously
343 class AsyncMoveMultipleItemsRequest : public SeafileApiRequest {
344 Q_OBJECT
345 public:
346 AsyncMoveMultipleItemsRequest(const Account &account,
347 const QString &repo_id,
348 const QString &src_dir_path,
349 const QMap<QString, int> &src_dirents,
350 const QString &dst_repo_id,
351 const QString &dst_dir_path);
352 signals:
353 void success(const QString& task_id);
354
355 protected slots:
356 void requestSuccess(QNetworkReply& reply);
357
358 private:
359 const Account& account_;
360 const QString repo_id_;
361 const QString src_dir_path_;
362 QMap<QString, int> src_dirents_;
363 const QString dst_repo_id_;
364 const QString dst_repo_path_;
365 Q_DISABLE_COPY(AsyncMoveMultipleItemsRequest)
366 };
367
268368 class StarFileRequest : public SeafileApiRequest {
269369 Q_OBJECT
270370 public:
843843
844844 void FileTableView::onCopy()
845845 {
846 QStringList file_names;
846 QMap<QString, int> file_names;
847847
848848 if (item_ == NULL) {
849849 const QList<const SeafDirent*> dirents = getSelectedItemsFromSource();
850850 for (int i = 0; i < dirents.size(); i++) {
851 file_names.push_back(dirents[i]->name);
851 file_names.insert(dirents[i]->name, dirents[i]->type == SeafDirent::DIR ? 1 : 0);
852852 }
853853 } else {
854 file_names.push_back(item_->name);
855 }
856
854 file_names.insert(item_->name, item_->type == SeafDirent::DIR ? 1 : 0);
855 }
857856
858857 parent_->setFilesToBePasted(true, file_names);
859858 }
860859
861860 void FileTableView::onMove()
862861 {
863 QStringList file_names;
862 QMap<QString, int> file_names;
864863 bool has_readonly = false;
865864
866865 if (item_ == NULL) {
871870 has_readonly = true;
872871 break;
873872 }
874 file_names.push_back(dirents[i]->name);
873 file_names.insert(dirents[i]->name, dirents[i]->type == SeafDirent::DIR ? 1 : 0);
875874 }
876875 } else {
877876 if (item_->readonly) {
878877 has_readonly = true;
879878 } else {
880 file_names.push_back(item_->name);
879 file_names.insert(item_->name, item_->type == SeafDirent::DIR ? 1 : 0);
881880 }
882881 }
883882
311311 AccountInfoService::instance()->start();
312312 SeafileAppletRpcServer::instance()->start();
313313
314 account_mgr_->updateServerInfo();
314 account_mgr_->updateServerInfoForAllAccounts();
315315
316316 //
317317 // start ui part
338338 settingsManager()->setComputerName(computer_name);
339339 if (!username.isEmpty() && !token.isEmpty() && !url.isEmpty()) {
340340 Account account(url, username, token);
341 if (account_mgr_->saveAccount(account) < 0) {
342 errorAndExit(tr("failed to add default account"));
343 }
341 account_mgr_->setCurrentAccount(account);
344342 break;
345343 }
346344
106106 return;
107107 }
108108 cookie_seen_ = true;
109 if (!seafApplet->accountManager()->setCurrentAccount(account)) {
110 seafApplet->warningBox(tr("Failed to save current account"), this);
111 reject();
112 } else {
113 accept();
114 }
109 seafApplet->accountManager()->setCurrentAccount(account);
110 accept();
115111 }
116112 }
117113
311311 account.username = info.email;
312312 account.isAutomaticLogin =
313313 mAutomaticLogin->checkState() == Qt::Checked;
314 if (seafApplet->accountManager()->saveAccount(account) < 0) {
315 showWarning(tr("Failed to save current account"));
316 }
317 else {
318 seafApplet->accountManager()->updateAccountInfo(account, info);
319 done(QDialog::Accepted);
320 }
314 seafApplet->accountManager()->setCurrentAccount(account);
315 seafApplet->accountManager()->updateAccountInfo(account, info);
316 done(QDialog::Accepted);
321317 }
322318
323319 void LoginDialog::onHttpError(int code)
174174
175175 SyncError error = model->errorAt(row);
176176
177 QModelIndexList selected = selectionModel()->selectedRows();
178 selected_sync_errors_.clear();
179 foreach(const QModelIndex &index, selected) {
180 selected_sync_errors_.append(model->errorAt(index.row()));
181 }
182
177183 prepareContextMenu(error);
178184 pos = viewport()->mapToGlobal(pos);
179185 context_menu_->exec(pos);
186192
187193 void SyncErrorsTableView::onDeleteFileAsyncError()
188194 {
189 bool success = seafApplet->rpcClient()->deleteFileAsyncErrorById(id_);
190 if (!success) {
191 seafApplet->messageBox(tr("Delete file async error failed"));
192 return;
195 foreach(const SyncError& error, selected_sync_errors_) {
196 bool success = seafApplet->rpcClient()->deleteFileAsyncErrorById(error.id);
197 if (!success) {
198 seafApplet->messageBox(tr("Delete file sync error failed"));
199 return;
200 }
193201 }
194202 emit refreshModel();
195203 }
197205 void SyncErrorsTableView::createContextMenu()
198206 {
199207 context_menu_ = new QMenu(this);
200 delete_action_ = new QAction("delete", this);
208 delete_action_ = new QAction(tr("delete"), this);
201209 context_menu_->addAction(delete_action_);
202210 connect(delete_action_, SIGNAL(triggered()), this, SLOT(onDeleteFileAsyncError()));
203211 }
7272 QMenu *context_menu_;
7373 QAction *delete_action_;
7474 int id_;
75 QList<SyncError> selected_sync_errors_;
7576 };
7677
7778