summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Ohly <patrick.ohly@intel.com>2010-07-16 16:09:14 +0200
committerPatrick Ohly <patrick.ohly@intel.com>2010-07-16 16:09:14 +0200
commitab6ae20a51a1cb3cbbdb6ee7f379b0bb68a2d486 (patch)
tree3c1b13f1e12f5836933949bf6a07b06c1276d313
parent6c286611960d229038c0ca7ced275608988cc213 (diff)
parent677e163d562fae8374f0191c6ee5163d9c9552f0 (diff)
Merge commit 'syncevolution-1-0' into meego-1.0
Conflicts: po/de.po po/es.po po/it.po po/ja.po po/ru.po Translations were updated independently, leading mostly to conflicts because of line number changes.
-rw-r--r--HACKING74
-rw-r--r--Makefile-gen.am36
-rw-r--r--NEWS192
-rw-r--r--README856
-rw-r--r--README.rst631
-rw-r--r--configure-post.in1
-rw-r--r--configure-pre.in38
-rw-r--r--po/ast.po917
-rw-r--r--po/de.po168
-rw-r--r--po/es.po126
-rw-r--r--po/fi.po511
-rw-r--r--po/fr.po291
-rw-r--r--po/it.po172
-rw-r--r--po/ja.po128
-rw-r--r--po/nl.po329
-rw-r--r--po/ru.po16
-rw-r--r--po/tr.po879
-rw-r--r--po/zh_TW.po482
-rw-r--r--src/Makefile-gen.am21
-rw-r--r--src/backends/evolution/EvolutionCalendarSource.cpp27
-rw-r--r--src/dbus/Makefile.am2
-rw-r--r--src/dbus/interfaces/Makefile.am30
-rw-r--r--src/dbus/interfaces/README9
-rw-r--r--src/dbus/interfaces/dbus-introspect-docs.dtd32
-rw-r--r--src/dbus/interfaces/spec-strip-docs.xsl1
-rw-r--r--src/dbus/interfaces/spec-to-docbook.xsl271
-rw-r--r--src/dbus/interfaces/syncevo-server-full.xml134
-rw-r--r--src/dbus/interfaces/syncevo-session-full.xml35
-rw-r--r--src/dbus/qt/dbustypes.cpp78
-rw-r--r--src/dbus/qt/dbustypes.h97
-rw-r--r--src/gtk-ui/sync-config-widget.c1
-rw-r--r--src/gtk-ui/sync-ui.c44
-rw-r--r--src/gtk-ui/ui.glade758
-rw-r--r--src/syncevo-dbus-server.cpp13
-rw-r--r--src/syncevo/Cmdline.cpp17
-rw-r--r--src/syncevo/ConfigNode.cpp43
-rw-r--r--src/syncevo/DataBlob.h63
-rw-r--r--src/syncevo/FileConfigNode.cpp18
-rw-r--r--src/syncevo/FileDataBlob.cpp71
-rw-r--r--src/syncevo/FileDataBlob.h61
-rw-r--r--src/syncevo/IniConfigNode.cpp375
-rw-r--r--src/syncevo/IniConfigNode.h130
-rw-r--r--src/syncevo/LogRedirect.cpp18
-rw-r--r--src/syncevo/Makefile.am15
-rw-r--r--src/syncevo/SafeOstream.cpp51
-rw-r--r--src/syncevo/SafeOstream.h56
-rw-r--r--src/syncevo/SingleFileConfigTree.cpp242
-rw-r--r--src/syncevo/SingleFileConfigTree.h94
-rw-r--r--src/syncevo/StringDataBlob.cpp47
-rw-r--r--src/syncevo/StringDataBlob.h61
-rw-r--r--src/syncevo/SyncConfig.cpp96
-rw-r--r--src/syncevo/SyncConfig.h6
-rw-r--r--src/syncevo/SyncContext.cpp56
-rw-r--r--src/syncevo/SyncContext.h4
-rw-r--r--src/syncevo/SyncML.cpp2
-rw-r--r--src/syncevo/configs/remoterules/server/46_E55.xml14
-rw-r--r--src/syncevo/eds_abi_wrapper.cpp10
-rw-r--r--src/syncevo/eds_abi_wrapper.h12
-rw-r--r--src/syncevo/lcs.h16
-rw-r--r--src/syncevo/util.cpp29
-rw-r--r--src/syncevo/util.h17
-rw-r--r--src/templates/clients/SyncEvolution.ini26
-rw-r--r--src/templates/clients/SyncEvolution/config.ini4
-rw-r--r--src/templates/clients/SyncEvolution/sources/addressbook/config.ini2
-rw-r--r--src/templates/clients/SyncEvolution/sources/calendar/config.ini2
-rw-r--r--src/templates/clients/SyncEvolution/sources/memo/config.ini2
-rw-r--r--src/templates/clients/SyncEvolution/sources/todo/config.ini2
-rw-r--r--src/templates/clients/SyncEvolution/template.ini2
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c.ini29
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini4
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini1
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini1
-rw-r--r--src/templates/clients/phone/nokia/S40/7210c/template.ini3
-rw-r--r--src/templates/clients/phone/nokia/S60/N85.ini31
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/config.ini3
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini4
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini1
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini1
-rw-r--r--src/templates/clients/phone/nokia/S60/N85/template.ini4
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900.ini29
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/config.ini3
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini4
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini1
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini2
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini1
-rw-r--r--src/templates/clients/phone/nokia/maemo/n900/template.ini2
-rw-r--r--src/templates/servers/Funambol.ini28
-rw-r--r--src/templates/servers/Funambol/config.ini7
-rw-r--r--src/templates/servers/Funambol/sources/addressbook/config.ini2
-rw-r--r--src/templates/servers/Funambol/sources/calendar/config.ini3
-rw-r--r--src/templates/servers/Funambol/sources/memo/config.ini1
-rw-r--r--src/templates/servers/Funambol/sources/todo/config.ini3
-rw-r--r--src/templates/servers/Funambol/template.ini2
-rw-r--r--src/templates/servers/ScheduleWorld.ini22
-rw-r--r--src/templates/servers/ScheduleWorld/config.ini5
-rw-r--r--src/templates/servers/ScheduleWorld/sources/addressbook/config.ini2
-rw-r--r--src/templates/servers/ScheduleWorld/sources/calendar/config.ini1
-rw-r--r--src/templates/servers/ScheduleWorld/sources/memo/config.ini1
-rw-r--r--src/templates/servers/ScheduleWorld/sources/todo/config.ini1
-rw-r--r--src/templates/servers/ScheduleWorld/template.ini2
-rw-r--r--test/ClientTest.cpp12
-rw-r--r--test/Makefile.am1
-rw-r--r--test/README.funambol2
-rw-r--r--test/evo.supp264
-rw-r--r--test/generate-html.xsl53
-rwxr-xr-xtest/resultchecker.py7
-rwxr-xr-xtest/runtests.py11
-rwxr-xr-xtest/syncevo-phone-config.py678
-rwxr-xr-xtest/test-dbus.py48
-rw-r--r--test/testcases/ical20.ics.local66
-rw-r--r--test/testcases/itodo20.ics.funambol.tem.patch6
117 files changed, 7481 insertions, 2947 deletions
diff --git a/HACKING b/HACKING
index af25ee7e..c7b087a6 100644
--- a/HACKING
+++ b/HACKING
@@ -1,3 +1,77 @@
+Compiling from Source
+---------------------
+
+To compile the code the source or an installation of the Synthesis
+SyncML engine is needed. A compatible snapshot of it is included in
+SyncEvolution source packages and will be used automatically.
+The section _`Checking out the source` explains how to work
+with sources obtained via the git repositories.
+
+Also needed are the Evolution and Boost (>= 1.35) development
+files. For HTTP, either Curl or libsoup can be used.
+
+On Debian based systems the required packages can be installed with
+ apt-get install evolution-data-server-dev \
+ libecal1.2-dev libebook1.2-dev \
+ libsoup2.4-dev \
+ libboost-dev
+
+libboost-dev >= 1.34, available as libboost1.35-dev backport for Debian Etch.
+
+Necessary on some distros due to bad dependencies (not needed by SyncEvolution itself):
+ apt-get install libdb3-dev
+
+Optional (enables reading proxy settings from GNOME preferences):
+ apt-get install libsoup-gnome2.4-dev
+
+Optional (enables direct sync with phones):
+ apt-get install libopenobex-dev libbluetooth-dev
+
+Optional (only used for SHA-256 when glib is not already a dependency):
+ apt-get install libnss3-dev
+
+For compiling libsynthesis:
+ apt-get install libpcre3-dev libsqlite3-dev libexpat-dev libz-dev
+
+This was copied from the libsynthesis README.
+
+The test framework also requires CPPUnit:
+ apt-get install libcppunit-dev
+
+For the GUI and its D-Bus based service backend:
+ apt-get install libdbus-glib-1-dev \
+ xsltproc \
+ libglib2.0-dev \
+ libgtk2.0-dev libglade2-dev \
+ libgnome-keyring-dev \
+ libgconf2-dev libgnomevfs2-dev
+
+Optional packages for GUI:
+ apt-get install libunique-dev
+
+libunique = ensure that GTK GUI only runs once per user
+
+Optional packages for GNOME Bluetooth Panel plugin:
+ apt-get install libgnome-bluetooth-dev
+
+The plugin adds a button to invoke sync-UI after a device
+was paired which supports SyncML.
+
+The build system is the normal autotools system. See INSTALL for
+general instructions how to use that and "./configure --help" for
+SyncEvolution specific options.
+
+Note that compiling without the Evolution development files is
+possible. But because this is usually not what people want,
+the configure script needs explicit --disable-ecal --disable-ebook
+parameters, otherwise it will refuse to compile without Evolution
+support.
+
+When compiling from a git checkout, remember to run "./autogen.sh".
+It depends on:
+ apt-get install libtool intltool automake
+
+
Checking out the Source
-----------------------
diff --git a/Makefile-gen.am b/Makefile-gen.am
index 96e35e43..3eb0e5b4 100644
--- a/Makefile-gen.am
+++ b/Makefile-gen.am
@@ -2,11 +2,18 @@
ACLOCAL_AMFLAGS = -I m4 -I m4-repo
+man_MANS =
dist_doc_DATA =
SUBDIRS = src
if COND_CORE
SUBDIRS += po test
dist_doc_DATA += README NEWS COPYING $(TEST_README_FILES)
+if COND_HTML_README
+dist_doc_DATA += README.html
+endif
+if COND_MAN_PAGES
+man_MANS += syncevolution.1
+endif
endif
DIST_SUBDIRS = src po test
@@ -14,6 +21,7 @@ EXTRA_DIST = \
HACKING \
LICENSE.txt \
LICENSE.LGPL-21 \
+ README.rst \
description \
configure-pre.in \
configure-post.in \
@@ -33,7 +41,7 @@ DEV_FILE_PATTERN = $(1)$(2)/etc $(1)$(2)/include $(1)$(2)/lib/*.so $(1)$(2)/lib/
if COND_DBUS
# when building with D-Bus, we have no choice: the service has to go into /usr
# in order to be found
-distbin : README NEWS COPYING $(TEST_README_FILES) INSTALL-tar-gz all
+distbin : $(dist_doc_DATA) INSTALL-tar-gz all
@ [ "$(BINSUFFIX)" ] || (echo "please invoke with e.g. 'make distbin BINSUFFIX=debian-3.1'"; exit 1 )
@ [ "$(prefix)" == "/usr" ] || (echo "please reconfigure with --prefix=/usr"; exit 1 )
rm -rf $(distdir)
@@ -43,20 +51,20 @@ distbin : README NEWS COPYING $(TEST_README_FILES) INSTALL-tar-gz all
for i in `find $(distdir) -type d | sort -r`; do rmdir $$i 2>/dev/null || true; done
mkdir -p $(distdir)/usr/share/doc/syncevolution
cp $(srcdir)/INSTALL-tar-gz $(distdir)/INSTALL
- cp $(srcdir)/README $(srcdir)/NEWS $(srcdir)/COPYING $(TEST_README_FILES) $(distdir)/usr/share/doc/syncevolution
+ cp $(filter-out all, $+) $(distdir)/usr/share/doc/syncevolution
tar zcf $(distdir)-$(BINSUFFIX).tar.gz $(distdir)
rm -rf $(distdir)
else
# without D-Bus, we can simply create an archive with a bin directory
# and everything works
-distbin : README NEWS COPYING all
+distbin : $(dist_doc_DATA) all
@ [ "$(BINSUFFIX)" ] || (echo "please invoke with e.g. 'make distbin BINSUFFIX=debian-3.1'"; exit 1 )
rm -rf $(distdir)
$(MAKE) prefix=`pwd`/$(distdir) install
echo removing developer files and empty directories
rm -rf $(call DEV_FILE_PATTERN,$(distdir),/)
for i in `find $(distdir) -type d | sort -r`; do rmdir $$i 2>/dev/null || true; done
- cp $(srcdir)/README $(srcdir)/NEWS $(srcdir)/COPYING $(TEST_README_FILES) $(distdir)
+ cp $(filter-out all, $+) $(distdir)
tar zcf $(distdir)-$(BINSUFFIX).tar.gz $(distdir)
rm -rf $(distdir)
endif
@@ -212,3 +220,23 @@ installcheck-local:
fi \
done
endif
+
+# patch README.rst properties on-the-fly with sed expressions
+PATCH_README = -e "s/^:Version: .*/:Version: $(VERSION)/" -e "s/:Date: .*/:Date: `date +%Y-%m-%d`/"
+
+# produce man pages
+syncevolution.1: README.rst
+ sed $(PATCH_README) $< | $(RST2MAN) --exit-status=3 - >$@
+CLEANFILES += syncevolution.1
+
+# README is the traditional name in the distribution,
+# continue using it instead of README.rst.
+README: README.rst
+ sed $(PATCH_README) $< >$@
+CLEANFILES += README
+
+# The README.html is also used on syncevolution.org as "Usage" page,
+# therefore we must use <h3> headers and lower to fit into the page.
+README.html: README.rst
+ sed $(PATCH_README) $< | $(RST2HTML) --initial-header-level=3 --exit-status=3 - >$@
+CLEANFILES += README.html
diff --git a/NEWS b/NEWS
index f8154aea..16e90921 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,185 @@
-SyncEvolution 1.0 beta 2 -> beta 3, xxxxxxxxxx
+SyncEvolution 0.9.2 -> 1.0, 11.06.2010
+======================================
+
+Major new features compared to previous stable release:
+* synchronize directly with a phone over Bluetooth/OBEX
+* accept Bluetooth/OBEX connections in cooperation with obexd >= 0.19
+* run SyncEvolution as a rudimentary HTTP SyncML server
+
+The GTK sync-UI can be used to select a paired phone and create a
+configuration for it based on the bundled configuration templates.
+Configuration templates are included for Nokia phones; for other
+phones see the http://syncevolution.org/development/sync-phone HOWTO
+and check out the Wiki there. Some users have already reported success
+for Sony Ericsson phones and added setup instructions. New templates
+from the Wiki can be dropped into ~/.config/syncevolution-templates
+under an arbitrary file name.
+
+Unexpected slow syncs can be detected when running as client (MB
+#2416) and unless turned off (see "preventSlowSync"), SyncEvolution
+aborts the session so that the situation can be analyzed. A refresh
+from client or server might be more suitable. The command line tool
+provides instructions at the end of its output. The GTK sync-UI
+points towards its recovery dialog.
+
+Automatic synchronization is supported by the syncevo-dbus-server (MB
+#6378). When that is installed, it will be started as part of a user
+session and keep running to trigger syncs in the
+background. Notifications are emitted when syncs start, end or fail
+(MB #10000).
+
+Automatic synchronization can be enabled separately for each peer
+("autoSync=0/1", off by default), will be done at regular intervals
+("autoSyncInterval=30" minutes) when online long enough
+("autoSyncDelay=5" minutes). That last option ensures that a) an
+automatic sync does not attempt to use a network connection unless it
+was already active and b) hopefully is also around long enough to
+complete the sync.
+
+The Synthesis XML configuration was split up into different parts
+which are assembled from /usr/share/syncevolution/xml. Files in
+~/.config/syncevolution-xml override and extend the default files,
+which my be useful when adding support for a new phone.
+
+SyncML servers:
+* ZYB.com now works thanks to a workaround for anchor handling (MB #2424);
+ only contacts tested because everything else is considered legacy by ZYB.com
+* Horde: avoid confusing the server with a deviceId that starts like the
+ ones used in old Funambol clients, helps with calendar sync (MB #9347)
+* Mobical.net (and other, similar services): fix vCalendar 1.0 alarm
+ properties before importing them (MB #10458)
+* desknow.com works when switching to SyncMLVersion = 1.1
+* Funambol, Memotoo (and probably others): preserve meeting series when
+ receiving update for detached recurrence (MBC #1916)
+
+Evolution:
+* addressbook backend: avoid picking CouchDB, second try (MB #7877)
+* calendar backend: minor fix for change tracking when deleting
+ a single instance of a recurring event
+* workaround for Evolution 2.30: "timezone cannot be retrieved because it
+ doesn't exist" is triggered incorrectly when importing non-standard
+ timezone definitions because libecal changed an error code (MB #9820)
+
+Performance and reliability improvements (MB #7708):
+* synccompare much faster
+* database dumps consume less disk space
+* more intelligent about expiring obsolete session directories
+ and backups
+* database accesses are reduced in several backends
+* shorter logs (MB #8092)
+* message resending helps under unreliable network connectivity ("RetryInterval")
+* full support for suspend&resume in SyncEvolution client to SyncEvolution or
+ Synthesis server syncs
+* better handling of certain third-party time zone definitions (MBC #1332)
+
+Improved GTK sync-UI:
+* revised config screen: all in one list where entries can be expanded,
+ integrated setup of sync with other devices
+* recovery support: restore from backup, unexpected slow sync handling
+* spinner while network is in use (MB #2229)
+* interactive password requests (MB #6376)
+* uses new D-Bus API
+
+Command line:
+* fixed printing of rejected items (MB #7755)
+* consistent logging of added/updated/deleted items with short
+ description
+* improved error reporting (textual descriptions instead of plain
+ error codes MB #2069, partial success MB #7755, record and show
+ first ERROR encountered MB #7708)
+* can create new sources (MB #8424)
+* runs operations inside daemon and thus avoids conflicts with
+ operations done by other clients; for testing purposes (like
+ running a client which talks to a local server in the daemon) it is
+ still possible to ignore the daemon (--daemon=no, MB #5043)
+* revised README, now also available as man page (MBC #690)
+
+Redesigned and reimplemented D-Bus API, used by sync-UI and command line:
+* central syncevo-dbus-server controls configurations and sync sessions:
+ http://syncevolution.org/development/direct-synchronization-aka-syncml-server
+* accepts incoming SyncML connection requests and messages received by
+ independent transport stubs (obexd, HTTP server, ...)
+* can be used by multiple user interfaces at once
+* fully documented, see src/dbus/interfaces and http://api.syncevolution.org
+* no longer depends on dbus-glib with hand-written glue code for C++,
+ instead uses gdbus plus automatic C++ binding generated via C++ templates
+
+Revised configuration layout (MB #8048, design document at
+http://syncevolution.org/development/configuration-handling):
+* several peer-independent sync and source properties are shared
+ between multiple peers
+* they can be accessed without selecting a specific peer, by using an
+ empty config name or with the new "@<specific context>" syntax
+* user interface of command line unchanged
+* old configurations can be read and written, without causing
+ unwanted slow syncs when moving between stable and unstable
+ SyncEvolution versions
+* old configurations can be migrated with the "--migrate" command
+ line switch; however, then older SyncEvolution can no longer
+ access them and migrating more than one old configuration causes
+ the second or later configuration to loose its "deviceId" property
+ (which is shared now), causing a slow sync once
+* config names may contain characters that are not allowed in the
+ file names used for the underlying files; will be replaced with
+ underscores automatically (MB #8350)
+
+
+Upgrading from 0.9.x:
+
+* Upgrading and downgrading should work seamlessly when using existing
+ configurations.
+
+* The new configuration layout is only used when creating new
+ configurations or explicitly invoking "syncevolution --migrate" (see
+ above). Such configs cannot be used by older SyncEvolution releases.
+
+* The new "RetryInterval" property causes messages to be resent
+ after 2 minutes (increased from 1 minute in previous 1.0 betas).
+ At least the Funambol server is known to not handle this correctly
+ in all cases (http://funzilla.funambol.com/show_bug.cgi?id=7910).
+ So in the Funambol config template the interval is set to zero,
+ disabling the feature. Disabling the feature must be done manually
+ in existing Funambol configurations.
+
+
+SyncEvolution 1.0 beta 3 -> 1.0 final, 11.06.2010
+=================================================
+
+Bug fixes and new features:
+
+* Configuration templates are stored in a single file (MBC #1208).
+ New templates (like something downloaded from http://syncevolution.org/wiki)
+ can be dropped into $HOME/.config/syncevolution-templates using an arbitrary
+ file name.
+* Progress and per-source status are now also reported and recorded when
+ running in server mode (MBC #1359). There are still several limitations
+ (sync mode not reported, no information about sent/received/processed items
+ while the sync runs, see MBC #2786).
+* Better handling of certain third-party time zone definitions (MBC #1332).
+ Better logging to track down such problems.
+* D-Bus server + command line: return error code when failed (MBC #2193)
+* syncevo-phone-config: simplified command line options, several bug fixes
+ (syntax error, incorrect handling of calendar+todo, MBC #1197)
+* Revised README, now also available as man page (MBC #690). Conversion of D-Bus API
+ documentation into .html page (MBC #1745).
+* Funambol, Memotoo (and probably others): preserve meeting series when
+ receiving update for detached recurrence (MBC #1916)
+* Fix for potential out-of-bounds memory access (MBC #1007).
+* HTTP server: fix for potential crash when second session was requested while an
+ older one was still running, initial sync was done without libical time zone
+ information and thus may have mismatched times (MBC #2435)
+* Nokia E55: convert alarm times (MBC #1657). This is done via a new remote rule
+ in /usr/share/syncevolution/xml/remoterules/server/46_E55.xml
+ If another phone needs the same treatment, then copy that file to
+ ~/.config/syncevolution-xml/remoterules/server and edit the <model> element.
+* GTK GUI: styling fix (MBC #1372), updated toolbar for MeeGo 1.0 (MBC #1970),
+ avoid duplicating configs when selecting a config created by syncevo-phone-config
+ or the command line (MBC #1266), scroll bars for emergency window (MBC #1296),
+ avoid compile problem on Fedora Core 13 due to name collision with system sync()
+ call, updated translations.
+
+
+SyncEvolution 1.0 beta 2 -> beta 3, 20.04.2010
==============================================
One more step towards the long awaited 1.0. 0.1 was released over four
@@ -49,6 +230,15 @@ interoperability testing with such phones has been done at this
time. When acting as client, that same property allows talking to
older SyncML servers, like desknow.com.
+A minor workaround and the right configuration make it possible to
+synchronize with Nokia N85 and probably also other S60
+devices. Added a template for "Nokia S60". Also made the template
+for "Nokia N900" accessible in the GTK GUI.
+
+Because determining which configuration works for a phone involves
+a lot of trial-and-error, the new "syncevo-phone-config" script
+automates that process.
+
Other changes:
* Mobical.net (and other, similar services): fix vCalendar 1.0 alarm
diff --git a/README b/README
deleted file mode 100644
index 7d5b8e39..00000000
--- a/README
+++ /dev/null
@@ -1,856 +0,0 @@
-Introduction
-------------
-
-SyncEvolution synchronizes personal information management (PIM) data
-like contacts, calendars, tasks and memos via the SyncML information
-synchronization standard. It supports all of these for GNOME's
-Evolution and contacts for the system address book of the Nokia
-Internet Tablets, Mac OS X and (at one point, but not anymore) the
-iPhone. The command-line tool 'syncevolution' (compiled separately for
-each of these platforms) executes the synchronization. On platforms
-with GTK, the 'sync-ui' provides a graphical user interface. The
-project 'Genesis' (available separately) implements a graphical
-frontend that sits in the system tray.
-
-The items are exchanged in the vCard 2.1/3.0, iCalender 2.0/vCalendar 1.0
-and textual format via the open source Synthesis SyncML engine,
-which makes SyncEvolution compatible with the majority of SyncML
-servers. Full, one-way and incremental synchronization of items are
-supported.
-
-Normally, SyncEvolution does not synchronize with another SyncML
-capable device or another computer directly. A SyncML server that that
-device and SyncEvolution can talk to is needed. There are several
-options for that:
-- using a web service like ScheduleWorld or myFUNAMBOL which store
- the data to be synchronized on a server and provide access to it
- via SyncML
-- installing a SyncML server like the free one from Funambol on
- one's own server
-- installing a SyncML server on the desktop
-
-Since 1.0, SyncEvolution is also capable of synchronizing with another
-device via Bluetooth directly. There is also a SyncEvolution HTTP
-server which works for single-user scenarios. This is both still a bit
-experimental and not explained further here.
-
-The recommended solution is ScheduleWorld because it is easier than
-setting up a server and provides better support for vCard and
-iCalendar data than the stock Funambol server installation. Setting up
-a server on the desktop has the additional problem that not all mobile
-devices can communicate with the desktop via HTTP.
-
-All SyncML synchronization modes are supported by SyncEvolution:
-- exchanging just the changes between client and server ("two-way")
-- sending just the changes in one direction ("one-way-from-client/server")
-- replacing all items with the ones stored in the peer
- ("refresh-from-client/server")
-- a full synchronization where all items are sent to the server and
- the server then decides which items need to be deleted, added or
- updated on the client ("slow")
-
-The remainder of this document assumes that either Funambol's
-myFUNAMBOL service or ScheduleWorld are used: because ScheduleWorld is
-based on the Funambol server, configuration and usage are often
-similar.
-
-With a server that fully supports SyncML and vCard/iCalender
-the following works:
-- copy a complete database to the server and restore it
- from the server later
-- delete or modify an item locally, then make the same change
- on the server
-- delete, modify or add items on the server (by synchronizing with
- another client or using a web interface), then apply the same
- change locally
-- conflict resolution (where two clients modify the same item,
- then sync with the server) is handled by the server, but
- SyncEvolution has support which ensures that no data is lost
- by creating duplicates (see "Conflict Resolution" below)
-
-For conflict resolution and synchronization between clients which
-support different attributes of items the server needs an
-understanding of the format of items. The Funambol server supports
-that for contacts, but not yet for the calendar events and tasks that
-SyncEvolution sends; see "Configuration with Funambol" below for more
-information. ScheduleWorld also works with SyncEvolution for
-calendars plus tasks.
-
-
-Installation
-------------
-
-To install SyncEvolution, just unpack an archive with a precompiled
-binary for your platform in a directory of your choice or install one
-of the packages. Then create a configuration as described below under
-"Configuration". No special environment variables are needed, although
-one might want to add the directory which contains the "syncevolution"
-binary to the shell's PATH variable.
-
-When a binary packages is not available for the target system
-and/or is not up-to-date, compiling from source can also be used
-to produce a binary. See below in "Compiling from Source" for details.
-
-Although all of the features are covered by unit testing and
-have been verified to work, it is highly recommended that you
-make a backup of your
- $HOME/.evolution/addressbook
- $HOME/.evolution/calendar
- $HOME/.evolution/tasks
- $HOME/.evolution/memos
-directories before running SyncEvolution for the first time with
-Evolution. In older Evolution versions the same data is found in
-$HOME/evolution.
-
-Configuration templates for SyncML peers are searched in the following
-order:
-- $SYNCEVOLUTION_TEMPLATE_DIR
-- "/usr/share/syncevolution/templates" (prefix may be different,
- depending on compilation)
-- built-in templates
-
-The properties defined in a template override the default properties,
-so usually only those properties which specifically need to be set for
-a certain peer should be listed in its template config. Don't copy
-these files, they are not complete! Use the command line or a GUI
-instead, which reads the files and produces complete configurations.
-
-
-Usage
------
-
-Currently SyncEvolution comes as a simple command line tool which is
-configured via files. The general synopsis of the command line
-parameters is:
-
- syncevolution [<options>] [<config>] [<source> ...]
-
-The <config> and the <source> strings are used to find the
-configuration files which determine how synchronization is going to
-proceed. Each source corresponds to one local address book, calendar,
-task list or set of memos and the corresponding database on the
-peer. Depending on which parameters are given, different operations
-are executed.
-
-Starting with SyncEvolution 1.0, <config> strings can have different
-meanings. Typically, a simple string like "scheduleworld" refers to
-the configuration for that peer, as it did in previous releases. A
-peer is either a SyncML server (the traditional usage of
-SyncEvolution) or a client (the new feature in 1.0).
-
-Each peer configuration exists inside a specific context, typically
-the "@default" context. All peers in the same context share some parts
-of their configuration, for example, which local databases are to be
-synchronized. In that sense, a configuration context can be seen as a
-set of local databases plus the peer configurations that are
-synchronized against those databases.
-
-When different peers are meant to synchronize different local
-databases, then different contexts have to be used when setting up the
-peers by appending a context name after the "at" sign, as in
-"scheduleworld2@other-context". Later on, if "scheduleworld2" is
-unique, the "@other-context" suffix becomes optional.
-
-Sometimes it is also useful to change configuration options of a
-context, without modifying a specific peer. This can be done by using
-"@default" (or some other context name) without anything before the
-"at" sign. The empty string "" is the same as "@default".
-
- syncevolution
-
-If no arguments are given, then SyncEvolution will list all available
-data sources regardless whether there is a configuration file for them
-or not. The output includes the identifiers which can then be used to
-select those sources in a configuration file. For each source one can
-set a different synchronization mode in its configuration file.
-
- syncevolution <config>
-
-Without the optional list of sources all sources which are enabled in
-their configuration file are synchronized.
-
- syncevolution <config> <source> ...
-
-Otherwise only the ones mentioned on the command line are active. It
-is possible to configure sources without activating their
-synchronization: if the synchronization mode of a source is set to
-"none", the source will be ignored. Explicitly listing such a source
-will synchronize it in "two-way" mode once.
-
-Progress and error messages are written into a log file that is
-preserved for each synchronization run. Details about that is found in
-the "Automatic Backups and Logging" section below. All errors and
-warnings are printed directly to the console in addition to writing
-them into the log file. Before quitting SyncEvolution will print a
-summary of how the local data was modified. This is done with the
-"synccompare" utility script described in the "Exchanging Data"
-section.
-
-When the "logdir" option is enabled (since v0.9 done by default for
-new configurations), then the same comparison is also done before the
-synchronization starts.
-
-In case of a severe error the synchronization run is aborted
-prematurely and SyncEvolution will return a non-zero value. Recovery
-from failed synchronization is done by forcing a full synchronization
-during the next run, i.e. by sending all items and letting the SyncML
-server compare against the ones it already knows. This is avoided
-whenever possible because matching items during a slow synchronization
-can lead to duplicate entries.
-
-After a successful synchronization the server's configuration file is
-updated so that the next run can be done incrementally. If the
-configuration file has to be recreated e.g. because it was lost, the
-next run recovers from that by doing a full synchronization. The risk
-associated with this is that the server might not recognize items that
-it already has stored previously which then would lead to duplication
-of items.
-
- syncevolution --configure <options for configuration> <config> [<source> ...]
-
-Options in the configuration can be modified via the command
-line. Source properties are changed for all sources unless sources are
-listed explicitly. Some source properties have to be different for
-each source, in which case syncevolution must be called multiple times
-with one source listed in each invocation.
-
- syncevolution --remove <config>
-
-Deletes the configuration. If the <config> refers to a specific
-peer, only that peer's configuration is removed. If it refers to
-a context, that context and all peers inside it are removed.
-
-Note that there is no confirmation question. Neither local data
-referenced by the configuration nor the content of log dirs are
-deleted.
-
- syncevolution --run <options for run> <config> [<source> ...]
-
-Options can also be overridden for just the current run, without
-changing the configuration. In order to prevent accidentally running a
-sync session when a configuration change was intended, either
---configure or --run must be given explicitly if options are specified
-on the command line.
-
- syncevolution --status <config> [<source> ...]
-
-Prints what changes were made locally since the last synchronization.
-Depends on access to database dumps from the last run, so using the
-"logdir" option is recommended.
-
- syncevolution --print-servers|--print-configs|--print-peers
- syncevolution --print-config [--quiet] <config> [main|<source> ...]
- syncevolution --print-sessions [--quiet] <config>
-
-These commands print information about existing configurations. When
-printing a configuration a short version without comments can be
-selected with --quiet. When sources are listed, only their
-configuration is shown. "Main" instead or in combination with sources
-lists only the main peer configuration.
-
-With --print-session information about previous synchronization
-sessions for the selected peer or context are printed. This depends on
-the "logdir" option. The information includes the log directory name
-(useful for --restore) and the synchronization report. In combination
-with --quiet, only the paths are listed.
-
- syncevolution --restore <session directory> --before|--after [--dry-run] <config> <source> ...
-
-This restores local data from the backups made before or after a
-synchronization session. The --print-sessions command can be used to
-find these backups. The source(s) have to be listed explicitly. There
-is intentionally no default, because as with --remove there is no
-confirmation question. With --dry-run, the restore is only simulated.
-
-The session directory has to be specified explicitly with its path
-name (absolute or relative to current directory). It does not have to
-be one of the currently active log directories, as long as it contains
-the right database dumps for the selected sources.
-
-A restore tries to minimize the number of item changes (see section
-"Item Changes and Data Changes"). This means that items that are
-identical before and after the change will not be transmitted anew to
-the server during the next synchronization. If the server somehow
-needs to get a clean copy of all items on the client then, use "--sync
-refresh-from-client" in the next run.
-
-
-Here is a full description of all <options> that can be put in front
-of the server name. Whenever an option accepts multiple values, a
-question mark can be used to get the corresponding help text and/or
-a list of valid values.
-
---sync|-s <mode>
---sync|-s ?
- Temporarily synchronize the active sources in that mode. Useful
- for a "refresh-from-server" or "refresh-from-client" sync which
- clears all data at one end and copies all items from the other.
-
---print-servers|--print-configs|--print-peers
- Prints the names of all configured peers to stdout. There is no
- difference between these options, the are just aliases.
-
---print-config|-p
- Prints the complete configuration for the selected <config>
- to stdout, including up-to-date comments for all properties. The
- format is the normal .ini format with source configurations in
- different sections introduced with [<source>] lines. Can be combined
- with --sync-property and --source-property to modify the configuration
- on-the-fly. When one or more sources are listed after the <config>
- name on the command line, then only the configs of those sources are
- printed. "main" selects the main configuration instead of source
- configurations. Using --quiet suppresses the comments for each property.
- When setting a --template, then the reference configuration for
- that peer is printed instead of an existing configuration.
-
---configure|-c
- Modify the configuration files for the selected peer. If no such
- configuration exists, then a new one is created using one of the
- template configurations (see --template option). When creating
- a new configuration only the active sources will be set to active
- in the new configuration, i.e. "syncevolution -c scheduleworld addressbook"
- followed by "syncevolution scheduleworld" will only synchronize the
- address book. The other sources are created in a disabled state.
- When modifying an existing configuration and sources are specified,
- then the source properties of only those sources are modified.
-
---run|-r
- To prevent accidental sync runs when a configuration change was
- intended, but the "--configure" option was not used, "--run" must be
- specified explicitly when sync or source properties are selected
- on the command line and they are meant to be used during a sync
- session triggered by the invocation.
-
---migrate
- In older SyncEvolution releases a different layout of configuration files
- was used. Using --migrate will automatically migrate to the new
- layout and rename the <config> into <config>.old to prevent accidental use
- of the old configuration. WARNING: old SyncEvolution releases cannot
- use the new configuration!
-
- The switch can also be used to migrate a configuration in the current
- configuration directory: this preserves all property values, discards
- obsolete properties and sets all comments exactly as if the configuration
- had been created from scratch. WARNING: custom comments in the
- configuration are not preserved.
-
- --migrate implies --configure and can be combined with modifying
- properties.
-
---sync-property|-y <property>=<value>
---sync-property|-y ?
---sync-property|-y <property>=?
- Overrides a source-independent configuration property for the
- current synchronization run or permanently when --configure is used
- to update the configuration. Can be used multiple times. Specifying
- an unused property will trigger an error message.
-
- When using the configuration layout introduced with 1.0, some of the
- sync properties are shared between peers, for example the directory
- where sessions are logged. Permanently changing such a shared
- property for one peer will automatically update the property for all
- other peers in the same context because the property is stored in a
- shared config file. When printing a config in verbose mode, a summary
- comment shows which properties are shared in which way.
-
---source-property|-z <property>=<value>
---source-property|-z ?
---source-property|-z <property>=?
- Same as --sync-property, but applies to the configuration of all active
- sources. "--sync <mode>" is a shortcut for "--source-property sync=<mode>".
-
- When combined with "--configure", the configuration of all sources is
- modified. Properties cannot be specified differently for different
- sources, so if you want to change a source property of just one specific
- sync source, then use "--configure --source-property ... <server> <source>".
-
- As with sync properties, some properties are shared between peers,
- in particular the selection of which local data to synchronize.
-
---template|-l <peer name>|default|?<device>
- Can be used to select from one of the built-in default configurations
- for known SyncML peers. Defaults to the <config> name, so --template
- only has to be specified when creating multiple different configurations
- for the same peer, or when using a template that is named differently
- than the peer. "default" is an alias for "scheduleworld" and can be
- used as the starting point for servers which do not have a built-in
- template.
-
- Each template contains a pseudo-random device ID. Therefore setting the
- "deviceId" sync property is only necessary when manually recreating a
- configuration or when a more descriptive name is desired.
-
- The available templates for different known SyncML servers are listed when
- using a single question mark instead of template name. When using the
- ?<device> format, a fuzzy search for a template that might be
- suitable for talking to such a device is done. The matching works best
- when using <device> = <Manufacturer>_<Model>. If you don't know the
- manufacturer, you can just keep it as empty. The output in this mode
- gives the template name followed by a short description and a rating how well
- the template matches the device (higher is better).
-
---status|-t
- The changes made to local data since the last synchronization are
- shown without starting a new one. This can be used to see in advance
- whether the local data needs to be synchronized with the server.
-
---quiet|-q
- Suppresses most of the normal output during a synchronization. The
- log file still contains all the information.
-
---keyring|-k
- Save or retrieve passwords from the GNOME keyring when modifying the
- configuration or running a synchronization. Note that using this option
- applies to *all* passwords in a configuration, so setting a single
- password as follows moves the other passwords into the keyring, if
- they were not stored there already:
- --keyring --configure --sync-property proxyPassword=foo
-
- When passwords were stored in the keyring, their value is set to "-"
- in the configuration. This means that when running a synchronization
- without the --keyring argument, the password has to be entered
- interactively. The --print-config output always shows "-" instead of
- retrieving the password from the keyring.
-
---help|-h
- Prints usage information.
-
---version
- Prints the SyncEvolution version.
-
-Use Cases
----------
-
-Migrate a configuration from the <= 0.7 format to the current one
-and/or updates the configuration so that it looks like configurations
-created anew with the current syncevolution:
- $ syncevolution --migrate scheduleworld
-
-Deactivate all sources:
- $ syncevolution --configure \
- --source-property sync=none \
- scheduleworld
-
-Activate address book synchronization again, using the --sync shortcut:
- $ syncevolution --configure \
- --sync two-way \
- scheduleworld addressbook
-
-Change the password for a configuration:
- $ syncevolution --configure \
- --sync-property password=foo \
- scheduleworld
-
-Set up another configuration for scheduleworld under a different name:
- $ syncevolution --configure \
- --sync-property username=joe \
- --sync-property password=foo \
- --template scheduleworld \
- scheduleworld_joe
-
-
-Configuration
--------------
-
-The configuration file of a certain <peer>@<context> is stored in
- $XDG_CONFIG_HOME/syncevolution/<context>/peers/<peer>/config.ini
-with " $HOME/.config" as fallback if XDG_CONFIG_HOME is not
-set. The per-peer data source properties are configured in
- $XDG_CONFIG_HOME/syncevolution/<context>/peers/<peer>/sources/<source>/config.ini
-
-The shared properties are in:
- $XDG_CONFIG_HOME/syncevolution/config.ini
- $XDG_CONFIG_HOME/syncevolution/<context>/config.ini
- $XDG_CONFIG_HOME/syncevolution/<context>/sources/
-
-There are also some hidden .synthesis, .internal.ini and
-.server.ini directories resp. files. These are used internally
-and are not meant to be edited manually.
-
-The configuration of older SyncEvolution releases in the
-following directory is also still supported for reading and
-updating, but cannot be created anymore from scratch:
- $HOME/.sync4j/evolution/<server>/spds/syncml/config.txt
- $XDG_CONFIG_HOME/syncevolution/<server>/
-
-The format is a simple list of
- <property> = <value>
-pairs with one pair per line. Leading spaces and space around the
-equals character and at the end of the line are skipped. In other words,
-values can neither start or end with spaces nor contain line breaks. Do not
-put quotation marks around <value>, they would be treated as part of the
-value itself. Lines starting with a hash (#) after optional leading
-spaces are treated as comments and skipped.
-
-All supported properties are listed in the template configurations.
-Those which have reasonable defaults do not have to be set and are
-commented out in the template configurations. Normally at least the
-following configuration options need to be adapted:
- <peer>/config.ini
- syncURL
- username
- password
- <peer>/sources/*/config.ini
- uri
- type
-
-See "syncevolution --sync-property ?" for options in the peer
-configuration and "syncevolution --source-property ?"
-for options in each data source configuration.
-
-Each data source corresponds to one database at the SyncML peer.
-The local data source is determined by the type of data given in
-"type" and uniquely identified with the "evolutionsource" property.
-To get a list of available data sources, run SyncEvolution with no
-arguments. "evolutionsource" can be set to either the name or URL
-of a data source that SyncEvolution prints then.
-
-The "uri" property is used to identify with which database on the
-SyncML server the local data is to be synchronized. Each server
-usually documents what needs to be configured here. The template
-configurations already have this set correctly.
-
-One can synchronize with multiple server databases in one run, but the
-same server database can only be accessed once. To synchronize the
-same server database with multiple local data sources, one
-has to setup two independent configurations with different "deviceId"
-settings and synchronize them separately. To create such a setup simply
-copy the whole configuration context, e.g.:
- cp -r ~/.config/syncevolution/localhost ~/.config/syncevolution/localhost_copy
-and then edit ~/.config/syncevolution/localhost_copy/config.ini
-to update the "deviceId" and the sources/*/config.ini files to update
-the "evolutionsource".
-
-If an Evolution data source requires authentication, the
-"evolutionuser" and "evolutionpassword" are used as credentials.
-In this case the directory that contains the source's config.ini should
-only be accessible by the user. Usually these fields can be left
-empty. Specifying a single hyphen ("-") as value for a password
-instructs SyncEvolution to look for the password in an encrypted
-keyring (see --keyring) or to ask for the password at runtime. The
-value "${<name of environment variable>}" takes the password from
-the named environment variable. Entering the password manually
-is the most secure method.
-
-***
-*** Warning: setting evolutionuser/password in cases where it is not
-*** needed as with local calendars and addressbooks can cause
-*** the Evolution backend to hang.
-***
-
-SSL encryption of the HTTP connection is supported if the underlying
-platform supports it. In order to enable it, use a syncURL with https
-instead of http prefix. Not all servers support this, though. In the
-default configuration, servers must present a trusted certificate
-where the host name of the certificate matches the host name of the
-URL. Configuration settings can be used to relax this checking, but
-this makes the connection less secure and is not recommended.
-
-If you get errors about a missing certificate file under
-/etc/ssl/certs, then check whether the system packages which provide
-that file are installed. On Debian/Ubuntu the package is called
-"ca-certificates". Alternatively it is possible to specify a different
-location of a custom certificate file in the configuration.
-
-
-Automatic Backups and Logging
------------------------------
-
-To support recovery from a synchronization which damaged the
-local data or modified it in an unexpected way, SyncEvolution
-can create the following files during a synchronization:
-- a dump of the data in a format which can be imported
- back into Evolution, e.g. .vcf for address books
-- a full log file with debug information
-- a dump of the data after the synchronization for
- automatic comparison of the before/after state with
- "synccompare"
-
-If the server configuration option "logdir" is set, then
-a new directory will be created for each synchronization
-in that directory, using the format
- <peer>-<yyyy>-<mm>-<dd>-<hh>-<mm>[-<seq>]
-with the various fields filled in with the time when the
-synchronization started. The sequence suffix will only be
-used when necessary to make the name unique. By default,
-SyncEvolution will never delete any data in that log
-directory unless explicitly asked to keep only a limited
-number of previous log directories.
-
-This is done by setting the "maxlogdirs" limit to something
-different than the empty string and 0. If a limit is set,
-then SyncEvolution will only keep that many log directories
-and start removing the oldest ones when it reaches the limit.
-This cleanup is only done after a successful synchronization
-and is limited to directories that match the pattern for
-SyncEvolution log directory names, so it is safe to put other
-files or directories into the configured log directory.
-
-To avoid writing any additional log file or database dumps during
-a synchronization the "logdir" can be set to "none". To reduce
-the verbosity of the log, set "loglevel". If not set or 0, then
-the verbosity is set to 3 = DEBUG when writing to a log file and
-2 = INFO when writing to the console directly.
-
-
-Configuration with ScheduleWorld
---------------------------------
-
-It is recommended to sync against the new vCard 3.0 URI (card3) and
-iCalendar 2.0 URIs (cal2, task2), using the "text/vcard", "text/calendar"
-and "text/x-todo" type setting respectively. These are the native formats of
-Evolution and a lot of effort went into ensuring that they store as
-much Evolution data as possible. The "note" URI and "text/x-journal" type
-can be used to synchronize memos.
-
-SyncEvolution is primarily tested against ScheduleWorld. The
-"scheduleworld" configuration template is ready to be used with these
-URIs, one only has to fill in the real username and password.
-
-
-Configuration with Funambol
----------------------------
-
-A default Funambol installation already contains databases which
-SyncEvolution can synchronize with Evolution address books and
-calendars. They are adressed in a source config with
- uri = card
-for contacts and
- uri = cal
-for calendars. Tasks (aka todos) are supported but not shown on
-the myFUNAMBOL web site.
-
-At some point the Funambol server started supporting iCalendar 2.0 for
-calendars. This is the more capable (and recommended!) format, but the
-server does not suggest it as "preferred". Therefore the client's
-configuration must use the exclamation qualifier to pick the
-2.0 format (part of the current template):
- type = calendar:text/calendar!
-
-
-Exchanging Data
----------------
-
-SyncEvolution transmits address book entries as vCard 2.1 or 3.0
-depending on the type chosen in the configuration. Evolution uses
-3.0 internally, so SyncEvolution converts between the two formats
-as needed. Calendar items and tasks can be sent and received
-in iCalendar 2.0 as well as vCalendar 1.0, but vCalendar 1.0 should
-be avoided if possible because it cannot represent all data that
-Evolution stores.
-
-How the server stores the items depends on its implementation and
-configuration. In the default Funambol server installation, contacts
-and calendar items are converted into an internal format, but at
-least for contacts it preserves most of the properties used by
-Evolution whereas iCalendar 2.0 items are not preserved properly
-in Funambol 6.0. ScheduleWorld uses the same format as Evolution for
-calendars and tasks and thus requires no conversion.
-
-To check which data is preserved, one can use this procedure
-(described for contacts, but works the same way for calendars and
-tasks):
-1. synchronize the address book with the server
-2. create a new address book in Evolution and view it in Evolution
- once (the second step is necessary in at least Evolution 2.0.4
- to make the new address book usable in SyncEvolution)
-3. add a configuration for that second address book and the
- same URI on the SyncML server
-4. synchronize again, this time using the other data source
-
-Now one can either compare the address books in Evolution or do that
-automatically, described here for contacts:
-- save the complete address books: mark all entries, save as vCard
-- invoke synccompare with two file names as arguments and it will
- normalize and compare them automatically
-
-Normalizing is necessary because the order of cards and their
-properties as well as other minor formatting aspects may be
-different. The output comes from a side-by-side comparison, but
-is augmented by the script so that the context of each change
-is always the complete item that was modified. Lines or items
-following a ">" on the right side were added, those on the
-left side followed by a "<" were removed, and those with
-a "|" between text on the left and right side were modified.
-
-The automatic unit testing (see HACKING) contains a "testItems"
-test which verifies the copying of special entries using the
-same method.
-
-Modifying one of the address books or even both at the same time and
-then synchronizing back and forth can be used to verify that
-SyncEvolution works as expected. If you do not trust SyncEvolution or
-the server, then it is prudent to run these checks with a copy of the
-original address book. Make a backup of the .evolution/addressbook
-directory.
-
-
-Item Changes and Data Changes
------------------------------
-
-SyncML clients and servers consider each entry in a database as one
-item. Items can be added, removed or updated. This is the item change
-information that client and server exchange during a normal,
-incremental synchronization.
-
-If an item is saved, removed locally, and reimported, then this is
-usually reported to a peer as "one item removed, one added" because
-the information available to SyncEvolution is not sufficient to
-determine that this is in fact the same item. One exception are
-iCalendar 2.0 items with their globally unique ID: the modification
-above will be reported to the server as "one item updated".
-
-That is better, but still not quite correct because the content of the
-item has not changed, only the meta information about it which is used
-to detect changes. This cannot be avoided without creating additional
-overhead for normal synchronizations.
-
-SyncEvolution reports "item changes" (the number of added, removed and
-updated items) as well as data changes. These data changes are
-calculated by comparing database dumps. Because this data comparison
-ignores information about which data belongs to which item, it is able
-to detect that re-adding an item that was removed earlier does not
-change the data, in contrast to the item changes. On the other hand,
-removing one item and adding a different one may look like updating
-just one item, which is not quite correct.
-
-
-Conflict Resolution
--------------------
-
-If two clients make changes to the same item, the first one to
-synchronize will copy its changes to the server. The second one
-then runs into a conflict when it tries to push its own changes
-into the server.
-
-The SyncML server now has to decide how to proceed. Some decide
-to preserve both conflicting items, leading to duplicates which
-have to be merged manually later. Other servers merge automatically
-and throw away conflicting data based on heuristics; this may
-remove valid data. The client has no control over the method
-chosen by the server.
-
-Merging items on the server is difficult because the SyncML protocol
-does not specify which parts of a conflicting item were updated.
-In general a server can only make more or less educated guesses
-which might lead to data loss. It is better to avoid this situation
-in the first place by synchronizing before making changes.
-
-
-Known Problems + Support
-------------------------
-
-Please visit http://syncevolution.org/ for up-to-date
-information about known problems and links to places where further
-help can be found.
-
-
-Compiling from Source
----------------------
-
-To compile the code the source or an installation of the Synthesis
-SyncML engine is needed. A compatible snapshot of it is included in
-SyncEvolution source packages and will be used
-automatically. Instructions for working with upstream Synthesis
-sources directly are contained in the HACKING document.
-
-Also needed are the Evolution and Boost (>= 1.35) development
-files. For HTTP, either Curl or libsoup can be used.
-
-On Debian based systems the required packages can be installed with
- apt-get install evolution-data-server-dev \
- libecal1.2-dev libebook1.2-dev \
- libsoup2.4-dev \
- libboost-dev
-
-libboost-dev >= 1.34, available as libboost1.35-dev backport for Debian Etch.
-
-Necessary on some distros due to bad dependencies (not needed by SyncEvolution itself):
- apt-get install libdb3-dev
-
-Optional (enables reading proxy settings from GNOME preferences):
- apt-get install libsoup-gnome2.4-dev
-
-Optional (enables direct sync with phones):
- apt-get install libopenobex-dev libbluetooth-dev
-
-Optional (only used for SHA-256 when glib is not already a dependency):
- apt-get install libnss3-dev
-
-For compiling libsynthesis:
- apt-get install libpcre3-dev libsqlite3-dev libexpat-dev libz-dev
-
-This was copied from the libsynthesis README.
-
-The test framework also requires CPPUnit:
- apt-get install libcppunit-dev
-
-For the GUI and its D-Bus based service backend:
- apt-get install libdbus-glib-1-dev \
- xsltproc \
- libglib2.0-dev \
- libgtk2.0-dev libglade2-dev \
- libgnome-keyring-dev \
- libgconf2-dev libgnomevfs2-dev
-
-Optional packages for GUI:
- apt-get install libunique-dev
-
-libunique = ensure that GTK GUI only runs once per user
-
-Optional packages for GNOME Bluetooth Panel plugin:
- apt-get install libgnome-bluetooth-dev
-
-The plugin adds a button to invoke sync-UI after a device
-was paired which supports SyncML.
-
-The build system is the normal autotools system. See INSTALL for
-general instructions how to use that and "./configure --help" for
-SyncEvolution specific options.
-
-Note that compiling without the Evolution development files is
-possible. But because this is usually not what people want,
-the configure script needs explicit --disable-ecal --disable-ebook
-parameters, otherwise it will refuse to compile without Evolution
-support.
-
-When compiling from a git checkout, remember to run "./autogen.sh".
-It depends on:
- apt-get install libtool intltool automake
-
-
-Supporting SyncEvolution
-------------------------
-
-SyncEvolution is free software: available free of charge and you have
-the freedom of modifying and distributing it. If you are a software
-developer, the best way to support SyncEvolution is to port it to
-other backends and systems. Get in touch if you want to hear more
-about this.
-
-If you are a (hopefully happy) user of SyncEvolution, then you can
-make your appreciation or suggestions for improvements known in
-several ways. Although SyncEvolution is free, this does not mean that
-its development did not cost much effort - quite the opposite, a lot
-of time went into it.
-
-- Send a postcard to the author (see main page).
-- Leave comments on the author's blog (http://www.estamos.de/blog).
-- Donations are not necessary and cannot be accepted either.
-
-
-Authors
--------
-
-Patrick Ohly
-patrick.ohly@intel.com
-http://www.estamos.de/
-
-... plus several others:
-http://syncevolution.org/about/contributors
-
-To contact the project publicly (preferred):
-syncevolution@syncevolution.org
-
-For confidential emails there is a team mailing list:
-syncevolution@lists.intel.com
diff --git a/README.rst b/README.rst
new file mode 100644
index 00000000..ed28f74a
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,631 @@
+===============
+ SyncEvolution
+===============
+
+------------------------------------------------
+synchronize personal information management data
+------------------------------------------------
+
+:Manual section: 1
+:Version: 1.0
+:Date: Apr 28, 2010
+
+SYNOPSIS
+========
+
+Show available sources:
+ syncevolution
+
+Show information about configuration(s):
+ syncevolution --print-servers|--print-configs|--print-peers
+
+Show information about a specific configuration:
+ syncevolution --print-config [--quiet] <config> [main|<source> ...]
+
+List sessions:
+ syncevolution --print-sessions [--quiet] <config>
+
+Show information about SyncEvolution:
+ syncevolution --help|-h|--version
+
+Run a synchronization as configured:
+ syncevolution <config> [<source> ...]
+
+Run a synchronization with properties changed just for this run:
+ syncevolution --run <options for run> <config> [<source> ...]
+
+Restore data from the automatic backups:
+ syncevolution --restore <session directory> --before|--after [--dry-run] <config> <source> ...
+
+Modify a configuration:
+ syncevolution --remove|--migrate|--configure <options> <config>
+
+DESCRIPTION
+===========
+
+This text explains the usage of the SyncEvolution command line.
+
+SyncEvolution synchronizes personal information management (PIM) data
+such as contacts, appointments, tasks and memos using the Synthesis
+sync engine, which provides support for the SyncML synchronization
+protocol.
+
+SyncEvolution synchronizes with SyncML servers over HTTP and with
+SyncML capable phones locally over Bluetooth (new in 1.0). Plugins
+provide access to the data which is to be synchronized. Binaries are
+available for Linux desktops (synchronizing data in GNOME Evolution,
+with KDE supported indirectly already and Akonadi support in
+development), for MeeGo (formerly Moblin) and for Maemo 5/Nokia
+N900. The source code can be compiled for Unix-like systems and
+provides a framework to build custom SyncML clients or servers.
+
+USAGE
+=====
+
+The <config> and the <source> strings are used to find the
+configuration files which determine how synchronization is going to
+proceed. Each source corresponds to one local address book, calendar,
+task list or set of memos and the corresponding database on the
+peer. Depending on which parameters are given, different operations
+are executed.
+
+Starting with SyncEvolution 1.0, <config> strings can have different
+meanings. Typically, a simple string like `scheduleworld` refers to
+the configuration for that peer, as it did in previous releases. A
+peer is either a SyncML server (the traditional usage of
+SyncEvolution) or a client (the new feature in 1.0).
+
+Each peer configuration exists inside a specific context, typically
+the `@default` context. All peers in the same context share some parts
+of their configuration, for example, which local databases are to be
+synchronized. In that sense, a configuration context can be seen as a
+set of local databases plus the peer configurations that are
+synchronized against those databases.
+
+When different peers are meant to synchronize different local
+databases, then different contexts have to be used when setting up the
+peers by appending a context name after the `at` sign, as in
+`scheduleworld2@other-context`. Later on, if `scheduleworld2` is
+unique, the `@other-context` suffix becomes optional.
+
+Sometimes it is also useful to change configuration options of a
+context, without modifying a specific peer. This can be done by using
+`@default` (or some other context name) without anything before the
+`at` sign. The empty string "" is the same as `@default`. ::
+
+ syncevolution
+
+If no arguments are given, then SyncEvolution will list all available
+data sources regardless whether there is a configuration file for them
+or not. The output includes the identifiers which can then be used to
+select those sources in a configuration file. For each source one can
+set a different synchronization mode in its configuration file. ::
+
+ syncevolution <config>
+
+Without the optional list of sources all sources which are enabled in
+their configuration file are synchronized. ::
+
+ syncevolution <config> <source> ...
+
+Otherwise only the ones mentioned on the command line are active. It
+is possible to configure sources without activating their
+synchronization: if the synchronization mode of a source is set to
+`none`, the source will be ignored. Explicitly listing such a source
+will synchronize it in `two-way` mode once.
+
+Progress and error messages are written into a log file that is
+preserved for each synchronization run. Details about that is found in
+the `Automatic Backups and Logging` section below. All errors and
+warnings are printed directly to the console in addition to writing
+them into the log file. Before quitting SyncEvolution will print a
+summary of how the local data was modified. This is done with the
+`synccompare` utility script described in the `Exchanging Data`
+section.
+
+When the `logdir` option is enabled (since v0.9 done by default for
+new configurations), then the same comparison is also done before the
+synchronization starts.
+
+In case of a severe error the synchronization run is aborted
+prematurely and SyncEvolution will return a non-zero value. Recovery
+from failed synchronization is done by forcing a full synchronization
+during the next run, i.e. by sending all items and letting the SyncML
+server compare against the ones it already knows. This is avoided
+whenever possible because matching items during a slow synchronization
+can lead to duplicate entries.
+
+After a successful synchronization the server's configuration file is
+updated so that the next run can be done incrementally. If the
+configuration file has to be recreated e.g. because it was lost, the
+next run recovers from that by doing a full synchronization. The risk
+associated with this is that the server might not recognize items that
+it already has stored previously which then would lead to duplication
+of items. ::
+
+ syncevolution --configure <options for configuration> <config> [<source> ...]
+
+Options in the configuration can be modified via the command
+line. Source properties are changed for all sources unless sources are
+listed explicitly. Some source properties have to be different for
+each source, in which case syncevolution must be called multiple times
+with one source listed in each invocation. ::
+
+ syncevolution --remove <config>
+
+Deletes the configuration. If the <config> refers to a specific
+peer, only that peer's configuration is removed. If it refers to
+a context, that context and all peers inside it are removed.
+
+Note that there is no confirmation question. Neither local data
+referenced by the configuration nor the content of log dirs are
+deleted. ::
+
+ syncevolution --run <options for run> <config> [<source> ...]
+
+Options can also be overridden for just the current run, without
+changing the configuration. In order to prevent accidentally running a
+sync session when a configuration change was intended, either
+--configure or --run must be given explicitly if options are specified
+on the command line. ::
+
+ syncevolution --status <config> [<source> ...]
+
+Prints what changes were made locally since the last synchronization.
+Depends on access to database dumps from the last run, so using the
+`logdir` option is recommended. ::
+
+ syncevolution --print-servers|--print-configs|--print-peers
+ syncevolution --print-config [--quiet] <config> [main|<source> ...]
+ syncevolution --print-sessions [--quiet] <config>
+
+These commands print information about existing configurations. When
+printing a configuration a short version without comments can be
+selected with --quiet. When sources are listed, only their
+configuration is shown. `Main` instead or in combination with sources
+lists only the main peer configuration.
+
+With --print-session information about previous synchronization
+sessions for the selected peer or context are printed. This depends on
+the `logdir` option. The information includes the log directory name
+(useful for --restore) and the synchronization report. In combination
+with --quiet, only the paths are listed. ::
+
+ syncevolution --restore <session directory> --before|--after
+ [--dry-run] <config> <source> ...
+
+This restores local data from the backups made before or after a
+synchronization session. The --print-sessions command can be used to
+find these backups. The source(s) have to be listed explicitly. There
+is intentionally no default, because as with --remove there is no
+confirmation question. With --dry-run, the restore is only simulated.
+
+The session directory has to be specified explicitly with its path
+name (absolute or relative to current directory). It does not have to
+be one of the currently active log directories, as long as it contains
+the right database dumps for the selected sources.
+
+A restore tries to minimize the number of item changes (see section
+`Item Changes and Data Changes`_). This means that items that are
+identical before and after the change will not be transmitted anew to
+the server during the next synchronization. If the server somehow
+needs to get a clean copy of all items on the client then, use "--sync
+refresh-from-client" in the next run.
+
+
+OPTIONS
+=======
+
+Here is a full description of all <options> that can be put in front
+of the server name. Whenever an option accepts multiple values, a
+question mark can be used to get the corresponding help text and/or
+a list of valid values.
+
+--sync|-s <mode>|?
+ Temporarily synchronize the active sources in that mode. Useful
+ for a `refresh-from-server` or `refresh-from-client` sync which
+ clears all data at one end and copies all items from the other.
+
+--print-servers|--print-configs|--print-peers
+ Prints the names of all configured peers to stdout. There is no
+ difference between these options, the are just aliases.
+
+--print-config|-p
+ Prints the complete configuration for the selected <config>
+ to stdout, including up-to-date comments for all properties. The
+ format is the normal .ini format with source configurations in
+ different sections introduced with [<source>] lines. Can be combined
+ with --sync-property and --source-property to modify the configuration
+ on-the-fly. When one or more sources are listed after the <config>
+ name on the command line, then only the configs of those sources are
+ printed. `main` selects the main configuration instead of source
+ configurations. Using --quiet suppresses the comments for each property.
+ When setting a --template, then the reference configuration for
+ that peer is printed instead of an existing configuration.
+
+--configure|-c
+ Modify the configuration files for the selected peer. If no such
+ configuration exists, then a new one is created using one of the
+ template configurations (see --template option). When creating
+ a new configuration only the active sources will be set to active
+ in the new configuration, i.e. `syncevolution -c scheduleworld addressbook`
+ followed by `syncevolution scheduleworld` will only synchronize the
+ address book. The other sources are created in a disabled state.
+ When modifying an existing configuration and sources are specified,
+ then the source properties of only those sources are modified.
+
+--run|-r
+ To prevent accidental sync runs when a configuration change was
+ intended, but the `--configure` option was not used, `--run` must be
+ specified explicitly when sync or source properties are selected
+ on the command line and they are meant to be used during a sync
+ session triggered by the invocation.
+
+\--migrate
+ In older SyncEvolution releases a different layout of configuration files
+ was used. Using --migrate will automatically migrate to the new
+ layout and rename the <config> into <config>.old to prevent accidental use
+ of the old configuration. WARNING: old SyncEvolution releases cannot
+ use the new configuration!
+
+ The switch can also be used to migrate a configuration in the current
+ configuration directory: this preserves all property values, discards
+ obsolete properties and sets all comments exactly as if the configuration
+ had been created from scratch. WARNING: custom comments in the
+ configuration are not preserved.
+
+ --migrate implies --configure and can be combined with modifying
+ properties.
+
+--sync-property|-y <property>=<value>|<property>=?|?
+ Overrides a source-independent configuration property for the
+ current synchronization run or permanently when --configure is used
+ to update the configuration. Can be used multiple times. Specifying
+ an unused property will trigger an error message.
+
+ When using the configuration layout introduced with 1.0, some of the
+ sync properties are shared between peers, for example the directory
+ where sessions are logged. Permanently changing such a shared
+ property for one peer will automatically update the property for all
+ other peers in the same context because the property is stored in a
+ shared config file. When printing a config in verbose mode, a summary
+ comment shows which properties are shared in which way.
+
+--source-property|-z <property>=<value>|<property>=?|?
+ Same as --sync-property, but applies to the configuration of all active
+ sources. `--sync <mode>` is a shortcut for `--source-property sync=<mode>`.
+
+ When combined with `--configure`, the configuration of all sources is
+ modified. Properties cannot be specified differently for different
+ sources, so if you want to change a source property of just one specific
+ sync source, then use `--configure --source-property ... <server> <source>`.
+
+ As with sync properties, some properties are shared between peers,
+ in particular the selection of which local data to synchronize.
+
+--template|-l <peer name>|default|?<device>
+ Can be used to select from one of the built-in default configurations
+ for known SyncML peers. Defaults to the <config> name, so --template
+ only has to be specified when creating multiple different configurations
+ for the same peer, or when using a template that is named differently
+ than the peer. `default` is an alias for `scheduleworld` and can be
+ used as the starting point for servers which do not have a built-in
+ template.
+
+ Each template contains a pseudo-random device ID. Therefore setting the
+ `deviceId` sync property is only necessary when manually recreating a
+ configuration or when a more descriptive name is desired.
+
+ The available templates for different known SyncML servers are listed when
+ using a single question mark instead of template name. When using the
+ `?<device>` format, a fuzzy search for a template that might be
+ suitable for talking to such a device is done. The matching works best
+ when using `<device> = <Manufacturer> <Model>`. If you don't know the
+ manufacturer, you can just keep it as empty. The output in this mode
+ gives the template name followed by a short description and a rating how well
+ the template matches the device (100% is best).
+
+--status|-t
+ The changes made to local data since the last synchronization are
+ shown without starting a new one. This can be used to see in advance
+ whether the local data needs to be synchronized with the server.
+
+--quiet|-q
+ Suppresses most of the normal output during a synchronization. The
+ log file still contains all the information.
+
+--keyring|-k
+ Save or retrieve passwords from the GNOME keyring when modifying the
+ configuration or running a synchronization. Note that using this option
+ applies to *all* passwords in a configuration, so setting a single
+ password as follows moves the other passwords into the keyring, if
+ they were not stored there already::
+
+ --keyring --configure --sync-property proxyPassword=foo
+
+ When passwords were stored in the keyring, their value is set to a single
+ hyphen ("-") in the configuration. This means that when running a
+ synchronization without the --keyring argument, the password has to be
+ entered interactively. The --print-config output always shows "-" instead
+ of retrieving the password from the keyring.
+
+--help|-h
+ Prints usage information.
+
+\--version
+ Prints the SyncEvolution version.
+
+
+EXAMPLES
+========
+
+List the known configuration templates::
+
+ syncevolution --template ?
+
+Create a new configuration, using the existing ScheduleWorld template::
+
+ syncevolution --configure \
+ --sync-property "username=123456" \
+ --sync-property "password=!@#ABcd1234" \
+ scheduleworld
+
+Review configuration::
+
+ syncevolution --print-config scheduleworld
+
+Synchronize all sources::
+
+ syncevolution scheduleworld
+
+Deactivate all sources::
+
+ syncevolution --configure \
+ --source-property sync=none \
+ scheduleworld
+
+Activate address book synchronization again, using the --sync shortcut::
+
+ syncevolution --configure \
+ --sync two-way \
+ scheduleworld addressbook
+
+Change the password for a configuration::
+
+ syncevolution --configure \
+ --sync-property password=foo \
+ scheduleworld
+
+Set up another configuration for under a different account, using
+the same default databases as above::
+
+ syncevolution --configure \
+ --sync-property username=joe \
+ --sync-property password=foo \
+ --template scheduleworld \
+ scheduleworld_joe
+
+Set up another configuration using the same account, but different
+local databases (can be used to simulate synchronizing between two
+clients, see `Exchanging Data`_::
+
+ syncevolution --configure \
+ --sync-property "username=123456" \
+ --sync-property "password=!@#ABcd1234" \
+ --source-property sync=none \
+ scheduleworld@other
+
+ syncevolution --configure \
+ --source-property evolutionsource=<name of other address book> \
+ --source-property sync=two-way \
+ scheduleworld@other
+
+ syncevolution scheduleworld
+ syncevolution scheduleworld@other
+
+Migrate a configuration from the <= 0.7 format to the current one
+and/or updates the configuration so that it looks like configurations
+created anew with the current syncevolution::
+
+ syncevolution --migrate scheduleworld
+
+
+NOTES
+=====
+
+Exchanging Data
+---------------
+
+SyncEvolution transmits address book entries as vCard 2.1 or 3.0
+depending on the type chosen in the configuration. Evolution uses
+3.0 internally, so SyncEvolution converts between the two formats as
+needed. Calendar items and tasks can be sent and received in iCalendar
+2.0 as well as vCalendar 1.0, but vCalendar 1.0 should be avoided if
+possible because it cannot represent all data that Evolution stores.
+
+.. note:: The Evolution backends are mentioned are as examples;
+ the same applies to other data sources.
+
+How the server stores the items depends on its implementation and
+configuration. In the default Funambol server installation, contacts
+and calendar items are converted into an internal format, but at
+least for contacts it preserves most of the properties used by
+Evolution whereas iCalendar 2.0 items are not preserved properly
+up to and including Funambol 8.0. ScheduleWorld uses the same format
+as Evolution for calendars and tasks and thus requires no conversion.
+
+To check which data is preserved, one can use this procedure
+(described for contacts, but works the same way for calendars and
+tasks):
+
+1. synchronize the address book with the server
+2. create a new address book in Evolution and view it in Evolution
+ once (the second step is necessary in at least Evolution 2.0.4
+ to make the new address book usable in SyncEvolution)
+3. add a configuration for that second address book and the
+ same URI on the SyncML server, see EXAMPLES_ above
+4. synchronize again, this time using the other data source
+
+Now one can either compare the address books in Evolution or do that
+automatically, described here for contacts:
+
+- save the complete address books: mark all entries, save as vCard
+- invoke `synccompare` with two file names as arguments and it will
+ normalize and compare them automatically
+
+Normalizing is necessary because the order of cards and their
+properties as well as other minor formatting aspects may be
+different. The output comes from a side-by-side comparison, but
+is augmented by the script so that the context of each change
+is always the complete item that was modified. Lines or items
+following a ">" on the right side were added, those on the
+left side followed by a "<" were removed, and those with
+a "|" between text on the left and right side were modified.
+
+The automatic unit testing (see HACKING) contains a `testItems`
+test which verifies the copying of special entries using the
+same method.
+
+Modifying one of the address books or even both at the same time and
+then synchronizing back and forth can be used to verify that
+SyncEvolution works as expected. If you do not trust SyncEvolution or
+the server, then it is prudent to run these checks with a copy of the
+original address book. Make a backup of the .evolution/addressbook
+directory.
+
+Item Changes and Data Changes
+-----------------------------
+
+SyncML clients and servers consider each entry in a database as one
+item. Items can be added, removed or updated. This is the item change
+information that client and server exchange during a normal,
+incremental synchronization.
+
+If an item is saved, removed locally, and reimported, then this is
+usually reported to a peer as "one item removed, one added" because
+the information available to SyncEvolution is not sufficient to
+determine that this is in fact the same item. One exception are
+iCalendar 2.0 items with their globally unique ID: the modification
+above will be reported to the server as "one item updated".
+
+That is better, but still not quite correct because the content of the
+item has not changed, only the meta information about it which is used
+to detect changes. This cannot be avoided without creating additional
+overhead for normal synchronizations.
+
+SyncEvolution reports *item changes* (the number of added, removed and
+updated items) as well as *data changes*. These data changes are
+calculated by comparing database dumps using the `synccompare` tool.
+Because this data comparison ignores information about which data
+belongs to which item, it is able to detect that re-adding an item
+that was removed earlier does not change the data, in contrast to the
+item changes. On the other hand, removing one item and adding a
+different one may look like updating just one item.
+
+Automatic Backups and Logging
+-----------------------------
+
+To support recovery from a synchronization which damaged the
+local data or modified it in an unexpected way, SyncEvolution
+can create the following files during a synchronization:
+
+- a dump of the data in a format which can be restored by
+ SyncEvolution, usually a single file per item containing
+ in a standard text format (VCARD/VCALENDAR)
+- a full log file with debug information
+- another dump of the data after the synchronization for
+ automatic comparison of the before/after state with
+ `synccompare`
+
+If the server configuration option "logdir" is set, then
+a new directory will be created for each synchronization
+in that directory, using the format `<peer>-<yyyy>-<mm>-<dd>-<hh>-<mm>[-<seq>]`
+with the various fields filled in with the time when the
+synchronization started. The sequence suffix will only be
+used when necessary to make the name unique. By default,
+SyncEvolution will never delete any data in that log
+directory unless explicitly asked to keep only a limited
+number of previous log directories.
+
+This is done by setting the "maxlogdirs" limit to something
+different than the empty string and 0. If a limit is set,
+then SyncEvolution will only keep that many log directories
+and start removing the "less interesting" ones when it reaches
+the limit. Less interesting are those where no data changed
+and no error occurred.
+
+To avoid writing any additional log file or database dumps during
+a synchronization, the "logdir" can be set to "none". To reduce
+the verbosity of the log, set "loglevel". If not set or 0, then
+the verbosity is set to 3 = DEBUG when writing to a log file and
+2 = INFO when writing to the console directly. To debug issues
+involving data conversion, level 4 also dumps the content of
+items into the log.
+
+ENVIRONMENT
+===========
+
+The following environment variables control where SyncEvolution finds
+files and other aspects of its operations.
+
+http_proxy
+ Overrides the proxy settings temporarily. Setting it to an empty value
+ disables the normal proxy settings.
+
+HOME/XDG_CACHE_HOME/XDG_CONFIG_HOME
+ SyncEvolution follows the XDG_ desktop standard for its files. By default,
+ `$HOME/.config/syncevolution` is the location for configuration files.
+ `$HOME/.cache/syncevolution` holds session directories with log files and
+ database dumps.
+
+.. _XDG: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
+
+SYNCEVOLUTION_DEBUG
+ Setting this to any value disables the filtering of stdout and stderr
+ that SyncEvolution employs to keep noise from system libraries out
+ of the command line output.
+
+SYNCEVOLUTION_GNUTLS_DEBUG
+ Enables additional debugging output when using the libsoup HTTP transport library.
+
+SYNCEVOLUTION_BACKEND_DIR
+ Overrides the default path to plugins, normally `/usr/lib/syncevolution/backends`.
+
+SYNCEVOLUTION_TEMPLATE_DIR
+ Overrides the default path to template files, normally
+ `/usr/share/syncevolution/templates`.
+
+SYNCEVOLUTION_XML_CONFIG_DIR
+ Overrides the default path to the Synthesis XML configuration files, normally
+ `/usr/share/syncevolution/xml`. These files are merged into one configuration
+ each time the Synthesis SyncML engine is started as part of a sync session.
+
+ Note that in addition to this directory, SyncEvolution also always
+ searches for configuration files inside `$HOME/.config/syncevolution-xml`.
+ Files with the same relative path and name as in `/usr/share/syncevolution/xml`
+ override those files, others extend the final configuration.
+
+BUGS
+====
+
+See `known issues`_ and the `support`_ web page for more information.
+
+.. _known issues: http://syncevolution.org/documentation/known-issues
+.. _support: http://syncevolution.org/support
+
+SEE ALSO
+========
+
+http://syncevolution.org
+
+AUTHORS
+=======
+
+:Main developer:
+ Patrick Ohly <patrick.ohly@intel.com>, http://www.estamos.de
+:Contributors:
+ http://syncevolution.org/about/contributors
+:To contact the project publicly (preferred):
+ syncevolution@syncevolution.org
+:Intel-internal team mailing list (confidential):
+ syncevolution@lists.intel.com
diff --git a/configure-post.in b/configure-post.in
index 8d64332e..8b218dbc 100644
--- a/configure-post.in
+++ b/configure-post.in
@@ -136,4 +136,5 @@ echo "UI (DBus client): $enable_gui"
echo "Bluetooth transport: $have_bluetooth"
echo "GNOME Bluetooth panel plugin: $enable_gnome_bluetooth_panel"
echo "SHA-256: $have_sha"
+echo "API documentation: $enable_doc"
echo
diff --git a/configure-pre.in b/configure-pre.in
index 815304a8..08f9ee3c 100644
--- a/configure-pre.in
+++ b/configure-pre.in
@@ -5,8 +5,8 @@ dnl Invoke autogen.sh to produce a configure script.
# Debian packages. For prereleases (beta, alpha),
# set it to something like "0.9.2+" and the AC_INIT
# VERSION to 1.0beta1 to produce 0.9.2+1.0beta1.
-AC_INIT([syncevolution], [1.0beta2a])
-STABLE_VERSION=0.9.2+
+AC_INIT([syncevolution], [1.0])
+STABLE_VERSION=
AC_SUBST(STABLE_VERSION)
AM_INIT_AUTOMAKE([tar-ustar])
@@ -477,6 +477,34 @@ AC_SUBST(GUI_DESKTOP_FILES)
# as Debian Etch backport.
AX_BOOST_BASE(1.34)
+# need rst2man for man pages
+AC_ARG_WITH(rst2man,
+ AS_HELP_STRING([--with-rst2man=<path to reStructuredText to man converter>],
+ [Specifies an explicit path to the utility if not found in PATH.
+ An explicit --without-rst2man or not having it installed turn off
+ building of man pages.]),
+ [RST2MAN=$withval
+ if test "$RST2MAN" == "yes"; then
+ AC_PATH_PROG(RST2MAN, rst2man, "no")
+ fi
+ test "$RST2MAN" == "no" || test -x "$RST2MAN" || AC_ERROR([--with-rst2man=$RST2MAN: tool not found])],
+ [AC_PATH_PROG(RST2MAN, rst2man, "no")])
+AM_CONDITIONAL([COND_MAN_PAGES], [test "$RST2MAN" != "no"])
+
+# need rst2html for HTML version of README
+AC_ARG_WITH(rst2html,
+ AS_HELP_STRING([--with-rst2html=<path to reStructuredText to HTML converter>],
+ [Specifies an explicit path to the utility if not found in PATH.
+ An explicit --without-rst2html or not having it installed turn off
+ building of README in HTML format.]),
+ [RST2HTML=$withval
+ if test "$RST2HTML" == "yes"; then
+ AC_PATH_PROG(RST2HTML, rst2html, "no")
+ fi
+ test "$RST2HTML" == "no" || test -x "$RST2HTML" || AC_ERROR([--with-rst2html=$RST2HTML: tool not found])],
+ [AC_PATH_PROG(RST2HTML, rst2html, "no")])
+AM_CONDITIONAL([COND_HTML_README], [test "$RST2HTML" != "no"])
+
# absolute patch to source of Synthesis client library
SYNTHESIS_SRC=no-synthesis-source
AC_SUBST(SYNTHESIS_SRC)
@@ -651,5 +679,11 @@ fi
AC_CONFIG_FILES(src/gnome-bluetooth/Makefile)
AM_CONDITIONAL([ENABLE_GNOME_BLUETOOTH_PANEL], [test "$have_gbt" = "yes" && test "$enable_gnome_bluetooth_panel" = "yes"])
+AC_ARG_ENABLE(doc,
+ AC_HELP_STRING([--enable-doc],
+ [generate backend and DBus API documentation]),
+ enable_doc="$enableval", enable_doc="no")
+
+AM_CONDITIONAL([COND_DOC], [test "$enable_doc" != "no"])
dnl src/backends/*/configure-sub.in and configure-post.in follow
diff --git a/po/ast.po b/po/ast.po
new file mode 100644
index 00000000..6357905e
--- /dev/null
+++ b/po/ast.po
@@ -0,0 +1,917 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: syncevolution.master\n"
+"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
+"POT-Creation-Date: 2010-05-22 09:19+0000\n"
+"PO-Revision-Date: \n"
+"Last-Translator: astur <malditoastur@gmail.com>\n"
+"Language-Team: Softastur <alministradores@softastur.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Asturian\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+
+#. TRANSLATORS: this is the application name that may be used by e.g.
+#. the windowmanager
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
+msgid "Sync"
+msgstr "Sincronizador"
+
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Contacts"
+msgstr "Contautos"
+
+#: ../src/gtk-ui/sync-ui.c:268
+msgid "Appointments"
+msgstr "Cites"
+
+#: ../src/gtk-ui/sync-ui.c:270
+#: ../src/gtk-ui/ui.glade.h:40
+msgid "Tasks"
+msgstr "Xeres"
+
+#: ../src/gtk-ui/sync-ui.c:272
+msgid "Notes"
+msgstr "Notes"
+
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:277
+msgid "Appointments & Tasks"
+msgstr "Cites y xeres"
+
+#: ../src/gtk-ui/sync-ui.c:349
+msgid "Starting sync"
+msgstr "Aniciando..."
+
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:387
+#, c-format
+msgid "Do you want to slow sync with %s?"
+msgstr "Quies una sincronización lenta con %s?"
+
+#: ../src/gtk-ui/sync-ui.c:391
+msgid "Yes, do slow sync"
+msgstr "Sí, facer sincronización lenta"
+
+#: ../src/gtk-ui/sync-ui.c:391
+msgid "No, cancel sync"
+msgstr "Non, encaboxar la sincronización"
+
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:424
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr "¿Quies desaniciar tolos datos llocales y sustituyilos polos datos de %s? Esto nun ye mui recomendable."
+
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
+msgid "Yes, delete and replace"
+msgstr "Sí, desaniciar y camudar"
+
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
+#: ../src/gtk-ui/sync-ui.c:1605
+msgid "No"
+msgstr "Non"
+
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:455
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr "¿Quies desaniciar tolos datos de %s y sustituyilos polos datos llocales? Esto nun ye mui recomendable."
+
+# We are trying to cancel the synchronization
+#: ../src/gtk-ui/sync-ui.c:487
+msgid "Trying to cancel sync"
+msgstr "Tamos intentando encaboxar la sincronización"
+
+# There is no space left
+#: ../src/gtk-ui/sync-ui.c:529
+msgid "No service or device selected"
+msgstr "Nun s'esbilló dengún serviciu o preséu"
+
+# Last synchronization happened a few seconds ago
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:537
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - sincronizóse fai unos segundos"
+
+# Last synchronization happened one minute ago
+#: ../src/gtk-ui/sync-ui.c:541
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - sincronizóse fai un minutu"
+
+# Last synchronization happened %ld minutes ago
+#: ../src/gtk-ui/sync-ui.c:545
+#, c-format
+msgid "%s - synced %ld minutes ago"
+msgstr "%s - sincronizóse fai %ld minutos"
+
+# Last synchronization happened one hour ago
+#: ../src/gtk-ui/sync-ui.c:550
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - sincronizóse fai una hora"
+
+# Last synchronization happened %ld hours ago
+#: ../src/gtk-ui/sync-ui.c:554
+#, c-format
+msgid "%s - synced %ld hours ago"
+msgstr "%s - sincronizóse fai %ld hores"
+
+# Last synchronization happened one day ago
+#: ../src/gtk-ui/sync-ui.c:559
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - sincronizóse fai un día"
+
+# Last synchronization happened %ld days ago
+#: ../src/gtk-ui/sync-ui.c:563
+#, c-format
+msgid "%s - synced %ld days ago"
+msgstr "%s - sincronizóse fai %ld díes"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:612
+#: ../src/gtk-ui/sync-ui.c:726
+msgid "Sync now"
+msgstr "Sincronizar"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:618
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Sincronización lenta"
+
+#: ../src/gtk-ui/sync-ui.c:619
+msgid "Other options..."
+msgstr "Otres opciones..."
+
+# "Select a service". Omitted 'syn' because there's no room in the button for proper display. The context is clear and this will not impair understanding by the user.
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:624
+msgid "Select sync service"
+msgstr "Esbillar un serviciu"
+
+# Edit the configuration of the service
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:629
+msgid "Edit service settings"
+msgstr "Editar la configuración del serviciu"
+
+# There's no sync service yet between the netbook and a web service.
+#: ../src/gtk-ui/sync-ui.c:700
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr "Entá nun escoyisti dengún serviciu o preséu de sincronización. Estos servicios permítente sincronizar los datos ente'l miniportátil y un serviciu web. Tamién puede facese direutamente con dellos preseos."
+
+#: ../src/gtk-ui/sync-ui.c:722
+msgid "Sync again"
+msgstr "¡Sincronízate!"
+
+#: ../src/gtk-ui/sync-ui.c:743
+msgid "Restoring"
+msgstr "Restaurando"
+
+# Synchronization is taking place
+#: ../src/gtk-ui/sync-ui.c:745
+msgid "Syncing"
+msgstr "Sincronizando"
+
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:757
+#: ../src/gtk-ui/sync-ui.c:3399
+msgid "Cancel sync"
+msgstr "Encaboxar la sincronización"
+
+#: ../src/gtk-ui/sync-ui.c:922
+msgid "Back to sync"
+msgstr "Volver a la sincronización"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1224
+msgid "Automatic sync"
+msgstr ""
+"Sincronización\n"
+"automática"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1519
+#, c-format
+msgid "Affected data: %s %s"
+msgstr "Datos afeutaos: %s %s"
+
+#: ../src/gtk-ui/sync-ui.c:1524
+#, c-format
+msgid "Affected data: none"
+msgstr "Datos afeutaos: dengún"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1602
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr "¿Quies restaurar la copia de seguridá de %s? Tolos cambeos que tengas fechos dende entós van perdese."
+
+#: ../src/gtk-ui/sync-ui.c:1605
+msgid "Yes, restore"
+msgstr "Sí, restaurar"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1637
+#, c-format
+msgid "%x %X"
+msgstr "%x %X"
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1656
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr "Copia de seguridá fecha enantes de sincronizar con %s"
+
+#: ../src/gtk-ui/sync-ui.c:1673
+msgid "Restore"
+msgstr "Restaurar"
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1780
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr "Una sincronización normal con %s nun ye dable nesti intre. Puedes facer una sincronización lenta de dos víes o entamar de cero. Tamién puedes restaurar una copia de seguridá, pero igual se fai necesaria una sincronización lenta o entamar de cero enantes de que seya dable una sincronización normal."
+
+#: ../src/gtk-ui/sync-ui.c:1790
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr "Si asocede daqué realmente malo, puedes intentar una sincronización lenta, entamar de cero o restaurar la copia de seguridá."
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1799
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+"Desaniciar tolos datos\n"
+"llocales y trocalos con\n"
+"datos de %s"
+
+#: ../src/gtk-ui/sync-ui.c:1805
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+"Desaniciar tolos datos en\n"
+"%s y trocalos\n"
+"colos tos datos llocales"
+
+#: ../src/gtk-ui/sync-ui.c:2267
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr "Error al obtener la llista de servicios compatibles de SyncEvolution"
+
+#: ../src/gtk-ui/sync-ui.c:2321
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr "Hebo un problema de comunicación nel procesu de sincronización. Inténtalo más sero."
+
+#: ../src/gtk-ui/sync-ui.c:2380
+msgid "Restore failed"
+msgstr "Falló al Restaurar"
+
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
+msgid "Sync failed"
+msgstr "Falló al Sincronizar"
+
+#: ../src/gtk-ui/sync-ui.c:2389
+msgid "Restore complete"
+msgstr "Restauráu completu"
+
+#: ../src/gtk-ui/sync-ui.c:2392
+msgid "Sync complete"
+msgstr "¡Sincronizáu!"
+
+#: ../src/gtk-ui/sync-ui.c:2484
+#, c-format
+msgid "Preparing '%s'"
+msgstr "Tresnando '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2487
+#, c-format
+msgid "Receiving '%s'"
+msgstr "Recibiendo '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2490
+#, c-format
+msgid "Sending '%s'"
+msgstr "Unviando '%s'"
+
+#: ../src/gtk-ui/sync-ui.c:2611
+#, c-format
+msgid "There was one remote rejection."
+msgid_plural "There were %ld remote rejections."
+msgstr[0] "Hebo un rechazu remotu."
+msgstr[1] "Hebo %ld rechazos remotos."
+
+#: ../src/gtk-ui/sync-ui.c:2616
+#, c-format
+msgid "There was one local rejection."
+msgid_plural "There were %ld local rejections."
+msgstr[0] "Hebo un rechazu llocal."
+msgstr[1] "Hebo %ld rechazos llocales."
+
+#: ../src/gtk-ui/sync-ui.c:2621
+#, c-format
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr "Hebo %ld rechazos llocales y %ld rechazos remotos."
+
+#: ../src/gtk-ui/sync-ui.c:2626
+#, c-format
+msgid "Last time: No changes."
+msgstr "La cabera vegada: nun hebo cambeos."
+
+#: ../src/gtk-ui/sync-ui.c:2628
+#, c-format
+msgid "Last time: Sent one change."
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] "La cabera vegada: unvióse un cambéu."
+msgstr[1] "La cabera vegada: unviáronse %ld cambeos."
+
+#. This is about changes made to the local data. Not all of these
+#. changes were requested by the remote server, so "applied"
+#. is a better word than "received" (bug #5185).
+#: ../src/gtk-ui/sync-ui.c:2636
+#, c-format
+msgid "Last time: Applied one change."
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] "La cabera vegada: aplicóse un cambéu."
+msgstr[1] "La cabera vegada: aplicáronse %ld cambeos."
+
+#: ../src/gtk-ui/sync-ui.c:2641
+#, c-format
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr "La cabera vegada: aplicáronse %ld cambeos y unviáronse %ld cambeos."
+
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2848
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+"Hebo un problema na cabera sincronización:\n"
+"%s"
+
+#: ../src/gtk-ui/sync-ui.c:2858
+#, c-format
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr "Restauraste una copia de resguardu. Los cambeos entá nun se sincronicen con %s"
+
+#: ../src/gtk-ui/sync-ui.c:3146
+msgid "Waiting for current operation to finish..."
+msgstr "Esperando a que la operación actual fine..."
+
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3180
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr "Nun ye dable una sincronización normal nesti intre. El sirvidor suxer una sincronización lenta, pero puede qu'esto nun seya lo que quies si dambes partes yá tienen datos."
+
+# the syncronization service D-Bus closed unexpectedly
+#: ../src/gtk-ui/sync-ui.c:3184
+msgid "The sync process died unexpectedly."
+msgstr "El serviciu de sincronización zarróse d'esmenu."
+
+#: ../src/gtk-ui/sync-ui.c:3189
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr "Nun se retrucó a la solicitú de contraseña. Pa evitar qu'apaeza otra vegada, puede atroxase la contraseña nos axustes."
+
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3193
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr "Hebo un problema al procesar la solicitú de sincronización. Intentalo otra vegada puede ayudar."
+
+#: ../src/gtk-ui/sync-ui.c:3199
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr "Accesu fallíu. ¿Podría haber dalgún problema col to usuariu o contraseña?"
+
+#: ../src/gtk-ui/sync-ui.c:3202
+msgid "Forbidden"
+msgstr "Prohibío"
+
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3208
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr "Nun pudo atopase la fonte de datos. ¿Podría haber dalgún problema cola configuración?"
+
+# Fatal error in the database
+#: ../src/gtk-ui/sync-ui.c:3212
+msgid "Remote database error"
+msgstr "Fallu na base de datos remota"
+
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr "Hai un problema cola base de datos llocal. Sincronizar otra vegada o reaniciar puede aidar."
+
+# There is no space left
+#: ../src/gtk-ui/sync-ui.c:3218
+msgid "No space on disk"
+msgstr "Nun hai espaciu en discu"
+
+#: ../src/gtk-ui/sync-ui.c:3220
+msgid "Failed to process SyncML"
+msgstr "Fallu al procesar SyncML"
+
+# the server didn't accept the authorization
+#: ../src/gtk-ui/sync-ui.c:3222
+msgid "Server authorization failed"
+msgstr "El sirvidor nun aceutó l'autorización"
+
+# Error while analysing the syntax of the configuration file
+#: ../src/gtk-ui/sync-ui.c:3224
+msgid "Failed to parse configuration file"
+msgstr "Fallu al analizar el ficheru de configuración"
+
+# Error while reading the configuration file
+#: ../src/gtk-ui/sync-ui.c:3226
+msgid "Failed to read configuration file"
+msgstr "Fallu al lleer del ficheru de configuración"
+
+# The configuration has not been found
+#: ../src/gtk-ui/sync-ui.c:3228
+msgid "No configuration found"
+msgstr "Nun s'alcontró la configuración"
+
+# The configuration file has not been found
+#: ../src/gtk-ui/sync-ui.c:3230
+msgid "No configuration file found"
+msgstr "Nun s'alcontró'l ficheru de configuración"
+
+# The server sent an an invalid content
+#: ../src/gtk-ui/sync-ui.c:3232
+msgid "Server sent bad content"
+msgstr "El sirvidor unvió un conteníu non válidu"
+
+#: ../src/gtk-ui/sync-ui.c:3234
+msgid "Connection certificate has expired"
+msgstr "El certificáu de conexón venció"
+
+# The connection certificate is not valid
+#: ../src/gtk-ui/sync-ui.c:3236
+msgid "Connection certificate is invalid"
+msgstr "El certificáu de conexón nun ye válidu"
+
+#: ../src/gtk-ui/sync-ui.c:3244
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr "Nun pudimos coneutanos col sirvidor. El problema podría ser temporal o podría haber dalgún problema cola configuración."
+
+# The URL is incorrect
+#: ../src/gtk-ui/sync-ui.c:3251
+msgid "The server URL is bad"
+msgstr "La URL del sirvidor ye incorreuta"
+
+#: ../src/gtk-ui/sync-ui.c:3256
+msgid "The server was not found"
+msgstr "Nun s'alcontró'l sirvidor"
+
+#: ../src/gtk-ui/sync-ui.c:3258
+#, c-format
+msgid "Error %d"
+msgstr "Fallu: %d"
+
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3396
+msgid "Password is required for sync"
+msgstr "Requierse contraseña pa la sincronización"
+
+#: ../src/gtk-ui/sync-ui.c:3400
+msgid "Sync with password"
+msgstr "Sincronización con contraseña"
+
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3410
+#, c-format
+msgid "Please enter password for syncing with %s:"
+msgstr "Por favor introduz la contraseña pa sincronizar con %s:"
+
+#. title for the buttons on the right side of main view
+#: ../src/gtk-ui/ui.glade.h:2
+msgid "<b>Actions</b>"
+msgstr "<b>Aiciones</b>"
+
+#. text between the two "start from scratch" buttons in emergency view
+#: ../src/gtk-ui/ui.glade.h:4
+msgid "<b>or</b>"
+msgstr "<b>o</b>"
+
+# compatible services
+#: ../src/gtk-ui/ui.glade.h:5
+msgid "<big>Direct sync</big>"
+msgstr "<big>Sincronización direuta</big>"
+
+#: ../src/gtk-ui/ui.glade.h:6
+msgid "<big>Network sync</big>"
+msgstr "<big>Sincronización de rede</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:8
+msgid "<big>Restore from backup</big>"
+msgstr "<big>Restaurar de la copia de seguridá</big>"
+
+# compatible services
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr "<big>Sincronización lenta</big>"
+
+# compatible services
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:12
+msgid "<big>Start from scratch</big>"
+msgstr "<big>Entamar dende cero</big>"
+
+#: ../src/gtk-ui/ui.glade.h:13
+msgid ""
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
+msgstr ""
+"Una sincronización lenta compara elementos de dambos llaos ya intenta combinalos. \n"
+"Esto puede fallar en dellos casos, criando duplicaos o perda d'información."
+
+# I had to shorten the string to fit the button
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Amestar preséu"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Amestar serviciu"
+
+#. explanation of "Restore backup" function
+#: ../src/gtk-ui/ui.glade.h:18
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr "Les copies de seguridá faense enantes cada vegada que sincronizamos. Escueyi una copia de seguridá pa restaurar. Cualesquier cambéu que tengas fechu dende entós, va perdese."
+
+#: ../src/gtk-ui/ui.glade.h:19
+msgid "Calendar"
+msgstr "Calendariu"
+
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
+#: ../src/gtk-ui/ui.glade.h:21
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+"Camudar o editar\n"
+"serviciu sincronizador"
+
+#. close button for settings window
+#: ../src/gtk-ui/ui.glade.h:24
+msgid "Close"
+msgstr "Zarrar"
+
+#: ../src/gtk-ui/ui.glade.h:25
+msgid ""
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
+msgstr ""
+"Desaniciar tolos datos en Zyb \n"
+"y sustituyilos cola to\n"
+"información llocal"
+
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+"Desaniciar tolos datos\n"
+"llocales y trocalos con\n"
+"datos de %s"
+
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
+msgstr ""
+"Iguar urxencia\n"
+"en sincronización"
+
+#: ../src/gtk-ui/ui.glade.h:34
+msgid ""
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
+msgstr ""
+"Si nun puedes ver el to serviciu de sincronización arriba, pero sabes que'l to fornidor emplega SyncML\n"
+"puedes configurar el serviciu manualmente."
+
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Configuración"
+
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr "Sincronización d'emerxencia"
+
+#: ../src/gtk-ui/ui.glade.h:41
+msgid ""
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
+msgstr ""
+"Pa executar la sincronización faen falta una conexón de rede y una cuenta nun serviciu de sincronización. \n"
+"Son compatibles los siguientes servicios:"
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr "Usa Bluetooth pa sincronizar los tos datos dende un preséu a otru. "
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr "Vas necesitar amestar preseos Bluetooth enantes de que puedan sincronizase."
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
+msgid "Up to date"
+msgstr "Al día"
+
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:1
+msgid "Sync (GTK)"
+msgstr "Sync (GTK)"
+
+#: ../src/gtk-ui/sync-config-widget.c:78
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr "ScheduleWorld permítete sincronizar los contautos, eventos, xeres y notes."
+
+#: ../src/gtk-ui/sync-config-widget.c:81
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr "Google Sync puede facer copia de resguardu y sincroniza los tos contautos colos que tengas en Gmail."
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:87
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr "Resguarda los tos contautos y el calendariu. Sincronízalos con un clic, en cualesquier intre y dende au seya (DEMO)."
+
+#: ../src/gtk-ui/sync-config-widget.c:90
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr "El serviciu Mobical Backup and Restore permítete facer copies de resguardu segures de la información del to móvil de baldre."
+
+#: ../src/gtk-ui/sync-config-widget.c:93
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr "ZYB ye un mou cenciellu pa que la xente atroxe y comparta la información móvil en llinia."
+
+#: ../src/gtk-ui/sync-config-widget.c:96
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr "Memotoo permítete acceder a los tos datos personales dende cualesquier computadora coneutada con Internet."
+
+# Error while analysing the syntax of the configuration file
+#: ../src/gtk-ui/sync-config-widget.c:192
+msgid "Sorry, failed to save the configuration"
+msgstr "Sentímoslo, nun pudo atroxase la configuración"
+
+#: ../src/gtk-ui/sync-config-widget.c:381
+msgid "Service must have a name and server URL"
+msgstr "El serviciu tien de tener un nome y una URL"
+
+#: ../src/gtk-ui/sync-config-widget.c:422
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr "¿Quies reaxustar la configuración pa %s? Esto nun desaniciará denguna información sincronizada nes partes."
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:426
+msgid "Yes, reset"
+msgstr "Sí, reaniciar"
+
+#: ../src/gtk-ui/sync-config-widget.c:427
+#: ../src/gtk-ui/sync-config-widget.c:438
+msgid "No, keep settings"
+msgstr "Non, caltener configuración"
+
+#: ../src/gtk-ui/sync-config-widget.c:432
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr "¿Quies desaniciar la configuración de %s? Esto nun desaniciará denguna información sincronizada en dengún de los dos llaos, pero desaniciará esta configuración. "
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:437
+msgid "Yes, delete"
+msgstr "Sí, desaniciar"
+
+#: ../src/gtk-ui/sync-config-widget.c:467
+msgid "Reset settings"
+msgstr "Devolver la configuración a los valores orixinales"
+
+#: ../src/gtk-ui/sync-config-widget.c:470
+msgid "Delete settings"
+msgstr "Desaniciar la configuración"
+
+# Configuring and using
+#: ../src/gtk-ui/sync-config-widget.c:480
+msgid "Save and use"
+msgstr "Guardar y usar"
+
+#: ../src/gtk-ui/sync-config-widget.c:483
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+"Guardar y trocar\n"
+"serviciu actual"
+
+#: ../src/gtk-ui/sync-config-widget.c:493
+msgid "Stop using device"
+msgstr "Dexar d'usar esti preséu"
+
+#: ../src/gtk-ui/sync-config-widget.c:496
+msgid "Stop using service"
+msgstr "Dexar d'usar esti serviciu"
+
+# URI of %s
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:679
+#, c-format
+msgid "%s URI"
+msgstr "URI de %s"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:854
+#, c-format
+msgid "Send changes to %s"
+msgstr "Unviar cambeos a %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:859
+#, c-format
+msgid "Receive changes from %s"
+msgstr "Recibir cambéu de %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:875
+msgid "<b>Sync</b>"
+msgstr "<b>Sincronizar</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:891
+msgid "Server address"
+msgstr "Direición del sirvidor"
+
+# I had to use colon to avoid the problem of selecting a masculine or feminine gender in the article, which would create problems down the road.
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:967
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Paez qu'esti preséu ye: %s'. Si nun ye cierto, mira la llista de los preseos compatibles y seleiciona'l correutu, si apaez."
+
+#: ../src/gtk-ui/sync-config-widget.c:973
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr "Nun sabemos qué preséu ye ésti. Mira la llista de los preseos compatibles y seleiciona'l correutu, si apaez."
+
+#: ../src/gtk-ui/sync-config-widget.c:1126
+#, c-format
+msgid "%s - Bluetooth device"
+msgstr "%s - Preseos Bluetooth"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1132
+#, c-format
+msgid "%s - manually setup"
+msgstr "%s - configurar manualmente"
+
+# Open the website
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1807
+msgid "Launch website"
+msgstr "Abrir el sitiu web"
+
+# Configuring and using
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1816
+msgid "Setup now"
+msgstr "Configurar agora"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1912
+msgid "Username"
+msgstr "Usuariu"
+
+#: ../src/gtk-ui/sync-config-widget.c:1927
+msgid "Password"
+msgstr "Contraseña"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1950
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr "La configuración ye más complexa de lo que podemos amosar equí. Cambeos en el mou de sincronización o les tribes de datos sincronizaos van sobroscribir esa configuración."
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1969
+msgid "Hide server settings"
+msgstr "Anubrir la configuración del sirvidor"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1989
+msgid "Show server settings"
+msgstr "Amosar la configuración del sirvidor"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+msgid "Sync in the Sync application"
+msgstr "Sincronizar n'aplicación de sincronización"
+
+# Synchronization is taking place
+#: ../src/syncevo-dbus-server.cpp:5667
+#, c-format
+msgid "%s is syncing"
+msgstr "%s ta sincronizándose"
+
+#: ../src/syncevo-dbus-server.cpp:5668
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr "Anicióse a sincronizar esta máquina col serviciu de sincronización %s."
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5682
+#, c-format
+msgid "%s sync complete"
+msgstr "Completóse la sincronización de %s"
+
+#: ../src/syncevo-dbus-server.cpp:5683
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr "Finóse de sincronizar esta máquina col serviciu de sincronización %s."
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5688
+msgid "Sync problem."
+msgstr "Problemes na sincronización."
+
+#: ../src/syncevo-dbus-server.cpp:5689
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr "Hebo un fallu mentantu la sincronización, y tienes qu'igualu."
+
+#: ../src/syncevo-dbus-server.cpp:5762
+msgid "View"
+msgstr "Ver"
+
+#. Use "default" as ID because that is what mutter-moblin
+#. recognizes: it then skips the action instead of adding it
+#. in addition to its own "Dismiss" button (always added).
+#: ../src/syncevo-dbus-server.cpp:5766
+msgid "Dismiss"
+msgstr "Zarrar"
+
+#~ msgid ""
+#~ "Do you want to replace %s with %s? This will not remove any synced "
+#~ "information on either end but you will no longer be able to sync with %s."
+#~ msgstr ""
+#~ "¿Quies camudar %s por %s? Esto nun va desaniciar denguna información "
+#~ "sincronizada nes partes pero nun podrás volver a sincronizar con %s."
+#~ msgid "Yes, use %s"
+#~ msgstr "Sí, usa %s"
+#~ msgid "No, use %s"
+#~ msgstr "Non, usa %s"
+#~ msgid "Database error"
+#~ msgstr "Error na base de datos"
+
diff --git a/po/de.po b/po/de.po
index 9a95bc71..da94d085 100644
--- a/po/de.po
+++ b/po/de.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-04-28 09:27+0000\n"
+"POT-Creation-Date: 2010-05-17 21:48+0000\n"
"PO-Revision-Date: \n"
"Last-Translator: Clara Steiner-Jay <csteiner@aracnet.com>\n"
"Language-Team: \n"
@@ -82,7 +82,7 @@ msgstr "Ja, löschen und ersetzen"
#: ../src/gtk-ui/sync-ui.c:429
#: ../src/gtk-ui/sync-ui.c:460
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "No"
msgstr "Nein"
@@ -154,7 +154,9 @@ msgstr "Jetzt syncen"
#: ../src/gtk-ui/sync-ui.c:618
#: ../src/gtk-ui/ui.glade.h:37
msgid "Slow sync"
-msgstr "Langsame Synchronisation"
+msgstr ""
+"Langsame\n"
+"Synchronisation"
#: ../src/gtk-ui/sync-ui.c:619
msgid "Other options..."
@@ -164,7 +166,7 @@ msgstr "Andere Optionen..."
#. * when no service is selected. Will open configuration view
#: ../src/gtk-ui/sync-ui.c:624
msgid "Select sync service"
-msgstr "Synchronisations-Service auswählen"
+msgstr "Synchronisations-Service wählen"
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * login to service fails. Will open configuration view for this service
@@ -193,7 +195,7 @@ msgstr "Syncen..."
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
#: ../src/gtk-ui/sync-ui.c:757
-#: ../src/gtk-ui/sync-ui.c:3373
+#: ../src/gtk-ui/sync-ui.c:3399
msgid "Cancel sync"
msgstr ""
"Synchronisation\n"
@@ -206,7 +208,7 @@ msgstr "Zurück zur Synchronisation"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1223
+#: ../src/gtk-ui/sync-ui.c:1224
msgid "Automatic sync"
msgstr ""
"Automatische\n"
@@ -216,148 +218,148 @@ msgstr ""
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1494
+#: ../src/gtk-ui/sync-ui.c:1519
#, c-format
msgid "Affected data: %s %s"
msgstr "Betroffene Daten: %s %s"
-#: ../src/gtk-ui/sync-ui.c:1499
+#: ../src/gtk-ui/sync-ui.c:1524
#, c-format
msgid "Affected data: none"
msgstr "Betroffene Daten: Keine"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1577
+#: ../src/gtk-ui/sync-ui.c:1602
#, c-format
msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
msgstr "Soll die Sicherheitskopie von %s wiederhergestellt werden? Alle seither gemachten Änderungen gehen dann verloren."
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "Yes, restore"
msgstr "Ja, wiederherstellen"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1612
+#: ../src/gtk-ui/sync-ui.c:1637
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1631
+#: ../src/gtk-ui/sync-ui.c:1656
#, c-format
msgid "Backed up before syncing with %s"
msgstr "Sicherheitskopie wurde erstellt vor Synchronisation mit %s"
-#: ../src/gtk-ui/sync-ui.c:1648
+#: ../src/gtk-ui/sync-ui.c:1673
msgid "Restore"
msgstr "Wiederherstellen"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1755
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
msgstr "Eine normale Synchronisation mit %s ist zur Zeit nicht möglich. Du kannst eine langsame Zwei-Wege-Synchronisation durchführen, neu anfangen, oder eine Sicherheitskopie wiederherstellen. Eine langsame Synchronisation oder ein Neuanfang sind jedoch erforderlich, bevor eine normale Synchronisation mäglich ist."
-#: ../src/gtk-ui/sync-ui.c:1765
+#: ../src/gtk-ui/sync-ui.c:1790
#, c-format
msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
-msgstr "Falls etwas fehlgschlagen ist, kannst du eine langsame Synchcronisation versuchen, neu anfangen oder von der Sicherheitskopie Daten wiederherstellen."
+msgstr "Falls etwas fehlgeschlagen ist, kannst du eine langsame Synchronisation versuchen, neu anfangen oder von der Sicherheitskopie Daten wiederherstellen."
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1774
+#: ../src/gtk-ui/sync-ui.c:1799
#, c-format
msgid ""
"Delete all your local\n"
"data and replace with\n"
"data from %s"
msgstr ""
-"Alle lokalen\n"
-"Daten löschen und ersetzen mit\n"
+"Alle lokalen Daten\n"
+"löschen und ersetzen mit\n"
"Daten von %s"
-#: ../src/gtk-ui/sync-ui.c:1780
+#: ../src/gtk-ui/sync-ui.c:1805
#, c-format
msgid ""
"Delete all data on\n"
"%s and replace\n"
"with your local data"
msgstr ""
-"Alle Daten auf\n"
-"%s löschen und ersetzen\n"
+"Alle Daten auf %s\n"
+"löschen und ersetzen\n"
"mit deinen lokalen Daten"
-#: ../src/gtk-ui/sync-ui.c:2241
+#: ../src/gtk-ui/sync-ui.c:2267
msgid "Failed to get list of supported services from SyncEvolution"
-msgstr "Liste der unterstützten Services konnte nicht von SyncEvolution empfangen werden"
+msgstr "Liste der unterstützten Services konnte nicht von SyncEvolution empfangen werden."
-#: ../src/gtk-ui/sync-ui.c:2295
+#: ../src/gtk-ui/sync-ui.c:2321
msgid "There was a problem communicating with the sync process. Please try again later."
msgstr "Bei der Kommunikation mit dem Sync-Service trat ein Problem auf. Versuche es später nochmals."
-#: ../src/gtk-ui/sync-ui.c:2354
+#: ../src/gtk-ui/sync-ui.c:2380
msgid "Restore failed"
msgstr "Verbindung fehlgeschlagen"
# changed to avoid truncation
-#: ../src/gtk-ui/sync-ui.c:2357
-#: ../src/gtk-ui/sync-ui.c:3242
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
msgid "Sync failed"
msgstr "Sync fehlgeschlagen"
-#: ../src/gtk-ui/sync-ui.c:2363
+#: ../src/gtk-ui/sync-ui.c:2389
msgid "Restore complete"
msgstr "Wiederherstellung beendet"
-#: ../src/gtk-ui/sync-ui.c:2366
+#: ../src/gtk-ui/sync-ui.c:2392
msgid "Sync complete"
msgstr "Sync beendet"
-#: ../src/gtk-ui/sync-ui.c:2458
+#: ../src/gtk-ui/sync-ui.c:2484
#, c-format
msgid "Preparing '%s'"
msgstr "'%s' wird vorbereitet"
-#: ../src/gtk-ui/sync-ui.c:2461
+#: ../src/gtk-ui/sync-ui.c:2487
#, c-format
msgid "Receiving '%s'"
msgstr "'%s' wird empfangen"
-#: ../src/gtk-ui/sync-ui.c:2464
+#: ../src/gtk-ui/sync-ui.c:2490
#, c-format
msgid "Sending '%s'"
msgstr "'%s' wird gesendet"
-#: ../src/gtk-ui/sync-ui.c:2585
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "Es gab eine Remote-Ablehnung."
msgstr[1] "Es gab %ld Remote-Ablehnungen."
-#: ../src/gtk-ui/sync-ui.c:2590
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "Es gab eine lokale Ablehnung."
msgstr[1] "Es gab %ld lokale Ablehnungen."
-#: ../src/gtk-ui/sync-ui.c:2595
+#: ../src/gtk-ui/sync-ui.c:2621
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "Es gab %ld lokale Ablehnungen und %ld Remote-Ablehnungen."
-#: ../src/gtk-ui/sync-ui.c:2600
+#: ../src/gtk-ui/sync-ui.c:2626
#, c-format
msgid "Last time: No changes."
msgstr "Letztes Mal: Keine Änderungen."
-#: ../src/gtk-ui/sync-ui.c:2602
+#: ../src/gtk-ui/sync-ui.c:2628
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -367,21 +369,21 @@ msgstr[1] "Letztes Mal: %ld Änderungen abgeschickt."
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2610
+#: ../src/gtk-ui/sync-ui.c:2636
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "Letztes Mal: Eine Änderung angewandt."
msgstr[1] "Letztes Mal: %ld Änderungen angewandt."
-#: ../src/gtk-ui/sync-ui.c:2615
+#: ../src/gtk-ui/sync-ui.c:2641
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "Letztes Mal: %ld Änderungen angewandt und %ld Änderungen abgeschickt."
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2822
+#: ../src/gtk-ui/sync-ui.c:2848
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -390,128 +392,128 @@ msgstr ""
"Bei der letzten Synchronisation trat ein Problem auf:\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2832
+#: ../src/gtk-ui/sync-ui.c:2858
#, c-format
msgid "You've just restored a backup. The changes have not been synced with %s yet"
msgstr "Du hast soeben eine Sicherheitskopie erstellt. Die Änderungen wurden noch nicht mit %s synchronisiert."
-#: ../src/gtk-ui/sync-ui.c:3120
+#: ../src/gtk-ui/sync-ui.c:3146
msgid "Waiting for current operation to finish..."
msgstr "Warten auf Beenden des laufenden Vorgangs..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3154
+#: ../src/gtk-ui/sync-ui.c:3180
msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
-msgstr "Eine normale Synchronisation ist zur Zeit nicht möglich. Der Server schlägt eine langsame Synchronisation vor, doch wenn beide Enden bereits Daten haben ist dies vielleicht nicht immer wünschenswert."
+msgstr "Eine normale Synchronisation ist zur Zeit nicht möglich. Der Server schlägt eine langsame Synchronisation vor, doch wenn beide Enden bereits Daten haben, ist dies vielleicht nicht immer wünschenswert."
-#: ../src/gtk-ui/sync-ui.c:3158
+#: ../src/gtk-ui/sync-ui.c:3184
msgid "The sync process died unexpectedly."
msgstr "Sync-Prozess wurde unerwartet abgebrochen."
-#: ../src/gtk-ui/sync-ui.c:3163
+#: ../src/gtk-ui/sync-ui.c:3189
msgid "Password request was not answered. You can save the password in the settings to prevent the request."
msgstr "Passwortanfrage wurde nicht beantwortet. Du kannst das Passwort in den Einstellungen speichern, um die Anfrage zu vermeiden."
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3167
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "There was a problem processing sync request. Trying again may help."
msgstr "Beim Bearbeiten der Synchronisationsanfrage trat ein Problem auf. Es wird empfohlen, es noch einmal zu versuchen."
-#: ../src/gtk-ui/sync-ui.c:3173
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to login. Could there be a problem with your username or password?"
msgstr "Anmeldung gescheitert. Es könnte ein Problem mit dem Benutzernamen oder dem Kennwort bestehen."
-#: ../src/gtk-ui/sync-ui.c:3176
+#: ../src/gtk-ui/sync-ui.c:3202
msgid "Forbidden"
msgstr "Verboten"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3182
+#: ../src/gtk-ui/sync-ui.c:3208
msgid "A data source could not be found. Could there be a problem with the settings?"
-msgstr "Die Datenquelle wurde nicht gefunden. Könnrte es ein Problem bei den Einstellungen geben?"
+msgstr "Die Datenquelle wurde nicht gefunden. Könnte es ein Problem bei den Einstellungen geben?"
-#: ../src/gtk-ui/sync-ui.c:3186
+#: ../src/gtk-ui/sync-ui.c:3212
msgid "Remote database error"
msgstr "Fehler bei Remote-Datenbank"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3189
+#: ../src/gtk-ui/sync-ui.c:3215
msgid "There is a problem with the local database. Syncing again or rebooting may help."
msgstr "Es gibt ein Problem mit der lokalen Datenbank. Es wird empfohlen, noch einmal zu synchronisieren oder den Computer neu zu starten"
-#: ../src/gtk-ui/sync-ui.c:3192
+#: ../src/gtk-ui/sync-ui.c:3218
msgid "No space on disk"
msgstr "Kein Platz auf der Festplatte"
-#: ../src/gtk-ui/sync-ui.c:3194
+#: ../src/gtk-ui/sync-ui.c:3220
msgid "Failed to process SyncML"
msgstr "SyncML konnte nicht verarbeitet werden"
-#: ../src/gtk-ui/sync-ui.c:3196
+#: ../src/gtk-ui/sync-ui.c:3222
msgid "Server authorization failed"
msgstr "Serverauthentifizierung fehlgeschlagen"
-#: ../src/gtk-ui/sync-ui.c:3198
+#: ../src/gtk-ui/sync-ui.c:3224
msgid "Failed to parse configuration file"
msgstr "Konfigurationsdatei konnte nicht analysiert werden"
-#: ../src/gtk-ui/sync-ui.c:3200
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "Failed to read configuration file"
msgstr "Konfigurationsdatei konnte nicht gelesen werden"
-#: ../src/gtk-ui/sync-ui.c:3202
+#: ../src/gtk-ui/sync-ui.c:3228
msgid "No configuration found"
msgstr "Keine Konfiguration gefunden"
-#: ../src/gtk-ui/sync-ui.c:3204
+#: ../src/gtk-ui/sync-ui.c:3230
msgid "No configuration file found"
msgstr "Keine Konfigurationsdatei gefunden"
# "The Server has sent invalid content"
-#: ../src/gtk-ui/sync-ui.c:3206
+#: ../src/gtk-ui/sync-ui.c:3232
msgid "Server sent bad content"
msgstr "Der Server hat ungültigen Inhalt gesendet"
-#: ../src/gtk-ui/sync-ui.c:3208
+#: ../src/gtk-ui/sync-ui.c:3234
msgid "Connection certificate has expired"
msgstr "Das Zertifikat der Verbindung ist abgelaufen"
-#: ../src/gtk-ui/sync-ui.c:3210
+#: ../src/gtk-ui/sync-ui.c:3236
msgid "Connection certificate is invalid"
msgstr "Das Zertifikat der Verbindung ist ungültig"
-#: ../src/gtk-ui/sync-ui.c:3218
+#: ../src/gtk-ui/sync-ui.c:3244
msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
msgstr "Verbindung mit dem Server konnte nicht hergestellt werden. Das Problem ist vielleicht nur temporär, oder es könnte ein Fehler bei den Einstellungen vorliegen."
-#: ../src/gtk-ui/sync-ui.c:3225
+#: ../src/gtk-ui/sync-ui.c:3251
msgid "The server URL is bad"
msgstr "Server-URL ist nicht korrekt"
-#: ../src/gtk-ui/sync-ui.c:3230
+#: ../src/gtk-ui/sync-ui.c:3256
msgid "The server was not found"
msgstr "Der Server wurde nicht gefunden"
-#: ../src/gtk-ui/sync-ui.c:3232
+#: ../src/gtk-ui/sync-ui.c:3258
#, c-format
msgid "Error %d"
msgstr "Fehler %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3370
+#: ../src/gtk-ui/sync-ui.c:3396
msgid "Password is required for sync"
msgstr "Kennwort ist zur Synchronisation erforderlich"
-#: ../src/gtk-ui/sync-ui.c:3374
+#: ../src/gtk-ui/sync-ui.c:3400
msgid "Sync with password"
msgstr "Synchronisation mit Kennwort"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3384
+#: ../src/gtk-ui/sync-ui.c:3410
#, c-format
msgid "Please enter password for syncing with %s:"
-msgstr "Kennwort zur Synchronisation eingeben mit %s:"
+msgstr "Kennwort zur Synchronisation mit %s eingeben:"
#. title for the buttons on the right side of main view
#: ../src/gtk-ui/ui.glade.h:2
@@ -551,18 +553,18 @@ msgid ""
"A slow sync compares items from both sides and tries to merge them. \n"
"This may fail in some cases, leading to duplicates or lost information."
msgstr ""
-"Eine langsame Synchronisation vergleicht Elemente beider Seiten und versucht sie zusammenzufügen. \n"
+"Eine langsame Synchronisation vergleicht Elemente beider Seiten und fügt sie zusammen.\n"
"Dies kann manchmal fehlschlagen und Duplikate oder verlorene Informationen zur Folge haben."
# "add new" - shortened to avoid truncation
#: ../src/gtk-ui/ui.glade.h:15
msgid "Add new device"
-msgstr "Neues Gerät hinzufügen"
+msgstr "Gerät zufügen"
# "add new" - shortened to avoid truncation
#: ../src/gtk-ui/ui.glade.h:16
msgid "Add new service"
-msgstr "Neu hinzufügen"
+msgstr "Service zufügen"
#. explanation of "Restore backup" function
#: ../src/gtk-ui/ui.glade.h:18
@@ -593,7 +595,7 @@ msgid ""
"and replace with your\n"
"local information"
msgstr ""
-"Alle Daten auf Zyb löschen \n"
+"Alle Daten auf Zyb löschen\n"
"und mit lokaler Information\n"
"ersetzen"
@@ -659,18 +661,18 @@ msgstr "Synchronisation (GTK)"
#: ../src/gtk-ui/sync-config-widget.c:78
msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
-msgstr "ScheduleWorld erlaubt Ihnen Ihre Kontakte, Events, Aufgaben und Notizen zu synchronisieren."
+msgstr "ScheduleWorld erlaubt dir, deine Kontakte, Events, Aufgaben und Notizen zu synchronisieren."
#: ../src/gtk-ui/sync-config-widget.c:81
msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
-msgstr "Google Synchronisation kann Ihr Addressbuch mit Ihren Gmail Kontakten synchronisieren und eine Sicherheitskopie davon erstellen."
+msgstr "Google Synchronisation kann dein Addressbuch mit deinen Gmail Kontakten synchronisieren und eine Sicherheitskopie davon erstellen."
#. TRANSLATORS: Please include the word "demo" (or the equivalent in
#. your language): Funambol is going to be a 90 day demo service
#. in the future
#: ../src/gtk-ui/sync-config-widget.c:87
msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
-msgstr "Erstellen Sie Sicherheitskopien Ihrer Kontakte und Ihres Kalenders. Sync mit einem einzigen Klick, irgendwann, irgendwo (DEMO)."
+msgstr "Erstelle Sicherheitskopien deiner Kontakte und deines Kalenders. Sync mit einem einzigen Klick, irgendwann, irgendwo (DEMO)."
#: ../src/gtk-ui/sync-config-widget.c:90
msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
@@ -710,7 +712,7 @@ msgstr "Nein, Einstellungen behalten"
#: ../src/gtk-ui/sync-config-widget.c:432
#, c-format
msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
-msgstr "Sollen die Einstellungen für %s gelöscht werden? Dabei werden keine synchronisierten Information gelöscht, jedoch wird die Service-Konfiguration gelöscht."
+msgstr "Sollen die Einstellungen für %s gelöscht werden? Dabei werden keine synchronisierten Informationen gelöscht, jedoch wird die Service-Konfiguration gelöscht."
#. TRANSLATORS: buttons in delete-service warning dialog
#: ../src/gtk-ui/sync-config-widget.c:437
@@ -736,8 +738,8 @@ msgid ""
"Save and replace\n"
"current service"
msgstr ""
-"Speichern und ersetzen\n"
-"diesen Service "
+"Diesen Service\n"
+"speichern und ersetzen"
#: ../src/gtk-ui/sync-config-widget.c:493
msgid "Stop using device"
@@ -760,7 +762,7 @@ msgstr "URI von %s"
#: ../src/gtk-ui/sync-config-widget.c:854
#, c-format
msgid "Send changes to %s"
-msgstr "Önderungen senden an %s"
+msgstr "Änderungen senden an %s"
#: ../src/gtk-ui/sync-config-widget.c:859
#, c-format
diff --git a/po/es.po b/po/es.po
index fc0139c1..61f3efa3 100644
--- a/po/es.po
+++ b/po/es.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-05-05 09:24+0000\n"
+"POT-Creation-Date: 2010-05-12 09:27+0000\n"
"PO-Revision-Date: \n"
"Last-Translator: Tomás Galicia <tomas.galicia@intel.com>\n"
"Language-Team: \n"
@@ -79,7 +79,7 @@ msgstr "Sí, borrar y reemplazar"
#: ../src/gtk-ui/sync-ui.c:429
#: ../src/gtk-ui/sync-ui.c:460
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "No"
msgstr "No"
@@ -164,12 +164,12 @@ msgstr "Sincronización lenta"
msgid "Other options..."
msgstr "Otras opciones..."
-# Configuration of the synchronization service
+# "Select a service". Omitted 'syn' because there's no room in the button for proper display. The context is clear and this will not impair understanding by the user.
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * when no service is selected. Will open configuration view
#: ../src/gtk-ui/sync-ui.c:624
msgid "Select sync service"
-msgstr "Seleccionar un servicio de sincronización"
+msgstr "Seleccionar un servicio"
# Edit the configuration of the service
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
@@ -199,7 +199,7 @@ msgstr "Sincronizando..."
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
#: ../src/gtk-ui/sync-ui.c:757
-#: ../src/gtk-ui/sync-ui.c:3374
+#: ../src/gtk-ui/sync-ui.c:3399
msgid "Cancel sync"
msgstr "Cancelar la sincronización"
@@ -210,7 +210,7 @@ msgstr "Volver a la sincronización"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1223
+#: ../src/gtk-ui/sync-ui.c:1224
msgid "Automatic sync"
msgstr ""
"Sincronización\n"
@@ -220,53 +220,53 @@ msgstr ""
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1494
+#: ../src/gtk-ui/sync-ui.c:1519
#, c-format
msgid "Affected data: %s %s"
msgstr "Datos afectados: %s %s"
-#: ../src/gtk-ui/sync-ui.c:1499
+#: ../src/gtk-ui/sync-ui.c:1524
#, c-format
msgid "Affected data: none"
msgstr "Datos afectados: ninguno"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1577
+#: ../src/gtk-ui/sync-ui.c:1602
#, c-format
msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
msgstr "¿Deseas restaurar la copia de seguridad de %s? Todos los cambios que hayas realizado desde entonces se perderán."
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "Yes, restore"
msgstr "Sí, restaurar"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1612
+#: ../src/gtk-ui/sync-ui.c:1637
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1631
+#: ../src/gtk-ui/sync-ui.c:1656
#, c-format
msgid "Backed up before syncing with %s"
msgstr "Copia de seguridad realizada ante de sincronizar con %s"
-#: ../src/gtk-ui/sync-ui.c:1648
+#: ../src/gtk-ui/sync-ui.c:1673
msgid "Restore"
msgstr "Restaurar"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1755
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
msgstr "Una sincronización normal con %s no es posible en este momento. Puedes realizar una sincronización lenta de dos vías o iniciar de cero. También puedes restaurar una copia de seguridad, pero una sincronización lenta o iniciar de cero igual será necesaria antes de que sea posible una sincronización normal."
-#: ../src/gtk-ui/sync-ui.c:1765
+#: ../src/gtk-ui/sync-ui.c:1790
#, c-format
msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
msgstr "Si algo realmente malo sucede, puedes intentar una sincronización lenta, empezar de cero o restaurar la copia de seguridad."
@@ -274,7 +274,7 @@ msgstr "Si algo realmente malo sucede, puedes intentar una sincronización lenta
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1774
+#: ../src/gtk-ui/sync-ui.c:1799
#, c-format
msgid ""
"Delete all your local\n"
@@ -285,7 +285,7 @@ msgstr ""
"locales y reemplazarlos con\n"
"datos de %s"
-#: ../src/gtk-ui/sync-ui.c:1780
+#: ../src/gtk-ui/sync-ui.c:1805
#, c-format
msgid ""
"Delete all data on\n"
@@ -296,71 +296,71 @@ msgstr ""
"%s y reemplazarlos\n"
"con tus datos locales"
-#: ../src/gtk-ui/sync-ui.c:2242
+#: ../src/gtk-ui/sync-ui.c:2267
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "Error al obtener la lista de servicios compatibles de SyncEvolution"
-#: ../src/gtk-ui/sync-ui.c:2296
+#: ../src/gtk-ui/sync-ui.c:2321
msgid "There was a problem communicating with the sync process. Please try again later."
msgstr "Ha ocurrido un problema de comunicación en el proceso de sincronización. Inténtalo más tarde."
-#: ../src/gtk-ui/sync-ui.c:2355
+#: ../src/gtk-ui/sync-ui.c:2380
msgid "Restore failed"
msgstr "Restaurar falló"
-#: ../src/gtk-ui/sync-ui.c:2358
-#: ../src/gtk-ui/sync-ui.c:3243
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
msgid "Sync failed"
msgstr "Sincronización falló"
-#: ../src/gtk-ui/sync-ui.c:2364
+#: ../src/gtk-ui/sync-ui.c:2389
msgid "Restore complete"
msgstr "Restaurado completo"
-#: ../src/gtk-ui/sync-ui.c:2367
+#: ../src/gtk-ui/sync-ui.c:2392
msgid "Sync complete"
msgstr "¡Sincronizado!"
-#: ../src/gtk-ui/sync-ui.c:2459
+#: ../src/gtk-ui/sync-ui.c:2484
#, c-format
msgid "Preparing '%s'"
msgstr "Preparando '%s'"
-#: ../src/gtk-ui/sync-ui.c:2462
+#: ../src/gtk-ui/sync-ui.c:2487
#, c-format
msgid "Receiving '%s'"
msgstr "Recibiendo '%s'"
-#: ../src/gtk-ui/sync-ui.c:2465
+#: ../src/gtk-ui/sync-ui.c:2490
#, c-format
msgid "Sending '%s'"
msgstr "Enviando '%s'"
-#: ../src/gtk-ui/sync-ui.c:2586
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "Hubo un rechazo remoto."
msgstr[1] "Hubo %ld rechazos remotos."
-#: ../src/gtk-ui/sync-ui.c:2591
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "Hubo un rechazo local."
msgstr[1] "Hubo %ld rechazos locales."
-#: ../src/gtk-ui/sync-ui.c:2596
+#: ../src/gtk-ui/sync-ui.c:2621
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "Se han producido %ld rechazos locales y %ld rechazos remotos."
-#: ../src/gtk-ui/sync-ui.c:2601
+#: ../src/gtk-ui/sync-ui.c:2626
#, c-format
msgid "Last time: No changes."
msgstr "La última vez: no hubo cambios."
-#: ../src/gtk-ui/sync-ui.c:2603
+#: ../src/gtk-ui/sync-ui.c:2628
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -370,21 +370,21 @@ msgstr[1] "La última vez: se enviaron %ld cambios."
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2611
+#: ../src/gtk-ui/sync-ui.c:2636
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "La última vez: se aplicó un cambio."
msgstr[1] "La última vez: se aplicaron %ld cambios."
-#: ../src/gtk-ui/sync-ui.c:2616
+#: ../src/gtk-ui/sync-ui.c:2641
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "La última vez: se aplicaron %ld cambios y se enviaron %ld cambios."
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2823
+#: ../src/gtk-ui/sync-ui.c:2848
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -393,135 +393,135 @@ msgstr ""
"Hubo un problema en la última sincronización:\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2833
+#: ../src/gtk-ui/sync-ui.c:2858
#, c-format
msgid "You've just restored a backup. The changes have not been synced with %s yet"
msgstr "Has restaurado una copia de resguardo. Los cambios aún no se sincronizan con %s"
-#: ../src/gtk-ui/sync-ui.c:3121
+#: ../src/gtk-ui/sync-ui.c:3146
msgid "Waiting for current operation to finish..."
msgstr "Esperando que la operación actual termine..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3155
+#: ../src/gtk-ui/sync-ui.c:3180
msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
msgstr "Una sincronización normal no es posible en este momento. El servidor sugiere una sincronización lenta, pero esto no es necesariamente lo que deseas si ambas partes ya tienen datos."
# the syncronization service D-Bus closed unexpectedly
-#: ../src/gtk-ui/sync-ui.c:3159
+#: ../src/gtk-ui/sync-ui.c:3184
msgid "The sync process died unexpectedly."
msgstr "El servicio de sincronización se cerró inesperadamente."
-#: ../src/gtk-ui/sync-ui.c:3164
+#: ../src/gtk-ui/sync-ui.c:3189
msgid "Password request was not answered. You can save the password in the settings to prevent the request."
msgstr "No se ha respondido a la solicitud de contraseña. Para evitar que aparezca otra vez, se puede guardar la contraseña en los ajustes."
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3168
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "There was a problem processing sync request. Trying again may help."
msgstr "Ha ocurrido un problema al procesar la solicitud de sincronización. Intentar otra vez puede ayudar."
-#: ../src/gtk-ui/sync-ui.c:3174
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to login. Could there be a problem with your username or password?"
msgstr "Acceso fallido. ¿Podría haber algún problema con tu usuario o contraseña?"
-#: ../src/gtk-ui/sync-ui.c:3177
+#: ../src/gtk-ui/sync-ui.c:3202
msgid "Forbidden"
msgstr "Prohibido"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3183
+#: ../src/gtk-ui/sync-ui.c:3208
msgid "A data source could not be found. Could there be a problem with the settings?"
msgstr "No se pudo hallar la fuente de datos. ¿Podría haber algún problema con la configuración?"
# Fatal error in the database
-#: ../src/gtk-ui/sync-ui.c:3187
+#: ../src/gtk-ui/sync-ui.c:3212
msgid "Remote database error"
msgstr "Error en la base de datos remota"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3190
+#: ../src/gtk-ui/sync-ui.c:3215
msgid "There is a problem with the local database. Syncing again or rebooting may help."
msgstr "Hay un problema con la base de datos local. Sincronizar otra vez o reiniciar puede ayudar."
# There is no space left
-#: ../src/gtk-ui/sync-ui.c:3193
+#: ../src/gtk-ui/sync-ui.c:3218
msgid "No space on disk"
msgstr "No queda espacio"
-#: ../src/gtk-ui/sync-ui.c:3195
+#: ../src/gtk-ui/sync-ui.c:3220
msgid "Failed to process SyncML"
msgstr "Error al procesar SyncML"
# the server didn't accept the authorization
-#: ../src/gtk-ui/sync-ui.c:3197
+#: ../src/gtk-ui/sync-ui.c:3222
msgid "Server authorization failed"
msgstr "El servidor no ha aceptado la autorización"
# Error while analysing the syntax of the configuration file
-#: ../src/gtk-ui/sync-ui.c:3199
+#: ../src/gtk-ui/sync-ui.c:3224
msgid "Failed to parse configuration file"
msgstr "Error al analizar la sintaxis del archivo de configuración"
# Error while reading the configuration file
-#: ../src/gtk-ui/sync-ui.c:3201
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "Failed to read configuration file"
msgstr "Error al leer del archivo de configuración"
# The configuration has not been found
-#: ../src/gtk-ui/sync-ui.c:3203
+#: ../src/gtk-ui/sync-ui.c:3228
msgid "No configuration found"
msgstr "No se ha encontrado la configuración"
# The configuration file has not been found
-#: ../src/gtk-ui/sync-ui.c:3205
+#: ../src/gtk-ui/sync-ui.c:3230
msgid "No configuration file found"
msgstr "No se ha encontrado el archivo de configuración"
# The server sent an an invalid content
-#: ../src/gtk-ui/sync-ui.c:3207
+#: ../src/gtk-ui/sync-ui.c:3232
msgid "Server sent bad content"
msgstr "El servidor envió un contenido no válido"
-#: ../src/gtk-ui/sync-ui.c:3209
+#: ../src/gtk-ui/sync-ui.c:3234
msgid "Connection certificate has expired"
msgstr "El certificado de conexión está vencido"
# The connection certificate is not valid
-#: ../src/gtk-ui/sync-ui.c:3211
+#: ../src/gtk-ui/sync-ui.c:3236
msgid "Connection certificate is invalid"
msgstr "El certificado de conexión no es válido"
-#: ../src/gtk-ui/sync-ui.c:3219
+#: ../src/gtk-ui/sync-ui.c:3244
msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
msgstr "No hemos podido conectarnos con el servidor. El problema podría ser temporal o podría haber algún problema con la configuración."
# The URL is incorrect
-#: ../src/gtk-ui/sync-ui.c:3226
+#: ../src/gtk-ui/sync-ui.c:3251
msgid "The server URL is bad"
msgstr "La URL del servidor es incorrecta"
-#: ../src/gtk-ui/sync-ui.c:3231
+#: ../src/gtk-ui/sync-ui.c:3256
msgid "The server was not found"
msgstr "No se ha encontrado el servidor"
-#: ../src/gtk-ui/sync-ui.c:3233
+#: ../src/gtk-ui/sync-ui.c:3258
#, c-format
msgid "Error %d"
msgstr "Error: %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3371
+#: ../src/gtk-ui/sync-ui.c:3396
msgid "Password is required for sync"
msgstr "Se requiere contraseña para la sincronización"
-#: ../src/gtk-ui/sync-ui.c:3375
+#: ../src/gtk-ui/sync-ui.c:3400
msgid "Sync with password"
msgstr "Sincronización con contraseña"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3385
+#: ../src/gtk-ui/sync-ui.c:3410
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "Por favor ingresa la contraseña para sincronizar con %s:"
diff --git a/po/fi.po b/po/fi.po
index bdad7459..8df114c1 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-04-07 09:29+0000\n"
+"POT-Creation-Date: 2010-05-05 09:24+0000\n"
"PO-Revision-Date: \n"
"Last-Translator: Eija <eija@wimma.com>\n"
"Language-Team: \n"
@@ -15,123 +15,127 @@ msgstr ""
#. TRANSLATORS: this is the application name that may be used by e.g.
#. the windowmanager
-#: ../src/gtk-ui/main.c:40
-#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38
#: ../src/gtk-ui/sync.desktop.in.h:1
#: ../src/gnome-bluetooth/syncevolution.c:112
msgid "Sync"
msgstr "Synkkaus"
-#: ../src/gtk-ui/sync-ui.c:260
+#: ../src/gtk-ui/sync-ui.c:266
msgid "Contacts"
msgstr "Yhteyshenkilöt"
-#: ../src/gtk-ui/sync-ui.c:262
+#: ../src/gtk-ui/sync-ui.c:268
msgid "Appointments"
msgstr "Tapaamiset"
-#: ../src/gtk-ui/sync-ui.c:264
-#: ../src/gtk-ui/ui.glade.h:40
+#: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40
msgid "Tasks"
msgstr "Tehtävät"
-#: ../src/gtk-ui/sync-ui.c:266
+#: ../src/gtk-ui/sync-ui.c:272
msgid "Notes"
msgstr "Huomautukset"
#. TRANSLATORS: This is a "combination source" for syncing with devices
#. * that combine appointments and tasks. the name should match the ones
#. * used for calendar and todo above
-#: ../src/gtk-ui/sync-ui.c:271
+#: ../src/gtk-ui/sync-ui.c:277
msgid "Appointments & Tasks"
msgstr "Tapaamiset ja tehtävät"
-#: ../src/gtk-ui/sync-ui.c:343
+#: ../src/gtk-ui/sync-ui.c:349
msgid "Starting sync"
msgstr "Aloitetaan synkkaus"
#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:381
+#: ../src/gtk-ui/sync-ui.c:387
#, c-format
msgid "Do you want to slow sync with %s?"
msgstr "Haluatko hitaan synkkauksen kohteen %s kanssa?"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "Yes, do slow sync"
msgstr "Kyllä, tehdään hidas synkkaus"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "No, cancel sync"
msgstr "Ei, peru synkkaus"
#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:418
+#: ../src/gtk-ui/sync-ui.c:424
#, c-format
-msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
-msgstr "Haluatko poistaa kaikki paikalliset tiedot ja korvata ne tiedoilla kohteesta %s? Tämä ei ole yleensä suositeltavaa."
+msgid ""
+"Do you want to delete all local data and replace it with data from %s? This "
+"is not usually advised."
+msgstr ""
+"Haluatko poistaa kaikki paikalliset tiedot ja korvata ne tiedoilla kohteesta "
+"%s? Tämä ei ole yleensä suositeltavaa."
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:460
msgid "Yes, delete and replace"
msgstr "Kyllä, poista ja korvaa"
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:460
+#: ../src/gtk-ui/sync-ui.c:1580
msgid "No"
msgstr "Ei"
#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:449
+#: ../src/gtk-ui/sync-ui.c:455
#, c-format
-msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
-msgstr "Haluatko poistaa kaikki tiedot kohteessa %s ja korvata ne paikallisilla tiedoillasi? Tämä ei ole yleensä suositeltavaa."
+msgid ""
+"Do you want to delete all data in %s and replace it with your local data? "
+"This is not usually advised."
+msgstr ""
+"Haluatko poistaa kaikki tiedot kohteessa %s ja korvata ne paikallisilla "
+"tiedoillasi? Tämä ei ole yleensä suositeltavaa."
-#: ../src/gtk-ui/sync-ui.c:481
+#: ../src/gtk-ui/sync-ui.c:487
msgid "Trying to cancel sync"
msgstr "Yritetään perua synkkaus"
-#: ../src/gtk-ui/sync-ui.c:521
+#: ../src/gtk-ui/sync-ui.c:529
msgid "No service or device selected"
msgstr "Palvelua tai laitetta ei ole valittuna"
#. TRANSLATORS: This is the title on main view. Placeholder is
#. * the service name. Example: "Google - synced just now"
-#: ../src/gtk-ui/sync-ui.c:529
+#: ../src/gtk-ui/sync-ui.c:537
#, c-format
msgid "%s - synced just now"
msgstr "%s - synkataan juuri nyt"
-#: ../src/gtk-ui/sync-ui.c:533
+#: ../src/gtk-ui/sync-ui.c:541
#, c-format
msgid "%s - synced a minute ago"
msgstr "%s - Synkattu viimeksi minuutti sitten"
-#: ../src/gtk-ui/sync-ui.c:537
+#: ../src/gtk-ui/sync-ui.c:545
#, c-format
msgid "%s - synced %ld minutes ago"
msgstr "%s - Synkattu viimeksi %ld minuuttia sitten"
-#: ../src/gtk-ui/sync-ui.c:542
+#: ../src/gtk-ui/sync-ui.c:550
#, c-format
msgid "%s - synced an hour ago"
msgstr "%s - Synkattu viimeksi tunti sitten"
-#: ../src/gtk-ui/sync-ui.c:546
+#: ../src/gtk-ui/sync-ui.c:554
#, c-format
msgid "%s - synced %ld hours ago"
msgstr "%s - Synkattu viimeksi %ld tuntia sitten"
# last synced yesterday
-#: ../src/gtk-ui/sync-ui.c:551
+#: ../src/gtk-ui/sync-ui.c:559
#, c-format
msgid "%s - synced a day ago"
msgstr "%s - Synkattu viimeksi eilen"
-#: ../src/gtk-ui/sync-ui.c:555
+#: ../src/gtk-ui/sync-ui.c:563
#, c-format
msgid "%s - synced %ld days ago"
msgstr "%s - Synkattu viimeksi %ld päivää sitten"
@@ -139,67 +143,71 @@ msgstr "%s - Synkattu viimeksi %ld päivää sitten"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "You've just restored a backup. The changes have not been "
#. * "synced with %s yet"
-#: ../src/gtk-ui/sync-ui.c:604
-#: ../src/gtk-ui/sync-ui.c:719
+#: ../src/gtk-ui/sync-ui.c:612 ../src/gtk-ui/sync-ui.c:726
msgid "Sync now"
msgstr "Synkkaa nyt"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "A normal sync is not possible at this time..." message.
#. * "Other options" will open Emergency view
-#: ../src/gtk-ui/sync-ui.c:610
-#: ../src/gtk-ui/ui.glade.h:37
+#: ../src/gtk-ui/sync-ui.c:618 ../src/gtk-ui/ui.glade.h:37
msgid "Slow sync"
-msgstr "Hidas synkkaus"
+msgstr "Hidas\n"
+"synkkaus"
-#: ../src/gtk-ui/sync-ui.c:611
+#: ../src/gtk-ui/sync-ui.c:619
msgid "Other options..."
msgstr "Muut asetukset..."
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * when no service is selected. Will open configuration view
-#: ../src/gtk-ui/sync-ui.c:616
+#: ../src/gtk-ui/sync-ui.c:624
msgid "Select sync service"
msgstr "Määritä synkkauspalvelu"
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * login to service fails. Will open configuration view for this service
-#: ../src/gtk-ui/sync-ui.c:621
+#: ../src/gtk-ui/sync-ui.c:629
msgid "Edit service settings"
msgstr "Muuta palveluasetuksia"
-#: ../src/gtk-ui/sync-ui.c:670
-msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
-msgstr "Synkkauspalvelua tai laitetta ei ole vielä valittu. Synkkauspalvelu mahdollistaa Netbookisi ja verkkopalvelusi tietojen synkkauksen. Voit myös synkata suoraan joitakin laitteita."
+#: ../src/gtk-ui/sync-ui.c:700
+msgid ""
+"You haven't selected a sync service or device yet. Sync services let you "
+"synchronize your data between your netbook and a web service. You can also "
+"sync directly with some devices."
+msgstr ""
+"Synkkauspalvelua tai laitetta ei ole vielä valittu. Synkkauspalvelu "
+"mahdollistaa Netbookisi ja verkkopalvelusi tietojen synkkauksen. Voit myös "
+"synkata suoraan joitakin laitteita."
# using taas instead of uudelleen to fix a truncation
-#: ../src/gtk-ui/sync-ui.c:717
+#: ../src/gtk-ui/sync-ui.c:722
msgid "Sync again"
msgstr "Synkkaa taas"
-#: ../src/gtk-ui/sync-ui.c:730
+#: ../src/gtk-ui/sync-ui.c:743
msgid "Restoring"
msgstr "Palautetaan"
-#: ../src/gtk-ui/sync-ui.c:732
+#: ../src/gtk-ui/sync-ui.c:745
msgid "Syncing"
msgstr "Synkkaus käynnissä"
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
-#: ../src/gtk-ui/sync-ui.c:743
-#: ../src/gtk-ui/sync-ui.c:3358
+#: ../src/gtk-ui/sync-ui.c:757 ../src/gtk-ui/sync-ui.c:3374
msgid "Cancel sync"
msgstr "Peru synkkaus"
-#: ../src/gtk-ui/sync-ui.c:908
+#: ../src/gtk-ui/sync-ui.c:922
msgid "Back to sync"
msgstr "Takaisin synkkaukseen"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1209
+#: ../src/gtk-ui/sync-ui.c:1223
msgid "Automatic sync"
msgstr "Automaattinen synkkaus"
@@ -207,61 +215,77 @@ msgstr "Automaattinen synkkaus"
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1480
+#: ../src/gtk-ui/sync-ui.c:1494
#, c-format
msgid "Affected data: %s %s"
msgstr "Koskee tietoja: %s %s"
-#: ../src/gtk-ui/sync-ui.c:1485
+#: ../src/gtk-ui/sync-ui.c:1499
#, c-format
msgid "Affected data: none"
msgstr "Koskee tietoja: ei mitään"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1563
+#: ../src/gtk-ui/sync-ui.c:1577
#, c-format
-msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
-msgstr "Haluatko palauttaa varmuuskopioinnin kohteesta %s? Menetät kaikki tämän jälkeen tekemäsi muutokset."
+msgid ""
+"Do you want to restore the backup from %s? All changes you have made since "
+"then will be lost."
+msgstr ""
+"Haluatko palauttaa varmuuskopioinnin kohteesta %s? Menetät kaikki tämän "
+"jälkeen tekemäsi muutokset."
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:1580
msgid "Yes, restore"
msgstr "Kyllä, palauta"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1598
+#: ../src/gtk-ui/sync-ui.c:1612
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1617
+#: ../src/gtk-ui/sync-ui.c:1631
#, c-format
msgid "Backed up before syncing with %s"
msgstr "Varmuuskopioitu ennen sunkkausta kohteen %s kanssa"
-#: ../src/gtk-ui/sync-ui.c:1634
+#: ../src/gtk-ui/sync-ui.c:1648
msgid "Restore"
msgstr "Palauttaa"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1741
+#: ../src/gtk-ui/sync-ui.c:1755
#, c-format
-msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
-msgstr "Normaali synkkaus kohteen %s ei ole mahdollinen täällä kertaa. Voit tehdä hitaan kaksisuuntaisen synkkauksen tai aloittaa nollasta. Voit myös palauttaa varmuuskopion, mutta joko hidas synkkaus tai aloittaminen nollasta vaaditaan, ennen kuin normaali synkkaus on mahdollinen."
+msgid ""
+"A normal sync with %s is not possible at this time. You can do a slow two-"
+"way sync or start from scratch. You can also restore a backup, but a slow "
+"sync or starting from scratch will still be required before normal sync is "
+"possible."
+msgstr ""
+"Normaali synkkaus kohteen %s ei ole mahdollinen täällä kertaa. Voit tehdä "
+"hitaan kaksisuuntaisen synkkauksen tai aloittaa nollasta. Voit myös "
+"palauttaa varmuuskopion, mutta joko hidas synkkaus tai aloittaminen nollasta "
+"vaaditaan, ennen kuin normaali synkkaus on mahdollinen."
-#: ../src/gtk-ui/sync-ui.c:1751
+#: ../src/gtk-ui/sync-ui.c:1765
#, c-format
-msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
-msgstr "Jos jotakin on mennyt järkyttävän pieleen, voit yrittää hidasta synkkausta, aloittamista nollasta tai palauttaa varmuuskopiosta."
+msgid ""
+"If something has gone horribly wrong, you can try a slow sync, start from "
+"scratch or restore from backup."
+msgstr ""
+"Jos jotakin on mennyt järkyttävän pieleen, voit yrittää hidasta synkkausta, "
+"aloittamista nollasta tai palauttaa varmuuskopiosta."
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1760
+#: ../src/gtk-ui/sync-ui.c:1774
#, c-format
msgid ""
"Delete all your local\n"
@@ -272,7 +296,7 @@ msgstr ""
" tiedot ja korvaa ne \n"
"tiedoilla kohteesta %s"
-#: ../src/gtk-ui/sync-ui.c:1766
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid ""
"Delete all data on\n"
@@ -283,72 +307,75 @@ msgstr ""
"%s ja korvaa \n"
"paikallisilla tiedoilla"
-#: ../src/gtk-ui/sync-ui.c:2226
+#: ../src/gtk-ui/sync-ui.c:2242
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "Tuettujen palveluiden listan saaminen SyncEvolutionista epäonnistui"
-#: ../src/gtk-ui/sync-ui.c:2280
-msgid "There was a problem communicating with the sync process. Please try again later."
-msgstr "Ilmeni onglema kommunikoitaessa synkkausprosessin kanssa. Yritä myöhemmin uudelleen."
+#: ../src/gtk-ui/sync-ui.c:2296
+msgid ""
+"There was a problem communicating with the sync process. Please try again "
+"later."
+msgstr ""
+"Ilmeni onglema kommunikoitaessa synkkausprosessin kanssa. Yritä myöhemmin "
+"uudelleen."
-#: ../src/gtk-ui/sync-ui.c:2339
+#: ../src/gtk-ui/sync-ui.c:2355
msgid "Restore failed"
msgstr "Palauttaminen epäonnistui"
# changed to "sync error" in order to fix a truncation in the UI.
-#: ../src/gtk-ui/sync-ui.c:2342
-#: ../src/gtk-ui/sync-ui.c:3227
+#: ../src/gtk-ui/sync-ui.c:2358 ../src/gtk-ui/sync-ui.c:3243
msgid "Sync failed"
msgstr "Synkkaus epäonnistui"
-#: ../src/gtk-ui/sync-ui.c:2348
+#: ../src/gtk-ui/sync-ui.c:2364
msgid "Restore complete"
msgstr "Palautus valmis"
-#: ../src/gtk-ui/sync-ui.c:2351
+#: ../src/gtk-ui/sync-ui.c:2367
msgid "Sync complete"
msgstr "Synkkaus valmis"
-#: ../src/gtk-ui/sync-ui.c:2443
+#: ../src/gtk-ui/sync-ui.c:2459
#, c-format
msgid "Preparing '%s'"
msgstr "Valmistellaan: '%s'"
-#: ../src/gtk-ui/sync-ui.c:2446
+#: ../src/gtk-ui/sync-ui.c:2462
#, c-format
msgid "Receiving '%s'"
msgstr "Vastaanotetaan: '%s'"
-#: ../src/gtk-ui/sync-ui.c:2449
+#: ../src/gtk-ui/sync-ui.c:2465
#, c-format
msgid "Sending '%s'"
msgstr "Lähetetään: '%s'"
-#: ../src/gtk-ui/sync-ui.c:2570
+#: ../src/gtk-ui/sync-ui.c:2586
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "Tapahtui yksi etähylkäys"
msgstr[1] "Tapahtui %ld etähylkäystä"
-#: ../src/gtk-ui/sync-ui.c:2575
+#: ../src/gtk-ui/sync-ui.c:2591
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "Tapahtui yksi paikallinen hylkäys"
msgstr[1] "Tapahtui %ld paikallista hylkäystä"
-#: ../src/gtk-ui/sync-ui.c:2580
+#: ../src/gtk-ui/sync-ui.c:2596
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "Tapahtui %ld paikallista hylkäystä ja %ld etähylkäystä"
-#: ../src/gtk-ui/sync-ui.c:2585
+#: ../src/gtk-ui/sync-ui.c:2601
#, c-format
msgid "Last time: No changes."
msgstr "Viime kerta: ei muutoksia"
-#: ../src/gtk-ui/sync-ui.c:2587
+#: ../src/gtk-ui/sync-ui.c:2603
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -358,21 +385,21 @@ msgstr[1] "Viime kerralla: %ld muutosta lähetetty."
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2595
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "Viime kerralla: yksi muutos sovellettu."
msgstr[1] "Viime kerralla: %ld muutosta sovellettu."
-#: ../src/gtk-ui/sync-ui.c:2600
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "Viime kerralla: Sovellettu %ld muutosta ja lähetetty %ld muutosta."
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2807
+#: ../src/gtk-ui/sync-ui.c:2823
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -381,126 +408,152 @@ msgstr ""
"Ilmeni onglema viimeisen synkkauksen kanssa :\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2817
+#: ../src/gtk-ui/sync-ui.c:2833
#, c-format
-msgid "You've just restored a backup. The changes have not been synced with %s yet"
-msgstr "Olet juuri palauttanut varmuuskopion. Muutoksia ei ole vielä synkattu kohteen %s kanssa."
+msgid ""
+"You've just restored a backup. The changes have not been synced with %s yet"
+msgstr ""
+"Olet juuri palauttanut varmuuskopion. Muutoksia ei ole vielä synkattu "
+"kohteen %s kanssa."
-#: ../src/gtk-ui/sync-ui.c:3105
+#: ../src/gtk-ui/sync-ui.c:3121
msgid "Waiting for current operation to finish..."
msgstr "Nykyisen toiminnon päättymistä odotetaan..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3139
-msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
-msgstr "Normaali synkkaus ei ole mahdollinen tällä kertaa. Palvelin suosittelee hidasta synkkausta, mutta tämä ei aina ehkä ole sitä, mitä haluat, jos molemmissa päissä on jo tietoja."
+#: ../src/gtk-ui/sync-ui.c:3155
+msgid ""
+"A normal sync is not possible at this time. The server suggests a slow sync, "
+"but this might not always be what you want if both ends already have data."
+msgstr ""
+"Normaali synkkaus ei ole mahdollinen tällä kertaa. Palvelin suosittelee "
+"hidasta synkkausta, mutta tämä ei aina ehkä ole sitä, mitä haluat, jos "
+"molemmissa päissä on jo tietoja."
# ...service ended unexpectedly
-#: ../src/gtk-ui/sync-ui.c:3143
+#: ../src/gtk-ui/sync-ui.c:3159
msgid "The sync process died unexpectedly."
msgstr "Synkkauspalvelu loppui odottamattomasti"
-#: ../src/gtk-ui/sync-ui.c:3148
-msgid "Password request was not answered. You can save the password in the settings to prevent the request."
-msgstr "Salasanapyyntöön ei vastattu. Voit tallentaa salasanan asetuksissa estääksesi pyynnön."
+#: ../src/gtk-ui/sync-ui.c:3164
+msgid ""
+"Password request was not answered. You can save the password in the settings "
+"to prevent the request."
+msgstr ""
+"Salasanapyyntöön ei vastattu. Voit tallentaa salasanan asetuksissa "
+"estääksesi pyynnön."
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3152
+#: ../src/gtk-ui/sync-ui.c:3168
msgid "There was a problem processing sync request. Trying again may help."
-msgstr "Synkkauspyynnön prosessoimisessa ilmeni ongelma. Voi auttaa, jos yrität uudelleen."
+msgstr ""
+"Synkkauspyynnön prosessoimisessa ilmeni ongelma. Voi auttaa, jos yrität "
+"uudelleen."
-#: ../src/gtk-ui/sync-ui.c:3158
-msgid "Failed to login. Could there be a problem with your username or password?"
-msgstr "Sisäänkirjautuminen ei onnistunut. Voisiko käyttäjänimen tai salasanan kanssa olla ongelma?"
+#: ../src/gtk-ui/sync-ui.c:3174
+msgid ""
+"Failed to login. Could there be a problem with your username or password?"
+msgstr ""
+"Sisäänkirjautuminen ei onnistunut. Voisiko käyttäjänimen tai salasanan "
+"kanssa olla ongelma?"
-#: ../src/gtk-ui/sync-ui.c:3161
+#: ../src/gtk-ui/sync-ui.c:3177
msgid "Forbidden"
msgstr "Kielletty"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3167
-msgid "A data source could not be found. Could there be a problem with the settings?"
+#: ../src/gtk-ui/sync-ui.c:3183
+msgid ""
+"A data source could not be found. Could there be a problem with the settings?"
msgstr "Tietolähdettä ei löydy. Voisiko asetusten kanssa olla ongelma?"
-#: ../src/gtk-ui/sync-ui.c:3171
+#: ../src/gtk-ui/sync-ui.c:3187
msgid "Remote database error"
msgstr "Etätietokantavirhe"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3174
-msgid "There is a problem with the local database. Syncing again or rebooting may help."
-msgstr "Paikallisen tietokannan kanssa on ongelmia. Voi auttaa, jos synkkaat uudelleen tai buuttaat."
+#: ../src/gtk-ui/sync-ui.c:3190
+msgid ""
+"There is a problem with the local database. Syncing again or rebooting may "
+"help."
+msgstr ""
+"Paikallisen tietokannan kanssa on ongelmia. Voi auttaa, jos synkkaat "
+"uudelleen tai buuttaat."
-#: ../src/gtk-ui/sync-ui.c:3177
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "No space on disk"
msgstr "Levykkeen tila lopussa"
-#: ../src/gtk-ui/sync-ui.c:3179
+#: ../src/gtk-ui/sync-ui.c:3195
msgid "Failed to process SyncML"
msgstr "SyncML:n käsittely epäonnistui"
-#: ../src/gtk-ui/sync-ui.c:3181
+#: ../src/gtk-ui/sync-ui.c:3197
msgid "Server authorization failed"
msgstr "Serverin varmennus epäonnistui"
-#: ../src/gtk-ui/sync-ui.c:3183
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to parse configuration file"
msgstr "Asetustiedoston jäsennys epäonnistui"
-#: ../src/gtk-ui/sync-ui.c:3185
+#: ../src/gtk-ui/sync-ui.c:3201
msgid "Failed to read configuration file"
msgstr "Asetustiedoston lukeminen epäonnistui"
-#: ../src/gtk-ui/sync-ui.c:3187
+#: ../src/gtk-ui/sync-ui.c:3203
msgid "No configuration found"
msgstr "Asetuksia ei löydy"
-#: ../src/gtk-ui/sync-ui.c:3189
+#: ../src/gtk-ui/sync-ui.c:3205
msgid "No configuration file found"
msgstr "Asetustiedostoa ei löytynyt"
# using erroneous instead of bad
-#: ../src/gtk-ui/sync-ui.c:3191
+#: ../src/gtk-ui/sync-ui.c:3207
msgid "Server sent bad content"
msgstr "Serveri lähetti virheellistä sisältöä"
-#: ../src/gtk-ui/sync-ui.c:3193
+#: ../src/gtk-ui/sync-ui.c:3209
msgid "Connection certificate has expired"
msgstr "Yhteyden varmenne on vanhentunut"
-#: ../src/gtk-ui/sync-ui.c:3195
+#: ../src/gtk-ui/sync-ui.c:3211
msgid "Connection certificate is invalid"
msgstr "Yhteyden varmenne on virheellinen"
-#: ../src/gtk-ui/sync-ui.c:3203
-msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
-msgstr "Palvelimeen ei saada yhteyttä. Ongelma voi olla tilapäinen tai palvelimen asetuksissa voi olla virhe. "
+#: ../src/gtk-ui/sync-ui.c:3219
+msgid ""
+"We were unable to connect to the server. The problem could be temporary or "
+"there could be something wrong with the settings."
+msgstr ""
+"Palvelimeen ei saada yhteyttä. Ongelma voi olla tilapäinen tai palvelimen "
+"asetuksissa voi olla virhe. "
-#: ../src/gtk-ui/sync-ui.c:3210
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "The server URL is bad"
msgstr "Serverin URL on virheellinen"
-#: ../src/gtk-ui/sync-ui.c:3215
+#: ../src/gtk-ui/sync-ui.c:3231
msgid "The server was not found"
msgstr "Serveriä ei löydy"
-#: ../src/gtk-ui/sync-ui.c:3217
+#: ../src/gtk-ui/sync-ui.c:3233
#, c-format
msgid "Error %d"
msgstr "Virhe: %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3355
+#: ../src/gtk-ui/sync-ui.c:3371
msgid "Password is required for sync"
msgstr "Synkkaukseen vaaditaan salasana."
-#: ../src/gtk-ui/sync-ui.c:3359
+#: ../src/gtk-ui/sync-ui.c:3375
msgid "Sync with password"
msgstr "Synkkaa salasanan kanssa"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3369
+#: ../src/gtk-ui/sync-ui.c:3385
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "Anna salasana synkkaukseen kohteen %s kanssa:"
@@ -543,8 +596,10 @@ msgid ""
"A slow sync compares items from both sides and tries to merge them. \n"
"This may fail in some cases, leading to duplicates or lost information."
msgstr ""
-"Hidas synkkaus vertailee kohteita molemmista päistä ja yrittää yhdistää ne. \n"
-"Tämä saattaa joissakin tapauksissa epäonnistua, johtaa kaksoiskappeleiden muodostumiseen tai tietojen menettämiseen."
+"Hidas synkkaus vertailee kohteita molemmista päistä ja yrittää yhdistää "
+"ne. \n"
+"Tämä saattaa joissakin tapauksissa epäonnistua, johtaa kaksoiskappeleiden "
+"muodostumiseen tai tietojen menettämiseen."
#: ../src/gtk-ui/ui.glade.h:15
msgid "Add new device"
@@ -556,8 +611,12 @@ msgstr "Lisää uusi palvelu"
#. explanation of "Restore backup" function
#: ../src/gtk-ui/ui.glade.h:18
-msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
-msgstr "Varmuuskopiot tehdään ennen jokaista synkkausta. Valitse varmuuskopio palautettavaksi. Kaikki tämän jälkeen tekemäsi muutokset menetetään. "
+msgid ""
+"Backups are made before every time we Sync. Choose a backup to restore. Any "
+"changes you have made since then will be lost."
+msgstr ""
+"Varmuuskopiot tehdään ennen jokaista synkkausta. Valitse varmuuskopio "
+"palautettavaksi. Kaikki tämän jälkeen tekemäsi muutokset menetetään. "
#: ../src/gtk-ui/ui.glade.h:19
msgid "Calendar"
@@ -612,10 +671,12 @@ msgstr ""
#: ../src/gtk-ui/ui.glade.h:34
msgid ""
-"If you don't see your service above but know that your sync provider uses SyncML\n"
+"If you don't see your service above but know that your sync provider uses "
+"SyncML\n"
"you can setup a service manually."
msgstr ""
-"Jos et näe palveluasi yllä mutta tiedät, että synkkauspalvelun tarjoajasi käyttää\n"
+"Jos et näe palveluasi yllä mutta tiedät, että synkkauspalvelun tarjoajasi "
+"käyttää\n"
"SyncML:ää, voit määrittää palvelun manuaalisesti."
#: ../src/gtk-ui/ui.glade.h:36
@@ -628,7 +689,8 @@ msgstr "Synkkauksen hätätila"
#: ../src/gtk-ui/ui.glade.h:41
msgid ""
-"To sync you'll need a network connection and an account with a sync service.\n"
+"To sync you'll need a network connection and an account with a sync "
+"service.\n"
"We support the following services: "
msgstr ""
"Synkkaus edellyttää verkkoyhteyttä ja synkkauspalvelutiliä.\n"
@@ -642,8 +704,7 @@ msgstr "Käytä Bluetoothia ja synkkaa tiedot yhdeltä laitteelta toiselle."
msgid "You will need to add Bluetooth devices before they can be synced."
msgstr "Sinun täytyy lisätä Bluetooth-laitteet ennen kuin niitä voi synkata."
-#: ../src/gtk-ui/sync.desktop.in.h:2
-#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
msgid "Up to date"
msgstr "Ajantasalla"
@@ -651,79 +712,106 @@ msgstr "Ajantasalla"
msgid "Sync (GTK)"
msgstr "Synkkaa (GTK)"
-#: ../src/gtk-ui/sync-config-widget.c:74
-msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
-msgstr "ScheduleWorld mahdollistaa kontaktien,tapahtumien,tehtävien, ja viestien synkkaamisen. "
+#: ../src/gtk-ui/sync-config-widget.c:78
+msgid ""
+"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
+"sync."
+msgstr ""
+"ScheduleWorld mahdollistaa kontaktien,tapahtumien,tehtävien, ja viestien "
+"synkkaamisen. "
-#: ../src/gtk-ui/sync-config-widget.c:77
-msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+#: ../src/gtk-ui/sync-config-widget.c:81
+msgid ""
+"Google Sync can backup and synchronize your contacts with your Gmail "
+"contacts."
msgstr "Google Sync voi kopioida ja synkata kontaktisi Gmail-kontakteihisi"
#. TRANSLATORS: Please include the word "demo" (or the equivalent in
#. your language): Funambol is going to be a 90 day demo service
#. in the future
-#: ../src/gtk-ui/sync-config-widget.c:83
-msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
-msgstr "Varmuuskopioi kontaktisi ja kalenterisi. Synkkaa yhdellä klikkauksella, milloin ja missä tahansa (DEMO)."
+#: ../src/gtk-ui/sync-config-widget.c:87
+msgid ""
+"Backup your contacts and calendar. Sync with a single click, anytime, "
+"anywhere (DEMO)."
+msgstr ""
+"Varmuuskopioi kontaktisi ja kalenterisi. Synkkaa yhdellä klikkauksella, "
+"milloin ja missä tahansa (DEMO)."
-#: ../src/gtk-ui/sync-config-widget.c:86
-msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
-msgstr "Mobical-varmuuskopio- ja palautuspalvelun avulla voit varmuuskopioida omat mobiilitietosi ilmaiseksi ja varmasti."
+#: ../src/gtk-ui/sync-config-widget.c:90
+msgid ""
+"Mobical Backup and Restore service allows you to securely backup your "
+"personal mobile data for free."
+msgstr ""
+"Mobical-varmuuskopio- ja palautuspalvelun avulla voit varmuuskopioida omat "
+"mobiilitietosi ilmaiseksi ja varmasti."
-#: ../src/gtk-ui/sync-config-widget.c:89
-msgid "ZYB is a simple way for people to store and share mobile information online."
+#: ../src/gtk-ui/sync-config-widget.c:93
+msgid ""
+"ZYB is a simple way for people to store and share mobile information online."
msgstr "ZYB on yksinkertainen tapa tallentaa ja jakaa mobiilitietoja verkossa."
-#: ../src/gtk-ui/sync-config-widget.c:92
-msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
-msgstr "Mometoon avulla voi käyttää omia tietoja kaikilta koneilta, joilla on Internet-yhteys. "
+#: ../src/gtk-ui/sync-config-widget.c:96
+msgid ""
+"Memotoo lets you access your personal data from any computer connected to "
+"the Internet."
+msgstr ""
+"Mometoon avulla voi käyttää omia tietoja kaikilta koneilta, joilla on "
+"Internet-yhteys. "
-#: ../src/gtk-ui/sync-config-widget.c:188
+#: ../src/gtk-ui/sync-config-widget.c:192
msgid "Sorry, failed to save the configuration"
msgstr "Konfiguraation tallennus epäonnistui"
-#: ../src/gtk-ui/sync-config-widget.c:377
+#: ../src/gtk-ui/sync-config-widget.c:381
msgid "Service must have a name and server URL"
msgstr "Palvelulla pitää olla nimi ja palvelimen URL"
-#: ../src/gtk-ui/sync-config-widget.c:418
+#: ../src/gtk-ui/sync-config-widget.c:422
#, c-format
-msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
-msgstr "Haluatko nollata kohteen %s asetukset? Tämä ei poista mitään synkattuja tietoja kummassakaan päässä."
+msgid ""
+"Do you want to reset the settings for %s? This will not remove any synced "
+"information on either end."
+msgstr ""
+"Haluatko nollata kohteen %s asetukset? Tämä ei poista mitään synkattuja "
+"tietoja kummassakaan päässä."
#. TRANSLATORS: buttons in reset-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:422
+#: ../src/gtk-ui/sync-config-widget.c:426
msgid "Yes, reset"
msgstr "Kyllä, nollaa."
-#: ../src/gtk-ui/sync-config-widget.c:423
-#: ../src/gtk-ui/sync-config-widget.c:434
+#: ../src/gtk-ui/sync-config-widget.c:427
+#: ../src/gtk-ui/sync-config-widget.c:438
msgid "No, keep settings"
msgstr "Ei, säilytä asetukset"
-#: ../src/gtk-ui/sync-config-widget.c:428
+#: ../src/gtk-ui/sync-config-widget.c:432
#, c-format
-msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
-msgstr "Haluatko poistaa kohteen %s asetukset? Tämä ei poista mitään synkattuja tietoja kummassakaan päässä, mutta poistaa nämä asetukset. "
+msgid ""
+"Do you want to delete the settings for %s? This will not remove any synced "
+"information on either end but it will remove these settings."
+msgstr ""
+"Haluatko poistaa kohteen %s asetukset? Tämä ei poista mitään synkattuja "
+"tietoja kummassakaan päässä, mutta poistaa nämä asetukset. "
#. TRANSLATORS: buttons in delete-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:433
+#: ../src/gtk-ui/sync-config-widget.c:437
msgid "Yes, delete"
msgstr "Kyllä, poista"
-#: ../src/gtk-ui/sync-config-widget.c:463
+#: ../src/gtk-ui/sync-config-widget.c:467
msgid "Reset settings"
msgstr "Nollaa asetukset"
-#: ../src/gtk-ui/sync-config-widget.c:466
+#: ../src/gtk-ui/sync-config-widget.c:470
msgid "Delete settings"
msgstr "Poista asetukset"
-#: ../src/gtk-ui/sync-config-widget.c:476
+#: ../src/gtk-ui/sync-config-widget.c:480
msgid "Save and use"
msgstr "Tallenna ja käytä"
-#: ../src/gtk-ui/sync-config-widget.c:479
+#: ../src/gtk-ui/sync-config-widget.c:483
msgid ""
"Save and replace\n"
"current service"
@@ -731,11 +819,11 @@ msgstr ""
"Tallenna ja korvaa\n"
"nykyinen palvelu"
-#: ../src/gtk-ui/sync-config-widget.c:489
+#: ../src/gtk-ui/sync-config-widget.c:493
msgid "Stop using device"
msgstr "Lopeta laitteen käyttö"
-#: ../src/gtk-ui/sync-config-widget.c:492
+#: ../src/gtk-ui/sync-config-widget.c:496
msgid "Stop using service"
msgstr "Lopeta palvelun käyttö"
@@ -743,90 +831,104 @@ msgstr "Lopeta palvelun käyttö"
#. TRANSLATORS: label for an entry in service configuration form.
#. * Placeholder is a source name.
#. * Example: "Appointments URI"
-#: ../src/gtk-ui/sync-config-widget.c:675
+#: ../src/gtk-ui/sync-config-widget.c:679
#, c-format
msgid "%s URI"
msgstr "Kohteen %s URI"
#. TRANSLATORS: toggles in service configuration form, placeholder is service
#. * or device name
-#: ../src/gtk-ui/sync-config-widget.c:850
+#: ../src/gtk-ui/sync-config-widget.c:854
#, c-format
msgid "Send changes to %s"
msgstr "Lähetä muutokset kohteeseen %s"
-#: ../src/gtk-ui/sync-config-widget.c:855
+#: ../src/gtk-ui/sync-config-widget.c:859
#, c-format
msgid "Receive changes from %s"
msgstr "Vastaanota muutokset kohteesta %s"
-#: ../src/gtk-ui/sync-config-widget.c:871
+#: ../src/gtk-ui/sync-config-widget.c:875
msgid "<b>Sync</b>"
msgstr "<b>Synkkaa</b>"
#. TRANSLATORS: label of a entry in service configuration
-#: ../src/gtk-ui/sync-config-widget.c:887
+#: ../src/gtk-ui/sync-config-widget.c:891
msgid "Server address"
msgstr "Serverin osoite"
#. TRANSLATORS: explanation before a device template combobox.
#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
#. * Client'
-#: ../src/gtk-ui/sync-config-widget.c:963
+#: ../src/gtk-ui/sync-config-widget.c:967
#, c-format
-msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
-msgstr "Tämä laite näyttää siltä, että se saattaisi olla '%s'. Jos tämä ei ole oikein, katso tätä tuettujen laitteiden luetteloa ja poimi omasi, jos se on luettelossa."
+msgid ""
+"This device looks like it might be a '%s'. If this is not correct, please "
+"take a look at the list of supported devices and pick yours if it is listed"
+msgstr ""
+"Tämä laite näyttää siltä, että se saattaisi olla '%s'. Jos tämä ei ole "
+"oikein, katso tätä tuettujen laitteiden luetteloa ja poimi omasi, jos se on "
+"luettelossa."
-#: ../src/gtk-ui/sync-config-widget.c:969
-msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
-msgstr "Emme tiedä täsmälleen, mikä tämä laite on. Katso luetteloa tuetuista ja poimi omasi, jos se on luettelossa."
+#: ../src/gtk-ui/sync-config-widget.c:973
+msgid ""
+"We don't know what this device is exactly. Please take a look at the list of "
+"supported devices and pick yours if it is listed"
+msgstr ""
+"Emme tiedä täsmälleen, mikä tämä laite on. Katso luetteloa tuetuista ja "
+"poimi omasi, jos se on luettelossa."
-#: ../src/gtk-ui/sync-config-widget.c:1122
+#: ../src/gtk-ui/sync-config-widget.c:1126
#, c-format
msgid "%s - Bluetooth device"
msgstr "%s - Bluetooth-laite"
#. TRANSLATORS: service title for services that are not based on a
#. * template in service list, the placeholder is the name of the service
-#: ../src/gtk-ui/sync-config-widget.c:1128
+#: ../src/gtk-ui/sync-config-widget.c:1132
#, c-format
msgid "%s - manually setup"
msgstr "%s - manuaalinen asetus"
#. TRANSLATORS: link button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1803
+#: ../src/gtk-ui/sync-config-widget.c:1807
msgid "Launch website"
msgstr "Siirry sivustoon"
#. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1812
+#: ../src/gtk-ui/sync-config-widget.c:1816
msgid "Setup now"
msgstr "Tee asetukset nyt"
#. TRANSLATORS: labels of entries in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1908
+#: ../src/gtk-ui/sync-config-widget.c:1912
msgid "Username"
msgstr "Käyttäjätunnus"
-#: ../src/gtk-ui/sync-config-widget.c:1923
+#: ../src/gtk-ui/sync-config-widget.c:1927
msgid "Password"
msgstr "Salasana"
#. TRANSLATORS: warning in service configuration form for people
#. who have modified the configuration via other means.
-#: ../src/gtk-ui/sync-config-widget.c:1946
-msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
-msgstr "Nykyinen konfiguraatio on monimutkaisempi kuin täällä voidaan näyttää. Muutokset synkkaustilaan tai synkattuihin tietotyyppeihin korvaavat tämän konfiguroinnin. "
+#: ../src/gtk-ui/sync-config-widget.c:1950
+msgid ""
+"Current configuration is more complex than what can be shown here. Changes "
+"to sync mode or synced data types will overwrite that configuration."
+msgstr ""
+"Nykyinen konfiguraatio on monimutkaisempi kuin täällä voidaan näyttää. "
+"Muutokset synkkaustilaan tai synkattuihin tietotyyppeihin korvaavat tämän "
+"konfiguroinnin. "
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1965
+#: ../src/gtk-ui/sync-config-widget.c:1969
msgid "Hide server settings"
msgstr "Piilota serverin asetukset"
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1985
+#: ../src/gtk-ui/sync-config-widget.c:1989
msgid "Show server settings"
msgstr "Näytä serverin asetukset"
@@ -834,41 +936,44 @@ msgstr "Näytä serverin asetukset"
msgid "Sync in the Sync application"
msgstr "Synkkaa synkkaussovelluksessa. "
-#: ../src/syncevo-dbus-server.cpp:5622
+#: ../src/syncevo-dbus-server.cpp:5664
#, c-format
msgid "%s is syncing"
msgstr "Synkkaus käynnissä kohteessa %s"
-#: ../src/syncevo-dbus-server.cpp:5623
+#: ../src/syncevo-dbus-server.cpp:5665
#, c-format
msgid "We have just started to sync your computer with the %s sync service."
msgstr "Tietokoneesi synkkaus on juuri aloitettu %s-synkkauspalvelulla."
#. if sync is successfully started and done
-#: ../src/syncevo-dbus-server.cpp:5637
+#: ../src/syncevo-dbus-server.cpp:5679
#, c-format
msgid "%s sync complete"
msgstr "Kohteen %s synkkaus valmis"
-#: ../src/syncevo-dbus-server.cpp:5638
+#: ../src/syncevo-dbus-server.cpp:5680
#, c-format
msgid "We have just finished syncing your computer with the %s sync service."
msgstr "Tietokoneesi synkkaus on juuri lopetettu %s-synkkauspalvelulla."
#. if sync is successfully started and has errors, or not started successful with a fatal problem
-#: ../src/syncevo-dbus-server.cpp:5643
+#: ../src/syncevo-dbus-server.cpp:5685
msgid "Sync problem."
msgstr "Synkkauksen ongelma"
-#: ../src/syncevo-dbus-server.cpp:5644
+#: ../src/syncevo-dbus-server.cpp:5686
msgid "Sorry, there's a problem with your sync that you need to attend to."
msgstr "Sorry, ilmeni ongelma synkkauksessa, jota sinun täytyy seurata."
-#: ../src/syncevo-dbus-server.cpp:5717
+#: ../src/syncevo-dbus-server.cpp:5759
msgid "View"
msgstr "Näytä"
-#: ../src/syncevo-dbus-server.cpp:5718
+#. Use "default" as ID because that is what mutter-moblin
+#. recognizes: it then skips the action instead of adding it
+#. in addition to its own "Dismiss" button (always added).
+#: ../src/syncevo-dbus-server.cpp:5763
msgid "Dismiss"
msgstr "Hylkää"
diff --git a/po/fr.po b/po/fr.po
index a9a6345c..2f222374 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-04-07 09:29+0000\n"
-"PO-Revision-Date: 2010-04-08 23:55-0800\n"
+"POT-Creation-Date: 2010-05-17 21:48+0000\n"
+"PO-Revision-Date: 2010-05-17 17:05-0800\n"
"Last-Translator: David Cicognani <david.cicognani@ptiglobal.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -22,115 +22,115 @@ msgstr ""
msgid "Sync"
msgstr "Synchronisation"
-#: ../src/gtk-ui/sync-ui.c:260
+#: ../src/gtk-ui/sync-ui.c:266
msgid "Contacts"
msgstr "Contacts"
-#: ../src/gtk-ui/sync-ui.c:262
+#: ../src/gtk-ui/sync-ui.c:268
msgid "Appointments"
msgstr "Rendez-vous"
-#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/sync-ui.c:270
#: ../src/gtk-ui/ui.glade.h:40
msgid "Tasks"
msgstr "Tâches"
-#: ../src/gtk-ui/sync-ui.c:266
+#: ../src/gtk-ui/sync-ui.c:272
msgid "Notes"
msgstr "Notes"
#. TRANSLATORS: This is a "combination source" for syncing with devices
#. * that combine appointments and tasks. the name should match the ones
#. * used for calendar and todo above
-#: ../src/gtk-ui/sync-ui.c:271
+#: ../src/gtk-ui/sync-ui.c:277
msgid "Appointments & Tasks"
msgstr "Rendez-vous & Tâches"
-#: ../src/gtk-ui/sync-ui.c:343
+#: ../src/gtk-ui/sync-ui.c:349
msgid "Starting sync"
msgstr "Synchronisation en cours de démarrage"
#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:381
+#: ../src/gtk-ui/sync-ui.c:387
#, c-format
msgid "Do you want to slow sync with %s?"
msgstr "Voulez-vous effectuer une synchro lente avec %s ?"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "Yes, do slow sync"
msgstr "Oui, effectuer une synchro lente"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "No, cancel sync"
msgstr "Non, annuler la synchronisation"
#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:418
+#: ../src/gtk-ui/sync-ui.c:424
#, c-format
msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
msgstr "Voulez-vous effacer toutes les données locales et les remplacer avec les données de %s ? Ceci est en général une mauvaise idée."
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
msgid "Yes, delete and replace"
msgstr "Oui, supprimer et remplacer"
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "No"
msgstr "Non"
#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:449
+#: ../src/gtk-ui/sync-ui.c:455
#, c-format
msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
msgstr "Voulez-vous effacer toutes les données de %s et les remplacer avec vos données locales ? Ceci est en général une mauvaise idée."
-#: ../src/gtk-ui/sync-ui.c:481
+#: ../src/gtk-ui/sync-ui.c:487
msgid "Trying to cancel sync"
msgstr "Essai d'annulation de la synchronisation"
-#: ../src/gtk-ui/sync-ui.c:521
+#: ../src/gtk-ui/sync-ui.c:529
msgid "No service or device selected"
msgstr "Aucun service ou périphérique sélectionné"
#. TRANSLATORS: This is the title on main view. Placeholder is
#. * the service name. Example: "Google - synced just now"
-#: ../src/gtk-ui/sync-ui.c:529
+#: ../src/gtk-ui/sync-ui.c:537
#, c-format
msgid "%s - synced just now"
msgstr "%s - dernière synchro il y a quelques secondes"
-#: ../src/gtk-ui/sync-ui.c:533
+#: ../src/gtk-ui/sync-ui.c:541
#, c-format
msgid "%s - synced a minute ago"
msgstr "%s - dernière synchro il y a moins d'une minute"
-#: ../src/gtk-ui/sync-ui.c:537
+#: ../src/gtk-ui/sync-ui.c:545
#, c-format
msgid "%s - synced %ld minutes ago"
msgstr "%s - dernière synchro il y a %ld minutes"
-#: ../src/gtk-ui/sync-ui.c:542
+#: ../src/gtk-ui/sync-ui.c:550
#, c-format
msgid "%s - synced an hour ago"
msgstr "%s - dernière synchro il y a moins d'une heure"
-#: ../src/gtk-ui/sync-ui.c:546
+#: ../src/gtk-ui/sync-ui.c:554
#, c-format
msgid "%s - synced %ld hours ago"
msgstr "%s - dernière synchro il y a %ld heures"
-#: ../src/gtk-ui/sync-ui.c:551
+#: ../src/gtk-ui/sync-ui.c:559
#, c-format
msgid "%s - synced a day ago"
msgstr "%s - dernière synchro hier"
-#: ../src/gtk-ui/sync-ui.c:555
+#: ../src/gtk-ui/sync-ui.c:563
#, c-format
msgid "%s - synced %ld days ago"
msgstr "%s - dernière synchro il y a %ld jours"
@@ -139,66 +139,66 @@ msgstr "%s - dernière synchro il y a %ld jours"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "You've just restored a backup. The changes have not been "
#. * "synced with %s yet"
-#: ../src/gtk-ui/sync-ui.c:604
-#: ../src/gtk-ui/sync-ui.c:719
+#: ../src/gtk-ui/sync-ui.c:612
+#: ../src/gtk-ui/sync-ui.c:726
msgid "Sync now"
msgstr "Synchroniser"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "A normal sync is not possible at this time..." message.
#. * "Other options" will open Emergency view
-#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/sync-ui.c:618
#: ../src/gtk-ui/ui.glade.h:37
msgid "Slow sync"
msgstr "Synchronisation lente"
-#: ../src/gtk-ui/sync-ui.c:611
+#: ../src/gtk-ui/sync-ui.c:619
msgid "Other options..."
msgstr "Autres options..."
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * when no service is selected. Will open configuration view
-#: ../src/gtk-ui/sync-ui.c:616
+#: ../src/gtk-ui/sync-ui.c:624
msgid "Select sync service"
msgstr "Sélectionner le service de synchronisation"
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * login to service fails. Will open configuration view for this service
-#: ../src/gtk-ui/sync-ui.c:621
+#: ../src/gtk-ui/sync-ui.c:629
msgid "Edit service settings"
msgstr "Modifier les paramètres du service"
-#: ../src/gtk-ui/sync-ui.c:670
+#: ../src/gtk-ui/sync-ui.c:700
msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
msgstr "Vous n'avez pas encore sélectionné de service de synchronisation ou de périphérique. Les services de synchronisation vous permettent de synchroniser vos données de votre netbook à un service web. Vous pouvez également synchroniser directement avec certains périphériques."
-#: ../src/gtk-ui/sync-ui.c:717
+#: ../src/gtk-ui/sync-ui.c:722
msgid "Sync again"
msgstr "Synchroniser de nouveau"
-#: ../src/gtk-ui/sync-ui.c:730
+#: ../src/gtk-ui/sync-ui.c:743
msgid "Restoring"
msgstr "En cours de restauration..."
-#: ../src/gtk-ui/sync-ui.c:732
+#: ../src/gtk-ui/sync-ui.c:745
msgid "Syncing"
msgstr "Synchronisation en cours"
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
-#: ../src/gtk-ui/sync-ui.c:743
-#: ../src/gtk-ui/sync-ui.c:3358
+#: ../src/gtk-ui/sync-ui.c:757
+#: ../src/gtk-ui/sync-ui.c:3399
msgid "Cancel sync"
msgstr "Annuler la synchronisation"
-#: ../src/gtk-ui/sync-ui.c:908
+#: ../src/gtk-ui/sync-ui.c:922
msgid "Back to sync"
msgstr "Retourner à la synchronisation"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1209
+#: ../src/gtk-ui/sync-ui.c:1224
msgid "Automatic sync"
msgstr "Synchronisation automatique"
@@ -206,53 +206,53 @@ msgstr "Synchronisation automatique"
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1480
+#: ../src/gtk-ui/sync-ui.c:1519
#, c-format
msgid "Affected data: %s %s"
msgstr "Données affectées : %s %s"
-#: ../src/gtk-ui/sync-ui.c:1485
+#: ../src/gtk-ui/sync-ui.c:1524
#, c-format
msgid "Affected data: none"
msgstr "Données affectées : aucunes"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1563
+#: ../src/gtk-ui/sync-ui.c:1602
#, c-format
msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
msgstr "Voulez-vous restaurer la sauvegarde de %s ? Toutes les modifications effectuées à partir de là seront perdues."
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "Yes, restore"
msgstr "Oui, restaurer"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1598
+#: ../src/gtk-ui/sync-ui.c:1637
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1617
+#: ../src/gtk-ui/sync-ui.c:1656
#, c-format
msgid "Backed up before syncing with %s"
msgstr "Sauvegardé avant la synchronisation avec %s"
-#: ../src/gtk-ui/sync-ui.c:1634
+#: ../src/gtk-ui/sync-ui.c:1673
msgid "Restore"
msgstr "Restaurer"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1741
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
msgstr "Une synchronisation normale avec %s est actuellement impossible. Vous pouvez effectuer une synchronisation lente à deux files ou alors reprendre à zéro. Vous pouvez aussi restaurer une sauvegarde, mais une synchronisation lente ou une reprise à zéro seront nécessaires avant qu'une synchronisation soit possible."
-#: ../src/gtk-ui/sync-ui.c:1751
+#: ../src/gtk-ui/sync-ui.c:1790
#, c-format
msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
msgstr "En cas de problème sérieux, vous pouvez essayer une synchronisation lente, reprendre à zéro ou alors restaurer depuis une sauvegarde."
@@ -260,7 +260,7 @@ msgstr "En cas de problème sérieux, vous pouvez essayer une synchronisation le
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1760
+#: ../src/gtk-ui/sync-ui.c:1799
#, c-format
msgid ""
"Delete all your local\n"
@@ -272,7 +272,7 @@ msgstr ""
"et les remplacer avec\n"
"les données de %s"
-#: ../src/gtk-ui/sync-ui.c:1766
+#: ../src/gtk-ui/sync-ui.c:1805
#, c-format
msgid ""
"Delete all data on\n"
@@ -283,71 +283,71 @@ msgstr ""
"sur %s et les remplacer\n"
"avec les données locales"
-#: ../src/gtk-ui/sync-ui.c:2226
+#: ../src/gtk-ui/sync-ui.c:2267
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "Impossible d'obtenir la liste des services pris en charge depuis SyncEvolution"
-#: ../src/gtk-ui/sync-ui.c:2280
+#: ../src/gtk-ui/sync-ui.c:2321
msgid "There was a problem communicating with the sync process. Please try again later."
msgstr "Un problème est survenu en communiquant avec le processus de synchronisation. Veuillez réessayer ultérieurement."
-#: ../src/gtk-ui/sync-ui.c:2339
+#: ../src/gtk-ui/sync-ui.c:2380
msgid "Restore failed"
msgstr "Échec de la restauration"
-#: ../src/gtk-ui/sync-ui.c:2342
-#: ../src/gtk-ui/sync-ui.c:3227
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
msgid "Sync failed"
msgstr "Échec de la synchronisation"
-#: ../src/gtk-ui/sync-ui.c:2348
+#: ../src/gtk-ui/sync-ui.c:2389
msgid "Restore complete"
msgstr "Restauration terminée"
-#: ../src/gtk-ui/sync-ui.c:2351
+#: ../src/gtk-ui/sync-ui.c:2392
msgid "Sync complete"
msgstr "Synchronisation terminée"
-#: ../src/gtk-ui/sync-ui.c:2443
+#: ../src/gtk-ui/sync-ui.c:2484
#, c-format
msgid "Preparing '%s'"
msgstr "'%s' en cours de préparation"
-#: ../src/gtk-ui/sync-ui.c:2446
+#: ../src/gtk-ui/sync-ui.c:2487
#, c-format
msgid "Receiving '%s'"
msgstr "'%s' en cours de réception"
-#: ../src/gtk-ui/sync-ui.c:2449
+#: ../src/gtk-ui/sync-ui.c:2490
#, c-format
msgid "Sending '%s'"
msgstr "'%s' en cours d'envoi"
-#: ../src/gtk-ui/sync-ui.c:2570
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "Il y a eu un rejet distant."
msgstr[1] "Il y a eu %ld rejets distants."
-#: ../src/gtk-ui/sync-ui.c:2575
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "Il y a eu un rejet local."
msgstr[1] "Il y a eu %ld rejets locaux."
-#: ../src/gtk-ui/sync-ui.c:2580
+#: ../src/gtk-ui/sync-ui.c:2621
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "Il y a eu %ld rejets locaux et %ld rejets distants."
-#: ../src/gtk-ui/sync-ui.c:2585
+#: ../src/gtk-ui/sync-ui.c:2626
#, c-format
msgid "Last time: No changes."
msgstr "Dernière fois : pas de changement. "
-#: ../src/gtk-ui/sync-ui.c:2587
+#: ../src/gtk-ui/sync-ui.c:2628
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -357,21 +357,21 @@ msgstr[1] "Dernière fois : %ld changements envoyés."
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2595
+#: ../src/gtk-ui/sync-ui.c:2636
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "Dernière fois : un changement reçu."
msgstr[1] "Dernière fois : %ld changements reçus."
-#: ../src/gtk-ui/sync-ui.c:2600
+#: ../src/gtk-ui/sync-ui.c:2641
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "Dernière fois : %ld changements reçus et %ld changements envoyés."
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2807
+#: ../src/gtk-ui/sync-ui.c:2848
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -380,124 +380,124 @@ msgstr ""
"Un problème est survenu lors de la dernière synchronisation :\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2817
+#: ../src/gtk-ui/sync-ui.c:2858
#, c-format
msgid "You've just restored a backup. The changes have not been synced with %s yet"
msgstr "Vous venez de restaurer une sauvegarde. Les modifications n'ont pas encore été synchronisées avec %s"
-#: ../src/gtk-ui/sync-ui.c:3105
+#: ../src/gtk-ui/sync-ui.c:3146
msgid "Waiting for current operation to finish..."
msgstr "En attente de fin d'opération en cours..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3139
+#: ../src/gtk-ui/sync-ui.c:3180
msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
msgstr "Une synchronisation normale est actuellement impossible. Le serveur suggère une synchronisation lente, mais cela n'est pas forcément dans votre intérêt si les deux côtés contiennent déjà des données."
-#: ../src/gtk-ui/sync-ui.c:3143
+#: ../src/gtk-ui/sync-ui.c:3184
msgid "The sync process died unexpectedly."
msgstr "Processus de synchronisation terminé de façon inattendue."
-#: ../src/gtk-ui/sync-ui.c:3148
+#: ../src/gtk-ui/sync-ui.c:3189
msgid "Password request was not answered. You can save the password in the settings to prevent the request."
msgstr "La demande de mot de passe n'a pas été prise en compte. Vous pouvez enregistrer le mot de passe dans les paramètres pour empêcher la demande."
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3152
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "There was a problem processing sync request. Trying again may help."
msgstr "Un problème est survenu lors du traitement de la demande de synchronisation. Une nouvelle tentative peut se révéler utile."
-#: ../src/gtk-ui/sync-ui.c:3158
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to login. Could there be a problem with your username or password?"
msgstr "Échec de connexion. Pourrait-il y avoir un problème avec votre nom d'utilisateur ou bien votre mot de passe ?"
-#: ../src/gtk-ui/sync-ui.c:3161
+#: ../src/gtk-ui/sync-ui.c:3202
msgid "Forbidden"
msgstr "Interdit"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3167
+#: ../src/gtk-ui/sync-ui.c:3208
msgid "A data source could not be found. Could there be a problem with the settings?"
msgstr "Une source de données n'a pas pu être trouvée. Pourrait-il y avoir un problème avec les paramètres ?"
-#: ../src/gtk-ui/sync-ui.c:3171
+#: ../src/gtk-ui/sync-ui.c:3212
msgid "Remote database error"
msgstr "Erreur de base de données à distance"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3174
+#: ../src/gtk-ui/sync-ui.c:3215
msgid "There is a problem with the local database. Syncing again or rebooting may help."
msgstr "Il y a un problème avec la base de données locale. Synchroniser de nouveau ou bien redémarrer peut aider."
-#: ../src/gtk-ui/sync-ui.c:3177
+#: ../src/gtk-ui/sync-ui.c:3218
msgid "No space on disk"
msgstr "Il n'y a plus d'espace disponible sur le disque"
-#: ../src/gtk-ui/sync-ui.c:3179
+#: ../src/gtk-ui/sync-ui.c:3220
msgid "Failed to process SyncML"
msgstr "Impossible de terminer SyncML"
-#: ../src/gtk-ui/sync-ui.c:3181
+#: ../src/gtk-ui/sync-ui.c:3222
msgid "Server authorization failed"
msgstr "L'autorisation du serveur a échoué"
-#: ../src/gtk-ui/sync-ui.c:3183
+#: ../src/gtk-ui/sync-ui.c:3224
msgid "Failed to parse configuration file"
msgstr "Impossible d'analyser le fichier de configuration"
-#: ../src/gtk-ui/sync-ui.c:3185
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "Failed to read configuration file"
msgstr "Impossible de lire le fichier de configuration"
-#: ../src/gtk-ui/sync-ui.c:3187
+#: ../src/gtk-ui/sync-ui.c:3228
msgid "No configuration found"
msgstr "Aucune configuration trouvée"
-#: ../src/gtk-ui/sync-ui.c:3189
+#: ../src/gtk-ui/sync-ui.c:3230
msgid "No configuration file found"
msgstr "Aucun fichier de configuration trouvé"
-#: ../src/gtk-ui/sync-ui.c:3191
+#: ../src/gtk-ui/sync-ui.c:3232
msgid "Server sent bad content"
msgstr "Le serveur a transmis des données incorrectes"
-#: ../src/gtk-ui/sync-ui.c:3193
+#: ../src/gtk-ui/sync-ui.c:3234
msgid "Connection certificate has expired"
msgstr "Le certificat de la connexion a expiré"
-#: ../src/gtk-ui/sync-ui.c:3195
+#: ../src/gtk-ui/sync-ui.c:3236
msgid "Connection certificate is invalid"
msgstr "le certificat de la connexion est invalide"
-#: ../src/gtk-ui/sync-ui.c:3203
+#: ../src/gtk-ui/sync-ui.c:3244
msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
msgstr "Nous n'avons pas pu nous connecter au serveur. Il se peut que le problème soit temporaire ou bien qu’il y ait une erreur avec les paramètres."
-#: ../src/gtk-ui/sync-ui.c:3210
+#: ../src/gtk-ui/sync-ui.c:3251
msgid "The server URL is bad"
msgstr "L'URL du serveur est mauvaise"
-#: ../src/gtk-ui/sync-ui.c:3215
+#: ../src/gtk-ui/sync-ui.c:3256
msgid "The server was not found"
msgstr "Le serveur n'a pas été trouvé"
-#: ../src/gtk-ui/sync-ui.c:3217
+#: ../src/gtk-ui/sync-ui.c:3258
#, c-format
msgid "Error %d"
msgstr "Erreur %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3355
+#: ../src/gtk-ui/sync-ui.c:3396
msgid "Password is required for sync"
msgstr "Mot de passe nécessaire pour la synchronisation"
-#: ../src/gtk-ui/sync-ui.c:3359
+#: ../src/gtk-ui/sync-ui.c:3400
msgid "Sync with password"
msgstr "Synchronisation avec le mot de passe..."
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3369
+#: ../src/gtk-ui/sync-ui.c:3410
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "Veuillez saisir le mot de passe pour synchroniser avec %s :"
@@ -652,80 +652,80 @@ msgstr "À jour"
msgid "Sync (GTK)"
msgstr "Sync (GTK)"
-#: ../src/gtk-ui/sync-config-widget.c:74
+#: ../src/gtk-ui/sync-config-widget.c:78
msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
msgstr "ScheduleWorld vous permet de garder vos contacts, événements, tâches et notes synchronisés."
-#: ../src/gtk-ui/sync-config-widget.c:77
+#: ../src/gtk-ui/sync-config-widget.c:81
msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
msgstr "Google Sync permet de sauvegarder et synchroniser votre carnet d'adresses avec vos contacts Gmail."
#. TRANSLATORS: Please include the word "demo" (or the equivalent in
#. your language): Funambol is going to be a 90 day demo service
#. in the future
-#: ../src/gtk-ui/sync-config-widget.c:83
+#: ../src/gtk-ui/sync-config-widget.c:87
msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
msgstr "Sauvegarde de vos contacts et calendrier. Synchronisation en un seul clic, n'importe quand, n'importe où (DEMO)."
-#: ../src/gtk-ui/sync-config-widget.c:86
+#: ../src/gtk-ui/sync-config-widget.c:90
msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
msgstr "Le service Mobical de sauvegarde et de restauration vous permet de sauvegarder vos données personnelles mobiles gratuitement et en toute sécurité."
-#: ../src/gtk-ui/sync-config-widget.c:89
+#: ../src/gtk-ui/sync-config-widget.c:93
msgid "ZYB is a simple way for people to store and share mobile information online."
msgstr "ZYB est une façon simple de stocker et de partager les informations mobiles en ligne."
-#: ../src/gtk-ui/sync-config-widget.c:92
+#: ../src/gtk-ui/sync-config-widget.c:96
msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
msgstr "Memotoo vous permet d'accéder à vos données personnelles depuis n'importe quel ordinateur connecté à Internet."
-#: ../src/gtk-ui/sync-config-widget.c:188
+#: ../src/gtk-ui/sync-config-widget.c:192
msgid "Sorry, failed to save the configuration"
msgstr "Désolé, la sauvegarde de la configuration a échoué"
-#: ../src/gtk-ui/sync-config-widget.c:377
+#: ../src/gtk-ui/sync-config-widget.c:381
msgid "Service must have a name and server URL"
msgstr "Le service doit avoir un nom et une URL de serveur"
-#: ../src/gtk-ui/sync-config-widget.c:418
+#: ../src/gtk-ui/sync-config-widget.c:422
#, c-format
msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
msgstr "Voulez-vous réinitialiser les paramètres pour %s ? Cela ne supprimera aucune information synchronisée de part et d’autre. "
#. TRANSLATORS: buttons in reset-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:422
+#: ../src/gtk-ui/sync-config-widget.c:426
msgid "Yes, reset"
msgstr "Oui, réinitialiser"
-#: ../src/gtk-ui/sync-config-widget.c:423
-#: ../src/gtk-ui/sync-config-widget.c:434
+#: ../src/gtk-ui/sync-config-widget.c:427
+#: ../src/gtk-ui/sync-config-widget.c:438
msgid "No, keep settings"
msgstr "Non, conserver les paramètres"
-#: ../src/gtk-ui/sync-config-widget.c:428
+#: ../src/gtk-ui/sync-config-widget.c:432
#, c-format
msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
msgstr "Voulez-vous supprimer les paramètres pour %s ? Cela ne supprimera aucune information synchronisée de part et d’autre mais supprimera ces paramètres."
#. TRANSLATORS: buttons in delete-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:433
+#: ../src/gtk-ui/sync-config-widget.c:437
msgid "Yes, delete"
msgstr "Oui, supprimer"
-#: ../src/gtk-ui/sync-config-widget.c:463
+#: ../src/gtk-ui/sync-config-widget.c:467
msgid "Reset settings"
msgstr "Rétablir les paramètres"
-#: ../src/gtk-ui/sync-config-widget.c:466
+#: ../src/gtk-ui/sync-config-widget.c:470
msgid "Delete settings"
msgstr "Supprimer les paramètres"
# "setup" for limited space
-#: ../src/gtk-ui/sync-config-widget.c:476
+#: ../src/gtk-ui/sync-config-widget.c:480
msgid "Save and use"
msgstr "Sauvegarder et utiliser"
-#: ../src/gtk-ui/sync-config-widget.c:479
+#: ../src/gtk-ui/sync-config-widget.c:483
msgid ""
"Save and replace\n"
"current service"
@@ -733,104 +733,104 @@ msgstr ""
"Sauvegarder et utiliser\n"
"le service actuel"
-#: ../src/gtk-ui/sync-config-widget.c:489
+#: ../src/gtk-ui/sync-config-widget.c:493
msgid "Stop using device"
msgstr "Ne plus utiliser ce périphérique"
-#: ../src/gtk-ui/sync-config-widget.c:492
+#: ../src/gtk-ui/sync-config-widget.c:496
msgid "Stop using service"
msgstr "Ne plus utiliser ce service"
#. TRANSLATORS: label for an entry in service configuration form.
#. * Placeholder is a source name.
#. * Example: "Appointments URI"
-#: ../src/gtk-ui/sync-config-widget.c:675
+#: ../src/gtk-ui/sync-config-widget.c:679
#, c-format
msgid "%s URI"
msgstr "%s URI"
#. TRANSLATORS: toggles in service configuration form, placeholder is service
#. * or device name
-#: ../src/gtk-ui/sync-config-widget.c:850
+#: ../src/gtk-ui/sync-config-widget.c:854
#, c-format
msgid "Send changes to %s"
-msgstr "Envoyer les modifications vers %s"
+msgstr "Envoyer les modifications à %s"
-#: ../src/gtk-ui/sync-config-widget.c:855
+#: ../src/gtk-ui/sync-config-widget.c:859
#, c-format
msgid "Receive changes from %s"
-msgstr "Recevoir les modifications depuis %s"
+msgstr "Recevoir les modifications de %s"
# verb = Synchroniser
# noun = Synchronisation
-#: ../src/gtk-ui/sync-config-widget.c:871
+#: ../src/gtk-ui/sync-config-widget.c:875
msgid "<b>Sync</b>"
msgstr "<b>Synchroniser</b>"
#. TRANSLATORS: label of a entry in service configuration
-#: ../src/gtk-ui/sync-config-widget.c:887
+#: ../src/gtk-ui/sync-config-widget.c:891
msgid "Server address"
msgstr "Adresse du serveur"
#. TRANSLATORS: explanation before a device template combobox.
#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
#. * Client'
-#: ../src/gtk-ui/sync-config-widget.c:963
+#: ../src/gtk-ui/sync-config-widget.c:967
#, c-format
msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
msgstr "Il semble que le périphérique est un '%s'. Si ce n'est pas correct, veuillez consulter la liste de périphériques pris en charge et sélectionnez le votre s'il apparait dans la liste"
-#: ../src/gtk-ui/sync-config-widget.c:969
+#: ../src/gtk-ui/sync-config-widget.c:973
msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
msgstr "Nous ne savons pas exactement ce qu’est ce périphérique. Veuillez consulter la liste de périphériques pris en charge et sélectionnez le votre s'il apparait dans la liste"
-#: ../src/gtk-ui/sync-config-widget.c:1122
+#: ../src/gtk-ui/sync-config-widget.c:1126
#, c-format
msgid "%s - Bluetooth device"
msgstr "%s - Périphérique Bluetooth"
#. TRANSLATORS: service title for services that are not based on a
#. * template in service list, the placeholder is the name of the service
-#: ../src/gtk-ui/sync-config-widget.c:1128
+#: ../src/gtk-ui/sync-config-widget.c:1132
#, c-format
msgid "%s - manually setup"
msgstr "%s - configurer manuellement"
#. TRANSLATORS: link button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1803
+#: ../src/gtk-ui/sync-config-widget.c:1807
msgid "Launch website"
msgstr "Lancer le site Web"
# "setup" for limited space
#. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1812
+#: ../src/gtk-ui/sync-config-widget.c:1816
msgid "Setup now"
msgstr "Configurer"
#. TRANSLATORS: labels of entries in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1908
+#: ../src/gtk-ui/sync-config-widget.c:1912
msgid "Username"
msgstr "Nom d'utilisateur"
-#: ../src/gtk-ui/sync-config-widget.c:1923
+#: ../src/gtk-ui/sync-config-widget.c:1927
msgid "Password"
msgstr "Mot de passe"
#. TRANSLATORS: warning in service configuration form for people
#. who have modified the configuration via other means.
-#: ../src/gtk-ui/sync-config-widget.c:1946
+#: ../src/gtk-ui/sync-config-widget.c:1950
msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
msgstr "La configuration actuelle est plus complexe que ce qui peut être affiché ici. Les modifications apportées au mode synchronisation ou aux types de données synchronisées écraseront cette configuration."
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1965
+#: ../src/gtk-ui/sync-config-widget.c:1969
msgid "Hide server settings"
msgstr "Masquer les paramètres du serveur"
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1985
+#: ../src/gtk-ui/sync-config-widget.c:1989
msgid "Show server settings"
msgstr "Afficher les paramètres du serveur"
@@ -838,41 +838,44 @@ msgstr "Afficher les paramètres du serveur"
msgid "Sync in the Sync application"
msgstr "Synchroniser dans l'application Synchronisation"
-#: ../src/syncevo-dbus-server.cpp:5622
+#: ../src/syncevo-dbus-server.cpp:5664
#, c-format
msgid "%s is syncing"
msgstr "%s est en cours de synchronisation"
-#: ../src/syncevo-dbus-server.cpp:5623
+#: ../src/syncevo-dbus-server.cpp:5665
#, c-format
msgid "We have just started to sync your computer with the %s sync service."
msgstr "Démarrage de la synchronisation de votre ordinateur avec le service %s."
#. if sync is successfully started and done
-#: ../src/syncevo-dbus-server.cpp:5637
+#: ../src/syncevo-dbus-server.cpp:5679
#, c-format
msgid "%s sync complete"
msgstr "Synchronisation %s terminée"
-#: ../src/syncevo-dbus-server.cpp:5638
+#: ../src/syncevo-dbus-server.cpp:5680
#, c-format
msgid "We have just finished syncing your computer with the %s sync service."
msgstr "Synchronisation de votre ordinateur avec le service %s"
#. if sync is successfully started and has errors, or not started successful with a fatal problem
-#: ../src/syncevo-dbus-server.cpp:5643
+#: ../src/syncevo-dbus-server.cpp:5685
msgid "Sync problem."
msgstr "Problème de synchronisation."
-#: ../src/syncevo-dbus-server.cpp:5644
+#: ../src/syncevo-dbus-server.cpp:5686
msgid "Sorry, there's a problem with your sync that you need to attend to."
msgstr "Désolé, il y a un problème avec la synchronisation que vous tentez."
-#: ../src/syncevo-dbus-server.cpp:5717
+#: ../src/syncevo-dbus-server.cpp:5759
msgid "View"
msgstr "Affichage"
-#: ../src/syncevo-dbus-server.cpp:5718
+#. Use "default" as ID because that is what mutter-moblin
+#. recognizes: it then skips the action instead of adding it
+#. in addition to its own "Dismiss" button (always added).
+#: ../src/syncevo-dbus-server.cpp:5763
msgid "Dismiss"
msgstr "Ignorer"
diff --git a/po/it.po b/po/it.po
index b18a2001..a7643cba 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: syncevolution\n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-05-05 09:24+0000\n"
-"PO-Revision-Date: 2010-05-06 18:06-0800\n"
-"Last-Translator: Clara Steiner-Jay <csteiner@aracnet.com>\n"
+"POT-Creation-Date: 2010-05-17 21:48+0000\n"
+"PO-Revision-Date: 2010-05-18 10:32-0800\n"
+"Last-Translator: francesca godani <francesca.godani@ptiglobal.net>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -83,11 +83,11 @@ msgstr "Eliminare i dati locali e sostituirli con quelli da %s? Solitamente ques
#: ../src/gtk-ui/sync-ui.c:429
#: ../src/gtk-ui/sync-ui.c:460
msgid "Yes, delete and replace"
-msgstr "Elimia e sostituisci"
+msgstr "Elimina e sostituisci"
#: ../src/gtk-ui/sync-ui.c:429
#: ../src/gtk-ui/sync-ui.c:460
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "No"
msgstr "No"
@@ -199,7 +199,7 @@ msgstr "Sincronizzazione"
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
#: ../src/gtk-ui/sync-ui.c:757
-#: ../src/gtk-ui/sync-ui.c:3374
+#: ../src/gtk-ui/sync-ui.c:3399
msgid "Cancel sync"
msgstr "Annulla sincronizzazione"
@@ -211,7 +211,7 @@ msgstr "Torna indietro"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1223
+#: ../src/gtk-ui/sync-ui.c:1224
msgid "Automatic sync"
msgstr "Sincronizzazione automatica"
@@ -219,53 +219,53 @@ msgstr "Sincronizzazione automatica"
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1494
+#: ../src/gtk-ui/sync-ui.c:1519
#, c-format
msgid "Affected data: %s %s"
msgstr "Dati interessati: %s %s"
-#: ../src/gtk-ui/sync-ui.c:1499
+#: ../src/gtk-ui/sync-ui.c:1524
#, c-format
msgid "Affected data: none"
msgstr "Dati interessati: nessuno"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1577
+#: ../src/gtk-ui/sync-ui.c:1602
#, c-format
msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
msgstr "Vuoi ripristinare il backup da %s? Tutte le modifiche apportate da allora saranno perse."
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "Yes, restore"
msgstr "Sì, ripristina"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1612
+#: ../src/gtk-ui/sync-ui.c:1637
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1631
+#: ../src/gtk-ui/sync-ui.c:1656
#, c-format
msgid "Backed up before syncing with %s"
msgstr "Back up effettuato prima della sincronizzazione con %s"
-#: ../src/gtk-ui/sync-ui.c:1648
+#: ../src/gtk-ui/sync-ui.c:1673
msgid "Restore"
msgstr "Ripristina"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1755
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
msgstr "Una sincronizzazione normale con %s non è possibile in questo momento. Si può fare una sincronizzazione lenta a due vie o iniziare da zero. Si può anche ripristinare dal backup, ma una sincronizzazione lenta o un inizio da zero saranno comunque richiesti prima che sia possibile una sincronizzazione normale."
-#: ../src/gtk-ui/sync-ui.c:1765
+#: ../src/gtk-ui/sync-ui.c:1790
#, c-format
msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
msgstr "Se qualcosa è andato terribilmente storto, puoi provare una sincronizzazione lenta, iniziare da zero o ripristinare dal backup"
@@ -273,7 +273,7 @@ msgstr "Se qualcosa è andato terribilmente storto, puoi provare una sincronizza
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1774
+#: ../src/gtk-ui/sync-ui.c:1799
#, c-format
msgid ""
"Delete all your local\n"
@@ -284,7 +284,7 @@ msgstr ""
"e sostituirli con\n"
"quelli da %s"
-#: ../src/gtk-ui/sync-ui.c:1780
+#: ../src/gtk-ui/sync-ui.c:1805
#, c-format
msgid ""
"Delete all data on\n"
@@ -295,71 +295,71 @@ msgstr ""
"%s e sostituirli\n"
"con quelli locali"
-#: ../src/gtk-ui/sync-ui.c:2242
+#: ../src/gtk-ui/sync-ui.c:2267
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "Recupero elenco dei servizi supportati da SyncEvolution non riuscito"
-#: ../src/gtk-ui/sync-ui.c:2296
+#: ../src/gtk-ui/sync-ui.c:2321
msgid "There was a problem communicating with the sync process. Please try again later."
msgstr "Si è verificato un problema di comunicazione con il processo di sincronizzazione. Si prega di riprovare più tardi."
-#: ../src/gtk-ui/sync-ui.c:2355
+#: ../src/gtk-ui/sync-ui.c:2380
msgid "Restore failed"
msgstr "Ripristino non riuscito"
-#: ../src/gtk-ui/sync-ui.c:2358
-#: ../src/gtk-ui/sync-ui.c:3243
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
msgid "Sync failed"
msgstr "Sincronizzazione non riuscita"
-#: ../src/gtk-ui/sync-ui.c:2364
+#: ../src/gtk-ui/sync-ui.c:2389
msgid "Restore complete"
msgstr "Ripristino completato"
-#: ../src/gtk-ui/sync-ui.c:2367
+#: ../src/gtk-ui/sync-ui.c:2392
msgid "Sync complete"
msgstr "Sincronizzazione completata"
-#: ../src/gtk-ui/sync-ui.c:2459
+#: ../src/gtk-ui/sync-ui.c:2484
#, c-format
msgid "Preparing '%s'"
msgstr "Preparazione di '%s'"
-#: ../src/gtk-ui/sync-ui.c:2462
+#: ../src/gtk-ui/sync-ui.c:2487
#, c-format
msgid "Receiving '%s'"
msgstr "Ricezione di '%s'"
-#: ../src/gtk-ui/sync-ui.c:2465
+#: ../src/gtk-ui/sync-ui.c:2490
#, c-format
msgid "Sending '%s'"
msgstr "Invio di '%s'"
-#: ../src/gtk-ui/sync-ui.c:2586
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "Si è verificato un rifiuto remoto."
msgstr[1] "Si sono verificati %ld rifiuti remoti."
-#: ../src/gtk-ui/sync-ui.c:2591
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "Si è verificato un rifiuto locale."
msgstr[1] "Si sono verificati %ld rifiuti locali."
-#: ../src/gtk-ui/sync-ui.c:2596
+#: ../src/gtk-ui/sync-ui.c:2621
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "Si sono verificati %ld rifiuti locali e %ld remoti."
-#: ../src/gtk-ui/sync-ui.c:2601
+#: ../src/gtk-ui/sync-ui.c:2626
#, c-format
msgid "Last time: No changes."
msgstr "Ultima volta: nessuna modifica."
-#: ../src/gtk-ui/sync-ui.c:2603
+#: ../src/gtk-ui/sync-ui.c:2628
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -369,21 +369,21 @@ msgstr[1] "Ultima volta: inviate %ld modifiche."
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2611
+#: ../src/gtk-ui/sync-ui.c:2636
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "Ultima volta: applicata una modifica."
msgstr[1] "Ultima volta: applicate %ld modifiche."
-#: ../src/gtk-ui/sync-ui.c:2616
+#: ../src/gtk-ui/sync-ui.c:2641
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "Ultima volta: applicate %ld modifiche e inviate %ld."
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2823
+#: ../src/gtk-ui/sync-ui.c:2848
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -392,124 +392,124 @@ msgstr ""
"Si è verificato un problema con l'ultima sincronizzazione:\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2833
+#: ../src/gtk-ui/sync-ui.c:2858
#, c-format
msgid "You've just restored a backup. The changes have not been synced with %s yet"
msgstr "Hai appena ripristinato un backup. I cambiamenti non sono ancora stati sincronizzati con %s"
-#: ../src/gtk-ui/sync-ui.c:3121
+#: ../src/gtk-ui/sync-ui.c:3146
msgid "Waiting for current operation to finish..."
msgstr "In attesa che termini l'operazione..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3155
+#: ../src/gtk-ui/sync-ui.c:3180
msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
msgstr "Una sincronizzazione normale non è possibile in questo momento. Il server suggerisce una sincronizzazione lenta, ma questo potrebbe non essere sempre quello che vuoi, se entrambe le estremità hanno dati."
-#: ../src/gtk-ui/sync-ui.c:3159
+#: ../src/gtk-ui/sync-ui.c:3184
msgid "The sync process died unexpectedly."
msgstr "Il servizio di sincronizzazione è terminato inaspettatamente."
-#: ../src/gtk-ui/sync-ui.c:3164
+#: ../src/gtk-ui/sync-ui.c:3189
msgid "Password request was not answered. You can save the password in the settings to prevent the request."
msgstr "La richiesta della password ha ricevuto risposta. È possibile salvare la password nelle impostazioni per evitare la richiesta."
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3168
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "There was a problem processing sync request. Trying again may help."
msgstr "C'è stato un problema di elaborazione delle richieste di sincronizzazione. Riprovare potrebbe risolvere il problema."
-#: ../src/gtk-ui/sync-ui.c:3174
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to login. Could there be a problem with your username or password?"
msgstr "Impossibile effettuare il login. Ci potrebbe essere un problema con il tuo nome utente o la password?"
-#: ../src/gtk-ui/sync-ui.c:3177
+#: ../src/gtk-ui/sync-ui.c:3202
msgid "Forbidden"
msgstr "Proibito"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3183
+#: ../src/gtk-ui/sync-ui.c:3208
msgid "A data source could not be found. Could there be a problem with the settings?"
msgstr "Impossibile trovare la sorgente. Ci potrebbe essere un problema con le impostazioni?"
-#: ../src/gtk-ui/sync-ui.c:3187
+#: ../src/gtk-ui/sync-ui.c:3212
msgid "Remote database error"
msgstr "Errore remoto nel database"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3190
+#: ../src/gtk-ui/sync-ui.c:3215
msgid "There is a problem with the local database. Syncing again or rebooting may help."
msgstr "C'è un problema con il database locale. Sincronizzare di nuovo o riavviare."
-#: ../src/gtk-ui/sync-ui.c:3193
+#: ../src/gtk-ui/sync-ui.c:3218
msgid "No space on disk"
msgstr "Spazio esaurito sul disco"
-#: ../src/gtk-ui/sync-ui.c:3195
+#: ../src/gtk-ui/sync-ui.c:3220
msgid "Failed to process SyncML"
msgstr "Elaborazione SyncML non riuscita"
-#: ../src/gtk-ui/sync-ui.c:3197
+#: ../src/gtk-ui/sync-ui.c:3222
msgid "Server authorization failed"
msgstr "Autorizzazione server non riuscita"
-#: ../src/gtk-ui/sync-ui.c:3199
+#: ../src/gtk-ui/sync-ui.c:3224
msgid "Failed to parse configuration file"
msgstr "Analisi del file di configurazione non riuscita"
-#: ../src/gtk-ui/sync-ui.c:3201
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "Failed to read configuration file"
msgstr "Lettura del file di configurazione non riuscita"
-#: ../src/gtk-ui/sync-ui.c:3203
+#: ../src/gtk-ui/sync-ui.c:3228
msgid "No configuration found"
msgstr "Non è stata trovata alcuna configurazione"
-#: ../src/gtk-ui/sync-ui.c:3205
+#: ../src/gtk-ui/sync-ui.c:3230
msgid "No configuration file found"
msgstr "Non è stato trovato alcun file di configurazione"
-#: ../src/gtk-ui/sync-ui.c:3207
+#: ../src/gtk-ui/sync-ui.c:3232
msgid "Server sent bad content"
msgstr "Il server ha inviato dei contenuti errati"
-#: ../src/gtk-ui/sync-ui.c:3209
+#: ../src/gtk-ui/sync-ui.c:3234
msgid "Connection certificate has expired"
msgstr "Il certificato della connessione è scaduto"
-#: ../src/gtk-ui/sync-ui.c:3211
+#: ../src/gtk-ui/sync-ui.c:3236
msgid "Connection certificate is invalid"
msgstr "Il certificato della connessione non è valido"
-#: ../src/gtk-ui/sync-ui.c:3219
+#: ../src/gtk-ui/sync-ui.c:3244
msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
msgstr "Non siamo stati in grado di connetterci al server. Il problema potrebbe essere temporaneo o ci potrebbe essere qualcosa di sbagliato con le impostazioni."
-#: ../src/gtk-ui/sync-ui.c:3226
+#: ../src/gtk-ui/sync-ui.c:3251
msgid "The server URL is bad"
msgstr "L'URLdel server non è corretto"
-#: ../src/gtk-ui/sync-ui.c:3231
+#: ../src/gtk-ui/sync-ui.c:3256
msgid "The server was not found"
msgstr "Il server non è stato trovato"
-#: ../src/gtk-ui/sync-ui.c:3233
+#: ../src/gtk-ui/sync-ui.c:3258
#, c-format
msgid "Error %d"
msgstr "Errore %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3371
+#: ../src/gtk-ui/sync-ui.c:3396
msgid "Password is required for sync"
msgstr "Password necessaria per la sincronizzazione"
-#: ../src/gtk-ui/sync-ui.c:3375
+#: ../src/gtk-ui/sync-ui.c:3400
msgid "Sync with password"
msgstr "Sincronizza con password"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3385
+#: ../src/gtk-ui/sync-ui.c:3410
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "Inserire la passoword per la sincronizzazione con %s:"
@@ -545,13 +545,15 @@ msgstr "<big>Sincronizzazione lenta</big>"
#. a title in emergency view
#: ../src/gtk-ui/ui.glade.h:12
msgid "<big>Start from scratch</big>"
-msgstr "<big>Inizia da zeroi</big>"
+msgstr "<big>Inizia da zero</big>"
#: ../src/gtk-ui/ui.glade.h:13
msgid ""
"A slow sync compares items from both sides and tries to merge them. \n"
"This may fail in some cases, leading to duplicates or lost information."
-msgstr "Una sincronizzazione lenta compara gli elementi da entrambe le parti e tenta di metterli insieme. `nQuesto potrebbe non riuscire in alcuni casi, portando a duplicati o a informazioni perse."
+msgstr ""
+"Una sincronizzazione lenta compara gli elementi da entrambe le parti e tenta di metterli insieme. \n"
+"Questo potrebbe non riuscire in alcuni casi, portando a duplicati o a informazioni perse."
# (ndt) pulsante
#: ../src/gtk-ui/ui.glade.h:15
@@ -611,8 +613,9 @@ msgid ""
"Fix a sync\n"
"emergency"
msgstr ""
-"Risolvi urgencia in\n"
-"sincronizzazione"
+"Risolvi una\n"
+"sincronizzazione di\n"
+"emergenza"
# (ndt) segnalare SyncML?
#: ../src/gtk-ui/ui.glade.h:34
@@ -889,6 +892,7 @@ msgstr "Scarta"
#~ msgid "Database error"
#~ msgstr "Errore nel database"
+
#~ msgid ""
#~ "Do you want to replace %s with %s? This will not remove any synced "
#~ "information on either end but you will no longer be able to sync with %s."
@@ -896,75 +900,105 @@ msgstr "Scarta"
#~ "Vuoi sostituire %s con %s? Questa operazione non rimuoverà nessuna "
#~ "informazione sincronizzata ma non sarai più in grado di sincronizzare con "
#~ "%s."
+
#~ msgid "Yes, use %s"
#~ msgstr "Sì, utilizza %s"
+
#~ msgid "No, use %s"
#~ msgstr "No, utilizza %s"
+
#~ msgid "Reset service"
#~ msgstr "Servizio di ripristino"
+
#~ msgid "Addressbook"
#~ msgstr "Rubrica"
+
#~ msgid "Todo"
#~ msgstr "Attività"
+
#~ msgid "Memo"
#~ msgstr "Memo"
+
#~ msgid "Failed to save current service in GConf configuration system"
#~ msgstr ""
#~ "Salvataggio del servizio attuale nel sistema di configurazione GConf non "
#~ "riuscito"
+
#~ msgid "Failed to save service configuration to SyncEvolution"
#~ msgstr ""
#~ "Salvataggio della configurazione del servizio in SyncEvolution non "
#~ "riuscito"
+
#~ msgid "Failed to get service configuration from SyncEvolution"
#~ msgstr ""
#~ "Recupero della configurazione del servizio da SyncEvolution non riuscito"
+
#~ msgid "Failed to remove service configuration from SyncEvolution"
#~ msgstr ""
#~ "Rimozione della configurazione del servizio da SyncEvolution non riuscita"
+
#~ msgid "Failed to cancel: sync was no longer in progress"
#~ msgstr "Annullamento non riuscito: la sincronizzazione non era più in corso"
+
#~ msgid "Failed to cancel sync"
#~ msgstr "Annullamento sincronizzazione non riuscito"
+
#~ msgid "Canceling sync"
#~ msgstr "Annullamento sincronizzazione"
+
#~ msgid "No sources are enabled, not syncing"
#~ msgstr "Nessuna sorgente è abilitata, niente da sincronizzare"
+
#~ msgid "A sync is already in progress"
#~ msgstr "È già in corso una sincronizzazione"
+
#~ msgid "Failed to start sync"
#~ msgstr "Avvio della sincronizzazione non riuscito"
+
#~ msgid "%s (not supported by this service)"
#~ msgstr "%s (non supportato da questo servizio)"
+
#~ msgid "Failed to get server configuration from SyncEvolution"
#~ msgstr ""
#~ "Recupero della configurazione del server da SyncEvolution non riuscito"
+
#~ msgid "Server URL"
#~ msgstr "URL del server"
+
#~ msgid "Failed to get list of manually setup services from SyncEvolution"
#~ msgstr ""
#~ "Recupero elenco dei servizi configurati manualmente da SyncEvolution non "
#~ "riuscito"
+
#~ msgid "Service configuration not found"
#~ msgstr "Configurazione del servizio non trovata"
+
#~ msgid "Not authorized"
#~ msgstr "Non autorizzato"
+
#~ msgid "Not found"
#~ msgstr "Non trovato"
+
#~ msgid "Transport failure (no connection?)"
#~ msgstr "Errore nel trasporto dei dati (connessione assente?)"
+
#~ msgid "Connection timed out"
#~ msgstr "La connessione è terminata"
+
#~ msgid "Connection failed"
#~ msgstr "La connessione non è stata stabilita"
+
#~ msgid "Sync canceled"
#~ msgstr "Sincronizzazione annullata"
+
#~ msgid "Ending sync"
#~ msgstr "Termine sincronizzazione"
+
#~ msgid "<b>No sync service in use</b>"
#~ msgstr "<b>Nessun servizio di sincronizzazione in uso</b>"
+
#~ msgid "<big>Manual setup</big>"
#~ msgstr "<big>Configurazione manuale</big>"
+
#~ msgid "Merge local and remote data (recommended)"
#~ msgstr "Unire i dati locali e remoti (raccomandato)"
-
diff --git a/po/ja.po b/po/ja.po
index 09f73fd2..0c80e1cb 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-05-03 09:24+0000\n"
+"POT-Creation-Date: 2010-05-12 09:27+0000\n"
"PO-Revision-Date: \n"
-"Last-Translator: GLSJPN_Yukari <yukarix.yamashita@intel.com>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -81,7 +81,7 @@ msgstr "はい、削除して置き換える"
#: ../src/gtk-ui/sync-ui.c:429
#: ../src/gtk-ui/sync-ui.c:460
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "No"
msgstr "いいえ"
@@ -192,7 +192,7 @@ msgstr "同期化中"
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
#: ../src/gtk-ui/sync-ui.c:757
-#: ../src/gtk-ui/sync-ui.c:3373
+#: ../src/gtk-ui/sync-ui.c:3399
msgid "Cancel sync"
msgstr "同期化のキャンセル"
@@ -204,7 +204,7 @@ msgstr "同期化に戻る"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1223
+#: ../src/gtk-ui/sync-ui.c:1224
msgid "Automatic sync"
msgstr "自動同期"
@@ -212,53 +212,53 @@ msgstr "自動同期"
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1494
+#: ../src/gtk-ui/sync-ui.c:1519
#, c-format
msgid "Affected data: %s %s"
msgstr "影響を受けたデータ: %s %s"
-#: ../src/gtk-ui/sync-ui.c:1499
+#: ../src/gtk-ui/sync-ui.c:1524
#, c-format
msgid "Affected data: none"
msgstr "影響を受けたデータ: なし"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1577
+#: ../src/gtk-ui/sync-ui.c:1602
#, c-format
msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
msgstr "%s からバックアップを復元しますか? これまでに変更した内容はすべて失われてしまいます。"
-#: ../src/gtk-ui/sync-ui.c:1580
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "Yes, restore"
msgstr "はい、復元します"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1612
+#: ../src/gtk-ui/sync-ui.c:1637
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1631
+#: ../src/gtk-ui/sync-ui.c:1656
#, c-format
msgid "Backed up before syncing with %s"
msgstr "%s で同期する前にバックアップされます"
-#: ../src/gtk-ui/sync-ui.c:1648
+#: ../src/gtk-ui/sync-ui.c:1673
msgid "Restore"
msgstr "復元"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1755
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
msgstr "%s での通常同期は現在できません。低速で双方向同期するか、最初からやり直すことになります。また、バックアップを復元することもできますが、通常の同期を行う前に低速同期を行うか、最初からやり直す必要があります。"
-#: ../src/gtk-ui/sync-ui.c:1765
+#: ../src/gtk-ui/sync-ui.c:1790
#, c-format
msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
msgstr "深刻な問題が生じた場合は、低速同期を行うか、最初からやり直すか、バックアップから復元できます。"
@@ -266,18 +266,18 @@ msgstr "深刻な問題が生じた場合は、低速同期を行うか、最初
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1774
+#: ../src/gtk-ui/sync-ui.c:1799
#, c-format
msgid ""
"Delete all your local\n"
"data and replace with\n"
"data from %s"
msgstr ""
-"ローカルデータをすべてl\n"
-"削除して、%s のデータにl\n"
+"ローカルデータをすべて\n"
+"削除して、%s のデータに\n"
"置き換えます"
-#: ../src/gtk-ui/sync-ui.c:1780
+#: ../src/gtk-ui/sync-ui.c:1805
#, c-format
msgid ""
"Delete all data on\n"
@@ -288,77 +288,77 @@ msgstr ""
"して、ローカルデータに\n"
"置き換えます"
-#: ../src/gtk-ui/sync-ui.c:2241
+#: ../src/gtk-ui/sync-ui.c:2267
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "サポートされているサービスのリストを SyncEvolution から入手するのに失敗しました"
-#: ../src/gtk-ui/sync-ui.c:2295
+#: ../src/gtk-ui/sync-ui.c:2321
msgid "There was a problem communicating with the sync process. Please try again later."
msgstr "同期化プロセスへの通信に問題がありました。時間を置いてからもう一度試してみてください。"
-#: ../src/gtk-ui/sync-ui.c:2354
+#: ../src/gtk-ui/sync-ui.c:2380
msgid "Restore failed"
msgstr "復元に失敗しました"
# space limitation
-#: ../src/gtk-ui/sync-ui.c:2357
-#: ../src/gtk-ui/sync-ui.c:3242
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
msgid "Sync failed"
msgstr "同期に失敗しました"
# space limitation
-#: ../src/gtk-ui/sync-ui.c:2363
+#: ../src/gtk-ui/sync-ui.c:2389
msgid "Restore complete"
msgstr "復元の完了"
# space limitation
-#: ../src/gtk-ui/sync-ui.c:2366
+#: ../src/gtk-ui/sync-ui.c:2392
msgid "Sync complete"
msgstr "同期化の完了"
# added colon to separate
-#: ../src/gtk-ui/sync-ui.c:2458
+#: ../src/gtk-ui/sync-ui.c:2484
#, c-format
msgid "Preparing '%s'"
msgstr "待機中です:%s"
# added colon to separate
-#: ../src/gtk-ui/sync-ui.c:2461
+#: ../src/gtk-ui/sync-ui.c:2487
#, c-format
msgid "Receiving '%s'"
msgstr "受信中です:%s"
# added colon to separate
-#: ../src/gtk-ui/sync-ui.c:2464
+#: ../src/gtk-ui/sync-ui.c:2490
#, c-format
msgid "Sending '%s'"
msgstr "送信中です:%s"
-#: ../src/gtk-ui/sync-ui.c:2585
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "リモートで接続拒否が 1 件ありました。"
msgstr[1] "リモートで接続拒否が %ld 件ありました。"
-#: ../src/gtk-ui/sync-ui.c:2590
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "ローカルで接続拒否が 1 件ありました。"
msgstr[1] "ローカルで接続拒否が %ld 件ありました。"
-#: ../src/gtk-ui/sync-ui.c:2595
+#: ../src/gtk-ui/sync-ui.c:2621
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "ローカルの接続拒否が %ld 件、およびリモートの接続拒否が %ld 件あります。"
-#: ../src/gtk-ui/sync-ui.c:2600
+#: ../src/gtk-ui/sync-ui.c:2626
#, c-format
msgid "Last time: No changes."
msgstr "前回:変更なし。"
-#: ../src/gtk-ui/sync-ui.c:2602
+#: ../src/gtk-ui/sync-ui.c:2628
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -368,21 +368,21 @@ msgstr[1] "前回:%ld 箇所の変更が送信されました。"
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2610
+#: ../src/gtk-ui/sync-ui.c:2636
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "前回:1 箇所の変更を適用しました。"
msgstr[1] "前回:%ld 箇所の変更を受信しました。"
-#: ../src/gtk-ui/sync-ui.c:2615
+#: ../src/gtk-ui/sync-ui.c:2641
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "前回:%ld 箇所の変更を適用し、%ld 箇所の変更を送信しました。"
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2822
+#: ../src/gtk-ui/sync-ui.c:2848
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -391,130 +391,130 @@ msgstr ""
"前回の同期化に次の問題がありました:\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2832
+#: ../src/gtk-ui/sync-ui.c:2858
#, c-format
msgid "You've just restored a backup. The changes have not been synced with %s yet"
msgstr "バックアップの復元が完了しました。変更内容はまだ %s と同期されていませn"
-#: ../src/gtk-ui/sync-ui.c:3120
+#: ../src/gtk-ui/sync-ui.c:3146
msgid "Waiting for current operation to finish..."
msgstr "実行中の操作の終了を待機しています..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3154
+#: ../src/gtk-ui/sync-ui.c:3180
msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
msgstr "通常同期は現在できません。サーバーは低速同期を推奨していますが、双方に既にデータがある場合は期待通りの結果にならない場合があります。"
-#: ../src/gtk-ui/sync-ui.c:3158
+#: ../src/gtk-ui/sync-ui.c:3184
msgid "The sync process died unexpectedly."
msgstr "同期サービスが突然終了しました。"
-#: ../src/gtk-ui/sync-ui.c:3163
+#: ../src/gtk-ui/sync-ui.c:3189
msgid "Password request was not answered. You can save the password in the settings to prevent the request."
msgstr "パスワード要求に答えていません。設定でパスワードを保存すると、パスワードが要求されなようにできます。"
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3167
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "There was a problem processing sync request. Trying again may help."
msgstr "同期化要求の処理に問題がありました。もう一度試してみてください。"
-#: ../src/gtk-ui/sync-ui.c:3173
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to login. Could there be a problem with your username or password?"
msgstr "ログインに失敗しました。ユーザー名またはパスワードに問題がある可能性があります。"
# "access is forbidden"
-#: ../src/gtk-ui/sync-ui.c:3176
+#: ../src/gtk-ui/sync-ui.c:3202
msgid "Forbidden"
msgstr "アクセスが禁止されています"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3182
+#: ../src/gtk-ui/sync-ui.c:3208
msgid "A data source could not be found. Could there be a problem with the settings?"
msgstr "データのソースが見つかりません。設定に問題がある可能性があります。"
-#: ../src/gtk-ui/sync-ui.c:3186
+#: ../src/gtk-ui/sync-ui.c:3212
msgid "Remote database error"
msgstr "リモート データベースのエラー"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3189
+#: ../src/gtk-ui/sync-ui.c:3215
msgid "There is a problem with the local database. Syncing again or rebooting may help."
msgstr "ローカル データベースに問題があります。再度同期を行うか、再起動で解決できるかも知れません。"
# "there is no space"
-#: ../src/gtk-ui/sync-ui.c:3192
+#: ../src/gtk-ui/sync-ui.c:3218
msgid "No space on disk"
msgstr "ディスクに空き領域がありません"
-#: ../src/gtk-ui/sync-ui.c:3194
+#: ../src/gtk-ui/sync-ui.c:3220
msgid "Failed to process SyncML"
msgstr "SyncML プロセスに失敗しました"
-#: ../src/gtk-ui/sync-ui.c:3196
+#: ../src/gtk-ui/sync-ui.c:3222
msgid "Server authorization failed"
msgstr "サーバー認証に失敗しました"
-#: ../src/gtk-ui/sync-ui.c:3198
+#: ../src/gtk-ui/sync-ui.c:3224
msgid "Failed to parse configuration file"
msgstr "設定ファイルの中断に失敗しました"
-#: ../src/gtk-ui/sync-ui.c:3200
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "Failed to read configuration file"
msgstr "設定ファイルの読み込みに失敗しました"
# "configuration entries (items) are not found"
-#: ../src/gtk-ui/sync-ui.c:3202
+#: ../src/gtk-ui/sync-ui.c:3228
msgid "No configuration found"
msgstr "設定項目が見つかりません"
# "configuration file is not found"
-#: ../src/gtk-ui/sync-ui.c:3204
+#: ../src/gtk-ui/sync-ui.c:3230
msgid "No configuration file found"
msgstr "設定ファイルが見つかりません"
-#: ../src/gtk-ui/sync-ui.c:3206
+#: ../src/gtk-ui/sync-ui.c:3232
msgid "Server sent bad content"
msgstr "サーバーが悪いコンテンツを送信しました"
-#: ../src/gtk-ui/sync-ui.c:3208
+#: ../src/gtk-ui/sync-ui.c:3234
msgid "Connection certificate has expired"
msgstr "接続証明書の期限が切れています"
-#: ../src/gtk-ui/sync-ui.c:3210
+#: ../src/gtk-ui/sync-ui.c:3236
msgid "Connection certificate is invalid"
msgstr "接続証明書が無効です"
-#: ../src/gtk-ui/sync-ui.c:3218
+#: ../src/gtk-ui/sync-ui.c:3244
msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
msgstr "サーバーに接続できません。障害は一時的である可能性もありますが、サーバーの設定に問題がある可能性もあります。"
# "URL is not appropriate"
-#: ../src/gtk-ui/sync-ui.c:3225
+#: ../src/gtk-ui/sync-ui.c:3251
msgid "The server URL is bad"
msgstr "サーバーの URL が正しくありません"
-#: ../src/gtk-ui/sync-ui.c:3230
+#: ../src/gtk-ui/sync-ui.c:3256
msgid "The server was not found"
msgstr "サーバーが見つかりませんでした"
# in case the error message is in JPN, added colon
-#: ../src/gtk-ui/sync-ui.c:3232
+#: ../src/gtk-ui/sync-ui.c:3258
#, c-format
msgid "Error %d"
msgstr "エラー:%d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3370
+#: ../src/gtk-ui/sync-ui.c:3396
msgid "Password is required for sync"
msgstr "同期にはパスワードが必要です"
-#: ../src/gtk-ui/sync-ui.c:3374
+#: ../src/gtk-ui/sync-ui.c:3400
msgid "Sync with password"
msgstr "パスワード付き同期"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3384
+#: ../src/gtk-ui/sync-ui.c:3410
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "%s と同期するためのパスワードを入力してください:"
diff --git a/po/nl.po b/po/nl.po
index 168b1596..48542163 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: syncevolution\n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-04-05 09:22+0000\n"
-"PO-Revision-Date: 2010-04-06 17:00-0800\n"
-"Last-Translator: GLS_NLD <albert.dijkstra@ptiglobal.net>\n"
+"POT-Creation-Date: 2010-05-10 09:25+0000\n"
+"PO-Revision-Date: 2010-05-12 13:02-0800\n"
+"Last-Translator: Thomas <thomas.martens@ptiglobal.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,115 +21,115 @@ msgstr ""
msgid "Sync"
msgstr "Synchronisatie"
-#: ../src/gtk-ui/sync-ui.c:260
+#: ../src/gtk-ui/sync-ui.c:266
msgid "Contacts"
msgstr "Contacten"
-#: ../src/gtk-ui/sync-ui.c:262
+#: ../src/gtk-ui/sync-ui.c:268
msgid "Appointments"
msgstr "Afspraken"
-#: ../src/gtk-ui/sync-ui.c:264
+#: ../src/gtk-ui/sync-ui.c:270
#: ../src/gtk-ui/ui.glade.h:40
msgid "Tasks"
msgstr "Taken"
-#: ../src/gtk-ui/sync-ui.c:266
+#: ../src/gtk-ui/sync-ui.c:272
msgid "Notes"
msgstr "Opmerkingen"
#. TRANSLATORS: This is a "combination source" for syncing with devices
#. * that combine appointments and tasks. the name should match the ones
#. * used for calendar and todo above
-#: ../src/gtk-ui/sync-ui.c:271
+#: ../src/gtk-ui/sync-ui.c:277
msgid "Appointments & Tasks"
msgstr "Afspraken & Taken"
-#: ../src/gtk-ui/sync-ui.c:343
+#: ../src/gtk-ui/sync-ui.c:349
msgid "Starting sync"
msgstr "Synchronisatie wordt gestart"
#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:381
+#: ../src/gtk-ui/sync-ui.c:387
#, c-format
msgid "Do you want to slow sync with %s?"
msgstr "Wilt u langzaam synchroniseren met %s?"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "Yes, do slow sync"
msgstr "Ja, voer een synchronisatie uit"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "No, cancel sync"
msgstr "Nee, breek synchronisatie af"
#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:418
+#: ../src/gtk-ui/sync-ui.c:424
#, c-format
msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
msgstr "Wil je alle lokale data verwijderen en vervangen met data van %s? Dit is niet aan te raden."
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
msgid "Yes, delete and replace"
msgstr "Ja, verwijder en vervang"
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
+#: ../src/gtk-ui/sync-ui.c:1580
msgid "No"
msgstr "Nee"
#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:449
+#: ../src/gtk-ui/sync-ui.c:455
#, c-format
msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
msgstr "Wil je alle data in %s verwijderen en vervangen met lokale data? Dit is niet aan te raden."
-#: ../src/gtk-ui/sync-ui.c:481
+#: ../src/gtk-ui/sync-ui.c:487
msgid "Trying to cancel sync"
msgstr "Proberen syncrhonisatie af te breken"
-#: ../src/gtk-ui/sync-ui.c:521
+#: ../src/gtk-ui/sync-ui.c:529
msgid "No service or device selected"
msgstr "Geen service of apparaat geselecteerd"
#. TRANSLATORS: This is the title on main view. Placeholder is
#. * the service name. Example: "Google - synced just now"
-#: ../src/gtk-ui/sync-ui.c:529
+#: ../src/gtk-ui/sync-ui.c:537
#, c-format
msgid "%s - synced just now"
msgstr "%s - just klaar met synchroniseren"
-#: ../src/gtk-ui/sync-ui.c:533
+#: ../src/gtk-ui/sync-ui.c:541
#, c-format
msgid "%s - synced a minute ago"
msgstr "%s - een minuut geleden gesynchroniseerd"
-#: ../src/gtk-ui/sync-ui.c:537
+#: ../src/gtk-ui/sync-ui.c:545
#, c-format
msgid "%s - synced %ld minutes ago"
msgstr "%s - %ld minuten geleden gesynchroniseerd"
-#: ../src/gtk-ui/sync-ui.c:542
+#: ../src/gtk-ui/sync-ui.c:550
#, c-format
msgid "%s - synced an hour ago"
msgstr "%s - een uur geleden gesynchroniseerd"
-#: ../src/gtk-ui/sync-ui.c:546
+#: ../src/gtk-ui/sync-ui.c:554
#, c-format
msgid "%s - synced %ld hours ago"
msgstr "%s - %ld uren geleden gesynchroniseerd"
-#: ../src/gtk-ui/sync-ui.c:551
+#: ../src/gtk-ui/sync-ui.c:559
#, c-format
msgid "%s - synced a day ago"
msgstr "%s - een dag geleden gesynchroniseerd"
-#: ../src/gtk-ui/sync-ui.c:555
+#: ../src/gtk-ui/sync-ui.c:563
#, c-format
msgid "%s - synced %ld days ago"
msgstr "%s - %ld dagen geleden gesynchroniseerd"
@@ -137,66 +137,66 @@ msgstr "%s - %ld dagen geleden gesynchroniseerd"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "You've just restored a backup. The changes have not been "
#. * "synced with %s yet"
-#: ../src/gtk-ui/sync-ui.c:604
-#: ../src/gtk-ui/sync-ui.c:719
+#: ../src/gtk-ui/sync-ui.c:612
+#: ../src/gtk-ui/sync-ui.c:726
msgid "Sync now"
msgstr "Synchroniseer nu"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "A normal sync is not possible at this time..." message.
#. * "Other options" will open Emergency view
-#: ../src/gtk-ui/sync-ui.c:610
+#: ../src/gtk-ui/sync-ui.c:618
#: ../src/gtk-ui/ui.glade.h:37
msgid "Slow sync"
msgstr "Synchronisatie"
-#: ../src/gtk-ui/sync-ui.c:611
+#: ../src/gtk-ui/sync-ui.c:619
msgid "Other options..."
msgstr "Andere opties..."
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * when no service is selected. Will open configuration view
-#: ../src/gtk-ui/sync-ui.c:616
+#: ../src/gtk-ui/sync-ui.c:624
msgid "Select sync service"
msgstr "Selecteer synchronisatie service"
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * login to service fails. Will open configuration view for this service
-#: ../src/gtk-ui/sync-ui.c:621
+#: ../src/gtk-ui/sync-ui.c:629
msgid "Edit service settings"
msgstr "Bewerk service instellingen"
-#: ../src/gtk-ui/sync-ui.c:670
+#: ../src/gtk-ui/sync-ui.c:700
msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
msgstr "Je hebt geen synchronisatie service of apparaat geselecteerd. Synchronisatie service laten je synchroniseren tussen je netbook en een web service."
-#: ../src/gtk-ui/sync-ui.c:717
+#: ../src/gtk-ui/sync-ui.c:722
msgid "Sync again"
msgstr "Synchroniseer opnieuw"
-#: ../src/gtk-ui/sync-ui.c:730
+#: ../src/gtk-ui/sync-ui.c:743
msgid "Restoring"
msgstr "Herstellen"
-#: ../src/gtk-ui/sync-ui.c:732
+#: ../src/gtk-ui/sync-ui.c:745
msgid "Syncing"
msgstr "Synchronisatie bezig"
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
-#: ../src/gtk-ui/sync-ui.c:743
-#: ../src/gtk-ui/sync-ui.c:3358
+#: ../src/gtk-ui/sync-ui.c:757
+#: ../src/gtk-ui/sync-ui.c:3374
msgid "Cancel sync"
msgstr "Synchronisatie afbreken"
-#: ../src/gtk-ui/sync-ui.c:908
+#: ../src/gtk-ui/sync-ui.c:922
msgid "Back to sync"
msgstr "Terug naar synchronisatie"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1209
+#: ../src/gtk-ui/sync-ui.c:1223
msgid "Automatic sync"
msgstr "Automatische synchronisatie"
@@ -204,53 +204,53 @@ msgstr "Automatische synchronisatie"
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1480
+#: ../src/gtk-ui/sync-ui.c:1494
#, c-format
msgid "Affected data: %s %s"
msgstr "Betroffen gegevens: %s %s"
-#: ../src/gtk-ui/sync-ui.c:1485
+#: ../src/gtk-ui/sync-ui.c:1499
#, c-format
msgid "Affected data: none"
msgstr "Betroffen gegevens: geen"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1563
+#: ../src/gtk-ui/sync-ui.c:1577
#, c-format
msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
msgstr "Wilt u de backup terugzetten van % s? Alle wijzigingen die u sindsdien hebt gemaakt gaan verloren."
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:1580
msgid "Yes, restore"
msgstr "Ja, herstellen"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1598
+#: ../src/gtk-ui/sync-ui.c:1612
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1617
+#: ../src/gtk-ui/sync-ui.c:1631
#, c-format
msgid "Backed up before syncing with %s"
msgstr "Gebackupt vóór synchroniseren met %s"
-#: ../src/gtk-ui/sync-ui.c:1634
+#: ../src/gtk-ui/sync-ui.c:1648
msgid "Restore"
msgstr "Herstellen"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1741
+#: ../src/gtk-ui/sync-ui.c:1755
#, c-format
msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
msgstr "Een normale synchronisatie met %s is niet mogelijk op dit moment. U kunt een langzame twee-weg synchronisatie uitvoeren of weer starten vanaf het begin. U kunt ook een back-up terugzetten, maar een langzame twee-weg synchronisatie of starten vanaf het begin is nog steeds noodzakelijk voordat een normale synchronisatie mogelijk is."
-#: ../src/gtk-ui/sync-ui.c:1751
+#: ../src/gtk-ui/sync-ui.c:1765
#, c-format
msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
msgstr "Als iets verschrikkelijk mis is gegaan, kunt u een langzame synchronisatie proberen, starten vanaf het begin of herstellen vanaf een backup."
@@ -258,7 +258,7 @@ msgstr "Als iets verschrikkelijk mis is gegaan, kunt u een langzame synchronisat
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1760
+#: ../src/gtk-ui/sync-ui.c:1774
#, c-format
msgid ""
"Delete all your local\n"
@@ -269,7 +269,7 @@ msgstr ""
"data en vervang het\n"
"met data van %s"
-#: ../src/gtk-ui/sync-ui.c:1766
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
msgid ""
"Delete all data on\n"
@@ -280,71 +280,71 @@ msgstr ""
"%s en vervang het\n"
"met uw lokale data"
-#: ../src/gtk-ui/sync-ui.c:2226
+#: ../src/gtk-ui/sync-ui.c:2242
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "Fout bij het verkrijgen van ondersteunde services uit SyncEvolution"
-#: ../src/gtk-ui/sync-ui.c:2280
+#: ../src/gtk-ui/sync-ui.c:2296
msgid "There was a problem communicating with the sync process. Please try again later."
msgstr "Er was een probleem met de synchronisatie communicatie. Probeer het later nog eens."
-#: ../src/gtk-ui/sync-ui.c:2339
+#: ../src/gtk-ui/sync-ui.c:2355
msgid "Restore failed"
msgstr "Herstellen mislukt"
-#: ../src/gtk-ui/sync-ui.c:2342
-#: ../src/gtk-ui/sync-ui.c:3227
+#: ../src/gtk-ui/sync-ui.c:2358
+#: ../src/gtk-ui/sync-ui.c:3243
msgid "Sync failed"
msgstr "Synchronisatie mislukt"
-#: ../src/gtk-ui/sync-ui.c:2348
+#: ../src/gtk-ui/sync-ui.c:2364
msgid "Restore complete"
msgstr "Herstellen afgerond"
-#: ../src/gtk-ui/sync-ui.c:2351
+#: ../src/gtk-ui/sync-ui.c:2367
msgid "Sync complete"
msgstr "Synchronisatie afgerond"
-#: ../src/gtk-ui/sync-ui.c:2443
+#: ../src/gtk-ui/sync-ui.c:2459
#, c-format
msgid "Preparing '%s'"
msgstr "'%s' voorbereiden"
-#: ../src/gtk-ui/sync-ui.c:2446
+#: ../src/gtk-ui/sync-ui.c:2462
#, c-format
msgid "Receiving '%s'"
msgstr "'%s' ontvangen"
-#: ../src/gtk-ui/sync-ui.c:2449
+#: ../src/gtk-ui/sync-ui.c:2465
#, c-format
msgid "Sending '%s'"
msgstr "'%s' versturen"
-#: ../src/gtk-ui/sync-ui.c:2570
+#: ../src/gtk-ui/sync-ui.c:2586
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "Er waren %ld externe afwijzingen."
msgstr[1] "Er waren %ld externe verwerpingen."
-#: ../src/gtk-ui/sync-ui.c:2575
+#: ../src/gtk-ui/sync-ui.c:2591
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "Er was een lokale afwijzing."
msgstr[1] "Er waren %ld lokale afwijzingen."
-#: ../src/gtk-ui/sync-ui.c:2580
+#: ../src/gtk-ui/sync-ui.c:2596
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "Er waren %ld lokale en %ld externe afwijzingen."
-#: ../src/gtk-ui/sync-ui.c:2585
+#: ../src/gtk-ui/sync-ui.c:2601
#, c-format
msgid "Last time: No changes."
msgstr "Laatste keer: geen veranderingen."
-#: ../src/gtk-ui/sync-ui.c:2587
+#: ../src/gtk-ui/sync-ui.c:2603
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -354,21 +354,21 @@ msgstr[1] "Laatste keer: %ld veranderingen verstuurd."
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2595
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "Laatste keer: één verandering uitgevoerd."
msgstr[1] "Laatste keer: %ld veranderingen uitgevoerd."
-#: ../src/gtk-ui/sync-ui.c:2600
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "Laatste keer: %ld wijzigingen uitgevoerd, %ld verzonden."
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2807
+#: ../src/gtk-ui/sync-ui.c:2823
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -377,124 +377,124 @@ msgstr ""
"Er was een probleem met de laatste synchonisatie:\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2817
+#: ../src/gtk-ui/sync-ui.c:2833
#, c-format
msgid "You've just restored a backup. The changes have not been synced with %s yet"
msgstr "Je hebt zojuist hersteld van een backup. De veranderingen zijn nog niet met %s gesynchroniseerd"
-#: ../src/gtk-ui/sync-ui.c:3105
+#: ../src/gtk-ui/sync-ui.c:3121
msgid "Waiting for current operation to finish..."
msgstr "Wachten op het voltooien van de huidige operatie..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3139
+#: ../src/gtk-ui/sync-ui.c:3155
msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
msgstr "Een normale synchronisatie is niet mogelijk op dit moment."
-#: ../src/gtk-ui/sync-ui.c:3143
+#: ../src/gtk-ui/sync-ui.c:3159
msgid "The sync process died unexpectedly."
msgstr "De synchronisatie service hing onverwachts op"
-#: ../src/gtk-ui/sync-ui.c:3148
+#: ../src/gtk-ui/sync-ui.c:3164
msgid "Password request was not answered. You can save the password in the settings to prevent the request."
msgstr "Wachtwoord was niet beantwoord. Je kunt het wachtwoord in de instellingen opslaan om dit probleem te voorkomen."
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3152
+#: ../src/gtk-ui/sync-ui.c:3168
msgid "There was a problem processing sync request. Trying again may help."
msgstr "Er is een probleem met de synchronisatie. Opnieuw proberen kan wellicht helpen."
-#: ../src/gtk-ui/sync-ui.c:3158
+#: ../src/gtk-ui/sync-ui.c:3174
msgid "Failed to login. Could there be a problem with your username or password?"
msgstr "Inloggen Mislukt. Is er een probleem met uw gebruikersnaam of wachtwoord?"
-#: ../src/gtk-ui/sync-ui.c:3161
+#: ../src/gtk-ui/sync-ui.c:3177
msgid "Forbidden"
msgstr "Verboden"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3167
+#: ../src/gtk-ui/sync-ui.c:3183
msgid "A data source could not be found. Could there be a problem with the settings?"
msgstr "De bron kon niet worden gevonden. Is er een probleem met de serverinstellingen?"
-#: ../src/gtk-ui/sync-ui.c:3171
+#: ../src/gtk-ui/sync-ui.c:3187
msgid "Remote database error"
msgstr "Service database fout"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3174
+#: ../src/gtk-ui/sync-ui.c:3190
msgid "There is a problem with the local database. Syncing again or rebooting may help."
msgstr "Er is een probleem met de lokale database. Opnieuw synchroniseren of herstarten kan helpen."
-#: ../src/gtk-ui/sync-ui.c:3177
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "No space on disk"
msgstr "Geen schijf ruimte beschikbaar"
-#: ../src/gtk-ui/sync-ui.c:3179
+#: ../src/gtk-ui/sync-ui.c:3195
msgid "Failed to process SyncML"
msgstr "Fout bij verwerken van SyncML"
-#: ../src/gtk-ui/sync-ui.c:3181
+#: ../src/gtk-ui/sync-ui.c:3197
msgid "Server authorization failed"
msgstr "Server authorisatie mislukt"
-#: ../src/gtk-ui/sync-ui.c:3183
+#: ../src/gtk-ui/sync-ui.c:3199
msgid "Failed to parse configuration file"
msgstr "Fout bij verwerken van configuratie bestand"
-#: ../src/gtk-ui/sync-ui.c:3185
+#: ../src/gtk-ui/sync-ui.c:3201
msgid "Failed to read configuration file"
msgstr "Fout bij lezen van configuratie bestand"
-#: ../src/gtk-ui/sync-ui.c:3187
+#: ../src/gtk-ui/sync-ui.c:3203
msgid "No configuration found"
msgstr "Geen configuratie gevonden"
-#: ../src/gtk-ui/sync-ui.c:3189
+#: ../src/gtk-ui/sync-ui.c:3205
msgid "No configuration file found"
msgstr "Geen configuratie bestand gevonden"
-#: ../src/gtk-ui/sync-ui.c:3191
+#: ../src/gtk-ui/sync-ui.c:3207
msgid "Server sent bad content"
msgstr "Server verstuurde foute gegevens"
-#: ../src/gtk-ui/sync-ui.c:3193
+#: ../src/gtk-ui/sync-ui.c:3209
msgid "Connection certificate has expired"
msgstr "Verbindingscertificaat is verlopen"
-#: ../src/gtk-ui/sync-ui.c:3195
+#: ../src/gtk-ui/sync-ui.c:3211
msgid "Connection certificate is invalid"
msgstr "Verbindingscertificaat is ongeldig"
-#: ../src/gtk-ui/sync-ui.c:3203
+#: ../src/gtk-ui/sync-ui.c:3219
msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
msgstr "We waren niet in staat om verbinding te maken met de server. Het probleem kan tijdelijk zijn of er kan iets mis zijn met de serverinstellingen."
-#: ../src/gtk-ui/sync-ui.c:3210
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "The server URL is bad"
msgstr "De server URL is niet geldig"
-#: ../src/gtk-ui/sync-ui.c:3215
+#: ../src/gtk-ui/sync-ui.c:3231
msgid "The server was not found"
msgstr "Server niet gevonden"
-#: ../src/gtk-ui/sync-ui.c:3217
+#: ../src/gtk-ui/sync-ui.c:3233
#, c-format
msgid "Error %d"
msgstr "Fout %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3355
+#: ../src/gtk-ui/sync-ui.c:3371
msgid "Password is required for sync"
msgstr "Een wachtwoord is vereist voor synchronisatie"
-#: ../src/gtk-ui/sync-ui.c:3359
+#: ../src/gtk-ui/sync-ui.c:3375
msgid "Sync with password"
msgstr "Synchroniseer met een wachtwoord"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3369
+#: ../src/gtk-ui/sync-ui.c:3385
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "Voer een wachtwoord in voor synchroniseren met %s:"
@@ -543,11 +543,11 @@ msgstr ""
#: ../src/gtk-ui/ui.glade.h:15
msgid "Add new device"
-msgstr "Nieuw apparaat toevoegen"
+msgstr "Nieuw apparaat"
#: ../src/gtk-ui/ui.glade.h:16
msgid "Add new service"
-msgstr "Voeg nieuwe service toe"
+msgstr "Nieuwe service "
#. explanation of "Restore backup" function
#: ../src/gtk-ui/ui.glade.h:18
@@ -643,79 +643,79 @@ msgstr "Niet veroudert"
msgid "Sync (GTK)"
msgstr "Sync (GTK)"
-#: ../src/gtk-ui/sync-config-widget.c:74
+#: ../src/gtk-ui/sync-config-widget.c:78
msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
msgstr "ScheduleWorld kan je contacten, gebeurtenissen, taken en notities synchroniseren."
-#: ../src/gtk-ui/sync-config-widget.c:77
+#: ../src/gtk-ui/sync-config-widget.c:81
msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
msgstr "Google Sync kan je adresboek en Gmail contacten synchroniseren en er backups van maken."
#. TRANSLATORS: Please include the word "demo" (or the equivalent in
#. your language): Funambol is going to be a 90 day demo service
#. in the future
-#: ../src/gtk-ui/sync-config-widget.c:83
+#: ../src/gtk-ui/sync-config-widget.c:87
msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
msgstr "Backup je adresboek en kalender. Synchroniseer met een muisklik, elk moment, overal (DEMO)."
-#: ../src/gtk-ui/sync-config-widget.c:86
+#: ../src/gtk-ui/sync-config-widget.c:90
msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
msgstr "Met Mobical Backup and Herstel service kunt u uw persoonlijke mobiele data veilig en gratis backuppen."
-#: ../src/gtk-ui/sync-config-widget.c:89
+#: ../src/gtk-ui/sync-config-widget.c:93
msgid "ZYB is a simple way for people to store and share mobile information online."
msgstr "Met ZYB kan men eenvoudige mobiele informatie online opslaan en delen."
-#: ../src/gtk-ui/sync-config-widget.c:92
+#: ../src/gtk-ui/sync-config-widget.c:96
msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
msgstr "Met Memotoo kunt u toegang krijgen tot uw persoonlijke gegevens vanaf elke computer die aangesloten is op het internet."
-#: ../src/gtk-ui/sync-config-widget.c:188
+#: ../src/gtk-ui/sync-config-widget.c:192
msgid "Sorry, failed to save the configuration"
msgstr "Fout bij het opslaan van het configuratie bestand"
-#: ../src/gtk-ui/sync-config-widget.c:377
+#: ../src/gtk-ui/sync-config-widget.c:381
msgid "Service must have a name and server URL"
msgstr "Service moet een naam en server URL hebben"
-#: ../src/gtk-ui/sync-config-widget.c:418
+#: ../src/gtk-ui/sync-config-widget.c:422
#, c-format
msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
msgstr "Wilt u de instellingen voor %s resetten? Data dat al gesynchroniseerde is zal niet worden verwijderd."
#. TRANSLATORS: buttons in reset-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:422
+#: ../src/gtk-ui/sync-config-widget.c:426
msgid "Yes, reset"
msgstr "Ja, reset"
-#: ../src/gtk-ui/sync-config-widget.c:423
-#: ../src/gtk-ui/sync-config-widget.c:434
+#: ../src/gtk-ui/sync-config-widget.c:427
+#: ../src/gtk-ui/sync-config-widget.c:438
msgid "No, keep settings"
msgstr "Nee, behoud de instellingen"
-#: ../src/gtk-ui/sync-config-widget.c:428
+#: ../src/gtk-ui/sync-config-widget.c:432
#, c-format
msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
msgstr "Wilt u de instellingen voor %s verwijderen? Data dat al gesynchroniseerde is zal niet worden verwijderd, alleen deze service configuratie zal worden verwijdert."
#. TRANSLATORS: buttons in delete-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:433
+#: ../src/gtk-ui/sync-config-widget.c:437
msgid "Yes, delete"
msgstr "Ja, verwijderen"
-#: ../src/gtk-ui/sync-config-widget.c:463
+#: ../src/gtk-ui/sync-config-widget.c:467
msgid "Reset settings"
msgstr "Instellingen wissen"
-#: ../src/gtk-ui/sync-config-widget.c:466
+#: ../src/gtk-ui/sync-config-widget.c:470
msgid "Delete settings"
msgstr "Verwijder instellingen"
-#: ../src/gtk-ui/sync-config-widget.c:476
+#: ../src/gtk-ui/sync-config-widget.c:480
msgid "Save and use"
msgstr "Opslaan en gebruik"
-#: ../src/gtk-ui/sync-config-widget.c:479
+#: ../src/gtk-ui/sync-config-widget.c:483
msgid ""
"Save and replace\n"
"current service"
@@ -723,101 +723,101 @@ msgstr ""
"Opslaan en vervang\n"
"de huidige service"
-#: ../src/gtk-ui/sync-config-widget.c:489
+#: ../src/gtk-ui/sync-config-widget.c:493
msgid "Stop using device"
msgstr "Stop apparaat gebruik"
-#: ../src/gtk-ui/sync-config-widget.c:492
+#: ../src/gtk-ui/sync-config-widget.c:496
msgid "Stop using service"
msgstr "Stop service gebruik"
#. TRANSLATORS: label for an entry in service configuration form.
#. * Placeholder is a source name.
#. * Example: "Appointments URI"
-#: ../src/gtk-ui/sync-config-widget.c:675
+#: ../src/gtk-ui/sync-config-widget.c:679
#, c-format
msgid "%s URI"
msgstr "%s URI"
#. TRANSLATORS: toggles in service configuration form, placeholder is service
#. * or device name
-#: ../src/gtk-ui/sync-config-widget.c:850
+#: ../src/gtk-ui/sync-config-widget.c:854
#, c-format
msgid "Send changes to %s"
msgstr "Stuur wijzigingen naar '%s'"
-#: ../src/gtk-ui/sync-config-widget.c:855
+#: ../src/gtk-ui/sync-config-widget.c:859
#, c-format
msgid "Receive changes from %s"
msgstr "Ontvang veranderingen van %s"
-#: ../src/gtk-ui/sync-config-widget.c:871
+#: ../src/gtk-ui/sync-config-widget.c:875
msgid "<b>Sync</b>"
msgstr "<b>Synchronisatie</b>"
#. TRANSLATORS: label of a entry in service configuration
-#: ../src/gtk-ui/sync-config-widget.c:887
+#: ../src/gtk-ui/sync-config-widget.c:891
msgid "Server address"
msgstr "Server adres"
#. TRANSLATORS: explanation before a device template combobox.
#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
#. * Client'
-#: ../src/gtk-ui/sync-config-widget.c:963
+#: ../src/gtk-ui/sync-config-widget.c:967
#, c-format
msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
msgstr "Dit apparaat ziet eruit als een '%s'. Als dit niet correct is, kijk dan in de lijst met ondersteunde apparaten en kies de juiste."
-#: ../src/gtk-ui/sync-config-widget.c:969
+#: ../src/gtk-ui/sync-config-widget.c:973
msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
msgstr "We kunnen niet zien wat voor apparaat dit is. Kijk naar de lijst van ondersteunde apparaten en kies de juiste."
-#: ../src/gtk-ui/sync-config-widget.c:1122
+#: ../src/gtk-ui/sync-config-widget.c:1126
#, c-format
msgid "%s - Bluetooth device"
msgstr "%s - Bluetooth-apparaat"
#. TRANSLATORS: service title for services that are not based on a
#. * template in service list, the placeholder is the name of the service
-#: ../src/gtk-ui/sync-config-widget.c:1128
+#: ../src/gtk-ui/sync-config-widget.c:1132
#, c-format
msgid "%s - manually setup"
msgstr "%s - handmatig instellen"
#. TRANSLATORS: link button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1803
+#: ../src/gtk-ui/sync-config-widget.c:1807
msgid "Launch website"
msgstr "Start website"
#. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1812
+#: ../src/gtk-ui/sync-config-widget.c:1816
msgid "Setup now"
msgstr "Nu instellen"
#. TRANSLATORS: labels of entries in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1908
+#: ../src/gtk-ui/sync-config-widget.c:1912
msgid "Username"
msgstr "gebruikersnaam"
-#: ../src/gtk-ui/sync-config-widget.c:1923
+#: ../src/gtk-ui/sync-config-widget.c:1927
msgid "Password"
msgstr "Wachtwoord"
#. TRANSLATORS: warning in service configuration form for people
#. who have modified the configuration via other means.
-#: ../src/gtk-ui/sync-config-widget.c:1946
+#: ../src/gtk-ui/sync-config-widget.c:1950
msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
msgstr "De huidige configuratie is complexer dan wat hier kan worden weergegeven. Wijzigingen aan de synchronisatie modus of aan de gesynchroniseerd data types overschrijft de configuratie."
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1965
+#: ../src/gtk-ui/sync-config-widget.c:1969
msgid "Hide server settings"
msgstr "Server instellingen verbergen"
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1985
+#: ../src/gtk-ui/sync-config-widget.c:1989
msgid "Show server settings"
msgstr "Server instellingen weergeven"
@@ -825,47 +825,49 @@ msgstr "Server instellingen weergeven"
msgid "Sync in the Sync application"
msgstr "Synchroniseer in de synchronisatie toepassing"
-#: ../src/syncevo-dbus-server.cpp:5622
+#: ../src/syncevo-dbus-server.cpp:5664
#, c-format
msgid "%s is syncing"
msgstr "%s synchronisatie bezig"
-#: ../src/syncevo-dbus-server.cpp:5623
+#: ../src/syncevo-dbus-server.cpp:5665
#, c-format
msgid "We have just started to sync your computer with the %s sync service."
msgstr "We hebben de synchronisatie met service %s en je computer gestart."
#. if sync is successfully started and done
-#: ../src/syncevo-dbus-server.cpp:5637
+#: ../src/syncevo-dbus-server.cpp:5679
#, c-format
msgid "%s sync complete"
msgstr "%s synchronisatie afgerond"
-#: ../src/syncevo-dbus-server.cpp:5638
+#: ../src/syncevo-dbus-server.cpp:5680
#, c-format
msgid "We have just finished syncing your computer with the %s sync service."
msgstr "Synchronisatie met service %s en je computer is voltooid."
#. if sync is successfully started and has errors, or not started successful with a fatal problem
-#: ../src/syncevo-dbus-server.cpp:5643
+#: ../src/syncevo-dbus-server.cpp:5685
msgid "Sync problem."
msgstr "Synchronisatie probleem."
-#: ../src/syncevo-dbus-server.cpp:5644
+#: ../src/syncevo-dbus-server.cpp:5686
msgid "Sorry, there's a problem with your sync that you need to attend to."
msgstr "Sorry, er is een probleem met de synchronisatie dat naar ingekeken moet worden."
-#: ../src/syncevo-dbus-server.cpp:5717
+#: ../src/syncevo-dbus-server.cpp:5759
msgid "View"
msgstr "Bekijk"
-#: ../src/syncevo-dbus-server.cpp:5718
+#. Use "default" as ID because that is what mutter-moblin
+#. recognizes: it then skips the action instead of adding it
+#. in addition to its own "Dismiss" button (always added).
+#: ../src/syncevo-dbus-server.cpp:5763
msgid "Dismiss"
msgstr "Gezien"
#~ msgid "Database error"
#~ msgstr "Database fout"
-
#~ msgid ""
#~ "Do you want to replace %s with %s? This will not remove any synced "
#~ "information on either end but you will no longer be able to sync with %s."
@@ -873,113 +875,80 @@ msgstr "Gezien"
#~ "Wilt u %s met %s vervangen? Data dat al gesynchroniseerde is zal niet "
#~ "worden verwijdert, maar u zal niet langer in staat zijn om met %s te "
#~ "synchroniseren."
-
#~ msgid "Yes, use %s"
#~ msgstr "Ja, gebruik %s"
-
#~ msgid "No, use %s"
#~ msgstr "Nee, gebruik %s"
-
#~ msgid "Reset service"
#~ msgstr "Reset service"
-
#~ msgid "Addressbook"
#~ msgstr "Adresboek"
-
#~ msgid "Todo"
#~ msgstr "Te doen"
-
#~ msgid "Memo"
#~ msgstr "Memo"
-
#~ msgid "Failed to save current service in GConf configuration system"
#~ msgstr "Fout bij wegschrijven huidige service in GConf configuratie systeem"
-
#~ msgid "Failed to save service configuration to SyncEvolution"
#~ msgstr "Fout bij wegschrijven service configuratie naar SyncEvolution"
-
#~ msgid "Failed to get service configuration from SyncEvolution"
#~ msgstr "Fout bij inlezen service configuratie uit SyncEvolution"
-
#~ msgid "Failed to remove service configuration from SyncEvolution"
#~ msgstr "Fout bij verwijderen service configuratie uit SyncEvolution"
-
#~ msgid "Failed to cancel: sync was no longer in progress"
#~ msgstr "Afbreken mislukt: syncrhonisatie was niet langer bezig"
-
#~ msgid "Failed to cancel sync"
#~ msgstr "Afbreken synchronisatie mislukt"
-
#~ msgid "Canceling sync"
#~ msgstr "Afbreken synchronisatie"
-
#~ msgid "No sources are enabled, not syncing"
#~ msgstr "Geen bronnen zijn actief, synchronisatie niet gestart"
-
#~ msgid "A sync is already in progress"
#~ msgstr "Synchronisatie is al bezig"
-
#~ msgid "Failed to start sync"
#~ msgstr "Fout bij opstarten synchronisatie"
-
#~ msgid "%s (not supported by this service)"
#~ msgstr "%s (niet ondersteund door deze service)"
-
#~ msgid "Failed to get server configuration from SyncEvolution"
#~ msgstr "Fout bij inlezen server configuratie uit SyncEvolution"
-
#~ msgid "Server URL"
#~ msgstr "Server URL"
-
#~ msgid "Failed to get list of manually setup services from SyncEvolution"
#~ msgstr ""
#~ "Fout bij verkrijgen van handmatige opgezette services uit SyncEvolution"
-
#~ msgid "Service configuration not found"
#~ msgstr "Service configuratie niet gevonden"
-
#~ msgid "Not authorized"
#~ msgstr "Niet toegestaan"
-
#~ msgid "Not found"
#~ msgstr "Niet gevonden"
-
#~ msgid "Transport failure (no connection?)"
#~ msgstr "Transport fout (geen verbinding?)"
-
#~ msgid "Connection timed out"
#~ msgstr "Verbinding verlopen"
-
#~ msgid "Sync canceled"
#~ msgstr "Synchronisatie afgebroken"
-
#~ msgid "Ending sync"
#~ msgstr "Beindigen synchronisatie"
-
#~ msgid "<b>No sync service in use</b>"
#~ msgstr "<b>Geen synchronisatie service in gebruik</b>"
-
#~ msgid "<big>Manual setup</big>"
#~ msgstr "<big>Handleiding opzetten</big>"
-
#~ msgid "Merge local and remote data (recommended)"
#~ msgstr "Voeg lokale en externe data samen (aanbevolen)"
-
#~ msgid "Reset original server settings"
#~ msgstr "Herstel originele server installingen"
-
#~ msgid "Service name"
#~ msgstr "Service naam"
-
#~ msgid ""
#~ "Sorry, you need an internet\n"
#~ "connection to sync."
#~ msgstr ""
#~ "Sorry, je hebt een internet\n"
#~ "verbinding nodig on te synchroniseren."
-
#~ msgid ""
#~ "Synchronization is not available (D-Bus service does not answer), sorry."
#~ msgstr ""
#~ "Synchronisatie is niet beschikbaar (D-Bus service niet beschikbaar), "
#~ "sorry."
+
diff --git a/po/ru.po b/po/ru.po
index 3a81eab8..dab8b1c3 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
"POT-Creation-Date: 2010-05-05 09:24+0000\n"
-"PO-Revision-Date: 2010-05-05 18:35-0800\n"
+"PO-Revision-Date: 2010-05-17 17:45-0800\n"
"Last-Translator: Bogdan Nosach <bogdan.nosach@ptiglobal.net>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -146,7 +146,7 @@ msgstr "%s - синхронизировано %ld дней назад"
#: ../src/gtk-ui/sync-ui.c:612
#: ../src/gtk-ui/sync-ui.c:726
msgid "Sync now"
-msgstr "Синхронизировать сейчас"
+msgstr "Синхронизировать"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "A normal sync is not possible at this time..." message.
@@ -154,7 +154,7 @@ msgstr "Синхронизировать сейчас"
#: ../src/gtk-ui/sync-ui.c:618
#: ../src/gtk-ui/ui.glade.h:37
msgid "Slow sync"
-msgstr "Медленная синхронизация"
+msgstr "Медленная/nсинхронизация"
#: ../src/gtk-ui/sync-ui.c:619
msgid "Other options..."
@@ -543,12 +543,12 @@ msgid ""
"A slow sync compares items from both sides and tries to merge them. \n"
"This may fail in some cases, leading to duplicates or lost information."
msgstr ""
-"При медленной синхронизации сравниваются элементы с обеих сторон и выполняется попытка их объединения. \n"
-"В некоторых случаях это может закончиться сбоем и стать причиной появлений копий данных или их утраты. "
+"Медленная синхронизация сравнивает элементы с обеих сторон и выполняет их объединение. \n"
+"В некоторых случаях это может вызвать появление копий данных или их утрату. "
#: ../src/gtk-ui/ui.glade.h:15
msgid "Add new device"
-msgstr "Добавить новое устройство"
+msgstr "Новое устройство"
#: ../src/gtk-ui/ui.glade.h:16
msgid "Add new service"
@@ -569,7 +569,7 @@ msgid ""
"Change or edit\n"
"sync service"
msgstr ""
-"Изменить или редактировать\n"
+"Изменить\n"
"службу синхронизации"
#. close button for settings window
@@ -603,7 +603,7 @@ msgid ""
"Fix a sync\n"
"emergency"
msgstr ""
-"Исправить экстренную\n"
+"Изменить экстренную\n"
"синхронизацию"
#: ../src/gtk-ui/ui.glade.h:34
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 00000000..a7cebfe1
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,879 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
+"POT-Creation-Date: 2010-05-19 09:19+0000\n"
+"PO-Revision-Date: 2010-05-19 10:57-0500\n"
+"Last-Translator: Ahmet Özgür Erdemli <dbl2010@gmail.com>\n"
+"Language-Team: MeeGo Türkçe\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-Language: Turkish\n"
+"X-Poedit-Country: TURKEY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#. TRANSLATORS: this is the application name that may be used by e.g.
+#. the windowmanager
+#: ../src/gtk-ui/main.c:40
+#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/sync.desktop.in.h:1
+#: ../src/gnome-bluetooth/syncevolution.c:112
+msgid "Sync"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:266
+msgid "Contacts"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:268
+msgid "Appointments"
+msgstr "Randevular"
+
+#: ../src/gtk-ui/sync-ui.c:270
+#: ../src/gtk-ui/ui.glade.h:40
+#, fuzzy
+msgid "Tasks"
+msgstr "Sık Kullanılan Görevler"
+
+#: ../src/gtk-ui/sync-ui.c:272
+msgid "Notes"
+msgstr ""
+
+#. TRANSLATORS: This is a "combination source" for syncing with devices
+#. * that combine appointments and tasks. the name should match the ones
+#. * used for calendar and todo above
+#: ../src/gtk-ui/sync-ui.c:277
+#, fuzzy
+msgid "Appointments & Tasks"
+msgstr "Sık Kullanılan Görevler"
+
+#: ../src/gtk-ui/sync-ui.c:349
+msgid "Starting sync"
+msgstr "Senkronizasyonu başlat"
+
+#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:387
+#, c-format
+msgid "Do you want to slow sync with %s?"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:391
+msgid "Yes, do slow sync"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:391
+msgid "No, cancel sync"
+msgstr "Hayır, senkronizasyonu iptal et"
+
+#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:424
+#, c-format
+msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
+msgid "Yes, delete and replace"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:429
+#: ../src/gtk-ui/sync-ui.c:460
+#: ../src/gtk-ui/sync-ui.c:1605
+msgid "No"
+msgstr "Hayır"
+
+#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
+#. * is service/device name
+#: ../src/gtk-ui/sync-ui.c:455
+#, c-format
+msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:487
+msgid "Trying to cancel sync"
+msgstr "Senkronizasyon iptal edilmeye çalışılıyor"
+
+#: ../src/gtk-ui/sync-ui.c:529
+msgid "No service or device selected"
+msgstr ""
+
+#. TRANSLATORS: This is the title on main view. Placeholder is
+#. * the service name. Example: "Google - synced just now"
+#: ../src/gtk-ui/sync-ui.c:537
+#, c-format
+msgid "%s - synced just now"
+msgstr "%s - yeni senkronize edildi"
+
+#: ../src/gtk-ui/sync-ui.c:541
+#, c-format
+msgid "%s - synced a minute ago"
+msgstr "%s - bir dakika önce senkronize edildi"
+
+#: ../src/gtk-ui/sync-ui.c:545
+#, c-format
+msgid "%s - synced %ld minutes ago"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:550
+#, c-format
+msgid "%s - synced an hour ago"
+msgstr "%s - bir saat önce senkronize edildi"
+
+#: ../src/gtk-ui/sync-ui.c:554
+#, c-format
+msgid "%s - synced %ld hours ago"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:559
+#, c-format
+msgid "%s - synced a day ago"
+msgstr "%s - bir gün önce senkronize edildi"
+
+#: ../src/gtk-ui/sync-ui.c:563
+#, c-format
+msgid "%s - synced %ld days ago"
+msgstr ""
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "You've just restored a backup. The changes have not been "
+#. * "synced with %s yet"
+#: ../src/gtk-ui/sync-ui.c:612
+#: ../src/gtk-ui/sync-ui.c:726
+msgid "Sync now"
+msgstr "Şimdi senkronize et"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
+#. * "A normal sync is not possible at this time..." message.
+#. * "Other options" will open Emergency view
+#: ../src/gtk-ui/sync-ui.c:618
+#: ../src/gtk-ui/ui.glade.h:37
+msgid "Slow sync"
+msgstr "Yavaş senkronizasyon"
+
+#: ../src/gtk-ui/sync-ui.c:619
+msgid "Other options..."
+msgstr "Diğer seçenekler..."
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * when no service is selected. Will open configuration view
+#: ../src/gtk-ui/sync-ui.c:624
+msgid "Select sync service"
+msgstr "Senkronizasyon servisi seçin"
+
+#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
+#. * login to service fails. Will open configuration view for this service
+#: ../src/gtk-ui/sync-ui.c:629
+msgid "Edit service settings"
+msgstr "Servis ayarlarını değiştirin"
+
+#: ../src/gtk-ui/sync-ui.c:700
+msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:722
+msgid "Sync again"
+msgstr "Tekrar senkronize edin"
+
+#: ../src/gtk-ui/sync-ui.c:743
+msgid "Restoring"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:745
+msgid "Syncing"
+msgstr ""
+
+#. TRANSLATORS: This is for the button in main view, right side.
+#. Keep line length below ~20 characters, use two lines if needed
+#: ../src/gtk-ui/sync-ui.c:757
+#: ../src/gtk-ui/sync-ui.c:3399
+msgid "Cancel sync"
+msgstr "Senkronizasyonu iptal et"
+
+#: ../src/gtk-ui/sync-ui.c:922
+msgid "Back to sync"
+msgstr "Senkronizasyona geri dönün"
+
+#. TRANSLATORS: label for checkbutton/toggle in main view.
+#. * Please stick to similar length strings or break the line with
+#. * "\n" if absolutely needed
+#: ../src/gtk-ui/sync-ui.c:1224
+msgid "Automatic sync"
+msgstr "Otomatik senkronizasyon"
+
+#. This is the expander label in emergency view. It summarizes the
+#. * currently selected data sources. First placeholder is service/device
+#. * name, second a comma separeted list of sources.
+#. * E.g. "Affected data: Google Contacts, Appointments"
+#: ../src/gtk-ui/sync-ui.c:1519
+#, fuzzy, c-format
+msgid "Affected data: %s %s"
+msgstr "Veri isteniyor"
+
+#: ../src/gtk-ui/sync-ui.c:1524
+#, fuzzy, c-format
+msgid "Affected data: none"
+msgstr "Etkilenen paketler:Hiçbiri"
+
+#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
+#. * backup time string defined below
+#: ../src/gtk-ui/sync-ui.c:1602
+#, c-format
+msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:1605
+#, fuzzy
+msgid "Yes, restore"
+msgstr "Evet, sil"
+
+#. TRANSLATORS: date/time for strftime(), used in emergency view backup
+#. * label. Any time format that shows date and time is good.
+#: ../src/gtk-ui/sync-ui.c:1637
+#, c-format
+msgid "%x %X"
+msgstr ""
+
+#. TRANSLATORS: label for a backup in emergency view. Placeholder is
+#. * service or device name
+#: ../src/gtk-ui/sync-ui.c:1656
+#, c-format
+msgid "Backed up before syncing with %s"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:1673
+msgid "Restore"
+msgstr ""
+
+#. TRANSLATORS: this is an explanation in Emergency view.
+#. * Placeholder is a service/device name
+#: ../src/gtk-ui/sync-ui.c:1780
+#, c-format
+msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:1790
+#, c-format
+msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgstr ""
+
+#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
+#. * service/device name. Please don't use too long lines, but feel free to
+#. * use several lines.
+#: ../src/gtk-ui/sync-ui.c:1799
+#, c-format
+msgid ""
+"Delete all your local\n"
+"data and replace with\n"
+"data from %s"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:1805
+#, c-format
+msgid ""
+"Delete all data on\n"
+"%s and replace\n"
+"with your local data"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2267
+msgid "Failed to get list of supported services from SyncEvolution"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2321
+msgid "There was a problem communicating with the sync process. Please try again later."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2380
+#, fuzzy
+msgid "Restore failed"
+msgstr "Bağlantı başarısız"
+
+#: ../src/gtk-ui/sync-ui.c:2383
+#: ../src/gtk-ui/sync-ui.c:3268
+msgid "Sync failed"
+msgstr "Senkronizasyon başarısız"
+
+#: ../src/gtk-ui/sync-ui.c:2389
+#, fuzzy
+msgid "Restore complete"
+msgstr "Tamam, ancak tek değil"
+
+#: ../src/gtk-ui/sync-ui.c:2392
+msgid "Sync complete"
+msgstr "Senkronizasyon tamamlandı"
+
+#: ../src/gtk-ui/sync-ui.c:2484
+#, c-format
+msgid "Preparing '%s'"
+msgstr "'%s' hazırlanıyor"
+
+#: ../src/gtk-ui/sync-ui.c:2487
+#, c-format
+msgid "Receiving '%s'"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2490
+#, c-format
+msgid "Sending '%s'"
+msgstr "'%s' gönderiliyor"
+
+#: ../src/gtk-ui/sync-ui.c:2611
+#, c-format
+msgid "There was one remote rejection."
+msgid_plural "There were %ld remote rejections."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/gtk-ui/sync-ui.c:2616
+#, c-format
+msgid "There was one local rejection."
+msgid_plural "There were %ld local rejections."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/gtk-ui/sync-ui.c:2621
+#, c-format
+msgid "There were %ld local rejections and %ld remote rejections."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2626
+#, c-format
+msgid "Last time: No changes."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2628
+#, c-format
+msgid "Last time: Sent one change."
+msgid_plural "Last time: Sent %ld changes."
+msgstr[0] ""
+msgstr[1] ""
+
+#. This is about changes made to the local data. Not all of these
+#. changes were requested by the remote server, so "applied"
+#. is a better word than "received" (bug #5185).
+#: ../src/gtk-ui/sync-ui.c:2636
+#, c-format
+msgid "Last time: Applied one change."
+msgid_plural "Last time: Applied %ld changes."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../src/gtk-ui/sync-ui.c:2641
+#, c-format
+msgid "Last time: Applied %ld changes and sent %ld changes."
+msgstr ""
+
+#. TRANSLATORS: the placeholder is a error message (hopefully)
+#. * explaining the problem
+#: ../src/gtk-ui/sync-ui.c:2848
+#, c-format
+msgid ""
+"There was a problem with last sync:\n"
+"%s"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:2858
+#, c-format
+msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3146
+msgid "Waiting for current operation to finish..."
+msgstr ""
+
+#. TRANSLATORS: next strings are error messages.
+#: ../src/gtk-ui/sync-ui.c:3180
+msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3184
+msgid "The sync process died unexpectedly."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3189
+msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+msgstr ""
+
+#. TODO use the service device name here, this is a remote problem
+#: ../src/gtk-ui/sync-ui.c:3193
+msgid "There was a problem processing sync request. Trying again may help."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3199
+msgid "Failed to login. Could there be a problem with your username or password?"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3202
+msgid "Forbidden"
+msgstr ""
+
+#. TRANSLATORS: data source means e.g. calendar or addressbook
+#: ../src/gtk-ui/sync-ui.c:3208
+msgid "A data source could not be found. Could there be a problem with the settings?"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3212
+#, fuzzy
+msgid "Remote database error"
+msgstr "Dahili hata oluştu"
+
+#. This can happen when EDS is borked, restart it may help...
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid "There is a problem with the local database. Syncing again or rebooting may help."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3218
+msgid "No space on disk"
+msgstr "Diskte yer kalmadı"
+
+#: ../src/gtk-ui/sync-ui.c:3220
+#, fuzzy
+msgid "Failed to process SyncML"
+msgstr "Dizin okuma başarısız %s: %m"
+
+#: ../src/gtk-ui/sync-ui.c:3222
+#, fuzzy
+msgid "Server authorization failed"
+msgstr "Paket indirme başarısız"
+
+#: ../src/gtk-ui/sync-ui.c:3224
+#, fuzzy
+msgid "Failed to parse configuration file"
+msgstr "Geçici dosya açılamadı"
+
+#: ../src/gtk-ui/sync-ui.c:3226
+#, fuzzy
+msgid "Failed to read configuration file"
+msgstr "Geçici dosya okumak için açılamadı"
+
+#: ../src/gtk-ui/sync-ui.c:3228
+#, fuzzy
+msgid "No configuration found"
+msgstr "Hiçbir eşleşme bulunamadı."
+
+#: ../src/gtk-ui/sync-ui.c:3230
+#, fuzzy
+msgid "No configuration file found"
+msgstr "XPM başlığı bulunamadı"
+
+#: ../src/gtk-ui/sync-ui.c:3232
+msgid "Server sent bad content"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3234
+msgid "Connection certificate has expired"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3236
+#, fuzzy
+msgid "Connection certificate is invalid"
+msgstr "Temel PNM resim türü geçersiz"
+
+#: ../src/gtk-ui/sync-ui.c:3244
+msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3251
+#, fuzzy
+msgid "The server URL is bad"
+msgstr "Adres bir _yansı listesi"
+
+#: ../src/gtk-ui/sync-ui.c:3256
+#, fuzzy
+msgid "The server was not found"
+msgstr "Paket bulunamadı"
+
+#: ../src/gtk-ui/sync-ui.c:3258
+#, c-format
+msgid "Error %d"
+msgstr "Hata: %d"
+
+#. TRANSLATORS: password request dialog contents: title, cancel button
+#. * and ok button
+#: ../src/gtk-ui/sync-ui.c:3396
+msgid "Password is required for sync"
+msgstr ""
+
+#: ../src/gtk-ui/sync-ui.c:3400
+#, fuzzy
+msgid "Sync with password"
+msgstr "Şifreyi girin"
+
+#. TRANSLATORS: password request dialog message, placeholder is service name
+#: ../src/gtk-ui/sync-ui.c:3410
+#, c-format
+msgid "Please enter password for syncing with %s:"
+msgstr ""
+
+#. title for the buttons on the right side of main view
+#: ../src/gtk-ui/ui.glade.h:2
+msgid "<b>Actions</b>"
+msgstr ""
+
+#. text between the two "start from scratch" buttons in emergency view
+#: ../src/gtk-ui/ui.glade.h:4
+msgid "<b>or</b>"
+msgstr "<b>ya da</b>"
+
+#: ../src/gtk-ui/ui.glade.h:5
+msgid "<big>Direct sync</big>"
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:6
+msgid "<big>Network sync</big>"
+msgstr "<big>Ağ senkronizasyonu</big>"
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:8
+msgid "<big>Restore from backup</big>"
+msgstr ""
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:10
+msgid "<big>Slow sync</big>"
+msgstr ""
+
+#. a title in emergency view
+#: ../src/gtk-ui/ui.glade.h:12
+msgid "<big>Start from scratch</big>"
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:13
+msgid ""
+"A slow sync compares items from both sides and tries to merge them. \n"
+"This may fail in some cases, leading to duplicates or lost information."
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:15
+msgid "Add new device"
+msgstr "Yeni cihaz ekle"
+
+#: ../src/gtk-ui/ui.glade.h:16
+msgid "Add new service"
+msgstr "Yeni servis ekle"
+
+#. explanation of "Restore backup" function
+#: ../src/gtk-ui/ui.glade.h:18
+msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:19
+msgid "Calendar"
+msgstr "Takvim"
+
+#. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines
+#: ../src/gtk-ui/ui.glade.h:21
+msgid ""
+"Change or edit\n"
+"sync service"
+msgstr ""
+
+#. close button for settings window
+#: ../src/gtk-ui/ui.glade.h:24
+msgid "Close"
+msgstr "Kapat"
+
+#: ../src/gtk-ui/ui.glade.h:25
+msgid ""
+"Delete all data on Zyb \n"
+"and replace with your\n"
+"local information"
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:28
+msgid ""
+"Delete all your local\n"
+"information and replace\n"
+"with data from Zyb"
+msgstr ""
+
+#. button in main view, right side. Keep length to 20 characters or so, use two lines if needed
+#: ../src/gtk-ui/ui.glade.h:32
+msgid ""
+"Fix a sync\n"
+"emergency"
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:34
+msgid ""
+"If you don't see your service above but know that your sync provider uses SyncML\n"
+"you can setup a service manually."
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:36
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: ../src/gtk-ui/ui.glade.h:39
+msgid "Sync Emergency"
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:41
+msgid ""
+"To sync you'll need a network connection and an account with a sync service.\n"
+"We support the following services: "
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:43
+msgid "Use Bluetooth to Sync your data from one device to another."
+msgstr ""
+
+#: ../src/gtk-ui/ui.glade.h:44
+msgid "You will need to add Bluetooth devices before they can be synced."
+msgstr ""
+
+#: ../src/gtk-ui/sync.desktop.in.h:2
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
+msgid "Up to date"
+msgstr "Güncel"
+
+#: ../src/gtk-ui/sync-gtk.desktop.in.h:1
+msgid "Sync (GTK)"
+msgstr "Seknronize et (GTK)"
+
+#: ../src/gtk-ui/sync-config-widget.c:78
+msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:81
+msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+msgstr ""
+
+#. TRANSLATORS: Please include the word "demo" (or the equivalent in
+#. your language): Funambol is going to be a 90 day demo service
+#. in the future
+#: ../src/gtk-ui/sync-config-widget.c:87
+msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:90
+msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:93
+msgid "ZYB is a simple way for people to store and share mobile information online."
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:96
+msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:192
+#, fuzzy
+msgid "Sorry, failed to save the configuration"
+msgstr "TIFF resmi kaydedilemedi"
+
+#: ../src/gtk-ui/sync-config-widget.c:381
+msgid "Service must have a name and server URL"
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:422
+#, c-format
+msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgstr ""
+
+#. TRANSLATORS: buttons in reset-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:426
+#, fuzzy
+msgid "Yes, reset"
+msgstr "Evet, sil"
+
+#: ../src/gtk-ui/sync-config-widget.c:427
+#: ../src/gtk-ui/sync-config-widget.c:438
+#, fuzzy
+msgid "No, keep settings"
+msgstr "Yeni bağlantı ayarları"
+
+#: ../src/gtk-ui/sync-config-widget.c:432
+#, c-format
+msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
+msgstr ""
+
+#. TRANSLATORS: buttons in delete-service warning dialog
+#: ../src/gtk-ui/sync-config-widget.c:437
+msgid "Yes, delete"
+msgstr "Evet, sil"
+
+#: ../src/gtk-ui/sync-config-widget.c:467
+#, fuzzy
+msgid "Reset settings"
+msgstr "Ağ ayarları"
+
+#: ../src/gtk-ui/sync-config-widget.c:470
+#, fuzzy
+msgid "Delete settings"
+msgstr "Ağ ayarları"
+
+#: ../src/gtk-ui/sync-config-widget.c:480
+#, fuzzy
+msgid "Save and use"
+msgstr "Önceki yazıtipini kullan"
+
+#: ../src/gtk-ui/sync-config-widget.c:483
+msgid ""
+"Save and replace\n"
+"current service"
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:493
+#, fuzzy
+msgid "Stop using device"
+msgstr "FCP cihazı ekle"
+
+#: ../src/gtk-ui/sync-config-widget.c:496
+#, fuzzy
+msgid "Stop using service"
+msgstr "3G servisi seçin"
+
+#. TRANSLATORS: label for an entry in service configuration form.
+#. * Placeholder is a source name.
+#. * Example: "Appointments URI"
+#: ../src/gtk-ui/sync-config-widget.c:679
+#, fuzzy, c-format
+msgid "%s URI"
+msgstr "Kaynak URI"
+
+#. TRANSLATORS: toggles in service configuration form, placeholder is service
+#. * or device name
+#: ../src/gtk-ui/sync-config-widget.c:854
+#, fuzzy, c-format
+msgid "Send changes to %s"
+msgstr "%s çalıştırılamadı: %s"
+
+#: ../src/gtk-ui/sync-config-widget.c:859
+#, fuzzy, c-format
+msgid "Receive changes from %s"
+msgstr "Sık Kullanılanlardan Çıkart"
+
+#: ../src/gtk-ui/sync-config-widget.c:875
+msgid "<b>Sync</b>"
+msgstr "<b>Senkronizasyon</b>"
+
+#. TRANSLATORS: label of a entry in service configuration
+#: ../src/gtk-ui/sync-config-widget.c:891
+#, fuzzy
+msgid "Server address"
+msgstr "IPv6 adresi:"
+
+#. TRANSLATORS: explanation before a device template combobox.
+#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
+#. * Client'
+#: ../src/gtk-ui/sync-config-widget.c:967
+#, c-format
+msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:973
+msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
+msgstr ""
+
+#: ../src/gtk-ui/sync-config-widget.c:1126
+#, fuzzy, c-format
+msgid "%s - Bluetooth device"
+msgstr "RAID Cihazı"
+
+#. TRANSLATORS: service title for services that are not based on a
+#. * template in service list, the placeholder is the name of the service
+#: ../src/gtk-ui/sync-config-widget.c:1132
+#, fuzzy, c-format
+msgid "%s - manually setup"
+msgstr "Adres kurulumu"
+
+#. TRANSLATORS: link button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1807
+#, fuzzy
+msgid "Launch website"
+msgstr "PackageKit Sitesi"
+
+#. TRANSLATORS: button in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1816
+#, fuzzy
+msgid "Setup now"
+msgstr "Şimdi Bul"
+
+#. TRANSLATORS: labels of entries in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1912
+msgid "Username"
+msgstr "Kullanıcı Adı"
+
+#: ../src/gtk-ui/sync-config-widget.c:1927
+msgid "Password"
+msgstr "Şifre"
+
+#. TRANSLATORS: warning in service configuration form for people
+#. who have modified the configuration via other means.
+#: ../src/gtk-ui/sync-config-widget.c:1950
+msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
+msgstr ""
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1969
+#, fuzzy
+msgid "Hide server settings"
+msgstr "Yeni bağlantı ayarları"
+
+#. TRANSLATORS: this is the epander label for server settings
+#. in service configuration form
+#: ../src/gtk-ui/sync-config-widget.c:1989
+#, fuzzy
+msgid "Show server settings"
+msgstr "Yeni bağlantı ayarları"
+
+#: ../src/gnome-bluetooth/syncevolution.c:110
+#, fuzzy
+msgid "Sync in the Sync application"
+msgstr "Oturumu Aç"
+
+#: ../src/syncevo-dbus-server.cpp:5667
+#, fuzzy, c-format
+msgid "%s is syncing"
+msgstr "Üzgünüz, %s çalışmıyor"
+
+#: ../src/syncevo-dbus-server.cpp:5668
+#, c-format
+msgid "We have just started to sync your computer with the %s sync service."
+msgstr ""
+
+#. if sync is successfully started and done
+#: ../src/syncevo-dbus-server.cpp:5682
+#, fuzzy, c-format
+msgid "%s sync complete"
+msgstr "Tamam, ancak tek değil"
+
+#: ../src/syncevo-dbus-server.cpp:5683
+#, c-format
+msgid "We have just finished syncing your computer with the %s sync service."
+msgstr ""
+
+#. if sync is successfully started and has errors, or not started successful with a fatal problem
+#: ../src/syncevo-dbus-server.cpp:5688
+msgid "Sync problem."
+msgstr "Senkronizasyon problemi."
+
+#: ../src/syncevo-dbus-server.cpp:5689
+msgid "Sorry, there's a problem with your sync that you need to attend to."
+msgstr ""
+
+#: ../src/syncevo-dbus-server.cpp:5762
+#, fuzzy
+msgid "View"
+msgstr "Dokümanları görüntüle"
+
+#. Use "default" as ID because that is what mutter-moblin
+#. recognizes: it then skips the action instead of adding it
+#. in addition to its own "Dismiss" button (always added).
+#: ../src/syncevo-dbus-server.cpp:5766
+#, fuzzy
+msgid "Dismiss"
+msgstr "Bırak"
+
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 5862c1dc..7de6cdc1 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -3,136 +3,135 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n"
-"POT-Creation-Date: 2010-04-05 09:22+0000\n"
+"POT-Creation-Date: 2010-05-12 09:27+0000\n"
"PO-Revision-Date: 2010-04-05 22:53+0800\n"
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
-"Language-Team: 正體中文 <kde-i18n-doc@kde.org>\n"
+"Language-Team: chinese-l10n <chinese-l10n@googlegroups.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Chinese\n"
-"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=2; plural=n!=1;\n"
-"X-Generator: Lokalize 1.0\n"
#. TRANSLATORS: this is the application name that may be used by e.g.
#. the windowmanager
-#: ../src/gtk-ui/main.c:40
-#: ../src/gtk-ui/ui.glade.h:38
+#: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38
#: ../src/gtk-ui/sync.desktop.in.h:1
#: ../src/gnome-bluetooth/syncevolution.c:112
msgid "Sync"
msgstr "同步"
-#: ../src/gtk-ui/sync-ui.c:260
+#: ../src/gtk-ui/sync-ui.c:266
msgid "Contacts"
msgstr "連絡人"
-#: ../src/gtk-ui/sync-ui.c:262
+#: ../src/gtk-ui/sync-ui.c:268
msgid "Appointments"
msgstr "約會"
-#: ../src/gtk-ui/sync-ui.c:264
-#: ../src/gtk-ui/ui.glade.h:40
+#: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40
msgid "Tasks"
msgstr "工作"
-#: ../src/gtk-ui/sync-ui.c:266
+#: ../src/gtk-ui/sync-ui.c:272
msgid "Notes"
msgstr "備註"
#. TRANSLATORS: This is a "combination source" for syncing with devices
#. * that combine appointments and tasks. the name should match the ones
#. * used for calendar and todo above
-#: ../src/gtk-ui/sync-ui.c:271
+#: ../src/gtk-ui/sync-ui.c:277
msgid "Appointments & Tasks"
msgstr "約會與工作"
-#: ../src/gtk-ui/sync-ui.c:343
+#: ../src/gtk-ui/sync-ui.c:349
msgid "Starting sync"
msgstr "正在開始同步"
#. TRANSLATORS: slow sync confirmation dialog message. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:381
+#: ../src/gtk-ui/sync-ui.c:387
#, c-format
msgid "Do you want to slow sync with %s?"
msgstr "您想要與 %s 進行慢速同步嗎?"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "Yes, do slow sync"
msgstr "是,執行慢速同步"
-#: ../src/gtk-ui/sync-ui.c:385
+#: ../src/gtk-ui/sync-ui.c:391
msgid "No, cancel sync"
msgstr "不,取消同步"
#. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:418
+#: ../src/gtk-ui/sync-ui.c:424
#, c-format
-msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised."
-msgstr "您要刪除所有本機資料,並使用 %s 上的資料取代它嗎?我們通常不建議這麼做。"
+msgid ""
+"Do you want to delete all local data and replace it with data from %s? This "
+"is not usually advised."
+msgstr ""
+"您要刪除所有本機資料,並使用 %s 上的資料取代它嗎?我們通常不建議這麼做。"
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
+#: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:460
msgid "Yes, delete and replace"
msgstr "是,刪除並取代"
-#: ../src/gtk-ui/sync-ui.c:423
-#: ../src/gtk-ui/sync-ui.c:454
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:460
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "No"
msgstr "否"
#. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder
#. * is service/device name
-#: ../src/gtk-ui/sync-ui.c:449
+#: ../src/gtk-ui/sync-ui.c:455
#, c-format
-msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised."
-msgstr "您要刪除所有在 %s 上的資料,並且使用本機資料取代它嗎?我們通常不建議這麼做。"
+msgid ""
+"Do you want to delete all data in %s and replace it with your local data? "
+"This is not usually advised."
+msgstr ""
+"您要刪除所有在 %s 上的資料,並且使用本機資料取代它嗎?我們通常不建議這麼做。"
-#: ../src/gtk-ui/sync-ui.c:481
+#: ../src/gtk-ui/sync-ui.c:487
msgid "Trying to cancel sync"
msgstr "正在嘗試取消同步"
-#: ../src/gtk-ui/sync-ui.c:521
+#: ../src/gtk-ui/sync-ui.c:529
msgid "No service or device selected"
msgstr "未選取服務或裝置"
#. TRANSLATORS: This is the title on main view. Placeholder is
#. * the service name. Example: "Google - synced just now"
-#: ../src/gtk-ui/sync-ui.c:529
+#: ../src/gtk-ui/sync-ui.c:537
#, c-format
msgid "%s - synced just now"
msgstr "%s - 剛才同步過"
-#: ../src/gtk-ui/sync-ui.c:533
+#: ../src/gtk-ui/sync-ui.c:541
#, c-format
msgid "%s - synced a minute ago"
msgstr "%s - 一分鐘前同步過"
-#: ../src/gtk-ui/sync-ui.c:537
+#: ../src/gtk-ui/sync-ui.c:545
#, c-format
msgid "%s - synced %ld minutes ago"
msgstr "%s - %ld 分鐘前同步過"
-#: ../src/gtk-ui/sync-ui.c:542
+#: ../src/gtk-ui/sync-ui.c:550
#, c-format
msgid "%s - synced an hour ago"
msgstr "%s - 一小時前同步過"
-#: ../src/gtk-ui/sync-ui.c:546
+#: ../src/gtk-ui/sync-ui.c:554
#, c-format
msgid "%s - synced %ld hours ago"
msgstr "%s - %ld 小時前同步過"
-#: ../src/gtk-ui/sync-ui.c:551
+#: ../src/gtk-ui/sync-ui.c:559
#, c-format
msgid "%s - synced a day ago"
msgstr "%s - 一天前同步過"
-#: ../src/gtk-ui/sync-ui.c:555
+#: ../src/gtk-ui/sync-ui.c:563
#, c-format
msgid "%s - synced %ld days ago"
msgstr "%s - %ld 天前同步過"
@@ -140,66 +139,68 @@ msgstr "%s - %ld 天前同步過"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "You've just restored a backup. The changes have not been "
#. * "synced with %s yet"
-#: ../src/gtk-ui/sync-ui.c:604
-#: ../src/gtk-ui/sync-ui.c:719
+#: ../src/gtk-ui/sync-ui.c:612 ../src/gtk-ui/sync-ui.c:726
msgid "Sync now"
msgstr "現在同步"
#. TRANSLATORS: Action button in info bar in main view. Shown with e.g.
#. * "A normal sync is not possible at this time..." message.
#. * "Other options" will open Emergency view
-#: ../src/gtk-ui/sync-ui.c:610
-#: ../src/gtk-ui/ui.glade.h:37
+#: ../src/gtk-ui/sync-ui.c:618 ../src/gtk-ui/ui.glade.h:37
msgid "Slow sync"
msgstr "慢速同步"
-#: ../src/gtk-ui/sync-ui.c:611
+#: ../src/gtk-ui/sync-ui.c:619
msgid "Other options..."
msgstr "其他選項..."
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * when no service is selected. Will open configuration view
-#: ../src/gtk-ui/sync-ui.c:616
+#: ../src/gtk-ui/sync-ui.c:624
msgid "Select sync service"
msgstr "選取同步服務"
#. TRANSLATORS: Action button in info bar in main view. Shown e.g.
#. * login to service fails. Will open configuration view for this service
-#: ../src/gtk-ui/sync-ui.c:621
+#: ../src/gtk-ui/sync-ui.c:629
msgid "Edit service settings"
msgstr "編輯服務設定"
-#: ../src/gtk-ui/sync-ui.c:670
-msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices."
-msgstr "您尚未選取同步服務或裝置。同步服務讓您在您的網路筆電與網路服務間同步您的資料。您也可以直接和一些裝置進行同步。"
+#: ../src/gtk-ui/sync-ui.c:700
+msgid ""
+"You haven't selected a sync service or device yet. Sync services let you "
+"synchronize your data between your netbook and a web service. You can also "
+"sync directly with some devices."
+msgstr ""
+"您尚未選取同步服務或裝置。同步服務讓您在您的網路筆電與網路服務間同步您的資"
+"料。您也可以直接和一些裝置進行同步。"
-#: ../src/gtk-ui/sync-ui.c:717
+#: ../src/gtk-ui/sync-ui.c:722
msgid "Sync again"
msgstr "再次同步"
-#: ../src/gtk-ui/sync-ui.c:730
+#: ../src/gtk-ui/sync-ui.c:743
msgid "Restoring"
msgstr "正在還原"
-#: ../src/gtk-ui/sync-ui.c:732
+#: ../src/gtk-ui/sync-ui.c:745
msgid "Syncing"
msgstr "正在同步中"
#. TRANSLATORS: This is for the button in main view, right side.
#. Keep line length below ~20 characters, use two lines if needed
-#: ../src/gtk-ui/sync-ui.c:743
-#: ../src/gtk-ui/sync-ui.c:3358
+#: ../src/gtk-ui/sync-ui.c:757 ../src/gtk-ui/sync-ui.c:3399
msgid "Cancel sync"
msgstr "取消同步"
-#: ../src/gtk-ui/sync-ui.c:908
+#: ../src/gtk-ui/sync-ui.c:922
msgid "Back to sync"
msgstr "返回同步"
#. TRANSLATORS: label for checkbutton/toggle in main view.
#. * Please stick to similar length strings or break the line with
#. * "\n" if absolutely needed
-#: ../src/gtk-ui/sync-ui.c:1209
+#: ../src/gtk-ui/sync-ui.c:1224
msgid "Automatic sync"
msgstr "自動同步"
@@ -207,61 +208,71 @@ msgstr "自動同步"
#. * currently selected data sources. First placeholder is service/device
#. * name, second a comma separeted list of sources.
#. * E.g. "Affected data: Google Contacts, Appointments"
-#: ../src/gtk-ui/sync-ui.c:1480
+#: ../src/gtk-ui/sync-ui.c:1519
#, c-format
msgid "Affected data: %s %s"
msgstr "受影響的資料:%s %s"
-#: ../src/gtk-ui/sync-ui.c:1485
+#: ../src/gtk-ui/sync-ui.c:1524
#, c-format
msgid "Affected data: none"
msgstr "受影響的資料:無"
#. TRANSLATORS: confirmation for restoring a backup. placeholder is the
#. * backup time string defined below
-#: ../src/gtk-ui/sync-ui.c:1563
+#: ../src/gtk-ui/sync-ui.c:1602
#, c-format
-msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost."
+msgid ""
+"Do you want to restore the backup from %s? All changes you have made since "
+"then will be lost."
msgstr "您想要還原來自 %s 的備份嗎?所有您從那時起的變更都會喪失。"
-#: ../src/gtk-ui/sync-ui.c:1566
+#: ../src/gtk-ui/sync-ui.c:1605
msgid "Yes, restore"
msgstr "是,還原"
#. TRANSLATORS: date/time for strftime(), used in emergency view backup
#. * label. Any time format that shows date and time is good.
-#: ../src/gtk-ui/sync-ui.c:1598
+#: ../src/gtk-ui/sync-ui.c:1637
#, c-format
msgid "%x %X"
msgstr "%x %X"
#. TRANSLATORS: label for a backup in emergency view. Placeholder is
#. * service or device name
-#: ../src/gtk-ui/sync-ui.c:1617
+#: ../src/gtk-ui/sync-ui.c:1656
#, c-format
msgid "Backed up before syncing with %s"
msgstr "在與 %s 同步前已備份"
-#: ../src/gtk-ui/sync-ui.c:1634
+#: ../src/gtk-ui/sync-ui.c:1673
msgid "Restore"
msgstr "還原"
#. TRANSLATORS: this is an explanation in Emergency view.
#. * Placeholder is a service/device name
-#: ../src/gtk-ui/sync-ui.c:1741
+#: ../src/gtk-ui/sync-ui.c:1780
#, c-format
-msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible."
-msgstr "與 %s 的一般同步目前無法使用。您可以執行慢速雙方同步,或是從零開始。您也可以從備份中還原,但是在一般同步可以使用之前,會需要慢速同步或從零開始。"
+msgid ""
+"A normal sync with %s is not possible at this time. You can do a slow two-"
+"way sync or start from scratch. You can also restore a backup, but a slow "
+"sync or starting from scratch will still be required before normal sync is "
+"possible."
+msgstr ""
+"與 %s 的一般同步目前無法使用。您可以執行慢速雙方同步,或是從零開始。您也可以"
+"從備份中還原,但是在一般同步可以使用之前,會需要慢速同步或從零開始。"
-#: ../src/gtk-ui/sync-ui.c:1751
+#: ../src/gtk-ui/sync-ui.c:1790
#, c-format
-msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup."
+msgid ""
+"If something has gone horribly wrong, you can try a slow sync, start from "
+"scratch or restore from backup."
msgstr "如果有東西發生可怕錯誤,您可以嘗試慢速同步、從零開始或是從備份還原。"
#. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a
#. * service/device name. Please don't use too long lines, but feel free to
#. * use several lines.
-#: ../src/gtk-ui/sync-ui.c:1760
+#: ../src/gtk-ui/sync-ui.c:1799
#, c-format
msgid ""
"Delete all your local\n"
@@ -272,7 +283,7 @@ msgstr ""
"資料並使用來自\n"
"%s 的資料取代"
-#: ../src/gtk-ui/sync-ui.c:1766
+#: ../src/gtk-ui/sync-ui.c:1805
#, c-format
msgid ""
"Delete all data on\n"
@@ -283,71 +294,72 @@ msgstr ""
"資料並使用您的本機\n"
"資料取代"
-#: ../src/gtk-ui/sync-ui.c:2226
+#: ../src/gtk-ui/sync-ui.c:2267
msgid "Failed to get list of supported services from SyncEvolution"
msgstr "從 SyncEvolution 取得支援的服務清單時失敗"
-#: ../src/gtk-ui/sync-ui.c:2280
-msgid "There was a problem communicating with the sync process. Please try again later."
+#: ../src/gtk-ui/sync-ui.c:2321
+msgid ""
+"There was a problem communicating with the sync process. Please try again "
+"later."
msgstr "與同步程序溝通成有錯誤發生。請稍候重試。"
-#: ../src/gtk-ui/sync-ui.c:2339
+#: ../src/gtk-ui/sync-ui.c:2380
msgid "Restore failed"
msgstr "還原失敗"
-#: ../src/gtk-ui/sync-ui.c:2342
-#: ../src/gtk-ui/sync-ui.c:3227
+#: ../src/gtk-ui/sync-ui.c:2383 ../src/gtk-ui/sync-ui.c:3268
msgid "Sync failed"
msgstr "同步失敗"
-#: ../src/gtk-ui/sync-ui.c:2348
+#: ../src/gtk-ui/sync-ui.c:2389
msgid "Restore complete"
msgstr "還原完成"
-#: ../src/gtk-ui/sync-ui.c:2351
+#: ../src/gtk-ui/sync-ui.c:2392
msgid "Sync complete"
msgstr "同步完成"
-#: ../src/gtk-ui/sync-ui.c:2443
+#: ../src/gtk-ui/sync-ui.c:2484
#, c-format
msgid "Preparing '%s'"
msgstr "正在準備「%s」"
-#: ../src/gtk-ui/sync-ui.c:2446
+#: ../src/gtk-ui/sync-ui.c:2487
#, c-format
msgid "Receiving '%s'"
msgstr "正在接收「%s」"
-#: ../src/gtk-ui/sync-ui.c:2449
+#: ../src/gtk-ui/sync-ui.c:2490
#, c-format
msgid "Sending '%s'"
msgstr "正在傳送「%s」"
-#: ../src/gtk-ui/sync-ui.c:2570
+#: ../src/gtk-ui/sync-ui.c:2611
#, c-format
msgid "There was one remote rejection."
msgid_plural "There were %ld remote rejections."
msgstr[0] "有過一次遠端拒絕。"
msgstr[1] "有過 %ld 次遠端拒絕。"
-#: ../src/gtk-ui/sync-ui.c:2575
+#: ../src/gtk-ui/sync-ui.c:2616
#, c-format
msgid "There was one local rejection."
msgid_plural "There were %ld local rejections."
msgstr[0] "有過一次本機拒絕。"
msgstr[1] "有過 %ld 次本機拒絕。"
-#: ../src/gtk-ui/sync-ui.c:2580
+#: ../src/gtk-ui/sync-ui.c:2621
#, c-format
msgid "There were %ld local rejections and %ld remote rejections."
msgstr "有過 %ld 次本機拒絕和 %ld 次遠端拒絕。"
-#: ../src/gtk-ui/sync-ui.c:2585
+#: ../src/gtk-ui/sync-ui.c:2626
#, c-format
msgid "Last time: No changes."
msgstr "上次:沒有變更。"
-#: ../src/gtk-ui/sync-ui.c:2587
+#: ../src/gtk-ui/sync-ui.c:2628
#, c-format
msgid "Last time: Sent one change."
msgid_plural "Last time: Sent %ld changes."
@@ -357,21 +369,21 @@ msgstr[1] "上次:傳送了 %ld 個變更。"
#. This is about changes made to the local data. Not all of these
#. changes were requested by the remote server, so "applied"
#. is a better word than "received" (bug #5185).
-#: ../src/gtk-ui/sync-ui.c:2595
+#: ../src/gtk-ui/sync-ui.c:2636
#, c-format
msgid "Last time: Applied one change."
msgid_plural "Last time: Applied %ld changes."
msgstr[0] "上次:套用了一個變更。"
msgstr[1] "上次:套用了 %ld 個變更。"
-#: ../src/gtk-ui/sync-ui.c:2600
+#: ../src/gtk-ui/sync-ui.c:2641
#, c-format
msgid "Last time: Applied %ld changes and sent %ld changes."
msgstr "上次:套用了 %ld 個變更並傳送了 %ld 個變更。"
#. TRANSLATORS: the placeholder is a error message (hopefully)
#. * explaining the problem
-#: ../src/gtk-ui/sync-ui.c:2807
+#: ../src/gtk-ui/sync-ui.c:2848
#, c-format
msgid ""
"There was a problem with last sync:\n"
@@ -380,124 +392,137 @@ msgstr ""
"上次同步有錯誤發生:\n"
"%s"
-#: ../src/gtk-ui/sync-ui.c:2817
+#: ../src/gtk-ui/sync-ui.c:2858
#, c-format
-msgid "You've just restored a backup. The changes have not been synced with %s yet"
+msgid ""
+"You've just restored a backup. The changes have not been synced with %s yet"
msgstr "您剛才已經還原一份備份。這些變更尚未與 %s 同步"
-#: ../src/gtk-ui/sync-ui.c:3105
+#: ../src/gtk-ui/sync-ui.c:3146
msgid "Waiting for current operation to finish..."
msgstr "正在等候目前的操作完成..."
#. TRANSLATORS: next strings are error messages.
-#: ../src/gtk-ui/sync-ui.c:3139
-msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data."
-msgstr "一般同步目前無法使用。這台伺服器建議使用慢速同步,但這可能不總是您想要的,因為雙方可能都已經有資料。"
+#: ../src/gtk-ui/sync-ui.c:3180
+msgid ""
+"A normal sync is not possible at this time. The server suggests a slow sync, "
+"but this might not always be what you want if both ends already have data."
+msgstr ""
+"一般同步目前無法使用。這台伺服器建議使用慢速同步,但這可能不總是您想要的,因"
+"為雙方可能都已經有資料。"
-#: ../src/gtk-ui/sync-ui.c:3143
+#: ../src/gtk-ui/sync-ui.c:3184
msgid "The sync process died unexpectedly."
msgstr "同步程序在沒有預期的情況下終止了。"
-#: ../src/gtk-ui/sync-ui.c:3148
-msgid "Password request was not answered. You can save the password in the settings to prevent the request."
+#: ../src/gtk-ui/sync-ui.c:3189
+msgid ""
+"Password request was not answered. You can save the password in the settings "
+"to prevent the request."
msgstr "密碼請求沒有回應。您可以在設定值內儲存密碼來略過請求。"
#. TODO use the service device name here, this is a remote problem
-#: ../src/gtk-ui/sync-ui.c:3152
+#: ../src/gtk-ui/sync-ui.c:3193
msgid "There was a problem processing sync request. Trying again may help."
msgstr "同步請發生問題。重試一次可能會有幫助。"
-#: ../src/gtk-ui/sync-ui.c:3158
-msgid "Failed to login. Could there be a problem with your username or password?"
+#: ../src/gtk-ui/sync-ui.c:3199
+msgid ""
+"Failed to login. Could there be a problem with your username or password?"
msgstr "登入失敗。您的使用者名稱或密碼是否有問題?"
-#: ../src/gtk-ui/sync-ui.c:3161
+#: ../src/gtk-ui/sync-ui.c:3202
msgid "Forbidden"
msgstr "禁止"
#. TRANSLATORS: data source means e.g. calendar or addressbook
-#: ../src/gtk-ui/sync-ui.c:3167
-msgid "A data source could not be found. Could there be a problem with the settings?"
+#: ../src/gtk-ui/sync-ui.c:3208
+msgid ""
+"A data source could not be found. Could there be a problem with the settings?"
msgstr "無法找到資料來源。設定值是否有問題?"
-#: ../src/gtk-ui/sync-ui.c:3171
+#: ../src/gtk-ui/sync-ui.c:3212
msgid "Remote database error"
msgstr "遠端資料庫錯誤"
#. This can happen when EDS is borked, restart it may help...
-#: ../src/gtk-ui/sync-ui.c:3174
-msgid "There is a problem with the local database. Syncing again or rebooting may help."
+#: ../src/gtk-ui/sync-ui.c:3215
+msgid ""
+"There is a problem with the local database. Syncing again or rebooting may "
+"help."
msgstr "本機資料庫有問題。再次同步或是重新開機可能會有所幫助。"
-#: ../src/gtk-ui/sync-ui.c:3177
+#: ../src/gtk-ui/sync-ui.c:3218
msgid "No space on disk"
msgstr "磁碟沒有空間"
-#: ../src/gtk-ui/sync-ui.c:3179
+#: ../src/gtk-ui/sync-ui.c:3220
msgid "Failed to process SyncML"
msgstr "進行 SyncML 動作失敗"
-#: ../src/gtk-ui/sync-ui.c:3181
+#: ../src/gtk-ui/sync-ui.c:3222
msgid "Server authorization failed"
msgstr "伺服器授權失敗"
-#: ../src/gtk-ui/sync-ui.c:3183
+#: ../src/gtk-ui/sync-ui.c:3224
msgid "Failed to parse configuration file"
msgstr "解析設置檔案動作失敗"
-#: ../src/gtk-ui/sync-ui.c:3185
+#: ../src/gtk-ui/sync-ui.c:3226
msgid "Failed to read configuration file"
msgstr "讀取設置檔案動作失敗"
-#: ../src/gtk-ui/sync-ui.c:3187
+#: ../src/gtk-ui/sync-ui.c:3228
msgid "No configuration found"
msgstr "未找到設置"
-#: ../src/gtk-ui/sync-ui.c:3189
+#: ../src/gtk-ui/sync-ui.c:3230
msgid "No configuration file found"
msgstr "未找到設置檔案"
-#: ../src/gtk-ui/sync-ui.c:3191
+#: ../src/gtk-ui/sync-ui.c:3232
msgid "Server sent bad content"
msgstr "伺服器傳送出壞的內容"
-#: ../src/gtk-ui/sync-ui.c:3193
+#: ../src/gtk-ui/sync-ui.c:3234
msgid "Connection certificate has expired"
msgstr "連線憑證己過期"
-#: ../src/gtk-ui/sync-ui.c:3195
+#: ../src/gtk-ui/sync-ui.c:3236
msgid "Connection certificate is invalid"
msgstr "連線憑證無效"
-#: ../src/gtk-ui/sync-ui.c:3203
-msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings."
+#: ../src/gtk-ui/sync-ui.c:3244
+msgid ""
+"We were unable to connect to the server. The problem could be temporary or "
+"there could be something wrong with the settings."
msgstr "我們無法連接到伺服器。問題可能是暫時的,或是伺服器的設定值可能有問題。"
-#: ../src/gtk-ui/sync-ui.c:3210
+#: ../src/gtk-ui/sync-ui.c:3251
msgid "The server URL is bad"
msgstr "伺服器的 URL 不對"
-#: ../src/gtk-ui/sync-ui.c:3215
+#: ../src/gtk-ui/sync-ui.c:3256
msgid "The server was not found"
msgstr "找不到伺服器"
-#: ../src/gtk-ui/sync-ui.c:3217
+#: ../src/gtk-ui/sync-ui.c:3258
#, c-format
msgid "Error %d"
msgstr "錯誤 %d"
#. TRANSLATORS: password request dialog contents: title, cancel button
#. * and ok button
-#: ../src/gtk-ui/sync-ui.c:3355
+#: ../src/gtk-ui/sync-ui.c:3396
msgid "Password is required for sync"
msgstr "同步需要密碼"
-#: ../src/gtk-ui/sync-ui.c:3359
+#: ../src/gtk-ui/sync-ui.c:3400
msgid "Sync with password"
msgstr "使用密碼進行同步"
#. TRANSLATORS: password request dialog message, placeholder is service name
-#: ../src/gtk-ui/sync-ui.c:3369
+#: ../src/gtk-ui/sync-ui.c:3410
#, c-format
msgid "Please enter password for syncing with %s:"
msgstr "請輸入使用 %s 進行同步的密碼:"
@@ -553,8 +578,12 @@ msgstr "新增服務"
#. explanation of "Restore backup" function
#: ../src/gtk-ui/ui.glade.h:18
-msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost."
-msgstr "在我們每次同步前都會進行備份。選擇要還原的備份。所有您從那時起的變更都會喪失。"
+msgid ""
+"Backups are made before every time we Sync. Choose a backup to restore. Any "
+"changes you have made since then will be lost."
+msgstr ""
+"在我們每次同步前都會進行備份。選擇要還原的備份。所有您從那時起的變更都會喪"
+"失。"
#: ../src/gtk-ui/ui.glade.h:19
msgid "Calendar"
@@ -599,10 +628,12 @@ msgstr ""
#: ../src/gtk-ui/ui.glade.h:34
msgid ""
-"If you don't see your service above but know that your sync provider uses SyncML\n"
+"If you don't see your service above but know that your sync provider uses "
+"SyncML\n"
"you can setup a service manually."
msgstr ""
-"如果您在上方沒有看到您的服務,但是您知道您的同步功能供應廠商使用 SyncML 的話,\n"
+"如果您在上方沒有看到您的服務,但是您知道您的同步功能供應廠商使用 SyncML 的"
+"話,\n"
"您可以手動設定服務。"
#: ../src/gtk-ui/ui.glade.h:36
@@ -615,7 +646,8 @@ msgstr "同步緊急狀況"
#: ../src/gtk-ui/ui.glade.h:41
msgid ""
-"To sync you'll need a network connection and an account with a sync service.\n"
+"To sync you'll need a network connection and an account with a sync "
+"service.\n"
"We support the following services: "
msgstr ""
"若要同步,您需要有網路連線以及使用同步服務的帳號。\n"
@@ -629,8 +661,7 @@ msgstr "使用藍牙從某裝置同步您的資料到另一個裝置去。"
msgid "You will need to add Bluetooth devices before they can be synced."
msgstr "在它們能被同步前,您需要先加入藍牙裝置。"
-#: ../src/gtk-ui/sync.desktop.in.h:2
-#: ../src/gtk-ui/sync-gtk.desktop.in.h:2
+#: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2
msgid "Up to date"
msgstr "已是最新"
@@ -638,79 +669,96 @@ msgstr "已是最新"
msgid "Sync (GTK)"
msgstr "同步 (GTK)"
-#: ../src/gtk-ui/sync-config-widget.c:74
-msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync."
+#: ../src/gtk-ui/sync-config-widget.c:78
+msgid ""
+"ScheduleWorld enables you to keep your contacts, events, tasks, and notes in "
+"sync."
msgstr "ScheduleWorld 可以讓您的連絡人、行事曆事項、工作、以及註記保持同步。"
-#: ../src/gtk-ui/sync-config-widget.c:77
-msgid "Google Sync can backup and synchronize your contacts with your Gmail contacts."
+#: ../src/gtk-ui/sync-config-widget.c:81
+msgid ""
+"Google Sync can backup and synchronize your contacts with your Gmail "
+"contacts."
msgstr "Google Sync 可以將您的聯絡人和 Gmail 連絡人進行備份以及同步。"
#. TRANSLATORS: Please include the word "demo" (or the equivalent in
#. your language): Funambol is going to be a 90 day demo service
#. in the future
-#: ../src/gtk-ui/sync-config-widget.c:83
-msgid "Backup your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)."
+#: ../src/gtk-ui/sync-config-widget.c:87
+msgid ""
+"Backup your contacts and calendar. Sync with a single click, anytime, "
+"anywhere (DEMO)."
msgstr "備份您的連絡人與行事曆。一個按鍵就同步,任何時間、任何地點(樣本)。"
-#: ../src/gtk-ui/sync-config-widget.c:86
-msgid "Mobical Backup and Restore service allows you to securely backup your personal mobile data for free."
+#: ../src/gtk-ui/sync-config-widget.c:90
+msgid ""
+"Mobical Backup and Restore service allows you to securely backup your "
+"personal mobile data for free."
msgstr "Mobical 備份與還原服務讓您可以安全地備份個人行動資料,而且免費。"
-#: ../src/gtk-ui/sync-config-widget.c:89
-msgid "ZYB is a simple way for people to store and share mobile information online."
+#: ../src/gtk-ui/sync-config-widget.c:93
+msgid ""
+"ZYB is a simple way for people to store and share mobile information online."
msgstr "ZYB 是人們儲存與線上分享行動資訊的一種簡單方法。"
-#: ../src/gtk-ui/sync-config-widget.c:92
-msgid "Memotoo lets you access your personal data from any computer connected to the Internet."
+#: ../src/gtk-ui/sync-config-widget.c:96
+msgid ""
+"Memotoo lets you access your personal data from any computer connected to "
+"the Internet."
msgstr "Memotoo 能讓您從任何連接到網路的電腦存取您的個人資料。"
-#: ../src/gtk-ui/sync-config-widget.c:188
+#: ../src/gtk-ui/sync-config-widget.c:192
msgid "Sorry, failed to save the configuration"
msgstr "很抱歉,儲存設定檔失敗"
-#: ../src/gtk-ui/sync-config-widget.c:377
+#: ../src/gtk-ui/sync-config-widget.c:381
msgid "Service must have a name and server URL"
msgstr "服務項目必須要有一個名稱和伺服器網址"
-#: ../src/gtk-ui/sync-config-widget.c:418
+#: ../src/gtk-ui/sync-config-widget.c:422
#, c-format
-msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end."
+msgid ""
+"Do you want to reset the settings for %s? This will not remove any synced "
+"information on either end."
msgstr "您想要為 %s 重設設定嗎?這不會移除任何兩方同步過的資訊。"
#. TRANSLATORS: buttons in reset-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:422
+#: ../src/gtk-ui/sync-config-widget.c:426
msgid "Yes, reset"
msgstr "是,重設"
-#: ../src/gtk-ui/sync-config-widget.c:423
-#: ../src/gtk-ui/sync-config-widget.c:434
+#: ../src/gtk-ui/sync-config-widget.c:427
+#: ../src/gtk-ui/sync-config-widget.c:438
msgid "No, keep settings"
msgstr "不,維持設定"
-#: ../src/gtk-ui/sync-config-widget.c:428
+#: ../src/gtk-ui/sync-config-widget.c:432
#, c-format
-msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings."
-msgstr "您想要為 %s 刪除設定值嗎?這不會移除任何兩端同步過的資訊,但是它會移除這些設定值。"
+msgid ""
+"Do you want to delete the settings for %s? This will not remove any synced "
+"information on either end but it will remove these settings."
+msgstr ""
+"您想要為 %s 刪除設定值嗎?這不會移除任何兩端同步過的資訊,但是它會移除這些設"
+"定值。"
#. TRANSLATORS: buttons in delete-service warning dialog
-#: ../src/gtk-ui/sync-config-widget.c:433
+#: ../src/gtk-ui/sync-config-widget.c:437
msgid "Yes, delete"
msgstr "是,刪除"
-#: ../src/gtk-ui/sync-config-widget.c:463
+#: ../src/gtk-ui/sync-config-widget.c:467
msgid "Reset settings"
msgstr "重設設定值"
-#: ../src/gtk-ui/sync-config-widget.c:466
+#: ../src/gtk-ui/sync-config-widget.c:470
msgid "Delete settings"
msgstr "刪除設定值"
-#: ../src/gtk-ui/sync-config-widget.c:476
+#: ../src/gtk-ui/sync-config-widget.c:480
msgid "Save and use"
msgstr "儲存並使用"
-#: ../src/gtk-ui/sync-config-widget.c:479
+#: ../src/gtk-ui/sync-config-widget.c:483
msgid ""
"Save and replace\n"
"current service"
@@ -718,101 +766,113 @@ msgstr ""
"儲存並取代\n"
"目前的服務"
-#: ../src/gtk-ui/sync-config-widget.c:489
+#: ../src/gtk-ui/sync-config-widget.c:493
msgid "Stop using device"
msgstr "停止使用裝置"
-#: ../src/gtk-ui/sync-config-widget.c:492
+#: ../src/gtk-ui/sync-config-widget.c:496
msgid "Stop using service"
msgstr "停止使用服務"
#. TRANSLATORS: label for an entry in service configuration form.
#. * Placeholder is a source name.
#. * Example: "Appointments URI"
-#: ../src/gtk-ui/sync-config-widget.c:675
+#: ../src/gtk-ui/sync-config-widget.c:679
#, c-format
msgid "%s URI"
msgstr "%s URI"
#. TRANSLATORS: toggles in service configuration form, placeholder is service
#. * or device name
-#: ../src/gtk-ui/sync-config-widget.c:850
+#: ../src/gtk-ui/sync-config-widget.c:854
#, c-format
msgid "Send changes to %s"
msgstr "傳送變更到 %s"
-#: ../src/gtk-ui/sync-config-widget.c:855
+#: ../src/gtk-ui/sync-config-widget.c:859
#, c-format
msgid "Receive changes from %s"
msgstr "接收來自 %s 的變更"
-#: ../src/gtk-ui/sync-config-widget.c:871
+#: ../src/gtk-ui/sync-config-widget.c:875
msgid "<b>Sync</b>"
msgstr "<b>同步</b>"
#. TRANSLATORS: label of a entry in service configuration
-#: ../src/gtk-ui/sync-config-widget.c:887
+#: ../src/gtk-ui/sync-config-widget.c:891
msgid "Server address"
msgstr "伺服器位址"
#. TRANSLATORS: explanation before a device template combobox.
#. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution
#. * Client'
-#: ../src/gtk-ui/sync-config-widget.c:963
+#: ../src/gtk-ui/sync-config-widget.c:967
#, c-format
-msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed"
-msgstr "此裝置看起來可能是「%s」。如果不正確的話,請查看支援裝置的清單,如果它列於其中的話請選取您的裝置。"
+msgid ""
+"This device looks like it might be a '%s'. If this is not correct, please "
+"take a look at the list of supported devices and pick yours if it is listed"
+msgstr ""
+"此裝置看起來可能是「%s」。如果不正確的話,請查看支援裝置的清單,如果它列於其"
+"中的話請選取您的裝置。"
-#: ../src/gtk-ui/sync-config-widget.c:969
-msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed"
-msgstr "我們不知道此裝置到底是什麼。請查看支援裝置的清單,如果它列於其中的話請選取您的裝置。"
+#: ../src/gtk-ui/sync-config-widget.c:973
+msgid ""
+"We don't know what this device is exactly. Please take a look at the list of "
+"supported devices and pick yours if it is listed"
+msgstr ""
+"我們不知道此裝置到底是什麼。請查看支援裝置的清單,如果它列於其中的話請選取您"
+"的裝置。"
-#: ../src/gtk-ui/sync-config-widget.c:1122
+#: ../src/gtk-ui/sync-config-widget.c:1126
#, c-format
msgid "%s - Bluetooth device"
msgstr "%s - 藍牙裝置"
#. TRANSLATORS: service title for services that are not based on a
#. * template in service list, the placeholder is the name of the service
-#: ../src/gtk-ui/sync-config-widget.c:1128
+#: ../src/gtk-ui/sync-config-widget.c:1132
#, c-format
msgid "%s - manually setup"
msgstr "%s - 手動設置"
#. TRANSLATORS: link button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1803
+#: ../src/gtk-ui/sync-config-widget.c:1807
msgid "Launch website"
msgstr "開啟網站"
#. TRANSLATORS: button in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1812
+#: ../src/gtk-ui/sync-config-widget.c:1816
msgid "Setup now"
msgstr "立刻設置"
#. TRANSLATORS: labels of entries in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1908
+#: ../src/gtk-ui/sync-config-widget.c:1912
msgid "Username"
msgstr "使用者名稱"
-#: ../src/gtk-ui/sync-config-widget.c:1923
+#: ../src/gtk-ui/sync-config-widget.c:1927
msgid "Password"
msgstr "密碼"
#. TRANSLATORS: warning in service configuration form for people
#. who have modified the configuration via other means.
-#: ../src/gtk-ui/sync-config-widget.c:1946
-msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration."
-msgstr "目前的設定檔比這裡能夠顯示的還要複雜許多。變更為同步模式或是同步過的資料類型將會覆蓋寫入那份設定檔。"
+#: ../src/gtk-ui/sync-config-widget.c:1950
+msgid ""
+"Current configuration is more complex than what can be shown here. Changes "
+"to sync mode or synced data types will overwrite that configuration."
+msgstr ""
+"目前的設定檔比這裡能夠顯示的還要複雜許多。變更為同步模式或是同步過的資料類型"
+"將會覆蓋寫入那份設定檔。"
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1965
+#: ../src/gtk-ui/sync-config-widget.c:1969
msgid "Hide server settings"
msgstr "隱藏伺服器設定"
#. TRANSLATORS: this is the epander label for server settings
#. in service configuration form
-#: ../src/gtk-ui/sync-config-widget.c:1985
+#: ../src/gtk-ui/sync-config-widget.c:1989
msgid "Show server settings"
msgstr "顯示伺服器設定"
@@ -820,41 +880,44 @@ msgstr "顯示伺服器設定"
msgid "Sync in the Sync application"
msgstr "在「同步」應用程式內同步"
-#: ../src/syncevo-dbus-server.cpp:5622
+#: ../src/syncevo-dbus-server.cpp:5664
#, c-format
msgid "%s is syncing"
msgstr "%s 正在同步中"
-#: ../src/syncevo-dbus-server.cpp:5623
+#: ../src/syncevo-dbus-server.cpp:5665
#, c-format
msgid "We have just started to sync your computer with the %s sync service."
msgstr "我們剛開始將您的電腦同步到 %s 同步服務。"
#. if sync is successfully started and done
-#: ../src/syncevo-dbus-server.cpp:5637
+#: ../src/syncevo-dbus-server.cpp:5679
#, c-format
msgid "%s sync complete"
msgstr "%s 同步完成"
-#: ../src/syncevo-dbus-server.cpp:5638
+#: ../src/syncevo-dbus-server.cpp:5680
#, c-format
msgid "We have just finished syncing your computer with the %s sync service."
msgstr "我們剛完成將您的電腦同步到 %s 同步服務。"
#. if sync is successfully started and has errors, or not started successful with a fatal problem
-#: ../src/syncevo-dbus-server.cpp:5643
+#: ../src/syncevo-dbus-server.cpp:5685
msgid "Sync problem."
msgstr "同步發生問題。"
-#: ../src/syncevo-dbus-server.cpp:5644
+#: ../src/syncevo-dbus-server.cpp:5686
msgid "Sorry, there's a problem with your sync that you need to attend to."
msgstr "抱歉,您的同步有個問題是您需要關心的。"
-#: ../src/syncevo-dbus-server.cpp:5717
+#: ../src/syncevo-dbus-server.cpp:5759
msgid "View"
msgstr "檢視"
-#: ../src/syncevo-dbus-server.cpp:5718
+#. Use "default" as ID because that is what mutter-moblin
+#. recognizes: it then skips the action instead of adding it
+#. in addition to its own "Dismiss" button (always added).
+#: ../src/syncevo-dbus-server.cpp:5763
msgid "Dismiss"
msgstr "摒棄"
@@ -864,85 +927,122 @@ msgstr "摒棄"
#~ msgstr ""
#~ "您想要把 %s 用 %s 取代掉嗎?這不會移除兩方任何同步過的資訊,但是您將無法再"
#~ "與 %s 進行同步。"
+
#~ msgid "Yes, use %s"
#~ msgstr "是,使用 %s"
+
#~ msgid "No, use %s"
#~ msgstr "是,使用 %s"
+
#~ msgid "Database error"
#~ msgstr "數據錯誤"
+
#~ msgid "Reset service"
#~ msgstr "重設服務"
+
#~ msgid "Todo"
#~ msgstr "要做的事"
+
#~ msgid "Memo"
#~ msgstr "備忘錄"
+
#~ msgid "Failed to abort sync"
#~ msgstr "放棄同步時失敗"
+
#~ msgid "Failed to start sync"
#~ msgstr "開始同步動作失敗"
+
#~ msgid "%s (not supported by this service)"
#~ msgstr "%s (不被此服務支援)"
+
#~ msgid "Failed to get list of configured services from SyncEvolution"
#~ msgstr "從 SyncEvolution 取得已設定的服務清單時失敗"
+
#~ msgid "Not authorized"
#~ msgstr "未授權"
+
#~ msgid "Not found"
#~ msgstr "未找到"
+
#~ msgid "Transport failure (no connection?)"
#~ msgstr "傳輸失敗(沒有連線?)"
+
#~ msgid "Connection timed out"
#~ msgstr "連線時間已過"
+
#~ msgid "Connection failed"
#~ msgstr "連線失敗"
+
#~ msgid "<b>No sync service in use</b>"
#~ msgstr "<b>沒有使用中的同步服務</b>"
+
#~ msgid "<big>Manual setup</big>"
#~ msgstr "<big>手動設置</big>"
+
#~ msgid "Merge local and remote data (recommended)"
#~ msgstr "合併本地和遠端資料(建議)"
+
#~ msgid ""
#~ "Sorry, you need an internet\n"
#~ "connection to sync."
#~ msgstr ""
#~ "抱歉,您需要有網際網路連線\n"
#~ "才能同步。"
+
#~ msgid ""
#~ "Synchronization is not available (D-Bus service does not answer), sorry."
#~ msgstr "非常抱歉,因為 D-Bus 服務沒有回應,所以無法提供同步化。"
+
#~ msgid "Server URL"
#~ msgstr "伺服器 URL"
+
#~ msgid "Addressbook"
#~ msgstr "地址簿"
+
#~ msgid "Failed to save current service in GConf configuration system"
#~ msgstr "在 GConf 設定系統上儲存目前服務時失敗"
+
#~ msgid "Failed to save service configuration to SyncEvolution"
#~ msgstr "儲存服務設定檔到 SyncEvolution 時失敗"
+
#~ msgid "Failed to get service configuration from SyncEvolution"
#~ msgstr "從 SyncEvolution 取得服務設定檔時失敗"
+
#~ msgid "Failed to remove service configuration from SyncEvolution"
#~ msgstr "從 SyncEvolution 移除服務設定檔時失敗"
+
#~ msgid "Failed to cancel: sync was no longer in progress"
#~ msgstr "取消動作失敗:同步不再進行"
+
#~ msgid "Failed to cancel sync"
#~ msgstr "取消同步動作失敗"
+
#~ msgid "Canceling sync"
#~ msgstr "正在取消同步"
+
#~ msgid "No sources are enabled, not syncing"
#~ msgstr "沒有啟用的來源,無法同步"
+
#~ msgid "A sync is already in progress"
#~ msgstr "已經有同步在進行當中"
+
#~ msgid "Failed to get server configuration from SyncEvolution"
#~ msgstr "從 SyncEvolution 取得伺服器設定檔時失敗"
+
#~ msgid "Failed to get list of manually setup services from SyncEvolution"
#~ msgstr "從 SyncEvolution 取得手動設置服務的清單時失敗"
+
#~ msgid "Service configuration not found"
#~ msgstr "找不到服務設定檔"
+
#~ msgid "Sync canceled"
#~ msgstr "同步已取消"
+
#~ msgid "Ending sync"
#~ msgstr "正在結束同步"
+
#~ msgid "Reset original server settings"
#~ msgstr "重置為原始的伺服器設定"
+
#~ msgid "Bring your data with you"
#~ msgstr "請帶攜您的數據"
-
diff --git a/src/Makefile-gen.am b/src/Makefile-gen.am
index 701e1595..c75041fc 100644
--- a/src/Makefile-gen.am
+++ b/src/Makefile-gen.am
@@ -35,7 +35,12 @@ SUBDIRS += $(SYNTHESIS_SUBDIR_INCLUDES)
endif
if COND_GUI
SUBDIRS += dbus gtk-ui
+else
+if COND_DOC
+SUBDIRS += dbus
+endif
endif
+
DIST_SUBDIRS = gdbus dbus syncevo $(BACKENDS) gtk-ui gnome-bluetooth synthesis-includes
AM_CPPFLAGS = $(SUBDIRS:%=-I$(srcdir)/%) -I$(srcdir)/../test -I$(top_srcdir) $(BACKEND_CPPFLAGS)
@@ -212,22 +217,12 @@ nodist_client_test_SOURCES = ../test/test.cpp
CLIENT_LIB_TEST_FILES = \
testcases/lcs/file1.txt \
testcases/lcs/file2.txt \
- testcases/templates/clients/SyncEvolution/sources/addressbook/config.ini \
- testcases/templates/clients/SyncEvolution/sources/memo/config.ini \
- testcases/templates/clients/SyncEvolution/sources/todo/config.ini \
- testcases/templates/clients/SyncEvolution/sources/calendar/config.ini \
- testcases/templates/clients/SyncEvolution/template.ini \
- testcases/templates/clients/SyncEvolution/config.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/template.ini \
- testcases/templates/clients/phone/nokia/S40/7210c/config.ini \
+ testcases/templates/clients/SyncEvolution.ini \
+ testcases/templates/clients/phone/nokia/S40/7210c.ini \
testcases/vcard21.vcf \
testcases/vcard30.vcf \
testcases/ical20.ics \
+ testcases/ical20.ics.local \
testcases/imemo20.ics \
testcases/itodo20.ics
diff --git a/src/backends/evolution/EvolutionCalendarSource.cpp b/src/backends/evolution/EvolutionCalendarSource.cpp
index 9dff32d9..5936cb31 100644
--- a/src/backends/evolution/EvolutionCalendarSource.cpp
+++ b/src/backends/evolution/EvolutionCalendarSource.cpp
@@ -429,9 +429,30 @@ EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(co
ItemID id(newluid);
bool isParent = id.m_rid.empty();
- // ensure that the component has the right UID
- if (update && !id.m_uid.empty()) {
- icalcomponent_set_uid(subcomp, id.m_uid.c_str());
+ // ensure that the component has the right UID and
+ // RECURRENCE-ID
+ if (update) {
+ if (!id.m_uid.empty()) {
+ icalcomponent_set_uid(subcomp, id.m_uid.c_str());
+ }
+ if (!id.m_rid.empty()) {
+ // Reconstructing the RECURRENCE-ID is non-trivial,
+ // because our luid only contains the date-time, but
+ // not the time zone. Only do the work if the event
+ // really doesn't have a RECURRENCE-ID.
+ struct icaltimetype rid;
+ rid = icalcomponent_get_recurrenceid(subcomp);
+ if (icaltime_is_null_time(rid)) {
+ // Preserve the original RECURRENCE-ID, including
+ // timezone, no matter what the update contains
+ // (might have wrong timezone or UTC).
+ eptr<icalcomponent> orig(retrieveItem(id));
+ icalproperty *orig_rid = icalcomponent_get_first_property(orig, ICAL_RECURRENCEID_PROPERTY);
+ if (orig_rid) {
+ icalcomponent_add_property(subcomp, icalproperty_new_clone(orig_rid));
+ }
+ }
+ }
}
if (isParent) {
diff --git a/src/dbus/Makefile.am b/src/dbus/Makefile.am
index f18d9233..fb887edf 100644
--- a/src/dbus/Makefile.am
+++ b/src/dbus/Makefile.am
@@ -2,6 +2,7 @@ lib_LTLIBRARIES = libsyncevo-dbus.la
SUBDIRS = interfaces
+if COND_GUI
AM_CPPFLAGS = -I$(top_srcdir) -Iinterfaces $(SYNTHESIS_CFLAGS)
DISTCLEANFILES = syncevo-dbus.pc
@@ -40,3 +41,4 @@ syncevo_dbus_headers = \
libsyncevo_dbus_includedir = $(includedir)/syncevo-dbus
libsyncevo_dbus_include_HEADERS = \
$(syncevo_dbus_headers)
+endif
diff --git a/src/dbus/interfaces/Makefile.am b/src/dbus/interfaces/Makefile.am
index 3952fda8..6424dd84 100644
--- a/src/dbus/interfaces/Makefile.am
+++ b/src/dbus/interfaces/Makefile.am
@@ -1,14 +1,38 @@
+doc_DATA =
+
%.xml: %-full.xml
$(XSLT) -o $@ $(srcdir)/spec-strip-docs.xsl $<
+if COND_DOC
%-doc.xml: %-full.xml
$(XSLT) -o $@ $(srcdir)/spec-to-docbook.xsl $<
-BUILT_SOURCES = syncevo-marshal.c syncevo-marshal.h \
+syncevo-dbus-api-doc.xml: syncevo-server-doc.xml syncevo-session-doc.xml syncevo-connection-doc.xml
+ echo '<?xml version="1.0" encoding="UTF-8"?>' >$@
+ echo '<reference><title>SyncEvolution D-Bus API $(VERSION)</title>' >>$@
+ for xml in $+; do \
+ tail -n +2 $$xml >>$@; \
+ done
+ echo '</reference>' >>$@
+
+syncevo-dbus-api-doc.html: syncevo-dbus-api-doc.xml
+ $(XSLT) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $<
+
+doc_DATA += syncevo-dbus-api-doc.html
+
+endif
+
+BUILT_SOURCES =
+if COND_GUI
+BUILT_SOURCES += syncevo-marshal.c syncevo-marshal.h \
syncevo-server-bindings.h syncevo-connection-bindings.h syncevo-session-bindings.h \
syncevo-server-glue.h syncevo-connection-glue.h syncevo-session-glue.h \
- syncevo-server-doc.xml syncevo-connection-doc.xml syncevo-session-doc.xml \
syncevo-server.xml syncevo-connection.xml syncevo-session.xml
+endif
+if COND_DOC
+BUILT_SOURCES += syncevo-server-doc.xml syncevo-connection-doc.xml syncevo-session-doc.xml \
+ syncevo-dbus-api-doc.xml syncevo-dbus-api-doc.html
+endif
CLEANFILES = $(BUILT_SOURCES) stamp-syncevo-dbus-glue.h
EXTRA_DIST = syncevo-marshal.list \
@@ -18,6 +42,7 @@ EXTRA_DIST = syncevo-marshal.list \
syncevo-server-full.xml \
syncevo-session-full.xml
+if COND_GUI
%-bindings.h: stamp-%-bindings.h
@true
stamp-%-bindings.h: %.xml
@@ -39,3 +64,4 @@ stamp-%-glue.h: %.xml
&& (cmp -s xgen-$(@F) $(@F:stamp-%=%) || cp xgen-$(@F) $(@F:stamp-%=%)) \
&& rm -f xgen-$(@F) \
&& echo timestamp > $(@F)
+endif
diff --git a/src/dbus/interfaces/README b/src/dbus/interfaces/README
new file mode 100644
index 00000000..73806905
--- /dev/null
+++ b/src/dbus/interfaces/README
@@ -0,0 +1,9 @@
+The documentation of .xml files follows dbus-introspect-docs.dtd
+and uses spec-to-docbook.xsl from William Jon McCann <jmccann@redhat.com>
+to convert the documentation into DocBook and then HTML.
+
+See http://cgit.freedesktop.org/ConsoleKit/tree/doc/dbus for latest (?)
+copy of the script and http://cgit.freedesktop.org/ConsoleKit/tree/src
+for some examples.
+
+
diff --git a/src/dbus/interfaces/dbus-introspect-docs.dtd b/src/dbus/interfaces/dbus-introspect-docs.dtd
new file mode 100644
index 00000000..ca918fb5
--- /dev/null
+++ b/src/dbus/interfaces/dbus-introspect-docs.dtd
@@ -0,0 +1,32 @@
+<!-- DTD for D-Bus Introspection Documentation -->
+
+<!ELEMENT doc (summary?,description?,errors?,permission?,since?,deprecated,seealso?)>
+
+<!ELEMENT summary (#PCDATA|ref)*>
+<!ELEMENT description (#PCDATA|para|example)*>
+<!ELEMENT errors (error)*>
+<!ELEMENT permission (#PCDATA|ref|para)*>
+<!ELEMENT since EMPTY>
+<!ATTLIST since version CDATA #REQUIRED>
+<!ELEMENT deprecated (#PCDATA|ref)>
+<!ATTLIST deprecated version CDATA #REQUIRED>
+<!ATTLIST deprecated instead CDATA #REQUIRED>
+<!ELEMENT seealso (ref+)>
+
+<!ELEMENT error (#PCDATA|para)*>
+<!ATTLIST error name CDATA #REQUIRED>
+<!ELEMENT para (#PCDATA|example|code|list|ref)*>
+<!ELEMENT example (#PCDATA|para|code|ref)*>
+<!ATTLIST language (c|glib|python|shell) #REQUIRED>
+<!ATTLIST title CDATA #IMPLIED>
+<!ELEMENT list (item*)>
+<!ATTLIST list type (bullet|number) #REQUIRED>
+<!ELEMENT item (term|definition)*>
+<!ELEMENT term (#PCDATA|ref)*>
+<!ELEMENT definition (#PCDATA|para)*>
+
+<!ELEMENT code (#PCDATA)>
+<!ATTLIST code lang CDATA #IMPLIED>
+<!ELEMENT ref CDATA>
+<!ATTLIST ref type (parameter|arg|signal|method|interface) #REQUIRED>
+<!ATTLIST ref to CDATA #REQUIRED>
diff --git a/src/dbus/interfaces/spec-strip-docs.xsl b/src/dbus/interfaces/spec-strip-docs.xsl
index 92e578dd..b5ed75f8 100644
--- a/src/dbus/interfaces/spec-strip-docs.xsl
+++ b/src/dbus/interfaces/spec-strip-docs.xsl
@@ -33,6 +33,7 @@
</node>
</xsl:template>
+ <xsl:template match="annotation"/>
<xsl:template match="doc:*"/>
<xsl:template match="text()"/>
</xsl:stylesheet>
diff --git a/src/dbus/interfaces/spec-to-docbook.xsl b/src/dbus/interfaces/spec-to-docbook.xsl
index 7431ae3b..f69bebdc 100644
--- a/src/dbus/interfaces/spec-to-docbook.xsl
+++ b/src/dbus/interfaces/spec-to-docbook.xsl
@@ -9,19 +9,9 @@
-->
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
-<xsl:template match="/node">
- <reference>
- <xsl:attribute name="id"><xsl:value-of select="@doc:id"/></xsl:attribute>
- <title>
- <xsl:value-of select="doc:doc/doc:summary"/>
- </title>
- <xsl:apply-templates select="interface"/>
-</reference>
-</xsl:template>
-
-<xsl:template match="interface">
+<xsl:template match="/">
-<xsl:variable name="interface" select="@name"/>
+<xsl:variable name="interface" select="//interface/@name"/>
<xsl:variable name="basename">
<xsl:call-template name="interface-basename">
<xsl:with-param name="str" select="$interface"/>
@@ -30,11 +20,11 @@
<refentry><xsl:attribute name="id"><xsl:value-of select="$basename"/></xsl:attribute>
<refmeta>
- <refentrytitle role="top_of_page"><xsl:value-of select="@name"/></refentrytitle>
+ <refentrytitle role="top_of_page"><xsl:value-of select="//interface/@name"/></refentrytitle>
</refmeta>
<refnamediv>
- <refname><xsl:value-of select="@name"/></refname>
+ <refname><xsl:value-of select="//interface/@name"/></refname>
<refpurpose><xsl:value-of select="$basename"/> interface</refpurpose>
</refnamediv>
@@ -47,38 +37,52 @@
</synopsis>
</refsynopsisdiv>
- <refsect1 role="signal_proto">
- <title role="signal_proto.title">Signals</title>
- <synopsis>
- <xsl:call-template name="signals-synopsis">
- <xsl:with-param name="basename" select="$basename"/>
- </xsl:call-template>
- </synopsis>
- </refsect1>
+ <xsl:choose>
+ <xsl:when test="count(///signal) > 0">
+ <refsect1 role="signal_proto">
+ <title role="signal_proto.title">Signals</title>
+ <synopsis>
+ <xsl:call-template name="signals-synopsis">
+ <xsl:with-param name="basename" select="$basename"/>
+ </xsl:call-template>
+ </synopsis>
+ </refsect1>
+ </xsl:when>
+ </xsl:choose>
<refsect1 role="impl_interfaces">
<title role="impl_interfaces.title">Implemented Interfaces</title>
<para>
- <xsl:value-of select="$interface"/> implements
+ Objects implementing <xsl:value-of select="$interface"/> also implements
org.freedesktop.DBus.Introspectable,
org.freedesktop.DBus.Properties
</para>
</refsect1>
- <refsect1 role="properties">
- <title role="properties.title">Properties</title>
- <synopsis>
- <xsl:call-template name="properties-synopsis">
- <xsl:with-param name="basename" select="$basename"/>
- </xsl:call-template>
- </synopsis>
- </refsect1>
+ <xsl:choose>
+ <xsl:when test="count(///property) > 0">
+ <refsect1 role="properties">
+ <title role="properties.title">Properties</title>
+ <synopsis>
+ <xsl:call-template name="properties-synopsis">
+ <xsl:with-param name="basename" select="$basename"/>
+ </xsl:call-template>
+ </synopsis>
+ </refsect1>
+ </xsl:when>
+ </xsl:choose>
<refsect1 role="desc">
<title role="desc.title">Description</title>
- <para>
- <xsl:apply-templates select="doc:doc"/>
- </para>
+ <xsl:choose>
+ <xsl:when test="count(//interface/doc:doc) > 0">
+ <xsl:apply-templates select="//interface/doc:doc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <para>
+ </para>
+ </xsl:otherwise>
+ </xsl:choose>
</refsect1>
<refsect1 role="details">
@@ -88,19 +92,27 @@
</xsl:call-template>
</refsect1>
- <refsect1 role="signals">
- <title role="signals.title">Signal Details</title>
- <xsl:call-template name="signal-details">
- <xsl:with-param name="basename" select="$basename"/>
- </xsl:call-template>
- </refsect1>
+ <xsl:choose>
+ <xsl:when test="count(///signal) > 0">
+ <refsect1 role="signals">
+ <title role="signals.title">Signal Details</title>
+ <xsl:call-template name="signal-details">
+ <xsl:with-param name="basename" select="$basename"/>
+ </xsl:call-template>
+ </refsect1>
+ </xsl:when>
+ </xsl:choose>
- <refsect1 role="property_details">
- <title role="property_details.title">Property Details</title>
- <xsl:call-template name="property-details">
- <xsl:with-param name="basename" select="$basename"/>
- </xsl:call-template>
- </refsect1>
+ <xsl:choose>
+ <xsl:when test="count(///property) > 0">
+ <refsect1 role="property_details">
+ <title role="property_details.title">Property Details</title>
+ <xsl:call-template name="property-details">
+ <xsl:with-param name="basename" select="$basename"/>
+ </xsl:call-template>
+ </refsect1>
+ </xsl:when>
+ </xsl:choose>
</refentry>
</xsl:template>
@@ -109,13 +121,17 @@
<xsl:template name="property-doc">
<xsl:apply-templates select="doc:doc/doc:description"/>
- <variablelist role="params">
- <xsl:for-each select="arg">
+ <xsl:choose>
+ <xsl:when test="count(arg) > 0">
+ <variablelist role="params">
+ <xsl:for-each select="arg">
<varlistentry><term><parameter><xsl:value-of select="@name"/></parameter>:</term>
<listitem><simpara><xsl:value-of select="doc:doc/doc:summary"/></simpara></listitem>
</varlistentry>
- </xsl:for-each>
- </variablelist>
+ </xsl:for-each>
+ </variablelist>
+ </xsl:when>
+ </xsl:choose>
<xsl:apply-templates select="doc:doc/doc:since"/>
<xsl:apply-templates select="doc:doc/doc:deprecated"/>
@@ -131,15 +147,13 @@
<xsl:with-param name="set" select="@name"/>
</xsl:call-template>
</xsl:variable>
- <xsl:for-each select="property">
+ <xsl:for-each select="///property">
<refsect2>
<title><anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>:<xsl:value-of select="@name"/></xsl:attribute></anchor>The "<xsl:value-of select="@name"/>" property</title>
<indexterm><primary><xsl:value-of select="@name"/></primary><secondary><xsl:value-of select="$basename"/></secondary></indexterm>
<programlisting>'<xsl:value-of select="@name"/>'<xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="2"/></xsl:call-template>
<xsl:call-template name="property-args"><xsl:with-param name="indent" select="string-length(@name) + 2"/></xsl:call-template></programlisting>
-
<xsl:call-template name="property-doc"/>
-
</refsect2>
</xsl:for-each>
</xsl:template>
@@ -147,13 +161,17 @@
<xsl:template name="signal-doc">
<xsl:apply-templates select="doc:doc/doc:description"/>
- <variablelist role="params">
- <xsl:for-each select="arg">
+ <xsl:choose>
+ <xsl:when test="count(arg) > 0">
+ <variablelist role="params">
+ <xsl:for-each select="arg">
<varlistentry><term><parameter><xsl:value-of select="@name"/></parameter>:</term>
<listitem><simpara><xsl:value-of select="doc:doc/doc:summary"/></simpara></listitem>
</varlistentry>
- </xsl:for-each>
- </variablelist>
+ </xsl:for-each>
+ </variablelist>
+ </xsl:when>
+ </xsl:choose>
<xsl:apply-templates select="doc:doc/doc:since"/>
<xsl:apply-templates select="doc:doc/doc:deprecated"/>
@@ -168,14 +186,12 @@
<xsl:with-param name="set" select="@name"/>
</xsl:call-template>
</xsl:variable>
- <xsl:for-each select="signal">
+ <xsl:for-each select="///signal">
<refsect2>
<title><anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>::<xsl:value-of select="@name"/></xsl:attribute></anchor>The <xsl:value-of select="@name"/> signal</title>
<indexterm><primary><xsl:value-of select="@name"/></primary><secondary><xsl:value-of select="$basename"/></secondary></indexterm>
<programlisting><xsl:value-of select="@name"/> (<xsl:call-template name="signal-args"><xsl:with-param name="indent" select="string-length(@name) + 2"/><xsl:with-param name="prefix" select="."/></xsl:call-template>)</programlisting>
-
<xsl:call-template name="signal-doc"/>
-
</refsect2>
</xsl:for-each>
</xsl:template>
@@ -186,8 +202,33 @@
</programlisting>
</xsl:template>
+<xsl:template match="doc:tt">
+ <literal>
+ <xsl:apply-templates />
+ </literal>
+</xsl:template>
+
+<xsl:template match="doc:i">
+ <emphasis>
+ <xsl:apply-templates />
+ </emphasis>
+</xsl:template>
+
+<xsl:template match="doc:b">
+ <emphasis role="bold">
+ <xsl:apply-templates />
+ </emphasis>
+</xsl:template>
+
+<xsl:template match="doc:ulink">
+ <ulink>
+ <xsl:attribute name="url"><xsl:value-of select="@url"/></xsl:attribute>
+ <xsl:value-of select="."/>
+ </ulink>
+</xsl:template>
+
<xsl:template match="doc:summary">
-<!-- by default don't display -->
+ <xsl:apply-templates />
</xsl:template>
<xsl:template match="doc:example">
@@ -196,6 +237,41 @@
</informalexample>
</xsl:template>
+<xsl:template name="listitems-do-term">
+ <xsl:param name="str"/>
+ <xsl:choose>
+ <xsl:when test="string-length($str) > 0">
+ <emphasis role="bold"><xsl:value-of select="$str"/>: </emphasis>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="do-listitems">
+ <xsl:for-each select="doc:item">
+ <listitem><para>
+ <xsl:call-template name="listitems-do-term"><xsl:with-param name="str" select="doc:term"/></xsl:call-template>
+ <xsl:apply-templates select="doc:definition"/>
+ </para></listitem>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="doc:list">
+ <para>
+ <xsl:choose>
+ <xsl:when test="contains(@type,'number')">
+ <orderedlist>
+ <xsl:call-template name="do-listitems"/>
+ </orderedlist>
+ </xsl:when>
+ <xsl:otherwise>
+ <itemizedlist>
+ <xsl:call-template name="do-listitems"/>
+ </itemizedlist>
+ </xsl:otherwise>
+ </xsl:choose>
+ </para>
+</xsl:template>
+
<xsl:template match="doc:para">
<para>
<xsl:apply-templates />
@@ -259,6 +335,12 @@ instead.</para></warning>
</para>
</xsl:template>
+<xsl:template match="doc:errors">
+<para role="errors">
+<xsl:apply-templates />
+</para>
+</xsl:template>
+
<xsl:template match="doc:seealso">
<para>
See also:
@@ -285,9 +367,6 @@ See also:
<xsl:when test="contains($type,'interface')">
<link><xsl:attribute name="linkend"><xsl:value-of select="$to"/></xsl:attribute><xsl:value-of select="$val"/></link>
</xsl:when>
- <xsl:when test="contains($type,'xref')">
- <xref><xsl:attribute name="linkend"><xsl:value-of select="$to"/></xsl:attribute></xref>
- </xsl:when>
</xsl:choose>
</xsl:template>
@@ -302,20 +381,46 @@ See also:
<xsl:template name="method-doc">
<xsl:apply-templates select="doc:doc/doc:description"/>
- <variablelist role="params">
- <xsl:for-each select="arg">
+ <xsl:choose>
+ <xsl:when test="count(arg) > 0">
+ <variablelist role="params">
+ <xsl:for-each select="arg">
<varlistentry><term><parameter><xsl:value-of select="@name"/></parameter>:</term>
-<listitem>
-<para><xsl:value-of select="doc:doc/doc:summary"/></para>
- <xsl:apply-templates select="doc:doc/doc:description"/>
-</listitem>
+<listitem><simpara><xsl:apply-templates select="doc:doc/doc:summary"/></simpara></listitem>
</varlistentry>
- </xsl:for-each>
- </variablelist>
+ </xsl:for-each>
+ </variablelist>
+ </xsl:when>
+ </xsl:choose>
<xsl:apply-templates select="doc:doc/doc:since"/>
<xsl:apply-templates select="doc:doc/doc:deprecated"/>
- <xsl:apply-templates select="doc:doc/doc:permission"/>
+
+ <xsl:choose>
+ <xsl:when test="count(doc:doc/doc:errors) > 0">
+ <note>
+ <title>Errors</title>
+ <variablelist role="errors">
+ <xsl:for-each select="doc:doc/doc:errors/doc:error">
+ <varlistentry>
+ <term><parameter><xsl:value-of select="@name"/></parameter>:</term>
+ <listitem><simpara><xsl:apply-templates select="."/></simpara></listitem>
+ </varlistentry>
+ </xsl:for-each>
+ </variablelist>
+ </note>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="count(doc:doc/doc:permission) > 0">
+ <note>
+ <title>Permissions</title>
+ <xsl:apply-templates select="doc:doc/doc:permission"/>
+ </note>
+ </xsl:when>
+ </xsl:choose>
+
<xsl:apply-templates select="doc:doc/doc:seealso"/>
</xsl:template>
@@ -326,15 +431,13 @@ See also:
<xsl:with-param name="set" select="@name"/>
</xsl:call-template>
</xsl:variable>
- <xsl:for-each select="method">
+ <xsl:for-each select="///method">
<refsect2>
<title><anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>.<xsl:value-of select="@name"/></xsl:attribute></anchor><xsl:value-of select="@name"/> ()</title>
<indexterm><primary><xsl:value-of select="@name"/></primary><secondary><xsl:value-of select="$basename"/></secondary></indexterm>
<programlisting><xsl:value-of select="@name"/> (<xsl:call-template name="method-args"><xsl:with-param name="indent" select="string-length(@name) + 2"/><xsl:with-param name="prefix" select="."/></xsl:call-template>)</programlisting>
-
<xsl:call-template name="method-doc"/>
</refsect2>
-
</xsl:for-each>
</xsl:template>
@@ -343,10 +446,10 @@ See also:
<xsl:param name="basename"/>
<xsl:variable name="longest">
<xsl:call-template name="find-longest">
- <xsl:with-param name="set" select="property/@name"/>
+ <xsl:with-param name="set" select="///property/@name"/>
</xsl:call-template>
</xsl:variable>
- <xsl:for-each select="property">
+ <xsl:for-each select="///property">
<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>:<xsl:value-of select="@name"/></xsl:attribute>'<xsl:value-of select="@name"/>'</link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template> <xsl:call-template name="property-args"><xsl:with-param name="indent" select="$longest + 2"/></xsl:call-template>
</xsl:for-each>
</xsl:template>
@@ -356,11 +459,11 @@ See also:
<xsl:param name="basename"/>
<xsl:variable name="longest">
<xsl:call-template name="find-longest">
- <xsl:with-param name="set" select="signal/@name"/>
+ <xsl:with-param name="set" select="///signal/@name"/>
</xsl:call-template>
</xsl:variable>
- <xsl:for-each select="signal">
-<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>::<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template>(<xsl:call-template name="signal-args"><xsl:with-param name="indent" select="$longest + 2"/><xsl:with-param name="prefix" select="signal"/></xsl:call-template>)
+ <xsl:for-each select="///signal">
+<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>::<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template>(<xsl:call-template name="signal-args"><xsl:with-param name="indent" select="$longest + 2"/><xsl:with-param name="prefix" select="///signal"/></xsl:call-template>)
</xsl:for-each>
</xsl:template>
@@ -369,11 +472,11 @@ See also:
<xsl:param name="basename"/>
<xsl:variable name="longest">
<xsl:call-template name="find-longest">
- <xsl:with-param name="set" select="method/@name"/>
+ <xsl:with-param name="set" select="///method/@name"/>
</xsl:call-template>
</xsl:variable>
- <xsl:for-each select="method">
-<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>.<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template>(<xsl:call-template name="method-args"><xsl:with-param name="indent" select="$longest + 2"/><xsl:with-param name="prefix" select="method"/></xsl:call-template>)
+ <xsl:for-each select="///method">
+<link><xsl:attribute name="linkend"><xsl:value-of select="$basename"/>.<xsl:value-of select="@name"/></xsl:attribute><xsl:value-of select="@name"/></link><xsl:call-template name="pad-spaces"><xsl:with-param name="width" select="$longest - string-length(@name) + 1"/></xsl:call-template>(<xsl:call-template name="method-args"><xsl:with-param name="indent" select="$longest + 2"/><xsl:with-param name="prefix" select="///method"/></xsl:call-template>)
</xsl:for-each>
</xsl:template>
diff --git a/src/dbus/interfaces/syncevo-server-full.xml b/src/dbus/interfaces/syncevo-server-full.xml
index 3bf2cea9..902d9e35 100644
--- a/src/dbus/interfaces/syncevo-server-full.xml
+++ b/src/dbus/interfaces/syncevo-server-full.xml
@@ -34,30 +34,33 @@
<doc:para>
Method calls may fail with the following errors:
- "org.syncevolution.Exception" - catch-all error condition.
- "org.syncevolution.NoSuchConfig" - server configuration name is invalid
- "org.syncevolution.NoSuchSource" - source name is invalid
- "org.syncevolution.SourceUnusable" - CheckSource() may return this
- if source is not usable (for various possible reasons).
- "org.syncevolution.InvalidCall" - a call is (perhaps no longer) allowed
- or suitable in the current situation, like Detach() when the client
- is not attached.
+ <doc:list>
+ <doc:item><doc:term>org.syncevolution.Exception</doc:term><doc:definition>catch-all error condition.</doc:definition></doc:item>
+ <doc:item><doc:term>org.syncevolution.NoSuchConfig</doc:term><doc:definition>server configuration name is invalid</doc:definition></doc:item>
+ <doc:item><doc:term>org.syncevolution.NoSuchSource</doc:term><doc:definition>source name is invalid</doc:definition></doc:item>
+ <doc:item><doc:term>org.syncevolution.SourceUnusable</doc:term><doc:definition>CheckSource() may return this if source is not usable (for various possible reasons).</doc:definition></doc:item>
+ <doc:item><doc:term>org.syncevolution.InvalidCall</doc:term><doc:definition>a call is (perhaps no longer) allowed or suitable in the current situation, like Detach() when the client is not attached.</doc:definition></doc:item>
+ </doc:list>
</doc:para>
</doc:doc>
<method name="Attach">
<doc:doc>
<doc:description>
+ <doc:para>
With no client attached, the server will shut down after a
certain period of inactivity. Attaching to the server
prevents that. Attaching is not necessary to invoke methods.
The main purpose is to keep the server running while clients
are around and listen for signals, in particular the
Presence signal.
+ </doc:para>
+ <doc:para>
Each attach has to be matched by one detach, so that one client has
the capability to attach to the server many times in different
modules. The behavior of calling Detach() more often than Attach()
is undefined.
+ </doc:para>
</doc:description>
</doc:doc>
</method>
@@ -73,37 +76,68 @@
<method name ="GetConfigs">
<doc:doc><doc:description>
+ <doc:para>
Get an array of all configured servers (or templates)
-
+ </doc:para>
+ <doc:para>
In getting templates mode, the dbus server checks all paired devices
from bluez daemon and filters them by SyncML capability. Then it
looks through built-in templates and returns their matched templates.
Multiple templates might be created for each device, with different
matching scores(range: 1-5). Scores represent how well the device name
matches a template. The higher, the better.
+ </doc:para>
+ <doc:para>
A template might be used to help creation for multiple devices. Thus template
names must be reset in a naming rule. They are re-named with 'Bluetooth_&lt;
mac address&gt;_&lt;sequence number&gt;'. Here 'mac address' is the mac
address of the Bluetooth device and 'sequence number' enumerates all the
matched templates created for the device.
+ </doc:para>
+ <doc:para>
When retrieving the templates with GetConfig(), several additional
properties will be returned:
- description - the description for the template (non-localized string)
- score - the calculated score based on the device name and template (1-5, 5 is best)
- deviceName - the device name that the template is for (copied verbatim from that device)
- templateName - string identifying the class of devices the templates works for,
- like "Nokia S40"; meant to be shown to users; optional, fall back
- to first entry in fingerPrint if not set
- fingerPrint - comma separated list of devices which work with this template,
- typically in "vendor model" format; can be used by D-Bus
- clients to re-match with user provided device information
-
+ <doc:list>
+ <doc:item>
+ <doc:term>description</doc:term>
+ <doc:definition>the description for the template
+ (non-localized string)</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>score</doc:term>
+ <doc:definition>the calculated score based on the device
+ name and template (1-5, 5 is best)</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>deviceName</doc:term>
+ <doc:definition>the device name that the template is for
+ (copied verbatim from that device)</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>templateName</doc:term>
+ <doc:definition>string identifying the class of devices
+ the templates works for, like "Nokia S40"; meant to be
+ shown to users; optional, fall back to first entry in
+ fingerPrint if not set</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>fingerPrint</doc:term>
+ <doc:definition>comma separated list of devices which
+ work with this template, typically in "vendor model"
+ format; can be used by D-Bus clients to re-match with
+ user provided device information</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:para>
+
+ <doc:para>
Together with these changes, a property value is changed: 'syncURL' in the
configuration is replaced with the mac address of the device.
+ </doc:para>
</doc:description></doc:doc>
- <arg type="b" name="template" direction="in">
+ <arg type="b" name="tmplate" direction="in">
<doc:doc><doc:summary>
if TRUE, will return template names, otherwise will return
configured servers
@@ -123,7 +157,7 @@
<arg type="s" name="server" direction="in">
<doc:doc><doc:summary>server name</doc:summary></doc:doc>
</arg>
- <arg type="b" name="template" direction="in">
+ <arg type="b" name="tmplate" direction="in">
<doc:doc><doc:summary>
if TRUE, will return a matching template configuration, otherwise
will return a matching server configuration
@@ -153,6 +187,7 @@
server. The result is undefined.
</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
</method>
<method name="CheckPresence">
@@ -221,6 +256,7 @@
its pair-value won't be included in the dictionary.
</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfStringMap"/>
</method>
<method name="GetDatabases">
@@ -253,6 +289,7 @@
</doc:description>
</doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfDatabases"/>
</method>
<method name="CheckSource">
@@ -365,6 +402,7 @@
</doc:summary>
</doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="StringMap"/>
<arg type="b" name="must_authenticate" direction="in">
<doc:doc>
<doc:summary>
@@ -499,11 +537,16 @@
</doc:para>
<doc:para>
- Clients react by calling InfoResponse. The flow is this:
- information needed, InfoRequest("request"),
- InfoResponse("working") + dialog is opened (if necessary),
- InfoRequest("waiting"), information becomes available,
- InfoResponse("response"), InfoRequest("done").
+ Clients react by calling InfoResponse. The flow of events is this:
+ <doc:list type="number">
+ <doc:item><doc:definition>information needed</doc:definition></doc:item>
+ <doc:item><doc:definition>InfoRequest("request")</doc:definition></doc:item>
+ <doc:item><doc:definition>InfoResponse("working") + dialog is opened (if necessary)</doc:definition></doc:item>
+ <doc:item><doc:definition>InfoRequest("waiting")</doc:definition></doc:item>
+ <doc:item><doc:definition>information becomes available</doc:definition></doc:item>
+ <doc:item><doc:definition>InfoResponse("response")</doc:definition></doc:item>
+ <doc:item><doc:definition>InfoRequest("done")</doc:definition></doc:item>
+ </doc:list>
</doc:para>
<doc:para>
@@ -519,6 +562,33 @@
provide the information and fall back to some default or
abort.
</doc:para>
+
+ <doc:para>
+ For "type = password" the following keys are used as part of the "parameters" string hash:
+ <doc:list>
+ <doc:item>
+ <doc:term>"name"</doc:term>
+ <doc:definition>name of the password property in the config</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>"description"</doc:term>
+ <doc:definition>unique English description of the required password.
+ Content is determined by the individual password property, so this
+ may change. Currently used are "SyncML Server", "proxy",
+ "'source name' backend" (with 'source name' replaced by the same
+ names also used for the corresponding config entry).
+ </doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>
+ "user", "server", "domain", "object", "protocol", "authtype", "port"
+ </doc:term>
+ <doc:definition>
+ optional keys as they would be used in the GNOME keyring.
+ </doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:para>
</doc:description>
</doc:doc>
@@ -558,19 +628,10 @@
<doc:doc>
<doc:summary>
Auxiliary parameters which depend on the type.
-
- For "password" the following keys are used:
- "name" - name of the password property in the config.
- "description" - unique English description of the required password.
- Content is determined by the individual password property, so this
- may change. Currently used are "SyncML Server", "proxy",
- "'source name' backend" (with 'source name' replaced by the same
- names also used for the corresponding config entry).
- "user", "server", "domain", "object", "protocol", "authtype", "port" -
- optional keys as they would be used in the GNOME keyring.
</doc:summary>
</doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In5" value="StringMap"/>
</signal>
<method name="InfoResponse">
@@ -599,6 +660,7 @@
</doc:summary>
</doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="StringMap"/>
</method>
<signal name="LogOutput">
diff --git a/src/dbus/interfaces/syncevo-session-full.xml b/src/dbus/interfaces/syncevo-session-full.xml
index 19d8784a..55254d42 100644
--- a/src/dbus/interfaces/syncevo-session-full.xml
+++ b/src/dbus/interfaces/syncevo-session-full.xml
@@ -8,13 +8,14 @@
<method name="GetConfig">
<doc:doc><doc:description>Get the configuration of the server</doc:description></doc:doc>
- <arg type="b" name="template" direction="in">
+ <arg type="b" name="tmplate" direction="in">
<doc:doc><doc:summary>if TRUE, will return a matching template configuration, otherwise will return a matching server configuration</doc:summary></doc:doc>
</arg>
<arg type="a{sa{ss}}" name="configuration" direction="out">
<doc:doc><doc:summary>server configuration</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetConfig() for dictionary description.</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QStringMultiMap"/>
</method>
<method name="SetConfig">
@@ -61,6 +62,7 @@
<doc:doc><doc:summary>server configuration</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetConfig() for dictionary description.</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="QStringMultiMap"/>
</method>
<method name="GetReports">
@@ -75,6 +77,7 @@
<doc:doc><doc:summary>synchronization reports</doc:summary></doc:doc>
<doc:doc><doc:description>See Server.GetReports() for array description.</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfStringMap"/>
</method>
@@ -106,6 +109,7 @@
</doc:description>
</doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QArrayOfDatabases"/>
</method>
<method name="CheckSource">
@@ -128,15 +132,21 @@
<doc:doc><doc:description>
<doc:para>
Start synchronization. The synchronization mode selection for sources works like this: Primarily, use mode from "sources" array. If the source was not found or its mode was empty, use the mode parameter. If mode parameter is empty, use the mode in configuration.
- Examples:
- * sync all with mode from config
- Sync (NULL, ())
- * refresh all from server
- Sync ("refresh-from-server", ())
- * force slow sync for calendar, use mode from config for others
- Sync (NULL, (("calendar", "slow")))
- * sync only calendar and addressbook, with mode from config
- Sync ("none", (("calendar", NULL), ("addressbook", NULL)))
+ Examples:
+ <doc:list type="bullet">
+ <doc:item><doc:definition>sync all with mode from config:
+ Sync (NULL, ())</doc:definition>
+ </doc:item>
+ <doc:item><doc:definition>refresh all from server:
+ Sync ("refresh-from-server", ())</doc:definition>
+ </doc:item>
+ <doc:item><doc:definition>force slow sync for calendar, use mode from config for others:
+ Sync (NULL, (("calendar", "slow")))</doc:definition>
+ </doc:item>
+ <doc:item><doc:definition>sync only calendar and addressbook, with mode from config:
+ Sync ("none", (("calendar", NULL), ("addressbook", NULL)))</doc:definition>
+ </doc:item>
+ </doc:list>
</doc:para>
<doc:para>
Syncevolution will by default output a sync "diff" in the end of Sync().
@@ -153,6 +163,7 @@
<doc:doc><doc:summary>synchronization source modes</doc:summary></doc:doc>
<doc:doc><doc:description>Source modes to override the 'mode' variable for specific sources. The dictionary key is source name, value is synchronization mode. Valid synchronization modes are all synchronization modes used in syncevolution server configuration files and the empty string.</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="StringMap"/>
</method>
<method name="Abort">
@@ -217,6 +228,7 @@
<doc:doc><doc:summary>Synchronization source status dictionary</doc:summary></doc:doc>
<doc:doc><doc:description>Dictionary key is source name. The value structs contain synchronization mode, source status and error code. Valid values for status are the same as for status parameter above. "done" represents a synced source when the whole sync is not done yet.</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out2" value="QSyncStatusMap"/>
</method>
<method name="GetProgress">
@@ -228,6 +240,7 @@
<doc:doc><doc:summary>Synchronization source progress dictionary</doc:summary></doc:doc>
<doc:doc><doc:description>Dictionary key is source name. The value structs contain phase (can be one of "", "preparing", "sending", "receiving"), prepare count, prepare total, send count, send total, receive count and receive total. -1 is used for unknown. Normally only the 'counts' increase but there are cases where the total will increase as well.</doc:description></doc:doc>
</arg>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.Out1" value="QSyncProgressMap"/>
</method>
<method name="Execute">
@@ -245,12 +258,14 @@
<arg type="s" name="status"/>
<arg type="u" name="error"/>
<arg type="a{s(ssu)}" name="sources"/>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In2" value="QSyncStatusMap"/>
</signal>
<signal name="ProgressChanged">
<doc:doc><doc:description>Synchronization progress change. See GetProgress() for argument descriptions.</doc:description></doc:doc>
<arg type="i" name="progress"/>
<arg type="a{s(siiiiii)}" name="sources"/>
+ <annotation name="com.trolltech.QtDBus.QtTypeName.In1" value="QSyncProgressMap"/>
</signal>
</interface>
diff --git a/src/dbus/qt/dbustypes.cpp b/src/dbus/qt/dbustypes.cpp
new file mode 100644
index 00000000..f05ec7ca
--- /dev/null
+++ b/src/dbus/qt/dbustypes.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2010 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include "dbustypes.h"
+
+
+ // Marshall the SyncDatabase data into a D-BUS argument
+ QDBusArgument &operator<<(QDBusArgument &argument, const SyncDatabase &d)
+ {
+ argument.beginStructure();
+ argument << d.name << d.source << d.flag;
+ argument.endStructure();
+ return argument;
+ }
+
+ // Retrieve the SyncDatabase data from the D-BUS argument
+ const QDBusArgument &operator>>(const QDBusArgument &argument, SyncDatabase &d)
+ {
+ argument.beginStructure();
+ argument >> d.name >> d.source >> d.flag;
+ argument.endStructure();
+ return argument;
+ }
+
+// Marshall the SyncProgress data into a D-BUS argument
+ QDBusArgument &operator<<(QDBusArgument &argument, const SyncProgress &p)
+ {
+ argument.beginStructure();
+ argument << p.prepareCount << p.prepareTotal << p.sendCount << p.sendTotal << p.recieveCount \
+ << p.recieveTotal;
+ argument.endStructure();
+ return argument;
+ }
+
+ // Retrieve the SyncProgress data from the D-BUS argument
+ const QDBusArgument &operator>>(const QDBusArgument &argument, SyncProgress &p)
+ {
+ argument.beginStructure();
+ argument >> p.prepareCount >> p.prepareTotal >> p.sendCount >> p.sendTotal >> p.recieveCount \
+ >> p.recieveTotal;
+ argument.endStructure();
+ return argument;
+ }
+
+// Marshall the SyncStatus data into a D-BUS argument
+ QDBusArgument &operator<<(QDBusArgument &argument, const SyncStatus &s)
+ {
+ argument.beginStructure();
+ argument << s.mode << s.status << s.error;
+ argument.endStructure();
+ return argument;
+ }
+
+ // Retrieve the SyncStatus data from the D-BUS argument
+ const QDBusArgument &operator>>(const QDBusArgument &argument, SyncStatus &s)
+ {
+ argument.beginStructure();
+ argument >> s.mode >> s.status >> s.error;
+ argument.endStructure();
+ return argument;
+ }
+
diff --git a/src/dbus/qt/dbustypes.h b/src/dbus/qt/dbustypes.h
new file mode 100644
index 00000000..dd16027e
--- /dev/null
+++ b/src/dbus/qt/dbustypes.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2010 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef DBUSTYPES_H
+#define DBUSTYPES_H
+
+#include "commondbustypes.h"
+
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QMetaType>
+#include <QtDBus/QtDBus>
+
+struct SyncDatabase
+{
+ QString name;
+ QString source;
+ bool flag;
+};
+Q_DECLARE_METATYPE ( SyncDatabase )
+
+ // Marshall the SyncDatabase data into a D-BUS argument
+ QDBusArgument &operator<<(QDBusArgument &argument, const SyncDatabase &mystruct);
+ // Retrieve the SyncDatabase data from the D-BUS argument
+ const QDBusArgument &operator>>(const QDBusArgument &argument, SyncDatabase &mystruct);
+
+struct SyncProgress
+{
+ QString phase;
+ int prepareCount;
+ int prepareTotal;
+ int sendCount;
+ int sendTotal;
+ int recieveCount;
+ int recieveTotal;
+};
+Q_DECLARE_METATYPE ( SyncProgress )
+
+ // Marshall the SyncProgress data into a D-BUS argument
+ QDBusArgument &operator<<(QDBusArgument &argument, const SyncProgress &mystruct);
+ // Retrieve the SyncProgress data from the D-BUS argument
+ const QDBusArgument &operator>>(const QDBusArgument &argument, SyncProgress &mystruct);
+
+struct SyncStatus
+{
+ QString mode;
+ QString status;
+ unsigned int error;
+};
+Q_DECLARE_METATYPE ( SyncStatus )
+
+ // Marshall the SyncStatus data into a D-BUS argument
+ QDBusArgument &operator<<(QDBusArgument &argument, const SyncStatus &mystruct);
+ // Retrieve the SyncStatus data from the D-BUS argument
+ const QDBusArgument &operator>>(const QDBusArgument &argument, SyncStatus &mystruct);
+
+typedef QMap<QString, StringMap > QStringMultiMap;
+typedef QList< StringMap > QArrayOfStringMap;
+typedef QList< SyncDatabase > QArrayOfDatabases;
+typedef QMap<QString, SyncProgress > QSyncProgressMap;
+typedef QMap<QString, SyncStatus > QSyncStatusMap;
+
+Q_DECLARE_METATYPE ( QStringMultiMap )
+Q_DECLARE_METATYPE ( QArrayOfStringMap )
+Q_DECLARE_METATYPE ( QArrayOfDatabases )
+Q_DECLARE_METATYPE ( QSyncProgressMap )
+Q_DECLARE_METATYPE ( QSyncStatusMap )
+
+inline void registerMyDataTypes() {
+ qDBusRegisterMetaType< SyncDatabase >();
+ qDBusRegisterMetaType< QStringMultiMap >();
+ qDBusRegisterMetaType< QArrayOfStringMap >();
+ qDBusRegisterMetaType< QArrayOfDatabases >();
+ qDBusRegisterMetaType< SyncProgress >();
+ qDBusRegisterMetaType< QSyncProgressMap >();
+ qDBusRegisterMetaType< SyncStatus >();
+ qDBusRegisterMetaType< QSyncStatusMap >();
+}
+
+#endif //MYTYPES_H
diff --git a/src/gtk-ui/sync-config-widget.c b/src/gtk-ui/sync-config-widget.c
index 01306d21..2647c58e 100644
--- a/src/gtk-ui/sync-config-widget.c
+++ b/src/gtk-ui/sync-config-widget.c
@@ -2115,6 +2115,7 @@ sync_config_widget_add_alternative_config (SyncConfigWidget *self,
{
if (configured) {
sync_config_widget_set_config (self, config);
+ sync_config_widget_set_name (self, name);
sync_config_widget_set_configured (self, TRUE);
} else {
sync_config_widget_add_config (self, name, config);
diff --git a/src/gtk-ui/sync-ui.c b/src/gtk-ui/sync-ui.c
index f1bfdc69..8b750f34 100644
--- a/src/gtk-ui/sync-ui.c
+++ b/src/gtk-ui/sync-ui.c
@@ -664,6 +664,7 @@ set_app_state (app_data *data, app_state state)
gtk_widget_set_sensitive (data->main_frame, TRUE);
gtk_widget_set_sensitive (data->sync_btn, FALSE);
gtk_widget_set_sensitive (data->change_service_btn, FALSE);
+ gtk_widget_set_sensitive (data->settings_btn, FALSE);
gtk_widget_set_sensitive (data->emergency_btn, FALSE);
break;
case SYNC_UI_STATE_SERVER_FAILURE:
@@ -681,6 +682,7 @@ set_app_state (app_data *data, app_state state)
gtk_widget_set_sensitive (data->sync_btn, FALSE);
gtk_widget_set_sensitive (data->emergency_btn, FALSE);
gtk_widget_set_sensitive (data->change_service_btn, FALSE);
+ gtk_widget_set_sensitive (data->settings_btn, FALSE);
break;
case SYNC_UI_STATE_SERVER_OK:
if (data->online) {
@@ -689,6 +691,11 @@ set_app_state (app_data *data, app_state state)
gtk_widget_show (data->no_connection_box);
}
+ /* TRANSLATORS: These are for the button in main view, right side.
+ Keep line length below ~20 characters, use two lines if needed */
+ gtk_button_set_label (GTK_BUTTON (data->sync_btn),
+ _("Sync now"));
+
if (!data->current_service) {
gtk_widget_hide (data->service_box);
gtk_widget_hide (data->autosync_box);
@@ -713,21 +720,18 @@ set_app_state (app_data *data, app_state state)
gtk_widget_show (data->autosync_box);
gtk_widget_set_sensitive (data->sync_btn, data->online);
gtk_widget_set_sensitive (data->emergency_btn, TRUE);
- /* TRANSLATORS: These are for the button in main view, right side.
- Keep line length below ~20 characters, use two lines if needed */
if (data->synced_this_session && data->current_operation != OP_RESTORE) {
gtk_button_set_label (GTK_BUTTON (data->sync_btn),
_("Sync again"));
} else {
gtk_widget_hide (data->progress);
- gtk_button_set_label (GTK_BUTTON (data->sync_btn),
- _("Sync now"));
}
gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->sync_btn);
}
gtk_widget_set_sensitive (data->main_frame, TRUE);
gtk_widget_set_sensitive (data->change_service_btn, TRUE);
+ gtk_widget_set_sensitive (data->settings_btn, TRUE);
data->syncing = FALSE;
break;
@@ -743,6 +747,7 @@ set_app_state (app_data *data, app_state state)
}
gtk_widget_set_sensitive (data->main_frame, FALSE);
gtk_widget_set_sensitive (data->change_service_btn, FALSE);
+ gtk_widget_set_sensitive (data->settings_btn, FALSE);
gtk_widget_set_sensitive (data->emergency_btn, FALSE);
gtk_widget_set_sensitive (data->sync_btn,
@@ -1247,6 +1252,17 @@ build_autosync_ui (app_data *data)
gtk_widget_show (data->autosync_toggle);
}
+static void
+glade_name_workaround (GtkBuilder *builder, const char *name)
+{
+ GtkWidget *w;
+
+ w = GTK_WIDGET (gtk_builder_get_object (builder, name));
+ if (w) {
+ gtk_widget_set_name (w, name);
+ }
+}
+
static gboolean
init_ui (app_data *data)
{
@@ -1363,6 +1379,19 @@ init_ui (app_data *data)
g_signal_connect (data->new_device_btn, "clicked",
G_CALLBACK (new_device_clicked_cb), data);
+ /* workarounds for glade not working with gtkbuilder >= 2.20:
+ * widgets do not get names. */
+ glade_name_workaround (builder, "meego_win");
+ glade_name_workaround (builder, "sync_data_and_type_box");
+ glade_name_workaround (builder, "log_frame");
+ glade_name_workaround (builder, "backup_frame");
+ glade_name_workaround (builder, "services_frame");
+ glade_name_workaround (builder, "sync_service_label");
+ glade_name_workaround (builder, "sync_status_label");
+ glade_name_workaround (builder, "no_server_label");
+ glade_name_workaround (builder, "sync_failure_label");
+ glade_name_workaround (builder, "sync_btn");
+
init_bluetooth_ui (data);
g_object_unref (builder);
@@ -2037,6 +2066,7 @@ get_config_for_config_widget_cb (SyncevoServer *server,
/* NOTE: using device_name here means a new config will be saved with
* device_name (and not the template name). Not sure if this is
* what we really want... */
+
syncevo_config_get_value (config, NULL, "templateName", &device_name);
if (!device_name) {
syncevo_config_get_value (config, NULL, "fingerPrint", &fp);
@@ -2069,7 +2099,7 @@ get_config_for_config_widget_cb (SyncevoServer *server,
* all configs / templates, then decide what to sho w*/
/* there is a widget for this device already, add this info there*/
- if (g_strcmp0 ("1", ready) == 0) {
+ if (c_data->has_configuration || g_strcmp0 ("1", ready) == 0) {
sync_config_widget_add_alternative_config (w, device_name, config,
c_data->has_configuration);
}
@@ -2899,7 +2929,7 @@ save_config (app_data *data, SyncevoSession *session)
}
static void
-sync (operation_data *op_data, SyncevoSession *session)
+do_sync (operation_data *op_data, SyncevoSession *session)
{
GHashTable *source_modes;
GHashTableIter iter;
@@ -2969,7 +2999,7 @@ set_config_for_sync_cb (SyncevoSession *session,
return;
}
- sync (op_data, session);
+ do_sync (op_data, session);
}
static void
diff --git a/src/gtk-ui/ui.glade b/src/gtk-ui/ui.glade
index d632895c..ed409319 100644
--- a/src/gtk-ui/ui.glade
+++ b/src/gtk-ui/ui.glade
@@ -805,463 +805,480 @@ you can setup a service manually.</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
- <widget class="GtkHBox" id="hbox16">
+ <widget class="GtkScrolledWindow" id="emergency_scrolledwindow">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
<child>
- <widget class="GtkVBox" id="vbox20">
+ <widget class="GtkViewport" id="emergency_viewport">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">8</property>
+ <property name="resize_mode">queue</property>
<child>
- <widget class="GtkVBox" id="vbox39">
+ <widget class="GtkHBox" id="hbox16">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">8</property>
- <child>
- <widget class="GtkLabel" id="emergency_label">
- <property name="width_request">800</property>
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label">If something has gone horribly wrong you can try a slow sync, start from scratch or restore from backup.</property>
- <property name="wrap">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
<child>
- <widget class="GtkExpander" id="emergency_expander">
+ <widget class="GtkVBox" id="vbox20">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
<child>
- <widget class="GtkAlignment" id="alignment19">
+ <widget class="GtkVBox" id="vbox39">
<property name="visible">True</property>
- <property name="yscale">0</property>
- <property name="left_padding">20</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">8</property>
+ <child>
+ <widget class="GtkLabel" id="emergency_label">
+ <property name="width_request">800</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label">If something has gone horribly wrong you can try a slow sync, start from scratch or restore from backup.</property>
+ <property name="wrap">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
- <widget class="GtkTable" id="emergency_source_table">
+ <widget class="GtkExpander" id="emergency_expander">
<property name="visible">True</property>
- <property name="n_rows">2</property>
+ <property name="can_focus">True</property>
<child>
- <widget class="GtkCheckButton" id="checkbutton2">
- <property name="label" translatable="yes">Calendar</property>
+ <widget class="GtkAlignment" id="alignment19">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="yscale">0</property>
+ <property name="left_padding">20</property>
+ <child>
+ <widget class="GtkTable" id="emergency_source_table">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <child>
+ <widget class="GtkCheckButton" id="checkbutton2">
+ <property name="label" translatable="yes">Calendar</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkbutton3">
+ <property name="label" translatable="yes">Tasks</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
</widget>
</child>
<child>
- <widget class="GtkCheckButton" id="checkbutton3">
- <property name="label" translatable="yes">Tasks</property>
+ <widget class="GtkLabel" id="emergency_expander_label">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="label">Affected data:</property>
</widget>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
+ <property name="type">label_item</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
</child>
</widget>
- </child>
- <child>
- <widget class="GtkLabel" id="emergency_expander_label">
- <property name="visible">True</property>
- <property name="label">Affected data:</property>
- </widget>
<packing>
- <property name="type">label_item</property>
+ <property name="expand">False</property>
+ <property name="padding">8</property>
+ <property name="position">0</property>
</packing>
</child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="padding">8</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="slow_sync_box">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="slow_sync_label">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes" comments="a title in emergency view">&lt;big&gt;Slow sync&lt;/big&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkAlignment" id="alignment4">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">40</property>
- <property name="right_padding">40</property>
<child>
- <widget class="GtkHBox" id="hbox19">
+ <widget class="GtkVBox" id="slow_sync_box">
<property name="visible">True</property>
- <property name="spacing">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
<child>
- <widget class="GtkButton" id="slow_sync_btn">
+ <widget class="GtkLabel" id="slow_sync_label">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <child>
- <widget class="GtkLabel" id="slow_sync_btn_label">
- <property name="visible">True</property>
- <property name="xpad">16</property>
- <property name="label" translatable="yes">Slow sync</property>
- </widget>
- </child>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="a title in emergency view">&lt;big&gt;Slow sync&lt;/big&gt;</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
+ <property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="slow_sync_explanation_label">
+ <widget class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
- <property name="xpad">8</property>
- <property name="label" translatable="yes">A slow sync compares items from both sides and tries to merge them.
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xscale">0</property>
+ <property name="left_padding">40</property>
+ <property name="right_padding">40</property>
+ <child>
+ <widget class="GtkHBox" id="hbox19">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkButton" id="slow_sync_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <child>
+ <widget class="GtkLabel" id="slow_sync_btn_label">
+ <property name="visible">True</property>
+ <property name="xpad">16</property>
+ <property name="label" translatable="yes">Slow sync</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="slow_sync_explanation_label">
+ <property name="visible">True</property>
+ <property name="xpad">8</property>
+ <property name="label" translatable="yes">A slow sync compares items from both sides and tries to merge them.
This may fail in some cases, leading to duplicates or lost information.</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
+ <property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">8</property>
+ <property name="position">1</property>
+ </packing>
</child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="padding">8</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="label14">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes" comments="a title in emergency view">&lt;big&gt;Start from scratch&lt;/big&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkAlignment" id="alignment3">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="yalign">0</property>
- <property name="xscale">0</property>
- <property name="left_padding">40</property>
- <property name="right_padding">40</property>
<child>
- <widget class="GtkHBox" id="hbox13">
+ <widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
<child>
- <widget class="GtkButton" id="refresh_from_server_btn">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <child>
- <widget class="GtkLabel" id="refresh_from_server_btn_label">
- <property name="visible">True</property>
- <property name="xpad">16</property>
- <property name="label" translatable="yes">Delete all your local
-information and replace
-with data from Zyb</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label4">
+ <widget class="GtkLabel" id="label14">
<property name="visible">True</property>
- <property name="xpad">15</property>
- <property name="label" translatable="yes" comments="text between the two &quot;start from scratch&quot; buttons in emergency view">&lt;b&gt;or&lt;/b&gt;</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="a title in emergency view">&lt;big&gt;Start from scratch&lt;/big&gt;</property>
<property name="use_markup">True</property>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkButton" id="refresh_from_client_btn">
+ <widget class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xscale">0</property>
+ <property name="left_padding">40</property>
+ <property name="right_padding">40</property>
<child>
- <widget class="GtkLabel" id="refresh_from_client_btn_label">
+ <widget class="GtkHBox" id="hbox13">
<property name="visible">True</property>
- <property name="xpad">16</property>
- <property name="label" translatable="yes">Delete all data on Zyb
+ <child>
+ <widget class="GtkButton" id="refresh_from_server_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <child>
+ <widget class="GtkLabel" id="refresh_from_server_btn_label">
+ <property name="visible">True</property>
+ <property name="xpad">16</property>
+ <property name="label" translatable="yes">Delete all your local
+information and replace
+with data from Zyb</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="xpad">15</property>
+ <property name="label" translatable="yes" comments="text between the two &quot;start from scratch&quot; buttons in emergency view">&lt;b&gt;or&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="refresh_from_client_btn">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <child>
+ <widget class="GtkLabel" id="refresh_from_client_btn_label">
+ <property name="visible">True</property>
+ <property name="xpad">16</property>
+ <property name="label" translatable="yes">Delete all data on Zyb
and replace with your
local information</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</widget>
</child>
</widget>
<packing>
<property name="expand">False</property>
- <property name="position">2</property>
+ <property name="position">1</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="padding">8</property>
+ <property name="position">2</property>
+ </packing>
</child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="padding">8</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox21">
- <property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="label9">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes" comments="a title in emergency view">&lt;big&gt;Restore from backup&lt;/big&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="resize_mode">queue</property>
- <property name="left_padding">40</property>
- <property name="right_padding">40</property>
<child>
- <widget class="GtkVBox" id="vbox22">
+ <widget class="GtkVBox" id="vbox21">
<property name="visible">True</property>
<property name="orientation">vertical</property>
+ <property name="spacing">5</property>
<child>
- <widget class="GtkLabel" id="label12">
- <property name="width_request">800</property>
+ <widget class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes" comments="explanation of &quot;Restore backup&quot; function">Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost.</property>
- <property name="wrap">True</property>
+ <property name="label" translatable="yes" comments="a title in emergency view">&lt;big&gt;Restore from backup&lt;/big&gt;</property>
+ <property name="use_markup">True</property>
</widget>
<packing>
<property name="expand">False</property>
- <property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwindow1">
+ <widget class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
+ <property name="resize_mode">queue</property>
+ <property name="left_padding">40</property>
+ <property name="right_padding">40</property>
<child>
- <widget class="GtkViewport" id="backup_viewport">
+ <widget class="GtkVBox" id="vbox22">
<property name="visible">True</property>
- <property name="resize_mode">queue</property>
+ <property name="orientation">vertical</property>
<child>
- <widget class="GtkTable" id="emergency_backup_table">
+ <widget class="GtkLabel" id="label12">
+ <property name="width_request">800</property>
<property name="visible">True</property>
- <property name="n_rows">10</property>
- <property name="n_columns">2</property>
- <property name="row_spacing">16</property>
- <child>
- <widget class="GtkLabel" id="label59">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing Dec 5th 2009 16:35</property>
- </widget>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label69">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing Dec 5th 2009 13:35</property>
- </widget>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label79">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing Dec 5th 2009 11:35</property>
- </widget>
- <packing>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label89">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing Dec 3rd</property>
- </widget>
- <packing>
- <property name="top_attach">5</property>
- <property name="bottom_attach">6</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label109">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing Dec 1st</property>
- </widget>
- <packing>
- <property name="top_attach">6</property>
- <property name="bottom_attach">7</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label29">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing yesterday</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label30">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="ypad">5</property>
- <property name="label">Backup before syncing two hours ago</property>
- </widget>
- <packing>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes" comments="explanation of &quot;Restore backup&quot; function">Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost.</property>
+ <property name="wrap">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
<child>
- <widget class="GtkButton" id="button1">
- <property name="label">Restore</property>
+ <widget class="GtkViewport" id="backup_viewport">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <widget class="GtkTable" id="emergency_backup_table">
+ <property name="visible">True</property>
+ <property name="n_rows">10</property>
+ <property name="n_columns">2</property>
+ <property name="row_spacing">16</property>
+ <child>
+ <widget class="GtkLabel" id="label59">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing Dec 5th 2009 16:35</property>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label69">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing Dec 5th 2009 13:35</property>
+ </widget>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label79">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing Dec 5th 2009 11:35</property>
+ </widget>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label89">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing Dec 3rd</property>
+ </widget>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label109">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing Dec 1st</property>
+ </widget>
+ <packing>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label29">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing yesterday</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label30">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="ypad">5</property>
+ <property name="label">Backup before syncing two hours ago</property>
+ </widget>
+ <packing>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button1">
+ <property name="label">Restore</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ <property name="x_padding">16</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
+ </child>
</widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- <property name="x_padding">16</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
</child>
</widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
</child>
</widget>
</child>
@@ -1271,23 +1288,20 @@ local information</property>
</packing>
</child>
</widget>
+ <packing>
+ <property name="padding">8</property>
+ <property name="position">3</property>
+ </packing>
</child>
</widget>
<packing>
- <property name="position">1</property>
+ <property name="padding">40</property>
+ <property name="position">0</property>
</packing>
</child>
</widget>
- <packing>
- <property name="padding">8</property>
- <property name="position">3</property>
- </packing>
</child>
</widget>
- <packing>
- <property name="padding">40</property>
- <property name="position">0</property>
- </packing>
</child>
</widget>
</child>
diff --git a/src/syncevo-dbus-server.cpp b/src/syncevo-dbus-server.cpp
index 96c13dc2..6c41229a 100644
--- a/src/syncevo-dbus-server.cpp
+++ b/src/syncevo-dbus-server.cpp
@@ -2023,7 +2023,10 @@ public:
// exceptions must be handled (= printed) before returning,
// so that our client gets the output
try {
- m_cmdline.run();
+ if (!m_cmdline.run()) {
+ SE_THROW_EXCEPTION(DBusSyncException, "command line execution failure");
+ }
+
} catch (...) {
redirectPtr->flush();
throw;
@@ -5837,6 +5840,14 @@ int main(int argc, char **argv)
g_type_init();
g_thread_init(NULL);
g_set_application_name("SyncEvolution");
+
+ // Initializing a potential use of EDS early is necessary for
+ // libsynthesis when compiled with
+ // --enable-evolution-compatibility: in that mode libical will
+ // only be found by libsynthesis after EDSAbiWrapperInit()
+ // pulls it into the process by loading libecal.
+ EDSAbiWrapperInit();
+
loop = g_main_loop_new (NULL, FALSE);
setvbuf(stderr, NULL, _IONBF, 0);
diff --git a/src/syncevo/Cmdline.cpp b/src/syncevo/Cmdline.cpp
index 7d174707..eedaf613 100644
--- a/src/syncevo/Cmdline.cpp
+++ b/src/syncevo/Cmdline.cpp
@@ -1519,6 +1519,7 @@ class CmdlineTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testPrintServers);
CPPUNIT_TEST(testPrintConfig);
CPPUNIT_TEST(testPrintFileTemplates);
+ CPPUNIT_TEST(testPrintFileTemplatesConfig);
CPPUNIT_TEST(testTemplate);
CPPUNIT_TEST(testMatchTemplate);
CPPUNIT_TEST(testAddSource);
@@ -1852,6 +1853,7 @@ protected:
void testMatchTemplate() {
ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "testcases/templates");
+ ScopedEnvChange xdg("XDG_CONFIG_HOME", "/dev/null");
TestCmdline help1("--template", "?nokia 7210c", NULL);
help1.doit();
@@ -2083,12 +2085,27 @@ protected:
}
void testPrintFileTemplates() {
+ rm_r(m_testDir);
// use local copy of templates in build dir (no need to install)
ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "./templates");
ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir);
ScopedEnvChange home("HOME", m_testDir);
+ doPrintFileTemplates();
+ }
+
+ void testPrintFileTemplatesConfig() {
rm_r(m_testDir);
+ mkdir_p(m_testDir);
+ symlink("../templates", (m_testDir + "/syncevolution-templates").c_str());
+ ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "/dev/null");
+ ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir);
+ ScopedEnvChange home("HOME", m_testDir);
+
+ doPrintFileTemplates();
+ }
+
+ void doPrintFileTemplates() {
testSetupFunambol();
{
diff --git a/src/syncevo/ConfigNode.cpp b/src/syncevo/ConfigNode.cpp
new file mode 100644
index 00000000..e1bee7cc
--- /dev/null
+++ b/src/syncevo/ConfigNode.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ * Copyright (C) 2009 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <syncevo/FileConfigNode.h>
+#include <syncevo/SafeConfigNode.h>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+boost::shared_ptr<ConfigNode> ConfigNode::createFileNode(const string &filename)
+{
+ string::size_type off = filename.rfind('/');
+ boost::shared_ptr<ConfigNode> filenode;
+ if (off != filename.npos) {
+ filenode.reset(new FileConfigNode(filename.substr(0, off),
+ filename.substr(off + 1),
+ false));
+ } else {
+ filenode.reset(new FileConfigNode(".", filename, false));
+ }
+ boost::shared_ptr<SafeConfigNode> savenode(new SafeConfigNode(filenode));
+ savenode->setMode(false);
+ return savenode;
+}
+
+SE_END_CXX
diff --git a/src/syncevo/DataBlob.h b/src/syncevo/DataBlob.h
new file mode 100644
index 00000000..258860a6
--- /dev/null
+++ b/src/syncevo/DataBlob.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef INCL_EVOLUTION_DATA_BLOB
+# define INCL_EVOLUTION_DATA_BLOB
+
+#include <iostream>
+#include <boost/shared_ptr.hpp>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+/**
+ * Abstract base class for a chunk of data.
+ * Can be opened for reading and writing.
+ * Meant to be used for plain files and
+ * for sections inside a larger file.
+ */
+class DataBlob
+{
+ public:
+ virtual ~DataBlob() {}
+
+ /**
+ * Create stream for writing data.
+ * Always overwrites old data.
+ */
+ virtual boost::shared_ptr<std::ostream> write() = 0;
+
+ /**
+ * Create stream for reading data.
+ */
+ virtual boost::shared_ptr<std::istream> read() = 0;
+
+ /** some kind of user visible name for the data */
+ virtual std::string getName() const = 0;
+
+ /** true if the data exists already */
+ virtual bool exists() const = 0;
+
+ /** true if the data is read-only and write() will fail */
+ virtual bool isReadonly() const = 0;
+};
+
+SE_END_CXX
+
+#endif // INCL_EVOLUTION_DATA_BLOB
diff --git a/src/syncevo/FileConfigNode.cpp b/src/syncevo/FileConfigNode.cpp
index 8ce84d6c..2ff7ceed 100644
--- a/src/syncevo/FileConfigNode.cpp
+++ b/src/syncevo/FileConfigNode.cpp
@@ -33,24 +33,6 @@
#include <syncevo/declarations.h>
SE_BEGIN_CXX
-/** @TODO: replace stdio.h with streams */
-
-boost::shared_ptr<ConfigNode> ConfigNode::createFileNode(const string &filename)
-{
- string::size_type off = filename.rfind('/');
- boost::shared_ptr<ConfigNode> filenode;
- if (off != filename.npos) {
- filenode.reset(new FileConfigNode(filename.substr(0, off),
- filename.substr(off + 1),
- false));
- } else {
- filenode.reset(new FileConfigNode(".", filename, false));
- }
- boost::shared_ptr<SafeConfigNode> savenode(new SafeConfigNode(filenode));
- savenode->setMode(false);
- return savenode;
-}
-
FileBaseConfigNode::FileBaseConfigNode(const string &path, const string &fileName, bool readonly) :
m_path(path),
m_fileName(fileName),
diff --git a/src/syncevo/FileDataBlob.cpp b/src/syncevo/FileDataBlob.cpp
new file mode 100644
index 00000000..e0dc2c00
--- /dev/null
+++ b/src/syncevo/FileDataBlob.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <syncevo/FileDataBlob.h>
+#include <syncevo/SafeOstream.h>
+#include <syncevo/util.h>
+
+#include <unistd.h>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+FileDataBlob::FileDataBlob(const std::string &path, const std::string &fileName, bool readonly) :
+ m_path(path),
+ m_fileName(fileName),
+ m_readonly(readonly)
+{
+}
+
+FileDataBlob::FileDataBlob(const std::string &fullpath, bool readonly) :
+ m_readonly(readonly)
+{
+ splitPath(fullpath, m_path, m_fileName);
+}
+
+boost::shared_ptr<std::ostream> FileDataBlob::write()
+{
+ if (m_readonly) {
+ SE_THROW(getName() + ": internal error: attempt to write read-only FileDataBlob");
+ }
+
+ mkdir_p(m_path);
+
+ boost::shared_ptr<std::ostream> file(new SafeOstream(getName()));
+ return file;
+}
+
+boost::shared_ptr<std::istream> FileDataBlob::read()
+{
+ boost::shared_ptr<std::istream> file(new std::ifstream(getName().c_str()));
+ return file;
+}
+
+std::string FileDataBlob::getName() const
+{
+ return m_path + "/" + m_fileName;
+}
+
+bool FileDataBlob::exists() const
+{
+ std::string fullname = getName();
+ return !access(fullname.c_str(), F_OK);
+}
+
+SE_END_CXX
diff --git a/src/syncevo/FileDataBlob.h b/src/syncevo/FileDataBlob.h
new file mode 100644
index 00000000..c889902d
--- /dev/null
+++ b/src/syncevo/FileDataBlob.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef INCL_EVOLUTION_FILE_DATA_BLOB
+# define INCL_EVOLUTION_FILE_DATA_BLOB
+
+#include <syncevo/DataBlob.h>
+#include <string>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+/**
+ * Abstract base class for a chunk of data.
+ * Can be opened for reading and writing.
+ * Meant to be used for plain files and
+ * for sections inside a larger file.
+ */
+class FileDataBlob : public DataBlob
+{
+ std::string m_path;
+ std::string m_fileName;
+ bool m_readonly;
+
+ public:
+ /**
+ * @param path directory name
+ * @param fileName name of file inside that directory
+ * @param readonly do not create or write file, it must exist;
+ * write() will throw an exception
+ */
+ FileDataBlob(const std::string &path, const std::string &fileName, bool readonly);
+ FileDataBlob(const std::string &fullpath, bool readonly);
+
+ boost::shared_ptr<std::ostream> write();
+ boost::shared_ptr<std::istream> read();
+
+ virtual std::string getName() const;
+ virtual bool exists() const;
+ virtual bool isReadonly() const { return m_readonly; }
+};
+
+SE_END_CXX
+
+#endif // INCL_EVOLUTION_FILE_DATA_BLOB
diff --git a/src/syncevo/IniConfigNode.cpp b/src/syncevo/IniConfigNode.cpp
new file mode 100644
index 00000000..b7b2d68e
--- /dev/null
+++ b/src/syncevo/IniConfigNode.cpp
@@ -0,0 +1,375 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ * Copyright (C) 2009 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <syncevo/IniConfigNode.h>
+#include <syncevo/FileDataBlob.h>
+#include <syncevo/SyncConfig.h>
+#include <syncevo/util.h>
+
+#include <boost/scoped_array.hpp>
+#include <boost/foreach.hpp>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+IniBaseConfigNode::IniBaseConfigNode(const boost::shared_ptr<DataBlob> &data) :
+ m_data(data)
+{
+}
+
+void IniBaseConfigNode::flush()
+{
+ if (!m_modified) {
+ return;
+ }
+
+ if (m_data->isReadonly()) {
+ throw std::runtime_error(m_data->getName() + ": internal error: flushing read-only config node not allowed");
+ }
+
+ boost::shared_ptr<std::ostream> file = m_data->write();
+ toFile(*file);
+
+ m_modified = false;
+}
+
+IniFileConfigNode::IniFileConfigNode(const boost::shared_ptr<DataBlob> &data) :
+ IniBaseConfigNode(data)
+{
+ read();
+}
+
+IniFileConfigNode::IniFileConfigNode(const string &path, const string &fileName, bool readonly) :
+ IniBaseConfigNode(boost::shared_ptr<DataBlob>(new FileDataBlob(path, fileName, readonly)))
+{
+ read();
+}
+
+
+
+void IniFileConfigNode::toFile(std::ostream &file) {
+ BOOST_FOREACH(const string &line, m_lines) {
+ file << line << std::endl;
+ }
+}
+
+void IniFileConfigNode::read()
+{
+ boost::shared_ptr<std::istream> file(m_data->read());
+ std::string line;
+ while (getline(*file, line)) {
+ m_lines.push_back(line);
+ }
+ m_modified = false;
+}
+
+
+/**
+ * get property and value from line, if any present
+ */
+static bool getContent(const string &line,
+ string &property,
+ string &value,
+ bool &isComment,
+ bool fuzzyComments)
+{
+ size_t start = 0;
+ while (start < line.size() &&
+ isspace(line[start])) {
+ start++;
+ }
+
+ // empty line?
+ if (start == line.size()) {
+ return false;
+ }
+
+ // Comment? Potentially keep reading, might be commented out assignment.
+ isComment = false;
+ if (line[start] == '#') {
+ if (!fuzzyComments) {
+ return false;
+ }
+ isComment = true;
+ }
+
+ // recognize # <word> = <value> as commented out (= default) value
+ if (isComment) {
+ start++;
+ while (start < line.size() &&
+ isspace(line[start])) {
+ start++;
+ }
+ }
+
+ // extract property
+ size_t end = start;
+ while (end < line.size() &&
+ !isspace(line[end])) {
+ end++;
+ }
+ property = line.substr(start, end - start);
+
+ // skip assignment
+ start = end;
+ while (start < line.size() &&
+ isspace(line[start])) {
+ start++;
+ }
+ if (start == line.size() ||
+ line[start] != '=') {
+ // invalid syntax or we tried to read a comment as assignment
+ return false;
+ }
+
+ // extract value
+ start++;
+ while (start < line.size() &&
+ isspace(line[start])) {
+ start++;
+ }
+
+ value = line.substr(start);
+ // remove trailing white space: usually it is
+ // added accidentally by users
+ size_t numspaces = 0;
+ while (numspaces < value.size() &&
+ isspace(value[value.size() - 1 - numspaces])) {
+ numspaces++;
+ }
+ value.erase(value.size() - numspaces);
+
+ // @TODO: strip quotation marks around value?!
+
+ return true;
+}
+
+/**
+ * check whether the line contains the property and if so, extract its value
+ */
+static bool getValue(const string &line,
+ const string &property,
+ string &value,
+ bool &isComment,
+ bool fuzzyComments)
+
+{
+ string curProp;
+ return getContent(line, curProp, value, isComment, fuzzyComments) &&
+ !strcasecmp(curProp.c_str(), property.c_str());
+}
+
+string IniFileConfigNode::readProperty(const string &property) const {
+ string value;
+
+ BOOST_FOREACH(const string &line, m_lines) {
+ bool isComment;
+
+ if (getValue(line, property, value, isComment, false)) {
+ return value;
+ }
+ }
+ return "";
+}
+
+void IniFileConfigNode::readProperties(ConfigProps &props) const {
+ map<string, string> res;
+ string value, property;
+
+ BOOST_FOREACH(const string &line, m_lines) {
+ bool isComment;
+ if (getContent(line, property, value, isComment, false)) {
+ // don't care about the result: only the first instance
+ // of the property counts, so it doesn't matter when
+ // inserting it again later fails
+ props.insert(pair<string, string>(property, value));
+ }
+ }
+}
+
+void IniFileConfigNode::removeProperty(const string &property)
+{
+ string value;
+
+ list<string>::iterator it = m_lines.begin();
+ while (it != m_lines.end()) {
+ const string &line = *it;
+ bool isComment;
+ if (getValue(line, property, value, isComment, false)) {
+ it = m_lines.erase(it);
+ m_modified = true;
+ } else {
+ it++;
+ }
+ }
+}
+
+void IniFileConfigNode::setProperty(const string &property,
+ const string &newvalue,
+ const string &comment,
+ const string *defValue) {
+ string newstr;
+ string oldvalue;
+ bool isDefault = false;
+
+ if (defValue &&
+ *defValue == newvalue) {
+ newstr += "# ";
+ isDefault = true;
+ }
+ newstr += property + " = " + newvalue;
+
+ BOOST_FOREACH(string &line, m_lines) {
+ bool isComment;
+
+ if (getValue(line, property, oldvalue, isComment, true)) {
+ if (newvalue != oldvalue ||
+ (isComment && !isDefault)) {
+ line = newstr;
+ m_modified = true;
+ }
+ return;
+ }
+ }
+
+ // add each line of the comment as separate line in .ini file
+ if (comment.size()) {
+ list<string> commentLines;
+ ConfigProperty::splitComment(comment, commentLines);
+ if (m_lines.size()) {
+ m_lines.push_back("");
+ }
+ BOOST_FOREACH(const string &comment, commentLines) {
+ m_lines.push_back(string("# ") + comment);
+ }
+ }
+
+ m_lines.push_back(newstr);
+ m_modified = true;
+}
+
+void IniFileConfigNode::clear()
+{
+ m_lines.clear();
+ m_modified = true;
+}
+
+IniHashConfigNode::IniHashConfigNode(const boost::shared_ptr<DataBlob> &data) :
+ IniBaseConfigNode(data)
+{
+ read();
+}
+
+IniHashConfigNode::IniHashConfigNode(const string &path, const string &fileName, bool readonly) :
+ IniBaseConfigNode(boost::shared_ptr<DataBlob>(new FileDataBlob(path, fileName, readonly)))
+{
+ read();
+}
+
+void IniHashConfigNode::read()
+{
+ boost::shared_ptr<std::istream> file(m_data->read());
+ std::string line;
+ while (std::getline(*file, line)) {
+ string property, value;
+ bool isComment;
+ if (getContent(line, property, value, isComment, false)) {
+ m_props.insert(StringPair(property, value));
+ }
+ }
+ m_modified = false;
+}
+
+void IniHashConfigNode::toFile(std::ostream &file)
+{
+ BOOST_FOREACH(const StringPair &prop, m_props) {
+ file << prop.first << " = " << prop.second << std::endl;
+ }
+}
+
+void IniHashConfigNode::readProperties(ConfigProps &props) const
+{
+ BOOST_FOREACH(const StringPair &prop, m_props) {
+ props.insert(prop);
+ }
+}
+
+void IniHashConfigNode::writeProperties(const ConfigProps &props)
+{
+ if (!props.empty()) {
+ m_props.insert(props.begin(), props.end());
+ m_modified = true;
+ }
+}
+
+
+string IniHashConfigNode::readProperty(const string &property) const
+{
+ std::map<std::string, std::string>::const_iterator it = m_props.find(property);
+ if (it != m_props.end()) {
+ return it->second;
+ } else {
+ return "";
+ }
+}
+
+void IniHashConfigNode::removeProperty(const string &property) {
+ map<string, string>::iterator it = m_props.find(property);
+ if(it != m_props.end()) {
+ m_props.erase(it);
+ m_modified = true;
+ }
+}
+
+void IniHashConfigNode::clear()
+{
+ if (!m_props.empty()) {
+ m_props.clear();
+ m_modified = true;
+ }
+}
+
+void IniHashConfigNode::setProperty(const string &property,
+ const string &newvalue,
+ const string &comment,
+ const string *defValue)
+{
+ /** we don't support property comments here. Also, we ignore comment*/
+ if (defValue &&
+ *defValue == newvalue) {
+ removeProperty(property);
+ return;
+ }
+ map<string, string>::iterator it = m_props.find(property);
+ if(it != m_props.end()) {
+ string oldvalue = it->second;
+ if(oldvalue != newvalue) {
+ m_props.erase(it);
+ m_props.insert(StringPair(property, newvalue));
+ m_modified = true;
+ }
+ } else {
+ m_props.insert(StringPair(property, newvalue));
+ m_modified = true;
+ }
+}
+
+
+SE_END_CXX
diff --git a/src/syncevo/IniConfigNode.h b/src/syncevo/IniConfigNode.h
new file mode 100644
index 00000000..dd3917f6
--- /dev/null
+++ b/src/syncevo/IniConfigNode.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef INCL_EVOLUTION_INI_CONFIG_NODE
+# define INCL_EVOLUTION_INI_CONFIG_NODE
+
+#include <syncevo/ConfigNode.h>
+#include <syncevo/DataBlob.h>
+
+#include <string>
+#include <list>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+using namespace std;
+
+/**
+ * A base class for .ini style data blobs.
+ */
+class IniBaseConfigNode: public ConfigNode {
+ protected:
+ boost::shared_ptr<DataBlob> m_data;
+ bool m_modified;
+
+ /**
+ * Open or create a new blob. The blob will be read (if it exists)
+ * but not created or written to unless flush() is called explicitly.
+ */
+ IniBaseConfigNode(const boost::shared_ptr<DataBlob> &data);
+
+ /**
+ * a virtual method to serial data structure to the file
+ * It is used by flush function to flush memory into disk file
+ */
+ virtual void toFile(std::ostream &file) = 0;
+
+ public:
+ virtual void flush();
+ virtual string getName() const { return m_data->getName(); }
+ virtual bool exists() const { return m_data->exists(); }
+};
+
+/**
+ * This class started its life as the Posix implementation of the
+ * ManagementNode in the Funambol C++ client library. Nowadays it is
+ * part of the SyncEvolution ConfigTree (see there for details).
+ *
+ * Each node is mapped to one file whose location is determined by
+ * the ConfigTree when the node gets created. Each node represents
+ * one .ini file with entries of the type
+ * <property>\s*=\s*<value>\s*\n
+ *
+ * Comments look like:
+ * \s*# <comment>
+ *
+ */
+class IniFileConfigNode : public IniBaseConfigNode {
+ list<string> m_lines;
+
+ void read();
+
+ protected:
+ virtual void toFile(std::ostream &file);
+
+ public:
+ IniFileConfigNode(const boost::shared_ptr<DataBlob> &data);
+ IniFileConfigNode(const string &path, const string &fileName, bool readonly);
+
+ /* keep underlying methods visible; our own setProperty() would hide them */
+ using ConfigNode::setProperty;
+
+ virtual string readProperty(const string &property) const;
+ virtual void setProperty(const string &property,
+ const string &value,
+ const string &comment = "",
+ const string *defValue = NULL);
+ virtual void readProperties(ConfigProps &props) const;
+ virtual void removeProperty(const string &property);
+ virtual void clear();
+};
+
+/**
+ * The main difference from FileConfigNode is to store pair of 'property-value'
+ * in a map to avoid O(n^2) string comparison
+ * Here comments for property default value are discarded.
+ */
+class IniHashConfigNode: public IniBaseConfigNode {
+ map<std::string, std::string> m_props;
+ /**
+ * Map used to store pairs
+ */
+ void read();
+
+ protected:
+
+ virtual void toFile(std::ostream & file);
+
+ public:
+ IniHashConfigNode(const boost::shared_ptr<DataBlob> &data);
+ IniHashConfigNode(const string &path, const string &fileName, bool readonly);
+ virtual string readProperty(const string &property) const;
+ virtual void setProperty(const string &property,
+ const string &value,
+ const string &comment = "",
+ const string *defValue = NULL);
+ virtual void readProperties(ConfigProps &props) const;
+ virtual void writeProperties(const ConfigProps &props);
+ virtual void removeProperty(const string &property);
+ virtual void clear();
+};
+
+
+SE_END_CXX
+#endif // INCL_EVOLUTION_INI_CONFIG_NODE
diff --git a/src/syncevo/LogRedirect.cpp b/src/syncevo/LogRedirect.cpp
index eb17d7b3..66dd2522 100644
--- a/src/syncevo/LogRedirect.cpp
+++ b/src/syncevo/LogRedirect.cpp
@@ -393,10 +393,11 @@ bool LogRedirect::process(FDs &fds) throw()
while (*text == '\n') {
text++;
}
- const char *glib_debug_prefix = "** (process:";
+ const char *glib_debug_prefix = "** ("; // ** (client-test:875): WARNING **:
const char *glib_msg_prefix = "** Message:";
prefix = "stderr";
- if (!strncmp(text, glib_debug_prefix, strlen(glib_debug_prefix)) ||
+ if ((!strncmp(text, glib_debug_prefix, strlen(glib_debug_prefix)) &&
+ strstr(text, " **:")) ||
!strncmp(text, glib_msg_prefix, strlen(glib_msg_prefix))) {
level = Logger::DEBUG;
prefix = "glib";
@@ -662,10 +663,19 @@ public:
buffer.m_redirect->process();
- std::string debug = buffer.m_streams[Logger::DEBUG].str();
+ std::string error = buffer.m_streams[Logger::ERROR].str();
+ std::string warning = buffer.m_streams[Logger::WARNING].str();
+ std::string show = buffer.m_streams[Logger::SHOW].str();
+ std::string info = buffer.m_streams[Logger::INFO].str();
std::string dev = buffer.m_streams[Logger::DEV].str();
- CPPUNIT_ASSERT(debug.find("test warning") != debug.npos);
+ std::string debug = buffer.m_streams[Logger::DEBUG].str();
+ CPPUNIT_ASSERT_EQUAL(string(""), error);
+ CPPUNIT_ASSERT_EQUAL(string(""), warning);
+ CPPUNIT_ASSERT_EQUAL(string(""), show);
+ CPPUNIT_ASSERT_EQUAL(string(""), info);
+ CPPUNIT_ASSERT_EQUAL(string(""), error);
CPPUNIT_ASSERT(dev.find("normal message stderr") != dev.npos);
+ CPPUNIT_ASSERT(debug.find("test warning") != debug.npos);
} catch(...) {
dup2(orig_stdout, STDOUT_FILENO);
throw;
diff --git a/src/syncevo/Makefile.am b/src/syncevo/Makefile.am
index a8a7880a..f55cef97 100644
--- a/src/syncevo/Makefile.am
+++ b/src/syncevo/Makefile.am
@@ -19,6 +19,7 @@ lib_LTLIBRARIES = libsyncevolution.la
SYNCEVOLUTION_SOURCES = \
ConfigTree.h \
ConfigNode.h \
+ ConfigNode.cpp \
HashConfigNode.h \
VolatileConfigNode.h \
VolatileConfigTree.h \
@@ -83,6 +84,20 @@ SYNCEVOLUTION_SOURCES = \
FileConfigNode.h \
FileConfigNode.cpp \
\
+ IniConfigNode.h \
+ IniConfigNode.cpp \
+ SingleFileConfigTree.h \
+ SingleFileConfigTree.cpp \
+ \
+ DataBlob.h \
+ FileDataBlob.h \
+ FileDataBlob.cpp \
+ StringDataBlob.h \
+ StringDataBlob.cpp \
+ \
+ SafeOstream.h \
+ SafeOstream.cpp \
+ \
FileConfigTree.h \
FileConfigTree.cpp \
\
diff --git a/src/syncevo/SafeOstream.cpp b/src/syncevo/SafeOstream.cpp
new file mode 100644
index 00000000..cde64f9a
--- /dev/null
+++ b/src/syncevo/SafeOstream.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <syncevo/SafeOstream.h>
+#include <syncevo/SyncContext.h>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+SafeOstream::SafeOstream(const std::string filename) :
+ m_filename(filename)
+{
+ size_t pos = filename.rfind('/');
+ if (pos == filename.npos) {
+ m_tmpFilename = ".#";
+ m_tmpFilename += filename;
+ } else {
+ m_tmpFilename.assign(filename, 0, pos + 1);
+ m_tmpFilename += ".#";
+ m_tmpFilename += filename.substr(pos + 1);
+ }
+ open(m_tmpFilename.c_str());
+}
+
+SafeOstream::~SafeOstream()
+{
+ close();
+ if (bad() ||
+ rename(m_tmpFilename.c_str(), m_filename.c_str())) {
+ SyncContext::throwError(m_tmpFilename, errno);
+ }
+}
+
+SE_END_CXX
+
diff --git a/src/syncevo/SafeOstream.h b/src/syncevo/SafeOstream.h
new file mode 100644
index 00000000..3488eab6
--- /dev/null
+++ b/src/syncevo/SafeOstream.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef INCL_EVOLUTION_SAFE_OSTREAM
+# define INCL_EVOLUTION_SAFE_OSTREAM
+
+#include <fstream>
+#include <string>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+/**
+ * Writes into temporary file (.# prefix) first, then renames to real
+ * file only when no error encountered at the time of deleting the
+ * instance. Once instantiated, the only way to safe the content of the
+ * real file is to set the "fail" bit. In that sense it is similar to
+ * instantiating a normal ofstream, which would directly overwrite
+ * the file at creation time.
+ */
+class SafeOstream : public std::ofstream
+{
+ std::string m_filename;
+ std::string m_tmpFilename;
+
+ public:
+ /**
+ * @param filename real filename, without the .# prefix
+ */
+ SafeOstream(const std::string filename);
+
+ /**
+ * on success, rename file
+ */
+ ~SafeOstream();
+};
+
+SE_END_CXX
+
+#endif // INCL_EVOLUTION_SAFE_OSTREAM
diff --git a/src/syncevo/SingleFileConfigTree.cpp b/src/syncevo/SingleFileConfigTree.cpp
new file mode 100644
index 00000000..121f83ac
--- /dev/null
+++ b/src/syncevo/SingleFileConfigTree.cpp
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <config.h>
+#include "test.h"
+#include <syncevo/SingleFileConfigTree.h>
+#include <syncevo/StringDataBlob.h>
+#include <syncevo/FileDataBlob.h>
+#include <syncevo/IniConfigNode.h>
+#include <syncevo/util.h>
+
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+using namespace std;
+
+SingleFileConfigTree::SingleFileConfigTree(const boost::shared_ptr<DataBlob> &data) :
+ m_data(data)
+{
+ readFile();
+}
+
+SingleFileConfigTree::SingleFileConfigTree(const string &fullpath) :
+ m_data(new FileDataBlob(fullpath, true))
+{
+ readFile();
+}
+
+boost::shared_ptr<ConfigNode> SingleFileConfigTree::open(const string &filename)
+{
+ string normalized = normalizePath(string("/") + filename);
+ boost::shared_ptr<ConfigNode> &entry = m_nodes[normalized];
+ if (entry) {
+ return entry;
+ }
+
+ string name = getRootPath() + " - " + normalized;
+ boost::shared_ptr<DataBlob> data;
+
+ BOOST_FOREACH(const FileContent_t::value_type &file, m_content) {
+ if (file.first == normalized) {
+ data.reset(new StringDataBlob(name, file.second, true));
+ break;
+ }
+ }
+ if (!data) {
+ /*
+ * creating new files not supported, would need support for detecting
+ * StringDataBlob::write()
+ */
+ data.reset(new StringDataBlob(name, boost::shared_ptr<std::string>(), true));
+ }
+ entry.reset(new IniFileConfigNode(data));
+ return entry;
+}
+
+void SingleFileConfigTree::flush()
+{
+ // not implemented, cannot write anyway
+}
+
+void SingleFileConfigTree::remove(const string &path)
+{
+ SE_THROW("internal error: SingleFileConfigTree::remove() called");
+}
+
+void SingleFileConfigTree::reset()
+{
+ m_nodes.clear();
+ readFile();
+}
+
+boost::shared_ptr<ConfigNode> SingleFileConfigTree::open(const string &path,
+ PropertyType type,
+ const string &otherId)
+{
+ string fullpath = path;
+ if (!fullpath.empty()) {
+ fullpath += "/";
+ }
+ switch (type) {
+ case visible:
+ fullpath += "config.ini";
+ break;
+ case hidden:
+ fullpath += ".internal.ini";
+ break;
+ case other:
+ fullpath += ".other.ini";
+ break;
+ case server:
+ fullpath += ".server.ini";
+ break;
+ }
+
+ return open(fullpath);
+}
+
+static void checkChild(const string &normalized,
+ const string &node,
+ set<string> &subdirs)
+{
+ if (boost::starts_with(node, normalized)) {
+ string remainder = node.substr(normalized.size());
+ size_t offset = remainder.find('/');
+ if (offset != remainder.npos) {
+ // only directories underneath path matter
+ subdirs.insert(remainder.substr(0, offset));
+ }
+ }
+}
+
+list<string> SingleFileConfigTree::getChildren(const string &path)
+{
+ set<string> subdirs;
+ string normalized = normalizePath(string("/") + path);
+ if (normalized != "/") {
+ normalized += "/";
+ }
+
+ // must check both actual files as well as unsaved nodes
+ BOOST_FOREACH(const FileContent_t::value_type &file, m_content) {
+ checkChild(normalized, file.first, subdirs);
+ }
+ BOOST_FOREACH(const NodeCache_t::value_type &file, m_nodes) {
+ checkChild(normalized, file.first, subdirs);
+ }
+
+ list<string> result;
+ BOOST_FOREACH(const string &dir, subdirs) {
+ result.push_back(dir);
+ }
+ return result;
+}
+
+void SingleFileConfigTree::readFile()
+{
+ boost::shared_ptr<istream> in(m_data->read());
+ boost::shared_ptr<string> content;
+ string line;
+
+ m_content.clear();
+ while (getline(*in, line)) {
+ if (boost::starts_with(line, "=== ") &&
+ boost::ends_with(line, " ===")) {
+ string name = line.substr(4, line.size() - 8);
+ name = normalizePath(string("/") + name);
+ content.reset(new string);
+ m_content[name] = content;
+ } else if (content) {
+ (*content) += line;
+ (*content) += "\n";
+ }
+ }
+}
+
+#ifdef ENABLE_UNIT_TESTS
+
+class SingleIniTest : public CppUnit::TestFixture {
+ CPPUNIT_TEST_SUITE(SingleIniTest);
+ CPPUNIT_TEST(simple);
+ CPPUNIT_TEST_SUITE_END();
+
+ void simple() {
+ boost::shared_ptr<string> data(new string);
+ data->assign("# comment\n"
+ "# foo\n"
+ "=== foo/config.ini ===\n"
+ "foo = bar\n"
+ "foo2 = bar2\n"
+ "=== foo/.config.ini ===\n"
+ "foo_internal = bar_internal\n"
+ "foo2_internal = bar2_internal\n"
+ "=== /bar/.internal.ini ===\n"
+ "bar = foo\n"
+ "=== sources/addressbook/config.ini ===\n"
+ "=== sources/calendar/config.ini ===\n"
+ "evolutionsource = Personal\n");
+ boost::shared_ptr<DataBlob> blob(new StringDataBlob("test", data, true));
+ SingleFileConfigTree tree(blob);
+ boost::shared_ptr<ConfigNode> node;
+ node = tree.open("foo/config.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(node->exists());
+ CPPUNIT_ASSERT_EQUAL(string("test - /foo/config.ini"), node->getName());
+ CPPUNIT_ASSERT_EQUAL(string("bar"), node->readProperty("foo"));
+ CPPUNIT_ASSERT_EQUAL(string("bar2"), node->readProperty("foo2"));
+ node = tree.open("/foo/config.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(node->exists());
+ node = tree.open("foo//.config.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(node->exists());
+ CPPUNIT_ASSERT_EQUAL(string("bar_internal"), node->readProperty("foo_internal"));
+ CPPUNIT_ASSERT_EQUAL(string("bar2_internal"), node->readProperty("foo2_internal"));
+ node = tree.open("bar///./.internal.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(node->exists());
+ CPPUNIT_ASSERT_EQUAL(string("foo"), node->readProperty("bar"));
+ node = tree.open("sources/addressbook/config.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(node->exists());
+ node = tree.open("sources/calendar/config.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(node->exists());
+ CPPUNIT_ASSERT_EQUAL(string("Personal"), node->readProperty("evolutionsource"));
+
+ node = tree.open("no-such-source/config.ini");
+ CPPUNIT_ASSERT(node);
+ CPPUNIT_ASSERT(!node->exists());
+
+ list<string> dirs = tree.getChildren("");
+ CPPUNIT_ASSERT_EQUAL(string("bar|foo|no-such-source|sources"), boost::join(dirs, "|"));
+ dirs = tree.getChildren("sources/");
+ CPPUNIT_ASSERT_EQUAL(string("addressbook|calendar"), boost::join(dirs, "|"));
+ }
+};
+
+SYNCEVOLUTION_TEST_SUITE_REGISTRATION(SingleIniTest);
+
+#endif // ENABLE_UNIT_TESTS
+
+
+SE_END_CXX
diff --git a/src/syncevo/SingleFileConfigTree.h b/src/syncevo/SingleFileConfigTree.h
new file mode 100644
index 00000000..7e1581a7
--- /dev/null
+++ b/src/syncevo/SingleFileConfigTree.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef INCL_EVOLUTION_SINGLE_FILE_CONFIG_TREE
+# define INCL_EVOLUTION_SINGLE_FILE_CONFIG_TREE
+
+#include <ConfigTree.h>
+#include <DataBlob.h>
+#include <util.h>
+
+#include <string>
+#include <map>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+/**
+ * This class handles data blobs which contain multiple .ini files, using
+ * the following format:
+ * @verbatim
+# comment
+# ...
+=== <first path>/[.internal.ini|config.ini|template.ini|...] ===
+<file content>
+=== <second file name> ===
+...
+ * @endverbatim
+ *
+ * This is based on the assumption that the === ... === file separator
+ * is not part of valid .ini file content.
+ *
+ * Right now, only reading such a single data blob is implemented.
+ */
+class SingleFileConfigTree : public ConfigTree {
+ public:
+ /**
+ * @param data access to complete file data
+ */
+ SingleFileConfigTree(const boost::shared_ptr<DataBlob> &data);
+ SingleFileConfigTree(const std::string &fullpath);
+
+ /**
+ * same as open(), with full file name (like sources/addressbook/config.ini)
+ * instead of path + type
+ */
+ boost::shared_ptr<ConfigNode> open(const std::string &filename);
+
+ /* ConfigTree API */
+ virtual string getRootPath() const { return m_data->getName(); }
+ virtual void flush();
+ virtual void remove(const std::string &path);
+ virtual void reset();
+ virtual boost::shared_ptr<ConfigNode> open(const std::string &path,
+ PropertyType type,
+ const std::string &otherId = std::string(""));
+ list<string> getChildren(const std::string &path);
+
+ private:
+ boost::shared_ptr<DataBlob> m_data;
+
+ /**
+ * maps from normalized file name (see normalizePath()) to content for that name
+ */
+ typedef std::map<std::string, boost::shared_ptr<std::string> > FileContent_t;
+ FileContent_t m_content;
+
+ /** cache of all nodes ever accessed */
+ typedef map< string, boost::shared_ptr<ConfigNode> > NodeCache_t;
+ NodeCache_t m_nodes;
+
+ /**
+ * populate m_content from m_data
+ */
+ void readFile();
+};
+
+SE_END_CXX
+#endif
diff --git a/src/syncevo/StringDataBlob.cpp b/src/syncevo/StringDataBlob.cpp
new file mode 100644
index 00000000..1113cb75
--- /dev/null
+++ b/src/syncevo/StringDataBlob.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#include <syncevo/StringDataBlob.h>
+#include <syncevo/util.h>
+
+#include <sstream>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+StringDataBlob::StringDataBlob(const std::string &name,
+ const boost::shared_ptr<std::string> &data,
+ bool readonly) :
+ m_name(name),
+ m_data(data),
+ m_readonly(readonly)
+{
+}
+
+boost::shared_ptr<std::ostream> StringDataBlob::write()
+{
+ SE_THROW("internal error: StringDataBlob::write() not implemented");
+}
+
+boost::shared_ptr<std::istream> StringDataBlob::read()
+{
+ return boost::shared_ptr<std::istream>(new istringstream(m_data ? *m_data : ""));
+}
+
+SE_END_CXX
diff --git a/src/syncevo/StringDataBlob.h b/src/syncevo/StringDataBlob.h
new file mode 100644
index 00000000..288a6c97
--- /dev/null
+++ b/src/syncevo/StringDataBlob.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) version 3.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ */
+
+#ifndef INCL_EVOLUTION_STRING_DATA_BLOB
+# define INCL_EVOLUTION_STRING_DATA_BLOB
+
+#include <syncevo/DataBlob.h>
+#include <boost/shared_ptr.hpp>
+#include <string>
+
+#include <syncevo/declarations.h>
+SE_BEGIN_CXX
+
+/**
+ * Stores data chunk in memory.
+ * Ownership of that memory is shared.
+ */
+class StringDataBlob : public DataBlob
+{
+ std::string m_name;
+ boost::shared_ptr<std::string> m_data;
+ bool m_readonly;
+
+ public:
+ /**
+ * @param name name for the data blob
+ * @param data reference to string holding data, NULL pointer if it doesn't exist
+ * @param readonly true if write() is meant to fail
+ */
+ StringDataBlob(const std::string &name,
+ const boost::shared_ptr<std::string> &data,
+ bool readonly);
+
+ virtual boost::shared_ptr<std::ostream> write();
+ virtual boost::shared_ptr<std::istream> read();
+
+ virtual boost::shared_ptr<std::string> getData() { return m_data; }
+ virtual std::string getName() const { return m_name; }
+ virtual bool exists() const { return m_data; }
+ virtual bool isReadonly() const { return m_readonly; }
+};
+
+SE_END_CXX
+
+#endif // INCL_EVOLUTION_STRING_DATA_BLOB
diff --git a/src/syncevo/SyncConfig.cpp b/src/syncevo/SyncConfig.cpp
index 9e7da88d..6f8fa3ab 100644
--- a/src/syncevo/SyncConfig.cpp
+++ b/src/syncevo/SyncConfig.cpp
@@ -28,6 +28,7 @@
#include <syncevo/VolatileConfigNode.h>
#include <syncevo/DevNullConfigNode.h>
#include <syncevo/MultiplexConfigNode.h>
+#include <syncevo/SingleFileConfigTree.h>
#include <syncevo/lcs.h>
#include <test.h>
#include <synthesis/timeutil.h>
@@ -416,22 +417,28 @@ SyncConfig::TemplateList SyncConfig::matchPeerTemplates(const DeviceList &peers,
// layout, the match is entirely based on the metadata template.ini
string templateDir(SyncEvolutionTemplateDir());
std::queue <std::string, std::list<std::string> > directories;
- if (isDir(templateDir)) {
- directories.push (templateDir);
- }
+
+ directories.push(templateDir);
+ templateDir = SubstEnvironment("${XDG_CONFIG_HOME}/syncevolution-templates");
+ directories.push(templateDir);
while (!directories.empty()) {
string sDir = directories.front();
directories.pop();
- if (!TemplateConfig::isTemplateConfig(sDir)) {
+ if (isDir(sDir)) {
+ // check all sub directories
ReadDir dir(sDir);
- //not a template folder, check all sub directories
BOOST_FOREACH(const string &entry, dir) {
- if (isDir(sDir + "/" + entry)) {
- directories.push (sDir + "/" + entry);
- }
+ directories.push(sDir + "/" + entry);
}
} else {
TemplateConfig templateConf (sDir);
+ if (boost::ends_with(sDir, "~") ||
+ boost::starts_with(sDir, ".") ||
+ !templateConf.isTemplateConfig()) {
+ // ignore temporary files and files which do
+ // not contain a valid template
+ continue;
+ }
BOOST_FOREACH (const DeviceList::value_type &entry, peers){
int rank = templateConf.metaMatch (entry.m_fingerprint, entry.m_matchMode);
if (fuzzyMatch){
@@ -485,8 +492,10 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
// before starting another fuzzy match process, first try to load the
// template directly taking the parameter as the path
- if (isDir (server) && TemplateConfig::isTemplateConfig(server)) {
+ bool fromDisk = false;
+ if (TemplateConfig::isTemplateConfig(server)) {
templateConfig = server;
+ fromDisk = true;
} else {
SyncConfig::DeviceList devices;
devices.push_back (DeviceDescription("", server, MATCH_ALL));
@@ -498,11 +507,12 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
if (templateConfig.empty()) {
// not found, avoid reading current directory by using one which doesn't exist
templateConfig = "/dev/null";
+ } else {
+ fromDisk = true;
}
}
- boost::shared_ptr<FileConfigTree> tree(new FileConfigTree(templateConfig, "", false));
- tree->setReadOnly(true);
+ boost::shared_ptr<ConfigTree> tree(new SingleFileConfigTree(templateConfig));
boost::shared_ptr<SyncConfig> config(new SyncConfig(server, tree));
boost::shared_ptr<PersistentSyncSourceConfig> source;
@@ -559,13 +569,23 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
source->setSync("two-way");
}
- if (isDir(templateConfig)) {
- // directory exists, check for icon?
+ if (fromDisk) {
+ // check for icon
if (config->getIconURI().empty()) {
- ReadDir dir(templateConfig);
+ string dirname, filename;
+ splitPath(templateConfig, dirname, filename);
+ ReadDir dir(getDirname(dirname));
+
+ // remove last suffix, regardless what it is
+ size_t pos = filename.rfind('.');
+ if (pos != filename.npos) {
+ filename.resize(pos);
+ }
+ filename += "-icon";
+
BOOST_FOREACH(const string &entry, dir) {
- if (boost::istarts_with(entry, "icon")) {
- config->setIconURI("file://" + templateConfig + "/" + entry);
+ if (boost::istarts_with(entry, filename)) {
+ config->setIconURI("file://" + dirname + "/" + entry);
break;
}
}
@@ -573,8 +593,7 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
// leave the source configs alone and return the config as it is:
// in order to have sources configured as part of the template,
- // the template directory must have directories for all
- // sources under "sources"
+ // the template must have entries for all sources under "sources"
return config;
}
@@ -698,6 +717,13 @@ boost::shared_ptr<SyncConfig> SyncConfig::createPeerTemplate(const string &serve
} else if (boost::iequals(server, "Ovi")) {
config->setSyncURL("https://sync.ovi.com/services/syncml");
config->setWebURL("http://www.ovi.com");
+#ifndef ENABLE_SSL_CERTIFICATE_CHECK
+ // temporarily (?) disabled certificate checking because
+ // libsoup/gnutls do not accept the Verisign certificate
+ // (GNOME Bugzilla #589323)
+ config->setSSLVerifyServer(false);
+ config->setSSLVerifyHost(false);
+#endif
//prefer vcard 3.0
source = config->getSyncSourceConfig("addressbook");
source->setSourceType("addressbook:text/vcard");
@@ -1471,9 +1497,9 @@ bool SyncConfig::getUseProxy() const {
if (!proxy ) {
return syncPropUseProxy.getPropertyValue(*getNode(syncPropUseProxy));
} else if (strlen(proxy)>0) {
- return TRUE;
+ return true;
} else {
- return FALSE;
+ return false;
}
}
@@ -2213,24 +2239,34 @@ bool SyncConfig::TemplateDescription::compare_op (boost::shared_ptr<SyncConfig::
return (left->m_templateId < right->m_templateId);
}
-TemplateConfig::TemplateConfig (const string &path)
- : m_metaNode (new FileConfigNode (path, "template.ini", true)),
- m_id(""),
- m_path(path)
+TemplateConfig::TemplateConfig(const string &path) :
+ m_template(new SingleFileConfigTree(path))
{
- m_metaNode->readProperties(m_metaProps);
+ boost::shared_ptr<ConfigNode> metaNode = m_template->open("template.ini");
+ metaNode->readProperties(m_metaProps);
}
-bool TemplateConfig::isTemplateConfig (const string &dir)
+bool TemplateConfig::isTemplateConfig (const string &path)
{
- return !ReadDir(dir).find ("template.ini", false).empty();
+ SingleFileConfigTree templ(path);
+ boost::shared_ptr<ConfigNode> metaNode = templ.open("template.ini");
+ if (!metaNode->exists()) {
+ return false;
+ }
+ ConfigProps props;
+ metaNode->readProperties(props);
+ return !props.empty();
}
-int TemplateConfig::serverModeMatch (SyncConfig::MatchMode mode)
+bool TemplateConfig::isTemplateConfig() const
{
+ return !m_metaProps.empty();
+}
- FileConfigNode configNode (m_path, "config.ini", true);
- std::string peerIsClient = configNode.readProperty ("peerIsClient");
+int TemplateConfig::serverModeMatch (SyncConfig::MatchMode mode)
+{
+ boost::shared_ptr<ConfigNode> configNode = m_template->open("config.ini");
+ std::string peerIsClient = configNode->readProperty ("peerIsClient");
//not a match if serverMode does not match
if ((peerIsClient.empty() || peerIsClient == "0") && mode == SyncConfig::MATCH_FOR_SERVER_MODE) {
diff --git a/src/syncevo/SyncConfig.h b/src/syncevo/SyncConfig.h
index ea4a4ad0..1fefaccf 100644
--- a/src/syncevo/SyncConfig.h
+++ b/src/syncevo/SyncConfig.h
@@ -1680,16 +1680,17 @@ class SyncSourceConfig {
string m_cachedPassword;
};
+class SingleFileConfigTree;
+
/**
* Representing a configuration template node used for fuzzy matching.
*/
class TemplateConfig
{
- boost::shared_ptr<FileConfigNode> m_metaNode;
+ boost::shared_ptr<SingleFileConfigTree> m_template;
ConfigProps m_metaProps;
string m_id;
string m_templateName;
- string m_path;
public:
TemplateConfig (const string &path);
enum {
@@ -1701,6 +1702,7 @@ public:
BEST_MATCH=5
};
static bool isTemplateConfig (const string &path);
+ bool isTemplateConfig() const;
virtual int metaMatch (const string &fingerprint, SyncConfig::MatchMode mode);
virtual int serverModeMatch (SyncConfig::MatchMode mode);
virtual int fingerprintMatch (const string &fingerprint);
diff --git a/src/syncevo/SyncContext.cpp b/src/syncevo/SyncContext.cpp
index 0b8f0f9c..1e9a9fbc 100644
--- a/src/syncevo/SyncContext.cpp
+++ b/src/syncevo/SyncContext.cpp
@@ -73,7 +73,6 @@ using namespace std;
#include <syncevo/declarations.h>
SE_BEGIN_CXX
-SourceList *SyncContext::m_sourceListPtr;
SyncContext *SyncContext::m_activeContext;
SuspendFlags SyncContext::s_flags;
@@ -161,6 +160,7 @@ void SyncContext::init()
m_serverMode = false;
m_firstSourceAccess = true;
m_remoteInitiated = false;
+ m_sourceListPtr = NULL;
}
SyncContext::~SyncContext()
@@ -1780,8 +1780,8 @@ void SyncContext::throwError(const string &action, int error)
void SyncContext::fatalError(void *object, const char *error)
{
SE_LOG_ERROR(NULL, NULL, "%s", error);
- if (m_sourceListPtr) {
- m_sourceListPtr->syncDone(STATUS_FATAL, NULL);
+ if (m_activeContext && m_activeContext->m_sourceListPtr) {
+ m_activeContext->m_sourceListPtr->syncDone(STATUS_FATAL, NULL);
}
exit(1);
}
@@ -1834,7 +1834,7 @@ void SyncContext::startLoopThread()
SyncSource *SyncContext::findSource(const char *name)
{
- if (!m_sourceListPtr) {
+ if (!m_activeContext || !m_activeContext->m_sourceListPtr) {
return NULL;
}
const char *realname = strrchr(name, m_findSourceSeparator);
@@ -1843,7 +1843,7 @@ SyncSource *SyncContext::findSource(const char *name)
} else {
realname = name;
}
- return (*m_sourceListPtr)[realname];
+ return (*m_activeContext->m_sourceListPtr)[realname];
}
SyncContext *SyncContext::findContext(const char *sessionName)
@@ -2573,10 +2573,10 @@ SyncContext::analyzeSyncMLMessage(const char *data, size_t len,
const std::string &messageType)
{
SyncContext sync;
- SwapContext syncSentinel(&sync);
SourceList sourceList(sync, false);
sourceList.setLogLevel(SourceList::LOGGING_SUMMARY);
- m_sourceListPtr = &sourceList;
+ sync.m_sourceListPtr = &sourceList;
+ SwapContext syncSentinel(&sync);
sync.initServer("", SharedBuffer(), "");
SwapEngine swapengine(sync);
sync.initEngine(false);
@@ -2988,13 +2988,14 @@ SyncMLStatus SyncContext::doSync()
new_action.sa_handler = handleSignal;
sigemptyset(&new_action.sa_mask);
sigaction(SIGINT, NULL, &old_action);
- if (old_action.sa_handler == SIG_DFL) {
+ bool catchSignals = getenv("SYNCEVOLUTION_NO_SYNC_SIGNALS") == NULL;
+ if (catchSignals && old_action.sa_handler == SIG_DFL) {
sigaction(SIGINT, &new_action, NULL);
}
struct sigaction old_term_action;
sigaction(SIGTERM, NULL, &old_term_action);
- if (old_term_action.sa_handler == SIG_DFL) {
+ if (catchSignals && old_term_action.sa_handler == SIG_DFL) {
sigaction(SIGTERM, &new_action, NULL);
}
@@ -3316,24 +3317,23 @@ SyncMLStatus SyncContext::doSync()
progressInfo.extra2,
progressInfo.extra3);
break;
- default:
- if (!m_serverMode) {
- // specific for a certain sync source:
- // find it...
- SyncSource *source = m_sourceListPtr->lookupBySynthesisID(progressInfo.targetID);
- if (source) {
- displaySourceProgress(sysync::TProgressEventEnum(progressInfo.eventtype),
- *source,
- progressInfo.extra1,
- progressInfo.extra2,
- progressInfo.extra3);
- } else {
- throwError(std::string("unknown target ") + s);
- }
- target.reset();
+ default: {
+ // specific for a certain sync source:
+ // find it...
+ SyncSource *source = m_sourceListPtr->lookupBySynthesisID(progressInfo.targetID);
+ if (source) {
+ displaySourceProgress(sysync::TProgressEventEnum(progressInfo.eventtype),
+ *source,
+ progressInfo.extra1,
+ progressInfo.extra2,
+ progressInfo.extra3);
+ } else {
+ throwError(std::string("unknown target ") + s);
}
+ target.reset();
break;
}
+ }
}
stepCmd = sysync::STEPCMD_STEP;
break;
@@ -3541,8 +3541,10 @@ SyncMLStatus SyncContext::doSync()
}
m_agent.reset();
- sigaction (SIGINT, &old_action, NULL);
- sigaction (SIGTERM, &old_term_action, NULL);
+ if (catchSignals) {
+ sigaction (SIGINT, &old_action, NULL);
+ sigaction (SIGTERM, &old_term_action, NULL);
+ }
return status;
}
@@ -3898,6 +3900,7 @@ private:
* @return logdir created for the session
*/
string session(bool changeServer, SyncMLStatus status, ...) {
+ Logger::Level level = LoggerBase::instance().getLevel();
SourceList list(*this, true);
list.setLogLevel(SourceList::LOGGING_QUIET);
SyncReport report;
@@ -3947,6 +3950,7 @@ private:
}
list.syncDone(status, &report);
+ LoggerBase::instance().setLevel(level);
return list.getLogdir();
}
diff --git a/src/syncevo/SyncContext.h b/src/syncevo/SyncContext.h
index 8eacb4b2..a827b124 100644
--- a/src/syncevo/SyncContext.h
+++ b/src/syncevo/SyncContext.h
@@ -103,10 +103,10 @@ class SyncContext : public SyncConfig, public ConfigUserInterface {
static SuspendFlags s_flags;
/**
- * a pointer to the active SourceList instance if one exists;
+ * a pointer to the active SourceList instance for this context if one exists;
* used for error handling in throwError() on the iPhone
*/
- static SourceList *m_sourceListPtr;
+ SourceList *m_sourceListPtr;
/**
* a pointer to the active SyncContext instance if one exists;
diff --git a/src/syncevo/SyncML.cpp b/src/syncevo/SyncML.cpp
index 3475ed5f..71909b31 100644
--- a/src/syncevo/SyncML.cpp
+++ b/src/syncevo/SyncML.cpp
@@ -117,7 +117,7 @@ std::string GetLegacyMIMEType (const std::string &type, bool force) {
||boost::iequals (type, "text/x-calendar") || boost::iequals (type, "text/x-calendar:1.0")) {
return "text/x-vcalendar";
} else if (boost::iequals (type, "text/calendar") ||boost::iequals (type, "text/calendar:2.0")) {
- return force ? "text/vcalendar" : "text/x-calendar";
+ return force ? "text/vcalendar" : "text/x-vcalendar";
} else if (boost::iequals (type, "text/plain") ||boost::iequals (type, "text/plain:1.0")) {
return "text/plain";
} else {
diff --git a/src/syncevo/configs/remoterules/server/46_E55.xml b/src/syncevo/configs/remoterules/server/46_E55.xml
new file mode 100644
index 00000000..fc40b62c
--- /dev/null
+++ b/src/syncevo/configs/remoterules/server/46_E55.xml
@@ -0,0 +1,14 @@
+ <remoterule name="E55">
+ <manufacturer>NOKIA</manufacturer>
+ <model>E55-1</model>
+
+ <rulescript><![CDATA[
+ // no dates before 1980
+ mindate=(TIMESTAMP)"19800101T000000Z";
+ alarmTimeToUTC = TRUE;
+ ]]></rulescript>
+
+ <descriptivename>Nokia E55</descriptivename>
+ </remoterule>
+
+
diff --git a/src/syncevo/eds_abi_wrapper.cpp b/src/syncevo/eds_abi_wrapper.cpp
index 1c380b89..ff3b8112 100644
--- a/src/syncevo/eds_abi_wrapper.cpp
+++ b/src/syncevo/eds_abi_wrapper.cpp
@@ -256,6 +256,7 @@ extern "C" void EDSAbiWrapperInit()
&EDSAbiWrapperSingleton.e_cal_remove_object_with_mod, "e_cal_remove_object_with_mod",
&EDSAbiWrapperSingleton.e_cal_set_auth_func, "e_cal_set_auth_func",
&EDSAbiWrapperSingleton.icalcomponent_add_component, "icalcomponent_add_component",
+ &EDSAbiWrapperSingleton.icalcomponent_add_property, "icalcomponent_add_property",
&EDSAbiWrapperSingleton.icalcomponent_as_ical_string, "icalcomponent_as_ical_string",
&EDSAbiWrapperSingleton.icalcomponent_free, "icalcomponent_free",
&EDSAbiWrapperSingleton.icalcomponent_get_first_component, "icalcomponent_get_first_component",
@@ -272,9 +273,11 @@ extern "C" void EDSAbiWrapperInit()
&EDSAbiWrapperSingleton.icalcomponent_new_from_string, "icalcomponent_new_from_string",
&EDSAbiWrapperSingleton.icalcomponent_remove_property, "icalcomponent_remove_property",
&EDSAbiWrapperSingleton.icalcomponent_set_uid, "icalcomponent_set_uid",
+ &EDSAbiWrapperSingleton.icalcomponent_set_recurrenceid, "icalcomponent_set_recurrenceid",
&EDSAbiWrapperSingleton.icalcomponent_vanew, "icalcomponent_vanew",
&EDSAbiWrapperSingleton.icalparameter_get_tzid, "icalparameter_get_tzid",
&EDSAbiWrapperSingleton.icalparameter_set_tzid, "icalparameter_set_tzid",
+ &EDSAbiWrapperSingleton.icalproperty_new_clone, "icalproperty_new_clone",
&EDSAbiWrapperSingleton.icalproperty_get_description, "icalproperty_get_description",
&EDSAbiWrapperSingleton.icalproperty_get_first_parameter, "icalproperty_get_first_parameter",
&EDSAbiWrapperSingleton.icalproperty_get_lastmodified, "icalproperty_get_lastmodified",
@@ -284,7 +287,10 @@ extern "C" void EDSAbiWrapperInit()
&EDSAbiWrapperSingleton.icalproperty_new_summary, "icalproperty_new_summary",
&EDSAbiWrapperSingleton.icalproperty_set_value_from_string, "icalproperty_set_value_from_string",
&EDSAbiWrapperSingleton.icalproperty_remove_parameter_by_kind, "icalproperty_remove_parameter_by_kind",
+ &EDSAbiWrapperSingleton.icaltime_is_null_time, "icaltime_is_null_time",
&EDSAbiWrapperSingleton.icaltime_as_ical_string, "icaltime_as_ical_string",
+ &EDSAbiWrapperSingleton.icaltime_from_string, "icaltime_from_string",
+ &EDSAbiWrapperSingleton.icaltime_set_timezone, "icaltime_set_timezone",
&EDSAbiWrapperSingleton.icaltimezone_free, "icaltimezone_free",
&EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone, "icaltimezone_get_builtin_timezone",
&EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone_from_tzid, "icaltimezone_get_builtin_timezone_from_tzid",
@@ -360,6 +366,6 @@ extern "C" void EDSAbiWrapperInit()
#endif // EVOLUTION_COMPATIBILITY
}
-extern "C" const char *EDSAbiWrapperInfo() { return lookupInfo.c_str(); }
-extern "C" const char *EDSAbiWrapperDebug() { return lookupDebug.c_str(); }
+extern "C" const char *EDSAbiWrapperInfo() { EDSAbiWrapperInit(); return lookupInfo.c_str(); }
+extern "C" const char *EDSAbiWrapperDebug() { EDSAbiWrapperInit(); return lookupDebug.c_str(); }
diff --git a/src/syncevo/eds_abi_wrapper.h b/src/syncevo/eds_abi_wrapper.h
index 7410181c..b0d900be 100644
--- a/src/syncevo/eds_abi_wrapper.h
+++ b/src/syncevo/eds_abi_wrapper.h
@@ -147,6 +147,7 @@ struct EDSAbiWrapper {
gboolean (*e_cal_remove_object_with_mod) (ECal *ecal, const char *uid, const char *rid, CalObjModType mod, GError **error);
void (*e_cal_set_auth_func) (ECal *ecal, ECalAuthFunc func, gpointer data);
void (*icalcomponent_add_component) (icalcomponent* parent, icalcomponent* child);
+ void (*icalcomponent_add_property) (icalcomponent* comp, icalproperty* prop);
char* (*icalcomponent_as_ical_string) (icalcomponent* component);
void (*icalcomponent_free) (icalcomponent* component);
icalcomponent* (*icalcomponent_get_first_component) (icalcomponent* component, icalcomponent_kind kind);
@@ -163,9 +164,11 @@ struct EDSAbiWrapper {
icalcomponent* (*icalcomponent_new_from_string) (char* str);
void (*icalcomponent_remove_property) (icalcomponent* component, icalproperty* property);
void (*icalcomponent_set_uid) (icalcomponent* comp, const char* v);
+ void (*icalcomponent_set_recurrenceid)(icalcomponent* comp, struct icaltimetype v);
icalcomponent* (*icalcomponent_vanew) (icalcomponent_kind kind, ...);
const char* (*icalparameter_get_tzid) (const icalparameter* value);
void (*icalparameter_set_tzid) (icalparameter* value, const char* v);
+ icalproperty *(*icalproperty_new_clone)(icalproperty *prop);
const char* (*icalproperty_get_description) (const icalproperty* prop);
icalparameter* (*icalproperty_get_first_parameter) (icalproperty* prop, icalparameter_kind kind);
struct icaltimetype (*icalproperty_get_lastmodified) (const icalproperty* prop);
@@ -177,7 +180,10 @@ struct EDSAbiWrapper {
void (*icalproperty_set_value_from_string) (icalproperty* prop,const char* value, const char* kind);
void (*icalproperty_remove_parameter_by_kind)(icalproperty* prop,
icalparameter_kind kind);
+ int (*icaltime_is_null_time)(const struct icaltimetype t);
const char* (*icaltime_as_ical_string) (const struct icaltimetype tt);
+ icaltimetype (*icaltime_from_string)(const char* str);
+ void (*icaltime_set_timezone)(icaltimetype *tt, const icaltimezone *zone);
void (*icaltimezone_free) (icaltimezone *zone, int free_struct);
icaltimezone* (*icaltimezone_get_builtin_timezone) (const char *location);
@@ -283,6 +289,7 @@ extern struct EDSAbiWrapper EDSAbiWrapperSingleton;
# define e_cal_remove_object_with_mod EDSAbiWrapperSingleton.e_cal_remove_object_with_mod
# define e_cal_set_auth_func EDSAbiWrapperSingleton.e_cal_set_auth_func
# define icalcomponent_add_component EDSAbiWrapperSingleton.icalcomponent_add_component
+# define icalcomponent_add_property EDSAbiWrapperSingleton.icalcomponent_add_property
# define icalcomponent_as_ical_string (EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r ? EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r : EDSAbiWrapperSingleton.icalcomponent_as_ical_string)
# define icalcomponent_free EDSAbiWrapperSingleton.icalcomponent_free
# define icalcomponent_get_first_component EDSAbiWrapperSingleton.icalcomponent_get_first_component
@@ -299,9 +306,11 @@ extern struct EDSAbiWrapper EDSAbiWrapperSingleton;
# define icalcomponent_new_from_string EDSAbiWrapperSingleton.icalcomponent_new_from_string
# define icalcomponent_remove_property EDSAbiWrapperSingleton.icalcomponent_remove_property
# define icalcomponent_set_uid EDSAbiWrapperSingleton.icalcomponent_set_uid
+# define icalcomponent_set_recurrenceid EDSAbiWrapperSingleton.icalcomponent_set_recurrenceid
# define icalcomponent_vanew EDSAbiWrapperSingleton.icalcomponent_vanew
# define icalparameter_get_tzid EDSAbiWrapperSingleton.icalparameter_get_tzid
# define icalparameter_set_tzid EDSAbiWrapperSingleton.icalparameter_set_tzid
+# define icalproperty_new_clone EDSAbiWrapperSingleton.icalproperty_new_clone
# define icalproperty_get_description EDSAbiWrapperSingleton.icalproperty_get_description
# define icalproperty_get_first_parameter EDSAbiWrapperSingleton.icalproperty_get_first_parameter
# define icalproperty_get_lastmodified EDSAbiWrapperSingleton.icalproperty_get_lastmodified
@@ -311,7 +320,10 @@ extern struct EDSAbiWrapper EDSAbiWrapperSingleton;
# define icalproperty_new_summary EDSAbiWrapperSingleton.icalproperty_new_summary
# define icalproperty_set_value_from_string EDSAbiWrapperSingleton.icalproperty_set_value_from_string
# define icalproperty_remove_parameter_by_kind EDSAbiWrapperSingleton.icalproperty_remove_parameter_by_kind
+# define icaltime_is_null_time EDSAbiWrapperSingleton.icaltime_is_null_time
# define icaltime_as_ical_string (EDSAbiWrapperSingleton.icaltime_as_ical_string_r ? EDSAbiWrapperSingleton.icaltime_as_ical_string_r : EDSAbiWrapperSingleton.icaltime_as_ical_string)
+# define icaltime_from_string EDSAbiWrapperSingleton.icaltime_from_string
+# define icaltime_set_timezone EDSAbiWrapperSingleton.icaltime_set_timezone
# define icaltimezone_free EDSAbiWrapperSingleton.icaltimezone_free
# define icaltimezone_get_builtin_timezone EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone
# define icaltimezone_get_builtin_timezone_from_tzid EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone_from_tzid
diff --git a/src/syncevo/lcs.h b/src/syncevo/lcs.h
index 084b849a..d7b02451 100644
--- a/src/syncevo/lcs.h
+++ b/src/syncevo/lcs.h
@@ -75,7 +75,21 @@ public:
typedef typename T::value_type::first_type F;
typedef typename T::value_type::second_type C;
- static C cost(const T &a, ssize_t start, size_t end) { return a[end].second - (start == -1 ? 0 : a[start].second); }
+ /**
+ * @param a container holding sequence of items as passed to lcs()
+ * @param start index of first item in the gap, may be -1
+ * @param end index of the last item in the gap, may be one beyond end of sequence, always >= start
+ * @return cost 0 for start == end, > 0 for start < end
+ */
+ static C cost(const T &a, ssize_t start, size_t end) {
+ return a.empty() ? 0 :
+ ((end >= a.size() ? a[a.size() - 1].second : a[end].second) -
+ (start < 0 ? a[0].second : a[start].second));
+ }
+ /**
+ * @param index valid index (>= 0, < a.size())
+ * @return entry at index
+ */
static const F &entry_at(const T &a, size_t index) { return a[index].first; }
};
diff --git a/src/syncevo/util.cpp b/src/syncevo/util.cpp
index 9d3d835a..1c987676 100644
--- a/src/syncevo/util.cpp
+++ b/src/syncevo/util.cpp
@@ -86,6 +86,35 @@ string normalizePath(const string &path)
return res;
}
+string getBasename(const string &path)
+{
+ string dir;
+ string file;
+ splitPath(path, dir, file);
+ return file;
+}
+
+string getDirname(const string &path)
+{
+ string dir;
+ string file;
+ splitPath(path, dir, file);
+ return dir;
+}
+
+void splitPath(const string &path, string &dir, string &file)
+{
+ string normal = normalizePath(path);
+ size_t offset = normal.rfind('/');
+ if (offset != normal.npos) {
+ dir = normal.substr(0, offset);
+ file = normal.substr(offset + 1);
+ } else {
+ dir = "";
+ file = normal;
+ }
+}
+
bool relToAbs(string &path)
{
char buffer[PATH_MAX+1];
diff --git a/src/syncevo/util.h b/src/syncevo/util.h
index 2302f60b..b7a1b5e8 100644
--- a/src/syncevo/util.h
+++ b/src/syncevo/util.h
@@ -65,6 +65,23 @@ typedef map<string, string> StringMap;
string normalizePath(const string &path);
/**
+ * Returns last component of path. Trailing slash is ignored.
+ * Empty if path is empty.
+ */
+string getBasename(const string &path);
+
+/**
+ * Returns path without the last component. Empty if nothing left.
+ */
+string getDirname(const string &path);
+
+/**
+ * Splits path into directory and file part. Trailing slashes
+ * are stripped first.
+ */
+void splitPath(const string &path, string &dir, string &file);
+
+/**
* convert relative path to canonicalized absolute path
* @param path will be turned into absolute path if possible, otherwise left unchanged
* @return true if conversion is successful, false otherwise(errno will be set)
diff --git a/src/templates/clients/SyncEvolution.ini b/src/templates/clients/SyncEvolution.ini
new file mode 100644
index 00000000..58a6d0d4
--- /dev/null
+++ b/src/templates/clients/SyncEvolution.ini
@@ -0,0 +1,26 @@
+=== template.ini ===
+fingerprint = SyncEvolution Client
+description = SyncEvolution server side template
+
+=== config.ini ===
+username = test
+password = test
+PeerIsClient = 1
+ConsumerReady = 1
+
+=== sources/addressbook/config.ini ===
+sync = two-way
+uri = addressbook
+
+=== sources/calendar/config.ini ===
+sync = two-way
+uri = calendar
+
+=== sources/todo/config.ini ===
+sync = two-way
+uri = todo
+
+=== sources/memo/config.ini ===
+sync = two-way
+uri = memo
+
diff --git a/src/templates/clients/SyncEvolution/config.ini b/src/templates/clients/SyncEvolution/config.ini
deleted file mode 100644
index 8bf276d9..00000000
--- a/src/templates/clients/SyncEvolution/config.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-username = test
-password = test
-PeerIsClient = 1
-ConsumerReady = 1
diff --git a/src/templates/clients/SyncEvolution/sources/addressbook/config.ini b/src/templates/clients/SyncEvolution/sources/addressbook/config.ini
deleted file mode 100644
index edafb58e..00000000
--- a/src/templates/clients/SyncEvolution/sources/addressbook/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = addressbook
diff --git a/src/templates/clients/SyncEvolution/sources/calendar/config.ini b/src/templates/clients/SyncEvolution/sources/calendar/config.ini
deleted file mode 100644
index aa6c8541..00000000
--- a/src/templates/clients/SyncEvolution/sources/calendar/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = calendar
diff --git a/src/templates/clients/SyncEvolution/sources/memo/config.ini b/src/templates/clients/SyncEvolution/sources/memo/config.ini
deleted file mode 100644
index 48618618..00000000
--- a/src/templates/clients/SyncEvolution/sources/memo/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = memo
diff --git a/src/templates/clients/SyncEvolution/sources/todo/config.ini b/src/templates/clients/SyncEvolution/sources/todo/config.ini
deleted file mode 100644
index 63e719e7..00000000
--- a/src/templates/clients/SyncEvolution/sources/todo/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = todo
diff --git a/src/templates/clients/SyncEvolution/template.ini b/src/templates/clients/SyncEvolution/template.ini
deleted file mode 100644
index 75a446c4..00000000
--- a/src/templates/clients/SyncEvolution/template.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-fingerprint = SyncEvolution Client
-description = SyncEvolution server side template
diff --git a/src/templates/clients/phone/nokia/S40/7210c.ini b/src/templates/clients/phone/nokia/S40/7210c.ini
new file mode 100644
index 00000000..6c4ec5f1
--- /dev/null
+++ b/src/templates/clients/phone/nokia/S40/7210c.ini
@@ -0,0 +1,29 @@
+=== template.ini ===
+fingerprint = Nokia 7210c,Nokia
+description = Template for Nokia S40 series Phone
+templateName = Nokia S40
+
+=== config.ini ===
+PeerIsClient = 1
+ConsumerReady = 1
+
+=== sources/addressbook/config.ini ===
+sync = two-way
+uri = Contacts
+
+=== sources/calendar/config.ini ===
+sync = none
+
+=== sources/todo/config.ini ===
+sync = none
+
+=== sources/memo/config.ini ===
+sync = two-way
+uri = memo
+
+=== sources/calendar+todo/config.ini ===
+sync = two-way
+type = virtual:text/x-calendar:1.0
+evolutionsource = calendar,todo
+uri = Calendar
+
diff --git a/src/templates/clients/phone/nokia/S40/7210c/config.ini b/src/templates/clients/phone/nokia/S40/7210c/config.ini
deleted file mode 100644
index 5f637c6b..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-PeerIsClient = 1
-ConsumerReady = 1
diff --git a/src/templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini b/src/templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini
deleted file mode 100644
index e9850ecf..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/sources/addressbook/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = Contacts
diff --git a/src/templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini b/src/templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini
deleted file mode 100644
index 90d1dd7d..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/sources/calendar+todo/config.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-sync = two-way
-type = virtual:text/x-calendar:1.0
-evolutionsource = calendar,todo
-uri = Calendar
diff --git a/src/templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini b/src/templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini
deleted file mode 100644
index 84e080b4..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/sources/calendar/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-sync = none
diff --git a/src/templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini b/src/templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini
deleted file mode 100644
index 48618618..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/sources/memo/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = memo
diff --git a/src/templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini b/src/templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini
deleted file mode 100644
index 84e080b4..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/sources/todo/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-sync = none
diff --git a/src/templates/clients/phone/nokia/S40/7210c/template.ini b/src/templates/clients/phone/nokia/S40/7210c/template.ini
deleted file mode 100644
index 9f057000..00000000
--- a/src/templates/clients/phone/nokia/S40/7210c/template.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-fingerprint = Nokia 7210c,Nokia
-description = Template for Nokia S40 series Phone
-templateName = Nokia S40
diff --git a/src/templates/clients/phone/nokia/S60/N85.ini b/src/templates/clients/phone/nokia/S60/N85.ini
new file mode 100644
index 00000000..b93ba8b1
--- /dev/null
+++ b/src/templates/clients/phone/nokia/S60/N85.ini
@@ -0,0 +1,31 @@
+=== template.ini ===
+fingerprint = Nokia N85,Nokia
+description = Template for Nokia S60 series Phone
+templateName = Nokia S60
+
+
+=== config.ini ===
+peerIsClient = 1
+remoteIdentifier = PC Suite
+ConsumerReady = 1
+
+=== sources/addressbook/config.ini ===
+sync = two-way
+uri = Contacts
+
+=== sources/calendar/config.ini ===
+sync = none
+
+=== sources/todo/config.ini ===
+sync = none
+
+=== sources/memo/config.ini ===
+sync = two-way
+uri = Notes
+
+=== sources/calendar+todo/config.ini ===
+sync = two-way
+type = virtual:text/x-calendar:1.0
+evolutionsource = calendar,todo
+uri = Calendar
+
diff --git a/src/templates/clients/phone/nokia/S60/N85/config.ini b/src/templates/clients/phone/nokia/S60/N85/config.ini
deleted file mode 100644
index 2325c098..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/config.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-peerIsClient = 1
-remoteIdentifier = PC Suite
-ConsumerReady = 1
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini
deleted file mode 100644
index e9850ecf..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/sources/addressbook/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = Contacts
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini
deleted file mode 100644
index e31f19cb..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/sources/calendar+todo/config.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-sync = two-way
-type = virtual:text/calendar
-evolutionsource = calendar,todo
-uri = Calendar
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini
deleted file mode 100644
index 84e080b4..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/sources/calendar/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-sync = none
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini
deleted file mode 100644
index 2e2ba78d..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/sources/memo/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = Notes
diff --git a/src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini b/src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini
deleted file mode 100644
index 84e080b4..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/sources/todo/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-sync = none
diff --git a/src/templates/clients/phone/nokia/S60/N85/template.ini b/src/templates/clients/phone/nokia/S60/N85/template.ini
deleted file mode 100644
index ea0d646e..00000000
--- a/src/templates/clients/phone/nokia/S60/N85/template.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-fingerprint = Nokia N85,Nokia
-description = Template for Nokia S60 series Phone
-templateName = Nokia S60
-
diff --git a/src/templates/clients/phone/nokia/maemo/n900.ini b/src/templates/clients/phone/nokia/maemo/n900.ini
new file mode 100644
index 00000000..46a2af74
--- /dev/null
+++ b/src/templates/clients/phone/nokia/maemo/n900.ini
@@ -0,0 +1,29 @@
+=== template.ini ===
+fingerprint = Nokia N900
+description = Template for Nokia N900
+
+=== config.ini ===
+PeerIsClient = 1
+ConsumerReady = 1
+remoteIdentifier = PC Suite
+
+=== sources/addressbook/config.ini ===
+sync = two-way
+uri = Contacts
+
+=== sources/calendar/config.ini ===
+sync = none
+
+=== sources/todo/config.ini ===
+sync = none
+
+=== sources/memo/config.ini ===
+sync = two-way
+uri = Notes
+
+=== sources/calendar+todo/config.ini ===
+sync = two-way
+type = virtual:text/x-calendar:1.0
+evolutionsource = calendar,todo
+uri = Calendar
+
diff --git a/src/templates/clients/phone/nokia/maemo/n900/config.ini b/src/templates/clients/phone/nokia/maemo/n900/config.ini
deleted file mode 100644
index 58ca3438..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/config.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-PeerIsClient = 1
-ConsumerReady = 1
-remoteIdentifier = PC Suite
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini
deleted file mode 100644
index e9850ecf..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/sources/addressbook/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = Contacts
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini
deleted file mode 100644
index e31f19cb..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/sources/calendar+todo/config.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-sync = two-way
-type = virtual:text/calendar
-evolutionsource = calendar,todo
-uri = Calendar
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini
deleted file mode 100644
index 84e080b4..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/sources/calendar/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-sync = none
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini
deleted file mode 100644
index 2e2ba78d..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/sources/memo/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-sync = two-way
-uri = Notes
diff --git a/src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini b/src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini
deleted file mode 100644
index 84e080b4..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/sources/todo/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-sync = none
diff --git a/src/templates/clients/phone/nokia/maemo/n900/template.ini b/src/templates/clients/phone/nokia/maemo/n900/template.ini
deleted file mode 100644
index 83652763..00000000
--- a/src/templates/clients/phone/nokia/maemo/n900/template.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-fingerprint = Nokia N900
-description = Template for Nokia N900
diff --git a/src/templates/servers/Funambol.ini b/src/templates/servers/Funambol.ini
new file mode 100644
index 00000000..b3d6a4fc
--- /dev/null
+++ b/src/templates/servers/Funambol.ini
@@ -0,0 +1,28 @@
+=== template.ini ===
+fingerprint = Funambol
+description = http://my.funambol.com
+
+=== config.ini ===
+syncURL = http://my.funambol.com/sync
+WebURL = http://my.funambol.com
+enableWBXML = FALSE
+ConsumerReady = TRUE
+RetryInterval = 0
+
+=== sources/addressbook/config.ini ===
+type = addressbook
+uri = card
+
+=== sources/calendar/config.ini ===
+uri = event
+sync = two-way
+type = calendar:text/calendar!
+
+=== sources/todo/config.ini ===
+uri = task
+sync = two-way
+type = todo:text/calendar!
+
+=== sources/memo/config.ini ===
+uri = note
+
diff --git a/src/templates/servers/Funambol/config.ini b/src/templates/servers/Funambol/config.ini
deleted file mode 100644
index b2e699c4..00000000
--- a/src/templates/servers/Funambol/config.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-# *not* a complete config, do not copy manually into ~/.config
-
-syncURL = http://my.funambol.com/sync
-WebURL = http://my.funambol.com
-enableWBXML = FALSE
-ConsumerReady = TRUE
-RetryInterval = 0
diff --git a/src/templates/servers/Funambol/sources/addressbook/config.ini b/src/templates/servers/Funambol/sources/addressbook/config.ini
deleted file mode 100644
index f4842470..00000000
--- a/src/templates/servers/Funambol/sources/addressbook/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-type = addressbook
-uri = card
diff --git a/src/templates/servers/Funambol/sources/calendar/config.ini b/src/templates/servers/Funambol/sources/calendar/config.ini
deleted file mode 100644
index 5030e2c0..00000000
--- a/src/templates/servers/Funambol/sources/calendar/config.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-uri = event
-sync = two-way
-type = calendar:text/calendar!
diff --git a/src/templates/servers/Funambol/sources/memo/config.ini b/src/templates/servers/Funambol/sources/memo/config.ini
deleted file mode 100644
index 756f0fef..00000000
--- a/src/templates/servers/Funambol/sources/memo/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-uri = note
diff --git a/src/templates/servers/Funambol/sources/todo/config.ini b/src/templates/servers/Funambol/sources/todo/config.ini
deleted file mode 100644
index d9089636..00000000
--- a/src/templates/servers/Funambol/sources/todo/config.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-uri = task
-sync = two-way
-type = todo:text/calendar!
diff --git a/src/templates/servers/Funambol/template.ini b/src/templates/servers/Funambol/template.ini
deleted file mode 100644
index ef872458..00000000
--- a/src/templates/servers/Funambol/template.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-fingerprint = Funambol
-description = http://my.funambol.com
diff --git a/src/templates/servers/ScheduleWorld.ini b/src/templates/servers/ScheduleWorld.ini
new file mode 100644
index 00000000..50ccfc91
--- /dev/null
+++ b/src/templates/servers/ScheduleWorld.ini
@@ -0,0 +1,22 @@
+=== template.ini ===
+fingerprint = ScheduleWorld, default
+description = http://www.scheduleworld.org
+
+=== config.ini ===
+syncURL = http://sync.scheduleworld.com/funambol/ds
+WebURL = http://www.scheduleworld.com
+ConsumerReady = TRUE
+
+=== sources/addressbook/config.ini ===
+type = addressbook:text/vcard
+uri = card3
+
+=== sources/calendar/config.ini ===
+uri = cal2
+
+=== sources/todo/config.ini ===
+uri = task2
+
+=== sources/memo/config.ini ===
+uri = note
+
diff --git a/src/templates/servers/ScheduleWorld/config.ini b/src/templates/servers/ScheduleWorld/config.ini
deleted file mode 100644
index 202c6e3e..00000000
--- a/src/templates/servers/ScheduleWorld/config.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-# *not* a complete config, do not copy manually into ~/.config
-
-syncURL = http://sync.scheduleworld.com/funambol/ds
-WebURL = http://www.scheduleworld.com
-ConsumerReady = TRUE
diff --git a/src/templates/servers/ScheduleWorld/sources/addressbook/config.ini b/src/templates/servers/ScheduleWorld/sources/addressbook/config.ini
deleted file mode 100644
index 256d6859..00000000
--- a/src/templates/servers/ScheduleWorld/sources/addressbook/config.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-type = addressbook:text/vcard
-uri = card3
diff --git a/src/templates/servers/ScheduleWorld/sources/calendar/config.ini b/src/templates/servers/ScheduleWorld/sources/calendar/config.ini
deleted file mode 100644
index 63def8b0..00000000
--- a/src/templates/servers/ScheduleWorld/sources/calendar/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-uri = cal2
diff --git a/src/templates/servers/ScheduleWorld/sources/memo/config.ini b/src/templates/servers/ScheduleWorld/sources/memo/config.ini
deleted file mode 100644
index 756f0fef..00000000
--- a/src/templates/servers/ScheduleWorld/sources/memo/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-uri = note
diff --git a/src/templates/servers/ScheduleWorld/sources/todo/config.ini b/src/templates/servers/ScheduleWorld/sources/todo/config.ini
deleted file mode 100644
index 7f2d8f96..00000000
--- a/src/templates/servers/ScheduleWorld/sources/todo/config.ini
+++ /dev/null
@@ -1 +0,0 @@
-uri = task2
diff --git a/src/templates/servers/ScheduleWorld/template.ini b/src/templates/servers/ScheduleWorld/template.ini
deleted file mode 100644
index 855ce8ed..00000000
--- a/src/templates/servers/ScheduleWorld/template.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-fingerprint = ScheduleWorld, default
-description = http://www.scheduleworld.org
diff --git a/test/ClientTest.cpp b/test/ClientTest.cpp
index b672b262..0cfbaddf 100644
--- a/test/ClientTest.cpp
+++ b/test/ClientTest.cpp
@@ -3399,13 +3399,21 @@ void ClientTest::getItems(const char *file, list<string> &items, std::string &te
{
items.clear();
- // import the file
+ // import the file, trying a .tem file (base file plus patch)
+ // first
std::ifstream input;
string server = getenv("CLIENT_TEST_SERVER");
testcases = string(file) + '.' + server +".tem";
input.open(testcases.c_str());
- if(input.fail()) {
+ if (input.fail()) {
+ // try server-specific file (like ical20.ics.local)
+ testcases = string(file) + '.' + server;
+ input.open(testcases.c_str());
+ }
+
+ if (input.fail()) {
+ // try base file
testcases = file;
input.open(testcases.c_str());
}
diff --git a/test/Makefile.am b/test/Makefile.am
index 327dc7cd..a4fe76ee 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -11,6 +11,7 @@ EXTRA_DIST = \
Algorithm/Diff.pm \
Algorithm/README \
testcases/ical20.ics \
+ testcases/ical20.ics.local \
testcases/itodo20.ics \
testcases/vcal10.ics \
testcases/vcard21.vcf \
diff --git a/test/README.funambol b/test/README.funambol
index 0e73521a..92bf0df5 100644
--- a/test/README.funambol
+++ b/test/README.funambol
@@ -51,7 +51,7 @@ ical20
-- If 'BYMONTHDAY' of 'RRULE' is not presented in 'monthly', funambol will generate a 'BYMONTHDAY' part automatically.
itodo20
-- Below properties are lost:
- UID, SEQUENCE, TRANSP, LAST-MODIFIED, X-EVOLUTION-ALARM-UID, STATUS, URL
+ UID, SEQUENCE, TRANSP, LAST-MODIFIED, X-EVOLUTION-ALARM-UID, STATUS, URL, COMPLETED
-- Below properties(together with default values) are added by server:
CLASS:PUBLIC, PERCENT-COMPLETE:0
diff --git a/test/evo.supp b/test/evo.supp
index e862775c..b6374acf 100644
--- a/test/evo.supp
+++ b/test/evo.supp
@@ -3864,24 +3864,7 @@
fun:icalparser_add_line
fun:icalparser_parse
fun:icalparser_parse_string
- fun:_ZN7SyncEvo23EvolutionCalendarSource10insertItemERKSsS2_b
- fun:_ZN7SyncEvo18TrackingSyncSource10insertItemERKSsS2_
- fun:_ZN7SyncEvo19SyncSourceSerialize15insertItemAsKeyEPN6sysync7KeyTypeEPKNS1_10ItemIDTypeEPS4_
- fun:_ZN7SyncEvo17SyncSourceLogging15insertItemAsKeyEPN6sysync7KeyTypeEPNS1_10ItemIDTypeERKN5boost8functionIFtS3_S5_ESaIvEEE
- fun:SyncEvolution_InsertItemAsKey
- fun:_ZN6sysync7TDB_Api15InsertItemAsKeyEPNS_7KeyTypeEPKcRNS_14TDB_Api_ItemIDE
- fun:_ZN6sysync12TPluginApiDS10apiAddItemERNS_15TMultiFieldItemERSs
- fun:_ZN6sysync13TCustomImplDS10createItemEPNS_9TSyncItemERSsRb
- fun:_ZN6sysync14TBinfileImplDS15implProcessItemEPNS_9TSyncItemERNS_14TStatusCommandE
- fun:_ZN6sysync11TStdLogicDS22logicProcessRemoteItemEPNS_9TSyncItemERNS_14TStatusCommandERbPSs
- fun:_ZN6sysync14TLocalEngineDS28engProcessRemoteItemAsClientEPNS_9TSyncItemERNS_14TStatusCommandE
- fun:_ZN6sysync14TLocalEngineDS20engProcessSyncOpItemENS_14TSyncOperationEP10sml_item_sP19sml_metinf_metinf_sRNS_14TStatusCommandE
- fun:_ZN6sysync12TSyncSession17processSyncOpItemENS_14TSyncOperationEP10sml_item_sP19sml_metinf_metinf_sPNS_14TLocalEngineDSERNS_14TStatusCommandERb
- fun:_ZN6sysync14TSyncOpCommand7executeEv
- fun:_ZN6sysync12TSyncSession7processEPNS_11TSmlCommandE
- fun:_ZN6sysync12TSyncAppBase6AddCmdEPvP13sml_generic_s
- fun:smlProcessData
- fun:_ZN6sysync11TSyncClient14processingStepERtPNS_19TEngineProgressTypeE
+ fun:*EvolutionCalendarSource*insertItem*
}
# ==17808==
@@ -4384,4 +4367,249 @@
fun:clone
}
+# ==10204== Invalid read of size 8
+# ==10204== at 0x73FA92D: icaltzutil_fetch_timezone (in /usr/lib/libical.so.0.43.0)
+# ==10204== by 0x73FBD14: (within /usr/lib/libical.so.0.43.0)
+# ==10204== by 0x73FBD64: icaltimezone_get_component (in /usr/lib/libical.so.0.43.0)
+# ==10204== by 0x6BE01C: sysync::loadSystemZoneDefinitions(sysync::GZones*) (platform_timezones.cpp:158)
+# ==10204== by 0x6A81B8: sysync::GZones::initialize() (timezones.cpp:95)
+# ==10204== by 0x6D095E: sysync::TSyncAppBase::TSyncAppBase() (syncappbase.cpp:1227)
+# ==10204== by 0x6EC128: sysync::TSyncClientBase::TSyncClientBase() (syncclientbase.cpp:352)
+# ==10204== by 0x77B3F8: sysync::TEngineClientBase::TEngineClientBase() (engineclientbase.cpp:102)
+# ==10204== by 0x6BE88A: sysync::TCustomClientEngineBase::TCustomClientEngineBase() (clientengine_custom_Base.cpp:49)
+# ==10204== by 0x6BE912: sysync::TCustomClientEngineInterface::newSyncAppBase() (clientengine_custom_Base.cpp:39)
+# ==10204== by 0x6A420C: sysync::TEngineInterface::Init() (engineinterface.cpp:1056)
+# ==10204== by 0x6BBB65: sysync::TEngineModuleBase::Connect(std::string, unsigned long, unsigned short) (enginemodulebase.cpp:85)
+# ==10204== by 0x6A673D: sysync::internal_ConnectEngine(bool, sysync::SDK_InterfaceType**, unsigned short, unsigned long*, unsigned long, unsigned short) (engineinterface.cpp:1869)
+# ==10204== by 0x6A145A: sysync::UI_Connect(sysync::SDK_InterfaceType*&, void*&, bool&, char const*, unsigned long, unsigned short) (UI_util.cpp:181)
+# ==10204== by 0x6BBB65: sysync::TEngineModuleBase::Connect(std::string, unsigned long, unsigned short) (enginemodulebase.cpp:85)
+# ==10204== by 0x695D36: SyncEvo::SharedEngine::Connect(std::string const&, unsigned long, unsigned short) (SynthesisEngine.cpp:32)
+# ==10204== by 0x62F070: SyncEvo::SyncContext::createEngine() (SyncContext.cpp:2537)
+# ==10204== by 0x63DDEB: SyncEvo::SyncContext::SwapEngine::SwapEngine(SyncEvo::SyncContext&) (SyncContext.h:452)
+# ==10204== by 0x636DE5: SyncEvo::SyncContext::sync(SyncEvo::SyncReport*) (SyncContext.cpp:2708)
+# ==10204== by 0x4C07CF: SyncEvo::TestEvolution::doSync(int const*, std::string const&, SyncEvo::SyncOptions const&) (client-test-app.cpp:379)
+# ==10204== by 0x4DE479: SyncEvo::SyncTests::doSync(SyncEvo::SyncOptions const&) (ClientTest.cpp:3248)
+# ==10204== by 0x587412: SyncEvo::SyncTests::doSync(char const*, SyncEvo::SyncOptions const&) (ClientTest.h:765)
+# ==10204== by 0x4E8AB6: SyncEvo::SyncTests::testDeleteAllRefresh() (ClientTest.cpp:1695)
+# ==10204== by 0x5B6F406: CppUnit::TestCaseMethodFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B617D3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6B278: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6AFBB: CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B76D9F: CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6F09C: CppUnit::TestCase::run(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6F9FB: CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== Address 0xec7b9b0 is 0 bytes after a block of size 0 alloc'd
+# ==10204== at 0x4C216F4: calloc (vg_replace_malloc.c:397)
+# ==10204== by 0x73FA492: icaltzutil_fetch_timezone (in /usr/lib/libical.so.0.43.0)
+# ==10204== by 0x73FBD14: (within /usr/lib/libical.so.0.43.0)
+# ==10204== by 0x73FBD64: icaltimezone_get_component (in /usr/lib/libical.so.0.43.0)
+# ==10204== by 0x6BE01C: sysync::loadSystemZoneDefinitions(sysync::GZones*) (platform_timezones.cpp:158)
+# ==10204== by 0x6A81B8: sysync::GZones::initialize() (timezones.cpp:95)
+# ==10204== by 0x6D095E: sysync::TSyncAppBase::TSyncAppBase() (syncappbase.cpp:1227)
+# ==10204== by 0x6EC128: sysync::TSyncClientBase::TSyncClientBase() (syncclientbase.cpp:352)
+# ==10204== by 0x77B3F8: sysync::TEngineClientBase::TEngineClientBase() (engineclientbase.cpp:102)
+# ==10204== by 0x6BE88A: sysync::TCustomClientEngineBase::TCustomClientEngineBase() (clientengine_custom_Base.cpp:49)
+# ==10204== by 0x6BE912: sysync::TCustomClientEngineInterface::newSyncAppBase() (clientengine_custom_Base.cpp:39)
+# ==10204== by 0x6A420C: sysync::TEngineInterface::Init() (engineinterface.cpp:1056)
+# ==10204== by 0x6BBB65: sysync::TEngineModuleBase::Connect(std::string, unsigned long, unsigned short) (enginemodulebase.cpp:85)
+# ==10204== by 0x6A673D: sysync::internal_ConnectEngine(bool, sysync::SDK_InterfaceType**, unsigned short, unsigned long*, unsigned long, unsigned short) (engineinterface.cpp:1869)
+# ==10204== by 0x6A145A: sysync::UI_Connect(sysync::SDK_InterfaceType*&, void*&, bool&, char const*, unsigned long, unsigned short) (UI_util.cpp:181)
+# ==10204== by 0x6BBB65: sysync::TEngineModuleBase::Connect(std::string, unsigned long, unsigned short) (enginemodulebase.cpp:85)
+# ==10204== by 0x695D36: SyncEvo::SharedEngine::Connect(std::string const&, unsigned long, unsigned short) (SynthesisEngine.cpp:32)
+# ==10204== by 0x62F070: SyncEvo::SyncContext::createEngine() (SyncContext.cpp:2537)
+# ==10204== by 0x63DDEB: SyncEvo::SyncContext::SwapEngine::SwapEngine(SyncEvo::SyncContext&) (SyncContext.h:452)
+# ==10204== by 0x636DE5: SyncEvo::SyncContext::sync(SyncEvo::SyncReport*) (SyncContext.cpp:2708)
+# ==10204== by 0x4C07CF: SyncEvo::TestEvolution::doSync(int const*, std::string const&, SyncEvo::SyncOptions const&) (client-test-app.cpp:379)
+# ==10204== by 0x4DE479: SyncEvo::SyncTests::doSync(SyncEvo::SyncOptions const&) (ClientTest.cpp:3248)
+# ==10204== by 0x587412: SyncEvo::SyncTests::doSync(char const*, SyncEvo::SyncOptions const&) (ClientTest.h:765)
+# ==10204== by 0x4E8AB6: SyncEvo::SyncTests::testDeleteAllRefresh() (ClientTest.cpp:1695)
+# ==10204== by 0x5B6F406: CppUnit::TestCaseMethodFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B617D3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6B278: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6AFBB: CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B76D9F: CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==10204== by 0x5B6F09C: CppUnit::TestCase::run(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+{
+ icaltimezone_get_component
+ Memcheck:Addr8
+ fun:icaltzutil_fetch_timezone
+ obj:*libical.so.*
+ fun:icaltimezone_get_component
+}
+# ==23938== Conditional jump or move depends on uninitialised value(s)
+# ==23938== at 0x7423FBE: icaltime_adjust (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74294D3: icaltimezone_convert_time (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742587B: icaltime_from_timet_with_zone (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742597A: icaltime_from_timet (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74263CB: icaltzutil_fetch_timezone (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74276F4: (within /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7427744: icaltimezone_get_component (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x6CA11A: sysync::finalizeSystemZoneDefinitions(sysync::GZones*) (platform_timezones.cpp:186)
+# ==23938== by 0x6B4544: sysync::GZones::loggingStarted() (timezones.cpp:114)
+# ==23938== by 0x6DA507: sysync::TSyncAppBase::finishConfig() (syncappbase.cpp:1441)
+# ==23938== by 0x6DA67F: sysync::TSyncAppBase::readXMLConfigStream(int (*)(char*, unsigned long, unsigned long*, void*), void*) (syncappbase.cpp:1753)
+# ==23938== by 0x6DA787: sysync::TSyncAppBase::readXMLConfigConstant(char const*) (syncappbase.cpp:1786)
+# ==23938== by 0x6B27E9: sysync::TEngineInterface::InitEngineXML(char const*) (engineinterface.cpp:1194)
+# ==23938== by 0x69F47C: SyncEvo::SharedEngine::InitEngineXML(std::string const&) (SynthesisEngine.cpp:48)
+# ==23938== by 0x624EB6: SyncEvo::SyncContext::initEngine(bool) (SyncContext.cpp:2622)
+# ==23938== by 0x6364FE: SyncEvo::SyncContext::sync(SyncEvo::SyncReport*) (SyncContext.cpp:2709)
+# ==23938== by 0x4BF856: SyncEvo::TestEvolution::doSync(int const*, std::string const&, SyncEvo::SyncOptions const&) (client-test-app.cpp:379)
+# ==23938== by 0x56B6C0: SyncEvo::SyncTests::doSync(SyncEvo::SyncOptions const&) (ClientTest.cpp:3248)
+# ==23938== by 0x57D9A1: SyncEvo::SyncTests::doSync(char const*, SyncEvo::SyncOptions const&) (ClientTest.h:765)
+# ==23938== by 0x4D4EE0: SyncEvo::SyncTests::deleteAll(SyncEvo::SyncTests::DeleteAllMode) (ClientTest.cpp:1620)
+# ==23938== by 0x4CDB1E: SyncEvo::SyncTests::testItems() (ClientTest.cpp:2333)
+# ==23938== by 0x5B7A406: CppUnit::TestCaseMethodFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B6C7D3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B76278: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B75FBB: CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81D9F: CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B7A09C: CppUnit::TestCase::run(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81B29: CppUnit::TestResult::runTest(CppUnit::Test*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B84121: CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B8713A: CppUnit::TextTestRunner::run(std::string, bool, bool, bool) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+{
+ icaltimezone_get_component II
+ Memcheck:Cond
+ fun:icaltime_adjust
+ fun:icaltimezone_convert_time
+ fun:icaltime_from_timet_with_zone
+ fun:icaltime_from_timet
+ fun:icaltzutil_fetch_timezone
+ obj:*libical.so*
+ fun:icaltimezone_get_component
+ fun:_ZN6sysync29finalizeSystemZoneDefinitionsEPNS_6GZonesE
+}
+
+# ==23938== Use of uninitialised value of size 8
+# ==23938== at 0x7423DFB: icaltime_days_in_month (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742400B: icaltime_adjust (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74294FB: icaltimezone_convert_time (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742587B: icaltime_from_timet_with_zone (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742597A: icaltime_from_timet (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74263CB: icaltzutil_fetch_timezone (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74276F4: (within /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7427744: icaltimezone_get_component (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x6CA11A: sysync::finalizeSystemZoneDefinitions(sysync::GZones*) (platform_timezones.cpp:186)
+# ==23938== by 0x6B4544: sysync::GZones::loggingStarted() (timezones.cpp:114)
+# ==23938== by 0x6DA507: sysync::TSyncAppBase::finishConfig() (syncappbase.cpp:1441)
+# ==23938== by 0x6DA67F: sysync::TSyncAppBase::readXMLConfigStream(int (*)(char*, unsigned long, unsigned long*, void*), void*) (syncappbase.cpp:1753)
+# ==23938== by 0x6DA787: sysync::TSyncAppBase::readXMLConfigConstant(char const*) (syncappbase.cpp:1786)
+# ==23938== by 0x6B27E9: sysync::TEngineInterface::InitEngineXML(char const*) (engineinterface.cpp:1194)
+# ==23938== by 0x69F47C: SyncEvo::SharedEngine::InitEngineXML(std::string const&) (SynthesisEngine.cpp:48)
+# ==23938== by 0x624EB6: SyncEvo::SyncContext::initEngine(bool) (SyncContext.cpp:2622)
+# ==23938== by 0x6364FE: SyncEvo::SyncContext::sync(SyncEvo::SyncReport*) (SyncContext.cpp:2709)
+# ==23938== by 0x4BF856: SyncEvo::TestEvolution::doSync(int const*, std::string const&, SyncEvo::SyncOptions const&) (client-test-app.cpp:379)
+# ==23938== by 0x56B6C0: SyncEvo::SyncTests::doSync(SyncEvo::SyncOptions const&) (ClientTest.cpp:3248)
+# ==23938== by 0x57D9A1: SyncEvo::SyncTests::doSync(char const*, SyncEvo::SyncOptions const&) (ClientTest.h:765)
+# ==23938== by 0x4D4EE0: SyncEvo::SyncTests::deleteAll(SyncEvo::SyncTests::DeleteAllMode) (ClientTest.cpp:1620)
+# ==23938== by 0x4CDB1E: SyncEvo::SyncTests::testItems() (ClientTest.cpp:2333)
+# ==23938== by 0x5B7A406: CppUnit::TestCaseMethodFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B6C7D3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B76278: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B75FBB: CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81D9F: CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B7A09C: CppUnit::TestCase::run(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81B29: CppUnit::TestResult::runTest(CppUnit::Test*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B84121: CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+{
+ icaltimezone_get_component III
+ Memcheck:Value8
+ fun:icaltime_days_in_month
+ fun:icaltime_adjust
+ fun:icaltimezone_convert_time
+ fun:icaltime_from_timet_with_zone
+ fun:icaltime_from_timet
+ fun:icaltzutil_fetch_timezone
+ obj:*libical.so*
+ fun:icaltimezone_get_component
+ fun:_ZN6sysync29finalizeSystemZoneDefinitionsEPNS_6GZonesE
+}
+# ==23938== Conditional jump or move depends on uninitialised value(s)
+# ==23938== at 0x742B5CC: icalvalue_reset_kind (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7415284: icalvalue_new_datetime (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7412488: icalproperty_set_dtstart (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7412554: icalproperty_new_dtstart (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7426476: icaltzutil_fetch_timezone (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x74276F4: (within /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x7427744: icaltimezone_get_component (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x6CA11A: sysync::finalizeSystemZoneDefinitions(sysync::GZones*) (platform_timezones.cpp:186)
+# ==23938== by 0x6B4544: sysync::GZones::loggingStarted() (timezones.cpp:114)
+# ==23938== by 0x6DA507: sysync::TSyncAppBase::finishConfig() (syncappbase.cpp:1441)
+# ==23938== by 0x6DA67F: sysync::TSyncAppBase::readXMLConfigStream(int (*)(char*, unsigned long, unsigned long*, void*), void*) (syncappbase.cpp:1753)
+# ==23938== by 0x6DA787: sysync::TSyncAppBase::readXMLConfigConstant(char const*) (syncappbase.cpp:1786)
+# ==23938== by 0x6B27E9: sysync::TEngineInterface::InitEngineXML(char const*) (engineinterface.cpp:1194)
+# ==23938== by 0x69F47C: SyncEvo::SharedEngine::InitEngineXML(std::string const&) (SynthesisEngine.cpp:48)
+# ==23938== by 0x624EB6: SyncEvo::SyncContext::initEngine(bool) (SyncContext.cpp:2622)
+# ==23938== by 0x6364FE: SyncEvo::SyncContext::sync(SyncEvo::SyncReport*) (SyncContext.cpp:2709)
+# ==23938== by 0x4BF856: SyncEvo::TestEvolution::doSync(int const*, std::string const&, SyncEvo::SyncOptions const&) (client-test-app.cpp:379)
+# ==23938== by 0x56B6C0: SyncEvo::SyncTests::doSync(SyncEvo::SyncOptions const&) (ClientTest.cpp:3248)
+# ==23938== by 0x57D9A1: SyncEvo::SyncTests::doSync(char const*, SyncEvo::SyncOptions const&) (ClientTest.h:765)
+# ==23938== by 0x4D4EE0: SyncEvo::SyncTests::deleteAll(SyncEvo::SyncTests::DeleteAllMode) (ClientTest.cpp:1620)
+# ==23938== by 0x4CDB1E: SyncEvo::SyncTests::testItems() (ClientTest.cpp:2333)
+# ==23938== by 0x5B7A406: CppUnit::TestCaseMethodFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B6C7D3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B76278: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B75FBB: CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81D9F: CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B7A09C: CppUnit::TestCase::run(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81B29: CppUnit::TestResult::runTest(CppUnit::Test*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B84121: CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B8713A: CppUnit::TextTestRunner::run(std::string, bool, bool, bool) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+{
+ icaltimezone_get_component IV
+ Memcheck:Cond
+ fun:icalvalue_reset_kind
+ fun:icalvalue_new_datetime
+ fun:icalproperty_set_dtstart
+ fun:icalproperty_new_dtstart
+ fun:icaltzutil_fetch_timezone
+ obj:*libical.so*
+ fun:icaltimezone_get_component
+ fun:_ZN6sysync29finalizeSystemZoneDefinitionsEPNS_6GZonesE
+}
+# ==23938== Conditional jump or move depends on uninitialised value(s)
+# ==23938== at 0x8053794: vfprintf (in /lib/libc-2.9.so)
+# ==23938== by 0x8076759: vsnprintf (in /lib/libc-2.9.so)
+# ==23938== by 0x805BBA2: snprintf (in /lib/libc-2.9.so)
+# ==23938== by 0x742B728: print_date_to_string (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742B865: print_datetime_to_string (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x742BFF8: icalvalue_as_ical_string_r (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x741F1C4: icalproperty_as_ical_string_r (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x741AD58: icalcomponent_as_ical_string_r (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x741ADAF: icalcomponent_as_ical_string_r (in /usr/lib/libical.so.0.44.0)
+# ==23938== by 0x6CA12D: sysync::finalizeSystemZoneDefinitions(sysync::GZones*) (platform_timezones.cpp:189)
+# ==23938== by 0x6B4544: sysync::GZones::loggingStarted() (timezones.cpp:114)
+# ==23938== by 0x6DA507: sysync::TSyncAppBase::finishConfig() (syncappbase.cpp:1441)
+# ==23938== by 0x6DA67F: sysync::TSyncAppBase::readXMLConfigStream(int (*)(char*, unsigned long, unsigned long*, void*), void*) (syncappbase.cpp:1753)
+# ==23938== by 0x6DA787: sysync::TSyncAppBase::readXMLConfigConstant(char const*) (syncappbase.cpp:1786)
+# ==23938== by 0x6B27E9: sysync::TEngineInterface::InitEngineXML(char const*) (engineinterface.cpp:1194)
+# ==23938== by 0x69F47C: SyncEvo::SharedEngine::InitEngineXML(std::string const&) (SynthesisEngine.cpp:48)
+# ==23938== by 0x624EB6: SyncEvo::SyncContext::initEngine(bool) (SyncContext.cpp:2622)
+# ==23938== by 0x6364FE: SyncEvo::SyncContext::sync(SyncEvo::SyncReport*) (SyncContext.cpp:2709)
+# ==23938== by 0x4BF856: SyncEvo::TestEvolution::doSync(int const*, std::string const&, SyncEvo::SyncOptions const&) (client-test-app.cpp:379)
+# ==23938== by 0x56B6C0: SyncEvo::SyncTests::doSync(SyncEvo::SyncOptions const&) (ClientTest.cpp:3248)
+# ==23938== by 0x57D9A1: SyncEvo::SyncTests::doSync(char const*, SyncEvo::SyncOptions const&) (ClientTest.h:765)
+# ==23938== by 0x4D4EE0: SyncEvo::SyncTests::deleteAll(SyncEvo::SyncTests::DeleteAllMode) (ClientTest.cpp:1620)
+# ==23938== by 0x4CDB1E: SyncEvo::SyncTests::testItems() (ClientTest.cpp:2333)
+# ==23938== by 0x5B7A406: CppUnit::TestCaseMethodFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B6C7D3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B76278: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B75FBB: CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81D9F: CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B7A09C: CppUnit::TestCase::run(CppUnit::TestResult*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+# ==23938== by 0x5B81B29: CppUnit::TestResult::runTest(CppUnit::Test*) (in /usr/lib/libcppunit-1.12.so.1.0.0)
+{
+ icalcomponent_as_ical_string_r
+ Memcheck:Cond
+ fun:vfprintf
+ fun:vsnprintf
+ fun:snprintf
+ fun:print_date_to_string
+ fun:print_datetime_to_string
+ fun:icalvalue_as_ical_string_r
+ fun:icalproperty_as_ical_string_r
+ fun:icalcomponent_as_ical_string_r
+ fun:icalcomponent_as_ical_string_r
+ fun:_ZN6sysync29finalizeSystemZoneDefinitionsEPNS_6GZonesE
+}
diff --git a/test/generate-html.xsl b/test/generate-html.xsl
index 2bf03cfb..b17d18fd 100644
--- a/test/generate-html.xsl
+++ b/test/generate-html.xsl
@@ -265,7 +265,9 @@
</td>
<td>
<xsl:for-each select="$categories">
- <xsl:value-of select="name(.)"/>
+ <xsl:call-template name="stringescape">
+ <xsl:with-param name="string" select="name(.)"/>
+ </xsl:call-template>
<xsl:if test="position()!=last()">
<xsl:value-of select="', '"/>
</xsl:if>
@@ -562,7 +564,11 @@
<tr>
<th>Item</th>
<xsl:for-each select="$type-list">
- <th width="20"><xsl:value-of select="name(.)"/></th>
+ <th width="20">
+ <xsl:call-template name="stringescape">
+ <xsl:with-param name="string" select="name(.)"/>
+ </xsl:call-template>
+ </th>
</xsl:for-each>
</tr>
@@ -594,7 +600,12 @@
skipped
</xsl:when>
<xsl:otherwise>
- <a href="{concat($log-path,string(@prefix),name($type),'_',name($unit),$log-file-suffix)}">
+ <xsl:variable name='escapedtype'>
+ <xsl:call-template name="stringescape">
+ <xsl:with-param name="string" select="name($type)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <a href="{concat($log-path,string(@prefix),$escapedtype,'_',name($unit),$log-file-suffix)}">
<xsl:value-of select="$status"/>
</a>
</xsl:otherwise>
@@ -792,5 +803,41 @@
<br/>
</xsl:template>
+ <xsl:template name="stringescape">
+ <xsl:param name="string"/>
+ <xsl:variable name="str">
+ <xsl:call-template name="stringreplaceall">
+ <xsl:with-param name="orginalstring" select="$string"/>
+ <xsl:with-param name="old" select="'__'"/>
+ <xsl:with-param name="new" select="'_'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="stringreplaceall">
+ <xsl:with-param name="orginalstring" select="string($str)"/>
+ <xsl:with-param name="old" select="'_-'"/>
+ <xsl:with-param name="new" select="'+'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="stringreplaceall">
+ <xsl:param name="orginalstring"/>
+ <xsl:param name="old"/>
+ <xsl:param name="new"/>
+ <xsl:choose>
+ <xsl:when test="contains($orginalstring, $old)">
+ <xsl:value-of select="substring-before($orginalstring, $old)"/>
+ <xsl:value-of select="$new"/>
+ <xsl:call-template name="stringreplaceall">
+ <xsl:with-param name="orginalstring" select="substring-after($orginalstring, $old)"/>
+ <xsl:with-param name="old" select="$old"/>
+ <xsl:with-param name="new" select="$new"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$orginalstring"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
</xsl:stylesheet>
diff --git a/test/resultchecker.py b/test/resultchecker.py
index a5900f15..58c169a1 100755
--- a/test/resultchecker.py
+++ b/test/resultchecker.py
@@ -244,7 +244,10 @@ def step2(resultdir, result, servers, indents, srcdir, shellprefix, backenddir):
indent +=space
indents.append(indent)
prefix = logprefix[format]
- result.write(indent+'<'+format+' prefix="'+prefix+'">\n')
+ qformat = format;
+ qformat = qformat.replace("_", "__");
+ qformat = qformat.replace("+", "_-");
+ result.write(indent+'<'+qformat+' prefix="'+prefix+'">\n')
for case in logdic[format]:
indent +=space
indents.append(indent)
@@ -259,7 +262,7 @@ def step2(resultdir, result, servers, indents, srcdir, shellprefix, backenddir):
result.write('</'+casename+'>\n')
indents.pop()
indent = indents[-1]
- result.write(indent+'</'+format+'>\n')
+ result.write(indent+'</'+qformat+'>\n')
indents.pop()
indent = indents[-1]
result.write(indent+'</'+server+'>\n')
diff --git a/test/runtests.py b/test/runtests.py
index 55896f42..992e6d43 100755
--- a/test/runtests.py
+++ b/test/runtests.py
@@ -876,7 +876,10 @@ class FunambolTest(SyncEvolutionTest):
"CLIENT_TEST_XML=1 "
"CLIENT_TEST_MAX_ITEMSIZE=2048 "
"CLIENT_TEST_DELAY=10 "
- "CLIENT_TEST_FAILURES= "
+ "CLIENT_TEST_FAILURES="
+ "Client::Sync::vcard21::testTwinning,"
+ "Client::Sync::vcard21_ical20_itodo20_text::testTwinning,"
+ "Client::Sync::text_itodo20_ical20_vcard21::testTwinning "
"CLIENT_TEST_COMPARE_LOG=T "
"CLIENT_TEST_RESEND_TIMEOUT=5 "
"CLIENT_TEST_INTERRUPT_AT=1",
@@ -1029,6 +1032,7 @@ memotootest = SyncEvolutionTest("memotoo", compile,
"Client::Sync::vcard21::testRefreshFromClientSync,"
"Client::Sync::vcard21::testRefreshFromClientSemantic,"
"Client::Sync::vcard21::testRefreshStatus,"
+ "Client::Sync::vcard21::testDeleteAllRefresh,"
"Client::Sync::vcard21::testOneWayFromServer,"
"Client::Sync::ical20::testRefreshFromClientSync,"
"Client::Sync::ical20::testRefreshFromClientSemantic,"
@@ -1039,18 +1043,21 @@ memotootest = SyncEvolutionTest("memotoo", compile,
"Client::Sync::itodo20::testRefreshFromClientSync,"
"Client::Sync::itodo20::testRefreshFromClientSemantic,"
"Client::Sync::itodo20::testRefreshStatus,"
+ "Client::Sync::itodo20::testDeleteAllRefresh,"
"Client::Sync::itodo20::testOneWayFromServer,"
"Client::Sync::itodo20::Retry,"
"Client::Sync::itodo20::Suspend,"
"Client::Sync::text::testRefreshFromClientSync,"
"Client::Sync::text::testRefreshFromClientSemantic,"
"Client::Sync::text::testRefreshStatus,"
+ "Client::Sync::text::testDeleteAllRefresh,"
"Client::Sync::text::testOneWayFromServer,"
"Client::Sync::text::Retry,"
"Client::Sync::text::Suspend,"
"Client::Sync::vcard21_ical20_itodo20_text::testRefreshFromClientSync,"
"Client::Sync::vcard21_ical20_itodo20_text::testRefreshFromClientSemantic,"
"Client::Sync::vcard21_ical20_itodo20_text::testRefreshStatus,"
+ "Client::Sync::vcard21_ical20_itodo20_text::testDeleteAllRefresh,"
"Client::Sync::vcard21_ical20_itodo20_text::testOneWayFromServer,"
"Client::Sync::vcard21_ical20_itodo20_text::Retry,"
"Client::Sync::vcard21_ical20_itodo20_text::Suspend,"
@@ -1058,6 +1065,7 @@ memotootest = SyncEvolutionTest("memotoo", compile,
"Client::Sync::text_itodo20_ical20_vcard21::testRefreshFromClientSemantic,"
"Client::Sync::text_itodo20_ical20_vcard21::testRefreshStatus,"
"Client::Sync::text_itodo20_ical20_vcard21::testOneWayFromServer,"
+ "Client::Sync::text_itodo20_ical20_vcard21::testDeleteAllRefresh,"
"Client::Sync::text_itodo20_ical20_vcard21::Retry,"
"Client::Sync::text_itodo20_ical20_vcard21::Suspend "
"CLIENT_TEST_DELAY=5 "
@@ -1120,6 +1128,7 @@ ovitest = SyncEvolutionTest("ovi", compile,
"CLIENT_TEST_COMPARE_LOG=T "
"CLIENT_TEST_RESEND_TIMEOUT=5 "
"CLIENT_TEST_INTERRUPT_AT=1",
+ serverName="Ovi",
testPrefix=options.testprefix)
context.add(ovitest)
diff --git a/test/syncevo-phone-config.py b/test/syncevo-phone-config.py
index 5608b3f2..bc4bb51a 100755
--- a/test/syncevo-phone-config.py
+++ b/test/syncevo-phone-config.py
@@ -21,17 +21,27 @@
Automatically trying different configurations for a phone to sync with
SyncEvolution.
'''
-import sys, optparse, os, time, popen2
+import sys, optparse, os, time, tempfile
+import shutil
+import ConfigParser
+import glob
+import os.path
+
+# source names as commonly used in SyncEvolution
+allSources = ['addressbook', 'calendar', 'todo', 'memo', 'calendar+todo']
+# valid SyncMLVersion values
+allVersions = ['1.2', '1.1', '1.0']
########################### cmdline options ##########################################
parser = optparse.OptionParser()
parser.add_option("-b", "--bt-address", action = "store", type = "string",
dest = "btaddr", help = "The Bluetooth mac address for the testing phone", default = "")
-parser.add_option ("-p", "--proto-version", action = "store", type = "string",
- dest="version", help = "The SyncML protocal version for testing, can be one of 1.0|1.1|1.2, by default it will try all versions one by one"
- ,default = "")
+parser.add_option ("-p", "--protocol-version", action = "store", type = "string",
+ dest="version", help = "The SyncML protocal version for testing, can be one of " +
+ "|".join(allVersions) + ", by default it will try all versions one by one",
+ default = "")
parser.add_option ("-s", "--source", action = "store", type = "string", dest=
- "source", help = "The local database for testing, can be one of contact|calendar|task|memo|calendar+task, by default it will try all except calendar+task, use --combined-calendar-task to activate",
+ "source", help = "The local database for testing, can be one of " + "|".join(allSources),
default = "")
parser.add_option ("-u", "--uri", action = "store", type = "string", dest =
"uri", help = "The URI for testing the selected source, invalid when no specific source is selected via --source", default = "")
@@ -43,39 +53,35 @@ parser.add_option ("-i", "--identifier", action = "store", type="string",
default = "")
parser.add_option ("", "--without-ctcap", action = "store_true", default =False,
dest = "ctcap", help = "Testing without sending CTCap information")
-parser.add_option ("-v", "--verbose", action = "store_true", default = False,
- dest = "verbose", help = "Enabling detailed output")
-parser.add_option ("", "--combined-calendar-task", action = "store_true",
- default = False, dest = "combined", help = "Testing the combined calendar, task data source")
+parser.add_option ("-v", "--verbose", action = "count",
+ dest = "verbose", help = "Increase amount of output")
parser.add_option ("-a", "--advanced", action = "store_true", default = False,
dest = "advanced", help = "More extensive test with sending/receving data, WARNING: will destroy your data on the tested phone")
parser.add_option("-c", "--create-config", action ="store", type = "string",
dest = "create", help = "If set, a configuration file with the name will be created based on the testing result",
default ="")
-parser.add_option("-l", "--create-template", action ="store", type = "string",
- dest = "template", help = "If set, a template for the found configuration with the name will be created, it is a folder located in current working directory",default ="")
(options, args) = parser.parse_args()
####################semantic check for cmdline options #######################################
-if (not options.btaddr):
- parser.error ("Please input the bluetooth address for the testing phone by -b")
-if (options.version and options.version not in ['1.1', '1.2', '1.3']):
- parser.error("option -p can only be one of 1.0|1.1|1.2")
-if (options.source and options.source not in ['contact', 'calendar', 'task',
- 'memo', 'calendar+task']):
- parser.error("option -s can only be one of contact|calendar|task|memo|calendar+task")
-if (options.uri and not options.source and not options.combined):
- parser.error ("options -u must work with -s")
-if (options.type and not options.source):
- parser.error ("options -t must work with -s")
+if not options.btaddr:
+ parser.error ("Please provide the Bluetooth MAC address for the phone with -b/--bt-address.")
+if options.version and options.version not in allVersions:
+ parser.error("Option -p/--protocol-version can only be one of " + "|".join(allVersions) + ".")
+if options.source and options.source not in allSources:
+ parser.error("Option -s/--source can only be one of " + "|".join(allSources) + ".")
+if options.uri and not options.source:
+ parser.error ("Option -u/--uri only works in combination with -s/--source.")
+if options.type and not options.source:
+ parser.error ("Option -t/--type only works in combination with -s/--source.")
#######################some global parameters ######################
-syncevo = 'syncevolution'
-configName = 'bfb3e7cb3d259e5f5aabbfb2ffac23f8cf5ad91b'
-configContext = 'test-phone'
-templateName = '"Nokia 7210c"'
-testFolder = '/tmp/'+configName
-testResult = '/tmp/cache/'
+syncevoCmd = 'syncevolution'
+configName = 'test-phone' # inside temporary testConfig dir
+# real paths set in main() inside temporary directory
+testFolder = '/dev/null/data'
+testResult = '/dev/null/cache'
+testConfig = '/dev/null/config'
+
#################### Configuration Parameter #######################
class ConfigurationParameter:
@@ -96,6 +102,17 @@ class ConfigurationParameter:
print "URI: %s" %(self.uri,)
print "Content Type: %s" %(self.type,)
+ def __str__(self):
+ res = []
+ if self.ctcap:
+ res.append("with CTCap")
+ else:
+ res.append("without CTCap")
+ res.append(self.identifier)
+ res.append(self.version)
+ res.append("%s = %s + %s" % (self.source, self.uri, self.type))
+ return ", ".join(res)
+
def equalWith(self, config):
return (config and \
self.ctcap == config.ctcap and \
@@ -105,130 +122,125 @@ class ConfigurationParameter:
self.type == config.type)
###################### utility functions ####################
-def isCombinedSource (source):
- return source == 'calendar+task'
-
-def getSubSources (source):
- return ['calendar','task']
-
def clearLocalSyncData(sources):
for source in sources:
- sourceCmd = "rm -rf %s/%s; mkdir %s/%s" % (testFolder, source, testFolder, source)
- try:
- runCommand(sourceCmd)
- except:
- pass
+ dirname = "%s/%s" % (testFolder, source)
+ rm_r(dirname)
+ os.makedirs(dirname)
+
+def createFile(filename, content):
+ f = open(filename, "w")
+ f.write(content)
def insertLocalSyncData(sources, type):
for source in sources:
- testcase = getTestCase (source, type)
- cmd = "echo \"%s\" > %s/%s/0 ;echo 'insertLocalSyncData'" % (testcase, testFolder, source)
- runCommand(cmd)
+ testcase, keys = getTestCase (source, type)
+ createFile(os.path.join(testFolder, source, "0"), testcase)
def getTestCase(source, type):
- if (source == 'contact' and (type == 'text/vcard:3.0' or type == 'text/vcard')):
- return "BEGIN:VCARD\n"\
- +"VERSION:3.0\n"\
- +"TITLE:tester\n"\
- +"FN:John Doe\n"\
- +"N:Doe;John;;;\n"\
- +"TEL;TYPE=WORK;TYPE=VOICE:business 1\n"\
- +"X-EVOLUTION-FILE-AS:Doe\\, John\n"\
- +"X-MOZILLA-HTML:FALSE\n"\
- +"NOTE:test-phone\n"\
- +"END:VCARD\n"
- if (source == 'contact' and (type == 'text/x-vcard:2.1' or type == 'text/x-vcard')):
- return "BEGIN:VCARD\n"\
- +"VERSION:2.1\n"\
- +"TITLE:tester\n"\
- +"FN:John Doe\n"\
- +"N:Doe;John;;;\n"\
- +"TEL;TYPE=WORK;TYPE=VOICE:business 1\n"\
- +"X-MOZILLA-HTML:FALSE\n"\
- +"NOTE:REVISION\n"\
- +"END:VCARD\n"
- if (source == 'calendar' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
- return "BEGIN:VCALENDAR\n"\
- +"PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"\
- +"VERSION:2.0\n"\
- +"METHOD:PUBLISH\n"\
- +"BEGIN:VEVENT\n"\
- +"SUMMARY:phone meeting\n"\
- +"DTEND:20060406T163000Z\n"\
- +"DTSTART:20060406T160000Z\n"\
- +"DTSTAMP:20060406T211449Z\n"\
- +"LAST-MODIFIED:20060409T213201\n"\
- +"CREATED:20060409T213201\n"\
- +"LOCATION:my office\n"\
- +"DESCRIPTION:let's talkREVISION\n"\
- +"END:VEVENT\n"\
- +"END:VCALENDAR\n"
- if (source == 'calendar' and (type =='text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
- return "BEGIN:VCALENDAR\n"\
- +"VERSION:1.0\n"\
- +"BEGIN:VEVENT\n"\
- +"SUMMARY:phone meeting\n"\
- +"DTEND:20060406T163000Z\n"\
- +"DTSTART:20060406T160000Z\n"\
- +"DTSTAMP:20060406T211449Z\n"\
- +"LOCATION:my office\n"\
- +"DESCRIPTION:let's talkREVISION\n"\
- +"END:VEVENT\n"\
- +"END:VCALENDAR\n"
- if (source == 'task' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
- return "BEGIN:VCALENDAR\n"\
- +"PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"\
- +"VERSION:2.0\n"\
- +"METHOD:PUBLISH\n"\
- +"BEGIN:VTODO\n"\
- +"DTSTAMP:20060417T173712Z\n"\
- +"SUMMARY:do me\n"\
- +"DESCRIPTION:to be doneREVISION\n"\
- +"CREATED:20060417T173712\n"\
- +"LAST-MODIFIED:20060417T173712\n"\
- +"END:VTODO\n"\
- +"END:VCALENDAR\n"
- if (source == 'task' and (type == 'text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
- return "BEGIN:VCALENDAR\n"\
- +"PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"\
- +"VERSION:1.0\n"\
- +"METHOD:PUBLISH\n"\
- +"BEGIN:VTODO\n"\
- +"DTSTAMP:20060417T173712Z\n"\
- +"SUMMARY:do me\n"\
- +"DESCRIPTION:to be doneREVISION\n"\
- +"CREATED:20060417T173712\n"\
- +"LAST-MODIFIED:20060417T173712\n"\
- +"END:VTODO\n"\
- +"END:VCALENDAR\n"
- if (source == 'memo'):
- return "SUMMARY\n"\
- +"BODY TEXT\n"
- return ""
-
-# Get the keyword to be matched with for each test case
-def getTestCaseKeywords(source, type):
- if (source == 'contact' and (type == 'text/vcard:3.0' or type == 'text/vcard')):
- return ["VCARD", "TITLE:tester", "Doe", "John"]
- if (source == 'contact' and (type == 'text/x-vcard:2.1' or type == 'text/x-vcard')):
- return ["VCARD", "TITLE:tester", "Doe", "John"]
- if (source == 'calendar' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
- return ["VCALENDAR", "VEVENT", "phone meeting", "my office"]
- if (source == 'calendar' and (type =='text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
- return ["VCALENDAR", "VEVENT", "phone meeting", "my office"]
- if (source == 'task' and (type == 'text/calendar:2.0' or type == 'text/calendar')):
- return ["VCALENDAR", "VTODO", "do me"]
- if (source == 'task' and (type == 'text/x-vcalendar:1.0' or type == 'text/x-vcalendar')):
- return ["VCALENDAR", "VTODO", "do me"]
- if (source == 'memo'):
- return ["SUMMARY"]
- return ""
+ """Returns a pair of test item string plus a list of sub strings
+ which are expected to come back from the phone. Type comparison is
+ intentionally a bit vague, so that it doesn't matter whether the
+ type contains a version or a ! force flag."""
+ if source == 'addressbook' and type.startswith('text/vcard'):
+ return ("BEGIN:VCARD\n"
+ "VERSION:3.0\n"
+ "TITLE:tester\n"
+ "FN:John Doe\n"
+ "N:Doe;John;;;\n"
+ "TEL;TYPE=WORK;TYPE=VOICE:business 1\n"
+ "X-EVOLUTION-FILE-AS:Doe\\, John\n"
+ "X-MOZILLA-HTML:FALSE\n"
+ "NOTE:test-phone\n"
+ "END:VCARD\n",
+ ["VCARD", "TITLE:tester", "Doe", "John"])
+
+ if source == 'addressbook' and type.startswith('text/x-vcard'):
+ return ("BEGIN:VCARD\n"
+ "VERSION:2.1\n"
+ "TITLE:tester\n"
+ "FN:John Doe\n"
+ "N:Doe;John;;;\n"
+ "TEL;TYPE=WORK;TYPE=VOICE:business 1\n"
+ "X-MOZILLA-HTML:FALSE\n"
+ "NOTE:REVISION\n"
+ "END:VCARD\n",
+ ["VCARD", "TITLE:tester", "Doe", "John"])
+
+ if source == 'calendar' and type.startswith('text/calendar'):
+ return ("BEGIN:VCALENDAR\n"
+ "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
+ "VERSION:2.0\n"
+ "METHOD:PUBLISH\n"
+ "BEGIN:VEVENT\n"
+ "SUMMARY:phone meeting\n"
+ "DTEND:20060406T163000Z\n"
+ "DTSTART:20060406T160000Z\n"
+ "DTSTAMP:20060406T211449Z\n"
+ "LAST-MODIFIED:20060409T213201\n"
+ "CREATED:20060409T213201\n"
+ "LOCATION:my office\n"
+ "DESCRIPTION:let's talkREVISION\n"
+ "END:VEVENT\n"
+ "END:VCALENDAR\n",
+ ["VCALENDAR", "VEVENT", "phone meeting", "my office"])
+
+ if source == 'calendar' and type.startswith('text/x-vcalendar'):
+ return ("BEGIN:VCALENDAR\n"
+ "VERSION:1.0\n"
+ "BEGIN:VEVENT\n"
+ "SUMMARY:phone meeting\n"
+ "DTEND:20060406T163000Z\n"
+ "DTSTART:20060406T160000Z\n"
+ "DTSTAMP:20060406T211449Z\n"
+ "LOCATION:my office\n"
+ "DESCRIPTION:let's talkREVISION\n"
+ "END:VEVENT\n"
+ "END:VCALENDAR\n",
+ ["VCALENDAR", "VEVENT", "phone meeting", "my office"])
+
+ if source == 'todo' and type.startswith('text/calendar'):
+ return ("BEGIN:VCALENDAR\n"
+ "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
+ "VERSION:2.0\n"
+ "METHOD:PUBLISH\n"
+ "BEGIN:VTODO\n"
+ "DTSTAMP:20060417T173712Z\n"
+ "SUMMARY:do me\n"
+ "DESCRIPTION:to be doneREVISION\n"
+ "CREATED:20060417T173712\n"
+ "LAST-MODIFIED:20060417T173712\n"
+ "END:VTODO\n"
+ "END:VCALENDAR\n",
+ ["VCALENDAR", "VTODO", "do me"])
+
+ if source == 'todo' and type.startswith('text/x-vcalendar'):
+ return ("BEGIN:VCALENDAR\n"
+ "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n"
+ "VERSION:1.0\n"
+ "METHOD:PUBLISH\n"
+ "BEGIN:VTODO\n"
+ "DTSTAMP:20060417T173712Z\n"
+ "SUMMARY:do me\n"
+ "DESCRIPTION:to be doneREVISION\n"
+ "CREATED:20060417T173712\n"
+ "LAST-MODIFIED:20060417T173712\n"
+ "END:VTODO\n"
+ "END:VCALENDAR\n",
+ ["VCALENDAR", "VTODO", "do me"])
+
+ if source == 'memo':
+ return ("Summary Line\n"
+ "BODY TEXT\n",
+ ["Summary Line"])
+
+ raise "no test data defined for source %s and type %s" % (source, type)
# Compare the received data with the sent data, we only match selected keywords in received
# data for a basic sanity test
def compareSyncData(sources, type):
for source in sources:
- testcase = getTestCase (source, type)
+ testcase, keys = getTestCase (source, type)
received = ''
recFile = "%s/%s/0" %(testFolder, source)
try:
@@ -236,8 +248,7 @@ def compareSyncData(sources, type):
received = rf.read()
except:
return False
- keys = getTestCaseKeywords(source, type)
- if (options.verbose):
+ if (options.verbose > 1):
print "comparing received file:"
print received
print "with built in keywords in test case:"
@@ -250,18 +261,17 @@ def compareSyncData(sources, type):
# wrapper of running a shell command
def runCommand(cmd, exception = True):
"""Log and run the given command, throwing an exception if it fails."""
- if (options.verbose):
+ if (options.verbose > 1):
print "%s: %s" % (os.getcwd(), cmd)
else:
- cmd += ' >/dev/null 2>&1'
+ cmd += ' >/dev/null'
sys.stdout.flush()
result = os.system(cmd)
if result != 0 and exception:
raise Exception("%s: failed (return code %d)" % (cmd, result>>8))
def runSync(sync):
- cmd = "rm -rf %s/syncevolution" %(testResult)
- runCommand (cmd)
+ rm_r("%s/syncevolution" % testResult)
status = True
interrupt = False
@@ -270,51 +280,100 @@ def runSync(sync):
except:
status = False
pass
- cmd = "find %s/syncevolution/ -name 'status.ini'" %(testResult)
- fout,fin = popen2.popen2(cmd)
- for line in fout:
- resultFile = line.rpartition('\n')[0]
- result = open(resultFile)
- for line in result:
- if (line.find ('status') != -1 and line.find('20015') != -1):
- status = False
- interrupt = True
- break;
+
+ # session name is unknown, but we know there is only one, so let
+ # glob find it for us
+ resultFile = glob.glob("%s/syncevolution/*/status.ini" % testResult)[0]
+
+ # inject [main] at start of file for ConfigParser,
+ # because SyncEvolution doesn't write sections
+ class IniFile:
+ def __init__(self, filename):
+ self.fp = open(filename, "r")
+ self.read = False
+ def readline(self):
+ if not self.read:
+ self.read = True
+ return "[main]"
+ else:
+ return self.fp.readline()
+
+ ini = ConfigParser.ConfigParser({"status": "0", "error": ""})
+ ini.readfp(IniFile(resultFile))
+ statuscode = ini.get("main", "status")
+ if statuscode == "20015":
+ # aborted by user, stop testing
+ status = False
+ interrupt = True
+ if statuscode == "22002":
+ # syncevolution failed (for example, kill -9), warn and abort
+ print "\nSyncEvolution binary died prematurely, aborting testing."
+ status = False
+ interrupt = True
return (status, interrupt)
+# recursive directory removal, without throwing an error if directory does not exist
+def rm_r(dirname):
+ if os.path.isdir(dirname):
+ shutil.rmtree(dirname)
+
+def hash2ini(hash):
+ """convert key/value pairs into .ini file without sections"""
+ res = []
+ for key, value in hash.items():
+ res.append("%s = %s" % (key, value))
+ return "\n".join(res)
+
+def strip_version(type):
+ """turn type[:version][!] into type[!]"""
+ res = type.split(':')[0]
+ if type.endswith('!'):
+ res += '!'
+ return res
##############################TestConfiguration##################################
class TestingConfiguration():
def __init__(self, versions, sources, uris, types, ctcaps, identifiers, btaddr):
- self.allSources = ['contact', 'calendar', 'task', 'memo', 'calendar+task']
if (versions):
self.versions = versions
else:
- self.versions = ["1.2", "1.1", "1.0"]
- if (sources):
+ self.versions = allVersions
+
+ # If "calendar+todo" is tested, then "calendar" and "todo"
+ # must be tested first. If they lead to the same result,
+ # then they have to be combined for "calendar+todo".
+ # "calendar+todo" itself is never tested directly.
+ if sources:
self.sources = sources
else:
- self.sources = ["contact", "calendar", "task", "memo"]
- if (options.combined):
- self.sources.insert (0, "calendar+task")
+ self.sources = allSources
+ if "calendar+todo" in self.sources:
+ self.sources.remove("calendar+todo")
+ if not "calendar" in self.sources:
+ self.sources.append("calendar")
+ if not "todo" in self.sources:
+ self.sources.append("todo")
+
if (uris):
self.uris = uris
else:
self.uris = {}
- self.uris['contact'] = ['Contact', 'contact', 'Contacts', 'contacts', 'Addressbook', 'addressbook']
+ self.uris['addressbook'] = ['Contact', 'contact', 'Contacts', 'contacts', 'Addressbook', 'addressbook']
self.uris['calendar'] = ['Calendar', 'calendar', 'Agenda','agenda']
- self.uris['task'] = self.uris['calendar'] + ['Task', 'task', 'Tasks', 'tasks', 'Todo','todo']
+ self.uris['todo'] = self.uris['calendar'] + ['Task', 'task', 'Tasks', 'tasks', 'Todo','todo']
self.uris['memo'] = ['Memo', 'memo', 'Notes', 'notes', 'Note', 'note']
- self.uris['calendar+task'] = self.uris['calendar'] + self.uris['task']
+
if (types):
self.types = types
else:
+ # - must include version numbers because file backend needs them
+ # - current types like 'text/vcard:3.0' are "downgraded" to the
+ # legacy types when sending a SAN, so they are basically identical;
+ # to really send a SAN with these current types, we have to "force" them
self.types = {}
- self.types['contact'] = ['text/vcard:3.0', 'text/x-vcard:2.1']
- self.types['calendar'] = self.types['task'] = ['text/calendar:2.0', 'text/x-vcalendar:1.0']
- self.types['memo'] = ['text/plain:1.0',
- 'text/calendar:2.0', 'text/x-vcalendar:1.0']
- self.types['calendar+task'] = self.types['calendar']
+ self.types['addressbook'] = ['text/vcard:3.0', 'text/x-vcard:2.1', 'text/vcard:3.0!']
+ self.types['calendar'] = self.types['todo'] = ['text/calendar:2.0', 'text/x-vcalendar:1.0', 'text/calendar:2.0!']
+ self.types['memo'] = ['text/plain:1.0']
if (ctcaps):
self.ctcaps = ctcaps
@@ -327,19 +386,6 @@ class TestingConfiguration():
self.btaddr = btaddr
- #map between user perceivable source name and the underlying source name in SyncEvolution
- def getLocalSourceName (self, source):
- if (source == 'contact'):
- return 'addressbook'
- if (source == 'calendar'):
- return 'calendar'
- if (source == 'task'):
- return 'todo'
- if (source == 'memo'):
- return 'memo'
- if (source =='calendar+task'):
- return 'calendar+todo'
-
#before each configuration is really tested, prepare is called.
#returns True if we decide current configuration need not be tested
def prepare (self, allconfigs, curconfig):
@@ -357,18 +403,26 @@ class TestingConfiguration():
if (config):
if ( (config.source == self.source) or (config.identifier != self.identifier ) or (config.ctcap != self.ctcap) or (config.version != self.version)):
skip = True
- if ((self.source == 'calendar' or self.source == 'task') and isCombinedSource(config.source)):
- skip = True
if (skip):
- if (options.verbose):
+ if (options.verbose > 1):
print "Test %d/%d skipped because already found a working configuration" % (curconfig, allconfigs)
+ elif options.verbose > 0:
+ print "Test %d/%d skipped" %(curconfig, allconfigs), \
+ ConfigurationParameter(self.version, self.source, self.uri, self.type, self.ctcap, self.identifier)
else:
print "Test %d/%d skipped" %(curconfig, allconfigs)
else:
- print "Start %d/%d test" % (curconfig, allconfigs)
- if (options.verbose):
+ print ("Start %d/%d test" % (curconfig, allconfigs)),
+ if (options.verbose > 0):
config = ConfigurationParameter(self.version, self.source, self.uri, self.type, self.ctcap, self.identifier)
- config.printMe()
+ if (options.verbose > 1):
+ print
+ config.printMe()
+ else:
+ print config
+ else:
+ print
+
return skip
@@ -378,54 +432,33 @@ class TestingConfiguration():
def testWithCurrentConfiguration(self):
""" Prepare the configuration and run a sync session, Returns true if
the test was successful, otherwise false"""
- fullConfigName = configName +'@' + configContext
- try:
- runCommand (syncevo+' --remove '+fullConfigName)
- except:
- pass
- runCommand (syncevo+' -c -l ' + templateName + ' ' + fullConfigName)
- runSources ={'contact':'addressbook', 'calendar':'calendar', 'task':'todo', 'memo':'memo', 'calendar+task':'calendar+todo'}
+ rm_r(testConfig)
+ cmdPrefix = "XDG_CACHE_HOME=%s XDG_CONFIG_HOME=%s " %(testResult, testConfig)
+ syncevoTest = "%s %s --daemon=no" % (cmdPrefix, syncevoCmd)
+ runCommand ("%s -c --template 'SyncEvolution Client' --sync-property peerIsClient=1 %s" % (syncevoTest, configName))
# set the local database
- if (isCombinedSource(self.source)):
- for s in getSubSources(self.source):
- filesource = testFolder+'/'+s
- configCmd = "%s --configure --source-property evolutionsource='file:///%s' %s %s" %(syncevo,filesource, fullConfigName, runSources[s])
- runCommand(configCmd)
- subSources = getSubSources(self.source)
- filesource = runSources[subSources[0]] +',' + runSources[subSources[1]]
- configCmd = "%s --configure --source-property evolutionsource=%s %s %s" %(syncevo,filesource, fullConfigName, runSources[self.source])
- runCommand(configCmd)
-
- else:
- filesource = testFolder+'/'+self.source
- configCmd = "%s --configure --source-property evolutionsource='file:///%s' %s %s" %(syncevo,filesource, fullConfigName, runSources[self.source])
- runCommand (configCmd)
+ filesource = testFolder+'/'+self.source
+ configCmd = "%s --configure --source-property evolutionsource='file:///%s' %s %s" %(syncevoTest, filesource, configName, self.source)
+ runCommand (configCmd)
- configCmd = "%s --configure --sync-property logLevel=5 --sync-property SyncURL=obex-bt://%s --sync-property SyncMLVersion=%s %s" % (syncevo, self.btaddr,self.version, fullConfigName)
+ configCmd = "%s --configure --sync-property logLevel=5 --sync-property SyncURL=obex-bt://%s --sync-property SyncMLVersion=%s %s" % (syncevoTest, self.btaddr,self.version, configName)
runCommand (configCmd)
if (self.identifier):
- configCmd = "%s --configure --sync-property remoteIdentifier='%s' %s" %(syncevo, self.identifier, fullConfigName)
+ configCmd = "%s --configure --sync-property remoteIdentifier='%s' %s" %(syncevoTest, self.identifier, configName)
runCommand (configCmd)
- if (isCombinedSource(self.source)):
- configCmd = "%s --configure --source-property type=%s --source-property uri=%s %s %s" %(syncevo, "virtual:"+self.type.partition(':')[0], self.uri, fullConfigName, runSources[self.source])
- runCommand (configCmd)
- for s in getSubSources(self.source):
- configCmd = "%s --configure --source-property type=%s %s %s" %(syncevo, "file:"+self.type, fullConfigName, runSources[s])
- runCommand (configCmd)
- else:
- configCmd = "%s --configure --source-property type=%s --source-property uri=%s %s %s" %(syncevo, "file:"+self.type, self.uri, fullConfigName, runSources[self.source])
- runCommand (configCmd)
+ configCmd = "%s --configure --source-property 'type=file:%s' --source-property uri=%s %s %s" %(syncevoTest, self.type, self.uri, configName, self.source)
+ runCommand (configCmd)
""" start the sync session """
- cmdPrefix="XDG_CACHE_HOME=%s " %(testResult)
if (not self.ctcap):
cmdPrefix += "SYNCEVOLUTION_NOCTCAP=t "
- syncCmd = "%s %s %s" % (syncevo, fullConfigName, runSources[self.source])
- (status,interrupt) = runSync (cmdPrefix+syncCmd)
+ cmdPrefix += "SYNCEVOLUTION_NO_SYNC_SIGNALS=1"
+ syncCmd = " ".join((cmdPrefix, syncevoCmd, "--daemon=no", configName, self.source))
+ (status,interrupt) = runSync(syncCmd)
if (options.advanced and status and not interrupt):
- (status,interrupt)= self.advancedTestWithCurrentConfiguration(runSources)
+ (status,interrupt)= self.advancedTestWithCurrentConfiguration()
return (status, interrupt)
'''Basic test for sending/receiving data
@@ -439,42 +472,39 @@ class TestingConfiguration():
implements the semantics correctly as specified in the spec. Otherwise the results will
be undefined.
'''
- def advancedTestWithCurrentConfiguration (self, runSources):
+ def advancedTestWithCurrentConfiguration (self):
"""
Sending/receving real data for basic sanity test
"""
- fullConfigName = configName +'@' + configContext
sources = []
- if (isCombinedSource (self.source)):
- sources = getSubSources (self.source)
- else:
- sources.append(self.source)
+ sources.append(self.source)
#step 1: clean the data both locally and remotely using a 'slow-sync' and 'two-way'
clearLocalSyncData(sources)
- cmdPrefix="XDG_CACHE_HOME=%s " % (testResult)
+ cmdPrefix="XDG_CACHE_HOME=%s XDG_CONFIG_HOME=%s " % (testResult, testConfig)
if (not self.ctcap):
cmdPrefix += "SYNCEVOLUTION_NOCTCAP=t "
- syncCmd = "%s %s --sync slow %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+ syncevoTest = "%s %s --daemon=no" % (cmdPrefix, syncevoCmd)
+ syncCmd = "%s --sync slow %s %s" % (syncevoTest, configName, self.source)
status,interrupt = runSync(syncCmd)
if (not status or interrupt):
return (status, interrupt)
clearLocalSyncData(sources)
- syncCmd = "%s %s --sync two-way %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+ syncCmd = "%s --sync two-way %s %s" % (syncevoTest, configName, self.source)
status,interrupt = runSync(syncCmd)
if (not status or interrupt):
return (status, interrupt)
#step 2: insert testcase to local data and sync with 'two-way'
insertLocalSyncData(sources, self.type)
- syncCmd = "%s %s --sync two-way %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+ syncCmd = "%s --sync two-way %s %s" % (syncevoTest, configName, self.source)
status,interrupt = runSync(syncCmd)
if (not status or interrupt):
return (status, interrupt)
#step 3: delete local data and sync with 'slow-sync'
clearLocalSyncData(sources)
- syncCmd = "%s %s --sync slow %s %s" % (cmdPrefix, syncevo, fullConfigName, runSources[self.source])
+ syncCmd = "%s --sync slow %s %s" % (syncevoTest, configName, self.source)
status,interrupt = runSync(syncCmd)
if (not status or interrupt):
return (status, interrupt)
@@ -528,17 +558,15 @@ class TestingConfiguration():
if (status and not interrupt):
self.wConfigs[self.source] = ConfigurationParameter (self.version, self.source, self.uri, self.type, self.ctcap, self.identifier)
print "Found a working configuration for %s" % (self.source,)
- if (options.verbose):
+ if (options.verbose > 0):
self.wConfigs[self.source].printMe()
if (interrupt):
break;
if(interrupt):
print "Test Interrupted"
- self.cleanup()
return 1
print "Test Ended"
- self.cleanup()
#Test finished, print summary and generating configurations
print "****************SUMMARY****************"
@@ -550,40 +578,31 @@ class TestingConfiguration():
print "Configuration parameter for %s:" % (source,)
config.printMe()
- #We did not tested with calendar+task but we have found configuration
- #for calendar or task
- if (options.combined == False):
- s = getSubSources(self.source)
- try:
- if (self.wConfigs[s[0]] or self.wConfigs[s[1]]):
- print ""
- print "Note some phones have combined calendar and task"
- print "you might run the tool with --combined-calendar-task"
- print "to detect this behavior"
- #restrict to only two subsources
- if (self.wConfigs[s[0]] and self.wConfigs[s[0]].equalWith (self.wConfigs[s[1]])):
- print "This phone likely works with a combined calendar and task"
- print "because they have identical configurations"
- except:
- pass
-
if (not found):
print "No working configuration found"
else:
+ have_combined = \
+ self.wConfigs.has_key('calendar') and \
+ self.wConfigs.has_key('todo') and \
+ self.wConfigs['calendar'] and \
+ self.wConfigs['todo'] and \
+ self.wConfigs['calendar'].uri == self.wConfigs['todo'].uri
+
if (options.create):
#first remove the previous configuration if there is a configuration with the same name
create = options.create
- cmd = "%s --remove '%s'" %(syncevo, create)
+ cmd = "%s --remove '%s'" %(syncevoCmd, create)
try:
runCommand (cmd)
except:
pass
- #create the configuration based on the template
- cmd = "%s -c -l %s %s" %(syncevo, templateName, create)
+ cmd = "%s -c --template 'SyncEvolution Client' --sync-property peerIsClient=1 %s" %(syncevoCmd, create)
runCommand (cmd)
#disable all sources by default
- for source in self.allSources:
- cmd = "%s -c --source-property sync='disabled' %s %s" %(syncevo, create, self.getLocalSourceName(source))
+ for source in allSources:
+ if source == 'calendar+todo':
+ continue
+ cmd = "%s -c --source-property sync='disabled' %s %s" %(syncevoCmd, create, source)
runCommand(cmd)
syncCreated = False
@@ -591,88 +610,80 @@ class TestingConfiguration():
if (config):
if (not syncCreated):
#set the sync parameter
- cmd = "%s --configure --sync-property syncURL='obex-bt://%s' --sync-property remoteIdentifier='%s' --sync-property SyncMLVersion='%s' '%s'" %(syncevo, self.btaddr, config.identifier, config.version, create)
+ cmd = "%s --configure --sync-property syncURL='obex-bt://%s' --sync-property remoteIdentifier='%s' --sync-property SyncMLVersion='%s' '%s'" %(syncevoCmd, self.btaddr, config.identifier, config.version, create)
syncCreated = True
runCommand (cmd)
#set each source parameter
- ltype = config.type.split(':')[0]
- if(isCombinedSource (config.source)):
- ltype = 'virtual:'+ltype
- cmd = "%s --configure --source-property sync='two-way' --source-property URI='%s' --source-property type='%s' '%s' '%s'" %(syncevo, config.uri, ltype, create, self.getLocalSourceName(config.source))
+ ltype = strip_version(config.type)
+ cmd = "%s --configure --source-property sync='two-way' --source-property URI='%s' --source-property type='%s:%s' '%s' '%s'" %(syncevoCmd, config.uri, source, ltype, create, config.source)
runCommand(cmd)
-
- if (options.template):
- template = options.template
- configini = "peerIsClient = 1\n"
- sourceConfiginis={}
- syncCreated = False
- for source,config in self.wConfigs.items():
- if(config):
- if (not syncCreated):
- if (config.identifier):
- configini += "remoteIdentifier = '%s'\n" %(config.identifier)
- if (config.version != '1.2'):
- configini += "SyncMLVersion = '%s'\n" %(config.version)
- syncCreated = True
- sourceini = "sync = two-way\n"
- if (isCombinedSource (source)):
- sourceini += "evolutionsource = calendar,todo\n"
- sourceini += "uri = %s\n" %(config.uri)
- sourceini += "type = virtual:%s\n" %(config.type.split(':')[0])
- sourceConfiginis[self.getLocalSourceName(source)]=sourceini
- #disable the sub datasoruce
- for s in getSubSources(source):
- sourceini = "sync = none\n"
- sourceConfiginis[self.getLocalSourceName(s)]=sourceini
- else:
- sourceini += "uri = %s\n" %(config.uri)
- sourceConfiginis[self.getLocalSourceName(source)]=sourceini
- defualtTypes = ["text/x-vcard:2.1", "text/calendar:2.0", "text/plain:1.0"]
- if (config.type not in defualtTypes):
- sourceini += "type = %s\n" %(config.type)
-
- fingerprint=''
- description=''
- templateini = "fingerprint = %s\ndescription = %s\n" %(fingerprint,description)
- #write to directory
- cmd = "rm -rf %s; mkdir %s; mkdir %s/sources" %(template,template,template)
- runCommand(cmd)
- cmd = "echo '%s' >%s/config.ini; echo ''" %(configini, template)
- runCommand(cmd)
- cmd = "echo '%s' >%s/template.ini; echo ''" %(templateini, template)
- runCommand(cmd)
- for s,ini in sourceConfiginis.items():
- cmd = "mkdir %s/sources/%s; echo''" %(template, s)
- runCommand(cmd)
- cmd = "echo '%s' >%s/sources/%s/config.ini; echo ''" %(ini,template,s)
+ if have_combined:
+ ltype = strip_version(self.wConfigs['calendar'].type)
+ uri = self.wConfigs['calendar'].uri
+ cmd = "%s --configure --source-property evolutionsource='calendar,todo' --source-property sync='two-way' --source-property URI='%s' --source-property type='virtual:%s' '%s' calendar+todo" %(syncevoCmd, uri, ltype, create)
runCommand(cmd)
+ for source in ('calendar', 'todo'):
+ cmd = "%s --configure --source-property sync='none' --source-property URI='%s' '%s' %s" %(syncevoCmd, uri, create, source)
+ runCommand(cmd)
+
if (options.advanced):
print ""
print "We have conducted basic test by sending and receiving"
- print "data for the phone"
+ print "data to the phone. You can help the SyncEvolution project"
+ print "and other users by submitting the following configuration"
+ print "template at http://syncevolution.org/wiki/phone-compatibility-template"
+ print ""
+
+ configini = { "peerIsClient": "1" }
+ sourceConfigInis = {}
+
+ for source,config in self.wConfigs.items():
+ if(config):
+ sourceini = {}
+ if (config.identifier):
+ configini["remoteIdentifier"] = config.identifier
+ if (config.version != '1.2'):
+ configini["SyncMLVersion"] = config.version
+ sourceini["sync"] = "two-way"
+ sourceini["uri"] = config.uri
+ sourceini["type"] = "%s:%s" % (source, strip_version(config.type))
+ sourceConfigInis[source] = sourceini
+
+ # create 'calendar+todo' entry, disable separate 'calendar' and 'todo'?
+ if have_combined:
+ sourceini = {}
+ sourceini["evolutionsource"] = "calendar,todo"
+ sourceini["uri"] = self.wConfigs['calendar'].uri
+ sourceini["type"] = "virtual:%s" % strip_version(self.wConfigs['calendar'].type)
+ sourceConfigInis['calendar+todo'] = sourceini
+ # disable the sub datasources
+ for source in ('calendar', 'todo'):
+ sourceConfigInis[source]["sync"] = "none"
+ sourceConfigInis[source].pop("uri")
+
+ # print template to stdout
+ sep = "--------------------> snip <--------------------"
+ print sep
+ print "=== template.ini ==="
+ print "fingerprint = <Model> <Manufacturer>"
+ print "=== config.ini ==="
+ print hash2ini(configini)
+ for source, configini in sourceConfigInis.items():
+ print "=== sources/%s/config.ini ===" % source
+ print hash2ini(configini)
+ print sep
else:
print ""
print "We just conducted minimum test by syncing with the phone"
- print "without checking received data. You can use --advanced"
- print "to conduct basic sending/receiving test against your phone"
+ print "without checking received data. For more reliable result,"
+ print "use the --advanced option, but beware that it will overwrite"
+ print "contacts, events, tasks and memos on the phone."
if (options.create):
- print "Created configuration %s" %(options.create)
- print "You may start syncing with syncevolution %s" %(options.create)
-
- if (options.template):
- print "Created configuration template %s" %(options.template)
- print "It is located as folder %s in current directory" %(options.template)
-
- def cleanup (self):
- #remove configurations
- fullConfigName = configName +'@' + configContext
- cleanCmd = '%s --remove "%s"' %(syncevo, fullConfigName,)
- try:
- runCommand (cleanCmd)
- except:
- pass
+ print ""
+ print "Created configuration: %s" %(options.create)
+ print "You may start syncing with: syncevolution %s" %(options.create)
def main():
versions = []
@@ -698,6 +709,15 @@ def main():
config = TestingConfiguration (versions, sources, uris, types, ctcaps,
identifiers, options.btaddr)
+
+ tmpdir = tempfile.mkdtemp(prefix="syncevo-phone-config")
+ global testFolder
+ global testResult
+ global testConfig
+ testFolder = tmpdir+'/data'
+ testResult = tmpdir+'/cache'
+ testConfig = tmpdir+'/config'
+ print "Running test with test data inside %s and test results inside %s" %(testFolder, testResult)
config.run()
if __name__ == "__main__":
diff --git a/test/test-dbus.py b/test/test-dbus.py
index e39ef362..ea96d757 100755
--- a/test/test-dbus.py
+++ b/test/test-dbus.py
@@ -926,22 +926,24 @@ class TestDBusSession(unittest.TestCase, DBusUtil):
def callback():
callback_called[1] = "callback()"
self.session.Detach()
- t1 = self.addTimeout(2, callback)
- # session 1 done
- loop.run()
- self.failUnless(callback_called)
- # session 2 ready and idle
- loop.run()
- loop.run()
- expected = ["session " + self.sessionpath + " done",
- "session " + sessionpath + " idle",
- "session " + sessionpath + " ready"]
- expected.sort()
- DBusUtil.quit_events.sort()
- self.failUnlessEqual(DBusUtil.quit_events, expected)
- status, error, sources = session.GetStatus(utf8_strings=True)
- self.failUnlessEqual(status, "idle")
- self.removeTimeout(t1)
+ try:
+ t1 = self.addTimeout(2, callback)
+ # session 1 done
+ loop.run()
+ self.failUnless(callback_called)
+ # session 2 ready and idle
+ loop.run()
+ loop.run()
+ expected = ["session " + self.sessionpath + " done",
+ "session " + sessionpath + " idle",
+ "session " + sessionpath + " ready"]
+ expected.sort()
+ DBusUtil.quit_events.sort()
+ self.failUnlessEqual(DBusUtil.quit_events, expected)
+ status, error, sources = session.GetStatus(utf8_strings=True)
+ self.failUnlessEqual(status, "idle")
+ finally:
+ self.removeTimeout(t1)
class TestSessionAPIsEmptyName(unittest.TestCase, DBusUtil):
"""Test session APIs that work with an empty server name. Thus, all of session APIs which
@@ -1808,6 +1810,20 @@ class TestConnection(unittest.TestCase, DBusUtil):
loop.run()
self.failUnlessEqual(DBusUtil.quit_events, ["connection " + conpath + " aborted",
"session done"])
+ # start another session for the server (ensures that the previous one is done),
+ # then check the server side report
+ DBusUtil.quit_events = []
+ self.setUpSession("dummy-test")
+ sessions = self.session.GetReports(0, 100)
+ self.failUnlessEqual(len(sessions), 1)
+ # transport failure, only addressbook active and later aborted
+ self.failUnlessEqual(sessions[0]["status"], "20043")
+ self.failUnlessEqual(sessions[0]["error"], "D-Bus peer has disconnected")
+ self.failUnlessEqual(sessions[0]["source-addressbook-status"], "20017")
+ self.failUnlessEqual(sessions[0]["source-calendar-status"], "0")
+ self.failUnlessEqual(sessions[0]["source-todo-status"], "0")
+ self.failUnlessEqual(sessions[0]["source-memo-status"], "0")
+
def testCredentialsWrong(self):
"""send invalid credentials"""
diff --git a/test/testcases/ical20.ics.local b/test/testcases/ical20.ics.local
new file mode 100644
index 00000000..672b37d7
--- /dev/null
+++ b/test/testcases/ical20.ics.local
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:Schedule World
+BEGIN:VTIMEZONE
+X-LIC-LOCATION:Europe/Berlin
+TZID:/foobar/Tzfile/Europe/Berlin
+BEGIN:STANDARD
+DTSTART:19701025T020000
+TZNAME:CET
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19700328T030000
+TZNAME:CEST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+CLASS:PUBLIC
+DESCRIPTION:foobar
+CREATED:20100503T101836Z
+DTSTAMP:20100503T150027Z
+DTSTART;TZID=/foobar/Tzfile/Europe/Berlin:20100511T143000
+DTEND;TZID=/foobar/Tzfile/Europe/Berlin:20100511T160000
+LAST-MODIFIED:20100503T150026Z
+SEQUENCE:2
+SUMMARY:foobar
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VTIMEZONE
+TZID:GMT Standard Time
+BEGIN:STANDARD
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T010000
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+SUMMARY:test event
+DTSTART;TZID=GMT Standard Time:20100421T150000
+DTEND;TZID=GMT Standard Time:20100421T160000
+UID:040000008200E00074C5B7101A82E0080000000000B5A586D0A4CA01000000000000000010
+CLASS:PUBLIC
+PRIORITY:5
+DTSTAMP:20100415T035521Z
+TRANSP:OPAQUE
+STATUS:CONFIRMED
+SEQUENCE:4
+END:VEVENT
+END:VCALENDAR
diff --git a/test/testcases/itodo20.ics.funambol.tem.patch b/test/testcases/itodo20.ics.funambol.tem.patch
index 1bd85893..3be3084c 100644
--- a/test/testcases/itodo20.ics.funambol.tem.patch
+++ b/test/testcases/itodo20.ics.funambol.tem.patch
@@ -1,4 +1,4 @@
-@@ -32,8 +32,8 @@
+@@ -32,10 +32,9 @@
DUE;TZID=/softwarestudio.org/Tzfile/America/New_York:20090502T130000
DTSTART;TZID=/softwarestudio.org/Tzfile/America/New_York:20090501T100000
CLASS:PUBLIC
@@ -7,5 +7,7 @@
+PERCENT-COMPLETE:78
+STATUS:IN-PROGRESS
CATEGORIES:Business,Waiting
- COMPLETED:20090401T030000Z
+-COMPLETED:20090401T030000Z
URL:http://foo.com
+ SEQUENCE:1
+ END:VTODO