New upstream version 7.0.7
Moritz Schlarb
4 years ago
2 | 2 | PROJECT(seafile-client) |
3 | 3 | SET(SEAFILE_CLIENT_VERSION_MAJOR 7) |
4 | 4 | SET(SEAFILE_CLIENT_VERSION_MINOR 0) |
5 | SET(SEAFILE_CLIENT_VERSION_PATCH 6) | |
5 | SET(SEAFILE_CLIENT_VERSION_PATCH 7) | |
6 | 6 | SET(PROJECT_VERSION "${SEAFILE_CLIENT_VERSION_MAJOR}.${SEAFILE_CLIENT_VERSION_MINOR}.${SEAFILE_CLIENT_VERSION_PATCH}") |
7 | 7 | ADD_DEFINITIONS(-DSEAFILE_CLIENT_VERSION=${PROJECT_VERSION}) |
8 | 8 | INCLUDE(FindPkgConfig) |
14 | 14 | <key>CFBundleName</key> |
15 | 15 | <string>Seafile</string> |
16 | 16 | <key>CFBundleShortVersionString</key> |
17 | <string>7.0.6</string> | |
17 | <string>7.0.7</string> | |
18 | 18 | <key>CFBundleVersion</key> |
19 | <string>7.0.6</string> | |
19 | <string>7.0.7</string> | |
20 | 20 | <key>CFBundleSignature</key> |
21 | 21 | <string>????</string> |
22 | 22 | <key>CFBundleURLTypes</key> |
512 | 512 | </message> |
513 | 513 | </context> |
514 | 514 | <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> | |
515 | 522 | <name>DownloadRepoDialog</name> |
516 | 523 | <message> |
517 | 524 | <source>Please enter the password</source> |
1368 | 1375 | <translation type="unfinished"/> |
1369 | 1376 | </message> |
1370 | 1377 | <message> |
1371 | <source>Failed to save current account</source> | |
1372 | <translation type="unfinished"/> | |
1373 | </message> | |
1374 | <message> | |
1375 | 1378 | <source>%1 Server Address</source> |
1376 | 1379 | <translation type="unfinished"/> |
1377 | 1380 | </message> |
2506 | 2509 | <context> |
2507 | 2510 | <name>SeafileApplet</name> |
2508 | 2511 | <message> |
2509 | <source>failed to add default account</source> | |
2510 | <translation type="unfinished"/> | |
2511 | </message> | |
2512 | <message> | |
2513 | 2512 | <source>Failed to initialize log: %s</source> |
2514 | 2513 | <translation type="unfinished"/> |
2515 | 2514 | </message> |
3123 | 3122 | </message> |
3124 | 3123 | </context> |
3125 | 3124 | <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> | |
3126 | 3136 | <name>TwoFactorDialog</name> |
3127 | 3137 | <message> |
3128 | 3138 | <source>Enter the two factor authentication token</source> |
518 | 518 | </message> |
519 | 519 | </context> |
520 | 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"/> | |
525 | </message> | |
526 | </context> | |
527 | <context> | |
521 | 528 | <name>DownloadRepoDialog</name> |
522 | 529 | <message> |
523 | 530 | <source>Please enter the password</source> |
1380 | 1387 | <translation type="unfinished"/> |
1381 | 1388 | </message> |
1382 | 1389 | <message> |
1383 | <source>Failed to save current account</source> | |
1384 | <translation>No s'ha pogut guardar el compte actual</translation> | |
1385 | </message> | |
1386 | <message> | |
1387 | 1390 | <source>%1 Server Address</source> |
1388 | 1391 | <translation type="unfinished"/> |
1389 | 1392 | </message> |
2520 | 2523 | <context> |
2521 | 2524 | <name>SeafileApplet</name> |
2522 | 2525 | <message> |
2523 | <source>failed to add default account</source> | |
2524 | <translation type="unfinished"/> | |
2525 | </message> | |
2526 | <message> | |
2527 | 2526 | <source>Failed to initialize log: %s</source> |
2528 | 2527 | <translation type="unfinished"/> |
2529 | 2528 | </message> |
3137 | 3136 | </message> |
3138 | 3137 | </context> |
3139 | 3138 | <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> | |
3140 | 3146 | <name>TwoFactorDialog</name> |
3141 | 3147 | <message> |
3142 | 3148 | <source>Enter the two factor authentication token</source> |
6 | 6 | </message> |
7 | 7 | <message> |
8 | 8 | <source><h2>%1 Client %2</h2></source> |
9 | <translation type="unfinished"/> | |
9 | <translation><h2>%1 Klient %2</h2></translation> | |
10 | 10 | </message> |
11 | 11 | <message> |
12 | 12 | <source><h5> REV %1 </h5></source> |
13 | <translation type="unfinished"/> | |
13 | <translation><h5> REV %1 </h5></translation> | |
14 | 14 | </message> |
15 | 15 | <message> |
16 | 16 | <source>About</source> |
37 | 37 | </message> |
38 | 38 | <message> |
39 | 39 | <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> | |
41 | 41 | </message> |
42 | 42 | <message> |
43 | 43 | <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> | |
45 | 45 | </message> |
46 | 46 | </context> |
47 | 47 | <context> |
95 | 95 | <name>AccountView</name> |
96 | 96 | <message> |
97 | 97 | <source>Are you sure you want to remove account %1?<br><br>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?<br><br>Účet bude lokálně odstraněn. Budou také odstraněna veškerá nastavení synchronizace. Účet na serveru nebude ovlivněn.</translation> | |
99 | 99 | </message> |
100 | 100 | <message> |
101 | 101 | <source>Failed to unsync libraries of this account: %1</source> |
205 | 205 | </message> |
206 | 206 | <message> |
207 | 207 | <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> | |
209 | 209 | </message> |
210 | 210 | <message> |
211 | 211 | <source>Upload Failure: %1</source> |
516 | 516 | </message> |
517 | 517 | <message> |
518 | 518 | <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> | |
519 | 526 | <translation type="unfinished"/> |
520 | 527 | </message> |
521 | 528 | </context> |
840 | 847 | </message> |
841 | 848 | <message> |
842 | 849 | <source>Failed to upload file %1: %2</source> |
843 | <translation type="unfinished"/> | |
850 | <translation>Nepodařilo se nahrát soubor %1: %2</translation> | |
844 | 851 | </message> |
845 | 852 | <message> |
846 | 853 | <source>Unable to create cache folder</source> |
847 | <translation type="unfinished"/> | |
854 | <translation>Nepodařilo se vytvořit složku mezipaměti</translation> | |
848 | 855 | </message> |
849 | 856 | <message> |
850 | 857 | <source>Unable to open cache folder</source> |
851 | <translation type="unfinished"/> | |
858 | <translation>Nepodařilo se otevřít složku mezipaměti</translation> | |
852 | 859 | </message> |
853 | 860 | <message> |
854 | 861 | <source>Search files</source> |
856 | 863 | </message> |
857 | 864 | <message> |
858 | 865 | <source>Failed to get link</source> |
859 | <translation type="unfinished"/> | |
866 | <translation>Nepodařilo se získat odkaz</translation> | |
860 | 867 | </message> |
861 | 868 | <message> |
862 | 869 | <source>Failed to get upload link information for file "%1"</source> |
863 | <translation type="unfinished"/> | |
870 | <translation>Nepodařilo se získat odkaz pro nahrání souboru "%1" ze serveru</translation> | |
864 | 871 | </message> |
865 | 872 | </context> |
866 | 873 | <context> |
1389 | 1396 | <translation>Název počítače</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <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> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>%1 adresa serveru</translation> |
1398 | 1401 | </message> |
1751 | 1754 | </message> |
1752 | 1755 | <message> |
1753 | 1756 | <source>Storage quota full</source> |
1754 | <translation type="unfinished"/> | |
1757 | <translation>Limit úložiště vyčerpán</translation> | |
1755 | 1758 | </message> |
1756 | 1759 | <message> |
1757 | 1760 | <source>Library deleted on server</source> |
1799 | 1802 | </message> |
1800 | 1803 | <message> |
1801 | 1804 | <source>checking server info...</source> |
1802 | <translation type="unfinished"/> | |
1805 | <translation>kontroluji informace ze serveru...</translation> | |
1803 | 1806 | </message> |
1804 | 1807 | <message> |
1805 | 1808 | <source>Canceling</source> |
2047 | 2050 | </message> |
2048 | 2051 | <message> |
2049 | 2052 | <source>Path ends with space or period character</source> |
2050 | <translation type="unfinished"/> | |
2053 | <translation>Cesta končí mezerou nebo znakem tečky</translation> | |
2051 | 2054 | </message> |
2052 | 2055 | <message> |
2053 | 2056 | <source>Path contains invalid characters like '|' or ':'</source> |
2054 | <translation type="unfinished"/> | |
2057 | <translation>Cesta obsahuje nepovolený znak jako '|' nebo ':'</translation> | |
2055 | 2058 | </message> |
2056 | 2059 | <message> |
2057 | 2060 | <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> | |
2059 | 2062 | </message> |
2060 | 2063 | <message> |
2061 | 2064 | <source>Library name contains invalid characters such as ':', '*', '|', '?'</source> |
2062 | <translation type="unfinished"/> | |
2065 | <translation>Knihovna obsahuje nepovolené znaky, jako třeba ':', '*', '|', '?'</translation> | |
2063 | 2066 | </message> |
2064 | 2067 | <message> |
2065 | 2068 | <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> | |
2067 | 2070 | </message> |
2068 | 2071 | <message> |
2069 | 2072 | <source>%1 Client is already running</source> |
2070 | <translation type="unfinished"/> | |
2073 | <translation>%1 klient již běží</translation> | |
2071 | 2074 | </message> |
2072 | 2075 | <message> |
2073 | 2076 | <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> | |
2075 | 2078 | </message> |
2076 | 2079 | <message> |
2077 | 2080 | <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> | |
2079 | 2082 | </message> |
2080 | 2083 | <message> |
2081 | 2084 | <source>No permission to sync this folder</source> |
2082 | <translation type="unfinished"/> | |
2085 | <translation>Nemáš oprávnění synchronizovat tuto složku</translation> | |
2083 | 2086 | </message> |
2084 | 2087 | <message> |
2085 | 2088 | <source>Removed all items from trash</source> |
2086 | <translation type="unfinished"/> | |
2089 | <translation>Odstraněny všechny předměty z koše</translation> | |
2087 | 2090 | </message> |
2088 | 2091 | <message> |
2089 | 2092 | <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> | |
2091 | 2094 | </message> |
2092 | 2095 | <message> |
2093 | 2096 | <source>Published draft</source> |
2094 | <translation type="unfinished"/> | |
2097 | <translation>Publikovaný koncept</translation> | |
2095 | 2098 | </message> |
2096 | 2099 | <message> |
2097 | 2100 | <source>Created draft</source> |
2098 | <translation type="unfinished"/> | |
2101 | <translation>Vytvořený koncept</translation> | |
2099 | 2102 | </message> |
2100 | 2103 | <message> |
2101 | 2104 | <source>Created file</source> |
2102 | <translation type="unfinished"/> | |
2105 | <translation>Vytvořený soubor</translation> | |
2103 | 2106 | </message> |
2104 | 2107 | <message> |
2105 | 2108 | <source>Renamed file</source> |
2106 | <translation type="unfinished"/> | |
2109 | <translation>Přejmenovaný soubor</translation> | |
2107 | 2110 | </message> |
2108 | 2111 | <message> |
2109 | 2112 | <source>Deleted draft</source> |
2110 | <translation type="unfinished"/> | |
2113 | <translation>Smazaný koncept</translation> | |
2111 | 2114 | </message> |
2112 | 2115 | <message> |
2113 | 2116 | <source>Deleted file</source> |
2114 | <translation type="unfinished"/> | |
2117 | <translation>Smazaný soubor</translation> | |
2115 | 2118 | </message> |
2116 | 2119 | <message> |
2117 | 2120 | <source>Restored file</source> |
2118 | <translation type="unfinished"/> | |
2121 | <translation>Obnovený soubor</translation> | |
2119 | 2122 | </message> |
2120 | 2123 | <message> |
2121 | 2124 | <source>Moved file</source> |
2122 | <translation type="unfinished"/> | |
2125 | <translation>Přesunutý soubor</translation> | |
2123 | 2126 | </message> |
2124 | 2127 | <message> |
2125 | 2128 | <source>Updated file</source> |
2126 | <translation type="unfinished"/> | |
2129 | <translation>Aktualizovaný soubor</translation> | |
2127 | 2130 | </message> |
2128 | 2131 | <message> |
2129 | 2132 | <source>Created folder</source> |
2130 | <translation type="unfinished"/> | |
2133 | <translation>Vytvořená složka</translation> | |
2131 | 2134 | </message> |
2132 | 2135 | <message> |
2133 | 2136 | <source>Renamed folder</source> |
2134 | <translation type="unfinished"/> | |
2137 | <translation>Přejmenovaná složka</translation> | |
2135 | 2138 | </message> |
2136 | 2139 | <message> |
2137 | 2140 | <source>Deleted folder</source> |
2138 | <translation type="unfinished"/> | |
2141 | <translation>Smazaná složka</translation> | |
2139 | 2142 | </message> |
2140 | 2143 | <message> |
2141 | 2144 | <source>Restored folder</source> |
2142 | <translation type="unfinished"/> | |
2145 | <translation>Obnovená složka</translation> | |
2143 | 2146 | </message> |
2144 | 2147 | <message> |
2145 | 2148 | <source>Moved folder</source> |
2146 | <translation type="unfinished"/> | |
2149 | <translation>Přesunutá složka</translation> | |
2147 | 2150 | </message> |
2148 | 2151 | <message> |
2149 | 2152 | <source>Created library</source> |
2150 | <translation type="unfinished"/> | |
2153 | <translation>Vytvořená knihovna</translation> | |
2151 | 2154 | </message> |
2152 | 2155 | <message> |
2153 | 2156 | <source>Renamed library</source> |
2154 | <translation type="unfinished"/> | |
2157 | <translation>Přejmenovaná knihovna</translation> | |
2155 | 2158 | </message> |
2156 | 2159 | <message> |
2157 | 2160 | <source>Deleted library</source> |
2158 | <translation type="unfinished"/> | |
2161 | <translation>Smazaná knihovna</translation> | |
2159 | 2162 | </message> |
2160 | 2163 | <message> |
2161 | 2164 | <source>Restored library</source> |
2162 | <translation type="unfinished"/> | |
2165 | <translation>Obnovená knihovna</translation> | |
2163 | 2166 | </message> |
2164 | 2167 | <message> |
2165 | 2168 | <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> | |
2167 | 2170 | </message> |
2168 | 2171 | <message> |
2169 | 2172 | <source>Permission denied on server</source> |
2170 | <translation type="unfinished"/> | |
2173 | <translation>Oprávnění na serveru nepřiděleno</translation> | |
2171 | 2174 | </message> |
2172 | 2175 | <message> |
2173 | 2176 | <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> | |
2175 | 2178 | </message> |
2176 | 2179 | <message> |
2177 | 2180 | <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> | |
2179 | 2182 | </message> |
2180 | 2183 | <message> |
2181 | 2184 | <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> | |
2183 | 2186 | </message> |
2184 | 2187 | </context> |
2185 | 2188 | <context> |
2441 | 2444 | </message> |
2442 | 2445 | <message> |
2443 | 2446 | <source>set sync interval for this library</source> |
2444 | <translation type="unfinished"/> | |
2447 | <translation>nastavit interval synchronizace pro tuto knihovnu</translation> | |
2445 | 2448 | </message> |
2446 | 2449 | <message> |
2447 | 2450 | <source>Are you sure to unsync the library "%1"?</source> |
2448 | <translation type="unfinished"/> | |
2451 | <translation>Chceš opravdu zrušit synchronizaci knihovny "%1"?</translation> | |
2449 | 2452 | </message> |
2450 | 2453 | <message> |
2451 | 2454 | <source>Are you sure to resync the library "%1"?</source> |
2452 | <translation type="unfinished"/> | |
2455 | <translation>Chceš opravdu znovu zesynchronizovat knihovnu "%1"?</translation> | |
2453 | 2456 | </message> |
2454 | 2457 | <message> |
2455 | 2458 | <source>Are you sure to overwrite the file "%1"</source> |
2456 | <translation type="unfinished"/> | |
2459 | <translation>Chceš opravdu přepsat soubor "%1"</translation> | |
2457 | 2460 | </message> |
2458 | 2461 | <message> |
2459 | 2462 | <source>Failed to unsync library "%1"</source> |
2461 | 2464 | </message> |
2462 | 2465 | <message> |
2463 | 2466 | <source>Are you sure you want to leave the share "%1"?</source> |
2464 | <translation type="unfinished"/> | |
2467 | <translation>Jsi si jistý, že chceš opustit sdílený disk "%1"?</translation> | |
2465 | 2468 | </message> |
2466 | 2469 | <message> |
2467 | 2470 | <source>Leaving share failed</source> |
2468 | <translation type="unfinished"/> | |
2471 | <translation>Nepovedlo se opustit sdílený disk</translation> | |
2469 | 2472 | </message> |
2470 | 2473 | <message> |
2471 | 2474 | <source>Failed to cancel this task: |
2481 | 2484 | </message> |
2482 | 2485 | <message> |
2483 | 2486 | <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> | |
2485 | 2488 | </message> |
2486 | 2489 | <message> |
2487 | 2490 | <source>Unable to overwrite file "%1" with itself</source> |
2508 | 2511 | <name>ReposTab</name> |
2509 | 2512 | <message> |
2510 | 2513 | <source>Search libraries</source> |
2511 | <translation type="unfinished"/> | |
2514 | <translation>Prohledat knihovny</translation> | |
2512 | 2515 | </message> |
2513 | 2516 | <message> |
2514 | 2517 | <source>retry</source> |
2529 | 2532 | <context> |
2530 | 2533 | <name>SeafileApplet</name> |
2531 | 2534 | <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> | |
2536 | 2535 | <source>Failed to initialize log: %s</source> |
2537 | 2536 | <translation>Nezdařilo se spuštění logu: %s</translation> |
2538 | 2537 | </message> |
2554 | 2553 | </message> |
2555 | 2554 | <message> |
2556 | 2555 | <source>failed to save client id</source> |
2557 | <translation type="unfinished"/> | |
2556 | <translation>nepovedlo se uložit id klienta</translation> | |
2558 | 2557 | </message> |
2559 | 2558 | <message> |
2560 | 2559 | <source>failed to access %1</source> |
2561 | <translation type="unfinished"/> | |
2560 | <translation>nepovedlo se získat %1</translation> | |
2562 | 2561 | </message> |
2563 | 2562 | <message> |
2564 | 2563 | <source>incorrect client id</source> |
2565 | <translation type="unfinished"/> | |
2564 | <translation>nesprávné id klienta</translation> | |
2566 | 2565 | </message> |
2567 | 2566 | <message> |
2568 | 2567 | <source>failed to read %1</source> |
2569 | <translation type="unfinished"/> | |
2568 | <translation>nepovedlo se přečíst %1</translation> | |
2570 | 2569 | </message> |
2571 | 2570 | </context> |
2572 | 2571 | <context> |
2589 | 2588 | </message> |
2590 | 2589 | <message> |
2591 | 2590 | <source>%1 Desktop Access Link:</source> |
2592 | <translation type="unfinished"/> | |
2591 | <translation>%1 Přístupový odkaz plochy</translation> | |
2593 | 2592 | </message> |
2594 | 2593 | </context> |
2595 | 2594 | <context> |
2600 | 2599 | </message> |
2601 | 2600 | <message> |
2602 | 2601 | <source>internal error: failed to connect to daemon</source> |
2603 | <translation type="unfinished"/> | |
2602 | <translation>Interní chyba: nepovedlo se spojit s démonem</translation> | |
2604 | 2603 | </message> |
2605 | 2604 | </context> |
2606 | 2605 | <context> |
2639 | 2638 | </message> |
2640 | 2639 | <message> |
2641 | 2640 | <source>Show file sync errors</source> |
2642 | <translation type="unfinished"/> | |
2641 | <translation>Zobrazit chyby synchronizace souborů</translation> | |
2643 | 2642 | </message> |
2644 | 2643 | <message> |
2645 | 2644 | <source>&About</source> |
2683 | 2682 | </message> |
2684 | 2683 | <message> |
2685 | 2684 | <source>Upload log files</source> |
2686 | <translation type="unfinished"/> | |
2685 | <translation>Nahrát soubory záznamu</translation> | |
2687 | 2686 | </message> |
2688 | 2687 | <message> |
2689 | 2688 | <source>upload %1 log files</source> |
2690 | <translation type="unfinished"/> | |
2689 | <translation>nahrát %1 souborů záznamu</translation> | |
2691 | 2690 | </message> |
2692 | 2691 | <message> |
2693 | 2692 | <source>Please login first</source> |
2694 | <translation type="unfinished"/> | |
2693 | <translation>Nejdřív se prosím přihlašte</translation> | |
2695 | 2694 | </message> |
2696 | 2695 | <message> |
2697 | 2696 | <source>Repair explorer extension</source> |
2698 | <translation type="unfinished"/> | |
2697 | <translation>Opravit rozšíření Průzkumníku</translation> | |
2699 | 2698 | </message> |
2700 | 2699 | <message> |
2701 | 2700 | <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> | |
2703 | 2702 | </message> |
2704 | 2703 | <message> |
2705 | 2704 | <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> | |
2707 | 2706 | </message> |
2708 | 2707 | <message> |
2709 | 2708 | <source>have some sync error</source> |
2710 | <translation type="unfinished"/> | |
2709 | <translation>máš nějaké problémy se synchronizací</translation> | |
2711 | 2710 | </message> |
2712 | 2711 | </context> |
2713 | 2712 | <context> |
2725 | 2724 | <name>SearchTab</name> |
2726 | 2725 | <message> |
2727 | 2726 | <source>Search files</source> |
2728 | <translation type="unfinished"/> | |
2727 | <translation>Hledat soubory</translation> | |
2729 | 2728 | </message> |
2730 | 2729 | <message> |
2731 | 2730 | <source>retry</source> |
2898 | 2897 | </message> |
2899 | 2898 | <message> |
2900 | 2899 | <source>Check for updates automatically</source> |
2901 | <translation type="unfinished"/> | |
2900 | <translation>Automaticky kontrolovat aktualizace</translation> | |
2902 | 2901 | </message> |
2903 | 2902 | <message> |
2904 | 2903 | <source>Do not verify server certificate in HTTPS syncing</source> |
2980 | 2979 | <name>SharedItemsTableModel</name> |
2981 | 2980 | <message> |
2982 | 2981 | <source>Click to edit</source> |
2983 | <translation type="unfinished"/> | |
2982 | <translation>Klikni pro úpravu</translation> | |
2984 | 2983 | </message> |
2985 | 2984 | <message> |
2986 | 2985 | <source>Created by %1</source> |
3035 | 3034 | </message> |
3036 | 3035 | <message> |
3037 | 3036 | <source>Upload Link</source> |
3038 | <translation type="unfinished"/> | |
3037 | <translation>Odkaz pro nahrání:</translation> | |
3039 | 3038 | </message> |
3040 | 3039 | <message> |
3041 | 3040 | <source>Upload link:</source> |
3042 | <translation type="unfinished"/> | |
3041 | <translation>Odkaz pro nahrání:</translation> | |
3043 | 3042 | </message> |
3044 | 3043 | </context> |
3045 | 3044 | <context> |
3119 | 3118 | </message> |
3120 | 3119 | <message> |
3121 | 3120 | <source>No sync errors.</source> |
3122 | <translation type="unfinished"/> | |
3121 | <translation>Žádné chyby synchronizace.</translation> | |
3123 | 3122 | </message> |
3124 | 3123 | </context> |
3125 | 3124 | <context> |
3126 | 3125 | <name>SyncErrorsTableModel</name> |
3127 | 3126 | <message> |
3128 | 3127 | <source>Double click to open the library</source> |
3129 | <translation type="unfinished"/> | |
3128 | <translation>Dvakrát klikni pro otevření knihovny</translation> | |
3130 | 3129 | </message> |
3131 | 3130 | <message> |
3132 | 3131 | <source>Library</source> |
3134 | 3133 | </message> |
3135 | 3134 | <message> |
3136 | 3135 | <source>Path</source> |
3137 | <translation type="unfinished"/> | |
3136 | <translation>Cesta</translation> | |
3138 | 3137 | </message> |
3139 | 3138 | <message> |
3140 | 3139 | <source>Error</source> |
3142 | 3141 | </message> |
3143 | 3142 | <message> |
3144 | 3143 | <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> | |
3145 | 3151 | <translation type="unfinished"/> |
3146 | 3152 | </message> |
3147 | 3153 | </context> |
3149 | 3155 | <name>TwoFactorDialog</name> |
3150 | 3156 | <message> |
3151 | 3157 | <source>Enter the two factor authentication token</source> |
3152 | <translation type="unfinished"/> | |
3158 | <translation>Zadej druhý dvoufaktorový token</translation> | |
3153 | 3159 | </message> |
3154 | 3160 | <message> |
3155 | 3161 | <source>Two Factor Authentication</source> |
3156 | <translation type="unfinished"/> | |
3162 | <translation>Dvoufaktorové ověření</translation> | |
3157 | 3163 | </message> |
3158 | 3164 | <message> |
3159 | 3165 | <source>Please enter the two factor authentication token</source> |
3160 | <translation type="unfinished"/> | |
3166 | <translation>Zadej prosím token pro dvoufaktorové ověření</translation> | |
3161 | 3167 | </message> |
3162 | 3168 | <message> |
3163 | 3169 | <source>Dialog</source> |
3164 | <translation type="unfinished"/> | |
3170 | <translation>Dialog</translation> | |
3165 | 3171 | </message> |
3166 | 3172 | <message> |
3167 | 3173 | <source>mText</source> |
3168 | <translation type="unfinished"/> | |
3174 | <translation>mText</translation> | |
3169 | 3175 | </message> |
3170 | 3176 | <message> |
3171 | 3177 | <source>Remember this device</source> |
3172 | <translation type="unfinished"/> | |
3178 | <translation>Zapamatovat si toto zařízení</translation> | |
3173 | 3179 | </message> |
3174 | 3180 | <message> |
3175 | 3181 | <source>Cancel</source> |
3176 | <translation type="unfinished"/> | |
3182 | <translation>Zrušit</translation> | |
3177 | 3183 | </message> |
3178 | 3184 | <message> |
3179 | 3185 | <source>OK</source> |
3180 | <translation type="unfinished"/> | |
3186 | <translation>OK</translation> | |
3181 | 3187 | </message> |
3182 | 3188 | </context> |
3183 | 3189 | <context> |
519 | 519 | </message> |
520 | 520 | </context> |
521 | 521 | <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> | |
522 | 529 | <name>DownloadRepoDialog</name> |
523 | 530 | <message> |
524 | 531 | <source>Please enter the password</source> |
858 | 865 | </message> |
859 | 866 | <message> |
860 | 867 | <source>Failed to get upload link information for file "%1"</source> |
861 | <translation type="unfinished"/> | |
868 | <translation>Informationen zum Upload-Link von Datei „%1“ konnten nicht abgerufen werden.</translation> | |
862 | 869 | </message> |
863 | 870 | </context> |
864 | 871 | <context> |
1093 | 1100 | </message> |
1094 | 1101 | <message> |
1095 | 1102 | <source>&Generate %1 Upload Link</source> |
1096 | <translation type="unfinished"/> | |
1103 | <translation>%1 &Upload-Link erstellen</translation> | |
1097 | 1104 | </message> |
1098 | 1105 | </context> |
1099 | 1106 | <context> |
1100 | 1107 | <name>FinderSyncHost</name> |
1101 | 1108 | <message> |
1102 | 1109 | <source>Failed to get link</source> |
1103 | <translation type="unfinished"/> | |
1110 | <translation>Fehler beim Ermitteln des Links</translation> | |
1104 | 1111 | </message> |
1105 | 1112 | <message> |
1106 | 1113 | <source>File "%1" is locked by %2</source> |
1107 | <translation type="unfinished"/> | |
1114 | <translation>Die Datei „%1“ ist von %2 gesperrt</translation> | |
1108 | 1115 | </message> |
1109 | 1116 | <message> |
1110 | 1117 | <source>Failed to get lock information for file "%1"</source> |
1111 | <translation type="unfinished"/> | |
1118 | <translation>Datei „%1“ ist gesperrt. Nähere Informationen konnten nicht abgerufen werden.</translation> | |
1112 | 1119 | </message> |
1113 | 1120 | <message> |
1114 | 1121 | <source>Failed to get upload link for file "%1"</source> |
1115 | <translation type="unfinished"/> | |
1122 | <translation>Upload-Link von Datei „%1“ konnte nicht abgerufen werden.</translation> | |
1116 | 1123 | </message> |
1117 | 1124 | </context> |
1118 | 1125 | <context> |
1388 | 1395 | <translation>Bitte geben Sie den Rechnernamen ein</translation> |
1389 | 1396 | </message> |
1390 | 1397 | <message> |
1391 | <source>Failed to save current account</source> | |
1392 | <translation>Aktuelles Konto konnte nicht gespeichert werden</translation> | |
1393 | </message> | |
1394 | <message> | |
1395 | 1398 | <source>%1 Server Address</source> |
1396 | 1399 | <translation>%1-Serveradresse</translation> |
1397 | 1400 | </message> |
2184 | 2187 | </message> |
2185 | 2188 | <message> |
2186 | 2189 | <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> | |
2188 | 2191 | </message> |
2189 | 2192 | </context> |
2190 | 2193 | <context> |
2534 | 2537 | <context> |
2535 | 2538 | <name>SeafileApplet</name> |
2536 | 2539 | <message> |
2537 | <source>failed to add default account</source> | |
2538 | <translation>Standardkonto konnte nicht hingefügt werden</translation> | |
2539 | </message> | |
2540 | <message> | |
2541 | 2540 | <source>Failed to initialize log: %s</source> |
2542 | 2541 | <translation>Log konnte nicht initialisiert werden: %s</translation> |
2543 | 2542 | </message> |
3040 | 3039 | </message> |
3041 | 3040 | <message> |
3042 | 3041 | <source>Upload Link</source> |
3043 | <translation type="unfinished"/> | |
3042 | <translation>Upload-Link</translation> | |
3044 | 3043 | </message> |
3045 | 3044 | <message> |
3046 | 3045 | <source>Upload link:</source> |
3047 | <translation type="unfinished"/> | |
3046 | <translation>Upload-Link:</translation> | |
3048 | 3047 | </message> |
3049 | 3048 | </context> |
3050 | 3049 | <context> |
3151 | 3150 | </message> |
3152 | 3151 | </context> |
3153 | 3152 | <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> | |
3154 | 3160 | <name>TwoFactorDialog</name> |
3155 | 3161 | <message> |
3156 | 3162 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1387 | 1394 | <translation>Παρακαλώ συμπληρώστε το όνομα του υπολογιστή</translation> |
1388 | 1395 | </message> |
1389 | 1396 | <message> |
1390 | <source>Failed to save current account</source> | |
1391 | <translation>Αποτυχία αποθήκευσης του λογαριασμού</translation> | |
1392 | </message> | |
1393 | <message> | |
1394 | 1397 | <source>%1 Server Address</source> |
1395 | 1398 | <translation>%1 Διεύθυνση διακομιστή</translation> |
1396 | 1399 | </message> |
2527 | 2530 | <context> |
2528 | 2531 | <name>SeafileApplet</name> |
2529 | 2532 | <message> |
2530 | <source>failed to add default account</source> | |
2531 | <translation>αποτυχία προσθήκης προεπιλεγμένου λογαριασμού</translation> | |
2532 | </message> | |
2533 | <message> | |
2534 | 2533 | <source>Failed to initialize log: %s</source> |
2535 | 2534 | <translation>Αποτυχία αρχικοποιήσης αρχείου καταγραφής: %s</translation> |
2536 | 2535 | </message> |
3144 | 3143 | </message> |
3145 | 3144 | </context> |
3146 | 3145 | <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> | |
3147 | 3153 | <name>TwoFactorDialog</name> |
3148 | 3154 | <message> |
3149 | 3155 | <source>Enter the two factor authentication token</source> |
514 | 514 | </message> |
515 | 515 | </context> |
516 | 516 | <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> | |
517 | 524 | <name>DownloadRepoDialog</name> |
518 | 525 | <message> |
519 | 526 | <source>Please enter the password</source> |
1370 | 1377 | <translation type="unfinished"></translation> |
1371 | 1378 | </message> |
1372 | 1379 | <message> |
1373 | <source>Failed to save current account</source> | |
1374 | <translation type="unfinished"></translation> | |
1375 | </message> | |
1376 | <message> | |
1377 | 1380 | <source>%1 Server Address</source> |
1378 | 1381 | <translation type="unfinished"></translation> |
1379 | 1382 | </message> |
2508 | 2511 | <context> |
2509 | 2512 | <name>SeafileApplet</name> |
2510 | 2513 | <message> |
2511 | <source>failed to add default account</source> | |
2512 | <translation type="unfinished"></translation> | |
2513 | </message> | |
2514 | <message> | |
2515 | 2514 | <source>Failed to initialize log: %s</source> |
2516 | 2515 | <translation type="unfinished"></translation> |
2517 | 2516 | </message> |
3125 | 3124 | </message> |
3126 | 3125 | </context> |
3127 | 3126 | <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> | |
3128 | 3138 | <name>TwoFactorDialog</name> |
3129 | 3139 | <message> |
3130 | 3140 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
859 | 866 | </message> |
860 | 867 | <message> |
861 | 868 | <source>Failed to get upload link information for file "%1"</source> |
862 | <translation type="unfinished"/> | |
869 | <translation>Fallo al obtener información del enlace de subida para el archivo "%1"</translation> | |
863 | 870 | </message> |
864 | 871 | </context> |
865 | 872 | <context> |
1094 | 1101 | </message> |
1095 | 1102 | <message> |
1096 | 1103 | <source>&Generate %1 Upload Link</source> |
1097 | <translation type="unfinished"/> | |
1104 | <translation>&Generar Enlace %1 para Subir</translation> | |
1098 | 1105 | </message> |
1099 | 1106 | </context> |
1100 | 1107 | <context> |
1101 | 1108 | <name>FinderSyncHost</name> |
1102 | 1109 | <message> |
1103 | 1110 | <source>Failed to get link</source> |
1104 | <translation type="unfinished"/> | |
1111 | <translation>Fallo al obtener enlace</translation> | |
1105 | 1112 | </message> |
1106 | 1113 | <message> |
1107 | 1114 | <source>File "%1" is locked by %2</source> |
1108 | <translation type="unfinished"/> | |
1115 | <translation>El archivo "%1" está bloqueado por %2</translation> | |
1109 | 1116 | </message> |
1110 | 1117 | <message> |
1111 | 1118 | <source>Failed to get lock information for file "%1"</source> |
1112 | <translation type="unfinished"/> | |
1119 | <translation>Fallo al obtener información de bloqueo para el archivo "%1"</translation> | |
1113 | 1120 | </message> |
1114 | 1121 | <message> |
1115 | 1122 | <source>Failed to get upload link for file "%1"</source> |
1116 | <translation type="unfinished"/> | |
1123 | <translation>Fallo al obtener el enlace de subida para el archivo "%1"</translation> | |
1117 | 1124 | </message> |
1118 | 1125 | </context> |
1119 | 1126 | <context> |
1389 | 1396 | <translation>Ingrese el nombre del equipo</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>Fallo al modificar la cuenta actual</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>Dirección del Servidor %1</translation> |
1398 | 1401 | </message> |
2185 | 2188 | </message> |
2186 | 2189 | <message> |
2187 | 2190 | <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> | |
2189 | 2192 | </message> |
2190 | 2193 | </context> |
2191 | 2194 | <context> |
2535 | 2538 | <context> |
2536 | 2539 | <name>SeafileApplet</name> |
2537 | 2540 | <message> |
2538 | <source>failed to add default account</source> | |
2539 | <translation>fallo al agregar la cuenta predefinida</translation> | |
2540 | </message> | |
2541 | <message> | |
2542 | 2541 | <source>Failed to initialize log: %s</source> |
2543 | 2542 | <translation>Fallo al crear registro: %s</translation> |
2544 | 2543 | </message> |
3041 | 3040 | </message> |
3042 | 3041 | <message> |
3043 | 3042 | <source>Upload Link</source> |
3044 | <translation type="unfinished"/> | |
3043 | <translation>Enlace de Subida</translation> | |
3045 | 3044 | </message> |
3046 | 3045 | <message> |
3047 | 3046 | <source>Upload link:</source> |
3048 | <translation type="unfinished"/> | |
3047 | <translation>Enlace de subida:</translation> | |
3049 | 3048 | </message> |
3050 | 3049 | </context> |
3051 | 3050 | <context> |
3152 | 3151 | </message> |
3153 | 3152 | </context> |
3154 | 3153 | <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> | |
3155 | 3161 | <name>TwoFactorDialog</name> |
3156 | 3162 | <message> |
3157 | 3163 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
859 | 866 | </message> |
860 | 867 | <message> |
861 | 868 | <source>Failed to get upload link information for file "%1"</source> |
862 | <translation type="unfinished"/> | |
869 | <translation>Fallo al obtener información del enlace de subida para el archivo "%1"</translation> | |
863 | 870 | </message> |
864 | 871 | </context> |
865 | 872 | <context> |
1094 | 1101 | </message> |
1095 | 1102 | <message> |
1096 | 1103 | <source>&Generate %1 Upload Link</source> |
1097 | <translation type="unfinished"/> | |
1104 | <translation>&Generar Enlace %1 para Subir</translation> | |
1098 | 1105 | </message> |
1099 | 1106 | </context> |
1100 | 1107 | <context> |
1101 | 1108 | <name>FinderSyncHost</name> |
1102 | 1109 | <message> |
1103 | 1110 | <source>Failed to get link</source> |
1104 | <translation type="unfinished"/> | |
1111 | <translation>Fallo al obtener enlace</translation> | |
1105 | 1112 | </message> |
1106 | 1113 | <message> |
1107 | 1114 | <source>File "%1" is locked by %2</source> |
1108 | <translation type="unfinished"/> | |
1115 | <translation>El archivo "%1" está bloqueado por %2</translation> | |
1109 | 1116 | </message> |
1110 | 1117 | <message> |
1111 | 1118 | <source>Failed to get lock information for file "%1"</source> |
1112 | <translation type="unfinished"/> | |
1119 | <translation>Fallo al obtener información de bloqueo para el archivo "%1"</translation> | |
1113 | 1120 | </message> |
1114 | 1121 | <message> |
1115 | 1122 | <source>Failed to get upload link for file "%1"</source> |
1116 | <translation type="unfinished"/> | |
1123 | <translation>Fallo al obtener el enlace de subida para el archivo "%1"</translation> | |
1117 | 1124 | </message> |
1118 | 1125 | </context> |
1119 | 1126 | <context> |
1389 | 1396 | <translation>Ingrese el nombre del equipo</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>Fallo al modificar la cuenta actual</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>Dirección del Servidor %1</translation> |
1398 | 1401 | </message> |
2185 | 2188 | </message> |
2186 | 2189 | <message> |
2187 | 2190 | <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> | |
2189 | 2192 | </message> |
2190 | 2193 | </context> |
2191 | 2194 | <context> |
2535 | 2538 | <context> |
2536 | 2539 | <name>SeafileApplet</name> |
2537 | 2540 | <message> |
2538 | <source>failed to add default account</source> | |
2539 | <translation>fallo al agregar la cuenta predefinida</translation> | |
2540 | </message> | |
2541 | <message> | |
2542 | 2541 | <source>Failed to initialize log: %s</source> |
2543 | 2542 | <translation>Fallo al crear registro: %s</translation> |
2544 | 2543 | </message> |
3041 | 3040 | </message> |
3042 | 3041 | <message> |
3043 | 3042 | <source>Upload Link</source> |
3044 | <translation type="unfinished"/> | |
3043 | <translation>Enlace de Subida</translation> | |
3045 | 3044 | </message> |
3046 | 3045 | <message> |
3047 | 3046 | <source>Upload link:</source> |
3048 | <translation type="unfinished"/> | |
3047 | <translation>Enlace de subida:</translation> | |
3049 | 3048 | </message> |
3050 | 3049 | </context> |
3051 | 3050 | <context> |
3152 | 3151 | </message> |
3153 | 3152 | </context> |
3154 | 3153 | <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> | |
3155 | 3161 | <name>TwoFactorDialog</name> |
3156 | 3162 | <message> |
3157 | 3163 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
859 | 866 | </message> |
860 | 867 | <message> |
861 | 868 | <source>Failed to get upload link information for file "%1"</source> |
862 | <translation type="unfinished"/> | |
869 | <translation>Fallo al obtener información del enlace de subida para el archivo "%1"</translation> | |
863 | 870 | </message> |
864 | 871 | </context> |
865 | 872 | <context> |
1094 | 1101 | </message> |
1095 | 1102 | <message> |
1096 | 1103 | <source>&Generate %1 Upload Link</source> |
1097 | <translation type="unfinished"/> | |
1104 | <translation>&Generar Enlace %1 para Subir</translation> | |
1098 | 1105 | </message> |
1099 | 1106 | </context> |
1100 | 1107 | <context> |
1101 | 1108 | <name>FinderSyncHost</name> |
1102 | 1109 | <message> |
1103 | 1110 | <source>Failed to get link</source> |
1104 | <translation type="unfinished"/> | |
1111 | <translation>Fallo al obtener enlace</translation> | |
1105 | 1112 | </message> |
1106 | 1113 | <message> |
1107 | 1114 | <source>File "%1" is locked by %2</source> |
1108 | <translation type="unfinished"/> | |
1115 | <translation>El archivo "%1" está bloqueado por %2</translation> | |
1109 | 1116 | </message> |
1110 | 1117 | <message> |
1111 | 1118 | <source>Failed to get lock information for file "%1"</source> |
1112 | <translation type="unfinished"/> | |
1119 | <translation>Fallo al obtener información de bloqueo para el archivo "%1"</translation> | |
1113 | 1120 | </message> |
1114 | 1121 | <message> |
1115 | 1122 | <source>Failed to get upload link for file "%1"</source> |
1116 | <translation type="unfinished"/> | |
1123 | <translation>Fallo al obtener el enlace de subida para el archivo "%1"</translation> | |
1117 | 1124 | </message> |
1118 | 1125 | </context> |
1119 | 1126 | <context> |
1389 | 1396 | <translation>Ingrese el nombre del equipo</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>Fallo al modificar la cuenta actual</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>Dirección del Servidor %1</translation> |
1398 | 1401 | </message> |
2185 | 2188 | </message> |
2186 | 2189 | <message> |
2187 | 2190 | <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> | |
2189 | 2192 | </message> |
2190 | 2193 | </context> |
2191 | 2194 | <context> |
2535 | 2538 | <context> |
2536 | 2539 | <name>SeafileApplet</name> |
2537 | 2540 | <message> |
2538 | <source>failed to add default account</source> | |
2539 | <translation>fallo al agregar la cuenta predefinida</translation> | |
2540 | </message> | |
2541 | <message> | |
2542 | 2541 | <source>Failed to initialize log: %s</source> |
2543 | 2542 | <translation>Fallo al crear registro: %s</translation> |
2544 | 2543 | </message> |
3041 | 3040 | </message> |
3042 | 3041 | <message> |
3043 | 3042 | <source>Upload Link</source> |
3044 | <translation type="unfinished"/> | |
3043 | <translation>Enlace de Subida</translation> | |
3045 | 3044 | </message> |
3046 | 3045 | <message> |
3047 | 3046 | <source>Upload link:</source> |
3048 | <translation type="unfinished"/> | |
3047 | <translation>Enlace de subida:</translation> | |
3049 | 3048 | </message> |
3050 | 3049 | </context> |
3051 | 3050 | <context> |
3152 | 3151 | </message> |
3153 | 3152 | </context> |
3154 | 3153 | <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> | |
3155 | 3161 | <name>TwoFactorDialog</name> |
3156 | 3162 | <message> |
3157 | 3163 | <source>Enter the two factor authentication token</source> |
512 | 512 | </message> |
513 | 513 | </context> |
514 | 514 | <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> | |
515 | 522 | <name>DownloadRepoDialog</name> |
516 | 523 | <message> |
517 | 524 | <source>Please enter the password</source> |
1368 | 1375 | <translation type="unfinished"/> |
1369 | 1376 | </message> |
1370 | 1377 | <message> |
1371 | <source>Failed to save current account</source> | |
1372 | <translation type="unfinished"/> | |
1373 | </message> | |
1374 | <message> | |
1375 | 1378 | <source>%1 Server Address</source> |
1376 | 1379 | <translation type="unfinished"/> |
1377 | 1380 | </message> |
2506 | 2509 | <context> |
2507 | 2510 | <name>SeafileApplet</name> |
2508 | 2511 | <message> |
2509 | <source>failed to add default account</source> | |
2510 | <translation type="unfinished"/> | |
2511 | </message> | |
2512 | <message> | |
2513 | 2512 | <source>Failed to initialize log: %s</source> |
2514 | 2513 | <translation type="unfinished"/> |
2515 | 2514 | </message> |
3123 | 3122 | </message> |
3124 | 3123 | </context> |
3125 | 3124 | <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> | |
3126 | 3136 | <name>TwoFactorDialog</name> |
3127 | 3137 | <message> |
3128 | 3138 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
859 | 866 | </message> |
860 | 867 | <message> |
861 | 868 | <source>Failed to get upload link information for file "%1"</source> |
862 | <translation type="unfinished"/> | |
869 | <translation>Impossible d'obtenir les informations du lien d'envoi du fichier "%1"</translation> | |
863 | 870 | </message> |
864 | 871 | </context> |
865 | 872 | <context> |
1094 | 1101 | </message> |
1095 | 1102 | <message> |
1096 | 1103 | <source>&Generate %1 Upload Link</source> |
1097 | <translation type="unfinished"/> | |
1104 | <translation>&Générer %1 un lien d'envoi</translation> | |
1098 | 1105 | </message> |
1099 | 1106 | </context> |
1100 | 1107 | <context> |
1101 | 1108 | <name>FinderSyncHost</name> |
1102 | 1109 | <message> |
1103 | 1110 | <source>Failed to get link</source> |
1104 | <translation type="unfinished"/> | |
1111 | <translation>Impossible d'obtenir le lien</translation> | |
1105 | 1112 | </message> |
1106 | 1113 | <message> |
1107 | 1114 | <source>File "%1" is locked by %2</source> |
1108 | <translation type="unfinished"/> | |
1115 | <translation>Le fichier "%1" est verrouillé par %2</translation> | |
1109 | 1116 | </message> |
1110 | 1117 | <message> |
1111 | 1118 | <source>Failed to get lock information for file "%1"</source> |
1112 | <translation type="unfinished"/> | |
1119 | <translation>Impossible d'obtenir l'information de verrouillage du fichier "%1"</translation> | |
1113 | 1120 | </message> |
1114 | 1121 | <message> |
1115 | 1122 | <source>Failed to get upload link for file "%1"</source> |
1116 | <translation type="unfinished"/> | |
1123 | <translation>Impossible d'obtenir le lien d'envoi du fichier "%1"</translation> | |
1117 | 1124 | </message> |
1118 | 1125 | </context> |
1119 | 1126 | <context> |
1388 | 1395 | <translation>Veuillez entrer le nom de l'ordinateur</translation> |
1389 | 1396 | </message> |
1390 | 1397 | <message> |
1391 | <source>Failed to save current account</source> | |
1392 | <translation>Impossible d'enregistrer le compte actuel</translation> | |
1393 | </message> | |
1394 | <message> | |
1395 | 1398 | <source>%1 Server Address</source> |
1396 | 1399 | <translation>%1 adresse serveur</translation> |
1397 | 1400 | </message> |
2534 | 2537 | <context> |
2535 | 2538 | <name>SeafileApplet</name> |
2536 | 2539 | <message> |
2537 | <source>failed to add default account</source> | |
2538 | <translation>Échec de l'ajout du compte par défaut</translation> | |
2539 | </message> | |
2540 | <message> | |
2541 | 2540 | <source>Failed to initialize log: %s</source> |
2542 | 2541 | <translation>Échec de l'initialisation du log: %s</translation> |
2543 | 2542 | </message> |
3151 | 3150 | </message> |
3152 | 3151 | </context> |
3153 | 3152 | <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> | |
3154 | 3160 | <name>TwoFactorDialog</name> |
3155 | 3161 | <message> |
3156 | 3162 | <source>Enter the two factor authentication token</source> |
517 | 517 | </message> |
518 | 518 | </context> |
519 | 519 | <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> | |
520 | 527 | <name>DownloadRepoDialog</name> |
521 | 528 | <message> |
522 | 529 | <source>Please enter the password</source> |
1379 | 1386 | <translation type="unfinished"/> |
1380 | 1387 | </message> |
1381 | 1388 | <message> |
1382 | <source>Failed to save current account</source> | |
1383 | <translation>נכשל בשמירת החשבון הנוכחי</translation> | |
1384 | </message> | |
1385 | <message> | |
1386 | 1389 | <source>%1 Server Address</source> |
1387 | 1390 | <translation type="unfinished"/> |
1388 | 1391 | </message> |
2519 | 2522 | <context> |
2520 | 2523 | <name>SeafileApplet</name> |
2521 | 2524 | <message> |
2522 | <source>failed to add default account</source> | |
2523 | <translation type="unfinished"/> | |
2524 | </message> | |
2525 | <message> | |
2526 | 2525 | <source>Failed to initialize log: %s</source> |
2527 | 2526 | <translation type="unfinished"/> |
2528 | 2527 | </message> |
3136 | 3135 | </message> |
3137 | 3136 | </context> |
3138 | 3137 | <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> | |
3139 | 3145 | <name>TwoFactorDialog</name> |
3140 | 3146 | <message> |
3141 | 3147 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1389 | 1396 | <translation>Kérem adja meg a számítógép nevét</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>A fiók mentése nem sikerült.</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>%1 szerver cím</translation> |
1398 | 1401 | </message> |
2529 | 2532 | <context> |
2530 | 2533 | <name>SeafileApplet</name> |
2531 | 2534 | <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> | |
2536 | 2535 | <source>Failed to initialize log: %s</source> |
2537 | 2536 | <translation>A naplózás elindítása nem sikerült: %S</translation> |
2538 | 2537 | </message> |
3146 | 3145 | </message> |
3147 | 3146 | </context> |
3148 | 3147 | <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> | |
3149 | 3155 | <name>TwoFactorDialog</name> |
3150 | 3156 | <message> |
3151 | 3157 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1387 | 1394 | <translation>Vinsamlegast skráðu heiti tölvunnar</translation> |
1388 | 1395 | </message> |
1389 | 1396 | <message> |
1390 | <source>Failed to save current account</source> | |
1391 | <translation>Mistókst að vista reikninginn</translation> | |
1392 | </message> | |
1393 | <message> | |
1394 | 1397 | <source>%1 Server Address</source> |
1395 | 1398 | <translation>%1 Veffang Þjóns</translation> |
1396 | 1399 | </message> |
2527 | 2530 | <context> |
2528 | 2531 | <name>SeafileApplet</name> |
2529 | 2532 | <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> | |
2534 | 2533 | <source>Failed to initialize log: %s</source> |
2535 | 2534 | <translation>Mistókst að frumstilla skrá: %s</translation> |
2536 | 2535 | </message> |
3144 | 3143 | </message> |
3145 | 3144 | </context> |
3146 | 3145 | <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> | |
3147 | 3153 | <name>TwoFactorDialog</name> |
3148 | 3154 | <message> |
3149 | 3155 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1389 | 1396 | <translation>Per favore inserisci il nome del computer</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>Impossibile salvare l'account corrente</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>%1 Indirizzo del Server</translation> |
1398 | 1401 | </message> |
2529 | 2532 | <context> |
2530 | 2533 | <name>SeafileApplet</name> |
2531 | 2534 | <message> |
2532 | <source>failed to add default account</source> | |
2533 | <translation>Impossibile aggiungere l'account predefinito</translation> | |
2534 | </message> | |
2535 | <message> | |
2536 | 2535 | <source>Failed to initialize log: %s</source> |
2537 | 2536 | <translation>Fallita inizializzazione log: %s</translation> |
2538 | 2537 | </message> |
3146 | 3145 | </message> |
3147 | 3146 | </context> |
3148 | 3147 | <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> | |
3149 | 3155 | <name>TwoFactorDialog</name> |
3150 | 3156 | <message> |
3151 | 3157 | <source>Enter the two factor authentication token</source> |
519 | 519 | </message> |
520 | 520 | </context> |
521 | 521 | <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> | |
522 | 529 | <name>DownloadRepoDialog</name> |
523 | 530 | <message> |
524 | 531 | <source>Please enter the password</source> |
1376 | 1383 | <message> |
1377 | 1384 | <source>Please enter the computer name</source> |
1378 | 1385 | <translation>コンピュータ名を入力してください</translation> |
1379 | </message> | |
1380 | <message> | |
1381 | <source>Failed to save current account</source> | |
1382 | <translation type="unfinished"/> | |
1383 | 1386 | </message> |
1384 | 1387 | <message> |
1385 | 1388 | <source>%1 Server Address</source> |
2518 | 2521 | <context> |
2519 | 2522 | <name>SeafileApplet</name> |
2520 | 2523 | <message> |
2521 | <source>failed to add default account</source> | |
2522 | <translation type="unfinished"/> | |
2523 | </message> | |
2524 | <message> | |
2525 | 2524 | <source>Failed to initialize log: %s</source> |
2526 | 2525 | <translation type="unfinished"/> |
2527 | 2526 | </message> |
3135 | 3134 | </message> |
3136 | 3135 | </context> |
3137 | 3136 | <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> | |
3138 | 3144 | <name>TwoFactorDialog</name> |
3139 | 3145 | <message> |
3140 | 3146 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1390 | 1397 | <translation>컴퓨터 이름을 입력해주세요</translation> |
1391 | 1398 | </message> |
1392 | 1399 | <message> |
1393 | <source>Failed to save current account</source> | |
1394 | <translation>현재 계정 저장에 실패했습니다</translation> | |
1395 | </message> | |
1396 | <message> | |
1397 | 1400 | <source>%1 Server Address</source> |
1398 | 1401 | <translation>%1 서버 주소</translation> |
1399 | 1402 | </message> |
2536 | 2539 | <context> |
2537 | 2540 | <name>SeafileApplet</name> |
2538 | 2541 | <message> |
2539 | <source>failed to add default account</source> | |
2540 | <translation>기본 계정 추가에 실패했습니다</translation> | |
2541 | </message> | |
2542 | <message> | |
2543 | 2542 | <source>Failed to initialize log: %s</source> |
2544 | 2543 | <translation>로그 초기화에 실패했습니다: %1</translation> |
2545 | 2544 | </message> |
3154 | 3153 | </message> |
3155 | 3154 | </context> |
3156 | 3155 | <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> | |
3157 | 3163 | <name>TwoFactorDialog</name> |
3158 | 3164 | <message> |
3159 | 3165 | <source>Enter the two factor authentication token</source> |
516 | 516 | </message> |
517 | 517 | </context> |
518 | 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 type="unfinished"/> | |
523 | </message> | |
524 | </context> | |
525 | <context> | |
519 | 526 | <name>DownloadRepoDialog</name> |
520 | 527 | <message> |
521 | 528 | <source>Please enter the password</source> |
1373 | 1380 | <translation type="unfinished"/> |
1374 | 1381 | </message> |
1375 | 1382 | <message> |
1376 | <source>Failed to save current account</source> | |
1377 | <translation type="unfinished"/> | |
1378 | </message> | |
1379 | <message> | |
1380 | 1383 | <source>%1 Server Address</source> |
1381 | 1384 | <translation type="unfinished"/> |
1382 | 1385 | </message> |
2511 | 2514 | <context> |
2512 | 2515 | <name>SeafileApplet</name> |
2513 | 2516 | <message> |
2514 | <source>failed to add default account</source> | |
2515 | <translation type="unfinished"/> | |
2516 | </message> | |
2517 | <message> | |
2518 | 2517 | <source>Failed to initialize log: %s</source> |
2519 | 2518 | <translation type="unfinished"/> |
2520 | 2519 | </message> |
3128 | 3127 | </message> |
3129 | 3128 | </context> |
3130 | 3129 | <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> | |
3131 | 3137 | <name>TwoFactorDialog</name> |
3132 | 3138 | <message> |
3133 | 3139 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1387 | 1394 | <translation>Skriv inn datamaskinnavnet</translation> |
1388 | 1395 | </message> |
1389 | 1396 | <message> |
1390 | <source>Failed to save current account</source> | |
1391 | <translation>Kunne ikke lagre nåværende konto</translation> | |
1392 | </message> | |
1393 | <message> | |
1394 | 1397 | <source>%1 Server Address</source> |
1395 | 1398 | <translation type="unfinished"/> |
1396 | 1399 | </message> |
2527 | 2530 | <context> |
2528 | 2531 | <name>SeafileApplet</name> |
2529 | 2532 | <message> |
2530 | <source>failed to add default account</source> | |
2531 | <translation type="unfinished"/> | |
2532 | </message> | |
2533 | <message> | |
2534 | 2533 | <source>Failed to initialize log: %s</source> |
2535 | 2534 | <translation>Kunne ikke initialisere loggen: %s</translation> |
2536 | 2535 | </message> |
3144 | 3143 | </message> |
3145 | 3144 | </context> |
3146 | 3145 | <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> | |
3147 | 3153 | <name>TwoFactorDialog</name> |
3148 | 3154 | <message> |
3149 | 3155 | <source>Enter the two factor authentication token</source> |
518 | 518 | </message> |
519 | 519 | </context> |
520 | 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"/> | |
525 | </message> | |
526 | </context> | |
527 | <context> | |
521 | 528 | <name>DownloadRepoDialog</name> |
522 | 529 | <message> |
523 | 530 | <source>Please enter the password</source> |
1384 | 1391 | <translation>Vul de computernaam in</translation> |
1385 | 1392 | </message> |
1386 | 1393 | <message> |
1387 | <source>Failed to save current account</source> | |
1388 | <translation>Mislukt om de huidige account op te slaan</translation> | |
1389 | </message> | |
1390 | <message> | |
1391 | 1394 | <source>%1 Server Address</source> |
1392 | 1395 | <translation type="unfinished"/> |
1393 | 1396 | </message> |
2524 | 2527 | <context> |
2525 | 2528 | <name>SeafileApplet</name> |
2526 | 2529 | <message> |
2527 | <source>failed to add default account</source> | |
2528 | <translation type="unfinished"/> | |
2529 | </message> | |
2530 | <message> | |
2531 | 2530 | <source>Failed to initialize log: %s</source> |
2532 | 2531 | <translation>Mislukt om de log te initialiseren: %s</translation> |
2533 | 2532 | </message> |
3141 | 3140 | </message> |
3142 | 3141 | </context> |
3143 | 3142 | <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> | |
3144 | 3150 | <name>TwoFactorDialog</name> |
3145 | 3151 | <message> |
3146 | 3152 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1386 | 1393 | <translation>Geef de computernaam op</translation> |
1387 | 1394 | </message> |
1388 | 1395 | <message> |
1389 | <source>Failed to save current account</source> | |
1390 | <translation>Kon huidige account niet opslaan</translation> | |
1391 | </message> | |
1392 | <message> | |
1393 | 1396 | <source>%1 Server Address</source> |
1394 | 1397 | <translation>%1 serveradres</translation> |
1395 | 1398 | </message> |
2526 | 2529 | <context> |
2527 | 2530 | <name>SeafileApplet</name> |
2528 | 2531 | <message> |
2529 | <source>failed to add default account</source> | |
2530 | <translation>Kon standaardaccount niet toevoegen</translation> | |
2531 | </message> | |
2532 | <message> | |
2533 | 2532 | <source>Failed to initialize log: %s</source> |
2534 | 2533 | <translation>Kon logbestand niet initialiseren: %s</translation> |
2535 | 2534 | </message> |
3144 | 3143 | </message> |
3145 | 3144 | </context> |
3146 | 3145 | <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> | |
3147 | 3153 | <name>TwoFactorDialog</name> |
3148 | 3154 | <message> |
3149 | 3155 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1389 | 1396 | <translation>Podaj nazwę komputera</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>Nie udało się zapisać aktualnego konta</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>Adres serwera %1</translation> |
1398 | 1401 | </message> |
2535 | 2538 | <context> |
2536 | 2539 | <name>SeafileApplet</name> |
2537 | 2540 | <message> |
2538 | <source>failed to add default account</source> | |
2539 | <translation>nie udało się dodać konta domyślnego</translation> | |
2540 | </message> | |
2541 | <message> | |
2542 | 2541 | <source>Failed to initialize log: %s</source> |
2543 | 2542 | <translation>Nie udało się zainicjować logu: %s</translation> |
2544 | 2543 | </message> |
3152 | 3151 | </message> |
3153 | 3152 | </context> |
3154 | 3153 | <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> | |
3155 | 3161 | <name>TwoFactorDialog</name> |
3156 | 3162 | <message> |
3157 | 3163 | <source>Enter the two factor authentication token</source> |
515 | 515 | <message> |
516 | 516 | <source>%1 exited unexpectedly</source> |
517 | 517 | <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"/> | |
518 | 525 | </message> |
519 | 526 | </context> |
520 | 527 | <context> |
1386 | 1393 | <translation>Por favor, digite o nome do computador</translation> |
1387 | 1394 | </message> |
1388 | 1395 | <message> |
1389 | <source>Failed to save current account</source> | |
1390 | <translation>Falha ao salvar a conta atual</translation> | |
1391 | </message> | |
1392 | <message> | |
1393 | 1396 | <source>%1 Server Address</source> |
1394 | 1397 | <translation type="unfinished"/> |
1395 | 1398 | </message> |
2526 | 2529 | <context> |
2527 | 2530 | <name>SeafileApplet</name> |
2528 | 2531 | <message> |
2529 | <source>failed to add default account</source> | |
2530 | <translation>Falha ao adicionar conta padrão</translation> | |
2531 | </message> | |
2532 | <message> | |
2533 | 2532 | <source>Failed to initialize log: %s</source> |
2534 | 2533 | <translation>Falho ao inicializar o histórico: %s</translation> |
2535 | 2534 | </message> |
3144 | 3143 | </message> |
3145 | 3144 | </context> |
3146 | 3145 | <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> | |
3147 | 3153 | <name>TwoFactorDialog</name> |
3148 | 3154 | <message> |
3149 | 3155 | <source>Enter the two factor authentication token</source> |
517 | 517 | </message> |
518 | 518 | </context> |
519 | 519 | <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> | |
520 | 527 | <name>DownloadRepoDialog</name> |
521 | 528 | <message> |
522 | 529 | <source>Please enter the password</source> |
1379 | 1386 | <translation type="unfinished"/> |
1380 | 1387 | </message> |
1381 | 1388 | <message> |
1382 | <source>Failed to save current account</source> | |
1383 | <translation>Falha ao guardar conta atual</translation> | |
1384 | </message> | |
1385 | <message> | |
1386 | 1389 | <source>%1 Server Address</source> |
1387 | 1390 | <translation type="unfinished"/> |
1388 | 1391 | </message> |
2519 | 2522 | <context> |
2520 | 2523 | <name>SeafileApplet</name> |
2521 | 2524 | <message> |
2522 | <source>failed to add default account</source> | |
2523 | <translation type="unfinished"/> | |
2524 | </message> | |
2525 | <message> | |
2526 | 2525 | <source>Failed to initialize log: %s</source> |
2527 | 2526 | <translation type="unfinished"/> |
2528 | 2527 | </message> |
3136 | 3135 | </message> |
3137 | 3136 | </context> |
3138 | 3137 | <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> | |
3139 | 3145 | <name>TwoFactorDialog</name> |
3140 | 3146 | <message> |
3141 | 3147 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
859 | 866 | </message> |
860 | 867 | <message> |
861 | 868 | <source>Failed to get upload link information for file "%1"</source> |
862 | <translation type="unfinished"/> | |
869 | <translation>Не удалось получить информацию о ссылке для загрузки файла "%1"</translation> | |
863 | 870 | </message> |
864 | 871 | </context> |
865 | 872 | <context> |
1094 | 1101 | </message> |
1095 | 1102 | <message> |
1096 | 1103 | <source>&Generate %1 Upload Link</source> |
1097 | <translation type="unfinished"/> | |
1104 | <translation>&Создать %1 ссылку для загрузки</translation> | |
1098 | 1105 | </message> |
1099 | 1106 | </context> |
1100 | 1107 | <context> |
1101 | 1108 | <name>FinderSyncHost</name> |
1102 | 1109 | <message> |
1103 | 1110 | <source>Failed to get link</source> |
1104 | <translation type="unfinished"/> | |
1111 | <translation>Не удалось получить ссылку</translation> | |
1105 | 1112 | </message> |
1106 | 1113 | <message> |
1107 | 1114 | <source>File "%1" is locked by %2</source> |
1108 | <translation type="unfinished"/> | |
1115 | <translation>Файл "%1" заблокирован %2</translation> | |
1109 | 1116 | </message> |
1110 | 1117 | <message> |
1111 | 1118 | <source>Failed to get lock information for file "%1"</source> |
1112 | <translation type="unfinished"/> | |
1119 | <translation>Не удалось получить информацию о блокировке файла "%1"</translation> | |
1113 | 1120 | </message> |
1114 | 1121 | <message> |
1115 | 1122 | <source>Failed to get upload link for file "%1"</source> |
1116 | <translation type="unfinished"/> | |
1123 | <translation>Не удалось получить ссылку для загрузки файла "%1"</translation> | |
1117 | 1124 | </message> |
1118 | 1125 | </context> |
1119 | 1126 | <context> |
1389 | 1396 | <translation>Пожалуйста, введите имя компьютера</translation> |
1390 | 1397 | </message> |
1391 | 1398 | <message> |
1392 | <source>Failed to save current account</source> | |
1393 | <translation>Не удалось сохранить текущий аккаунт</translation> | |
1394 | </message> | |
1395 | <message> | |
1396 | 1399 | <source>%1 Server Address</source> |
1397 | 1400 | <translation>%1 Адрес сервера</translation> |
1398 | 1401 | </message> |
2185 | 2188 | </message> |
2186 | 2189 | <message> |
2187 | 2190 | <source>failed to open sync error id database</source> |
2188 | <translation type="unfinished"/> | |
2191 | <translation>не удалось открыть базу данных с кодом ошибки синхронизации</translation> | |
2189 | 2192 | </message> |
2190 | 2193 | </context> |
2191 | 2194 | <context> |
2533 | 2536 | <context> |
2534 | 2537 | <name>SeafileApplet</name> |
2535 | 2538 | <message> |
2536 | <source>failed to add default account</source> | |
2537 | <translation>не удалось добавить аккаунт по умолчанию</translation> | |
2538 | </message> | |
2539 | <message> | |
2540 | 2539 | <source>Failed to initialize log: %s</source> |
2541 | 2540 | <translation>Ошибка инициализации лога: %s</translation> |
2542 | 2541 | </message> |
3039 | 3038 | </message> |
3040 | 3039 | <message> |
3041 | 3040 | <source>Upload Link</source> |
3042 | <translation type="unfinished"/> | |
3041 | <translation>Ссылка для загрузки</translation> | |
3043 | 3042 | </message> |
3044 | 3043 | <message> |
3045 | 3044 | <source>Upload link:</source> |
3046 | <translation type="unfinished"/> | |
3045 | <translation>Ссылка для загрузки:</translation> | |
3047 | 3046 | </message> |
3048 | 3047 | </context> |
3049 | 3048 | <context> |
3150 | 3149 | </message> |
3151 | 3150 | </context> |
3152 | 3151 | <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> | |
3153 | 3159 | <name>TwoFactorDialog</name> |
3154 | 3160 | <message> |
3155 | 3161 | <source>Enter the two factor authentication token</source> |
517 | 517 | </message> |
518 | 518 | </context> |
519 | 519 | <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> | |
520 | 527 | <name>DownloadRepoDialog</name> |
521 | 528 | <message> |
522 | 529 | <source>Please enter the password</source> |
1379 | 1386 | <translation type="unfinished"/> |
1380 | 1387 | </message> |
1381 | 1388 | <message> |
1382 | <source>Failed to save current account</source> | |
1383 | <translation>Nepodarilo sa uložiť aktuálny účet</translation> | |
1384 | </message> | |
1385 | <message> | |
1386 | 1389 | <source>%1 Server Address</source> |
1387 | 1390 | <translation type="unfinished"/> |
1388 | 1391 | </message> |
2519 | 2522 | <context> |
2520 | 2523 | <name>SeafileApplet</name> |
2521 | 2524 | <message> |
2522 | <source>failed to add default account</source> | |
2523 | <translation type="unfinished"/> | |
2524 | </message> | |
2525 | <message> | |
2526 | 2525 | <source>Failed to initialize log: %s</source> |
2527 | 2526 | <translation type="unfinished"/> |
2528 | 2527 | </message> |
3136 | 3135 | </message> |
3137 | 3136 | </context> |
3138 | 3137 | <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> | |
3139 | 3145 | <name>TwoFactorDialog</name> |
3140 | 3146 | <message> |
3141 | 3147 | <source>Enter the two factor authentication token</source> |
512 | 512 | </message> |
513 | 513 | </context> |
514 | 514 | <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> | |
515 | 522 | <name>DownloadRepoDialog</name> |
516 | 523 | <message> |
517 | 524 | <source>Please enter the password</source> |
1368 | 1375 | <translation type="unfinished"/> |
1369 | 1376 | </message> |
1370 | 1377 | <message> |
1371 | <source>Failed to save current account</source> | |
1372 | <translation type="unfinished"/> | |
1373 | </message> | |
1374 | <message> | |
1375 | 1378 | <source>%1 Server Address</source> |
1376 | 1379 | <translation type="unfinished"/> |
1377 | 1380 | </message> |
2506 | 2509 | <context> |
2507 | 2510 | <name>SeafileApplet</name> |
2508 | 2511 | <message> |
2509 | <source>failed to add default account</source> | |
2510 | <translation type="unfinished"/> | |
2511 | </message> | |
2512 | <message> | |
2513 | 2512 | <source>Failed to initialize log: %s</source> |
2514 | 2513 | <translation type="unfinished"/> |
2515 | 2514 | </message> |
3119 | 3118 | </message> |
3120 | 3119 | <message> |
3121 | 3120 | <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> | |
3122 | 3128 | <translation type="unfinished"/> |
3123 | 3129 | </message> |
3124 | 3130 | </context> |
521 | 521 | </message> |
522 | 522 | </context> |
523 | 523 | <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> | |
524 | 531 | <name>DownloadRepoDialog</name> |
525 | 532 | <message> |
526 | 533 | <source>Please enter the password</source> |
1387 | 1394 | <translation>Lütfen bilgisayar adını giriniz</translation> |
1388 | 1395 | </message> |
1389 | 1396 | <message> |
1390 | <source>Failed to save current account</source> | |
1391 | <translation>Mevcut hesabı kaydetme başarısız</translation> | |
1392 | </message> | |
1393 | <message> | |
1394 | 1397 | <source>%1 Server Address</source> |
1395 | 1398 | <translation type="unfinished"/> |
1396 | 1399 | </message> |
2527 | 2530 | <context> |
2528 | 2531 | <name>SeafileApplet</name> |
2529 | 2532 | <message> |
2530 | <source>failed to add default account</source> | |
2531 | <translation type="unfinished"/> | |
2532 | </message> | |
2533 | <message> | |
2534 | 2533 | <source>Failed to initialize log: %s</source> |
2535 | 2534 | <translation>Log %s başlatılamadı</translation> |
2536 | 2535 | </message> |
3144 | 3143 | </message> |
3145 | 3144 | </context> |
3146 | 3145 | <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> | |
3147 | 3153 | <name>TwoFactorDialog</name> |
3148 | 3154 | <message> |
3149 | 3155 | <source>Enter the two factor authentication token</source> |
517 | 517 | </message> |
518 | 518 | </context> |
519 | 519 | <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> | |
520 | 527 | <name>DownloadRepoDialog</name> |
521 | 528 | <message> |
522 | 529 | <source>Please enter the password</source> |
1379 | 1386 | <translation>Будь ласка, введіть ім'я комп'ютера</translation> |
1380 | 1387 | </message> |
1381 | 1388 | <message> |
1382 | <source>Failed to save current account</source> | |
1383 | <translation>Не вдалося зберігти поточний аккаунт</translation> | |
1384 | </message> | |
1385 | <message> | |
1386 | 1389 | <source>%1 Server Address</source> |
1387 | 1390 | <translation type="unfinished"/> |
1388 | 1391 | </message> |
2519 | 2522 | <context> |
2520 | 2523 | <name>SeafileApplet</name> |
2521 | 2524 | <message> |
2522 | <source>failed to add default account</source> | |
2523 | <translation type="unfinished"/> | |
2524 | </message> | |
2525 | <message> | |
2526 | 2525 | <source>Failed to initialize log: %s</source> |
2527 | 2526 | <translation type="unfinished"/> |
2528 | 2527 | </message> |
3136 | 3135 | </message> |
3137 | 3136 | </context> |
3138 | 3137 | <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> | |
3139 | 3145 | <name>TwoFactorDialog</name> |
3140 | 3146 | <message> |
3141 | 3147 | <source>Enter the two factor authentication token</source> |
513 | 513 | <message> |
514 | 514 | <source>%1 exited unexpectedly</source> |
515 | 515 | <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> | |
516 | 523 | </message> |
517 | 524 | </context> |
518 | 525 | <context> |
1381 | 1388 | <translation>请填写计算机名</translation> |
1382 | 1389 | </message> |
1383 | 1390 | <message> |
1384 | <source>Failed to save current account</source> | |
1385 | <translation>保存帐户失败</translation> | |
1386 | </message> | |
1387 | <message> | |
1388 | 1391 | <source>%1 Server Address</source> |
1389 | 1392 | <translation>%1 云盘网址</translation> |
1390 | 1393 | </message> |
2525 | 2528 | <context> |
2526 | 2529 | <name>SeafileApplet</name> |
2527 | 2530 | <message> |
2528 | <source>failed to add default account</source> | |
2529 | <translation>添加默认帐户失败</translation> | |
2530 | </message> | |
2531 | <message> | |
2532 | 2531 | <source>Failed to initialize log: %s</source> |
2533 | 2532 | <translation>初始化日志失败: %s</translation> |
2534 | 2533 | </message> |
3142 | 3141 | </message> |
3143 | 3142 | </context> |
3144 | 3143 | <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> | |
3145 | 3155 | <name>TwoFactorDialog</name> |
3146 | 3156 | <message> |
3147 | 3157 | <source>Enter the two factor authentication token</source> |
520 | 520 | </message> |
521 | 521 | </context> |
522 | 522 | <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> | |
523 | 530 | <name>DownloadRepoDialog</name> |
524 | 531 | <message> |
525 | 532 | <source>Please enter the password</source> |
1388 | 1395 | <translation>請輸入此計算機的代號</translation> |
1389 | 1396 | </message> |
1390 | 1397 | <message> |
1391 | <source>Failed to save current account</source> | |
1392 | <translation>無法儲存目前帳號</translation> | |
1393 | </message> | |
1394 | <message> | |
1395 | 1398 | <source>%1 Server Address</source> |
1396 | 1399 | <translation type="unfinished"/> |
1397 | 1400 | </message> |
2529 | 2532 | <context> |
2530 | 2533 | <name>SeafileApplet</name> |
2531 | 2534 | <message> |
2532 | <source>failed to add default account</source> | |
2533 | <translation type="unfinished"/> | |
2534 | </message> | |
2535 | <message> | |
2536 | 2535 | <source>Failed to initialize log: %s</source> |
2537 | 2536 | <translation>無法初始化日誌: %s</translation> |
2538 | 2537 | </message> |
3146 | 3145 | </message> |
3147 | 3146 | </context> |
3148 | 3147 | <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> | |
3149 | 3155 | <name>TwoFactorDialog</name> |
3150 | 3156 | <message> |
3151 | 3157 | <source>Enter the two factor authentication token</source> |
269 | 269 | return accounts_; |
270 | 270 | } |
271 | 271 | |
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 | ||
274 | 278 | Account new_account = account; |
275 | 279 | bool account_exist = false; |
276 | 280 | { |
277 | 281 | 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++) { | |
279 | 284 | if (accounts_[i] == account) { |
280 | 285 | accounts_.erase(accounts_.begin() + i); |
281 | 286 | account_exist = true; |
284 | 289 | } |
285 | 290 | accounts_.insert(accounts_.begin(), new_account); |
286 | 291 | } |
287 | updateServerInfo(0); | |
292 | AccountInfoService::instance()->refresh(); | |
293 | updateAccountServerInfo(new_account); | |
288 | 294 | |
289 | 295 | qint64 timestamp = QDateTime::currentMSecsSinceEpoch(); |
290 | 296 | |
330 | 336 | sqlite3_free(zql); |
331 | 337 | |
332 | 338 | emit accountsChanged(); |
333 | ||
334 | return 0; | |
335 | 339 | } |
336 | 340 | |
337 | 341 | int AccountManager::removeAccount(const Account& account) |
401 | 405 | sqlite3_free(zql); |
402 | 406 | } |
403 | 407 | |
404 | bool AccountManager::accountExists(const QUrl& url, const QString& username) | |
408 | bool AccountManager::accountExists(const QUrl& url, const QString& username) const | |
405 | 409 | { |
406 | 410 | for (size_t i = 0; i < accounts_.size(); i++) { |
407 | 411 | if (accounts_[i].serverUrl == url && accounts_[i].username == username) { |
412 | 416 | return false; |
413 | 417 | } |
414 | 418 | |
415 | bool AccountManager::validateAndUseAccount(const Account& account) | |
419 | void AccountManager::validateAndUseAccount(const Account& account) | |
416 | 420 | { |
417 | 421 | if (!account.isAutomaticLogin) { |
418 | 422 | 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 | } | |
445 | 429 | } |
446 | 430 | |
447 | 431 | int AccountManager::replaceAccount(const Account& old_account, const Account& new_account) |
453 | 437 | // TODO copy new_account and old_account before this operation |
454 | 438 | // we might have invalid old_account or new_account after it |
455 | 439 | accounts_[i] = new_account; |
456 | updateServerInfo(i); | |
440 | updateAccountServerInfo(new_account); | |
457 | 441 | break; |
458 | 442 | } |
459 | 443 | } |
521 | 505 | return Account(); |
522 | 506 | } |
523 | 507 | |
524 | void AccountManager::updateServerInfo() | |
508 | void AccountManager::updateServerInfoForAllAccounts() | |
525 | 509 | { |
526 | 510 | 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); | |
535 | 517 | connect(request, SIGNAL(success(const Account&, const ServerInfo &)), |
536 | 518 | this, SLOT(serverInfoSuccess(const Account&, const ServerInfo &))); |
537 | 519 | connect(request, SIGNAL(failed(const ApiError&)), |
561 | 543 | |
562 | 544 | void AccountManager::serverInfoSuccess(const Account &_account, const ServerInfo &info) |
563 | 545 | { |
546 | ServerInfoRequest *req = (ServerInfoRequest *)(sender()); | |
547 | req->deleteLater(); | |
548 | ||
564 | 549 | Account account = _account; |
565 | 550 | account.serverInfo = info; |
566 | 551 | |
593 | 578 | |
594 | 579 | void AccountManager::serverInfoFailed(const ApiError &error) |
595 | 580 | { |
581 | ServerInfoRequest *req = (ServerInfoRequest *)(sender()); | |
582 | req->deleteLater(); | |
583 | ||
596 | 584 | qWarning("update server info failed %s\n", error.toString().toUtf8().data()); |
597 | 585 | } |
598 | 586 | |
599 | bool AccountManager::clearAccountToken(const Account& account) | |
587 | void AccountManager::clearAccountToken(const Account& account) | |
600 | 588 | { |
601 | 589 | for (size_t i = 0; i < accounts_.size(); i++) { |
602 | 590 | if (accounts_[i] == account) { |
619 | 607 | sqlite3_free(zql); |
620 | 608 | |
621 | 609 | emit accountsChanged(); |
622 | ||
623 | return true; | |
624 | } | |
625 | ||
626 | bool AccountManager::clearSyncToken(const Account& account) | |
610 | } | |
611 | ||
612 | void AccountManager::clearSyncToken(const Account& account) | |
627 | 613 | { |
628 | 614 | QString error; |
629 | 615 | QUrl url = account.serverUrl; |
633 | 619 | &error) < 0) { |
634 | 620 | seafApplet->warningBox( |
635 | 621 | tr("Failed to remove local repos sync token: %1").arg(error)); |
636 | return false; | |
637 | } else { | |
638 | return true; | |
639 | 622 | } |
640 | 623 | } |
641 | 624 | |
709 | 692 | emit accountRequireRelogin(account); |
710 | 693 | } |
711 | 694 | |
712 | bool AccountManager::reloginAccount(const Account &account_in) | |
695 | void AccountManager::reloginAccount(const Account &account_in) | |
713 | 696 | { |
714 | 697 | qWarning("Relogin to account %s", account_in.username.toUtf8().data()); |
715 | 698 | bool accepted; |
740 | 723 | // current account is the newly relogged in account. |
741 | 724 | getSyncedReposToken(currentAccount()); |
742 | 725 | } |
743 | ||
744 | return accepted; | |
745 | 726 | } |
746 | 727 | |
747 | 728 | void AccountManager::getSyncedReposToken(const Account& account) |
800 | 781 | } |
801 | 782 | req->deleteLater(); |
802 | 783 | } |
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 | } |
13 | 13 | class ApiError; |
14 | 14 | class SeafileRpcClient; |
15 | 15 | |
16 | /** | |
17 | * Load/Save seahub accounts | |
18 | */ | |
16 | ||
19 | 17 | class AccountManager : public QObject { |
20 | 18 | Q_OBJECT |
21 | 19 | |
24 | 22 | ~AccountManager(); |
25 | 23 | |
26 | 24 | int start(); |
27 | void updateServerInfo(); | |
28 | 25 | |
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. | |
30 | 39 | int removeAccount(const Account& account); |
31 | 40 | |
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. | |
32 | 68 | 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. | |
37 | 71 | void removeNonautoLoginSyncTokens(); |
38 | 72 | |
39 | const std::vector<Account>& loadAccounts(); | |
40 | bool accountExists(const QUrl& url, const QString& username); | |
73 | /** | |
74 | * Accessors | |
75 | */ | |
41 | 76 | |
42 | bool hasAccount() const { return !accounts_.empty(); } | |
77 | const std::vector<Account>& accounts() const; | |
43 | 78 | |
44 | Account currentAccount() const { return hasAccount() ? accounts_[0] : Account(); } | |
79 | const Account currentAccount() const; | |
45 | 80 | |
46 | bool setCurrentAccount(const Account& account); | |
81 | bool hasAccount() const; | |
47 | 82 | |
48 | int replaceAccount(const Account& old_account, | |
49 | const Account& new_account); | |
83 | bool accountExists(const QUrl& url, const QString& username) const; | |
50 | 84 | |
51 | 85 | Account getAccountByHostAndUsername(const QString& host, |
52 | 86 | const QString& username) const; |
53 | 87 | |
54 | 88 | Account getAccountBySignature(const QString& account_sig) const; |
55 | 89 | |
56 | /// \brief find the Account By Repo ID | |
57 | /// return an invalid Account if failed | |
58 | 90 | Account getAccountByRepo(const QString& repo_id); |
59 | 91 | |
60 | // Also used by extension handler | |
61 | 92 | 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(); | |
72 | 93 | |
73 | 94 | signals: |
74 | 95 | /** |
83 | 104 | void accountInfoUpdated(const Account& account); |
84 | 105 | |
85 | 106 | public slots: |
86 | bool reloginAccount(const Account &account); | |
107 | void reloginAccount(const Account &account); | |
87 | 108 | |
88 | 109 | private slots: |
89 | 110 | void serverInfoSuccess(const Account &account, const ServerInfo &info); |
99 | 120 | private: |
100 | 121 | Q_DISABLE_COPY(AccountManager) |
101 | 122 | |
102 | void updateServerInfo(unsigned index); | |
123 | void updateAccountServerInfo(const Account& account); | |
103 | 124 | static bool loadAccountsCB(struct sqlite3_stmt *stmt, void *data); |
104 | 125 | static bool loadServerInfoCB(struct sqlite3_stmt *stmt, void *data); |
105 | 126 | |
106 | 127 | void updateAccountLastVisited(const Account& account); |
107 | 128 | void getSyncedReposToken(const Account& account); |
108 | 129 | 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); | |
109 | 134 | |
110 | 135 | QHash<QString, Account> accounts_cache_; |
111 | 136 |
0 | 0 | #include "account.h" |
1 | 1 | #include "utils/utils.h" |
2 | 2 | #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 | } | |
16 | 3 | |
17 | 4 | QUrl Account::getAbsoluteUrl(const QString& relativeUrl) const |
18 | 5 | { |
5 | 5 | #include <QMetaType> |
6 | 6 | |
7 | 7 | #include "api/server-info.h" |
8 | ||
9 | class ServerInfoRequest; | |
10 | 8 | |
11 | 9 | class AccountInfo { |
12 | 10 | public: |
18 | 16 | |
19 | 17 | class Account { |
20 | 18 | friend class AccountManager; |
21 | ServerInfoRequest *serverInfoRequest; | |
22 | ServerInfoRequest* createServerInfoRequest(); | |
23 | 19 | public: |
24 | 20 | ServerInfo serverInfo; |
25 | 21 | AccountInfo accountInfo; |
31 | 27 | bool isAutomaticLogin; |
32 | 28 | QString s2fa_token; |
33 | 29 | |
34 | ~Account(); | |
35 | Account() : serverInfoRequest(NULL), | |
36 | serverInfo(), | |
30 | Account() : serverInfo(), | |
37 | 31 | lastVisited(0), |
38 | 32 | isShibboleth(false), |
39 | 33 | isAutomaticLogin(true) {} |
40 | 34 | Account(QUrl serverUrl, QString username, QString token, |
41 | 35 | qint64 lastVisited=0, bool isShibboleth = false, |
42 | 36 | bool isAutomaticLogin = true, QString s2fa_token = QString()) |
43 | : serverInfoRequest(NULL), | |
44 | serverInfo(), | |
37 | : serverInfo(), | |
45 | 38 | accountInfo(), |
46 | 39 | serverUrl(serverUrl), |
47 | 40 | username(username), |
52 | 45 | s2fa_token(s2fa_token) {} |
53 | 46 | |
54 | 47 | Account(const Account &rhs) |
55 | : serverInfoRequest(NULL), | |
56 | serverInfo(rhs.serverInfo), | |
48 | : serverInfo(rhs.serverInfo), | |
57 | 49 | accountInfo(rhs.accountInfo), |
58 | 50 | serverUrl(rhs.serverUrl), |
59 | 51 | username(rhs.username), |
66 | 58 | } |
67 | 59 | |
68 | 60 | Account& operator=(const Account&rhs) { |
69 | serverInfoRequest = NULL; | |
70 | 61 | serverInfo = rhs.serverInfo; |
71 | 62 | accountInfo = rhs.accountInfo; |
72 | 63 | serverUrl = rhs.serverUrl; |
119 | 110 | (majorVersion << 20) + (minorVersion << 10) + (patchVersion); |
120 | 111 | } |
121 | 112 | |
122 | int getEncryptedLibraryVersion() { | |
113 | int getEncryptedLibraryVersion() const { | |
123 | 114 | return serverInfo.encryptedLibraryVersion; |
124 | 115 | } |
125 | 116 | // require pro edtions and version at least at ... |
138 | 138 | QNetworkRequest request(url); |
139 | 139 | prepareRequest(&request); |
140 | 140 | |
141 | request.setHeader(QNetworkRequest::ContentTypeHeader, kContentTypeForm); | |
141 | if (!headers_.contains("Content-Type")) { | |
142 | request.setHeader(QNetworkRequest::ContentTypeHeader, kContentTypeForm); | |
143 | } | |
142 | 144 | |
143 | 145 | if (is_put) |
144 | 146 | reply_ = qnam_->put(request, body_); |
37 | 37 | form_params_[name] = value; |
38 | 38 | } |
39 | 39 | |
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 | ||
40 | 48 | void SeafileApiRequest::setUseCache(bool use_cache) |
41 | 49 | { |
42 | 50 | api_client_->setUseCache(use_cache); |
68 | 76 | break; |
69 | 77 | case METHOD_POST: |
70 | 78 | 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 | } | |
73 | 85 | break; |
74 | 86 | default: |
75 | 87 | qWarning("unknown method %d\n", method_); |
76 | 88 | return; |
77 | 89 | } |
78 | 90 | |
91 | post_data_.clear(); | |
79 | 92 | connect(api_client_, SIGNAL(requestSuccess(QNetworkReply&)), |
80 | 93 | this, SLOT(requestSuccess(QNetworkReply&))); |
81 | 94 |
29 | 29 | void setUrlParam(const QString& name, const QString& value); |
30 | 30 | // set param k-v pair which appears in url-encoded form |
31 | 31 | void setFormParam(const QString& name, const QString& value); |
32 | // set http request body directly | |
33 | void setRequestBody(const QByteArray& content); | |
32 | 34 | // useful for static resources like images |
33 | 35 | void setUseCache(bool use_cache); |
34 | 36 | |
79 | 81 | QHash<QString, QString> form_params_; |
80 | 82 | Method method_; |
81 | 83 | QString token_; |
84 | QByteArray post_data_; | |
85 | ||
82 | 86 | SeafileApiClient* api_client_; |
83 | 87 | }; |
84 | 88 |
417 | 417 | |
418 | 418 | private: |
419 | 419 | Q_DISABLE_COPY(ServerInfoRequest); |
420 | const Account& account_; | |
420 | const Account account_; | |
421 | 421 | }; |
422 | 422 | |
423 | 423 | class LogoutDeviceRequest : public SeafileApiRequest |
25 | 25 | const char *kSparkleAppcastURIForCN = "https://www.seafile.com/api/client-updates/seafile-client-mac-cn/appcast.xml"; |
26 | 26 | #endif |
27 | 27 | const char *kSparkleAlreadyEnableUpdateByDefault = "SparkleAlreadyEnableUpdateByDefault"; |
28 | const char *kPreconfigureEnableAutoUpdate = "PreconfigureEnableAutoUpdate"; | |
28 | 29 | |
29 | 30 | QString getAppcastURI() { |
30 | 31 | QString url_from_env = qgetenv("SEAFILE_CLIENT_APPCAST_URI"); |
138 | 139 | QSettings settings; |
139 | 140 | settings.beginGroup("Misc"); |
140 | 141 | 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); | |
141 | 144 | |
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 | |
142 | 154 | if (!already_enable_update_by_default) { |
143 | 155 | settings.setValue(kSparkleAlreadyEnableUpdateByDefault, true); |
144 | 156 | setAutoUpdateEnabled(true); |
145 | 157 | } |
158 | #endif | |
146 | 159 | |
147 | 160 | settings.endGroup(); |
148 | 161 | } |
25 | 25 | const char *kFileCacheTopDirName = "file-cache"; |
26 | 26 | const int kPasswordCacheExpirationMSecs = 30 * 60 * 1000; |
27 | 27 | |
28 | const int kQueryAsyncOperationProgressInterval = 1000; | |
28 | 29 | } // namespace |
29 | 30 | |
30 | 31 | /** |
177 | 178 | |
178 | 179 | void DataManager::copyDirents(const QString &repo_id, |
179 | 180 | const QString &dir_path, |
180 | const QStringList &file_names, | |
181 | const QMap<QString, int> &dict_file_names, | |
181 | 182 | const QString &dst_repo_id, |
182 | 183 | const QString &dst_dir_path) |
183 | 184 | { |
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; | |
195 | 336 | } |
196 | 337 | |
197 | 338 | void DataManager::moveDirents(const QString &repo_id, |
198 | 339 | const QString &dir_path, |
199 | const QStringList &file_names, | |
340 | const QMap<QString, int> &dict_file_names, | |
200 | 341 | const QString &dst_repo_id, |
201 | 342 | const QString &dst_dir_path) |
202 | 343 | { |
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 | ||
215 | 498 | |
216 | 499 | void DataManager::onGetDirentsSuccess(bool current_readonly, const QList<SeafDirent> &dirents, const QString& repo_id) |
217 | 500 | { |
23 | 23 | class FileNetworkTask; |
24 | 24 | class FileUploadTask; |
25 | 25 | class FileDownloadTask; |
26 | class QueryAsyncOperationProgress; | |
27 | class AsyncCopyAndMoveOneItemRequest; | |
26 | 28 | |
27 | 29 | /** |
28 | 30 | * DataManager is responsible for getting dirents/files from seahub, as well |
75 | 77 | |
76 | 78 | void copyDirents(const QString &repo_id, |
77 | 79 | const QString &dir_path, |
78 | const QStringList &file_names, | |
80 | const QMap<QString, int> &dict_file_names, | |
79 | 81 | const QString &dst_repo_id, |
80 | 82 | const QString &dst_dir_path); |
81 | 83 | |
82 | 84 | void moveDirents(const QString &repo_id, |
83 | 85 | const QString &dir_path, |
84 | const QStringList &file_names, | |
86 | const QMap<QString, int> &dict_file_names, | |
85 | 87 | const QString &dst_repo_id, |
86 | 88 | const QString &dst_dir_path); |
87 | 89 | |
174 | 176 | |
175 | 177 | void onAccountChanged(); |
176 | 178 | |
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 | ||
177 | 200 | private: |
178 | 201 | void removeDirentsCache(const QString& repo_id, |
179 | 202 | const QString& path, |
193 | 216 | DirentsCache *dirents_cache_; |
194 | 217 | QString old_repo_id_; |
195 | 218 | |
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 | ||
196 | 228 | 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_; | |
197 | 232 | }; |
198 | 233 | |
199 | 234 |
79 | 79 | |
80 | 80 | } // namespace |
81 | 81 | |
82 | QStringList FileBrowserDialog::file_names_to_be_pasted_; | |
82 | QMap<QString, int> FileBrowserDialog::file_names_to_be_pasted_; | |
83 | 83 | QString FileBrowserDialog::dir_path_to_be_pasted_from_; |
84 | 84 | QString FileBrowserDialog::repo_id_to_be_pasted_from_; |
85 | 85 | Account FileBrowserDialog::account_to_be_pasted_from_; |
1433 | 1433 | return !file_names_to_be_pasted_.empty(); |
1434 | 1434 | } |
1435 | 1435 | |
1436 | void FileBrowserDialog::setFilesToBePasted(bool is_copy, const QStringList &file_names) | |
1436 | void FileBrowserDialog::setFilesToBePasted(bool is_copy, const QMap<QString, int> &file_names) | |
1437 | 1437 | { |
1438 | 1438 | is_copyed_when_pasted_ = is_copy; |
1439 | 1439 | dir_path_to_be_pasted_from_ = current_path_; |
1455 | 1455 | } |
1456 | 1456 | |
1457 | 1457 | // 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()) { | |
1459 | 1459 | const QString file_path_to_be_pasted = |
1460 | 1460 | appendTrailingSlash(::pathJoin(dir_path_to_be_pasted_from_, name)); |
1461 | 1461 | if (appendTrailingSlash(current_path_).startsWith(file_path_to_be_pasted)) { |
158 | 158 | |
159 | 159 | void done(int retval); |
160 | 160 | bool hasFilesToBePasted(); |
161 | void setFilesToBePasted(bool is_copy, const QStringList &file_names); | |
161 | void setFilesToBePasted(bool is_copy, const QMap<QString ,int> &file_names); | |
162 | 162 | |
163 | 163 | void createToolBar(); |
164 | 164 | void createStatusBar(); |
203 | 203 | qint64 search_text_last_modified_; |
204 | 204 | |
205 | 205 | // 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_; | |
207 | 207 | static QString dir_path_to_be_pasted_from_; |
208 | 208 | static QString repo_id_to_be_pasted_from_; |
209 | 209 | static Account account_to_be_pasted_from_; |
2 | 2 | #include <jansson.h> |
3 | 3 | #include <QtNetwork> |
4 | 4 | #include <QScopedPointer> |
5 | #include <QMapIterator> | |
5 | 6 | |
6 | 7 | #include "account.h" |
7 | 8 | #include "api/api-error.h" |
9 | 10 | #include "utils/utils.h" |
10 | 11 | #include "utils/file-utils.h" |
11 | 12 | #include "src/open-local-helper.h" |
13 | #include "utils/json-utils.h" | |
14 | #include "seafile-applet.h" | |
12 | 15 | |
13 | 16 | namespace { |
14 | 17 | |
18 | 21 | const char kGetFileUploadUrl[] = "api2/repos/%1/upload-link/"; |
19 | 22 | const char kGetFileUpdateUrl[] = "api2/repos/%1/update-link/"; |
20 | 23 | 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/"; | |
21 | 26 | 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/"; | |
22 | 29 | const char kFileOperationMove[] = "api2/repos/%1/fileops/move/"; |
23 | 30 | const char kRemoveDirentsURL[] = "api2/repos/%1/fileops/delete/"; |
24 | 31 | const char kGetFileUploadedBytesUrl[] = "api/v2.1/repos/%1/file-uploaded-bytes/"; |
28 | 35 | //const char kGetFileFromRevisionUrl[] = "api2/repos/%1/file/revision/"; |
29 | 36 | //const char kGetFileDetailUrl[] = "api2/repos/%1/file/detail/"; |
30 | 37 | //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 | } | |
31 | 57 | |
32 | 58 | } // namespace |
33 | 59 | |
173 | 199 | emit failed(ApiError::fromHttpError(500)); |
174 | 200 | } |
175 | 201 | |
202 | ||
176 | 203 | RenameDirentRequest::RenameDirentRequest(const Account &account, |
177 | 204 | const QString &repo_id, |
178 | 205 | const QString &path, |
232 | 259 | emit success(repo_id_); |
233 | 260 | } |
234 | 261 | |
262 | ||
235 | 263 | MoveFileRequest::MoveFileRequest(const Account &account, |
236 | 264 | const QString &repo_id, |
237 | 265 | const QString &path, |
252 | 280 | { |
253 | 281 | emit success(); |
254 | 282 | } |
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 | ||
255 | 449 | |
256 | 450 | CopyMultipleFilesRequest::CopyMultipleFilesRequest(const Account &account, |
257 | 451 | const QString &repo_id, |
2 | 2 | |
3 | 3 | #include <QList> |
4 | 4 | #include <QStringList> |
5 | #include <QTimer> | |
5 | 6 | |
6 | 7 | #include "api/api-request.h" |
7 | 8 | #include "seaf-dirent.h" |
265 | 266 | const QString dst_repo_id_; |
266 | 267 | }; |
267 | 268 | |
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 | ||
268 | 368 | class StarFileRequest : public SeafileApiRequest { |
269 | 369 | Q_OBJECT |
270 | 370 | public: |
843 | 843 | |
844 | 844 | void FileTableView::onCopy() |
845 | 845 | { |
846 | QStringList file_names; | |
846 | QMap<QString, int> file_names; | |
847 | 847 | |
848 | 848 | if (item_ == NULL) { |
849 | 849 | const QList<const SeafDirent*> dirents = getSelectedItemsFromSource(); |
850 | 850 | 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); | |
852 | 852 | } |
853 | 853 | } else { |
854 | file_names.push_back(item_->name); | |
855 | } | |
856 | ||
854 | file_names.insert(item_->name, item_->type == SeafDirent::DIR ? 1 : 0); | |
855 | } | |
857 | 856 | |
858 | 857 | parent_->setFilesToBePasted(true, file_names); |
859 | 858 | } |
860 | 859 | |
861 | 860 | void FileTableView::onMove() |
862 | 861 | { |
863 | QStringList file_names; | |
862 | QMap<QString, int> file_names; | |
864 | 863 | bool has_readonly = false; |
865 | 864 | |
866 | 865 | if (item_ == NULL) { |
871 | 870 | has_readonly = true; |
872 | 871 | break; |
873 | 872 | } |
874 | file_names.push_back(dirents[i]->name); | |
873 | file_names.insert(dirents[i]->name, dirents[i]->type == SeafDirent::DIR ? 1 : 0); | |
875 | 874 | } |
876 | 875 | } else { |
877 | 876 | if (item_->readonly) { |
878 | 877 | has_readonly = true; |
879 | 878 | } else { |
880 | file_names.push_back(item_->name); | |
879 | file_names.insert(item_->name, item_->type == SeafDirent::DIR ? 1 : 0); | |
881 | 880 | } |
882 | 881 | } |
883 | 882 |
311 | 311 | AccountInfoService::instance()->start(); |
312 | 312 | SeafileAppletRpcServer::instance()->start(); |
313 | 313 | |
314 | account_mgr_->updateServerInfo(); | |
314 | account_mgr_->updateServerInfoForAllAccounts(); | |
315 | 315 | |
316 | 316 | // |
317 | 317 | // start ui part |
338 | 338 | settingsManager()->setComputerName(computer_name); |
339 | 339 | if (!username.isEmpty() && !token.isEmpty() && !url.isEmpty()) { |
340 | 340 | 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); | |
344 | 342 | break; |
345 | 343 | } |
346 | 344 |
106 | 106 | return; |
107 | 107 | } |
108 | 108 | 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(); | |
115 | 111 | } |
116 | 112 | } |
117 | 113 |
311 | 311 | account.username = info.email; |
312 | 312 | account.isAutomaticLogin = |
313 | 313 | 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); | |
321 | 317 | } |
322 | 318 | |
323 | 319 | void LoginDialog::onHttpError(int code) |
174 | 174 | |
175 | 175 | SyncError error = model->errorAt(row); |
176 | 176 | |
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 | ||
177 | 183 | prepareContextMenu(error); |
178 | 184 | pos = viewport()->mapToGlobal(pos); |
179 | 185 | context_menu_->exec(pos); |
186 | 192 | |
187 | 193 | void SyncErrorsTableView::onDeleteFileAsyncError() |
188 | 194 | { |
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 | } | |
193 | 201 | } |
194 | 202 | emit refreshModel(); |
195 | 203 | } |
197 | 205 | void SyncErrorsTableView::createContextMenu() |
198 | 206 | { |
199 | 207 | context_menu_ = new QMenu(this); |
200 | delete_action_ = new QAction("delete", this); | |
208 | delete_action_ = new QAction(tr("delete"), this); | |
201 | 209 | context_menu_->addAction(delete_action_); |
202 | 210 | connect(delete_action_, SIGNAL(triggered()), this, SLOT(onDeleteFileAsyncError())); |
203 | 211 | } |