Comparar commits
35 Commits
| Autor | SHA1 | Data | |
|---|---|---|---|
| a139d1a279 | |||
| 13e624c38f | |||
| 276985f6c3 | |||
| 49f8143f00 | |||
| bea7241910 | |||
| 61b4da944c | |||
| 6fe1868693 | |||
| 9641c7a1e7 | |||
| 3e59a9b316 | |||
| 16e28567a6 | |||
| 3bef42db6b | |||
| 27d23edacc | |||
| e1a48e3c33 | |||
| 5d13f9290f | |||
| c84140d293 | |||
| 838c072ccc | |||
| ed6a708460 | |||
| 0c9dcdafc2 | |||
| f0dc3b2deb | |||
| 84ede3f01f | |||
| 2daf895e43 | |||
| 3b651b2da9 | |||
| 6fd930908c | |||
| 62125a442d | |||
| 2d54fb2ff9 | |||
| e46fad52bb | |||
| f3cfd2b70b | |||
| 78caa1a712 | |||
| 0884ad6517 | |||
| 37fc4e4332 | |||
| 9cc90159f1 | |||
| 4ceee86c66 | |||
| b9ea7c3414 | |||
| 3033e693be | |||
| a1bc01d3b1 |
+8
-13
@@ -114,7 +114,7 @@ void csync_create(CSYNC **csync, const char *local) {
|
||||
*csync = ctx;
|
||||
}
|
||||
|
||||
void csync_init(CSYNC *ctx) {
|
||||
void csync_init(CSYNC *ctx, const char *db_file) {
|
||||
assert(ctx);
|
||||
/* Do not initialize twice */
|
||||
|
||||
@@ -125,6 +125,9 @@ void csync_init(CSYNC *ctx) {
|
||||
|
||||
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);
|
||||
|
||||
@@ -146,19 +149,11 @@ int csync_update(CSYNC *ctx) {
|
||||
}
|
||||
ctx->status_code = CSYNC_STATUS_OK;
|
||||
|
||||
/* 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) {
|
||||
/* Path of database file is set in csync_init */
|
||||
if (csync_statedb_load(ctx, ctx->statedb.file, &ctx->statedb.db) < 0) {
|
||||
rc = -1;
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
ctx->status_code = CSYNC_STATUS_OK;
|
||||
|
||||
@@ -515,7 +510,6 @@ 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);
|
||||
}
|
||||
|
||||
@@ -572,6 +566,7 @@ 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
@@ -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);
|
||||
void OCSYNC_EXPORT csync_init(CSYNC *ctx, const char *db_file);
|
||||
|
||||
/**
|
||||
* @brief Update detection
|
||||
|
||||
@@ -230,6 +230,11 @@ 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;
|
||||
|
||||
@@ -704,8 +704,6 @@ 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;
|
||||
|
||||
@@ -744,35 +742,6 @@ 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);
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "csync_private.h"
|
||||
|
||||
static void setup(void **state) {
|
||||
static int setup(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -33,9 +33,11 @@ static void setup(void **state) {
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
|
||||
*state = csync;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void setup_module(void **state) {
|
||||
static int setup_module(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -44,11 +46,13 @@ static void setup_module(void **state) {
|
||||
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
|
||||
csync_init(csync);
|
||||
csync_init(csync, "foo");
|
||||
*state = csync;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown(void **state) {
|
||||
static int teardown(void **state) {
|
||||
CSYNC *csync = *state;
|
||||
int rc;
|
||||
|
||||
@@ -61,6 +65,8 @@ static void teardown(void **state) {
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check_csync_commit(void **state)
|
||||
@@ -88,10 +94,10 @@ static void check_csync_commit_dummy(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
const UnitTest tests[] = {
|
||||
unit_test_setup_teardown(check_csync_commit, setup, teardown),
|
||||
unit_test_setup_teardown(check_csync_commit_dummy, setup_module, teardown),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -50,11 +50,11 @@ static void check_csync_create(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
const UnitTest tests[] = {
|
||||
unit_test(check_csync_destroy_null),
|
||||
unit_test(check_csync_create),
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(check_csync_destroy_null),
|
||||
cmocka_unit_test(check_csync_create),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -29,15 +29,16 @@
|
||||
|
||||
#define EXCLUDE_LIST_FILE SOURCEDIR"/../sync-exclude.lst"
|
||||
|
||||
static void setup(void **state) {
|
||||
static int setup(void **state) {
|
||||
CSYNC *csync;
|
||||
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
|
||||
*state = csync;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void setup_init(void **state) {
|
||||
static int setup_init(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -59,9 +60,10 @@ static void setup_init(void **state) {
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = csync;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown(void **state) {
|
||||
static int teardown(void **state) {
|
||||
CSYNC *csync = *state;
|
||||
int rc;
|
||||
|
||||
@@ -74,6 +76,8 @@ static void teardown(void **state) {
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check_csync_exclude_add(void **state)
|
||||
@@ -143,6 +147,17 @@ 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);
|
||||
@@ -380,16 +395,16 @@ static void check_csync_exclude_expand_escapes(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
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),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "csync_private.h"
|
||||
|
||||
static void setup(void **state) {
|
||||
static int setup(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -33,9 +33,10 @@ static void setup(void **state) {
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
|
||||
*state = csync;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void setup_module(void **state) {
|
||||
static int setup_module(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -45,9 +46,10 @@ static void setup_module(void **state) {
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
|
||||
*state = csync;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown(void **state) {
|
||||
static int teardown(void **state) {
|
||||
CSYNC *csync = *state;
|
||||
int rc;
|
||||
|
||||
@@ -60,24 +62,27 @@ static void 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 UnitTest tests[] = {
|
||||
unit_test_setup_teardown(check_csync_init, setup, teardown),
|
||||
unit_test_setup_teardown(check_csync_init, setup_module, teardown),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include "csync_log.c"
|
||||
#include "c_private.h"
|
||||
|
||||
static void setup(void **state) {
|
||||
static int setup(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -36,9 +36,11 @@ static void setup(void **state) {
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
|
||||
*state = csync;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown(void **state) {
|
||||
static int teardown(void **state) {
|
||||
CSYNC *csync = *state;
|
||||
int rc;
|
||||
|
||||
@@ -51,6 +53,8 @@ static void teardown(void **state) {
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check_log_callback(int verbosity,
|
||||
@@ -134,11 +138,11 @@ static void check_logging(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
const UnitTest tests[] = {
|
||||
unit_test(check_set_log_level),
|
||||
unit_test(check_set_auth_callback),
|
||||
unit_test_setup_teardown(check_logging, setup, teardown),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -48,10 +48,10 @@ static void check_csync_normalize_etag(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
const UnitTest tests[] = {
|
||||
unit_test(check_csync_normalize_etag),
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(check_csync_normalize_etag),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
#define TESTDB "/tmp/check_csync1/test.db"
|
||||
|
||||
static void setup(void **state) {
|
||||
static int setup(void **state) {
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
|
||||
@@ -47,9 +47,11 @@ static void setup(void **state) {
|
||||
|
||||
rc = sqlite3_close(db);
|
||||
assert_int_equal(rc, SQLITE_OK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown(void **state) {
|
||||
static int teardown(void **state) {
|
||||
CSYNC *csync = *state;
|
||||
int rc;
|
||||
|
||||
@@ -60,6 +62,8 @@ static void teardown(void **state) {
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void check_csync_statedb_load(void **state)
|
||||
@@ -116,11 +120,11 @@ static void check_csync_statedb_close(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
const UnitTest tests[] = {
|
||||
unit_test_setup_teardown(check_csync_statedb_load, setup, teardown),
|
||||
unit_test_setup_teardown(check_csync_statedb_close, setup, teardown),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
|
||||
|
||||
static void setup(void **state)
|
||||
static int setup(void **state)
|
||||
{
|
||||
CSYNC *csync;
|
||||
int rc = 0;
|
||||
@@ -39,7 +39,7 @@ static void setup(void **state)
|
||||
rc = system("mkdir -p /tmp/check_csync");
|
||||
assert_int_equal(rc, 0);
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
csync_init(csync);
|
||||
csync_init(csync, TESTDB);
|
||||
|
||||
sqlite3 *db = NULL;
|
||||
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
|
||||
@@ -51,9 +51,11 @@ static void setup(void **state)
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = csync;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void setup_db(void **state)
|
||||
static int setup_db(void **state)
|
||||
{
|
||||
char *errmsg;
|
||||
int rc = 0;
|
||||
@@ -89,10 +91,12 @@ static void setup_db(void **state)
|
||||
assert_int_equal(rc, SQLITE_OK);
|
||||
|
||||
sqlite3_close(db);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static void teardown(void **state) {
|
||||
static int teardown(void **state) {
|
||||
CSYNC *csync = *state;
|
||||
int rc = 0;
|
||||
|
||||
@@ -104,6 +108,8 @@ static void teardown(void **state) {
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -204,15 +210,15 @@ static void check_csync_statedb_get_stat_by_inode_not_found(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
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),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ static void statedb_insert_metadata(sqlite3 *db)
|
||||
}
|
||||
}
|
||||
|
||||
static void setup(void **state)
|
||||
static int setup(void **state)
|
||||
{
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
@@ -92,7 +92,7 @@ static void setup(void **state)
|
||||
rc = system("mkdir -p /tmp/check_csync1");
|
||||
assert_int_equal(rc, 0);
|
||||
csync_create(&csync, "/tmp/check_csync1");
|
||||
csync_init(csync);
|
||||
csync_init(csync, TESTDB);
|
||||
|
||||
/* Create a new db with metadata */
|
||||
sqlite3 *db;
|
||||
@@ -109,9 +109,11 @@ static void setup(void **state)
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = csync;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void setup_ftw(void **state)
|
||||
static int setup_ftw(void **state)
|
||||
{
|
||||
CSYNC *csync;
|
||||
int rc;
|
||||
@@ -121,7 +123,7 @@ static void setup_ftw(void **state)
|
||||
rc = system("mkdir -p /tmp/check_csync1");
|
||||
assert_int_equal(rc, 0);
|
||||
csync_create(&csync, "/tmp");
|
||||
csync_init(csync);
|
||||
csync_init(csync, TESTDB);
|
||||
|
||||
sqlite3 *db = NULL;
|
||||
rc = sqlite3_open_v2(TESTDB, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL);
|
||||
@@ -135,9 +137,11 @@ static void setup_ftw(void **state)
|
||||
|
||||
csync->statedb.file = c_strdup( TESTDB );
|
||||
*state = csync;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown(void **state)
|
||||
static int teardown(void **state)
|
||||
{
|
||||
CSYNC *csync = *state;
|
||||
int rc;
|
||||
@@ -147,9 +151,11 @@ static void teardown(void **state)
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
*state = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void teardown_rm(void **state) {
|
||||
static int teardown_rm(void **state) {
|
||||
int rc;
|
||||
|
||||
teardown(state);
|
||||
@@ -158,6 +164,8 @@ static void 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 */
|
||||
@@ -424,19 +432,19 @@ static void check_csync_ftw_failing_fn(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
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),
|
||||
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),
|
||||
|
||||
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),
|
||||
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),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -43,11 +43,11 @@ static void check_csync_memstat(void **state)
|
||||
|
||||
int torture_run_tests(void)
|
||||
{
|
||||
const UnitTest tests[] = {
|
||||
unit_test(check_csync_instruction_str),
|
||||
unit_test(check_csync_memstat),
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(check_csync_instruction_str),
|
||||
cmocka_unit_test(check_csync_memstat),
|
||||
};
|
||||
|
||||
return run_tests(tests);
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -457,6 +457,7 @@ 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" );
|
||||
}
|
||||
|
||||
|
||||
@@ -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() . ".csync_journal.db \"UPDATE metadata SET fileid='';\"");
|
||||
system( "sqlite3 " . localDir() . "._sync_*.db \"UPDATE metadata SET fileid='';\"");
|
||||
#refresh the ids
|
||||
csync();
|
||||
assertLocalAndRemoteDir( 'remoteToLocal1', 1);
|
||||
|
||||
@@ -61,7 +61,7 @@ sub getETagFromJournal($$)
|
||||
{
|
||||
my ($name,$num) = @_;
|
||||
|
||||
my $sql = "sqlite3 " . localDir() . ".csync_journal.db \"SELECT md5 FROM metadata WHERE path='$name';\"";
|
||||
my $sql = "sqlite3 " . localDir() . "._sync_*.db \"SELECT md5 FROM metadata WHERE path='$name';\"";
|
||||
open(my $fh, '-|', $sql) or die $!;
|
||||
my $etag = <$fh>;
|
||||
close $fh;
|
||||
|
||||
@@ -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 . '.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 $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 $result = `$cmd`;
|
||||
assert($result == "0");
|
||||
}
|
||||
@@ -170,14 +170,14 @@ assertLocalAndRemoteDir( '', 0);
|
||||
|
||||
#######################################################################
|
||||
printInfo( "move a directory in a outside read only folder" );
|
||||
system("sqlite3 " . localDir().'.csync_journal.db .dump');
|
||||
system("sqlite3 " . localDir().'._sync_*.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().'.csync_journal.db .dump');
|
||||
system("sqlite3 " . localDir().'._sync_*.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().'.csync_journal.db .dump');
|
||||
system("sqlite3 " . localDir().'._sync_*.db .dump');
|
||||
|
||||
|
||||
#######################################################################
|
||||
|
||||
@@ -153,7 +153,8 @@ 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 ``.csync_journal.db``, as these files are reserved for journalling.
|
||||
* Files starting with ``._sync_xxxxxxx.db`` and the old format ``.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
|
||||
|
||||
+1
-13
@@ -68,17 +68,9 @@ 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::
|
||||
@@ -108,7 +100,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.
|
||||
@@ -257,10 +249,6 @@ 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.
|
||||
|
||||
@@ -511,9 +511,6 @@ X-GNOME-Autostart-Delay=3
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
# Translations
|
||||
Comment[oc]=@APPLICATION_NAME@ sincronizacion del client
|
||||
GenericName[oc]=Dorsièr de Sincronizacion
|
||||
|
||||
+14
-4
@@ -278,7 +278,6 @@ void selectiveSyncFixup(OCC::SyncJournalDb *journal, const QStringList &newList)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
QCoreApplication app(argc, argv);
|
||||
|
||||
@@ -383,11 +382,20 @@ 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"));
|
||||
QString folder = splitted.value(1);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
SimpleSslErrorHandler *sslErrorHandler = new SimpleSslErrorHandler;
|
||||
|
||||
@@ -470,7 +478,9 @@ restart_sync:
|
||||
}
|
||||
|
||||
Cmd cmd;
|
||||
SyncJournalDb db(options.source_dir);
|
||||
QString dbPath = options.source_dir + SyncJournalDb::makeDbName(credentialFreeUrl, folder, user);
|
||||
SyncJournalDb db(dbPath);
|
||||
|
||||
if (!selectiveSyncList.empty()) {
|
||||
selectiveSyncFixup(&db, selectiveSyncList);
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "owncloudsetupwizard.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
#include "tooltipupdater.h"
|
||||
#include "filesystem.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@@ -290,7 +289,8 @@ void AccountSettings::slotFolderWizardAccepted()
|
||||
FolderDefinition definition;
|
||||
definition.localPath = FolderDefinition::prepareLocalPath(
|
||||
folderWizard->field(QLatin1String("sourceFolder")).toString());
|
||||
definition.targetPath = folderWizard->property("targetPath").toString();
|
||||
definition.targetPath = FolderDefinition::prepareTargetPath(
|
||||
folderWizard->property("targetPath").toString());
|
||||
|
||||
{
|
||||
QDir dir(definition.localPath);
|
||||
@@ -301,9 +301,8 @@ void AccountSettings::slotFolderWizardAccepted()
|
||||
tr("<p>Could not create local folder <i>%1</i>.")
|
||||
.arg(QDir::toNativeSeparators(definition.localPath)));
|
||||
return;
|
||||
} else {
|
||||
FileSystem::setFolderMinimumPermissions(definition.localPath);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+71
-6
@@ -46,6 +46,7 @@
|
||||
|
||||
namespace OCC {
|
||||
|
||||
const char oldJournalPath[] = ".csync_journal.db";
|
||||
|
||||
Folder::Folder(const FolderDefinition& definition,
|
||||
AccountState* accountState,
|
||||
@@ -60,8 +61,9 @@ Folder::Folder(const FolderDefinition& definition,
|
||||
, _lastSyncDuration(0)
|
||||
, _consecutiveFailingSyncs(0)
|
||||
, _consecutiveFollowUpSyncs(0)
|
||||
, _journal(definition.localPath)
|
||||
, _journal(_definition.absoluteJournalPath())
|
||||
, _fileLog(new SyncRunFileLog)
|
||||
, _saveBackwardsCompatible(false)
|
||||
{
|
||||
qRegisterMetaType<SyncFileItemVector>("SyncFileItemVector");
|
||||
qRegisterMetaType<SyncFileItem::Direction>("SyncFileItem::Direction");
|
||||
@@ -124,6 +126,7 @@ Folder::~Folder()
|
||||
_engine.reset();
|
||||
}
|
||||
|
||||
|
||||
void Folder::checkLocalPath()
|
||||
{
|
||||
const QFileInfo fi(_definition.localPath);
|
||||
@@ -203,7 +206,7 @@ void Folder::setIgnoreHiddenFiles(bool ignore)
|
||||
_definition.ignoreHiddenFiles = ignore;
|
||||
}
|
||||
|
||||
QString Folder::cleanPath()
|
||||
QString Folder::cleanPath() const
|
||||
{
|
||||
QString cleanedPath = QDir::cleanPath(_canonicalLocalPath);
|
||||
|
||||
@@ -584,8 +587,33 @@ 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();
|
||||
settings->beginGroup(QLatin1String("Folders"));
|
||||
|
||||
// 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"));
|
||||
}
|
||||
FolderDefinition::save(*settings, _definition);
|
||||
|
||||
settings->sync();
|
||||
@@ -594,9 +622,12 @@ 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
|
||||
@@ -628,12 +659,12 @@ void Folder::slotTerminateSync()
|
||||
// local folder is synced to the same ownCloud.
|
||||
void Folder::wipe()
|
||||
{
|
||||
QString stateDbFile = path()+QLatin1String(".csync_journal.db");
|
||||
QString stateDbFile = _engine->journal()->databaseFilePath();
|
||||
|
||||
// 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
|
||||
|
||||
@@ -950,6 +981,11 @@ void Folder::scheduleThisFolderSoon()
|
||||
}
|
||||
}
|
||||
|
||||
void Folder::setSaveBackwardsCompatible(bool save)
|
||||
{
|
||||
_saveBackwardsCompatible = save;
|
||||
}
|
||||
|
||||
void Folder::slotAboutToRemoveAllFiles(SyncFileItem::Direction, bool *cancel)
|
||||
{
|
||||
ConfigFile cfgFile;
|
||||
@@ -1002,6 +1038,7 @@ 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);
|
||||
@@ -1014,6 +1051,7 @@ 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();
|
||||
@@ -1023,6 +1061,9 @@ 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;
|
||||
}
|
||||
|
||||
@@ -1035,5 +1076,29 @@ 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
|
||||
|
||||
|
||||
+28
-1
@@ -53,6 +53,8 @@ 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
|
||||
@@ -69,6 +71,15 @@ 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);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -111,7 +122,7 @@ public:
|
||||
/**
|
||||
* wrapper for QDir::cleanPath("Z:\\"), which returns "Z:\\", but we need "Z:" instead
|
||||
*/
|
||||
QString cleanPath();
|
||||
QString cleanPath() const;
|
||||
|
||||
/**
|
||||
* remote folder path
|
||||
@@ -206,6 +217,12 @@ 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();
|
||||
@@ -334,6 +351,16 @@ 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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
+109
-44
@@ -209,18 +209,16 @@ int FolderMan::setupFolders()
|
||||
continue;
|
||||
}
|
||||
settings->beginGroup(id);
|
||||
|
||||
settings->beginGroup(QLatin1String("Folders"));
|
||||
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
|
||||
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();
|
||||
|
||||
settings->endGroup(); // <account>
|
||||
}
|
||||
|
||||
@@ -229,6 +227,34 @@ 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;
|
||||
@@ -259,18 +285,16 @@ int FolderMan::setupFoldersMigration()
|
||||
return _folderMap.size();
|
||||
}
|
||||
|
||||
bool FolderMan::ensureJournalGone(const QString &localPath)
|
||||
bool FolderMan::ensureJournalGone( const QString& 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;
|
||||
// remove the old journal file
|
||||
while (QFile::exists(journalDbFile) && !QFile::remove(journalDbFile)) {
|
||||
qDebug() << "Could not remove old db file at" << journalDbFile;
|
||||
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(stateDbFile))),
|
||||
.arg(QDir::fromNativeSeparators(QDir::cleanPath(journalDbFile))),
|
||||
QMessageBox::Retry|QMessageBox::Abort);
|
||||
if (ret == QMessageBox::Abort) {
|
||||
return false;
|
||||
@@ -833,11 +857,27 @@ void FolderMan::slotFolderSyncFinished( const SyncResult& )
|
||||
|
||||
Folder* FolderMan::addFolder(AccountState* accountState, const FolderDefinition& folderDefinition)
|
||||
{
|
||||
if (!ensureJournalGone(folderDefinition.localPath)) {
|
||||
// Choose a db filename
|
||||
auto definition = folderDefinition;
|
||||
definition.journalPath = definition.defaultJournalPath(accountState->account());
|
||||
|
||||
if (!ensureJournalGone(definition.absoluteJournalPath())) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto folder = addFolderInternal(folderDefinition, accountState);
|
||||
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);
|
||||
|
||||
if(folder) {
|
||||
folder->saveToSettings();
|
||||
emit folderSyncStateChange(folder);
|
||||
@@ -846,7 +886,8 @@ 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;
|
||||
@@ -1209,17 +1250,16 @@ QString FolderMan::statusToString( SyncResult syncStatus, bool paused ) const
|
||||
return folderMessage;
|
||||
}
|
||||
|
||||
QString FolderMan::checkPathValidityForNewFolder(const QString& path, bool forNewDirectory)
|
||||
QString FolderMan::checkPathValidityForNewFolder(const QString& path, const QUrl &serverUrl, 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(), true);
|
||||
return checkPathValidityForNewFolder(selFile.dir().path(), serverUrl, true);
|
||||
}
|
||||
|
||||
if( !selFile.isDir() ) {
|
||||
@@ -1231,6 +1271,10 @@ QString FolderMan::checkPathValidityForNewFolder(const QString& path, bool forNe
|
||||
}
|
||||
|
||||
// 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());
|
||||
@@ -1238,39 +1282,60 @@ QString FolderMan::checkPathValidityForNewFolder(const QString& path, bool forNe
|
||||
if( folderDir.isEmpty() ) {
|
||||
continue;
|
||||
}
|
||||
if( ! folderDir.endsWith(QLatin1Char('/')) ) folderDir.append(QLatin1Char('/'));
|
||||
if( ! folderDir.endsWith(QLatin1Char('/'), cs) ) folderDir.append(QLatin1Char('/'));
|
||||
|
||||
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)+'/')) {
|
||||
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)) {
|
||||
return tr("The local folder %1 already contains a folder used in a folder sync connection. "
|
||||
"Please pick another one!")
|
||||
.arg(QDir::toNativeSeparators(userInput));
|
||||
.arg(QDir::toNativeSeparators(path));
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
// QDir::cleanPath keeps links
|
||||
// canonicalPath() remove symlinks and uses the symlink targets.
|
||||
QString absCleanUserFolder = QDir::cleanPath(QDir(path).canonicalPath())+'/';
|
||||
|
||||
if (QDir::cleanPath(QString(userInput)).startsWith( QDir::cleanPath(folderDir)+'/')) {
|
||||
if ( (forNewDirectory || differentPathes) && userDirClean.startsWith( folderDirClean, cs )) {
|
||||
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(userInput));
|
||||
.arg(QDir::toNativeSeparators(path));
|
||||
}
|
||||
|
||||
if (absCleanUserFolder.startsWith( QDir::cleanPath(folderDir)+'/')) {
|
||||
// both follow symlinks.
|
||||
bool cleanUserEqualsCleanFolder = Utility::fileNamesEqual(absCleanUserFolder, folderDirClean );
|
||||
if (differentPathes && absCleanUserFolder.startsWith( folderDirClean, cs ) &&
|
||||
! cleanUserEqualsCleanFolder ) {
|
||||
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(userInput));
|
||||
.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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -97,11 +97,11 @@ public:
|
||||
Folder* setupFolderFromOldConfigFile(const QString &, AccountState *account );
|
||||
|
||||
/**
|
||||
* Ensures that a given directory does not contain a .csync_journal.
|
||||
* Ensures that a given directory does not contain a sync journal file.
|
||||
*
|
||||
* @returns false if the journal could not be removed, true otherwise.
|
||||
*/
|
||||
static bool ensureJournalGone(const QString &path);
|
||||
static bool ensureJournalGone(const QString& journalDbFile);
|
||||
|
||||
/** 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, bool forNewDirectory = false);
|
||||
QString checkPathValidityForNewFolder(const QString &path, const QUrl& serverUrl = QUrl(), bool forNewDirectory = false);
|
||||
|
||||
/**
|
||||
* While ignoring hidden files can theoretically be switched per folder,
|
||||
@@ -257,7 +257,8 @@ 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 * );
|
||||
@@ -273,6 +274,8 @@ private:
|
||||
// restarts the application (Linux only)
|
||||
void restartApplication();
|
||||
|
||||
void setupFoldersHelper(QSettings& settings, AccountStatePtr account, bool backwardsCompatible);
|
||||
|
||||
QSet<Folder*> _disabledFolders;
|
||||
Folder::Map _folderMap;
|
||||
QString _folderConfigPath;
|
||||
|
||||
@@ -169,7 +169,8 @@ 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(".csync_journal.db") ||
|
||||
if (fileName.startsWith("._sync_") ||
|
||||
fileName.startsWith(".csync_journal.db") ||
|
||||
fileName.startsWith(".owncloudsync.log")) {
|
||||
// qDebug() << "ignore journal";
|
||||
} else {
|
||||
|
||||
@@ -56,8 +56,9 @@ QString FormatWarningsWizardPage::formatWarnings(const QStringList &warnings) co
|
||||
return ret;
|
||||
}
|
||||
|
||||
FolderWizardLocalPath::FolderWizardLocalPath()
|
||||
: FormatWarningsWizardPage()
|
||||
FolderWizardLocalPath::FolderWizardLocalPath(const AccountPtr& account)
|
||||
: FormatWarningsWizardPage(),
|
||||
_account(account)
|
||||
{
|
||||
_ui.setupUi(this);
|
||||
registerField(QLatin1String("sourceFolder*"), _ui.localFolderLineEdit);
|
||||
@@ -89,8 +90,13 @@ 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()));
|
||||
QDir::fromNativeSeparators(_ui.localFolderLineEdit->text()), serverUrl);
|
||||
|
||||
|
||||
|
||||
bool isOk = errorStr.isEmpty();
|
||||
QStringList warnStrings;
|
||||
@@ -133,7 +139,7 @@ void FolderWizardLocalPath::slotChooseLocalFolder()
|
||||
}
|
||||
|
||||
// =================================================================================
|
||||
FolderWizardRemotePath::FolderWizardRemotePath(AccountPtr account)
|
||||
FolderWizardRemotePath::FolderWizardRemotePath(const AccountPtr& account)
|
||||
: FormatWarningsWizardPage()
|
||||
,_warnWasVisible(false)
|
||||
,_account(account)
|
||||
@@ -473,7 +479,7 @@ void FolderWizardRemotePath::showWarn( const QString& msg ) const
|
||||
|
||||
// ====================================================================================
|
||||
|
||||
FolderWizardSelectiveSync::FolderWizardSelectiveSync(AccountPtr account)
|
||||
FolderWizardSelectiveSync::FolderWizardSelectiveSync(const AccountPtr& account)
|
||||
{
|
||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||
_treeView = new SelectiveSyncTreeView(account, this);
|
||||
@@ -527,7 +533,7 @@ void FolderWizardSelectiveSync::cleanupPage()
|
||||
|
||||
FolderWizard::FolderWizard(AccountPtr account, QWidget *parent)
|
||||
: QWizard(parent),
|
||||
_folderWizardSourcePage(new FolderWizardLocalPath),
|
||||
_folderWizardSourcePage(new FolderWizardLocalPath(account)),
|
||||
_folderWizardTargetPage(0),
|
||||
_folderWizardSelectiveSyncPage(new FolderWizardSelectiveSync(account))
|
||||
{
|
||||
|
||||
@@ -49,7 +49,7 @@ class FolderWizardLocalPath : public FormatWarningsWizardPage
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
FolderWizardLocalPath();
|
||||
explicit FolderWizardLocalPath(const AccountPtr& account);
|
||||
~FolderWizardLocalPath();
|
||||
|
||||
virtual bool isComplete() const Q_DECL_OVERRIDE;
|
||||
@@ -63,6 +63,7 @@ protected slots:
|
||||
private:
|
||||
Ui_FolderWizardSourcePage _ui;
|
||||
Folder::Map _folderMap;
|
||||
AccountPtr _account;
|
||||
};
|
||||
|
||||
|
||||
@@ -75,7 +76,7 @@ class FolderWizardRemotePath : public FormatWarningsWizardPage
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FolderWizardRemotePath(AccountPtr account);
|
||||
explicit FolderWizardRemotePath(const AccountPtr& account);
|
||||
~FolderWizardRemotePath();
|
||||
|
||||
virtual bool isComplete() const Q_DECL_OVERRIDE;
|
||||
@@ -117,7 +118,7 @@ class FolderWizardSelectiveSync : public QWizardPage
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FolderWizardSelectiveSync(AccountPtr account);
|
||||
explicit FolderWizardSelectiveSync(const AccountPtr& account);
|
||||
~FolderWizardSelectiveSync();
|
||||
|
||||
virtual bool validatePage() Q_DECL_OVERRIDE;
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "sslerrordialog.h"
|
||||
#include "accountmanager.h"
|
||||
#include "clientproxy.h"
|
||||
#include "filesystem.h"
|
||||
|
||||
#include "creds/credentialsfactory.h"
|
||||
#include "creds/abstractcredentials.h"
|
||||
@@ -203,34 +202,10 @@ void OwncloudSetupWizard::slotOwnCloudFoundAuth(const QUrl& url, const QVariantM
|
||||
|
||||
void OwncloudSetupWizard::slotNoOwnCloudFoundAuth(QNetworkReply *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);
|
||||
_ocWizard->displayError(tr("Failed to connect to %1 at %2:<br/>%3")
|
||||
.arg(Theme::instance()->appNameGUI(),
|
||||
reply->url().toString(),
|
||||
reply->errorString()), checkDowngradeAdvised(reply));
|
||||
|
||||
// Allow the credentials dialog to pop up again for the same URL.
|
||||
// Maybe the user just clicked 'Cancel' by accident or changed his mind.
|
||||
@@ -365,8 +340,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.");
|
||||
@@ -521,7 +496,7 @@ void OwncloudSetupWizard::slotAssistantFinished( int result )
|
||||
qDebug() << "Adding folder definition for" << localFolder << _remoteFolder;
|
||||
FolderDefinition folderDefinition;
|
||||
folderDefinition.localPath = localFolder;
|
||||
folderDefinition.targetPath = _remoteFolder;
|
||||
folderDefinition.targetPath = FolderDefinition::prepareTargetPath(_remoteFolder);
|
||||
folderDefinition.ignoreHiddenFiles = folderMan->ignoreHiddenFiles();
|
||||
|
||||
auto f = folderMan->addFolder(account, folderDefinition);
|
||||
|
||||
@@ -125,8 +125,13 @@ 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);
|
||||
QString errorStr = FolderMan::instance()->checkPathValidityForNewFolder(locFolder, serverUrl);
|
||||
_localFolderValid = errorStr.isEmpty();
|
||||
|
||||
QString t;
|
||||
|
||||
@@ -256,7 +256,6 @@ 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) {
|
||||
|
||||
@@ -52,7 +52,6 @@ set(libsync_SRCS
|
||||
propagateupload.cpp
|
||||
propagateuploadv1.cpp
|
||||
propagateuploadng.cpp
|
||||
propagatebundle.cpp
|
||||
propagateremotedelete.cpp
|
||||
propagateremotemove.cpp
|
||||
propagateremotemkdir.cpp
|
||||
|
||||
@@ -128,11 +128,6 @@ 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));
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "accountfwd.h"
|
||||
|
||||
class QUrl;
|
||||
class QHttpMultiPart;
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -79,7 +78,6 @@ 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;
|
||||
|
||||
@@ -76,27 +76,19 @@ AccountPtr Account::sharedFromThis()
|
||||
return _sharedThis.toStrongRef();
|
||||
}
|
||||
|
||||
QString Account::davUser() const
|
||||
QString Account::user() const
|
||||
{
|
||||
return _davUser.isEmpty() ? _credentials->user() : _davUser;
|
||||
return _user.isEmpty() ? _credentials->user() : _user;
|
||||
}
|
||||
|
||||
void Account::setDavUser(const QString &newDavUser)
|
||||
void Account::setUser(const QString &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;
|
||||
_user = user;
|
||||
}
|
||||
|
||||
QString Account::displayName() const
|
||||
{
|
||||
QString dn = QString("%1@%2").arg(davUser(), _url.host());
|
||||
QString dn = QString("%1@%2").arg(user(), _url.host());
|
||||
int port = url().port();
|
||||
if (port > 0 && port != 80 && port != 443) {
|
||||
dn.append(QLatin1Char(':'));
|
||||
@@ -245,20 +237,6 @@ 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;
|
||||
@@ -497,9 +475,6 @@ void Account::setNonShib(bool nonShib)
|
||||
}
|
||||
}
|
||||
|
||||
bool Account::bundledRequestsEnabled() const
|
||||
{
|
||||
return _capabilities.bundledRequest();
|
||||
}
|
||||
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
+13
-31
@@ -34,7 +34,6 @@ class QSettings;
|
||||
class QNetworkReply;
|
||||
class QUrl;
|
||||
class QNetworkAccessManager;
|
||||
class QHttpMultiPart;
|
||||
|
||||
namespace OCC {
|
||||
|
||||
@@ -65,38 +64,14 @@ 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.
|
||||
*
|
||||
* 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 user that can be used in dav url
|
||||
QString user() const;
|
||||
void setUser(const QString &user);
|
||||
|
||||
/// The name of the account as shown in the toolbar
|
||||
QString displayName() const;
|
||||
@@ -108,6 +83,15 @@ 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;
|
||||
|
||||
@@ -124,8 +108,6 @@ 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 */
|
||||
@@ -221,7 +203,7 @@ private:
|
||||
|
||||
QWeakPointer<Account> _sharedThis;
|
||||
QString _id;
|
||||
QString _davUser;
|
||||
QString _user;
|
||||
QMap<QString, QVariant> _settingsMap;
|
||||
QUrl _url;
|
||||
QList<QSslCertificate> _approvedCerts;
|
||||
|
||||
@@ -47,15 +47,6 @@ 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();
|
||||
|
||||
@@ -41,7 +41,6 @@ public:
|
||||
int sharePublicLinkExpireDateDays() const;
|
||||
bool shareResharing() const;
|
||||
bool chunkingNg() const;
|
||||
bool bundledRequest() const;
|
||||
|
||||
/// returns true if the capabilities report notifications
|
||||
bool notificationsAvailable() const;
|
||||
|
||||
@@ -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->setDavUser(user);
|
||||
_account->setUser(user);
|
||||
}
|
||||
reportResult(Connected);
|
||||
}
|
||||
|
||||
@@ -146,17 +146,6 @@ 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)
|
||||
{
|
||||
|
||||
@@ -67,12 +67,6 @@ 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 );
|
||||
|
||||
|
||||
@@ -463,7 +463,7 @@ bool CheckServerJob::finished()
|
||||
}
|
||||
|
||||
bool success = false;
|
||||
QByteArray body = reply()->peek(4*1024);
|
||||
QByteArray body = reply()->readAll();
|
||||
int httpStatus = reply()->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
if( body.isEmpty() || httpStatus != 200) {
|
||||
qDebug() << "error: status.php replied " << httpStatus << body;
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "syncjournalfilerecord.h"
|
||||
#include "propagatedownload.h"
|
||||
#include "propagateupload.h"
|
||||
#include "propagatebundle.h"
|
||||
#include "propagateremotedelete.h"
|
||||
#include "propagateremotemove.h"
|
||||
#include "propagateremotemkdir.h"
|
||||
@@ -72,14 +71,6 @@ 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()
|
||||
{
|
||||
@@ -88,7 +79,7 @@ int OwncloudPropagator::maximumActiveJob()
|
||||
max = 3; //default
|
||||
}
|
||||
|
||||
if (hasNetworkLimit()) {
|
||||
if (_downloadLimit.fetchAndAddAcquire(0) != 0 || _uploadLimit.fetchAndAddAcquire(0) != 0) {
|
||||
// disable parallelism when there is a network limit.
|
||||
return 1;
|
||||
}
|
||||
@@ -124,17 +115,18 @@ static bool blacklistCheck(SyncJournalDb* journal, const SyncFileItem& item)
|
||||
return newEntry.isValid();
|
||||
}
|
||||
|
||||
void PropagateItemJob::itemDone(SyncFileItemPtr item, SyncFileItem::Status status, const QString &errorString)
|
||||
void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString)
|
||||
{
|
||||
if (item->_isRestoration) {
|
||||
_state = Finished;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,20 +142,20 @@ void PropagateItemJob::itemDone(SyncFileItemPtr item, SyncFileItem::Status statu
|
||||
// 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;
|
||||
@@ -174,15 +166,9 @@ void PropagateItemJob::itemDone(SyncFileItemPtr item, SyncFileItem::Status statu
|
||||
break;
|
||||
}
|
||||
|
||||
item->_status = status;
|
||||
_item->_status = status;
|
||||
|
||||
emit itemCompleted(*item, *this);
|
||||
}
|
||||
|
||||
void PropagateItemJob::done(SyncFileItem::Status status, const QString &errorString)
|
||||
{
|
||||
_state = Finished;
|
||||
itemDone(_item, status, errorString);
|
||||
emit itemCompleted(*_item, *this);
|
||||
emit finished(status);
|
||||
}
|
||||
|
||||
@@ -324,17 +310,11 @@ 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 = qobject_cast<PropagateDirectory*>(directoriesToRemove.first());
|
||||
PropagateDirectory *delDirJob = dynamic_cast<PropagateDirectory*>(directoriesToRemove.first());
|
||||
|
||||
if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
|
||||
// already taken care of. (by the removal of the parent directory)
|
||||
@@ -406,17 +386,6 @@ 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
|
||||
@@ -632,16 +601,6 @@ 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;
|
||||
@@ -680,7 +639,6 @@ bool PropagateDirectory::scheduleNextJob()
|
||||
Q_ASSERT(_subJobs.at(i)->_state == Running);
|
||||
|
||||
auto paral = _subJobs.at(i)->parallelism();
|
||||
|
||||
if (paral == WaitForFinished) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -136,7 +136,6 @@ 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);
|
||||
|
||||
@@ -188,9 +187,6 @@ 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;
|
||||
|
||||
@@ -203,7 +199,7 @@ public:
|
||||
|
||||
explicit PropagateDirectory(OwncloudPropagator *propagator, const SyncFileItemPtr &item = SyncFileItemPtr(new SyncFileItem))
|
||||
: PropagatorJob(propagator)
|
||||
, _firstJob(0),_bundleJob(0), _item(item), _jobsFinished(0), _runningNow(0), _hasError(SyncFileItem::NoStatus), _firstUnfinishedSubJob(0)
|
||||
, _firstJob(0), _item(item), _jobsFinished(0), _runningNow(0), _hasError(SyncFileItem::NoStatus), _firstUnfinishedSubJob(0)
|
||||
{ }
|
||||
|
||||
virtual ~PropagateDirectory() {
|
||||
@@ -292,7 +288,7 @@ public:
|
||||
~OwncloudPropagator();
|
||||
|
||||
void start(const SyncFileItemVector &_syncedItems);
|
||||
bool hasNetworkLimit();
|
||||
|
||||
QAtomicInt _downloadLimit;
|
||||
QAtomicInt _uploadLimit;
|
||||
BandwidthManager _bandwidthManager;
|
||||
@@ -326,10 +322,6 @@ public:
|
||||
emitFinished(SyncFileItem::NormalError);
|
||||
}
|
||||
|
||||
int runningNowAtRootJob() const {
|
||||
return _rootJob->_runningNow;
|
||||
}
|
||||
|
||||
// timeout in seconds
|
||||
static int httpTimeout();
|
||||
|
||||
@@ -390,7 +382,6 @@ private:
|
||||
friend class PropagateRemoteMove;
|
||||
friend class PropagateUploadFileV1;
|
||||
friend class PropagateUploadFileNG;
|
||||
friend class PropagateBundle;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -29,13 +29,11 @@ QString Progress::asResultString( const SyncFileItem& item)
|
||||
case CSYNC_INSTRUCTION_SYNC:
|
||||
case CSYNC_INSTRUCTION_NEW:
|
||||
case CSYNC_INSTRUCTION_TYPE_CHANGE:
|
||||
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");
|
||||
if (item._direction != SyncFileItem::Up) {
|
||||
return QCoreApplication::translate( "progress", "Downloaded");
|
||||
} else {
|
||||
return QCoreApplication::translate( "progress", "Uploaded");
|
||||
}
|
||||
case CSYNC_INSTRUCTION_CONFLICT:
|
||||
return QCoreApplication::translate( "progress", "Server version downloaded, copied changed local file into conflict file");
|
||||
case CSYNC_INSTRUCTION_REMOVE:
|
||||
|
||||
@@ -1,608 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
}
|
||||
@@ -1,141 +0,0 @@
|
||||
/*
|
||||
* 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);
|
||||
};
|
||||
|
||||
}
|
||||
@@ -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 csync_journal: " << record._fileSize << oldRecord._fileSize;
|
||||
qDebug() << "Warning: file sizes differ on server vs sync journal: " << record._fileSize << oldRecord._fileSize;
|
||||
record._fileSize = oldRecord._fileSize; // server might have claimed different size, we take the old one from the DB
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <QDir>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <QXmlStreamReader>
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 4, 2)
|
||||
namespace {
|
||||
@@ -563,4 +562,5 @@ void PropagateUploadFileCommon::finalize()
|
||||
done(SyncFileItem::Success);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
#include "owncloudpropagator.h"
|
||||
#include "networkjobs.h"
|
||||
|
||||
#include <QHttpMultiPart>
|
||||
#include <QBuffer>
|
||||
#include <QFile>
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
namespace OCC {
|
||||
class BandwidthManager;
|
||||
|
||||
@@ -321,5 +321,6 @@ private slots:
|
||||
void slotUploadProgress(qint64,qint64);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace OCC {
|
||||
QUrl PropagateUploadFileNG::chunkUrl(int chunk)
|
||||
{
|
||||
QString path = QLatin1String("remote.php/dav/uploads/")
|
||||
+ _propagator->account()->davUser()
|
||||
+ _propagator->account()->user()
|
||||
+ 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()->davUser()
|
||||
+ QLatin1String("/remote.php/dav/files/") + _propagator->account()->user()
|
||||
+ _propagator->_remoteFolder + _item->_file;
|
||||
|
||||
auto headers = PropagateUploadFileCommon::headers();
|
||||
|
||||
@@ -83,7 +83,10 @@ SyncEngine::SyncEngine(AccountPtr account, const QString& localPath,
|
||||
Q_ASSERT(localPath.endsWith(QLatin1Char('/')));
|
||||
|
||||
csync_create(&_csync_ctx, localPath.toUtf8().data());
|
||||
csync_init(_csync_ctx);
|
||||
|
||||
const QString dbFile = _journal->databaseFilePath();
|
||||
csync_init(_csync_ctx, dbFile.toUtf8().data());
|
||||
|
||||
_excludedFiles.reset(new ExcludedFiles(&_csync_ctx->excludes));
|
||||
_syncFileStatusTracker.reset(new SyncFileStatusTracker(this));
|
||||
|
||||
|
||||
@@ -164,6 +164,8 @@ 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 );
|
||||
|
||||
@@ -46,7 +46,6 @@ public:
|
||||
|
||||
enum Type {
|
||||
UnknownType = 0,
|
||||
RequestsContainer = 7,
|
||||
File = CSYNC_FTW_TYPE_FILE,
|
||||
Directory = CSYNC_FTW_TYPE_DIR,
|
||||
SoftLink = CSYNC_FTW_TYPE_SLINK
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
#include <QStringList>
|
||||
#include <QDebug>
|
||||
#include <QElapsedTimer>
|
||||
#include <QUrl>
|
||||
|
||||
#include "ownsql.h"
|
||||
|
||||
#include <inttypes.h>
|
||||
@@ -30,17 +32,63 @@
|
||||
|
||||
namespace OCC {
|
||||
|
||||
SyncJournalDb::SyncJournalDb(const QString& path, QObject *parent) :
|
||||
QObject(parent), _transaction(0)
|
||||
SyncJournalDb::SyncJournalDb(const QString& dbFilePath, QObject *parent) :
|
||||
QObject(parent),
|
||||
_dbFile(dbFilePath),
|
||||
_transaction(0)
|
||||
{
|
||||
|
||||
_dbFile = path;
|
||||
if( !_dbFile.endsWith('/') ) {
|
||||
_dbFile.append('/');
|
||||
}
|
||||
|
||||
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.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()
|
||||
@@ -49,7 +97,7 @@ bool SyncJournalDb::exists()
|
||||
return (!_dbFile.isEmpty() && QFile::exists(_dbFile));
|
||||
}
|
||||
|
||||
QString SyncJournalDb::databaseFilePath()
|
||||
QString SyncJournalDb::databaseFilePath() const
|
||||
{
|
||||
return _dbFile;
|
||||
}
|
||||
@@ -135,8 +183,6 @@ 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();
|
||||
@@ -310,10 +356,9 @@ 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
|
||||
if (!isNewDb) {
|
||||
qDebug() << Q_FUNC_INFO << "possibleUpgradeFromMirall_1_5 detected!";
|
||||
forceRemoteDiscovery = true;
|
||||
}
|
||||
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);
|
||||
|
||||
@@ -37,9 +37,17 @@ class OWNCLOUDSYNC_EXPORT SyncJournalDb : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SyncJournalDb(const QString& path, QObject *parent = 0);
|
||||
explicit SyncJournalDb(const QString& dbFilePath, 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);
|
||||
@@ -58,7 +66,8 @@ public:
|
||||
bool exists();
|
||||
void walCheckpoint();
|
||||
|
||||
QString databaseFilePath();
|
||||
QString databaseFilePath() const;
|
||||
|
||||
static qint64 getPHash(const QString& );
|
||||
|
||||
void updateErrorBlacklistEntry( const SyncJournalErrorBlacklistRecord& item );
|
||||
|
||||
@@ -277,12 +277,26 @@ bool Utility::fsCasePreserving()
|
||||
if( isWindows() || isMac() ) {
|
||||
re = true;
|
||||
} else {
|
||||
static bool isTest = qgetenv("OWNCLOUD_TEST_CASE_PRESERVING").toInt();
|
||||
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);
|
||||
|
||||
@@ -105,6 +105,11 @@ 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
|
||||
|
||||
@@ -32,7 +32,6 @@ 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);
|
||||
@@ -626,6 +625,7 @@ public:
|
||||
qint64 readData(char *, qint64) override { return 0; }
|
||||
};
|
||||
|
||||
|
||||
class FakeErrorReply : public QNetworkReply
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -649,223 +649,6 @@ 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;
|
||||
@@ -881,13 +664,7 @@ protected:
|
||||
QNetworkReply *createRequest(Operation op, const QNetworkRequest &request,
|
||||
QIODevice *outgoingData = 0) {
|
||||
const QString fileName = getFilePathFromUrl(request.url());
|
||||
|
||||
if (op != QNetworkAccessManager::PostOperation){
|
||||
Q_ASSERT(!fileName.isNull());
|
||||
} else {
|
||||
//For Bundle, fileName of bundle is "". Otherwise, assert
|
||||
Q_ASSERT(fileName.isNull());
|
||||
}
|
||||
Q_ASSERT(!fileName.isNull());
|
||||
if (_errorPaths.contains(fileName))
|
||||
return new FakeErrorReply{op, request, this};
|
||||
|
||||
@@ -910,9 +687,7 @@ protected:
|
||||
return new FakeMoveReply{info, op, request, this};
|
||||
else if (verb == QLatin1String("MOVE") && isUpload)
|
||||
return new FakeChunkMoveReply{info, _remoteRootFileInfo, op, request, this};
|
||||
else if (op == QNetworkAccessManager::PostOperation) {
|
||||
return new FakeBundlePOSTReply{_remoteRootFileInfo, op, request, outgoingData->readAll(), this};
|
||||
} else {
|
||||
else {
|
||||
qDebug() << verb << outgoingData;
|
||||
Q_UNREACHABLE();
|
||||
}
|
||||
@@ -962,7 +737,7 @@ public:
|
||||
_account->setUrl(QUrl(QStringLiteral("http://admin:admin@localhost/owncloud")));
|
||||
_account->setCredentials(new FakeCredentials{_fakeQnam});
|
||||
|
||||
_journalDb.reset(new OCC::SyncJournalDb(localPath()));
|
||||
_journalDb.reset(new OCC::SyncJournalDb(localPath() + "._sync_test.db"));
|
||||
_syncEngine.reset(new OCC::SyncEngine(_account, localPath(), "", _journalDb.get()));
|
||||
|
||||
// A new folder will update the local file state database on first sync.
|
||||
@@ -1032,10 +807,6 @@ public:
|
||||
return execUntilFinished();
|
||||
}
|
||||
|
||||
OCC::AccountPtr getAccount() {
|
||||
return _account;
|
||||
}
|
||||
|
||||
private:
|
||||
static void toDisk(QDir &dir, const FileInfo &templateFi) {
|
||||
foreach (const FileInfo &child, templateFi.children) {
|
||||
|
||||
@@ -16,9 +16,20 @@
|
||||
#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;
|
||||
@@ -53,7 +64,13 @@ private slots:
|
||||
f.write("hello");
|
||||
}
|
||||
|
||||
AccountStatePtr newAccountState(new AccountState(Account::create()));
|
||||
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));
|
||||
FolderMan *folderman = FolderMan::instance();
|
||||
QCOMPARE(folderman, &_fm);
|
||||
QVERIFY(folderman->addFolder(newAccountState.data(), folderDefinition(dir.path() + "/sub/ownCloud1")));
|
||||
@@ -61,6 +78,8 @@ 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
|
||||
@@ -71,11 +90,21 @@ private slots:
|
||||
// A file -> Error
|
||||
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/sub/file.txt").isNull());
|
||||
|
||||
// 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());
|
||||
// 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());
|
||||
|
||||
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());
|
||||
@@ -93,7 +122,12 @@ private slots:
|
||||
|
||||
// Not Ok
|
||||
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link2").isNull());
|
||||
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link3").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() + "/link4").isNull());
|
||||
QVERIFY(!folderman->checkPathValidityForNewFolder(dir.path() + "/link3/folder").isNull());
|
||||
|
||||
|
||||
@@ -31,16 +31,6 @@ 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
|
||||
@@ -64,71 +54,6 @@ 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 &)));
|
||||
|
||||
@@ -13,18 +13,13 @@
|
||||
|
||||
using namespace OCC;
|
||||
|
||||
namespace {
|
||||
|
||||
const char testdbC[] = "/tmp";
|
||||
}
|
||||
|
||||
class TestSyncJournalDB : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TestSyncJournalDB()
|
||||
: _db(testdbC)
|
||||
: _db("/tmp/csync-test.db")
|
||||
{
|
||||
}
|
||||
|
||||
@@ -41,6 +36,8 @@ private slots:
|
||||
|
||||
void cleanupTestCase()
|
||||
{
|
||||
const QString file = _db.databaseFilePath();
|
||||
QFile::remove(file);
|
||||
}
|
||||
|
||||
void testFileRecord()
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
*/
|
||||
|
||||
#include <QtTest>
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 1, 0)
|
||||
#include <QTemporaryDir>
|
||||
#endif
|
||||
|
||||
#include "utility.h"
|
||||
|
||||
@@ -150,6 +153,52 @@ 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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>La llista d'elements no sincronitzats s'ha copiat al porta-retalls</translation>
|
||||
</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'ha trobat un diari de sincronització antic '%1', però no s'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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(copia de seguretat)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(copia de seguretat %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Estat indefinit.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>S'està esperant per començar a sincronitzar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>S'està preparant per la sincronització.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>S'està sincronitzant.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>La darrera sincronització va ser correcta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Error de configuració.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Cancel·la usuari.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>La sincronització està en pausa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Sync està pausat)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>No s'ha seleccionat cap directori vàlid!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 '%1', 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (záloha)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (záloha %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Nedefinovaný stav.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Čeká na spuštění synchronizace.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Příprava na synchronizaci.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synchronizace probíhá.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Poslední synchronizace byla úspěšná.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Chyba nastavení.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Zrušení uživatelem.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synchronizace pozastavena.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synchronizace je pozastavena)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Nebyl vybrán platný adresář!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>Nový účet...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="748"/>
|
||||
|
||||
+22
-22
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(Sicherung)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(Sicherung %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Undefinierter Zustand.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Wartet auf Beginn der Synchronistation</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Synchronisation wird vorbereitet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synchronisation läuft.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Die letzte Synchronisation war erfolgreich.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Installationsfehler.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Benutzer-Abbruch</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synchronisation wurde angehalten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synchronisation ist pausiert)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Kein gültige Ordner gewählt!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Ο κατάλογος των μη-συγχρονισμένων αρχείων έχει αντιγραφθεί στο Πρόχειρο</translation>
|
||||
</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>Βρέθηκε ένα παλαιότερο αρχείο συγχρονισμού '%1', αλλά δεν μπόρεσε να αφαιρεθεί. Παρακαλώ βεβαιωθείτε ότι καμμία εφαρμογή δεν το χρησιμοποιεί αυτή τη στιγμή.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(αντίγραφο ασφαλείας)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(αντίγραοφ ασφαλέιας %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Απροσδιόριστη Κατάσταση.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Αναμονή έναρξης συγχρονισμού.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Προετοιμασία για συγχρονισμό.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Ο συγχρονισμός εκτελείται.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>Ο τελευταίος συγχρονισμός ήταν επιτυχής, αλλά υπήρχαν προειδοποιήσεις σε συγκεκριμένα αρχεία.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Σφάλμα Ρύθμισης.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Ματαίωση από Χρήστη.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Παύση συγχρονισμού.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Παύση συγχρονισμού)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Δεν επιλέχθηκε έγκυρος φάκελος!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>Η επιλεγμένη διαδρομή δεν είναι φάκελος!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>Δεν έχετε δικαιώματα εγγραφής στον επιλεγμένο φάκελο!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -406,7 +406,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 '%1'; 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(copia de seguridad)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(copia de seguridad %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Estado no definido.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Esperando para comenzar la sincronización.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Preparándose para sincronizar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Sincronización en funcionamiento.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<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="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Error de configuración.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Interrumpido por el usuario.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>La sincronización está en pausa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Sincronización en pausa)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>¡La carpeta seleccionada no es válida!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>
|
||||
|
||||
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Estado no definido.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Preparando la sincronización.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Sincronización en funcionamiento.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>La última sincronización fue exitosa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Error de configuración.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Interrumpir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>La sincronización está en pausa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Sincronización en pausa)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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 '%1', kuid selle eemaldamine ebaõnnenstus. Palun veendu, et seda kasutaks ükski programm.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(varukoopia)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (varukoopia %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Määramata staatus.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Oodatakse sünkroonimise alustamist.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Valmistun sünkroniseerima.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Sünkroniseerimine on käimas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Viimane sünkroniseerimine oli edukas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Seadistamise viga.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Kasutaja tühistamine.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Sünkroniseerimine on peatatud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Sünkroniseerimine on peatatud)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Sobilikku kausta pole valitud!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>Valitud asukoht pole kaust!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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 '%1' sinkronizazio erregistro zaharra, baina ezin da ezabatu. Ziurtatu aplikaziorik ez dela erabiltzen ari.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Definitu gabeko egoera.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Itxoiten sinkronizazioa hasteko.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Sinkronizazioa prestatzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Sinkronizazioa martxan da.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Azkeneko sinkronizazioa ongi burutu zen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Konfigurazio errorea.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Erabiltzaileak bertan behera utzi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Sinkronizazioa pausatuta dago.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Sinkronizazioa pausatuta dago)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Ez da karpeta egokirik hautatu!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (backup)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (پشتیبان %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>موقعیت تعریف نشده</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>آماده سازی برای همگام سازی کردن.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>همگام سازی در حال اجراست</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>آخرین همگام سازی موفقیت آمیز بود</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>خطا در پیکر بندی.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>خارج کردن کاربر.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>همگام سازی فعلا متوقف شده است</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (همگامسازی موقتا متوقف شده است)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>هیچ پوشهی معتبری انتخاب نشده است!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>شما اجازه نوشتن در پوشه های انتخاب شده را ندارید!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (varmuuskopio)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (varmuuskopio %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Määrittelemätön tila.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Odotetaan synkronoinnin aloitusta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Valmistellaan synkronointia.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synkronointi on meneillään.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Viimeisin synkronointi suoritettiin onnistuneesti.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Asetusvirhe.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synkronointi on keskeytetty.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synkronointi on keskeytetty)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Kelvollista kansiota ei ole valittu!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>La liste des éléments non synchronisés a été copiée dans le presse-papier.</translation>
|
||||
</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 '%1' a été trouvé, mais ne peut être supprimé. Veuillez vous assurer qu’aucune application ne l'utilise en ce moment.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(sauvegarde)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(sauvegarde %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Statut indéfini.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>En attente de synchronisation.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Préparation de la synchronisation.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>La synchronisation est en cours.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<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="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>La dernière synchronisation s'est achevée avec succès mais avec des avertissement à propos de certains fichiers.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Erreur d'installation.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Abandon par l'utilisateur.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>La synchronisation est en pause.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synchronisation en pause)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Aucun dossier valable sélectionné !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>Le chemin sélectionné n'est pas un dossier !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>Vous n'avez pas la permission d'écrire dans le dossier sélectionné !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(copia de seguranza)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(copia de seguranza %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Estado sen definir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Preparando para sincronizar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Estase sincronizando.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>A última sincronización fíxose correctamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Erro de configuración.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Interrompido polo usuario.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Sincronización en pausa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (sincronización en pausa)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Non seleccionou ningún cartafol correcto!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(biztonsági mentés)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(biztonsági mentés: %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Ismeretlen állapot.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<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="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Előkészítés szinkronizációhoz.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Szinkronizálás fut.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Legutolsó szinkronizálás sikeres volt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Beállítás hiba.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Felhasználó megszakította.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Szinkronizálás megállítva.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (szinkronizálás megállítva)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<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="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>L'elenco di elementi non sincronizzati è stato copiato negli appunti.</translation>
|
||||
</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 '%1', ma non può essere rimosso. Assicurati che nessuna applicazione lo stia utilizzando.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(copia di sicurezza)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(copia di sicurezza %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Stato non definito.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>In attesa di iniziare la sincronizzazione.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Preparazione della sincronizzazione.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>La sincronizzazione è in corso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>L'ultima sincronizzazione è stata completata correttamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Errore di configurazione.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Interrotto dall'utente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>La sincronizzazione è sospesa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation> %1 (La sincronizzazione è sospesa)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Nessuna cartella valida selezionata!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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'altra!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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'altra!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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'altra!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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'altra!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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'altra!</translation>
|
||||
</message>
|
||||
|
||||
+22
-22
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>非同期アイテムリストをクリップボードにコピーしました。</translation>
|
||||
</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>古い同期ジャーナル '%1' が見つかりましたが、削除できませんでした。それを現在使用しているアプリケーションが存在しないか確認してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(バックアップ)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(%1をバックアップ)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>未定義の状態。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>同期開始を待機中</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>同期の準備中。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>同期を実行中です。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>最後の同期は成功しました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>最新の同期は成功しました。しかし、一部のファイルに問題がありました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>設定エラー。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>ユーザーによる中止。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>同期を一時停止しました。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (同期を一時停止)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>有効なフォルダーが選択されていません!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>指定のパスは、フォルダーではありません!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>選択されたフォルダーに書き込み権限がありません</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>
|
||||
|
||||
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Listen med usynkroniserte elementer er kopiert til utklippstavlen.</translation>
|
||||
</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 '%1' ble funnet men kunne ikke fjernes. Pass på at ingen applikasjoner bruker den.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (sikkerhetskopi)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (sikkerhetskopi %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Udefinert tilstand.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Venter på å starte synkronisering.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Forbereder synkronisering.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synkronisering kjører.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Siste synkronisering var vellykket.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>Siste synkronisering var vellykket, men med advarsler på enkelte filer.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Feil med oppsett.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Brukeravbrudd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synkronisering er satt på pause.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synkronisering er satt på pause)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Ingen gyldig mappe valgt!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(backup)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(backup %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Ongedefiniëerde staat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>In afwachting van synchronisatie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Synchronisatie wordt voorbereid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Bezig met synchroniseren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Laatste synchronisatie was geslaagd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Installatiefout.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Afgebroken door gebruiker.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synchronisatie gepauzeerd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synchronisatie onderbroken)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Geen geldige map geselecteerd!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Lista niezsynchronizowanych plików została skopiowana do schowka.</translation>
|
||||
</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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(kopia zapasowa)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(kopia zapasowa %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Niezdefiniowany stan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Poczekaj na rozpoczęcie synchronizacji.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Przygotowuję do synchronizacji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synchronizacja w toku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Ostatnia synchronizacja zakończona powodzeniem.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Błąd ustawień.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Użytkownik anulował.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synchronizacja wstrzymana</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation> %1 (Synchronizacja jest zatrzymana)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Nie wybrano poprawnego folderu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 'journal' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(cópia de segurança)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(cópia de segurança %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Estado indefinido.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>A aguardar para iniciar a sincronização.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>A preparar para sincronizar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>A sincronização está em execução.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>A última sincronização foi bem sucedida.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Erro de instalação.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Abortado pelo utilizador.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>A sincronização está pausada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (A sincronização está pausada)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<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="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
|
||||
<translation>A pasta local %1 já foi utilizada numa ligação de sincronização da pasta. Por favor, escolha outra!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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 já 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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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 já 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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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 já 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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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 já contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
|
||||
</message>
|
||||
|
||||
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (backup)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (backup %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Estado indefinido.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>À espera do início da sincronização.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Preparando para sincronização.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>A sincronização está ocorrendo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<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="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Erro de Configuração.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Usuário Abortou.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Sincronização pausada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Pausa na Sincronização) </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Nenhuma pasta válida selecionada!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<source>The local folder %1 is already used in a folder sync connection. Please pick another one!</source>
|
||||
<translation>A pasta local %1 já 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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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 já 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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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 já 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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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 já 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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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 já está contido em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
|
||||
</message>
|
||||
|
||||
+27
-27
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Список несинхронизированных элементов скопирован в буфер обмена.</translation>
|
||||
</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>Найден старый журнал синхронизации '%1', и он не может быть удалён. Убедитесь что он не открыт в другом приложении.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(бэкап)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(бэкап %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Неопределенное состояние.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Ожидание запуска синхронизации.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Подготовка к синхронизации.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Идет синхронизация.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Последняя синхронизация прошла успешно.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>Последняя синхронизация прошла успешно, но были предупреждения для некоторых файлов.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Ошибка установки.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Отмена пользователем.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Синхронизация приостановлена.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%! (синхронизация приостановлена)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Не выбран валидный каталог!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>Выбранный путь не является папкой!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>У вас недостаточно прав для записи в выбранный каталог!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>Неожиданный код завершения от сервера (%1)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="448"/>
|
||||
<source>Missing File ID from server</source>
|
||||
<translation>Отсутствует код файла от сервера</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="461"/>
|
||||
<source>Missing ETag from server</source>
|
||||
<translation>Отсутствует ETag с сервера</translation>
|
||||
<translation type="unfinished"/>
|
||||
</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>Новая учётная запись…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</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><p>Version %2. For more information visit <a href="%3">https://%4</a></p><p>For known issues and help, please visit: <a href="https://central.owncloud.org/c/help/desktop-file-sync">https://central.owncloud.org</a></p><p><small>By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.</small></p><p>Copyright ownCloud GmbH</p><p>Licensed under the GNU General Public License (GPL) Version 2.0<br/>ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.</p></source>
|
||||
<translation><p>Версия %2. За известными проблемами и помощью обращайтесь по ссылке <a href="%3">https://%4</a></p><p><small>Авторы: Клаас Фрейтаг, Дэниель Молкентен, Оливье Гоффар, Маркус Гётц, Жан-Кристоф Бошар, и другие.</small></p><p>Авторские права принадлежат ownCloud GmbH</p><p>Лицензировано под GNU General Public License (GPL) версии 2.0<br/>ownCloud и логотип ownCloud — зарегистрированные торговые марки ownCloud GmbH в Соединённых Штатах, и/или других странах.</p></translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
||||
+22
-22
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<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>
|
||||
</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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (záloha)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (záloha %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Nedefinovaný stav.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Čaká sa na začiatok synchronizácie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Príprava na synchronizáciu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synchronizácia prebieha.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<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="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Chyba pri inštalácii.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Zrušené používateľom.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synchronizácia je pozastavená.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synchronizácia je pozastavená)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Nebol zvolený platný priečinok.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Seznam neusklajenih predmetov je kopiran v odložišče.</translation>
|
||||
</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 '%1', vendar ga ni mogoče odstraniti. Preverite, ali je datoteka v uporabi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(varnostna kopija)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(varnostna kopija %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Nedoločeno stanje.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Čakanje začetek usklajevanja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Poteka priprava za usklajevanje.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Usklajevanje je v teku.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<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="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Napaka nastavitve.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Uporabniška prekinitev.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Usklajevanje je začasno v premoru.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (usklajevanje je v premoru)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Ni izbrane veljavne mape!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>Izbrana pot ni mapa!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>Napaka: nepričakovan odziv s strežnika (%1).</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="448"/>
|
||||
<source>Missing File ID from server</source>
|
||||
<translation>Na strežniku manjka ID datoteke</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/libsync/propagateuploadng.cpp" line="461"/>
|
||||
<source>Missing ETag from server</source>
|
||||
<translation>Na strežniku manjka ETag datoteke</translation>
|
||||
<translation type="unfinished"/>
|
||||
</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>Nov račun ...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/owncloudgui.cpp" line="748"/>
|
||||
|
||||
+21
-21
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (резерва)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (резерва %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Неодређено стање.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Припремам синхронизацију.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Синхронизација у току.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Последња синхронизација је била успешна.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>Последња синхронизација је била успешна али са упозорењима за поједине фајлове.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Грешка подешавања.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Корисник прекинуо.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Синхронизација је паузирана.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (синхронизација паузирана)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>Немате дозволе за упис у изабрану фасциклу!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Listan över osynkroniserade objekt har kopierats till urklipp.</translation>
|
||||
</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 '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(säkerhetskopia)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(säkerhetkopia %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Okänt tillstånd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Väntar på att starta synkronisering.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Förbereder synkronisering</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Synkronisering pågår.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Senaste synkronisering lyckades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Inställningsfel.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Användare Avbryt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Synkronisering är pausad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Synk är stoppad)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Ingen giltig mapp markerad!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>รายชื่อที่ไม่ถูกประสานข้อมูลได้รับการคัดลอกไปยังคลิปบอร์ด</translation>
|
||||
</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>บนบันทึกการประสานข้อมูลเก่า '%1' แต่ไม่สามารถลบออกได้ กรุณาตรวจสอบให้แน่ใจว่าไม่มีแอพฯ หรือการทำงานใดๆที่ใช้มันอยู่</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(สำรองข้อมูล)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(สำรองข้อมูล %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>สถานะที่ยังไม่ได้ถูกกำหนด</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>กำลังรอเริ่มต้นการประสานข้อมูล</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>กำลังเตรียมการประสานข้อมูล</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>การประสานข้อมูลกำลังทำงาน</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>ประสานข้อมูลครั้งล่าสุดเสร็จเรียบร้อยแล้ว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>การประสานข้อมูลสำเร็จ แต่มีคำเตือนในแต่ละไฟล์</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>เกิดข้อผิดพลาดในการติดตั้ง</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>ยกเลิกผู้ใช้</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>การประสานข้อมูลถูกหยุดไว้ชั่วคราว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (การประสานข้อมูลถูกหยุดชั่วคราว)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>เลือกโฟลเดอร์ไม่ถูกต้อง!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>เส้นทางที่เลือกไม่ใช่โฟลเดอร์!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>คุณมีสิทธิ์ที่จะเขียนโฟลเดอร์ที่เลือกนี้!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>Eşitlenmemiş ögelerin listesi panoya kopyalandı.</translation>
|
||||
</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üğü '%1' 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (yedek)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (yedek %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Tanımlanmamış Durum.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>Eşitlemenin başlanması bekleniyor.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Eşitleme için hazırlanıyor.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Eşitleme çalışıyor.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Son Eşitleme başarılı oldu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<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="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Kurulum Hatası.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Kullanıcı İptal Etti.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Eşitleme duraklatıldı.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Eşitleme duraklatıldı)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>Geçerli klasör seçilmedi!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<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="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<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="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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
@@ -404,7 +404,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<source>The list of unsynched 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="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(Резервна копія)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(Резервна копія %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>Невизначений стан.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>Підготовка до синхронізації</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>Синхронізація запущена.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>Остання синхронізація була успішною.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>Остання синхронізація пройшла вдало, але були зауваження про деякі файли.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>Помилка встановлення.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>Скасовано користувачем.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>Синхронізація призупинена.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (Синхронізація призупинена)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>У вас немає прав на запис в цю теку!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>
|
||||
|
||||
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>未同步项已被复制到剪贴板。</translation>
|
||||
</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>一个旧的同步日志 '%1' 被找到,但是不能被移除。请确定没有应用程序正在使用它。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation> (备份)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation> (备份 %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>未知状态。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>等待启动同步。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>准备同步。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>同步正在运行。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>最后一次同步成功。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>上次同步已成功,不过一些文件出现了警告。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>安装失败</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>用户撤销。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>同步已暂停。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (同步已暂停)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>没有选择有效的文件夹!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>选择的路径不是一个文件夹!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>你没有写入所选文件夹的权限!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>
|
||||
|
||||
@@ -404,8 +404,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/activitywidget.cpp" line="620"/>
|
||||
<source>The list of unsynced items has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<source>The list of unsynched items has been copied to the clipboard.</source>
|
||||
<translation>未同步的清單已經被複製到剪貼簿。</translation>
|
||||
</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>發現較舊的同步處理日誌'%1',但無法移除。請確認沒有應用程式正在使用它。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="963"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="964"/>
|
||||
<source> (backup)</source>
|
||||
<translation>(備份)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="968"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="969"/>
|
||||
<source> (backup %1)</source>
|
||||
<translation>(備份 %1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1175"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1176"/>
|
||||
<source>Undefined State.</source>
|
||||
<translation>未知狀態</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1178"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1179"/>
|
||||
<source>Waiting to start syncing.</source>
|
||||
<translation>正在等待同步開始</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1181"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1182"/>
|
||||
<source>Preparing for sync.</source>
|
||||
<translation>正在準備同步。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1184"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1185"/>
|
||||
<source>Sync is running.</source>
|
||||
<translation>同步執行中</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1187"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1188"/>
|
||||
<source>Last Sync was successful.</source>
|
||||
<translation>最後一次同步成功</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1192"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1193"/>
|
||||
<source>Last Sync was successful, but with warnings on individual files.</source>
|
||||
<translation>最新一次的同步已經成功,但是有部份檔案有問題</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1195"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1196"/>
|
||||
<source>Setup Error.</source>
|
||||
<translation>安裝失敗</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1198"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1199"/>
|
||||
<source>User Abort.</source>
|
||||
<translation>使用者中斷。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1201"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1202"/>
|
||||
<source>Sync is paused.</source>
|
||||
<translation>同步已暫停</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1207"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1208"/>
|
||||
<source>%1 (Sync is paused)</source>
|
||||
<translation>%1 (同步暫停)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1215"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1216"/>
|
||||
<source>No valid folder selected!</source>
|
||||
<translation>沒有選擇有效的資料夾</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1226"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1227"/>
|
||||
<source>The selected path is not a folder!</source>
|
||||
<translation>所選的路徑並非資料夾!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1230"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1231"/>
|
||||
<source>You have no permission to write to the selected folder!</source>
|
||||
<translation>您沒有權限來寫入被選取的資料夾!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../src/gui/folderman.cpp" line="1245"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1246"/>
|
||||
<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="1250"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1251"/>
|
||||
<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="1257"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1258"/>
|
||||
<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="1264"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1265"/>
|
||||
<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="1270"/>
|
||||
<location filename="../src/gui/folderman.cpp" line="1271"/>
|
||||
<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>
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário