Comparar commits

..

35 Commits

Autor SHA1 Mensagem Data
Christian Kamm a139d1a279 FolderWizard: pass AccountPtr by const&
For review of #5045
2016-11-29 10:39:20 +01:00
Christian Kamm 13e624c38f Fix compilation with Qt < 5.1
For review of #5045
2016-11-29 10:39:08 +01:00
Christian Kamm 276985f6c3 Fix perl tests for sync journal db name 2016-11-25 13:21:34 +01:00
Christian Kamm 49f8143f00 Bugfixes for sync journal name generation and usage
* Use 'user' value for journal name generation
* Save journal name in settings
* Make owncloudcmd choose the right db
2016-11-23 16:48:15 +01:00
Christian Kamm bea7241910 Don't wipe each journal on each start 2016-11-23 16:48:15 +01:00
Christian Kamm 61b4da944c Split folders configuration locations for backwards compatibility 2016-11-23 16:48:15 +01:00
Christian Kamm 6fe1868693 Always migrate .csync_journal to ._sync_xxx 2016-11-23 16:48:15 +01:00
Christian Kamm 9641c7a1e7 Rename sync journal to ._sync_xxx.db.
The added underscore means that older clients will also ignore the
file.
2016-11-23 16:48:15 +01:00
Christian Kamm 3e59a9b316 Merge branch 'master' into dbjournal_per_account 2016-11-23 16:47:56 +01:00
Klaas Freitag 16e28567a6 Folderman: Some comments for the checkPathValidityForNewFolder method. 2016-10-12 18:16:53 +02:00
Klaas Freitag 3bef42db6b folderman: checkPathValidityForNewFolder - correct file path comparison
It now checks based on the correct case sensitivity and also using the new
method for filename comparison.
2016-10-12 14:50:10 +02:00
Klaas Freitag 27d23edacc Utility: Add a function to check if two filenames are equal plus test.
It calls canonical path always and works with the correct case preserving
depending on the platform.
2016-10-12 14:48:00 +02:00
Klaas Freitag e1a48e3c33 Move the journal file name generation to the syncjournaldb class.
As requested by Olivier.
2016-10-10 16:59:17 +02:00
Klaas Freitag 5d13f9290f Fix the folderman test, adopting the checkPathValidity method tests. 2016-10-07 16:24:09 +02:00
Klaas Freitag c84140d293 checkPathValidityForNewFolder: Catch sync folders underneath sym links.
plus some whitespace changes.
2016-10-07 16:23:13 +02:00
Klaas Freitag 838c072ccc Folder Setup: Allow to set up more sync connects to the same folder.
One local folder can now be configured as sync target for multiple
accounts as long as their url and user differ.

Also this patch accepts that the sync folder is behind a symlink.
Also this patch fixes a bug that before the user input was taken
canonically which was not working for the symlink handling.
2016-09-30 14:08:00 +02:00
Klaas Freitag ed6a708460 SyncJournalDb: Migrate the old csync journal to the new name.
Migration strategy to the new filename.
2016-09-29 16:41:11 +02:00
Klaas Freitag 0c9dcdafc2 csync: Only free the statedb filename on destroy.
The filename must not be wiped in csync_commit as that is
happening after every sync. It is only set once in the
constructor of the SyncEngine in csync_init().
2016-09-29 16:36:14 +02:00
Klaas Freitag f0dc3b2deb FolderWatcher: Also ignore the new sync journal file name format. 2016-09-02 16:19:10 +02:00
Klaas Freitag 84ede3f01f Make sync journal name generating a method of SyncJournal.
Before it was in Folder, however, the command line client does not
have the Folder class. To not duplicate code, the function to generate
the sync journal name went to SyncEngine class.
2016-09-02 16:19:10 +02:00
Klaas Freitag 2daf895e43 Documentation: Mention the new format for the journal file. 2016-09-02 16:19:10 +02:00
Klaas Freitag 3b651b2da9 folderman: Clean some comments 2016-09-02 16:19:04 +02:00
Klaas Freitag 6fd930908c csync_tests: Adopted to new cmocka API. 2016-09-02 15:49:54 +02:00
Klaas Freitag 62125a442d csync_exclude: Also exclude the new syncjournal filename. 2016-09-02 15:49:21 +02:00
Klaas Freitag 2d54fb2ff9 csync_update: Do not check to exclude .csync_journal.db
It is indeed already handled by csync_exclude.
2016-09-02 15:48:45 +02:00
Klaas Freitag e46fad52bb Make the sync journal file name a method of the Folder class.
The sync journal name has a dependency on the remote url now.
2016-09-02 12:29:21 +02:00
Klaas Freitag f3cfd2b70b csync: Free statedb file member before realloc 2016-07-17 21:13:17 +02:00
Klaas Freitag 78caa1a712 Fix tests for syncjournaldb 2016-07-17 21:10:07 +02:00
Klaas Freitag 0884ad6517 owncloudcmd: Adopt to new syncJournalDb MD5 based name schema. 2016-07-10 13:05:09 +02:00
Klaas Freitag 37fc4e4332 SyncJournalDb: Cleanup of Constructor interface.
The parameter path is not longer needed.
2016-07-10 13:04:29 +02:00
Klaas Freitag 9cc90159f1 FolderMan: ensureJournalGone needs to know the exact journal name, WIP 2016-07-10 12:57:35 +02:00
Klaas Freitag 4ceee86c66 SyncEngine: Calculate a uniq journal name using the remote account.
That should allow to sync the same local folder to multiple remote destinations.

see #3764
2016-07-10 12:56:43 +02:00
Klaas Freitag b9ea7c3414 csync: Do not compute the journal name in csync_update any more.
Rely on the name that was passed to csync_init()
2016-07-10 12:54:33 +02:00
Klaas Freitag 3033e693be Folder: For wipe reuse the journal name from SyncEngine.
Do not compute on its own any more.
2016-07-10 12:52:47 +02:00
Klaas Freitag a1bc01d3b1 SyncJournalDb: Add a method to set the name of the db file. 2016-07-10 12:51:42 +02:00
96 arquivos alterados com 1342 adições e 2208 exclusões
+8 -13
Ver Arquivo
@@ -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
Ver Arquivo
@@ -326,7 +326,7 @@ void OCSYNC_EXPORT csync_create(CSYNC **csync, const char *local);
*
* @param ctx The context to initialize.
*/
void OCSYNC_EXPORT csync_init(CSYNC *ctx);
void OCSYNC_EXPORT csync_init(CSYNC *ctx, const char *db_file);
/**
* @brief Update detection
+5
Ver Arquivo
@@ -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;
-31
Ver Arquivo
@@ -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);
+14 -8
Ver Arquivo
@@ -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);
}
+4 -4
Ver Arquivo
@@ -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);
}
+28 -13
Ver Arquivo
@@ -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);
}
+13 -8
Ver Arquivo
@@ -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);
}
+11 -7
Ver Arquivo
@@ -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);
}
+3 -3
Ver Arquivo
@@ -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);
}
+25 -17
Ver Arquivo
@@ -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);
}
+4 -4
Ver Arquivo
@@ -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);
}
+1
Ver Arquivo
@@ -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" );
}
+1 -1
Ver Arquivo
@@ -176,7 +176,7 @@ assertLocalAndRemoteDir( 'remoteToLocal1', 1);
printInfo("simulate a owncloud 5 update by removing all the fileid");
## simulate a owncloud 5 update by removing all the fileid
system( "sqlite3 " . localDir() . ".csync_journal.db \"UPDATE metadata SET fileid='';\"");
system( "sqlite3 " . localDir() . "._sync_*.db \"UPDATE metadata SET fileid='';\"");
#refresh the ids
csync();
assertLocalAndRemoteDir( 'remoteToLocal1', 1);
+1 -1
Ver Arquivo
@@ -61,7 +61,7 @@ sub getETagFromJournal($$)
{
my ($name,$num) = @_;
my $sql = "sqlite3 " . localDir() . ".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;
+5 -5
Ver Arquivo
@@ -37,8 +37,8 @@ sub assertCsyncJournalOk {
my $path = $_[0];
# FIXME: should test also remoteperm but it's not working with owncloud6
# my $cmd = 'sqlite3 ' . $path . '.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');
#######################################################################
+2 -1
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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.
-3
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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);
}
+3 -4
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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!");
}
}
}
+7 -4
Ver Arquivo
@@ -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;
+2 -1
Ver Arquivo
@@ -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 {
+12 -6
Ver Arquivo
@@ -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))
{
+4 -3
Ver Arquivo
@@ -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;
+6 -31
Ver Arquivo
@@ -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);
+6 -1
Ver Arquivo
@@ -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;
-1
Ver Arquivo
@@ -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) {
-1
Ver Arquivo
@@ -52,7 +52,6 @@ set(libsync_SRCS
propagateupload.cpp
propagateuploadv1.cpp
propagateuploadng.cpp
propagatebundle.cpp
propagateremotedelete.cpp
propagateremotemove.cpp
propagateremotemkdir.cpp
-5
Ver Arquivo
@@ -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));
-2
Ver Arquivo
@@ -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;
+6 -31
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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;
-9
Ver Arquivo
@@ -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();
-1
Ver Arquivo
@@ -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;
+1 -1
Ver Arquivo
@@ -246,7 +246,7 @@ void ConnectionValidator::slotUserFetched(const QVariantMap &json)
{
QString user = json.value("ocs").toMap().value("data").toMap().value("id").toString();
if (!user.isEmpty()) {
_account->setDavUser(user);
_account->setUser(user);
}
reportResult(Connected);
}
-11
Ver Arquivo
@@ -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)
{
-6
Ver Arquivo
@@ -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 );
+1 -1
Ver Arquivo
@@ -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;
+16 -58
Ver Arquivo
@@ -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;
}
+2 -11
Ver Arquivo
@@ -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
};
+5 -7
Ver Arquivo
@@ -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:
-608
Ver Arquivo
@@ -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
}
-141
Ver Arquivo
@@ -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);
};
}
+1 -1
Ver Arquivo
@@ -177,7 +177,7 @@ void PropagateRemoteMove::finalize()
record._contentChecksum = oldRecord._contentChecksum;
record._contentChecksumType = oldRecord._contentChecksumType;
if (record._fileSize != oldRecord._fileSize) {
qDebug() << "Warning: file sizes differ on server vs 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
}
}
+1 -1
Ver Arquivo
@@ -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);
}
}
+2 -1
Ver Arquivo
@@ -16,11 +16,11 @@
#include "owncloudpropagator.h"
#include "networkjobs.h"
#include <QHttpMultiPart>
#include <QBuffer>
#include <QFile>
#include <QDebug>
namespace OCC {
class BandwidthManager;
@@ -321,5 +321,6 @@ private slots:
void slotUploadProgress(qint64,qint64);
};
}
+2 -2
Ver Arquivo
@@ -38,7 +38,7 @@ namespace OCC {
QUrl PropagateUploadFileNG::chunkUrl(int chunk)
{
QString path = QLatin1String("remote.php/dav/uploads/")
+ _propagator->account()->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();
+4 -1
Ver Arquivo
@@ -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));
+2
Ver Arquivo
@@ -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 );
-1
Ver Arquivo
@@ -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
+58 -13
Ver Arquivo
@@ -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);
+11 -2
Ver Arquivo
@@ -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 );
+15 -1
Ver Arquivo
@@ -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);
+5
Ver Arquivo
@@ -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
+4 -233
Ver Arquivo
@@ -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) {
+41 -7
Ver Arquivo
@@ -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());
-75
Ver Arquivo
@@ -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 &)));
+3 -6
Ver Arquivo
@@ -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()
+49
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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&apos;elements no sincronitzats s&apos;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&apos;ha trobat un diari de sincronització antic &apos;%1&apos;, però no s&apos;ha pogut eliminar. Assegureu-vos que no hi ha cap aplicació que actualment en faci ús.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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&apos;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&apos;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&apos;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&apos;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
Ver Arquivo
@@ -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 &apos;%1&apos;, ale nebylo možné jej odebrat. Ujistěte se, že není aktuálně používán jinou aplikací.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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 &apos;%1&apos; wurde gefunden, konnte jedoch nicht entfernt werden. Bitte stellen Sie sicher, dass keine Anwendung es verwendet.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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>Βρέθηκε ένα παλαιότερο αρχείο συγχρονισμού &apos;%1&apos;, αλλά δεν μπόρεσε να αφαιρεθεί. Παρακαλώ βεβαιωθείτε ότι καμμία εφαρμογή δεν το χρησιμοποιεί αυτή τη στιγμή.</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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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 &apos;%1&apos;; pero no se ha podido eliminar. Por favor, asegúrese de que ninguna aplicación la esté utilizando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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>
+21 -21
Ver Arquivo
@@ -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 &apos;%1&apos; fue encontrada, pero no se pudo eliminar. Por favor, asegurate que ninguna aplicación la está utilizando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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 &apos;%1&apos;, kuid selle eemaldamine ebaõnnenstus. Palun veendu, et seda kasutaks ükski programm.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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 &apos;%1&apos; sinkronizazio erregistro zaharra, baina ezin da ezabatu. Ziurtatu aplikaziorik ez dela erabiltzen ari.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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 é 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 &apos;%1&apos; a é trouvé, mais ne peut être supprimé. Veuillez vous assurer quaucune application ne l&apos;utilise en ce moment.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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&apos;est achevée avec succès mais avec des avertissement à propos de certains fichiers.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="1195"/>
<location filename="../src/gui/folderman.cpp" line="1196"/>
<source>Setup Error.</source>
<translation>Erreur d&apos;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&apos;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&apos;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&apos;avez pas la permission d&apos;é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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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&apos;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 &apos;%1&apos;, ma non può essere rimosso. Assicurati che nessuna applicazione lo stia utilizzando.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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&apos;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&apos;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&apos;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&apos;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&apos;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&apos;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&apos;altra!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of 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> &apos;%1&apos; 使</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>
+22 -22
Ver Arquivo
@@ -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 &apos;%1&apos; ble funnet men kunne ikke fjernes. Pass at ingen applikasjoner bruker den.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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 å 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 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 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 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
Ver Arquivo
@@ -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 &apos;%1&apos; is gevonden maar kan niet worden verwijderd. Zorg ervoor dat geen applicatie dit bestand gebruikt.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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 &apos;%1&apos; został znaleziony, lecz nie mógł być usunięty. Proszę się upewnić, że żaden program go obecnie nie używa.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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 &apos;journal&apos; de sincronização, mas não foi possível removê-lo. Por favor, certifique-se que nenhuma aplicação o está a utilizar.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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 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 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 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 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 contém uma pasta usada numa ligação de sincronização de pasta. Por favor, escolha outra!</translation>
</message>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of 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 &apos;%1&apos; foi encontrada, mas não pôde ser removida. Por favor, certifique-se de que nenhuma aplicação está a usá-la.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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 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 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 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 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 está contido em uma pasta usada em uma conexão de sincronização de pastas. Por favor, escolha outra!</translation>
</message>
+27 -27
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of 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>Найден старый журнал синхронизации &apos;%1&apos;, и он не может быть удалён. Убедитесь что он не открыт в другом приложении.</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>&lt;p&gt;Version %2. For more information visit &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For known issues and help, please visit: &lt;a href=&quot;https://central.owncloud.org/c/help/desktop-file-sync&quot;&gt;https://central.owncloud.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;By Klaas Freitag, Daniel Molkentin, Olivier Goffart, Markus Götz, Jan-Christoph Borchardt, and others.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Copyright ownCloud GmbH&lt;/p&gt;&lt;p&gt;Licensed under the GNU General Public License (GPL) Version 2.0&lt;br/&gt;ownCloud and the ownCloud Logo are registered trademarks of ownCloud GmbH in the United States, other countries, or both.&lt;/p&gt;</source>
<translation>&lt;p&gt;Версия %2. За известными проблемами и помощью обращайтесь по ссылке &lt;a href=&quot;%3&quot;&gt;https://%4&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;small&gt;Авторы: Клаас Фрейтаг, Дэниель Молкентен, Оливье Гоффар, Маркус Гётц, Жан-Кристоф Бошар, и другие.&lt;/small&gt;&lt;/p&gt;&lt;p&gt;Авторские права принадлежат ownCloud GmbH&lt;/p&gt;&lt;p&gt;Лицензировано под GNU General Public License (GPL) версии 2.0&lt;br/&gt;ownCloud и логотип ownCloud — зарегистрированные торговые марки ownCloud GmbH в Соединённых Штатах, и/или других странах.&lt;/p&gt;</translation>
<translation type="unfinished"/>
</message>
</context>
<context>
+22 -22
Ver Arquivo
@@ -404,8 +404,8 @@
</message>
<message>
<location filename="../src/gui/activitywidget.cpp" line="620"/>
<source>The list of 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 &apos;%1&apos; nájdený, avšak neodstrániteľný. Prosím uistite sa, že žiadna aplikácia ho práve nevyužíva.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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 &apos;%1&apos;, vendar ga ni mogoče odstraniti. Preverite, ali je datoteka v uporabi.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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
Ver Arquivo
@@ -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 &apos;%1&apos; hittades, men kunde inte raderas. Vänligen se till att inga program för tillfället använder den.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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 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
Ver Arquivo
@@ -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> &apos;%1&apos; </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
Ver Arquivo
@@ -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üğü &apos;%1&apos; bulundu ancak kaldırılamadı. Başka bir uygulama tarafından kullanılmadığından emin olun.</translation>
</message>
<message>
<location filename="../src/gui/folderman.cpp" line="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
Ver Arquivo
@@ -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>Знайдено старий журнал синхронізації &apos;%1&apos;, його неможливо видалити. Будь ласка, впевніться що він не відкритий в іншій програмі.</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
Ver Arquivo
@@ -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> &apos;%1&apos; 使</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>
+22 -22
Ver Arquivo
@@ -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>&apos;%1&apos;使</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>