Comparar commits

..

17 Commits

Autor SHA1 Mensagem Data
Piotr M 54ee5a81eb bundling final implementation 2016-11-25 01:33:04 +01:00
Piotr M d196ce98b2 prototype of bundled requests in the client 2016-11-24 01:51:32 +01:00
Christian Kamm 045498c71a Account: Rename user() to davUser()
Avoids potential confusion with credentials->user()
2016-11-23 17:08:17 +01:00
Markus Goetz 679ac0d26a Wizard: Show if server asks for client certificate #2799 #69 (#5261)
This also nicely displays the 'Untrusted domain' message of oC.
The link to add a trusted domain (via web browser) is clickable.
2016-11-23 11:43:15 +01:00
Markus Goetz 2e3a3bcf84 Folder: Make folder only accessible by user #5282 (#5315)
Because on OS X the parent folder might not protect
against access.
2016-11-23 11:05:41 +01:00
Jonathan Kawohl ad437a49f9 Merge branch 'Kawohl-master'
fix conflict
2016-11-23 11:01:52 +01:00
Jonathan Kawohl 6b2282bf0d Merge branch 'master' of https://github.com/owncloud/client into Kawohl-master
fix conflict
2016-11-23 10:59:18 +01:00
Jonathan Kawohl 42aed56a5a Merge branch 'master' of https://gthub.com/Kawohl/client into Kawohl-master
fix conflict
2016-11-23 10:56:29 +01:00
Jonathan Kawohl ca9ec46253 fixed note 2016-11-23 09:17:33 +01:00
Jonathan Kawohl a92eec160a fixed review https://github.com/owncloud/client/pull/5259#pullrequestreview-9743725 2016-11-23 09:10:58 +01:00
Jenkins for ownCloud cc91c42dfa [tx-robot] updated from transifex 2016-11-23 02:18:37 +01:00
Olivier Goffart d22d0e7e30 Propagator: don't use dynamic_cast for QObject
qobject_cast is better. (no need to use RTTI when we have QMetaObject
2016-11-22 17:37:41 +01:00
Jonathan Kawohl ffac3f6213 fixing wrong files Revert "fix for https://github.com/owncloud/client/issues/1251"
This reverts commit 4f1feab845.
2016-10-24 15:16:06 +02:00
Jonathan Kawohl 4f1feab845 fix for https://github.com/owncloud/client/issues/1251 2016-10-24 15:09:25 +02:00
Jonathan Kawohl f738cfd7fe added info on qtkeychain
added installation info on qtkeychain
2016-10-24 09:00:07 +02:00
Jonathan Kawohl 092c935422 Correcting for PR comments 2016-10-20 13:05:56 +02:00
Jonathan Kawohl 72d8175032 updated link for documentation and added more info to osx build 2016-10-19 11:12:11 +02:00
96 arquivos alterados com 2208 adições e 1342 exclusões
+13 -8
Ver Arquivo
@@ -114,7 +114,7 @@ void csync_create(CSYNC **csync, const char *local) {
*csync = ctx;
}
void csync_init(CSYNC *ctx, const char *db_file) {
void csync_init(CSYNC *ctx) {
assert(ctx);
/* Do not initialize twice */
@@ -125,9 +125,6 @@ void csync_init(CSYNC *ctx, const char *db_file) {
ctx->remote.type = REMOTE_REPLICA;
SAFE_FREE(ctx->statedb.file);
ctx->statedb.file = c_strdup(db_file);
c_rbtree_create(&ctx->local.tree, _key_cmp, _data_cmp);
c_rbtree_create(&ctx->remote.tree, _key_cmp, _data_cmp);
@@ -149,11 +146,19 @@ int csync_update(CSYNC *ctx) {
}
ctx->status_code = CSYNC_STATUS_OK;
/* Path of database file is set in csync_init */
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
/* create/load statedb */
rc = asprintf(&ctx->statedb.file, "%s/.csync_journal.db",
ctx->local.uri);
if (rc < 0) {
ctx->status_code = CSYNC_STATUS_MEMORY_ERROR;
return rc;
}
CSYNC_LOG(CSYNC_LOG_PRIORITY_DEBUG, "Journal: %s", ctx->statedb.file);
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
rc = -1;
return rc;
}
}
ctx->status_code = CSYNC_STATUS_OK;
@@ -510,6 +515,7 @@ static void _csync_clean_ctx(CSYNC *ctx)
c_rbtree_free(ctx->local.tree);
c_rbtree_free(ctx->remote.tree);
SAFE_FREE(ctx->statedb.file);
SAFE_FREE(ctx->remote.root_perms);
}
@@ -566,7 +572,6 @@ int csync_destroy(CSYNC *ctx) {
_csync_clean_ctx(ctx);
SAFE_FREE(ctx->statedb.file);
SAFE_FREE(ctx->local.uri);
SAFE_FREE(ctx->error_string);
+1 -1
Ver Arquivo
@@ -326,7 +326,7 @@ void OCSYNC_EXPORT csync_create(CSYNC **csync, const char *local);
*
* @param ctx The context to initialize.
*/
void OCSYNC_EXPORT csync_init(CSYNC *ctx, const char *db_file);
void OCSYNC_EXPORT csync_init(CSYNC *ctx);
/**
* @brief Update detection
-5
Ver Arquivo
@@ -230,11 +230,6 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch
}
blen = strlen(bname);
rc = csync_fnmatch("._sync_*.db*", bname, 0);
if (rc == 0) {
match = CSYNC_FILE_SILENTLY_EXCLUDED;
goto out;
}
rc = csync_fnmatch(".csync_journal.db*", bname, 0);
if (rc == 0) {
match = CSYNC_FILE_SILENTLY_EXCLUDED;
+31
Ver Arquivo
@@ -704,6 +704,8 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
}
while ((dirent = csync_vio_readdir(ctx, dh))) {
const char *path = NULL;
size_t ulen = 0;
int flen;
int flag;
@@ -742,6 +744,35 @@ int csync_ftw(CSYNC *ctx, const char *uri, csync_walker_fn fn,
goto error;
}
/* Create relative path: For local replica, we need to remove the base path. */
path = filename;
if (ctx->current == LOCAL_REPLICA) {
ulen = strlen(ctx->local.uri) + 1;
if (((size_t)flen) < ulen) {
csync_vio_file_stat_destroy(dirent);
dirent = NULL;
ctx->status_code = CSYNC_STATUS_UNSUCCESSFUL;
goto error;
}
path += ulen;
}
/* skip ".csync_journal.db" and ".csync_journal.db.ctmp" */
/* Isn't this done via csync_exclude already? */
if (c_streq(path, ".csync_journal.db")
|| c_streq(path, ".csync_journal.db.ctmp")
|| c_streq(path, ".csync_journal.db.ctmp-journal")
|| c_streq(path, ".csync-progressdatabase")
|| c_streq(path, ".csync_journal.db-shm")
|| c_streq(path, ".csync_journal.db-wal")
|| c_streq(path, ".csync_journal.db-journal")) {
csync_vio_file_stat_destroy(dirent);
dirent = NULL;
SAFE_FREE(filename);
continue;
}
/* Only for the local replica we have to stat(), for the remote one we have all data already */
if (ctx->replica == LOCAL_REPLICA) {
res = csync_vio_stat(ctx, filename, dirent);
+8 -14
Ver Arquivo
@@ -23,7 +23,7 @@
#include "csync_private.h"
static int setup(void **state) {
static void setup(void **state) {
CSYNC *csync;
int rc;
@@ -33,11 +33,9 @@ static int setup(void **state) {
csync_create(&csync, "/tmp/check_csync1");
*state = csync;
return 0;
}
static int setup_module(void **state) {
static void setup_module(void **state) {
CSYNC *csync;
int rc;
@@ -46,13 +44,11 @@ static int setup_module(void **state) {
csync_create(&csync, "/tmp/check_csync1");
csync_init(csync, "foo");
csync_init(csync);
*state = csync;
return 0;
}
static int teardown(void **state) {
static void teardown(void **state) {
CSYNC *csync = *state;
int rc;
@@ -65,8 +61,6 @@ static int teardown(void **state) {
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
static void check_csync_commit(void **state)
@@ -94,10 +88,10 @@ static void check_csync_commit_dummy(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(check_csync_commit, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_commit_dummy, setup_module, teardown),
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_commit, setup, teardown),
unit_test_setup_teardown(check_csync_commit_dummy, setup_module, teardown),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+4 -4
Ver Arquivo
@@ -50,11 +50,11 @@ static void check_csync_create(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(check_csync_destroy_null),
cmocka_unit_test(check_csync_create),
const UnitTest tests[] = {
unit_test(check_csync_destroy_null),
unit_test(check_csync_create),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+13 -28
Ver Arquivo
@@ -29,16 +29,15 @@
#define EXCLUDE_LIST_FILE SOURCEDIR"/../sync-exclude.lst"
static int setup(void **state) {
static void setup(void **state) {
CSYNC *csync;
csync_create(&csync, "/tmp/check_csync1");
*state = csync;
return 0;
}
static int setup_init(void **state) {
static void setup_init(void **state) {
CSYNC *csync;
int rc;
@@ -60,10 +59,9 @@ static int setup_init(void **state) {
assert_int_equal(rc, 0);
*state = csync;
return 0;
}
static int teardown(void **state) {
static void teardown(void **state) {
CSYNC *csync = *state;
int rc;
@@ -76,8 +74,6 @@ static int teardown(void **state) {
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
static void check_csync_exclude_add(void **state)
@@ -147,17 +143,6 @@ static void check_csync_excluded(void **state)
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
rc = csync_excluded_no_ctx(csync->excludes, "subdir/.csync_journal.db", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
/* also the new form of the database name */
rc = csync_excluded_no_ctx(csync->excludes, "._sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
rc = csync_excluded_no_ctx(csync->excludes, "._sync_5bdd60bdfcfa.db.ctmp", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
rc = csync_excluded_no_ctx(csync->excludes, "._sync_5bdd60bdfcfa.db-shm", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
rc = csync_excluded_no_ctx(csync->excludes, "subdir/._sync_5bdd60bdfcfa.db", CSYNC_FTW_TYPE_FILE);
assert_int_equal(rc, CSYNC_FILE_SILENTLY_EXCLUDED);
/* pattern ]*.directory - ignore and remove */
rc = csync_excluded_no_ctx(csync->excludes, "my.~directory", CSYNC_FTW_TYPE_FILE);
@@ -395,16 +380,16 @@ static void check_csync_exclude_expand_escapes(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(check_csync_exclude_add, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_exclude_load, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_excluded, setup_init, teardown),
cmocka_unit_test_setup_teardown(check_csync_excluded_traversal, setup_init, teardown),
cmocka_unit_test_setup_teardown(check_csync_pathes, setup_init, teardown),
cmocka_unit_test_setup_teardown(check_csync_is_windows_reserved_word, setup_init, teardown),
cmocka_unit_test_setup_teardown(check_csync_excluded_performance, setup_init, teardown),
cmocka_unit_test(check_csync_exclude_expand_escapes),
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_exclude_add, setup, teardown),
unit_test_setup_teardown(check_csync_exclude_load, setup, teardown),
unit_test_setup_teardown(check_csync_excluded, setup_init, teardown),
unit_test_setup_teardown(check_csync_excluded_traversal, setup_init, teardown),
unit_test_setup_teardown(check_csync_pathes, setup_init, teardown),
unit_test_setup_teardown(check_csync_is_windows_reserved_word, setup_init, teardown),
unit_test_setup_teardown(check_csync_excluded_performance, setup_init, teardown),
unit_test(check_csync_exclude_expand_escapes),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+8 -13
Ver Arquivo
@@ -23,7 +23,7 @@
#include "csync_private.h"
static int setup(void **state) {
static void setup(void **state) {
CSYNC *csync;
int rc;
@@ -33,10 +33,9 @@ static int setup(void **state) {
csync_create(&csync, "/tmp/check_csync1");
*state = csync;
return 0;
}
static int setup_module(void **state) {
static void setup_module(void **state) {
CSYNC *csync;
int rc;
@@ -46,10 +45,9 @@ static int setup_module(void **state) {
csync_create(&csync, "/tmp/check_csync1");
*state = csync;
return 0;
}
static int teardown(void **state) {
static void teardown(void **state) {
CSYNC *csync = *state;
int rc;
@@ -62,27 +60,24 @@ static int teardown(void **state) {
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
static void check_csync_init(void **state)
{
CSYNC *csync = *state;
csync_init(csync, "");
csync_init(csync);
assert_int_equal(csync->status & CSYNC_STATUS_INIT, 1);
}
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(check_csync_init, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_init, setup_module, teardown),
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_init, setup, teardown),
unit_test_setup_teardown(check_csync_init, setup_module, teardown),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+7 -11
Ver Arquivo
@@ -26,7 +26,7 @@
#include "csync_log.c"
#include "c_private.h"
static int setup(void **state) {
static void setup(void **state) {
CSYNC *csync;
int rc;
@@ -36,11 +36,9 @@ static int setup(void **state) {
csync_create(&csync, "/tmp/check_csync1");
*state = csync;
return 0;
}
static int teardown(void **state) {
static void teardown(void **state) {
CSYNC *csync = *state;
int rc;
@@ -53,8 +51,6 @@ static int teardown(void **state) {
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
static void check_log_callback(int verbosity,
@@ -138,11 +134,11 @@ static void check_logging(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(check_set_log_level),
cmocka_unit_test(check_set_auth_callback),
cmocka_unit_test_setup_teardown(check_logging, setup, teardown),
const UnitTest tests[] = {
unit_test(check_set_log_level),
unit_test(check_set_auth_callback),
unit_test_setup_teardown(check_logging, setup, teardown),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+3 -3
Ver Arquivo
@@ -48,10 +48,10 @@ static void check_csync_normalize_etag(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(check_csync_normalize_etag),
const UnitTest tests[] = {
unit_test(check_csync_normalize_etag),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
@@ -26,7 +26,7 @@
#define TESTDB "/tmp/check_csync1/test.db"
static int setup(void **state) {
static void setup(void **state) {
CSYNC *csync;
int rc;
@@ -47,11 +47,9 @@ static int setup(void **state) {
rc = sqlite3_close(db);
assert_int_equal(rc, SQLITE_OK);
return 0;
}
static int teardown(void **state) {
static void teardown(void **state) {
CSYNC *csync = *state;
int rc;
@@ -62,8 +60,6 @@ static int teardown(void **state) {
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
static void check_csync_statedb_load(void **state)
@@ -120,11 +116,11 @@ static void check_csync_statedb_close(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(check_csync_statedb_load, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_statedb_close, setup, teardown),
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_statedb_load, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_close, setup, teardown),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
@@ -27,7 +27,7 @@
static int setup(void **state)
static void setup(void **state)
{
CSYNC *csync;
int rc = 0;
@@ -39,7 +39,7 @@ static int setup(void **state)
rc = system("mkdir -p /tmp/check_csync");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1");
csync_init(csync, TESTDB);
csync_init(csync);
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
@@ -51,11 +51,9 @@ static int setup(void **state)
assert_int_equal(rc, 0);
*state = csync;
return 0;
}
static int setup_db(void **state)
static void setup_db(void **state)
{
char *errmsg;
int rc = 0;
@@ -91,12 +89,10 @@ static int setup_db(void **state)
assert_int_equal(rc, SQLITE_OK);
sqlite3_close(db);
return 0;
}
static int teardown(void **state) {
static void teardown(void **state) {
CSYNC *csync = *state;
int rc = 0;
@@ -108,8 +104,6 @@ static int teardown(void **state) {
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
@@ -210,15 +204,15 @@ static void check_csync_statedb_get_stat_by_inode_not_found(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(check_csync_statedb_query_statement, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_statedb_drop_tables, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_statedb_insert_metadata, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_statedb_write, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_statedb_get_stat_by_hash_not_found, setup_db, teardown),
cmocka_unit_test_setup_teardown(check_csync_statedb_get_stat_by_inode_not_found, setup_db, teardown),
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_statedb_query_statement, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_drop_tables, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_insert_metadata, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_write, setup, teardown),
unit_test_setup_teardown(check_csync_statedb_get_stat_by_hash_not_found, setup_db, teardown),
unit_test_setup_teardown(check_csync_statedb_get_stat_by_inode_not_found, setup_db, teardown),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+17 -25
Ver Arquivo
@@ -81,7 +81,7 @@ static void statedb_insert_metadata(sqlite3 *db)
}
}
static int setup(void **state)
static void setup(void **state)
{
CSYNC *csync;
int rc;
@@ -92,7 +92,7 @@ static int setup(void **state)
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp/check_csync1");
csync_init(csync, TESTDB);
csync_init(csync);
/* Create a new db with metadata */
sqlite3 *db;
@@ -109,11 +109,9 @@ static int setup(void **state)
assert_int_equal(rc, 0);
*state = csync;
return 0;
}
static int setup_ftw(void **state)
static void setup_ftw(void **state)
{
CSYNC *csync;
int rc;
@@ -123,7 +121,7 @@ static int setup_ftw(void **state)
rc = system("mkdir -p /tmp/check_csync1");
assert_int_equal(rc, 0);
csync_create(&csync, "/tmp");
csync_init(csync, TESTDB);
csync_init(csync);
sqlite3 *db = NULL;
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
@@ -137,11 +135,9 @@ static int setup_ftw(void **state)
csync->statedb.file = c_strdup( TESTDB );
*state = csync;
return 0;
}
static int teardown(void **state)
static void teardown(void **state)
{
CSYNC *csync = *state;
int rc;
@@ -151,11 +147,9 @@ static int teardown(void **state)
assert_int_equal(rc, 0);
*state = NULL;
return 0;
}
static int teardown_rm(void **state) {
static void teardown_rm(void **state) {
int rc;
teardown(state);
@@ -164,8 +158,6 @@ static int teardown_rm(void **state) {
assert_int_equal(rc, 0);
rc = system("rm -rf /tmp/check_csync1");
assert_int_equal(rc, 0);
return 0;
}
/* create a file stat, caller must free memory */
@@ -432,19 +424,19 @@ static void check_csync_ftw_failing_fn(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(check_csync_detect_update, setup, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_none, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_eval, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_rename, setup, teardown),
cmocka_unit_test_setup_teardown(check_csync_detect_update_db_new, setup, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_detect_update_null, setup, teardown_rm),
const UnitTest tests[] = {
unit_test_setup_teardown(check_csync_detect_update, setup, teardown_rm),
unit_test_setup_teardown(check_csync_detect_update_db_none, setup, teardown),
unit_test_setup_teardown(check_csync_detect_update_db_eval, setup, teardown),
unit_test_setup_teardown(check_csync_detect_update_db_rename, setup, teardown),
unit_test_setup_teardown(check_csync_detect_update_db_new, setup, teardown_rm),
unit_test_setup_teardown(check_csync_detect_update_null, setup, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_ftw, setup_ftw, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_ftw_empty_uri, setup_ftw, teardown_rm),
cmocka_unit_test_setup_teardown(check_csync_ftw_failing_fn, setup_ftw, teardown_rm),
unit_test_setup_teardown(check_csync_ftw, setup_ftw, teardown_rm),
unit_test_setup_teardown(check_csync_ftw_empty_uri, setup_ftw, teardown_rm),
unit_test_setup_teardown(check_csync_ftw_failing_fn, setup_ftw, teardown_rm),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
+4 -4
Ver Arquivo
@@ -43,11 +43,11 @@ static void check_csync_memstat(void **state)
int torture_run_tests(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(check_csync_instruction_str),
cmocka_unit_test(check_csync_memstat),
const UnitTest tests[] = {
unit_test(check_csync_instruction_str),
unit_test(check_csync_memstat),
};
return cmocka_run_group_tests(tests, NULL, NULL);
return run_tests(tests);
}
-1
Ver Arquivo
@@ -457,7 +457,6 @@ sub traverse( $$;$ )
$isHere = 1 if( $acceptConflicts && !$isHere && $f =~ /_conflict/ );
$isHere = 1 if( $f =~ /\.csync/ );
$isHere = 1 if( $f =~ /\._sync_/ );
assert( $isHere, "Filename local, but not remote: $f" );
}
+1 -1
Ver Arquivo
@@ -176,7 +176,7 @@ assertLocalAndRemoteDir( 'remoteToLocal1', 1);
printInfo("simulate a owncloud 5 update by removing all the fileid");
## simulate a owncloud 5 update by removing all the fileid
system( "sqlite3 " . localDir() . "._sync_*.db \"UPDATE metadata SET fileid='';\"");
system( "sqlite3 " . localDir() . ".csync_journal.db \"UPDATE metadata SET fileid='';\"");
#refresh the ids
csync();
assertLocalAndRemoteDir( 'remoteToLocal1', 1);
+1 -1
Ver Arquivo
@@ -61,7 +61,7 @@ sub getETagFromJournal($$)
{
my ($name,$num) = @_;
my $sql = "sqlite3 " . localDir() . "._sync_*.db \"SELECT md5 FROM metadata WHERE path='$name';\"";
my $sql = "sqlite3 " . localDir() . ".csync_journal.db \"SELECT md5 FROM metadata WHERE path='$name';\"";
open(my $fh, '-|', $sql) or die $!;
my $etag = <$fh>;
close $fh;
+5 -5
Ver Arquivo
@@ -37,8 +37,8 @@ sub assertCsyncJournalOk {
my $path = $_[0];
# FIXME: should test also remoteperm but it's not working with owncloud6
# my $cmd = 'sqlite3 ' . $path . '._sync_*.db "SELECT count(*) from metadata where length(remotePerm) == 0 or length(fileId) == 0"';
my $cmd = 'sqlite3 ' . $path . '._sync_*.db "SELECT count(*) from metadata where length(fileId) == 0"';
# my $cmd = 'sqlite3 ' . $path . '.csync_journal.db "SELECT count(*) from metadata where length(remotePerm) == 0 or length(fileId) == 0"';
my $cmd = 'sqlite3 ' . $path . '.csync_journal.db "SELECT count(*) from metadata where length(fileId) == 0"';
my $result = `$cmd`;
assert($result == "0");
}
@@ -170,14 +170,14 @@ assertLocalAndRemoteDir( '', 0);
#######################################################################
printInfo( "move a directory in a outside read only folder" );
system("sqlite3 " . localDir().'._sync_*.db .dump');
system("sqlite3 " . localDir().'.csync_journal.db .dump');
#Missing directory should be restored
#new directory should be uploaded
system("mv " . localDir().'readonlyDirectory_PERM_M_/subdir_PERM_CK_ ' . localDir().'normalDirectory_PERM_CKDNV_/subdir_PERM_CKDNV_' );
csync();
system("sqlite3 " . localDir().'._sync_*.db .dump');
system("sqlite3 " . localDir().'.csync_journal.db .dump');
assertCsyncJournalOk(localDir());
# old name restored
@@ -229,7 +229,7 @@ system("rm -r " . localDir(). "readonlyDirectory_PERM_M_/moved_PERM_CK_");
assertLocalAndRemoteDir( '', 0);
system("sqlite3 " . localDir().'._sync_*.db .dump');
system("sqlite3 " . localDir().'.csync_journal.db .dump');
#######################################################################
+1 -2
Ver Arquivo
@@ -153,8 +153,7 @@ By default, the ownCloud Client ignores the following files:
* Files matched by one of the patterns defined in the Ignored Files Editor
* Files containing characters that do not work on certain file systems ``(`\, /, :, ?, *, ", >, <, |`)``.
* Files starting with ``._sync_xxxxxxx.db`` and the old format ``.csync_journal.db``,
as these files are reserved for journalling.
* Files starting with ``.csync_journal.db``, as these files are reserved for journalling.
If a pattern selected using a checkbox in the `ignoredFilesEditor-label` (or if
a line in the exclude file starts with the character ``]`` directly followed by
+13 -1
Ver Arquivo
@@ -68,9 +68,17 @@ To set up your build environment for development using HomeBrew_:
1. Install Xcode
2. Install Xcode command line tools::
<<<<<<< HEAD
xcode-select --install
3. Install homebrew::
=======
xcode-select --install
3. Install homebrew::
>>>>>>> ca9ec4625391ae23940b3a62aaa0afe89f3d98e8
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
4. Add the ownCloud repository using the following command::
@@ -100,7 +108,7 @@ To set up your build environment for development using HomeBrew_:
its Common Name as a third parameter (use quotes) to have the package
signed automatically.
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
.. note:: Contrary to earlier versions, ownCloud 1.7 and later are packaged
as a ``pkg`` installer. Do not call "make package" at any time when
compiling for OS X, as this will build a disk image, and will not
work correctly.
@@ -249,6 +257,10 @@ To build the most up-to-date version of the client:
.. note:: Example:: cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/qt5 -DCMAKE_INSTALL_PREFIX=/Users/path/to/client/install/ -D_OPENSSL_LIBDIR=/usr/local/opt/openssl/lib/ -D_OPENSSL_INCLUDEDIR=/usr/local/opt/openssl/include/ -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include/ -DNO_SHIBBOLETH=1
.. note:: Example:: cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/qt5 -DCMAKE_INSTALL_PREFIX=/Users/path/to/client/install/ -D_OPENSSL_LIBDIR=/usr/local/opt/openssl/lib/ -D_OPENSSL_INCLUDEDIR=/usr/local/opt/openssl/include/ -D_OPENSSL_VERSION=1.0.2a -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include/ -DNO_SHIBBOLETH=1
qtkeychain must be compiled with the same prefix e.g CMAKE_INSTALL_PREFIX=/Users/path/to/client/install/ .
4. Call ``make``.
The owncloud binary will appear in the ``bin`` directory.
+3
Ver Arquivo
@@ -511,6 +511,9 @@ X-GNOME-Autostart-Delay=3
# Translations
# Translations
# Translations
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
GenericName[oc]=Dorsièr de Sincronizacion
+4 -14
Ver Arquivo
@@ -278,6 +278,7 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
}
}
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
@@ -382,20 +383,11 @@ int main(int argc, char **argv) {
QByteArray remUrl = options.target_url.toUtf8();
// Find the folder and the original owncloud url
QStringList splitted = url.path().split("/" + account->davPath());
QStringList splitted = url.path().split(account->davPath());
url.setPath(splitted.value(0));
url.setScheme(url.scheme().replace("owncloud", "http"));
QUrl credentialFreeUrl = url;
credentialFreeUrl.setUserName(QString());
credentialFreeUrl.setPassword(QString());
// Remote folders typically start with a / and don't end with one
QString folder = "/" + splitted.value(1);
if (folder.endsWith("/") && folder != "/") {
folder.chop(1);
}
QString folder = splitted.value(1);
SimpleSslErrorHandler *sslErrorHandler = new SimpleSslErrorHandler;
@@ -478,9 +470,7 @@ restart_sync:
}
Cmd cmd;
QString dbPath = options.source_dir + SyncJournalDb::makeDbName(credentialFreeUrl, folder, user);
SyncJournalDb db(dbPath);
SyncJournalDb db(options.source_dir);
if (!selectiveSyncList.empty()) {
selectiveSyncFixup(&db, selectiveSyncList);
}
+4 -3
Ver Arquivo
@@ -31,6 +31,7 @@
#include "owncloudsetupwizard.h"
#include "creds/abstractcredentials.h"
#include "tooltipupdater.h"
#include "filesystem.h"
#include <math.h>
@@ -289,8 +290,7 @@ void AccountSettings::slotFolderWizardAccepted()
FolderDefinition definition;
definition.localPath = FolderDefinition::prepareLocalPath(
folderWizard->field(QLatin1String("sourceFolder")).toString());
definition.targetPath = FolderDefinition::prepareTargetPath(
folderWizard->property("targetPath").toString());
definition.targetPath = folderWizard->property("targetPath").toString();
{
QDir dir(definition.localPath);
@@ -301,8 +301,9 @@ void AccountSettings::slotFolderWizardAccepted()
tr("<p>Could not create local folder <i>%1</i>.")
.arg(QDir::toNativeSeparators(definition.localPath)));
return;
} else {
FileSystem::setFolderMinimumPermissions(definition.localPath);
}
}
}
+6 -71
Ver Arquivo
@@ -46,7 +46,6 @@
namespace OCC {
const char oldJournalPath[] = ".csync_journal.db";
Folder::Folder(const FolderDefinition& definition,
AccountState* accountState,
@@ -61,9 +60,8 @@ Folder::Folder(const FolderDefinition& definition,
, _lastSyncDuration(0)
, _consecutiveFailingSyncs(0)
, _consecutiveFollowUpSyncs(0)
, _journal(_definition.absoluteJournalPath())
, _journal(definition.localPath)
, _fileLog(new SyncRunFileLog)
, _saveBackwardsCompatible(false)
{
qRegisterMetaType<SyncFileItemVector>("SyncFileItemVector");
qRegisterMetaType<SyncFileItem::Direction>("SyncFileItem::Direction");
@@ -126,7 +124,6 @@ Folder::~Folder()
_engine.reset();
}
void Folder::checkLocalPath()
{
const QFileInfo fi(_definition.localPath);
@@ -206,7 +203,7 @@ void Folder::setIgnoreHiddenFiles(bool ignore)
_definition.ignoreHiddenFiles = ignore;
}
QString Folder::cleanPath() const
QString Folder::cleanPath()
{
QString cleanedPath = QDir::cleanPath(_canonicalLocalPath);
@@ -587,33 +584,8 @@ void Folder::slotThreadTreeWalkResult(const SyncFileItemVector& items)
void Folder::saveToSettings() const
{
// Remove first to make sure we don't get duplicates
removeFromSettings();
auto settings = _accountState->settings();
// The folder is saved to backwards-compatible "Folders"
// section only if it has the migrate flag set (i.e. was in
// there before) or if the folder is the only one for the
// given target path.
// This ensures that older clients will not read a configuration
// where two folders for different accounts point at the same
// local folders.
bool oneAccountOnly = true;
foreach (Folder* other, FolderMan::instance()->map()) {
if (other != this && other->cleanPath() == this->cleanPath()) {
oneAccountOnly = false;
break;
}
}
bool compatible = _saveBackwardsCompatible || oneAccountOnly;
if (compatible) {
settings->beginGroup(QLatin1String("Folders"));
} else {
settings->beginGroup(QLatin1String("Multifolders"));
}
settings->beginGroup(QLatin1String("Folders"));
FolderDefinition::save(*settings, _definition);
settings->sync();
@@ -622,12 +594,9 @@ void Folder::saveToSettings() const
void Folder::removeFromSettings() const
{
auto settings = _accountState->settings();
auto settings = _accountState->settings();
settings->beginGroup(QLatin1String("Folders"));
settings->remove(FolderMan::escapeAlias(_definition.alias));
settings->endGroup();
settings->beginGroup(QLatin1String("Multifolders"));
settings->remove(FolderMan::escapeAlias(_definition.alias));
}
bool Folder::isFileExcludedAbsolute(const QString& fullPath) const
@@ -659,12 +628,12 @@ void Folder::slotTerminateSync()
// local folder is synced to the same ownCloud.
void Folder::wipe()
{
QString stateDbFile = _engine->journal()->databaseFilePath();
QString stateDbFile = path()+QLatin1String(".csync_journal.db");
// Delete files that have been partially downloaded.
slotDiscardDownloadProgress();
//Unregister the socket API so it does not keep the ._sync_journal file open
//Unregister the socket API so it does not keep the .sync_journal file open
FolderMan::instance()->socketApi()->slotUnregisterPath(alias());
_journal.close(); // close the sync journal
@@ -981,11 +950,6 @@ void Folder::scheduleThisFolderSoon()
}
}
void Folder::setSaveBackwardsCompatible(bool save)
{
_saveBackwardsCompatible = save;
}
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool *cancel)
{
ConfigFile cfgFile;
@@ -1038,7 +1002,6 @@ void FolderDefinition::save(QSettings& settings, const FolderDefinition& folder)
{
settings.beginGroup(FolderMan::escapeAlias(folder.alias));
settings.setValue(QLatin1String("localPath"), folder.localPath);
settings.setValue(QLatin1String("journalPath"), folder.journalPath);
settings.setValue(QLatin1String("targetPath"), folder.targetPath);
settings.setValue(QLatin1String("paused"), folder.paused);
settings.setValue(QLatin1String("ignoreHiddenFiles"), folder.ignoreHiddenFiles);
@@ -1051,7 +1014,6 @@ bool FolderDefinition::load(QSettings& settings, const QString& alias,
settings.beginGroup(alias);
folder->alias = FolderMan::unescapeAlias(alias);
folder->localPath = settings.value(QLatin1String("localPath")).toString();
folder->journalPath = settings.value(QLatin1String("journalPath")).toString();
folder->targetPath = settings.value(QLatin1String("targetPath")).toString();
folder->paused = settings.value(QLatin1String("paused")).toBool();
folder->ignoreHiddenFiles = settings.value(QLatin1String("ignoreHiddenFiles"), QVariant(true)).toBool();
@@ -1061,9 +1023,6 @@ bool FolderDefinition::load(QSettings& settings, const QString& alias,
// code we assum /, so clean it up now.
folder->localPath = prepareLocalPath(folder->localPath);
// Target paths also have a convention
folder->targetPath = prepareTargetPath(folder->targetPath);
return true;
}
@@ -1076,29 +1035,5 @@ QString FolderDefinition::prepareLocalPath(const QString& path)
return p;
}
QString FolderDefinition::prepareTargetPath(const QString &path)
{
QString p = path;
if (p.endsWith(QLatin1Char('/'))) {
p.chop(1);
}
// Doing this second ensures the empty string or "/" come
// out as "/".
if (!p.startsWith(QLatin1Char('/'))) {
p.prepend(QLatin1Char('/'));
}
return p;
}
QString FolderDefinition::absoluteJournalPath() const
{
return QDir(localPath).filePath(journalPath);
}
QString FolderDefinition::defaultJournalPath(AccountPtr account)
{
return SyncJournalDb::makeDbName(account->url(), targetPath, account->credentials()->user());
}
} // namespace OCC
+1 -28
Ver Arquivo
@@ -53,8 +53,6 @@ public:
QString alias;
/// path on local machine
QString localPath;
/// path to the journal, usually relative to localPath
QString journalPath;
/// path on remote
QString targetPath;
/// whether the folder is paused
@@ -71,15 +69,6 @@ public:
/// Ensure / as separator and trailing /.
static QString prepareLocalPath(const QString& path);
/// Ensure starting / and no ending /.
static QString prepareTargetPath(const QString& path);
/// journalPath relative to localPath.
QString absoluteJournalPath() const;
/// Returns the relative journal path that's appropriate for this folder and account.
QString defaultJournalPath(AccountPtr account);
};
/**
@@ -122,7 +111,7 @@ public:
/**
* wrapper for QDir::cleanPath("Z:\\"), which returns "Z:\\", but we need "Z:" instead
*/
QString cleanPath() const;
QString cleanPath();
/**
* remote folder path
@@ -217,12 +206,6 @@ public:
*/
void scheduleThisFolderSoon();
/**
* Migration: When this flag is true, this folder will save to
* the backwards-compatible 'Folders' section in the config file.
*/
void setSaveBackwardsCompatible(bool save);
signals:
void syncStateChange();
void syncStarted();
@@ -351,16 +334,6 @@ private:
QScopedPointer<SyncRunFileLog> _fileLog;
QTimer _scheduleSelfTimer;
/**
* When the same local path is synced to multiple accounts, only one
* of them can be stored in the settings in a way that's compatible
* with old clients that don't support it. This flag marks folders
* that shall be written in a backwards-compatible way, by being set
* on the *first* Folder instance that was configured for each local
* path.
*/
bool _saveBackwardsCompatible;
};
}
+44 -109
Ver Arquivo
@@ -209,16 +209,18 @@ int FolderMan::setupFolders()
continue;
}
settings->beginGroup(id);
settings->beginGroup(QLatin1String("Folders"));
setupFoldersHelper(*settings, account, true);
settings->endGroup();
// See Folder::saveToSettings for details about why this exists.
settings->beginGroup(QLatin1String("Multifolders"));
setupFoldersHelper(*settings, account, false);
settings->endGroup();
foreach (const auto& folderAlias, settings->childGroups()) {
FolderDefinition folderDefinition;
if (FolderDefinition::load(*settings, folderAlias, &folderDefinition)) {
Folder* f = addFolderInternal(std::move(folderDefinition), account.data());
if (f) {
scheduleFolder(f);
emit folderSyncStateChange(f);
}
}
}
settings->endGroup(); // Folders
settings->endGroup(); // <account>
}
@@ -227,34 +229,6 @@ int FolderMan::setupFolders()
return _folderMap.size();
}
void FolderMan::setupFoldersHelper(QSettings &settings, AccountStatePtr account, bool backwardsCompatible)
{
foreach (const auto& folderAlias, settings.childGroups()) {
FolderDefinition folderDefinition;
if (FolderDefinition::load(settings, folderAlias, &folderDefinition)) {
// Migration: Old settings don't have journalPath
if (folderDefinition.journalPath.isEmpty()) {
folderDefinition.journalPath = folderDefinition.defaultJournalPath(account->account());
}
folderDefinition.defaultJournalPath(account->account());
// Migration: If an old db is found, move it to the new name.
if (backwardsCompatible) {
SyncJournalDb::maybeMigrateDb(folderDefinition.localPath, folderDefinition.absoluteJournalPath());
}
Folder* f = addFolderInternal(std::move(folderDefinition), account.data());
if (f) {
// Migration: Mark folders that shall be saved in a backwards-compatible way
if (backwardsCompatible) {
f->setSaveBackwardsCompatible(true);
}
scheduleFolder(f);
emit folderSyncStateChange(f);
}
}
}
}
int FolderMan::setupFoldersMigration()
{
ConfigFile cfg;
@@ -285,16 +259,18 @@ int FolderMan::setupFoldersMigration()
return _folderMap.size();
}
bool FolderMan::ensureJournalGone( const QString& journalDbFile )
bool FolderMan::ensureJournalGone(const QString &localPath)
{
// remove the old journal file
while (QFile::exists(journalDbFile) && !QFile::remove(journalDbFile)) {
qDebug() << "Could not remove old db file at" << journalDbFile;
// FIXME move this to UI, not libowncloudsync
// remove old .csync_journal file
QString stateDbFile = localPath+QLatin1String("/.csync_journal.db");
while (QFile::exists(stateDbFile) && !QFile::remove(stateDbFile)) {
qDebug() << "Could not remove old db file at" << stateDbFile;
int ret = QMessageBox::warning(0, tr("Could not reset folder state"),
tr("An old sync journal '%1' was found, "
"but could not be removed. Please make sure "
"that no application is currently using it.")
.arg(QDir::fromNativeSeparators(QDir::cleanPath(journalDbFile))),
.arg(QDir::fromNativeSeparators(QDir::cleanPath(stateDbFile))),
QMessageBox::Retry|QMessageBox::Abort);
if (ret == QMessageBox::Abort) {
return false;
@@ -857,27 +833,11 @@ void FolderMan::slotFolderSyncFinished( const SyncResult& )
Folder* FolderMan::addFolder(AccountState* accountState, const FolderDefinition& folderDefinition)
{
// Choose a db filename
auto definition = folderDefinition;
definition.journalPath = definition.defaultJournalPath(accountState->account());
if (!ensureJournalGone(definition.absoluteJournalPath())) {
if (!ensureJournalGone(folderDefinition.localPath)) {
return 0;
}
auto folder = addFolderInternal(definition, accountState);
// Migration: The first account that's configured for a local folder shall
// be saved in a backwards-compatible way.
bool oneAccountOnly = true;
foreach (Folder* other, FolderMan::instance()->map()) {
if (other != folder && other->cleanPath() == folder->cleanPath()) {
oneAccountOnly = false;
break;
}
}
folder->setSaveBackwardsCompatible(oneAccountOnly);
auto folder = addFolderInternal(folderDefinition, accountState);
if(folder) {
folder->saveToSettings();
emit folderSyncStateChange(folder);
@@ -886,8 +846,7 @@ Folder* FolderMan::addFolder(AccountState* accountState, const FolderDefinition&
return folder;
}
Folder* FolderMan::addFolderInternal(FolderDefinition folderDefinition,
AccountState* accountState)
Folder* FolderMan::addFolderInternal(FolderDefinition folderDefinition, AccountState* accountState)
{
auto alias = folderDefinition.alias;
int count = 0;
@@ -1250,16 +1209,17 @@ QString FolderMan::statusToString( SyncResult syncStatus, bool paused ) const
return folderMessage;
}
QString FolderMan::checkPathValidityForNewFolder(const QString& path, const QUrl &serverUrl, bool forNewDirectory)
QString FolderMan::checkPathValidityForNewFolder(const QString& path, bool forNewDirectory)
{
if (path.isEmpty()) {
return tr("No valid folder selected!");
}
QFileInfo selFile( path );
QString userInput = selFile.canonicalFilePath();
if (!selFile.exists()) {
return checkPathValidityForNewFolder(selFile.dir().path(), serverUrl, true);
return checkPathValidityForNewFolder(selFile.dir().path(), true);
}
if( !selFile.isDir() ) {
@@ -1271,10 +1231,6 @@ QString FolderMan::checkPathValidityForNewFolder(const QString& path, const QUrl
}
// check if the local directory isn't used yet in another ownCloud sync
Qt::CaseSensitivity cs = Qt::CaseSensitive;
if( Utility::fsCasePreserving() ) {
cs = Qt::CaseInsensitive;
}
for (auto i = _folderMap.constBegin(); i != _folderMap.constEnd(); ++i ) {
Folder *f = static_cast<Folder*>(i.value());
@@ -1282,60 +1238,39 @@ QString FolderMan::checkPathValidityForNewFolder(const QString& path, const QUrl
if( folderDir.isEmpty() ) {
continue;
}
if( ! folderDir.endsWith(QLatin1Char('/'), cs) ) folderDir.append(QLatin1Char('/'));
if( ! folderDir.endsWith(QLatin1Char('/')) ) folderDir.append(QLatin1Char('/'));
const QString folderDirClean = QDir::cleanPath(folderDir)+'/';
const QString userDirClean = QDir::cleanPath(path)+'/';
// folderDir follows sym links, path not.
bool differentPathes = !Utility::fileNamesEqual(QDir::cleanPath(folderDir), QDir::cleanPath(path));
if (!forNewDirectory && differentPathes && folderDirClean.startsWith(userDirClean,cs)) {
if (QDir::cleanPath(f->path()) == QDir::cleanPath(userInput)
&& QDir::cleanPath(QDir(f->path()).canonicalPath()) == QDir(userInput).canonicalPath()) {
return tr("The local folder %1 is already used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(userInput));
}
if (!forNewDirectory && QDir::cleanPath(folderDir).startsWith(QDir::cleanPath(userInput)+'/')) {
return tr("The local folder %1 already contains a folder used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(path));
.arg(QDir::toNativeSeparators(userInput));
}
// QDir::cleanPath keeps links
// canonicalPath() remove symlinks and uses the symlink targets.
QString absCleanUserFolder = QDir::cleanPath(QDir(path).canonicalPath())+'/';
QString absCleanUserFolder = QDir::cleanPath(QDir(userInput).canonicalPath())+'/';
if (!forNewDirectory && QDir::cleanPath(folderDir).startsWith(absCleanUserFolder) ) {
return tr("The local folder %1 is a symbolic link. "
"The link target already contains a folder used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(userInput));
}
if ( (forNewDirectory || differentPathes) && userDirClean.startsWith( folderDirClean, cs )) {
if (QDir::cleanPath(QString(userInput)).startsWith( QDir::cleanPath(folderDir)+'/')) {
return tr("The local folder %1 is already contained in a folder used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(path));
.arg(QDir::toNativeSeparators(userInput));
}
// both follow symlinks.
bool cleanUserEqualsCleanFolder = Utility::fileNamesEqual(absCleanUserFolder, folderDirClean );
if (differentPathes && absCleanUserFolder.startsWith( folderDirClean, cs ) &&
! cleanUserEqualsCleanFolder ) {
if (absCleanUserFolder.startsWith( QDir::cleanPath(folderDir)+'/')) {
return tr("The local folder %1 is a symbolic link. "
"The link target is already contained in a folder used in a folder sync connection. "
"Please pick another one!")
.arg(QDir::toNativeSeparators(path));
}
if (differentPathes && folderDirClean.startsWith(absCleanUserFolder, cs) &&
!cleanUserEqualsCleanFolder && !forNewDirectory ) {
return tr("The local folder %1 contains a symbolic link. "
"The link target contains an already synced folder "
"Please pick another one!")
.arg(QDir::toNativeSeparators(path));
}
// if both pathes are equal, the server url needs to be different
// otherwise it would mean that a new connection from the same local folder
// to the same account is added which is not wanted. The account must differ.
if( serverUrl.isValid() && Utility::fileNamesEqual(absCleanUserFolder,folderDir ) ) {
QUrl folderUrl = f->accountState()->account()->url();
QString user = f->accountState()->account()->credentials()->user();
folderUrl.setUserName(user);
if( serverUrl == folderUrl ) {
return tr("There is already a sync from the server to this local folder. "
"Please pick another local folder!");
}
.arg(QDir::toNativeSeparators(userInput));
}
}
+4 -7
Ver Arquivo
@@ -97,11 +97,11 @@ public:
Folder* setupFolderFromOldConfigFile(const QString &, AccountState *account );
/**
* Ensures that a given directory does not contain a sync journal file.
* Ensures that a given directory does not contain a .csync_journal.
*
* @returns false if the journal could not be removed, true otherwise.
*/
static bool ensureJournalGone(const QString& journalDbFile);
static bool ensureJournalGone(const QString &path);
/** Creates a new and empty local directory. */
bool startFromScratch( const QString& );
@@ -128,7 +128,7 @@ public:
*
* @returns an empty string if it is allowed, or an error if it is not allowed
*/
QString checkPathValidityForNewFolder(const QString &path, const QUrl& serverUrl = QUrl(), bool forNewDirectory = false);
QString checkPathValidityForNewFolder(const QString &path, bool forNewDirectory = false);
/**
* While ignoring hidden files can theoretically be switched per folder,
@@ -257,8 +257,7 @@ private:
/** Adds a new folder, does not add it to the account settings and
* does not set an account on the new folder.
*/
Folder* addFolderInternal(FolderDefinition folderDefinition,
AccountState* accountState);
Folder* addFolderInternal(FolderDefinition folderDefinition, AccountState* accountState);
/* unloads a folder object, does not delete it */
void unloadFolder( Folder * );
@@ -274,8 +273,6 @@ private:
// restarts the application (Linux only)
void restartApplication();
void setupFoldersHelper(QSettings& settings, AccountStatePtr account, bool backwardsCompatible);
QSet<Folder*> _disabledFolders;
Folder::Map _folderMap;
QString _folderConfigPath;
+1 -2
Ver Arquivo
@@ -169,8 +169,7 @@ void FolderWatcherPrivate::slotReceivedNotification(int fd)
if (event->len > 0 && event->wd > -1) {
QByteArray fileName(event->name);
// qDebug() << Q_FUNC_INFO << event->name;
if (fileName.startsWith("._sync_") ||
fileName.startsWith(".csync_journal.db") ||
if (fileName.startsWith(".csync_journal.db") ||
fileName.startsWith(".owncloudsync.log")) {
// qDebug() << "ignore journal";
} else {
+6 -12
Ver Arquivo
@@ -56,9 +56,8 @@ QString FormatWarningsWizardPage::formatWarnings(const QStringList &warnings) co
return ret;
}
FolderWizardLocalPath::FolderWizardLocalPath(const AccountPtr& account)
: FormatWarningsWizardPage(),
_account(account)
FolderWizardLocalPath::FolderWizardLocalPath()
: FormatWarningsWizardPage()
{
_ui.setupUi(this);
registerField(QLatin1String("sourceFolder*"), _ui.localFolderLineEdit);
@@ -90,13 +89,8 @@ void FolderWizardLocalPath::cleanupPage()
bool FolderWizardLocalPath::isComplete() const
{
QUrl serverUrl = _account->url();
serverUrl.setUserName( _account->credentials()->user() );
QString errorStr = FolderMan::instance()->checkPathValidityForNewFolder(
QDir::fromNativeSeparators(_ui.localFolderLineEdit->text()), serverUrl);
QDir::fromNativeSeparators(_ui.localFolderLineEdit->text()));
bool isOk = errorStr.isEmpty();
QStringList warnStrings;
@@ -139,7 +133,7 @@ void FolderWizardLocalPath::slotChooseLocalFolder()
}
// =================================================================================
FolderWizardRemotePath::FolderWizardRemotePath(const AccountPtr& account)
FolderWizardRemotePath::FolderWizardRemotePath(AccountPtr account)
: FormatWarningsWizardPage()
,_warnWasVisible(false)
,_account(account)
@@ -479,7 +473,7 @@ void FolderWizardRemotePath::showWarn( const QString& msg ) const
// ====================================================================================
FolderWizardSelectiveSync::FolderWizardSelectiveSync(const AccountPtr& account)
FolderWizardSelectiveSync::FolderWizardSelectiveSync(AccountPtr account)
{
QVBoxLayout *layout = new QVBoxLayout(this);
_treeView = new SelectiveSyncTreeView(account, this);
@@ -533,7 +527,7 @@ void FolderWizardSelectiveSync::cleanupPage()
FolderWizard::FolderWizard(AccountPtr account, QWidget *parent)
: QWizard(parent),
_folderWizardSourcePage(new FolderWizardLocalPath(account)),
_folderWizardSourcePage(new FolderWizardLocalPath),
_folderWizardTargetPage(0),
_folderWizardSelectiveSyncPage(new FolderWizardSelectiveSync(account))
{
+3 -4
Ver Arquivo
@@ -49,7 +49,7 @@ class FolderWizardLocalPath : public FormatWarningsWizardPage
{
Q_OBJECT
public:
explicit FolderWizardLocalPath(const AccountPtr& account);
FolderWizardLocalPath();
~FolderWizardLocalPath();
virtual bool isComplete() const Q_DECL_OVERRIDE;
@@ -63,7 +63,6 @@ protected slots:
private:
Ui_FolderWizardSourcePage _ui;
Folder::Map _folderMap;
AccountPtr _account;
};
@@ -76,7 +75,7 @@ class FolderWizardRemotePath : public FormatWarningsWizardPage
{
Q_OBJECT
public:
explicit FolderWizardRemotePath(const AccountPtr& account);
explicit FolderWizardRemotePath(AccountPtr account);
~FolderWizardRemotePath();
virtual bool isComplete() const Q_DECL_OVERRIDE;
@@ -118,7 +117,7 @@ class FolderWizardSelectiveSync : public QWizardPage
{
Q_OBJECT
public:
explicit FolderWizardSelectiveSync(const AccountPtr& account);
explicit FolderWizardSelectiveSync(AccountPtr account);
~FolderWizardSelectiveSync();
virtual bool validatePage() Q_DECL_OVERRIDE;
+31 -6
Ver Arquivo
@@ -31,6 +31,7 @@
#include "sslerrordialog.h"
#include "accountmanager.h"
#include "clientproxy.h"
#include "filesystem.h"
#include "creds/credentialsfactory.h"
#include "creds/abstractcredentials.h"
@@ -202,10 +203,34 @@ void OwncloudSetupWizard::slotOwnCloudFoundAuth(const QUrl& url, const QVariantM
void OwncloudSetupWizard::slotNoOwnCloudFoundAuth(QNetworkReply *reply)
{
_ocWizard->displayError(tr("Failed to connect to %1 at %2:<br/>%3")
.arg(Theme::instance()->appNameGUI(),
reply->url().toString(),
reply->errorString()), checkDowngradeAdvised(reply));
int resultCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
// Do this early because reply might be deleted in message box event loop
QString msg = tr("Failed to connect to %1 at %2:<br/>%3")
.arg(Theme::instance()->appNameGUI(),
reply->url().toString(),
reply->errorString());
bool isDowngradeAdvised = checkDowngradeAdvised(reply);
// If a client cert is needed, nginx sends:
// 400 "<html>\r\n<head><title>400 No required SSL certificate was sent</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>400 Bad Request</h1></center>\r\n<center>No required SSL certificate was sent</center>\r\n<hr><center>nginx/1.10.0</center>\r\n</body>\r\n</html>\r\n"
// If the IP needs to be added as "trusted domain" in oC, oC sends:
// https://gist.github.com/guruz/ab6d11df1873c2ad3932180de92e7d82
if (resultCode != 200 && contentType.startsWith("text/")) {
// FIXME: Synchronous dialogs are not so nice because of event loop recursion
// (we already create a dialog further below)
QString serverError = reply->peek(1024*20);
qDebug() << serverError;
QMessageBox messageBox(_ocWizard);
messageBox.setText(serverError);
messageBox.addButton(QMessageBox::Ok);
messageBox.setTextFormat(Qt::RichText);
messageBox.exec();
}
// Displays message inside wizard and possibly also another message box
_ocWizard->displayError(msg, isDowngradeAdvised);
// Allow the credentials dialog to pop up again for the same URL.
// Maybe the user just clicked 'Cancel' by accident or changed his mind.
@@ -340,8 +365,8 @@ void OwncloudSetupWizard::slotCreateLocalAndRemoteFolders(const QString& localFo
} else {
QString res = tr("Creating local sync folder %1...").arg(localFolder);
if( fi.mkpath( localFolder ) ) {
FileSystem::setFolderMinimumPermissions(localFolder);
Utility::setupFavLink( localFolder );
// FIXME: Create a local sync folder.
res += tr("ok");
} else {
res += tr("failed.");
@@ -496,7 +521,7 @@ void OwncloudSetupWizard::slotAssistantFinished( int result )
qDebug() << "Adding folder definition for" << localFolder << _remoteFolder;
FolderDefinition folderDefinition;
folderDefinition.localPath = localFolder;
folderDefinition.targetPath = FolderDefinition::prepareTargetPath(_remoteFolder);
folderDefinition.targetPath = _remoteFolder;
folderDefinition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
auto f = folderMan->addFolder(account, folderDefinition);
+1 -6
Ver Arquivo
@@ -125,13 +125,8 @@ void OwncloudAdvancedSetupPage::initializePage()
void OwncloudAdvancedSetupPage::updateStatus()
{
const QString locFolder = localFolder();
const QString url = static_cast<OwncloudWizard *>(wizard())->ocUrl();
const QString user = static_cast<OwncloudWizard *>(wizard())->getCredentials()->user();
QUrl serverUrl(url);
serverUrl.setUserName(user);
// check if the local folder exists. If so, and if its not empty, show a warning.
QString errorStr = FolderMan::instance()->checkPathValidityForNewFolder(locFolder, serverUrl);
QString errorStr = FolderMan::instance()->checkPathValidityForNewFolder(locFolder);
_localFolderValid = errorStr.isEmpty();
QString t;
+1
Ver Arquivo
@@ -256,6 +256,7 @@ void OwncloudSetupPage::setErrorString( const QString& err, bool retryHTTPonly )
OwncloudConnectionMethodDialog dialog;
dialog.setUrl(url);
// FIXME: Synchronous dialogs are not so nice because of event loop recursion
int retVal = dialog.exec();
switch (retVal) {
+1
Ver Arquivo
@@ -52,6 +52,7 @@ set(libsync_SRCS
propagateupload.cpp
propagateuploadv1.cpp
propagateuploadng.cpp
propagatebundle.cpp
propagateremotedelete.cpp
propagateremotemove.cpp
propagateremotemkdir.cpp
+5
Ver Arquivo
@@ -128,6 +128,11 @@ QNetworkReply *AbstractNetworkJob::davRequest(const QByteArray &verb, const QUrl
return addTimer(_account->davRequest(verb, url, req, data));
}
QNetworkReply *AbstractNetworkJob::multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart)
{
return addTimer(_account->multipartRequest(relPath, req, multiPart));
}
QNetworkReply* AbstractNetworkJob::getRequest(const QString &relPath)
{
return addTimer(_account->getRequest(relPath));
+2
Ver Arquivo
@@ -26,6 +26,7 @@
#include "accountfwd.h"
class QUrl;
class QHttpMultiPart;
namespace OCC {
@@ -78,6 +79,7 @@ protected:
QNetworkReply* headRequest(const QString &relPath);
QNetworkReply* headRequest(const QUrl &url);
QNetworkReply* deleteRequest(const QUrl &url);
QNetworkReply* multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart);
int maxRedirects() const { return 10; }
virtual bool finished() = 0;
+31 -6
Ver Arquivo
@@ -76,19 +76,27 @@ AccountPtr Account::sharedFromThis()
return _sharedThis.toStrongRef();
}
QString Account::user() const
QString Account::davUser() const
{
return _user.isEmpty() ? _credentials->user() : _user;
return _davUser.isEmpty() ? _credentials->user() : _davUser;
}
void Account::setUser(const QString &user)
void Account::setDavUser(const QString &newDavUser)
{
_user = user;
_davUser = newDavUser;
}
QString Account::davFilesPath() const
{
//TODO DO NOT HARCODE PATH, GET IT FROM THE SERVER!!!!
QString dfp("/remote.php/dav/files/");
dfp.append(_credentials->user());
return dfp;
}
QString Account::displayName() const
{
QString dn = QString("%1@%2").arg(user(), _url.host());
QString dn = QString("%1@%2").arg(davUser(), _url.host());
int port = url().port();
if (port > 0 && port != 80 && port != 443) {
dn.append(QLatin1Char(':'));
@@ -237,6 +245,20 @@ QNetworkReply *Account::davRequest(const QByteArray &verb, const QUrl &url, QNet
return _am->sendCustomRequest(req, verb, data);
}
QNetworkReply *Account::multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart)
{
return multipartRequest(Utility::concatUrlPath(url(), relPath), req, multiPart);
}
QNetworkReply *Account::multipartRequest(const QUrl &url, QNetworkRequest req, QHttpMultiPart *multiPart)
{
req.setUrl(url);
#if QT_VERSION > QT_VERSION_CHECK(4, 8, 4)
req.setSslConfiguration(this->getOrCreateSslConfig());
#endif
return _am->post(req, multiPart);
}
void Account::setCertificate(const QByteArray certficate, const QString privateKey)
{
_pemCertificate=certficate;
@@ -475,6 +497,9 @@ void Account::setNonShib(bool nonShib)
}
}
bool Account::bundledRequestsEnabled() const
{
return _capabilities.bundledRequest();
}
} // namespace OCC
+31 -13
Ver Arquivo
@@ -34,6 +34,7 @@ class QSettings;
class QNetworkReply;
class QUrl;
class QNetworkAccessManager;
class QHttpMultiPart;
namespace OCC {
@@ -64,14 +65,38 @@ public:
class OWNCLOUDSYNC_EXPORT Account : public QObject {
Q_OBJECT
public:
/**
* @brief The possibly themed dav path for the account. It has
* a trailing slash.
* @returns the (themeable) dav path for the account.
*/
QString davPath() const;
/**
* @brief The possibly themed files dav path for the account. It has
* a trailing slash.
* @returns the (themeable) files dav path for the account.
*/
QString davFilesPath() const;
void setDavPath(const QString&s) { _davPath = s; }
void setNonShib(bool nonShib);
/// Functions for bundle support
bool bundledRequestsEnabled() const;
static AccountPtr create();
~Account();
AccountPtr sharedFromThis();
/// The user that can be used in dav url
QString user() const;
void setUser(const QString &user);
/**
* The user that can be used in dav url.
*
* This can very well be different frome the login user that's
* stored in credentials()->user().
*/
QString davUser() const;
void setDavUser(const QString &newDavUser);
/// The name of the account as shown in the toolbar
QString displayName() const;
@@ -83,15 +108,6 @@ public:
void setUrl(const QUrl &url);
QUrl url() const { return _url; }
/**
* @brief The possibly themed dav path for the account. It has
* a trailing slash.
* @returns the (themeable) dav path for the account.
*/
QString davPath() const;
void setDavPath(const QString&s) { _davPath = s; }
void setNonShib(bool nonShib);
/** Returns webdav entry URL, based on url() */
QUrl davUrl() const;
@@ -108,6 +124,8 @@ public:
QNetworkReply* deleteRequest( const QUrl &url);
QNetworkReply* davRequest(const QByteArray &verb, const QString &relPath, QNetworkRequest req, QIODevice *data = 0);
QNetworkReply* davRequest(const QByteArray &verb, const QUrl &url, QNetworkRequest req, QIODevice *data = 0);
QNetworkReply* multipartRequest(const QString &relPath, QNetworkRequest req, QHttpMultiPart *multiPart);
QNetworkReply* multipartRequest(const QUrl &url, QNetworkRequest req, QHttpMultiPart *multiPart);
/** The ssl configuration during the first connection */
@@ -203,7 +221,7 @@ private:
QWeakPointer<Account> _sharedThis;
QString _id;
QString _user;
QString _davUser;
QMap<QString, QVariant> _settingsMap;
QUrl _url;
QList<QSslCertificate> _approvedCerts;
+9
Ver Arquivo
@@ -47,6 +47,15 @@ bool Capabilities::sharePublicLink() const
}
}
bool Capabilities::bundledRequest() const
{
static const auto bundling = qgetenv("OWNCLOUD_BUNDLING");
if (bundling == "0") return false;
if (bundling == "1") return true;
return _capabilities["dav"].toMap()["bundlerequest"].toByteArray() >= "1.0";
}
bool Capabilities::sharePublicLinkAllowUpload() const
{
return _capabilities["files_sharing"].toMap()["public"].toMap()["upload"].toBool();
+1
Ver Arquivo
@@ -41,6 +41,7 @@ public:
int sharePublicLinkExpireDateDays() const;
bool shareResharing() const;
bool chunkingNg() const;
bool bundledRequest() const;
/// returns true if the capabilities report notifications
bool notificationsAvailable() const;
+1 -1
Ver Arquivo
@@ -246,7 +246,7 @@ void ConnectionValidator::slotUserFetched(const QVariantMap &json)
{
QString user = json.value("ocs").toMap().value("data").toMap().value("id").toString();
if (!user.isEmpty()) {
_account->setUser(user);
_account->setDavUser(user);
}
reportResult(Connected);
}
+11
Ver Arquivo
@@ -146,6 +146,17 @@ void FileSystem::setFileReadOnly(const QString& filename, bool readonly)
file.setPermissions(permissions);
}
void FileSystem::setFolderMinimumPermissions(const QString& filename)
{
#ifdef Q_OS_MAC
QFile::Permissions perm = QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner;
QFile file(filename);
file.setPermissions(perm);
#else
Q_UNUSED(filename);
#endif
}
void FileSystem::setFileReadOnlyWeak(const QString& filename, bool readonly)
{
+6
Ver Arquivo
@@ -67,6 +67,12 @@ void OWNCLOUDSYNC_EXPORT setFileReadOnly(const QString& filename, bool readonly)
*/
void OWNCLOUDSYNC_EXPORT setFileReadOnlyWeak(const QString& filename, bool readonly);
/**
* @brief Try to set permissions so that other users on the local machine can not
* go into the folder.
*/
void OWNCLOUDSYNC_EXPORT setFolderMinimumPermissions(const QString& filename);
/** convert a "normal" windows path into a path that can be 32k chars long. */
QString OWNCLOUDSYNC_EXPORT longWinPath( const QString& inpath );
+1 -1
Ver Arquivo
@@ -463,7 +463,7 @@ bool CheckServerJob::finished()
}
bool success = false;
QByteArray body = reply()->readAll();
QByteArray body = reply()->peek(4*1024);
int httpStatus = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if( body.isEmpty() || httpStatus != 200) {
qDebug() << "error: status.php replied " << httpStatus << body;
+58 -16
Ver Arquivo
@@ -18,6 +18,7 @@
#include "syncjournalfilerecord.h"
#include "propagatedownload.h"
#include "propagateupload.h"
#include "propagatebundle.h"
#include "propagateremotedelete.h"
#include "propagateremotemove.h"
#include "propagateremotemkdir.h"
@@ -71,6 +72,14 @@ qint64 freeSpaceLimit()
OwncloudPropagator::~OwncloudPropagator()
{}
bool OwncloudPropagator::hasNetworkLimit()
{
if (_downloadLimit.fetchAndAddAcquire(0) != 0 || _uploadLimit.fetchAndAddAcquire(0) != 0) {
return true;
}
return false;
}
/* The maximum number of active jobs in parallel */
int OwncloudPropagator::maximumActiveJob()
{
@@ -79,7 +88,7 @@ int OwncloudPropagator::maximumActiveJob()
max = 3; //default
}
if (_downloadLimit.fetchAndAddAcquire(0) != 0 || _uploadLimit.fetchAndAddAcquire(0) != 0) {
if (hasNetworkLimit()) {
// disable parallelism when there is a network limit.
return 1;
}
@@ -115,18 +124,17 @@ static bool blacklistCheck(SyncJournalDb* journal, const SyncFileItem& item)
return newEntry.isValid();
}
void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString)
void PropagateItemJob::itemDone(SyncFileItemPtr item, SyncFileItem::Status status, const QString &errorString)
{
_state = Finished;
if (_item->_isRestoration) {
if (item->_isRestoration) {
if( status == SyncFileItem::Success || status == SyncFileItem::Conflict) {
status = SyncFileItem::Restoration;
} else {
_item->_errorString += tr("; Restoration Failed: %1").arg(errorString);
item->_errorString += tr("; Restoration Failed: %1").arg(errorString);
}
} else {
if( _item->_errorString.isEmpty() ) {
_item->_errorString = errorString;
if( item->_errorString.isEmpty() ) {
item->_errorString = errorString;
}
}
@@ -142,20 +150,20 @@ void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorStr
// do not blacklist in case of soft error or fatal error.
break;
case SyncFileItem::NormalError:
if (blacklistCheck(_propagator->_journal, *_item) && _item->_hasBlacklistEntry) {
if (blacklistCheck(_propagator->_journal, *item) && item->_hasBlacklistEntry) {
// do not error if the item was, and continues to be, blacklisted
status = SyncFileItem::FileIgnored;
_item->_errorString.prepend(tr("Continue blacklisting:") + " ");
item->_errorString.prepend(tr("Continue blacklisting:") + " ");
}
break;
case SyncFileItem::Success:
case SyncFileItem::Restoration:
if( _item->_hasBlacklistEntry ) {
if( item->_hasBlacklistEntry ) {
// wipe blacklist entry.
_propagator->_journal->wipeErrorBlacklistEntry(_item->_file);
_propagator->_journal->wipeErrorBlacklistEntry(item->_file);
// remove a blacklist entry in case the file was moved.
if( _item->_originalFile != _item->_file ) {
_propagator->_journal->wipeErrorBlacklistEntry(_item->_originalFile);
if( item->_originalFile != item->_file ) {
_propagator->_journal->wipeErrorBlacklistEntry(item->_originalFile);
}
}
break;
@@ -166,9 +174,15 @@ void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorStr
break;
}
_item->_status = status;
item->_status = status;
emit itemCompleted(*_item, *this);
emit itemCompleted(*item, *this);
}
void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString)
{
_state = Finished;
itemDone(_item, status, errorString);
emit finished(status);
}
@@ -310,11 +324,17 @@ void OwncloudPropagator::start(const SyncFileItemVector& items)
directories.push(qMakePair(QString(), _rootJob.data()));
QVector<PropagatorJob*> directoriesToRemove;
QString removedDirectory;
quint64 chunkSize = OwncloudPropagator::chunkSize();
// TODO: here we should also check somehow if bundle is not blacklisted
bool enableBundledRequests = _account->bundledRequestsEnabled() && !this->hasNetworkLimit();
foreach(const SyncFileItemPtr &item, items) {
if (!removedDirectory.isEmpty() && item->_file.startsWith(removedDirectory)) {
// this is an item in a directory which is going to be removed.
PropagateDirectory *delDirJob = dynamic_cast<PropagateDirectory*>(directoriesToRemove.first());
PropagateDirectory *delDirJob = qobject_cast<PropagateDirectory*>(directoriesToRemove.first());
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
// already taken care of. (by the removal of the parent directory)
@@ -386,6 +406,17 @@ void OwncloudPropagator::start(const SyncFileItemVector& items)
currentDirJob->append(dir);
}
directories.push(qMakePair(item->destination() + "/" , dir));
} else if (enableBundledRequests
&& (item->_instruction == CSYNC_INSTRUCTION_NEW)
&& (item->_direction == SyncFileItem::Up)
&& (item->_size < chunkSize)) {
//this will create list of bundle files to sync for that bundlejob
if (directories.top().second->_bundleJob.isNull()) {
PropagateBundle* bundleJob = new PropagateBundle(this);
directories.top().second->_bundleJob.reset(bundleJob);
}
PropagateBundle* bundleJob = qobject_cast<PropagateBundle*>(directories.top().second->_bundleJob.data());
bundleJob->append(item);
} else if (PropagateItemJob* current = createJob(item)) {
if (item->_instruction == CSYNC_INSTRUCTION_TYPE_CHANGE) {
// will delete directories, so defer execution
@@ -601,6 +632,16 @@ bool PropagateDirectory::scheduleNextJob()
if (_state == NotYetStarted) {
_state = Running;
if(_bundleJob){
PropagateBundle* bundle = qobject_cast<PropagateBundle*>(_bundleJob.take());
bundle->_item->_direction = SyncFileItem::Direction::Up;
bundle->_item->_type = SyncFileItem::Type::RequestsContainer;
bundle->_item->_instruction = CSYNC_INSTRUCTION_NEW;
bundle->_item->_size = bundle->syncItemsSize();
bundle->_item->_originalFile = tr("%1 file(s)").arg(bundle->syncItemsNumber());
_subJobs.append(bundle);
}
if (!_firstJob && _subJobs.isEmpty()) {
finalize();
return true;
@@ -639,6 +680,7 @@ bool PropagateDirectory::scheduleNextJob()
Q_ASSERT(_subJobs.at(i)->_state == Running);
auto paral = _subJobs.at(i)->parallelism();
if (paral == WaitForFinished) {
return false;
}
+11 -2
Ver Arquivo
@@ -136,6 +136,7 @@ class PropagateItemJob : public PropagatorJob {
Q_OBJECT
protected:
void done(SyncFileItem::Status status, const QString &errorString = QString());
void itemDone(SyncFileItemPtr item, SyncFileItem::Status status, const QString &errorString = QString());
bool checkForProblemsWithShared(int httpStatusCode, const QString& msg);
@@ -187,6 +188,9 @@ public:
// e.g: create the directory
QScopedPointer<PropagateItemJob>_firstJob;
// bundling upload files job
QScopedPointer<PropagateItemJob> _bundleJob;
// all the sub files or sub directories.
QVector<PropagatorJob *> _subJobs;
@@ -199,7 +203,7 @@ public:
explicit PropagateDirectory(OwncloudPropagator *propagator, const SyncFileItemPtr &item = SyncFileItemPtr(new SyncFileItem))
: PropagatorJob(propagator)
, _firstJob(0), _item(item), _jobsFinished(0), _runningNow(0), _hasError(SyncFileItem::NoStatus), _firstUnfinishedSubJob(0)
, _firstJob(0),_bundleJob(0), _item(item), _jobsFinished(0), _runningNow(0), _hasError(SyncFileItem::NoStatus), _firstUnfinishedSubJob(0)
{ }
virtual ~PropagateDirectory() {
@@ -288,7 +292,7 @@ public:
~OwncloudPropagator();
void start(const SyncFileItemVector &_syncedItems);
bool hasNetworkLimit();
QAtomicInt _downloadLimit;
QAtomicInt _uploadLimit;
BandwidthManager _bandwidthManager;
@@ -322,6 +326,10 @@ public:
emitFinished(SyncFileItem::NormalError);
}
int runningNowAtRootJob() const {
return _rootJob->_runningNow;
}
// timeout in seconds
static int httpTimeout();
@@ -382,6 +390,7 @@ private:
friend class PropagateRemoteMove;
friend class PropagateUploadFileV1;
friend class PropagateUploadFileNG;
friend class PropagateBundle;
#endif
};
+7 -5
Ver Arquivo
@@ -29,11 +29,13 @@ QString Progress::asResultString( const SyncFileItem& item)
case CSYNC_INSTRUCTION_SYNC:
case CSYNC_INSTRUCTION_NEW:
case CSYNC_INSTRUCTION_TYPE_CHANGE:
if (item._direction != SyncFileItem::Up) {
return QCoreApplication::translate( "progress", "Downloaded");
} else {
return QCoreApplication::translate( "progress", "Uploaded");
}
if (item._type != SyncFileItem::Type::RequestsContainer) {
if (item._direction != SyncFileItem::Up) {
return QCoreApplication::translate( "progress", "Downloaded");
} else
return QCoreApplication::translate( "progress", "Uploaded");
}
return QCoreApplication::translate( "progress", "Processed Bundle");
case CSYNC_INSTRUCTION_CONFLICT:
return QCoreApplication::translate( "progress", "Server version downloaded, copied changed local file into conflict file");
case CSYNC_INSTRUCTION_REMOVE:
+608
Ver Arquivo
@@ -0,0 +1,608 @@
/*
* Copyright (C) by Olivier Goffart <ogoffart@owncloud.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "propagateupload.h"
#include "propagatebundle.h"
#include "owncloudpropagator_p.h"
#include "networkjobs.h"
#include "account.h"
#include "syncjournaldb.h"
#include "syncjournalfilerecord.h"
#include "utility.h"
#include "filesystem.h"
#include "propagatorjobs.h"
#include "checksums.h"
#include "syncengine.h"
#include <QNetworkAccessManager>
#include <QFileInfo>
#include <QXmlStreamReader>
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
namespace {
const char owncloudShouldSoftCancelPropertyName[] = "owncloud-should-soft-cancel";
}
#endif
namespace OCC {
/**
* We do not want to upload files that are currently being modified.
* To avoid that, we don't upload files that have a modification time
* that is too close to the current time.
*
* This interacts with the msBetweenRequestAndSync delay in the folder
* manager. If that delay between file-change notification and sync
* has passed, we should accept the file for upload here.
*/
static bool fileIsStillChanging(const SyncFileItem & item)
{
const QDateTime modtime = Utility::qDateTimeFromTime_t(item._modtime);
const qint64 msSinceMod = modtime.msecsTo(QDateTime::currentDateTime());
return msSinceMod < SyncEngine::minimumFileAgeForUpload
// if the mtime is too much in the future we *do* upload the file
&& msSinceMod > -10000;
}
void PropagateBundle::start()
{
if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
return;
}
if (!_itemsToChecksum.isEmpty()) {
//this will block other threads from processing files and bundling while this will do that
//after sufficient number of files being checksumed, flag will be unblocked
_preparingBundle = true;
//this will add checksums and remove itself from activeJobList after is completed
_propagator->_activeJobList.append(this);
return slotComputeTransmissionChecksum();
}
//this can generate itemDone(), dont add to activeJobList
startBundle();
}
void PropagateBundle::slotComputeTransmissionChecksum()
{
if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
return;
}
const SyncFileItemPtr &item = _itemsToChecksum.first();
const QString filePath = _propagator->getFilePath(item->_file);
// remember the modtime before checksumming to be able to detect a file
// change during the checksum calculation
item->_modtime = FileSystem::getModTime(filePath);
QByteArray checksumType = contentChecksumType();
// Maybe the discovery already computed the checksum?
if (item->_contentChecksumType == checksumType
&& !item->_contentChecksum.isEmpty()) {
// Reuse the content checksum as the transmission checksum if possible
const auto supportedTransmissionChecksums =
_propagator->account()->capabilities().supportedChecksumTypes();
if (supportedTransmissionChecksums.contains(checksumType)) {
slotStartUpload(checksumType, item->_contentChecksum);
return;
}
}
// Compute the transmission checksum.
auto computeChecksum = new ComputeChecksum(this);
if (uploadChecksumEnabled()) {
computeChecksum->setChecksumType(_propagator->account()->capabilities().uploadChecksumType());
} else {
computeChecksum->setChecksumType(QByteArray());
}
connect(computeChecksum, SIGNAL(done(QByteArray,QByteArray)),
SLOT(slotStartUpload(QByteArray,QByteArray)));
computeChecksum->start(filePath);
}
void PropagateBundle::slotStartUpload(const QByteArray& transmissionChecksumType, const QByteArray& transmissionChecksum)
{
const SyncFileItemPtr &item = _itemsToChecksum.takeFirst();
item->_contentChecksum = transmissionChecksum;
item->_contentChecksumType = transmissionChecksumType;
// add this item to sync list, as it now has checksum computed
_itemsToSync.append(item);
_currentBundleSize += item->_size;
_currentRequestsNumber++;
// Remove ourselfs from the list of active job, before any posible call to itemDone()
_propagator->_activeJobList.removeOne(this);
// check if we have anything to add to our bundle
if (!_itemsToChecksum.empty()){
SyncFileItemPtr nextItem = _itemsToChecksum.first();
// if next item will exceed bundle size, send the bundle now
// otherwise, compute next checksum
if (((_currentBundleSize + nextItem->_size) >= chunkSize())
|| (_currentRequestsNumber >= checkBundledRequestsLimits())){
_currentBundleSize = 0;
_currentRequestsNumber = 0;
startBundle();
} else {
start();
}
} else {
//_itemsToChecksum is already empty, send what is left in _itemsToSync.
startBundle();
}
}
void PropagateBundle::startBundle()
{
if (_propagator->_abortRequested.fetchAndAddRelaxed(0)) {
return;
}
// job takes ownership of device via a QScopedPointer. Job deletes itself when finishing
MultipartJob* job = new MultipartJob(_propagator->account(), _propagator->account()->davFilesPath(), new QHttpMultiPart(QHttpMultiPart::RelatedType));
// start constructing the bundle metadata xml file
QByteArray xml = "<?xml version='1.0' encoding='UTF-8'?>\n"
"<d:multipart xmlns:d=\"DAV:\">\n";
int contentID = 0;
while (!_itemsToSync.isEmpty()){
const SyncFileItemPtr &item = _itemsToSync.takeFirst();
const QString fullFilePath = _propagator->getFilePath(item->_file);
if (!FileSystem::fileExists(fullFilePath)) {
itemDone(item, SyncFileItem::SoftError, tr("File Removed"));
continue;
}
time_t prevModtime = item->_modtime; // the _item value was set in PropagateUploadFileQNAM::start()
// but a potential checksum calculation could have taken some time during which the file could
// have been changed again, so better check again here.
item->_modtime = FileSystem::getModTime(fullFilePath);
if( prevModtime != item->_modtime ) {
_propagator->_anotherSyncNeeded = true;
itemDone(item, SyncFileItem::SoftError, tr("Local file changed during syncing. It will be resumed."));
continue;
}
item->_size = FileSystem::getSize(fullFilePath);
// But skip the file if the mtime is too close to 'now'!
// That usually indicates a file that is still being changed
// or not yet fully copied to the destination.
if (fileIsStillChanging(*item)) {
_propagator->_anotherSyncNeeded = true;
itemDone(item, SyncFileItem::SoftError, tr("Local file changed during sync."));
continue;
}
//TODO use Upload Device to support bandwith limitation on the client
QFile *file = new QFile(fullFilePath);
if (! file->open(QIODevice::ReadOnly)) {
qDebug() << "ERR: Could not prepare upload device: " << file->errorString();
// If the file is currently locked, we want to retry the sync
// when it becomes available again.
if (FileSystem::isFileLocked(fullFilePath)) {
emit _propagator->seenLockedFile(fullFilePath);
}
// Soft error because this is likely caused by the user modifying his files while syncing
itemDone(item, SyncFileItem::SoftError, tr("ERR: Could not prepare upload device"));
} else {
// add xml part for this specific file
xml += " <d:part>\n"
" <d:prop>\n";
if (!item->_contentChecksumType.isEmpty()) {
xml += " <d:oc-checksum>" + makeChecksumHeader(item->_contentChecksumType, item->_contentChecksum) + "</d:oc-checksum>\n";
}
if(item->_file.contains(".sys.admin#recall#")) {
xml += " <d:oc-tag>" + QByteArray(".sys.admin#recall#") + "</d:oc-tag>\n";
}
xml += " <d:oc-path>" + getRemotePath(item->_file) + "</d:oc-path>\n"
" <d:oc-mtime>" + QByteArray::number(qint64(item->_modtime)) + "</d:oc-mtime>\n"
" <d:oc-id>" + QByteArray::number(contentID) + "</d:oc-id>\n"
" <d:oc-total-length>" + QByteArray::number(qint64(item->_size)) + "</d:oc-total-length>\n"
" </d:prop>\n"
" </d:part>\n";
QHttpPart bundleContent;
bundleContent.setRawHeader("Content-ID", QByteArray::number(qint64(contentID)));
bundleContent.setBody(file->readAll());
file->close();
job->addItemPart(bundleContent, item);
contentID++;
}
delete file;
}
// finish xml building
xml += "</d:multipart>";
if (!job->isEmpty())
{
QHttpPart bundleMetadata;
bundleMetadata.setBody(xml);
bundleMetadata.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("text/xml; charset=utf-8"));
bundleMetadata.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(xml.size()));
job->addRootPart(bundleMetadata);
_propagator->_activeJobList.append(this);
job->_duration.start();
_jobs.append(job);
connect(job, SIGNAL(finishedSignal()), this, SLOT(slotMultipartFinished()));
connect(job, SIGNAL(destroyed(QObject*)), this, SLOT(slotJobDestroyed(QObject*)));
job->start();
// we have finished preparing bundles to send, allow other bundles to be send
_preparingBundle = false;
// check if there are any items to be bundled and if you can run another parallel job
if (!_itemsToChecksum.empty() && (_propagator->_activeJobList.count() < _propagator->maximumActiveJob())) {
start();
}
} else {
delete job;
}
}
QByteArray PropagateBundle::getRemotePath(QString filePath){
QString remotePath(_propagator->_remoteFolder+filePath);
return remotePath.toStdString().c_str();
}
void PropagateBundle::append(const SyncFileItemPtr &bundledFile){
_size += bundledFile->_size;
_itemsToChecksum.append(bundledFile);
}
bool PropagateBundle::empty(){
return _itemsToChecksum.empty();
}
void PropagateBundle::slotMultipartFinished()
{
MultipartJob *job = qobject_cast<MultipartJob *>(sender());
Q_ASSERT(job);
slotJobDestroyed(job); // remove it from the _jobs list
qDebug() << Q_FUNC_INFO << job->reply()->request().url() << "FINISHED WITH STATUS"
<< job->reply()->error()
<< (job->reply()->error() == QNetworkReply::NoError ? QLatin1String("") : job->reply()->errorString())
<< job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute)
<< job->reply()->attribute(QNetworkRequest::HttpReasonPhraseAttribute);
_propagator->_activeJobList.removeOne(this);
QNetworkReply::NetworkError err = job->reply()->error();
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
if (job->reply()->error() == QNetworkReply::OperationCanceledError && job->reply()->property(owncloudShouldSoftCancelPropertyName).isValid()) {
// Abort the job and try again later.
// This works around a bug in QNAM wich might reuse a non-empty buffer for the next request.
qDebug() << "Forcing job abort on HTTP connection reset with Qt < 5.4.2.";
_propagator->_anotherSyncNeeded = true;
abortWithError(SyncFileItem::SoftError, tr("Forcing job abort on HTTP connection reset with Qt < 5.4.2."));
return;
}
#endif
if (err != QNetworkReply::NoError) {
_item->_httpErrorCode = job->reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QByteArray replyContent = job->reply()->readAll();
qDebug() << replyContent; // display the XML error in the debug
QString errorString = errorMessage(job->errorString(), replyContent);
if (job->reply()->hasRawHeader("OC-ErrorString")) {
errorString = job->reply()->rawHeader("OC-ErrorString");
}
//TODO: soft error till other mechanism will be added - this will retry bundle later.
abortWithError(SyncFileItem::SoftError, errorString);
return;
}
// Parse DAV response
QXmlStreamReader reader(job->reply());
reader.addExtraNamespaceDeclaration(QXmlStreamNamespaceDeclaration("d", "DAV:"));
QString currentHref;
QString currentOcPath;
QString expectedPath(_propagator->account()->davFilesPath());
QMap<QString, QString> itemProperties;
QMap<QString, QMap<QString, QString> > responseObjectsProperties;
bool insidePropstat = false;
bool insideProp = false;
bool insideError = false;
while (!reader.atEnd()) {
QXmlStreamReader::TokenType type = reader.readNext();
QString name = reader.name().toString();
// Start elements with DAV:
if (type == QXmlStreamReader::StartElement && reader.namespaceUri() == QLatin1String("DAV:")) {
if (name == QLatin1String("href")) {
// We don't use URL encoding in our request URL (which is the expected path) (QNAM will do it for us)
// but the result will have URL encoding..
QString hrefString = QString::fromUtf8(QByteArray::fromPercentEncoding(reader.readElementText().toUtf8()));
if (!hrefString.startsWith(expectedPath)) {
qDebug() << "Invalid href" << hrefString << "expected ending with" << expectedPath;
}
currentHref = hrefString;
} else if (name == QLatin1String("response")) {
continue;
} else if (name == QLatin1String("propstat")) {
insidePropstat = true;
} else if (name == QLatin1String("status") && insidePropstat) {
QString httpStatus = reader.readElementText();
itemProperties.insert(name, httpStatus);
} else if (name == QLatin1String("prop")) {
insideProp = true;
continue;
} else if (name == QLatin1String("multistatus")) {
continue;
}
}
if (type == QXmlStreamReader::StartElement && insidePropstat && insideProp) {
if (name == QLatin1String("oc-path")){
currentOcPath = reader.readElementText(QXmlStreamReader::SkipChildElements);
} else if (name == QLatin1String("error")){
insideError = true;
} else if (name == QLatin1String("exception") && insideError){
itemProperties.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
} else if (name == QLatin1String("message") && insideError){
itemProperties.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
} else{
itemProperties.insert(name, reader.readElementText(QXmlStreamReader::SkipChildElements));
}
}
// End elements with DAV:
if (type == QXmlStreamReader::EndElement) {
if (reader.namespaceUri() == QLatin1String("DAV:")) {
if (reader.name() == "response") {
currentHref.clear();
} else if (reader.name() == "propstat") {
insidePropstat = false;
if (!currentOcPath.isEmpty()){
responseObjectsProperties.insert(currentOcPath, QMap<QString,QString>(itemProperties));
}
currentOcPath.clear();
itemProperties.clear();
} else if (reader.name() == "prop") {
insideProp = false;
} else if (reader.name() == "error") {
insideError = false;
}
}
}
}
if (reader.hasError()) {
// XML Parser error? Whatever had been emitted before will come as directoryListingIterated
qDebug() << "ERROR" << reader.errorString();
abortWithError(SyncFileItem::SoftError, tr("Cannot parse multistatus response!"));
return;
}
QList<SyncFileItemPtr> syncItems = job->syncItems();
//get the total duration, and try to estimate sync time for single item in the bundle
quint64 avgItemDuration = job->_duration.elapsed()/syncItems.count();
foreach(const SyncFileItemPtr &item, syncItems) {
item->_requestDuration = avgItemDuration;
item->_responseTimeStamp = job->responseTimestamp();
slotItemFinished(item, responseObjectsProperties);
}
// performance logging
qDebug() << "*==* duration BUNDLE UPLOAD" << syncItems.count() << "items synced"
<< "average duration" << avgItemDuration;
// The job might stay alive for the whole sync, release this tiny bit of memory.
if (_jobs.empty() && _itemsToChecksum.isEmpty()){
done(SyncFileItem::Success);
} else if (!_preparingBundle){
// This will be called only if some other thread is not currently preparing bundles (checksums)
start();
}
}
void PropagateBundle::slotItemFinished(const SyncFileItemPtr &item, QMap<QString, QMap<QString, QString> > &responseObjectsProperties)
{
QString itemFilePath(getRemotePath(item->_file));
QMap<QString, QString> fileProperties = responseObjectsProperties.value(itemFilePath);
item->_httpErrorCode = getHttpStatusCode(fileProperties.value("status"));
if (200 == item->_httpErrorCode){
// Check if the file still exists
const QString fullFilePath(_propagator->getFilePath(item->_file));
if( !FileSystem::fileExists(fullFilePath) ) {
_propagator->_anotherSyncNeeded = true;
}
if (! FileSystem::verifyFileUnchanged(fullFilePath, item->_size, item->_modtime)) {
_propagator->_anotherSyncNeeded = true;
}
//OC-FileID section
if (fileProperties.contains("oc-fileid")){
QString fid = fileProperties.value("oc-fileid");
if( !item->_fileId.isEmpty() && item->_fileId != fid ) {
qDebug() << "WARN: File ID changed!" << item->_fileId << fid;
}
item->_fileId =fid.toStdString().c_str();
}
//OC-ETag section
QByteArray ocEtag = parseEtag(fileProperties.value("oc-etag").toStdString().c_str());
QByteArray etag = parseEtag(fileProperties.value("etag").toStdString().c_str());
item->_etag = ocEtag.isEmpty() ? etag : ocEtag;
if (ocEtag.length() > 0 && ocEtag != etag) {
qDebug() << "Quite peculiar, we have an etag != OC-Etag [no problem!]" << etag << ocEtag;
}
if (fileProperties.value("oc-mtime") != "accepted"){
// OC-MTime is supported since owncloud 5.0. But not when chunking.
// Normally Owncloud 6 always puts OC-MTime
qWarning() << "Server does not support OC-MTime" << fileProperties.value("oc-mtime");
// Well, the mtime was not set
itemDone(item, SyncFileItem::SoftError, "Server does not support OC-MTime");
return;
}
} else{
//We do not check for problems with shared folder since it is only CREATE
//REMARK: if the file will support update, ensure to override checkForProblemsWithShared()
qDebug() << Q_FUNC_INFO << item->_file << "ERROR WITH STATUS"
<< fileProperties.value("status")
<< fileProperties.value("exception")
<< fileProperties.value("message");
if (412 == _item->_httpErrorCode) {
// Precondition Failed: Maybe the bad etag is in the database, we need to clear the
// parent folder etag so we won't read from DB next sync.
_propagator->_journal->avoidReadFromDbOnNextSync(item->_file);
_propagator->_anotherSyncNeeded = true;
}
item->_errorString = fileProperties.value("message");
item->_status = classifyError(QNetworkReply::ContentOperationNotPermittedError, item->_httpErrorCode,
&_propagator->_anotherSyncNeeded);
itemDone(item, item->_status, item->_errorString);
return;
}
if (!_propagator->_journal->setFileRecord(SyncJournalFileRecord(*item, _propagator->getFilePath(item->_file)))) {
itemDone(item, SyncFileItem::FatalError, tr("Error writing metadata to the database"));
return;
}
// Remove from the progress database:
_propagator->_journal->setUploadInfo(item->_file, SyncJournalDb::UploadInfo());
_propagator->_journal->commit("upload file start");
itemDone(item, SyncFileItem::Success);
}
int PropagateBundle::getHttpStatusCode(const QString &status){
//if cannot read code, it means that server is not supported and raise 500 Internal Server Error
int code = 500;
QStringList statusList = status.split(QRegExp("\\s+"));
if (2 < statusList.size()){
//we expect status list to be at least 3 elements and second element to be the http error code
code = statusList.at(1).toInt();
}
return code;
}
void PropagateBundle::slotJobDestroyed(QObject* job)
{
_jobs.erase(std::remove(_jobs.begin(), _jobs.end(), job) , _jobs.end());
}
// This function is used whenever there is an error occuring and we need to raise status for whole the bundle
void PropagateBundle::abortWithError(SyncFileItem::Status status, const QString &error)
{
foreach(auto *job, _jobs) {
if (job->reply()) {
qDebug() << Q_FUNC_INFO << job;
job->reply()->abort();
}
}
done(status, error);
}
MultipartJob::~MultipartJob()
{
// Make sure that we destroy the QNetworkReply before our _device of which it keeps an internal pointer.
setReply(0);
}
void MultipartJob::start() {
while(!_syncParts.empty()) {
const QHttpPart &itemPart = _syncParts.takeFirst();
_multipart->append(itemPart);
}
QNetworkRequest req;
setReply(multipartRequest(path(), req, _multipart));
_multipart->setParent(reply()); // delete the multiPart with the job
setupConnections(reply());
if( reply()->error() != QNetworkReply::NoError ) {
qWarning() << Q_FUNC_INFO << " Network error: " << reply()->errorString();
}
connect(this, SIGNAL(networkActivity()), account().data(), SIGNAL(propagatorNetworkActivity()));
//TODO this uses _device, and we have no access here to that
// // For Qt versions not including https://codereview.qt-project.org/110150
// // Also do the runtime check if compiled with an old Qt but running with fixed one.
// // (workaround disabled on windows and mac because the binaries we ship have patched qt)
//#if QT_VERSION < QT_VERSION_CHECK(4, 8, 7)
// if (QLatin1String(qVersion()) < QLatin1String("4.8.7"))
// connect(_device.data(), SIGNAL(wasReset()), this, SLOT(slotSoftAbort()));
//#elif QT_VERSION > QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(5, 4, 2) && !defined Q_OS_WIN && !defined Q_OS_MAC
// if (QLatin1String(qVersion()) < QLatin1String("5.4.2"))
// connect(_device.data(), SIGNAL(wasReset()), this, SLOT(slotSoftAbort()));
//#endif
AbstractNetworkJob::start();
}
void MultipartJob::addItemPart(const QHttpPart &itemPart, const SyncFileItemPtr &item){
// add itemPart to queue, this queue will be used to construct the multipart message
_syncParts.append(itemPart);
// add item pointer to queue, it will be used to construct the response at the end.
_syncItems.append(item);
}
void MultipartJob::addRootPart(const QHttpPart &itemPart){
// if used, this part will be added to the begining of multipart request
_syncParts.prepend(itemPart);
}
void MultipartJob::slotTimeout() {
qDebug() << "Timeout" << (reply() ? reply()->request().url() : path());
if (!reply())
return;
_errorString = tr("Connection Timeout");
reply()->abort();
}
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
void MultipartJob::slotSoftAbort() {
reply()->setProperty(owncloudShouldSoftCancelPropertyName, true);
reply()->abort();
}
#endif
}
+141
Ver Arquivo
@@ -0,0 +1,141 @@
/*
* Copyright (C) by Olivier Goffart <ogoffart@owncloud.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#pragma once
#include "owncloudpropagator.h"
#include "networkjobs.h"
#include <QHttpMultiPart>
#include <QFile>
#include <QDebug>
namespace OCC {
/**
* @brief The MultipartJob class
* @ingroup libsync
*/
class MultipartJob : public AbstractNetworkJob {
Q_OBJECT
private:
QHttpMultiPart* _multipart;
// Vector_syncItems is used in constructing a response at the response arrival
QList<SyncFileItemPtr> _syncItems;
// Vector containing QHttpParts which will be later inserted into request body
QList<QHttpPart> _syncParts;
// error string
QString _errorString;
public:
QElapsedTimer _duration;
// Takes ownership of the device
explicit MultipartJob(AccountPtr account, const QString& path, QHttpMultiPart* multipart, QObject* parent = 0)
: AbstractNetworkJob(account, path, parent), _multipart(multipart), _errorString(QString()) {}
~MultipartJob();
virtual void start() Q_DECL_OVERRIDE;
virtual bool finished() Q_DECL_OVERRIDE {
emit finishedSignal();
return true;
}
void addItemPart(const QHttpPart &itemPart, const SyncFileItemPtr &item);
void addRootPart(const QHttpPart &itemPart);
bool isEmpty() {
return _syncItems.isEmpty();
}
QString errorString() {
return _errorString.isEmpty() ? reply()->errorString() : _errorString;
}
QList<SyncFileItemPtr> syncItems() const {
return _syncItems;
}
virtual void slotTimeout() Q_DECL_OVERRIDE;
signals:
void finishedSignal();
private slots:
#if QT_VERSION < 0x050402
void slotSoftAbort();
#endif
};
/**
* @brief The PropagateBundle class
* @ingroup libsync
*/
class PropagateBundle : public PropagateItemJob {
Q_OBJECT
private:
QLinkedList<SyncFileItemPtr> _itemsToSync;
QLinkedList<SyncFileItemPtr> _itemsToChecksum;
QVector<MultipartJob*> _jobs; /// network jobs that are currently in transit
bool _preparingBundle; // Flag blocking processing the same files by many threads
quint64 _size; // Tells what is the total size of _itemsToSync inside the bundle
quint64 _currentBundleSize;
quint64 _currentRequestsNumber;
quint64 _totalFiles;
// measure the performance of checksum calc and upload
Utility::StopWatch _stopWatch;
public:
PropagateBundle(OwncloudPropagator* propagator)
: PropagateItemJob(propagator, SyncFileItemPtr(new SyncFileItem)), _preparingBundle(true), _size(0), _currentBundleSize(0), _currentRequestsNumber(0) {}
void start() Q_DECL_OVERRIDE;
void startBundle();
void append(const SyncFileItemPtr &bundledFile);
QByteArray getRemotePath(QString filePath);
bool empty();
bool scheduleNextJob() Q_DECL_OVERRIDE {
if (_state == NotYetStarted){
_state = Running;
QMetaObject::invokeMethod(this, "start");
return true;
}
return false;
}
quint64 syncItemsSize() const { return _size; }
quint64 syncItemsNumber() const { return _itemsToChecksum.count(); }
private slots:
void slotComputeTransmissionChecksum();
void slotStartUpload(const QByteArray& transmissionChecksumType, const QByteArray& transmissionChecksum);
void slotMultipartFinished();
void slotJobDestroyed(QObject *job);
void abortWithError(SyncFileItem::Status status, const QString &error);
private:
quint64 checkBundledRequestsLimits()
{
//TODO: obtain this value from the server or by other means
quint64 maximumBundledFiles = 500;
return (maximumBundledFiles/_propagator->maximumActiveJob());
}
quint64 chunkSize() const { return _propagator->chunkSize(); }
int getHttpStatusCode(const QString &status);
void slotItemFinished(const SyncFileItemPtr &item, QMap<QString, QMap<QString, QString> > &responseObjectsProperties);
};
}
+1 -1
Ver Arquivo
@@ -177,7 +177,7 @@ void PropagateRemoteMove::finalize()
record._contentChecksum = oldRecord._contentChecksum;
record._contentChecksumType = oldRecord._contentChecksumType;
if (record._fileSize != oldRecord._fileSize) {
qDebug() << "Warning: file sizes differ on server vs sync journal: " << record._fileSize << oldRecord._fileSize;
qDebug() << "Warning: file sizes differ on server vs csync_journal: " << record._fileSize << oldRecord._fileSize;
record._fileSize = oldRecord._fileSize; // server might have claimed different size, we take the old one from the DB
}
}
+1 -1
Ver Arquivo
@@ -32,6 +32,7 @@
#include <QDir>
#include <cmath>
#include <cstring>
#include <QXmlStreamReader>
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
namespace {
@@ -562,5 +563,4 @@ void PropagateUploadFileCommon::finalize()
done(SyncFileItem::Success);
}
}
+1 -2
Ver Arquivo
@@ -16,11 +16,11 @@
#include "owncloudpropagator.h"
#include "networkjobs.h"
#include <QHttpMultiPart>
#include <QBuffer>
#include <QFile>
#include <QDebug>
namespace OCC {
class BandwidthManager;
@@ -321,6 +321,5 @@ private slots:
void slotUploadProgress(qint64,qint64);
};
}
+2 -2
Ver Arquivo
@@ -38,7 +38,7 @@ namespace OCC {
QUrl PropagateUploadFileNG::chunkUrl(int chunk)
{
QString path = QLatin1String("remote.php/dav/uploads/")
+ _propagator->account()->user()
+ _propagator->account()->davUser()
+ QLatin1Char('/') + QString::number(_transferId);
if (chunk >= 0) {
path += QLatin1Char('/') + QString::number(chunk);
@@ -269,7 +269,7 @@ void PropagateUploadFileNG::startNextChunk()
_finished = true;
// Finish with a MOVE
QString destination = _propagator->account()->url().path()
+ QLatin1String("/remote.php/dav/files/") + _propagator->account()->user()
+ QLatin1String("/remote.php/dav/files/") + _propagator->account()->davUser()
+ _propagator->_remoteFolder + _item->_file;
auto headers = PropagateUploadFileCommon::headers();
+1 -4
Ver Arquivo
@@ -83,10 +83,7 @@ SyncEngine::SyncEngine(AccountPtr account, const QString& localPath,
Q_ASSERT(localPath.endsWith(QLatin1Char('/')));
csync_create(&_csync_ctx, localPath.toUtf8().data());
const QString dbFile = _journal->databaseFilePath();
csync_init(_csync_ctx, dbFile.toUtf8().data());
csync_init(_csync_ctx);
_excludedFiles.reset(new ExcludedFiles(&_csync_ctx->excludes));
_syncFileStatusTracker.reset(new SyncFileStatusTracker(this));
-2
Ver Arquivo
@@ -164,8 +164,6 @@ private slots:
private:
void handleSyncError(CSYNC *ctx, const char *state);
QString journalDbFilePath() const;
static int treewalkLocal( TREE_WALK_FILE*, void *);
static int treewalkRemote( TREE_WALK_FILE*, void *);
int treewalkFile( TREE_WALK_FILE*, bool );
+1
Ver Arquivo
@@ -46,6 +46,7 @@ public:
enum Type {
UnknownType = 0,
RequestsContainer = 7,
File = CSYNC_FTW_TYPE_FILE,
Directory = CSYNC_FTW_TYPE_DIR,
SoftLink = CSYNC_FTW_TYPE_SLINK
+13 -58
Ver Arquivo
@@ -16,8 +16,6 @@
#include <QStringList>
#include <QDebug>
#include <QElapsedTimer>
#include <QUrl>
#include "ownsql.h"
#include <inttypes.h>
@@ -32,63 +30,17 @@
namespace OCC {
SyncJournalDb::SyncJournalDb(const QString& dbFilePath, QObject *parent) :
QObject(parent),
_dbFile(dbFilePath),
_transaction(0)
SyncJournalDb::SyncJournalDb(const QString& path, QObject *parent) :
QObject(parent), _transaction(0)
{
}
QString SyncJournalDb::makeDbName(const QUrl& remoteUrl,
const QString& remotePath,
const QString& user)
{
QString journalPath = QLatin1String("._sync_");
QString key = QString::fromUtf8("%1@%2:%3").arg(
user,
remoteUrl.toString(),
remotePath);
QByteArray ba = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Md5);
journalPath.append( ba.left(6).toHex() );
journalPath.append(".db");
return journalPath;
}
bool SyncJournalDb::maybeMigrateDb(const QString& localPath, const QString& absoluteJournalPath)
{
const QString oldDbName = localPath + QLatin1String(".csync_journal.db");
if( !FileSystem::fileExists(oldDbName) ) {
return true;
_dbFile = path;
if( !_dbFile.endsWith('/') ) {
_dbFile.append('/');
}
_dbFile.append(".csync_journal.db");
const QString newDbName = absoluteJournalPath;
// Whenever there is an old db file, migrate it to the new db path.
// This is done to make switching from older versions to newer versions
// work correctly even if the user had previously used a new version
// and therefore already has an (outdated) new-style db file.
QString error;
if( FileSystem::fileExists( newDbName ) ) {
if( !FileSystem::remove(newDbName, &error) ) {
qDebug() << "Database migration: Could not remove db file" << newDbName
<< "due to" << error;
return false;
}
}
if( !FileSystem::rename(oldDbName, newDbName, &error) ) {
qDebug() << "Database migration: could not rename " << oldDbName
<< "to" << newDbName << ":" << error;
return false;
}
qDebug() << "Journal successfully migrated from" << oldDbName << "to" << newDbName;
return true;
}
bool SyncJournalDb::exists()
@@ -97,7 +49,7 @@ bool SyncJournalDb::exists()
return (!_dbFile.isEmpty() && QFile::exists(_dbFile));
}
QString SyncJournalDb::databaseFilePath() const
QString SyncJournalDb::databaseFilePath()
{
return _dbFile;
}
@@ -183,6 +135,8 @@ bool SyncJournalDb::checkConnect()
return false;
}
bool isNewDb = !QFile::exists(_dbFile);
// The database file is created by this call (SQLITE_OPEN_CREATE)
if( !_db.openOrCreateReadWrite(_dbFile) ) {
QString error = _db.error();
@@ -356,9 +310,10 @@ bool SyncJournalDb::checkConnect()
SqlQuery versionQuery("SELECT major, minor, patch FROM version;", _db);
if (!versionQuery.next()) {
// If there was no entry in the table, it means we are likely upgrading from 1.5
qDebug() << Q_FUNC_INFO << "possibleUpgradeFromMirall_1_5 detected!";
forceRemoteDiscovery = true;
if (!isNewDb) {
qDebug() << Q_FUNC_INFO << "possibleUpgradeFromMirall_1_5 detected!";
forceRemoteDiscovery = true;
}
createQuery.prepare("INSERT INTO version VALUES (?1, ?2, ?3, ?4);");
createQuery.bindValue(1, MIRALL_VERSION_MAJOR);
createQuery.bindValue(2, MIRALL_VERSION_MINOR);
+2 -11
Ver Arquivo
@@ -37,17 +37,9 @@ class OWNCLOUDSYNC_EXPORT SyncJournalDb : public QObject
{
Q_OBJECT
public:
explicit SyncJournalDb(const QString& dbFilePath, QObject *parent = 0);
explicit SyncJournalDb(const QString& path, QObject *parent = 0);
virtual ~SyncJournalDb();
/// Create a journal path for a specific configuration
static QString makeDbName(const QUrl& remoteUrl,
const QString& remotePath,
const QString& user);
/// Migrate a csync_journal to the new path, if necessary. Returns false on error
static bool maybeMigrateDb(const QString& localPath, const QString& absoluteJournalPath);
// to verify that the record could be queried successfully check
// with SyncJournalFileRecord::isValid()
SyncJournalFileRecord getFileRecord(const QString& filename);
@@ -66,8 +58,7 @@ public:
bool exists();
void walCheckpoint();
QString databaseFilePath() const;
QString databaseFilePath();
static qint64 getPHash(const QString& );
void updateErrorBlacklistEntry( const SyncJournalErrorBlacklistRecord& item );
+1 -15
Ver Arquivo
@@ -277,26 +277,12 @@ bool Utility::fsCasePreserving()
if( isWindows() || isMac() ) {
re = true;
} else {
bool isTest = qgetenv("OWNCLOUD_TEST_CASE_PRESERVING").toInt();
static bool isTest = qgetenv("OWNCLOUD_TEST_CASE_PRESERVING").toInt();
re = isTest;
}
return re;
}
bool Utility::fileNamesEqual( const QString& fn1, const QString& fn2)
{
const QDir fd1(fn1);
const QDir fd2(fn2);
// Attention: If the path does not exist, canonicalPath returns ""
// ONLY use this function with existing pathes.
const QString a = fd1.canonicalPath();
const QString b = fd2.canonicalPath();
bool re = !a.isEmpty() && QString::compare( a, b,
fsCasePreserving() ? Qt::CaseInsensitive : Qt::CaseSensitive) == 0;
return re;
}
QDateTime Utility::qDateTimeFromTime_t(qint64 t)
{
return QDateTime::fromMSecsSinceEpoch(t * 1000);
-5
Ver Arquivo
@@ -105,11 +105,6 @@ namespace Utility
// if false, the two cases are two different files.
OWNCLOUDSYNC_EXPORT bool fsCasePreserving();
// Check if two pathes that MUST exist are equal. This function
// uses QDir::canonicalPath() to judge and cares for the systems
// case sensitivity.
OWNCLOUDSYNC_EXPORT bool fileNamesEqual( const QString& fn1, const QString& fn2);
// Call the given command with the switch --version and rerun the first line
// of the output.
// If command is empty, the function calls the running application which, on
+233 -4
Ver Arquivo
@@ -32,6 +32,7 @@ inline QString getFilePathFromUrl(const QUrl &url) {
return {};
}
static const QUrl sBundleRootUrl("owncloud://somehost/remote.php/dav/files/");
inline QString generateEtag() {
return QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch(), 16);
@@ -625,7 +626,6 @@ public:
qint64 readData(char *, qint64) override { return 0; }
};
class FakeErrorReply : public QNetworkReply
{
Q_OBJECT
@@ -649,6 +649,223 @@ public:
qint64 readData(char *, qint64) override { return 0; }
};
class FakeBundlePOSTReply : public QNetworkReply
{
Q_OBJECT
FileInfo *fileInfo;
QByteArray payload;
public:
FakeBundlePOSTReply(FileInfo &remoteRootFileInfo, QNetworkAccessManager::Operation op, const QNetworkRequest &request, const QByteArray &postPayload, QObject *parent)
: QNetworkReply{parent} {
setRequest(request);
QUrl rawUrl = request.url();
QString bundlePath(sBundleRootUrl.path()+rawUrl.userName());
setUrl(rawUrl);
setOperation(op);
open(QIODevice::ReadOnly);
const QString davUri{QStringLiteral("DAV:")};
const QString ocUri{QStringLiteral("http://owncloud.org/ns")};
const QString sabUri{QStringLiteral("http://sabredav.org/ns")};
QBuffer buffer{&payload};
buffer.open(QIODevice::WriteOnly);
QXmlStreamWriter xml( &buffer );
xml.writeNamespace(davUri, "d");
xml.writeNamespace(ocUri, "o");
xml.writeNamespace(sabUri, "s");
if ("erroruser" == rawUrl.userName()) {
// ERROR CASE
xml.writeStartDocument();
xml.writeStartElement(davUri, QStringLiteral("error"));
xml.writeTextElement(sabUri, QStringLiteral("exception"), QStringLiteral("OCA\\DAV\\Connector\\Sabre\\Exception\\Forbidden"));
xml.writeTextElement(sabUri, QStringLiteral("message"), QStringLiteral("URL endpoint has to be instance of \\OCA\\DAV\\Files\\FilesHome"));
xml.writeTextElement(ocUri, QStringLiteral("retry"), QStringLiteral("false"));
xml.writeTextElement(ocUri, QStringLiteral("reason"), QStringLiteral("URL endpoint has to be instance of \\OCA\\DAV\\Files\\FilesHome"));
xml.writeEndElement(); // error
xml.writeEndDocument();
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 403);
} else {
//NORMAL CASE
auto writeFileResponse = [&](const FileInfo &fileInfo) {
xml.writeStartElement(davUri, QStringLiteral("response"));
//TODO: no need for X-OC-PATH, href could contain that, fix client/server
xml.writeTextElement(davUri, QStringLiteral("href"), bundlePath);
xml.writeStartElement(davUri, QStringLiteral("propstat"));
xml.writeStartElement(davUri, QStringLiteral("prop"));
xml.writeTextElement(davUri, QStringLiteral("oc-etag"), fileInfo.etag);
xml.writeTextElement(davUri, QStringLiteral("etag"), fileInfo.etag);
xml.writeTextElement(davUri, QStringLiteral("oc-fileid"), fileInfo.fileId);
xml.writeTextElement(davUri, QStringLiteral("oc-mtime"), QStringLiteral("accepted"));
//TODO: this slash to be fixed on client/server
xml.writeTextElement(davUri, QStringLiteral("oc-path"), "/"+fileInfo.path());
xml.writeEndElement(); // prop
xml.writeTextElement(davUri, QStringLiteral("status"), "HTTP/1.1 200 OK");
xml.writeEndElement(); // propstat
xml.writeEndElement(); // response
};
auto writeFileErrorResponse = [&](const FileInfo &fileInfo, const QString &exception, const QString &message, const QString &status) {
xml.writeStartElement(davUri, QStringLiteral("response"));
//TODO: no need for X-OC-PATH, href could contain that, fix client/server
xml.writeTextElement(davUri, QStringLiteral("href"), bundlePath);
xml.writeStartElement(davUri, QStringLiteral("propstat"));
xml.writeStartElement(davUri, QStringLiteral("prop"));
xml.writeStartElement(davUri, QStringLiteral("error"));
xml.writeTextElement(sabUri, QStringLiteral("exception"), exception);
xml.writeTextElement(sabUri, QStringLiteral("message"), message);
xml.writeEndElement(); // error
//TODO: this slash to be fixed on client/server
xml.writeTextElement(davUri, QStringLiteral("oc-path"), "/"+fileInfo.path());
xml.writeEndElement(); // prop
xml.writeTextElement(davUri, QStringLiteral("status"), status);
xml.writeEndElement(); // propstat
xml.writeEndElement(); // response
};
Q_ASSERT(request.url().path().endsWith(bundlePath));
xml.writeStartDocument();
xml.writeStartElement(davUri, QStringLiteral("multistatus"));
QString headerSectEnd = "\r\n\r\n";
QString headerEnd = "\r\n";
QString headerConType= "Content-Type: ";
QString headerConID= "Content-ID: ";
QString multipartStart = "<d:multipart xmlns:d=\"DAV:\">";
QString partStart = "<d:part>";
QString pathStart = "<d:oc-path>";
QString pathEnd = "</d:oc-path>";
QString mtimeStart = "<d:oc-mtime>";
QString mtimeEnd = "</d:oc-mtime>";
QString cidStart = "<d:oc-id>";
QString cidEnd = "</d:oc-id>";
QString lengthStart = "<d:oc-total-length>";
QString lenghtEnd = "</d:oc-total-length>";
//we will use it to navigate in the request body
int indexPointer = 0;
int indexPointerEnd = 0;
QChar contentChar;
QMap<int, QMap<QString, QString>> pathMap;
QMap<QString, QString> objectMap;
/* Find Content-Type of bundle metadata.*/
//find index of content type and move to its end
indexPointer = postPayload.indexOf(headerConType,indexPointerEnd) + headerConType.length();
//find index of \r\n, so end of HTTP header and move to its end
indexPointerEnd = postPayload.indexOf(headerEnd,indexPointer);
//assert if what is between these indexes is our desired content type
Q_ASSERT(postPayload.mid(indexPointer,indexPointerEnd-indexPointer) == QString("text/xml; charset=utf-8"));
/* Verify if there is xml which contains multipartStart element*/
//find index of nearest header end and move to its end
indexPointer = postPayload.indexOf(headerSectEnd,indexPointerEnd) + headerSectEnd.length();
//
indexPointerEnd = postPayload.indexOf(multipartStart,indexPointer);
//assert if what is between these indexes is our desired content type
Q_ASSERT(postPayload.mid(indexPointer,indexPointerEnd-indexPointer) == QString("<?xml version='1.0' encoding='UTF-8'?>\n"));
/*Check metadata contents*/
while(postPayload.indexOf(partStart,indexPointerEnd) + partStart.length() >=indexPointerEnd) {
//find oc-path
indexPointer = postPayload.indexOf(pathStart,indexPointerEnd) + pathStart.length();
indexPointerEnd = postPayload.indexOf(pathEnd,indexPointer);
QString filePath(postPayload.mid(indexPointer,indexPointerEnd-indexPointer));
Q_ASSERT(!filePath.isNull());
indexPointer = postPayload.indexOf(mtimeStart,indexPointerEnd) + mtimeStart.length();
indexPointerEnd = postPayload.indexOf(mtimeEnd,indexPointer);
QString fileMtime(postPayload.mid(indexPointer,indexPointerEnd-indexPointer));
Q_ASSERT(!fileMtime.isNull());
indexPointer = postPayload.indexOf(cidStart,indexPointerEnd) + cidStart.length();
indexPointerEnd = postPayload.indexOf(cidEnd,indexPointer);
QString fileID(postPayload.mid(indexPointer,indexPointerEnd-indexPointer));
Q_ASSERT(!fileID.isNull());
indexPointer = postPayload.indexOf(lengthStart,indexPointerEnd) + lengthStart.length();
indexPointerEnd = postPayload.indexOf(lenghtEnd,indexPointer);
QString fileLength(postPayload.mid(indexPointer,indexPointerEnd-indexPointer));
Q_ASSERT(!fileLength.isNull());
objectMap["mtime"] = fileMtime;
objectMap["path"] = filePath;
objectMap["length"] = fileLength;
pathMap[fileID.toInt()] = objectMap;
}
while(postPayload.indexOf(headerConID,indexPointerEnd) + headerConID.length() >=indexPointerEnd) {
/* Find Content-ID of bundle binary.*/
indexPointer = postPayload.indexOf(headerConID,indexPointerEnd) + headerConID.length();
indexPointerEnd = postPayload.indexOf(headerEnd,indexPointer);
//assert if what is between these indexes is our desired content type
int id = QString(postPayload.mid(indexPointer,indexPointerEnd-indexPointer)).toInt();
Q_ASSERT(pathMap.contains(id));
indexPointer = postPayload.indexOf(headerSectEnd,indexPointerEnd) + headerSectEnd.length();
Q_ASSERT(postPayload.mid(indexPointer,1).size()==1);
QChar contentChar(postPayload.mid(indexPointer,1)[0]);
QString filePath(pathMap[id]["path"]);
QString fileSize(pathMap[id]["length"]);
if ((fileInfo = remoteRootFileInfo.find(filePath))) {
fileInfo->size = fileSize.toInt();
fileInfo->contentChar = contentChar.toAscii();
} else {
// Assume that the file is filled with the same character
fileInfo = remoteRootFileInfo.create(filePath, fileSize.toInt(), contentChar.toAscii());
}
if (!fileInfo) {
abort();
return;
}
if (filePath.endsWith("normalerrorfile")){
writeFileErrorResponse(*fileInfo, QStringLiteral("Sabre\\DAV\\Exception\\BadRequest"), QStringLiteral("Method not allowed - file exists - update of the file is not supported!"), QStringLiteral("HTTP/1.1 400 Bad Request"));
} else if (filePath.endsWith("fatalerrorfile")){
writeFileErrorResponse(*fileInfo, QStringLiteral("Sabre\\DAV\\Exception\\ServiceUnavailable"), QStringLiteral("Failed to check file size"), QStringLiteral("HTTP/1.1 503 Service Unavailable"));
} else if (filePath.endsWith("softerrorfile")){
writeFileErrorResponse(*fileInfo, QStringLiteral("OCA\\DAV\\Connector\\Sabre\\Exception\\FileLocked"), QStringLiteral("Target file is locked by another process."), QStringLiteral("HTTP/1.1 423 Locked (WebDAV; RFC 4918)"));
} else {
writeFileResponse(*fileInfo);
}
}
xml.writeEndElement(); // multistatus
xml.writeEndDocument();
setAttribute(QNetworkRequest::HttpStatusCodeAttribute, 207);
setFinished(true);
setHeader(QNetworkRequest::ContentTypeHeader, "application/xml; charset=utf-8");
setHeader(QNetworkRequest::ContentLengthHeader, payload.size());
}
QMetaObject::invokeMethod(this, "respond", Qt::QueuedConnection);
}
Q_INVOKABLE void respond() {
emit metaDataChanged();
if (bytesAvailable())
emit readyRead();
emit finished();
}
void abort() override { }
qint64 bytesAvailable() const override { return payload.size() + QIODevice::bytesAvailable(); }
qint64 readData(char *data, qint64 maxlen) override {
qint64 len = std::min(qint64{payload.size()}, maxlen);
strncpy(data, payload.constData(), len);
payload.remove(0, len);
return len;
}
};
class FakeQNAM : public QNetworkAccessManager
{
FileInfo _remoteRootFileInfo;
@@ -664,7 +881,13 @@ protected:
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request,
QIODevice *outgoingData = 0) {
const QString fileName = getFilePathFromUrl(request.url());
Q_ASSERT(!fileName.isNull());
if (op != QNetworkAccessManager::PostOperation){
Q_ASSERT(!fileName.isNull());
} else {
//For Bundle, fileName of bundle is "". Otherwise, assert
Q_ASSERT(fileName.isNull());
}
if (_errorPaths.contains(fileName))
return new FakeErrorReply{op, request, this};
@@ -687,7 +910,9 @@ protected:
return new FakeMoveReply{info, op, request, this};
else if (verb == QLatin1String("MOVE") && isUpload)
return new FakeChunkMoveReply{info, _remoteRootFileInfo, op, request, this};
else {
else if (op == QNetworkAccessManager::PostOperation) {
return new FakeBundlePOSTReply{_remoteRootFileInfo, op, request, outgoingData->readAll(), this};
} else {
qDebug() << verb << outgoingData;
Q_UNREACHABLE();
}
@@ -737,7 +962,7 @@ public:
_account->setUrl(QUrl(QStringLiteral("http://admin:admin@localhost/owncloud")));
_account->setCredentials(new FakeCredentials{_fakeQnam});
_journalDb.reset(new OCC::SyncJournalDb(localPath() + "._sync_test.db"));
_journalDb.reset(new OCC::SyncJournalDb(localPath()));
_syncEngine.reset(new OCC::SyncEngine(_account, localPath(), "", _journalDb.get()));
// A new folder will update the local file state database on first sync.
@@ -807,6 +1032,10 @@ public:
return execUntilFinished();
}
OCC::AccountPtr getAccount() {
return _account;
}
private:
static void toDisk(QDir &dir, const FileInfo &templateFi) {
foreach (const FileInfo &child, templateFi.children) {
+7 -41
Ver Arquivo
@@ -16,20 +16,9 @@
#include "account.h"
#include "accountstate.h"
#include "configfile.h"
#include "creds/httpcredentials.h"
using namespace OCC;
class HttpCredentialsTest : public HttpCredentials {
public:
HttpCredentialsTest(const QString& user, const QString& password)
: HttpCredentials(user, password, "", "")
{}
void askFromUser() Q_DECL_OVERRIDE {
}
};
static FolderDefinition folderDefinition(const QString &path) {
FolderDefinition d;
@@ -64,13 +53,7 @@ private slots:
f.write("hello");
}
AccountPtr account = Account::create();
QUrl url("http://example.de");
HttpCredentialsTest *cred = new HttpCredentialsTest("testuser", "secret");
account->setCredentials(cred);
account->setUrl( url );
AccountStatePtr newAccountState(new AccountState(account));
AccountStatePtr newAccountState(new AccountState(Account::create()));
FolderMan *folderman = FolderMan::instance();
QCOMPARE(folderman, &_fm);
QVERIFY(folderman->addFolder(newAccountState.data(), folderDefinition(dir.path() + "/sub/ownCloud1")));
@@ -78,8 +61,6 @@ private slots:
// those should be allowed
// QString FolderMan::checkPathValidityForNewFolder(const QString& path, const QUrl &serverUrl, bool forNewDirectory)
QCOMPARE(folderman->checkPathValidityForNewFolder(dir.path() + "/sub/free"), QString());
QCOMPARE(folderman->checkPathValidityForNewFolder(dir.path() + "/free2/"), QString());
// Not an existing directory -> Ok
@@ -90,21 +71,11 @@ private slots:
// A file -> Error
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/file.txt").isNull());
// There are folders configured in those folders, url needs to be taken into account: -> ERROR
QUrl url2(url);
const QString user = account->credentials()->user();
url2.setUserName(user);
// The following both fail because they refer to the same account (user and url)
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/ownCloud1", url2).isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/ownCloud2/", url2).isNull());
// Now it will work because the account is different
QUrl url3("http://anotherexample.org");
url3.setUserName("dummy");
QCOMPARE(folderman->checkPathValidityForNewFolder(dir.path() + "/sub/ownCloud1", url3), QString());
QCOMPARE(folderman->checkPathValidityForNewFolder(dir.path() + "/ownCloud2/", url3), QString());
// There are folders configured in those folders: -> ERROR
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/ownCloud1").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/ownCloud2/").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path()).isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/ownCloud1/folder").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/ownCloud1/folder/f").isNull());
@@ -122,12 +93,7 @@ private slots:
// Not Ok
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link2").isNull());
// link 3 points to an existing sync folder. To make it fail, the account must be the same
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link3", url2).isNull());
// while with a different account, this is fine
QCOMPARE(folderman->checkPathValidityForNewFolder(dir.path() + "/link3", url3), QString());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link3").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link4").isNull());
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link3/folder").isNull());
+75
Ver Arquivo
@@ -31,6 +31,16 @@ bool itemDidCompleteSuccessfully(const QSignalSpy &spy, const QString &path)
return false;
}
SyncFileItem::Status itemDidCompleteWithStatus(const QSignalSpy &spy, const QString &path)
{
for(const QList<QVariant> &args : spy) {
SyncFileItem item = args[0].value<SyncFileItem>();
if (item.destination() == path)
return item._status;
}
return SyncFileItem::NoStatus;
}
class TestSyncEngine : public QObject
{
Q_OBJECT
@@ -54,6 +64,71 @@ private slots:
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}
void testFileUploadBundled() {
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
QVariantMap capBundle;
capBundle["bundlerequest"] = "1.0";
QVariantMap caps;
caps["dav"] = capBundle;
fakeFolder.getAccount()->setCapabilities(caps);
testFileUploadBundledAllFilesOK(fakeFolder);
testFileUploadBundledErrorForFile(fakeFolder);
//TODO unfinished, cannot generate NetworkError
//testFileUploadBundledNotHomeCollection(fakeFolder);
}
void testFileUploadBundledAllFilesOK(FakeFolder &fakeFolder) {
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
fakeFolder.localModifier().insert("A/a3");
fakeFolder.localModifier().insert("A/a4");
fakeFolder.syncOnce();
//check separate files
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "A/a3"));
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "A/a4"));
//check whole bundle
QVERIFY(itemDidCompleteSuccessfully(completeSpy, ""));
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}
void testFileUploadBundledErrorForFile(FakeFolder &fakeFolder) {
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
fakeFolder.localModifier().insert("A/a5");
fakeFolder.localModifier().insert("A/normalerrorfile");
fakeFolder.localModifier().insert("A/fatalerrorfile");
fakeFolder.localModifier().insert("A/softerrorfile");
fakeFolder.syncOnce();
//check separate files
QVERIFY(itemDidCompleteSuccessfully(completeSpy, "A/a5"));
QVERIFY(SyncFileItem::NormalError == itemDidCompleteWithStatus(completeSpy, "A/normalerrorfile"));
QVERIFY(SyncFileItem::FatalError == itemDidCompleteWithStatus(completeSpy, "A/fatalerrorfile"));
QVERIFY(SyncFileItem::SoftError == itemDidCompleteWithStatus(completeSpy, "A/softerrorfile"));
//check whole bundle
QVERIFY(itemDidCompleteSuccessfully(completeSpy, ""));
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}
void testFileUploadBundledNotHomeCollection(FakeFolder &fakeFolder) {
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
fakeFolder.localModifier().insert("A/a7");
fakeFolder.localModifier().insert("A/a8");
fakeFolder.localModifier().insert("B/b4");
//add the user "erroruser" which is not a FilesHomeCollection
fakeFolder.getAccount()->setUrl(QUrl(QStringLiteral("http://erroruser:admin@localhost/owncloud")));
fakeFolder.syncOnce();
//check whole bundle
QVERIFY(itemDidCompleteWithStatus(completeSpy, "") == SyncFileItem::SoftError);
//QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
}
void testDirDownload() {
FakeFolder fakeFolder{FileInfo::A12_B12_C12_S12()};
QSignalSpy completeSpy(&fakeFolder.syncEngine(), SIGNAL(itemCompleted(const SyncFileItem &, const PropagatorJob &)));
+6 -3
Ver Arquivo
@@ -13,13 +13,18 @@
using namespace OCC;
namespace {
const char testdbC[] = "/tmp";
}
class TestSyncJournalDB : public QObject
{
Q_OBJECT
public:
TestSyncJournalDB()
: _db("/tmp/csync-test.db")
: _db(testdbC)
{
}
@@ -36,8 +41,6 @@ private slots:
void cleanupTestCase()
{
const QString file = _db.databaseFilePath();
QFile::remove(file);
}
void testFileRecord()
-49
Ver Arquivo
@@ -5,9 +5,6 @@
*/
#include <QtTest>
#if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
#include <QTemporaryDir>
#endif
#include "utility.h"
@@ -153,52 +150,6 @@ private slots:
s = timeAgoInWords(earlyTS, laterTS );
QCOMPARE(s, QLatin1String("Less than a minute ago"));
}
void testFsCasePreserving()
{
qputenv("OWNCLOUD_TEST_CASE_PRESERVING", "1");
QVERIFY(fsCasePreserving());
qputenv("OWNCLOUD_TEST_CASE_PRESERVING", "0");
QVERIFY(! fsCasePreserving());
#if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
qunsetenv("OWNCLOUD_TEST_CASE_PRESERVING");
QVERIFY(isMac() || isWindows() ? fsCasePreserving() : ! fsCasePreserving());
#endif
}
void testFileNamesEqual()
{
#if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
qDebug() << "*** checking fileNamesEqual function";
QTemporaryDir dir;
QVERIFY(dir.isValid());
QDir dir2(dir.path());
QVERIFY(dir2.mkpath("test"));
if( !fsCasePreserving() ) {
QVERIFY(dir2.mkpath("TEST"));
}
QVERIFY(dir2.mkpath("test/TESTI"));
QVERIFY(dir2.mkpath("TESTI"));
QString a = dir.path();
QString b = dir.path();
QVERIFY(fileNamesEqual(a, b));
QVERIFY(fileNamesEqual(a+"/test", b+"/test")); // both exist
QVERIFY(fileNamesEqual(a+"/test/TESTI", b+"/test/../test/TESTI")); // both exist
qputenv("OWNCLOUD_TEST_CASE_PRESERVING", "1");
QVERIFY(fileNamesEqual(a+"/test", b+"/TEST")); // both exist
QVERIFY(!fileNamesEqual(a+"/test", b+"/test/TESTI")); // both are different
dir.remove();
qunsetenv("OWNCLOUD_TEST_CASE_PRESERVING");
#endif
}
};
QTEST_APPLESS_MAIN(TestUtility)
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>La llista d&apos;elements no sincronitzats s&apos;ha copiat al porta-retalls</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>S&apos;ha trobat un diari de sincronització antic &apos;%1&apos;, però no s&apos;ha pogut eliminar. Assegureu-vos que no hi ha cap aplicació que actualment en faci ús.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(copia de seguretat)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(copia de seguretat %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Estat indefinit.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>S&apos;està esperant per començar a sincronitzar.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>S&apos;està preparant per la sincronització.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>S&apos;està sincronitzant.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>La darrera sincronització va ser correcta.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>La última sincronització ha estat un èxit, però amb avisos en fitxers individuals.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Error de configuració.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Cancel·la usuari.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>La sincronització està en pausa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sync està pausat)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>No s&apos;ha seleccionat cap directori vàlid!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>La ruta seleccionada no és un directori!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>No teniu permisos per escriure en la carpeta seleccionada!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+23 -23
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Seznam nesynchronizovaných položek byl zkopírován do schránky.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Pokračováním v synchronizaci způsobí přepsání všech vašich souborů st
<translation>Byl nalezen starý záznam synchronizace &apos;%1&apos;, ale nebylo možné jej odebrat. Ujistěte se, že není aktuálně používán jinou aplikací.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (záloha)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (záloha %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Nedefinovaný stav.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Čeká na spuštění synchronizace.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Příprava na synchronizaci.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synchronizace probíhá.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Poslední synchronizace byla úspěšná.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Poslední synchronizace byla úspěšná, ale s varováním u některých souborů</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Chyba nastavení.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Zrušení uživatelem.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synchronizace pozastavena.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronizace je pozastavena)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Nebyl vybrán platný adresář!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Vybraná cesta nevede do adresáře!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nemáte oprávnění pro zápis do zvoleného adresáře!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 je již použit pro synchronizaci odesílání. Zvolte prosím jiný!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 již obsahuje podadresář použitý pro synchronizaci odesílání. Zvolte prosím jiný!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 je symbolickým obsahem. Cíl odkazu již obsahuje adresář použitý pro synchronizaci adresáře. Vyberte prosím jiný!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 je již obsažen ve adresáři použitém pro synchronizaci. Vyberte prosím jiný!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Místní adresář %1 je symbolickým obsahem. Cíl odkazu je již obsažen v adresáři použitém pro synchronizaci. Vyberte prosím jiný!</translation>
</message>
@@ -3341,7 +3341,7 @@ Nedoporučuje se jí používat.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="730"/>
<source>New account...</source>
<translation type="unfinished"/>
<translation>Nový účet...</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="748"/>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Die Liste der unsynchronisierten Dateien wurde in die Zwischenablage kopiert.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -766,102 +766,102 @@ Wenn diese Synchronisation fortgesetzt wird, werden Dateien eventuell von älter
<translation>Ein altes Synchronisations-Journal &apos;%1&apos; wurde gefunden, konnte jedoch nicht entfernt werden. Bitte stellen Sie sicher, dass keine Anwendung es verwendet.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(Sicherung)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(Sicherung %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Undefinierter Zustand.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Wartet auf Beginn der Synchronistation</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Synchronisation wird vorbereitet.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synchronisation läuft.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Die letzte Synchronisation war erfolgreich.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Letzte Synchronisation war erfolgreich, aber mit Warnungen für einzelne Dateien.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Installationsfehler.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Benutzer-Abbruch</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synchronisation wurde angehalten.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronisation ist pausiert)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Kein gültige Ordner gewählt!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Der gewählte Pfad ist kein Ordner!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Sie haben keine Schreibberechtigung für den ausgewählten Ordner!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 wird bereits als Synchronisationsordner benutzt. Bitte wählen Sie einen anderen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 liegt innerhalb eines synchronisierten Ordners. Bitte wählen Sie einen anderen aus!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 ist ein symbolischer Link. Das Ziel des Links beinhaltet schon einen Ordner, der in einer anderen Synchronisation liegt. Bitte wählen Sie einen anderen lokalen Ordner aus!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 liegt in einem Ordner, der bereits synchronisiert wird. Bitte wählen Sie einen anderen aus!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Der lokale Ordner %1 ist ein symbolischer Link. Das Ziel des Links liegt in einem Ordner, der schon synchronisiert wird. Bitte wählen Sie einen anderen aus!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Ο κατάλογος των μη-συγχρονισμένων αρχείων έχει αντιγραφθεί στο Πρόχειρο</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Βρέθηκε ένα παλαιότερο αρχείο συγχρονισμού &apos;%1&apos;, αλλά δεν μπόρεσε να αφαιρεθεί. Παρακαλώ βεβαιωθείτε ότι καμμία εφαρμογή δεν το χρησιμοποιεί αυτή τη στιγμή.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(αντίγραφο ασφαλείας)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(αντίγραοφ ασφαλέιας %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Απροσδιόριστη Κατάσταση.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Αναμονή έναρξης συγχρονισμού.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Προετοιμασία για συγχρονισμό.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Ο συγχρονισμός εκτελείται.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής, αλλά υπήρχαν προειδοποιήσεις σε συγκεκριμένα αρχεία.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Σφάλμα Ρύθμισης.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Ματαίωση από Χρήστη.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Παύση συγχρονισμού.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Παύση συγχρονισμού)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Δεν επιλέχθηκε έγκυρος φάκελος!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Η επιλεγμένη διαδρομή δεν είναι φάκελος!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Δεν έχετε δικαιώματα εγγραφής στον επιλεγμένο φάκελο!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 χρησιμοποιείται ήδη σε μια σύνδεση συγχρονισμού φακέλου. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 περιέχει ήδη ένα φάκελο που χρησιμοποιείται σε μια σύνδεση συγχρονισμού φακέλου. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 είναι συμβολικός σύνδεσμος. Ο σύνδεσμος που παραπέμπει περιέχει ήδη ένα φάκελο που βρίσκεται σε συγχρονισμό. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 περιέχεται ήδη σε φάκελο που χρησιμοποιείται σε μια σύνδεση συγχρονισμού. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Ο τοπικός φάκελος %1 είναι συμβολικός σύνδεσμος. Ο σύνδεσμος που παραπέμπει περιέχεται ήδη σε φάκελο που βρίσκεται σε συγχρονισμό. Παρακαλώ επιλέξτε άλλον!</translation>
</message>
+21 -21
Ver Arquivo
@@ -406,7 +406,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -791,102 +791,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"></translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>La lista de elementos no sincronizados se ha copiado al portapapeles.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Si continua con la sincronización todos los archivos serán remplazados por su
<translation>Se ha encontrado un antiguo registro de sincronización &apos;%1&apos;; pero no se ha podido eliminar. Por favor, asegúrese de que ninguna aplicación la esté utilizando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(copia de seguridad)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(copia de seguridad %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Estado no definido.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Esperando para comenzar la sincronización.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Preparándose para sincronizar.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Sincronización en funcionamiento.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>La última sincronización se ha realizado con éxito.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>La última sincronización salió bien; pero hay advertencias para archivos individuales.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Error de configuración.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Interrumpido por el usuario.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>La sincronización está en pausa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sincronización en pausa)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>¡La carpeta seleccionada no es válida!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>¡La ruta seleccionada no es un directorio!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>¡Usted no tiene permiso para escribir en la carpeta seleccionada!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 ya se usa en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 ya contiene un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 es un enlace simbólico. El objetivo del enlace ya contiene un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 está dentro de un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>El directorio local %1 es un enlace simbólico. El objetivo está incluido en un directorio usado en una conexión de sincronización de directorios. Por favor, elija otro.</translation>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Una antigua sincronización con journaling &apos;%1&apos; fue encontrada, pero no se pudo eliminar. Por favor, asegurate que ninguna aplicación la está utilizando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Estado no definido.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Preparando la sincronización.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Sincronización en funcionamiento.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>La última sincronización fue exitosa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>El último Sync fue exitoso, pero hubo advertencias en archivos individuales.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Error de configuración.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Interrumpir.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>La sincronización está en pausa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sincronización en pausa)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>¡No tenés permisos para escribir el directorio seleccionado!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Leiti vana sünkroniseeringu zurnaal &apos;%1&apos;, kuid selle eemaldamine ebaõnnenstus. Palun veendu, et seda kasutaks ükski programm.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(varukoopia)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (varukoopia %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Määramata staatus.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Oodatakse sünkroonimise alustamist.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Valmistun sünkroniseerima.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Sünkroniseerimine on käimas.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Viimane sünkroniseerimine oli edukas.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Viimane sünkroniseering oli edukas, kuid mõned failid põhjustasid tõrkeid.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Seadistamise viga.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Kasutaja tühistamine.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Sünkroniseerimine on peatatud.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sünkroniseerimine on peatatud)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Sobilikku kausta pole valitud!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Valitud asukoht pole kaust!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Sul puuduvad õigused valitud kataloogi kirjutamiseks!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Aurkitu da &apos;%1&apos; sinkronizazio erregistro zaharra, baina ezin da ezabatu. Ziurtatu aplikaziorik ez dela erabiltzen ari.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Definitu gabeko egoera.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Itxoiten sinkronizazioa hasteko.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Sinkronizazioa prestatzen.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Sinkronizazioa martxan da.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Azkeneko sinkronizazioa ongi burutu zen.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Azkenengo sinkronizazioa ongi burutu zen, baina banakako fitxategi batzuetan abisuak egon dira.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Konfigurazio errorea.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Erabiltzaileak bertan behera utzi.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Sinkronizazioa pausatuta dago.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Sinkronizazioa pausatuta dago)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Ez da karpeta egokirik hautatu!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Hautatutako bidea ez da karpeta bat!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Ez daukazu hautatutako karpetan idazteko baimenik!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (backup)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (پشتیبان %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>موقعیت تعریف نشده</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>آماده سازی برای همگام سازی کردن.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>همگام سازی در حال اجراست</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>آخرین همگام سازی موفقیت آمیز بود</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>خطا در پیکر بندی.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>خارج کردن کاربر.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>همگام سازی فعلا متوقف شده است</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (همگامسازی موقتا متوقف شده است)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>هیچ پوشهی معتبری انتخاب نشده است!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>شما اجازه نوشتن در پوشه های انتخاب شده را ندارید!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -763,102 +763,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (varmuuskopio)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (varmuuskopio %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Määrittelemätön tila.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Odotetaan synkronoinnin aloitusta.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Valmistellaan synkronointia.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synkronointi on meneillään.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Viimeisin synkronointi suoritettiin onnistuneesti.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Viimeisin synkronointi onnistui, mutta yksittäisten tiedostojen kanssa ilmeni varoituksia.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Asetusvirhe.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synkronointi on keskeytetty.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synkronointi on keskeytetty)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Kelvollista kansiota ei ole valittu!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Valittu polku ei ole kansio!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Sinulla ei ole kirjoitusoikeutta valittuun kansioon!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Paikallinen kansio %1 on jo käytössä kansion synkronointiyhteydessä. Valitse toinen kansio!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Paikallinen kansio %1 sisältää kansion, jota käytetään kansion synkronointiyhteydessä. Valitse toinen kansio!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>La liste des éléments non synchronisés a é copiée dans le presse-papier.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Un ancien fichier journal &apos;%1&apos; a é trouvé, mais ne peut être supprimé. Veuillez vous assurer quaucune application ne l&apos;utilise en ce moment.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(sauvegarde)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(sauvegarde %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Statut indéfini.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>En attente de synchronisation.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Préparation de la synchronisation.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>La synchronisation est en cours.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Dernière synchronisation effectuée avec succès</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>La dernière synchronisation s&apos;est achevée avec succès mais avec des avertissement à propos de certains fichiers.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Erreur d&apos;installation.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Abandon par l&apos;utilisateur.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>La synchronisation est en pause.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronisation en pause)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Aucun dossier valable sélectionné !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Le chemin sélectionné n&apos;est pas un dossier !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Vous n&apos;avez pas la permission d&apos;écrire dans le dossier sélectionné !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 est déjà utilisé pour une synchronisation de dossiers. Veuillez en choisir un autre !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 contient un dossier déjà utilisé pour une synchronisation de dossiers. Veuillez en choisir un autre !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 est un lien symbolique. Le dossier vers lequel le lien pointe contient un dossier déjà utilisé pour une synchronisation de dossier. Veuillez en choisir un autre !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 se trouve dans un dossier déjà configuré pour une synchronisation de dossier. Veuillez en choisir un autre !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Le dossier local %1 est un lien symbolique. Le dossier vers lequel le lien pointe est inclus dans un dossier déjà configuré pour une synchronisation de dossier. Veuillez en choisir un autre !</translation>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -763,102 +763,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Atopouse un rexistro de sincronización antigo en «%1» máis non pode ser retirado. Asegúrese de que non o está a usar ningunha aplicación.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(copia de seguranza)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(copia de seguranza %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Estado sen definir.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Preparando para sincronizar.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Estase sincronizando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>A última sincronización fíxose correctamente.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>A última sincronización fíxose correctamente, mais con algún aviso en ficheiros individuais.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Erro de configuración.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Interrompido polo usuario.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Sincronización en pausa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (sincronización en pausa)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Non seleccionou ningún cartafol correcto!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Vostede non ten permiso para escribir neste cartafol!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>A nem szinkronizált elemek a vágólapra másolva.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(biztonsági mentés)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(biztonsági mentés: %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Ismeretlen állapot.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Várakozás a szinkronizálás elindítására.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Előkészítés szinkronizációhoz.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Szinkronizálás fut.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Legutolsó szinkronizálás sikeres volt.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Az utolsó szinkronizáció sikeresen lefutott, de néhány figyelmeztetés van.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Beállítás hiba.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Felhasználó megszakította.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Szinkronizálás megállítva.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (szinkronizálás megállítva)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Nincs érvényes könyvtár kiválasztva!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>A kiválasztott elérési út nem könyvtár!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nincs joga a kiválasztott könyvtár írásához!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>L&apos;elenco di elementi non sincronizzati è stato copiato negli appunti.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Se continui normalmente la sincronizzazione provocherai la sovrascrittura di tut
<translation>È stato trovato un vecchio registro di sincronizzazione &apos;%1&apos;, ma non può essere rimosso. Assicurati che nessuna applicazione lo stia utilizzando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(copia di sicurezza)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(copia di sicurezza %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Stato non definito.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>In attesa di iniziare la sincronizzazione.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Preparazione della sincronizzazione.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>La sincronizzazione è in corso.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>L&apos;ultima sincronizzazione è stata completata correttamente.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Ultima sincronizzazione avvenuta, ma con avvisi relativi a singoli file.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Errore di configurazione.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Interrotto dall&apos;utente.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>La sincronizzazione è sospesa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation> %1 (La sincronizzazione è sospesa)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Nessuna cartella valida selezionata!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Il percorso selezionato non è una cartella!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Non hai i permessi di scrittura per la cartella selezionata!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 è già utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 contiene già una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 è un collegamento simbolico. La destinazione del collegamento contiene già una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 è già contenuta in una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>La cartella locale %1 è un collegamento simbolico. La destinazione del collegamento è già contenuta in una cartella utilizzata in una connessione di sincronizzazione delle cartelle. Selezionane un&apos;altra!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation></translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation> &apos;%1&apos; 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(%1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 ()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 </translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Listen med usynkroniserte elementer er kopiert til utklippstavlen.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Hvis synkroniseringen fortsetter som normalt, vil alle filene dine bli overskrev
<translation>En gammel synkroniseringsjournal &apos;%1&apos; ble funnet men kunne ikke fjernes. Pass at ingen applikasjoner bruker den.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (sikkerhetskopi)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (sikkerhetskopi %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Udefinert tilstand.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Venter å starte synkronisering.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Forbereder synkronisering.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synkronisering kjører.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Siste synkronisering var vellykket.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Siste synkronisering var vellykket, men med advarsler enkelte filer.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Feil med oppsett.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Brukeravbrudd.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synkronisering er satt pause.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synkronisering er satt pause)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Ingen gyldig mappe valgt!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Den valgte stien er ikke en mappe!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Du har ikke skrivetilgang til den valgte mappen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 er allerede brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 inneholder allerede en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 er en symbolsk lenke. Målet for lenken inneholder allerede en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 er allerede en undermappe av en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokale mappen %1 er en symbolsk lenke. Målet for lenken er allerede en undermappe av en mappe brukt i en mappe-synkronisering. Velg en annen!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>De lijst met niet gesyncte objecten is gekopieerd naar het klembord.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Doorgaan met deze synchronisatie overschrijft al uw bestanden door een eerdere v
<translation>Een oud synchronisatieverslag &apos;%1&apos; is gevonden maar kan niet worden verwijderd. Zorg ervoor dat geen applicatie dit bestand gebruikt.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(backup)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(backup %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Ongedefiniëerde staat</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>In afwachting van synchronisatie.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Synchronisatie wordt voorbereid</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Bezig met synchroniseren.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Laatste synchronisatie was geslaagd.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Laatste synchronisatie geslaagd, maar met waarschuwingen over individuele bestanden.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Installatiefout.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Afgebroken door gebruiker.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synchronisatie gepauzeerd.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronisatie onderbroken)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Geen geldige map geselecteerd!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Het geselecteerde pad is geen map!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>U heeft geen permissie om te schrijven naar de geselecteerde map!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Lokale map %1 wordt al in de mapsync gebruikt. Kies een andere map!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokale map %1 bevat al een map die wordt gebruikt voor een mapsync verbinding. Kies een andere!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokale map %1 is een symbolische link. De doellink bevat al een map die in een mapsync verbinding wordt gebruikt. Kies een andere!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokale map %1 zit al in een map die wordt gebruikt voor een mapsync verbinding. Kies een andere!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokale map %1 is een symbolische link. De doellink zit al in een map die in een mapsync verbinding wordt gebruikt. Kies een andere!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Lista niezsynchronizowanych plików została skopiowana do schowka.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Stary sync journal &apos;%1&apos; został znaleziony, lecz nie mógł być usunięty. Proszę się upewnić, że żaden program go obecnie nie używa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(kopia zapasowa)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(kopia zapasowa %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Niezdefiniowany stan</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Poczekaj na rozpoczęcie synchronizacji.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Przygotowuję do synchronizacji</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synchronizacja w toku</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Ostatnia synchronizacja zakończona powodzeniem.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Ostatnia synchronizacja udana, ale istnieją ostrzeżenia z pojedynczymi plikami.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Błąd ustawień.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Użytkownik anulował.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synchronizacja wstrzymana</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation> %1 (Synchronizacja jest zatrzymana)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Nie wybrano poprawnego folderu.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Wybrana ścieżka nie jest katalogiem!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nie masz uprawnień, aby zapisywać w tym katalogu!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Wybrany folder lokalny %1 jest już użyty na potrzeby innej synchronizacji. Proszę wybrać inny folder lokalny.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokalny folder %1 już zawiera folder użyty na potrzeby synchronizacji. Proszę wybrać inny folder lokalny.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokalny folder %1 jest dowiązaniem symbolicznym. Cel dowiązania zawiera folder użyty na potrzeby innej synchronizacji. Proszę wybrać inny folder lokalny bądź dowiązanie.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Lokalny folder %1 już zawiera folder użyty na potrzeby synchronizacji. Proszę wybrać inny folder lokalny.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>A lista de itens não sincronizados foi copiada para a área de transferência.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Foi encontrado um &apos;journal&apos; de sincronização, mas não foi possível removê-lo. Por favor, certifique-se que nenhuma aplicação o está a utilizar.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(cópia de segurança)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(cópia de segurança %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Estado indefinido.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>A aguardar para iniciar a sincronização.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>A preparar para sincronizar.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>A sincronização está em execução.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>A última sincronização foi bem sucedida.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>A última sincronização foi bem sucedida, mas com avisos nos ficheiros individuais.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Erro de instalação.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Abortado pelo utilizador.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>A sincronização está pausada.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (A sincronização está pausada)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Não foi selecionada nenhuma pasta válida!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>O caminho selecionado não é uma pasta!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Não tem permissão para gravar para a pasta selecionada!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 foi utilizada numa ligação de sincronização da pasta. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 contém uma pasta utilizada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 é uma hiperligação simbólica. A hiperligação de destino contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 é uma hiperligação simbólica. A hiperligação de destino contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>A lista de itens não sincronizados foi copiada para a área de transferência.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Continuar a sincronização como normal fará com que todos os seus arquivos sej
<translation>Uma velha revista de sincronização &apos;%1&apos; foi encontrada, mas não pôde ser removida. Por favor, certifique-se de que nenhuma aplicação está a usá-la.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (backup)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (backup %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Estado indefinido.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>À espera do início da sincronização.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Preparando para sincronização.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>A sincronização está ocorrendo.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>A última sincronização foi feita com sucesso.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>A última sincronização foi executada com sucesso, mas com advertências em arquivos individuais.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Erro de Configuração.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Usuário Abortou.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Sincronização pausada.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Pausa na Sincronização) </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Nenhuma pasta válida selecionada!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>O caminho selecionado não é uma pasta!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Voce não tem permissão para escrita na pasta selecionada!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 está sendo utilizada em uma conexão de sincronização de pastas. Por favor, escolha uma outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 contém uma pasta utilizada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 é um link simbólico. O destino do link contém uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 está contida em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>A pasta local %1 é um link simbólico. O destino do link está contido em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
</message>
+27 -27
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Список несинхронизированных элементов скопирован в буфер обмена.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Найден старый журнал синхронизации &apos;%1&apos;, и он не может быть удалён. Убедитесь что он не открыт в другом приложении.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(бэкап)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(бэкап %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Неопределенное состояние.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Ожидание запуска синхронизации.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Подготовка к синхронизации.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Идет синхронизация.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Последняя синхронизация прошла успешно.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Последняя синхронизация прошла успешно, но были предупреждения для некоторых файлов.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Ошибка установки.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Отмена пользователем.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Синхронизация приостановлена.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%! (синхронизация приостановлена)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Не выбран валидный каталог!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Выбранный путь не является папкой!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>У вас недостаточно прав для записи в выбранный каталог!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Локальная папка %1 уже используется для синхронизации. Пожалуйста выберите другую!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Локальная папка %1 уже содержит папку, которая используется для синхронизации. Пожалуйста выберите другую!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Локальная папка %1 является символьной ссылкой. Эта ссылка уже содержит папку для синхронизации. Пожалуйста выберите другую!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Локальная папка %1 уже содержит папку, которая используется для синхронизации. Пожалуйста выберите другую!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Локальная папка %1 является символьной ссылкой. Эта ссылка уже содержит папку, которая используется для синхронизации. Пожалуйста укажите другую!</translation>
</message>
@@ -2157,17 +2157,17 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/propagateuploadng.cpp" line="441"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
<translation>Неожиданный код завершения от сервера (%1)</translation>
</message>
<message>
<location filename="../src/libsync/propagateuploadng.cpp" line="448"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
<translation>Отсутствует код файла от сервера</translation>
</message>
<message>
<location filename="../src/libsync/propagateuploadng.cpp" line="461"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
<translation>Отсутствует ETag с сервера</translation>
</message>
</context>
<context>
@@ -3338,7 +3338,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="730"/>
<source>New account...</source>
<translation type="unfinished"/>
<translation>Новая учётная запись</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="748"/>
@@ -3387,7 +3387,7 @@ It is not advisable to use it.</source>
<message>
<location filename="../src/libsync/owncloudtheme.cpp" line="47"/>
<source>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/help/desktop-file-sync&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;p&gt;Версия %2. За известными проблемами и помощью обращайтесь по ссылке &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Авторы: Клаас Фрейтаг, Дэниель Молкентен, Оливье Гоффар, Маркус Гётц, Жан-Кристоф Бошар, и другие.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Авторские права принадлежат ownCloud GmbH&lt;/p&gt;&lt;p&gt;Лицензировано под GNU General Public License (GPL) версии 2.0&lt;br/&gt;ownCloud и логотип ownCloud — зарегистрированные торговые марки ownCloud GmbH в Соединённых Штатах, и/или других странах.&lt;/p&gt;</translation>
</message>
</context>
<context>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Zoznam nesynchronizovaných položiek bol skopírovaný do schránky.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Starý synchronizačný žurnál &apos;%1&apos; nájdený, avšak neodstrániteľný. Prosím uistite sa, že žiadna aplikácia ho práve nevyužíva.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (záloha)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (záloha %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Nedefinovaný stav.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Čaká sa na začiatok synchronizácie</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Príprava na synchronizáciu.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synchronizácia prebieha.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Posledná synchronizácia sa úspešne skončila.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Posledná synchronizácia bola úspešná, ale s varovaniami pre individuálne súbory.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Chyba pri inštalácii.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Zrušené používateľom.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synchronizácia je pozastavená.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synchronizácia je pozastavená)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Nebol zvolený platný priečinok.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Zvolená cesta nie je priečinok.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Nemáte oprávnenia pre zápis do daného priečinka!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+26 -26
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Seznam neusklajenih predmetov je kopiran v odložišče.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Z nadaljevanjem usklajevanja bodo vse trenutne datoteke prepisane s starejšimi
<translation>Obstaja starejši dnevnik usklajevanja &apos;%1&apos;, vendar ga ni mogoče odstraniti. Preverite, ali je datoteka v uporabi.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(varnostna kopija)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(varnostna kopija %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Nedoločeno stanje.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Čakanje začetek usklajevanja</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Poteka priprava za usklajevanje.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Usklajevanje je v teku.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Zadnje usklajevanje je bilo uspešno končano.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Zadnje usklajevanje je bilo sicer uspešno, vendar z opozorili za posamezne datoteke.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Napaka nastavitve.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Uporabniška prekinitev.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Usklajevanje je začasno v premoru.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (usklajevanje je v premoru)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Ni izbrane veljavne mape!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Izbrana pot ni mapa!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Ni ustreznih dovoljenj za pisanje v izbrano mapo!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 je že v določena za usklajevanje. Izbrati je treba drugo.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 že vključuje mapo, ki je določena za usklajevanje. Izbrati je treba drugo.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 je simbolna povezava. Cilj povezave že vsebuje mapo, ki je uporabljena pri povezavi usklajevanja mape. Izberite drugo.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 je že v določena za usklajevanje. Izbrati je treba drugo.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Krajevna mapa %1 je simbolna povezava. Cilj povezave že vsebuje mapo, ki je uporabljena pri povezavi usklajevanja mape. Izberite drugo.</translation>
</message>
@@ -2160,17 +2160,17 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/libsync/propagateuploadng.cpp" line="441"/>
<source>Unexpected return code from server (%1)</source>
<translation type="unfinished"/>
<translation>Napaka: nepričakovan odziv s strežnika (%1).</translation>
</message>
<message>
<location filename="../src/libsync/propagateuploadng.cpp" line="448"/>
<source>Missing File ID from server</source>
<translation type="unfinished"/>
<translation>Na strežniku manjka ID datoteke</translation>
</message>
<message>
<location filename="../src/libsync/propagateuploadng.cpp" line="461"/>
<source>Missing ETag from server</source>
<translation type="unfinished"/>
<translation>Na strežniku manjka ETag datoteke</translation>
</message>
</context>
<context>
@@ -3341,7 +3341,7 @@ Uporaba ni priporočljiva.</translation>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="730"/>
<source>New account...</source>
<translation type="unfinished"/>
<translation>Nov račun ...</translation>
</message>
<message>
<location filename="../src/gui/owncloudgui.cpp" line="748"/>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Пронађен је стари журнал синхронизације %1 али се не може уклонити. Проверите да га нека апликација тренутно не користи.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (резерва)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (резерва %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Неодређено стање.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Припремам синхронизацију.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Синхронизација у току.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Последња синхронизација је била успешна.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Последња синхронизација је била успешна али са упозорењима за поједине фајлове.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Грешка подешавања.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Корисник прекинуо.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Синхронизација је паузирана.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (синхронизација паузирана)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Немате дозволе за упис у изабрану фасциклу!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Listan över osynkroniserade objekt har kopierats till urklipp.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Om du fortsätter synkningen kommer alla dina filer återställas med en äldre
<translation>En gammal synkroniseringsjournal &apos;%1&apos; hittades, men kunde inte raderas. Vänligen se till att inga program för tillfället använder den.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(säkerhetskopia)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(säkerhetkopia %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Okänt tillstånd.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Väntar att starta synkronisering.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Förbereder synkronisering</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Synkronisering pågår.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Senaste synkronisering lyckades.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Senaste synkning lyckades, men det finns varningar för vissa filer!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Inställningsfel.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Användare Avbryt</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Synkronisering är pausad.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Synk är stoppad)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Ingen giltig mapp markerad!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Den markerade sökvägen är inte en mapp!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Du har inga skrivrättigheter till den valda mappen!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 synkas redan. Var god välj en annan!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 innehåller redan en mapp som synkas. Var god välj en annan!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 är en symbolisk länk. Länkmålet innehåller redan en mapp som synkas. Var god välj en annan!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 finns redan inuti en mapp som synkas. Var god välj en annan!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>Den lokala mappen %1 är en symbolisk länk. Länkmålet finns redan inuti en mapp som synkas. Var god välj en annan!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation></translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -767,102 +767,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation> &apos;%1&apos; </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>( %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation> </translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 ()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation> %1 !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 !</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1
!</translation>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>Eşitlenmemiş ögelerin listesi panoya kopyalandı.</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Eski eşitleme günlüğü &apos;%1&apos; bulundu ancak kaldırılamadı. Başka bir uygulama tarafından kullanılmadığından emin olun.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> (yedek)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> (yedek %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Tanımlanmamış Durum.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation>Eşitlemenin başlanması bekleniyor.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Eşitleme için hazırlanıyor.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Eşitleme çalışıyor.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Son Eşitleme başarılı oldu.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Son eşitleme başarılıydı, ancak tekil dosyalarda uyarılar vardı.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Kurulum Hatası.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Kullanıcı İptal Etti.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Eşitleme duraklatıldı.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Eşitleme duraklatıldı)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation>Geçerli klasör seçilmedi!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>Seçilen yol bir klasör değil!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>Seçilen klasöre yazma izniniz yok!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü zaten bir eşitleme bağlantısında kullanılan klasördür. Lütfen farklı bir seçim yapın!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü zaten bir eşitleme klasörü içermektedir. Lütfen farklı bir seçim yapın!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü sembolik bağlantıdır. Bu bağlantının işaretlediği klasörde zaten yapılandırılmış bir klasör mevcut. Lütfen farklı bir seçim yapın!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü zaten bir eşitleme klasörü içindedir. Lütfen farklı bir seçim yapın!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation>%1 yerel klasörü sembolik bağlantıdır. Bu bağlantının işaretlediği klasör zaten yapılandırılmış bir klasör içindedir. Lütfen farklı bir seçim yapın!</translation>
</message>
+21 -21
Ver Arquivo
@@ -404,7 +404,7 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
@@ -762,102 +762,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>Знайдено старий журнал синхронізації &apos;%1&apos;, його неможливо видалити. Будь ласка, впевніться що він не відкритий в іншій програмі.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation>(Резервна копія)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>(Резервна копія %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation>Невизначений стан.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation>Підготовка до синхронізації</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation>Синхронізація запущена.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation>Остання синхронізація була успішною.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation>Остання синхронізація пройшла вдало, але були зауваження про деякі файли.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation>Помилка встановлення.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>Скасовано користувачем.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation>Синхронізація призупинена.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 (Синхронізація призупинена)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>У вас немає прав на запис в цю теку!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation type="unfinished"/>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation></translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation> &apos;%1&apos; 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation> ()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation> ( %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 ()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of unsynched items has been copied to the clipboard.</source>
<translation>簿</translation>
<source>The list of unsynced items has been copied to the clipboard.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="625"/>
@@ -765,102 +765,102 @@ Continuing the sync as normal will cause all your files to be overwritten by an
<translation>&apos;%1&apos;使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="964"/>
<location filename="../src/gui/folderman.cpp" line="963"/>
<source> (backup)</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="969"/>
<location filename="../src/gui/folderman.cpp" line="968"/>
<source> (backup %1)</source>
<translation>( %1)</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1176"/>
<location filename="../src/gui/folderman.cpp" line="1175"/>
<source>Undefined State.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1179"/>
<location filename="../src/gui/folderman.cpp" line="1178"/>
<source>Waiting to start syncing.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1182"/>
<location filename="../src/gui/folderman.cpp" line="1181"/>
<source>Preparing for sync.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1185"/>
<location filename="../src/gui/folderman.cpp" line="1184"/>
<source>Sync is running.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1188"/>
<location filename="../src/gui/folderman.cpp" line="1187"/>
<source>Last Sync was successful.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1193"/>
<location filename="../src/gui/folderman.cpp" line="1192"/>
<source>Last Sync was successful, but with warnings on individual files.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<source>Setup Error.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1199"/>
<location filename="../src/gui/folderman.cpp" line="1198"/>
<source>User Abort.</source>
<translation>使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1202"/>
<location filename="../src/gui/folderman.cpp" line="1201"/>
<source>Sync is paused.</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1208"/>
<location filename="../src/gui/folderman.cpp" line="1207"/>
<source>%1 (Sync is paused)</source>
<translation>%1 ()</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1216"/>
<location filename="../src/gui/folderman.cpp" line="1215"/>
<source>No valid folder selected!</source>
<translation></translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1227"/>
<location filename="../src/gui/folderman.cpp" line="1226"/>
<source>The selected path is not a folder!</source>
<translation>!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1231"/>
<location filename="../src/gui/folderman.cpp" line="1230"/>
<source>You have no permission to write to the selected folder!</source>
<translation>!</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1246"/>
<location filename="../src/gui/folderman.cpp" line="1245"/>
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1251"/>
<location filename="../src/gui/folderman.cpp" line="1250"/>
<source>The local folder %1 already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1258"/>
<location filename="../src/gui/folderman.cpp" line="1257"/>
<source>The local folder %1 is a symbolic link. The link target already contains a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1265"/>
<location filename="../src/gui/folderman.cpp" line="1264"/>
<source>The local folder %1 is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1271"/>
<location filename="../src/gui/folderman.cpp" line="1270"/>
<source>The local folder %1 is a symbolic link. The link target is already contained in a folder used in a folder sync connection. Please pick another one!</source>
<translation> %1 使</translation>
</message>