Import kcontacts_5.103.0.orig.tar.xz
authorAurélien COUDERC <coucouf@debian.org>
Sun, 12 Feb 2023 20:44:26 +0000 (20:44 +0000)
committerAurélien COUDERC <coucouf@debian.org>
Sun, 12 Feb 2023 20:44:26 +0000 (20:44 +0000)
[dgit import orig kcontacts_5.103.0.orig.tar.xz]

320 files changed:
.git-blame-ignore-revs [new file with mode: 0644]
.gitignore [new file with mode: 0644]
.gitlab-ci.yml [new file with mode: 0644]
.kde-ci.yml [new file with mode: 0644]
.krazy [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
KF5ContactsConfig.cmake.in [new file with mode: 0644]
LICENSES/BSD-3-Clause.txt [new file with mode: 0644]
LICENSES/CC0-1.0.txt [new file with mode: 0644]
LICENSES/LGPL-2.0-or-later.txt [new file with mode: 0644]
LICENSES/MIT.txt [new file with mode: 0644]
LICENSES/Unicode-DFS-2016.txt [new file with mode: 0644]
README.md [new file with mode: 0644]
autotests/CMakeLists.txt [new file with mode: 0644]
autotests/addresseetest.cpp [new file with mode: 0644]
autotests/addresseetest.h [new file with mode: 0644]
autotests/addressformattest.cpp [new file with mode: 0644]
autotests/addresstest.cpp [new file with mode: 0644]
autotests/addresstest.h [new file with mode: 0644]
autotests/birthdaytest.cpp [new file with mode: 0644]
autotests/birthdaytest.h [new file with mode: 0644]
autotests/calendarurltest.cpp [new file with mode: 0644]
autotests/calendarurltest.h [new file with mode: 0644]
autotests/clientpidmaptest.cpp [new file with mode: 0644]
autotests/clientpidmaptest.h [new file with mode: 0644]
autotests/contactgrouptest.cpp [new file with mode: 0644]
autotests/customidentifiertest.cpp [new file with mode: 0644]
autotests/customidentifiertest.h [new file with mode: 0644]
autotests/data/testfullvcard.vcf [new file with mode: 0644]
autotests/data/testfullvcard.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard1.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard2.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard3.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard4.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard5.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard6.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard7.vcf.ref [new file with mode: 0644]
autotests/data/v4_0.vcard8.vcf.ref [new file with mode: 0644]
autotests/data/vcard1.vcf [new file with mode: 0644]
autotests/data/vcard1.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard1.vcf.ref [new file with mode: 0644]
autotests/data/vcard10.vcf [new file with mode: 0644]
autotests/data/vcard10.vcf.ref [new file with mode: 0644]
autotests/data/vcard11.vcf [new file with mode: 0644]
autotests/data/vcard11.vcf.ref [new file with mode: 0644]
autotests/data/vcard12.vcf [new file with mode: 0644]
autotests/data/vcard12.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard12.vcf.ref [new file with mode: 0644]
autotests/data/vcard13.vcf [new file with mode: 0644]
autotests/data/vcard13.vcf.ref [new file with mode: 0644]
autotests/data/vcard14.vcf [new file with mode: 0644]
autotests/data/vcard14.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard14.vcf.ref [new file with mode: 0644]
autotests/data/vcard15.vcf [new file with mode: 0644]
autotests/data/vcard15.vcf.ref [new file with mode: 0644]
autotests/data/vcard2.vcf [new file with mode: 0644]
autotests/data/vcard2.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard2.vcf.ref [new file with mode: 0644]
autotests/data/vcard3.vcf [new file with mode: 0644]
autotests/data/vcard3.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard3.vcf.ref [new file with mode: 0644]
autotests/data/vcard4.vcf [new file with mode: 0644]
autotests/data/vcard4.vcf.ref [new file with mode: 0644]
autotests/data/vcard5.vcf [new file with mode: 0644]
autotests/data/vcard5.vcf.ref [new file with mode: 0644]
autotests/data/vcard6.vcf [new file with mode: 0644]
autotests/data/vcard6.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard6.vcf.ref [new file with mode: 0644]
autotests/data/vcard7.vcf [new file with mode: 0644]
autotests/data/vcard7.vcf.2_1ref [new file with mode: 0644]
autotests/data/vcard7.vcf.ref [new file with mode: 0644]
autotests/data/vcard8.vcf [new file with mode: 0644]
autotests/data/vcard8.vcf.ref [new file with mode: 0644]
autotests/data/vcard9.vcf [new file with mode: 0644]
autotests/data/vcard9.vcf.ref [new file with mode: 0644]
autotests/data/vcard_extension_case_normalization.vcf [new file with mode: 0644]
autotests/data/vcard_extension_case_normalization.vcf.ref [new file with mode: 0644]
autotests/data/vcard_legacy_messaging_fields.vcf [new file with mode: 0644]
autotests/data/vcard_legacy_messaging_fields.vcf.ref [new file with mode: 0644]
autotests/data/vcardwithitemasapplesupport.vcf [new file with mode: 0644]
autotests/data/vcardwithitemasapplesupport.vcf.ref [new file with mode: 0644]
autotests/datetimetest.cpp [new file with mode: 0644]
autotests/datetimetest.h [new file with mode: 0644]
autotests/emailtest.cpp [new file with mode: 0644]
autotests/emailtest.h [new file with mode: 0644]
autotests/fieldgrouptest.cpp [new file with mode: 0644]
autotests/fieldgrouptest.h [new file with mode: 0644]
autotests/gendertest.cpp [new file with mode: 0644]
autotests/gendertest.h [new file with mode: 0644]
autotests/geotest.cpp [new file with mode: 0644]
autotests/geotest.h [new file with mode: 0644]
autotests/importexportvcardtest.cpp [new file with mode: 0644]
autotests/importexportvcardtest.h [new file with mode: 0644]
autotests/impptest.cpp [new file with mode: 0644]
autotests/impptest.h [new file with mode: 0644]
autotests/keytest.cpp [new file with mode: 0644]
autotests/keytest.h [new file with mode: 0644]
autotests/langtest.cpp [new file with mode: 0644]
autotests/langtest.h [new file with mode: 0644]
autotests/ldifconvertertest.cpp [new file with mode: 0644]
autotests/ldifconvertertest.h [new file with mode: 0644]
autotests/nicknametest.cpp [new file with mode: 0644]
autotests/nicknametest.h [new file with mode: 0644]
autotests/orgtest.cpp [new file with mode: 0644]
autotests/orgtest.h [new file with mode: 0644]
autotests/phonenumbertest.cpp [new file with mode: 0644]
autotests/phonenumbertest.h [new file with mode: 0644]
autotests/picturetest.cpp [new file with mode: 0644]
autotests/picturetest.h [new file with mode: 0644]
autotests/relatedtest.cpp [new file with mode: 0644]
autotests/relatedtest.h [new file with mode: 0644]
autotests/resourcelocatorurltest.cpp [new file with mode: 0644]
autotests/resourcelocatorurltest.h [new file with mode: 0644]
autotests/roletest.cpp [new file with mode: 0644]
autotests/roletest.h [new file with mode: 0644]
autotests/secrecytest.cpp [new file with mode: 0644]
autotests/secrecytest.h [new file with mode: 0644]
autotests/soundtest.cpp [new file with mode: 0644]
autotests/soundtest.h [new file with mode: 0644]
autotests/testlock.h [new file with mode: 0644]
autotests/testroundtrip.cpp [new file with mode: 0644]
autotests/testroundtrip.qrc [new file with mode: 0644]
autotests/timezonetest.cpp [new file with mode: 0644]
autotests/timezonetest.h [new file with mode: 0644]
autotests/titletest.cpp [new file with mode: 0644]
autotests/titletest.h [new file with mode: 0644]
autotests/vcarddragtest.cpp [new file with mode: 0644]
autotests/vcardlinetest.cpp [new file with mode: 0644]
autotests/vcardlinetest.h [new file with mode: 0644]
autotests/vcardtool_benchmark.cpp [new file with mode: 0644]
autotests/vcardtool_benchmark.h [new file with mode: 0644]
docs/AddressFormat.md [new file with mode: 0644]
docs/Doxyfile.local [new file with mode: 0644]
metainfo.yaml [new file with mode: 0644]
po/ar/kcontacts5.po [new file with mode: 0644]
po/az/kcontacts5.po [new file with mode: 0644]
po/be/kcontacts5.po [new file with mode: 0644]
po/bg/kcontacts5.po [new file with mode: 0644]
po/bs/kcontacts5.po [new file with mode: 0644]
po/ca/kcontacts5.po [new file with mode: 0644]
po/ca@valencia/kcontacts5.po [new file with mode: 0644]
po/cs/kcontacts5.po [new file with mode: 0644]
po/da/kcontacts5.po [new file with mode: 0644]
po/de/kcontacts5.po [new file with mode: 0644]
po/el/kcontacts5.po [new file with mode: 0644]
po/en_GB/kcontacts5.po [new file with mode: 0644]
po/eo/kcontacts5.po [new file with mode: 0644]
po/es/kcontacts5.po [new file with mode: 0644]
po/et/kcontacts5.po [new file with mode: 0644]
po/eu/kcontacts5.po [new file with mode: 0644]
po/fi/kcontacts5.po [new file with mode: 0644]
po/fr/kcontacts5.po [new file with mode: 0644]
po/ga/kcontacts5.po [new file with mode: 0644]
po/gl/kcontacts5.po [new file with mode: 0644]
po/hi/kcontacts5.po [new file with mode: 0644]
po/hne/kcontacts5.po [new file with mode: 0644]
po/hu/kcontacts5.po [new file with mode: 0644]
po/ia/kcontacts5.po [new file with mode: 0644]
po/id/kcontacts5.po [new file with mode: 0644]
po/it/kcontacts5.po [new file with mode: 0644]
po/ja/kcontacts5.po [new file with mode: 0644]
po/ka/kcontacts5.po [new file with mode: 0644]
po/kk/kcontacts5.po [new file with mode: 0644]
po/km/kcontacts5.po [new file with mode: 0644]
po/ko/kcontacts5.po [new file with mode: 0644]
po/lt/kcontacts5.po [new file with mode: 0644]
po/lv/kcontacts5.po [new file with mode: 0644]
po/mai/kcontacts5.po [new file with mode: 0644]
po/ml/kcontacts5.po [new file with mode: 0644]
po/mr/kcontacts5.po [new file with mode: 0644]
po/nb/kcontacts5.po [new file with mode: 0644]
po/nds/kcontacts5.po [new file with mode: 0644]
po/nl/kcontacts5.po [new file with mode: 0644]
po/nn/kcontacts5.po [new file with mode: 0644]
po/pa/kcontacts5.po [new file with mode: 0644]
po/pl/kcontacts5.po [new file with mode: 0644]
po/pt/kcontacts5.po [new file with mode: 0644]
po/pt_BR/kcontacts5.po [new file with mode: 0644]
po/ro/kcontacts5.po [new file with mode: 0644]
po/ru/kcontacts5.po [new file with mode: 0644]
po/se/kcontacts5.po [new file with mode: 0644]
po/sk/kcontacts5.po [new file with mode: 0644]
po/sl/kcontacts5.po [new file with mode: 0644]
po/sq/kcontacts5.po [new file with mode: 0644]
po/sr/kcontacts5.po [new file with mode: 0644]
po/sr@ijekavian/kcontacts5.po [new file with mode: 0644]
po/sr@ijekavianlatin/kcontacts5.po [new file with mode: 0644]
po/sr@latin/kcontacts5.po [new file with mode: 0644]
po/sv/kcontacts5.po [new file with mode: 0644]
po/tg/kcontacts5.po [new file with mode: 0644]
po/th/kcontacts5.po [new file with mode: 0644]
po/tr/kcontacts5.po [new file with mode: 0644]
po/ug/kcontacts5.po [new file with mode: 0644]
po/uk/kcontacts5.po [new file with mode: 0644]
po/zh_CN/kcontacts5.po [new file with mode: 0644]
po/zh_TW/kcontacts5.po [new file with mode: 0644]
src/CMakeLists.txt [new file with mode: 0644]
src/Messages.sh [new file with mode: 0644]
src/address.cpp [new file with mode: 0644]
src/address.h [new file with mode: 0644]
src/addressee.cpp [new file with mode: 0644]
src/addressee.h [new file with mode: 0644]
src/addresseehelper.cpp [new file with mode: 0644]
src/addresseehelper.h [new file with mode: 0644]
src/addresseelist.h [new file with mode: 0644]
src/addressformat.cpp [new file with mode: 0644]
src/addressformat.h [new file with mode: 0644]
src/addressformat_p.h [new file with mode: 0644]
src/addressformatparser.cpp [new file with mode: 0644]
src/addressformatparser_p.h [new file with mode: 0644]
src/addressformatrc [new file with mode: 0644]
src/addressformatscript.cpp [new file with mode: 0644]
src/addressformatscript_p.h [new file with mode: 0644]
src/addressformatter.cpp [new file with mode: 0644]
src/addressformatter_p.h [new file with mode: 0644]
src/calendarurl.cpp [new file with mode: 0644]
src/calendarurl.h [new file with mode: 0644]
src/clientpidmap.cpp [new file with mode: 0644]
src/clientpidmap.h [new file with mode: 0644]
src/contactgroup.cpp [new file with mode: 0644]
src/contactgroup.h [new file with mode: 0644]
src/contactgroup.xsd [new file with mode: 0644]
src/contactgrouptool.cpp [new file with mode: 0644]
src/contactgrouptool.h [new file with mode: 0644]
src/converter/CMakeLists.txt [new file with mode: 0644]
src/converter/ldifconverter.cpp [new file with mode: 0644]
src/converter/ldifconverter.h [new file with mode: 0644]
src/converter/vcardconverter.cpp [new file with mode: 0644]
src/converter/vcardconverter.h [new file with mode: 0644]
src/email.cpp [new file with mode: 0644]
src/email.h [new file with mode: 0644]
src/field.cpp [new file with mode: 0644]
src/field.h [new file with mode: 0644]
src/fieldgroup.cpp [new file with mode: 0644]
src/fieldgroup.h [new file with mode: 0644]
src/gender.cpp [new file with mode: 0644]
src/gender.h [new file with mode: 0644]
src/geo.cpp [new file with mode: 0644]
src/geo.h [new file with mode: 0644]
src/impp.cpp [new file with mode: 0644]
src/impp.h [new file with mode: 0644]
src/improtocols/NOTE [new file with mode: 0644]
src/improtocols/aim.desktop [new file with mode: 0644]
src/improtocols/facebook.desktop [new file with mode: 0644]
src/improtocols/gg.desktop [new file with mode: 0644]
src/improtocols/googletalk.desktop [new file with mode: 0644]
src/improtocols/groupwise.desktop [new file with mode: 0644]
src/improtocols/icq.desktop [new file with mode: 0644]
src/improtocols/improtocols.qrc [new file with mode: 0644]
src/improtocols/irc.desktop [new file with mode: 0644]
src/improtocols/matrix.desktop [new file with mode: 0644]
src/improtocols/meanwhile.desktop [new file with mode: 0644]
src/improtocols/msn.desktop [new file with mode: 0644]
src/improtocols/qq.desktop [new file with mode: 0644]
src/improtocols/rocketchat.desktop [new file with mode: 0644]
src/improtocols/signal.desktop [new file with mode: 0644]
src/improtocols/sip.desktop [new file with mode: 0644]
src/improtocols/skype.desktop [new file with mode: 0644]
src/improtocols/sms.desktop [new file with mode: 0644]
src/improtocols/telegram.desktop [new file with mode: 0644]
src/improtocols/threema.desktop [new file with mode: 0644]
src/improtocols/twitter.desktop [new file with mode: 0644]
src/improtocols/xmpp.desktop [new file with mode: 0644]
src/improtocols/ymsgr.desktop [new file with mode: 0644]
src/kcontacts.qrc [new file with mode: 0644]
src/key.cpp [new file with mode: 0644]
src/key.h [new file with mode: 0644]
src/lang.cpp [new file with mode: 0644]
src/lang.h [new file with mode: 0644]
src/ldif.cpp [new file with mode: 0644]
src/ldif_p.h [new file with mode: 0644]
src/namespace.cpp [new file with mode: 0644]
src/namespace.h [new file with mode: 0644]
src/nickname.cpp [new file with mode: 0644]
src/nickname.h [new file with mode: 0644]
src/note.cpp [new file with mode: 0644]
src/note.h [new file with mode: 0644]
src/org.cpp [new file with mode: 0644]
src/org.h [new file with mode: 0644]
src/parametermap_p.h [new file with mode: 0644]
src/phonenumber.cpp [new file with mode: 0644]
src/phonenumber.h [new file with mode: 0644]
src/picture.cpp [new file with mode: 0644]
src/picture.h [new file with mode: 0644]
src/related.cpp [new file with mode: 0644]
src/related.h [new file with mode: 0644]
src/resourcelocatorurl.cpp [new file with mode: 0644]
src/resourcelocatorurl.h [new file with mode: 0644]
src/role.cpp [new file with mode: 0644]
src/role.h [new file with mode: 0644]
src/secrecy.cpp [new file with mode: 0644]
src/secrecy.h [new file with mode: 0644]
src/sound.cpp [new file with mode: 0644]
src/sound.h [new file with mode: 0644]
src/timezone.cpp [new file with mode: 0644]
src/timezone.h [new file with mode: 0644]
src/title.cpp [new file with mode: 0644]
src/title.h [new file with mode: 0644]
src/vcarddrag.cpp [new file with mode: 0644]
src/vcarddrag.h [new file with mode: 0644]
src/vcardparser/vcard.cpp [new file with mode: 0644]
src/vcardparser/vcard_p.h [new file with mode: 0644]
src/vcardparser/vcardline.cpp [new file with mode: 0644]
src/vcardparser/vcardline_p.h [new file with mode: 0644]
src/vcardparser/vcardparser.cpp [new file with mode: 0644]
src/vcardparser/vcardparser_p.h [new file with mode: 0644]
src/vcardtool.cpp [new file with mode: 0644]
src/vcardtool_p.h [new file with mode: 0644]
tests/CMakeLists.txt [new file with mode: 0644]
tests/README.testing [new file with mode: 0644]
tests/checkvcard.pl [new file with mode: 0755]
tests/qmlintegrationtest.cpp [new file with mode: 0644]
tests/qmlintegrationtest.qml [new file with mode: 0644]
tests/qmlintegrationtest.qrc [new file with mode: 0644]
tests/testread.cpp [new file with mode: 0644]
tests/testread2.cpp [new file with mode: 0644]
tests/testutils.cpp [new file with mode: 0644]
tests/testutils.h [new file with mode: 0644]
tests/testwrite.cpp [new file with mode: 0644]
tools/convert-libaddressinput-data.py [new file with mode: 0755]

diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644 (file)
index 0000000..db7b2af
--- /dev/null
@@ -0,0 +1,5 @@
+#clang-format
+9d9459b41478808a17df1f9d1dd1d8075c32ed74
+
+#clang-tidy
+05b61828068dbc7c0d0e7a9e6d640bea7a9c6eca
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..d84c817
--- /dev/null
@@ -0,0 +1,28 @@
+# Ignore the following files
+*~
+*.[oa]
+*.diff
+*.kate-swp
+*.kdev4
+.kdev_include_paths
+*.kdevelop.pcs
+*.moc
+*.moc.cpp
+*.orig
+*.user
+.*.swp
+.swp.*
+Doxyfile
+Makefile
+avail
+random_seed
+/build*/
+CMakeLists.txt.user*
+*.unc-backup*
+.cmake/
+/.clang-format
+/compile_commands.json
+.clangd
+.idea
+/cmake-build*
+.cache
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..1d58b44
--- /dev/null
@@ -0,0 +1,12 @@
+# SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
+# SPDX-License-Identifier: CC0-1.0
+
+include:
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android-qt6.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd-qt6.yml
+  - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows-qt6.yml
diff --git a/.kde-ci.yml b/.kde-ci.yml
new file mode 100644 (file)
index 0000000..38f1df9
--- /dev/null
@@ -0,0 +1,12 @@
+Dependencies:
+- 'on': ['@all']
+  'require':
+    'frameworks/extra-cmake-modules': '@same'
+    'frameworks/kcoreaddons' : '@same'
+    'frameworks/ki18n' : '@same'
+    'frameworks/kconfig' : '@same'
+    'frameworks/kcodecs' : '@same'
+
+Options:
+  test-before-installing: True
+  require-passing-tests-on: [ 'Linux', "FreeBSD" ]
diff --git a/.krazy b/.krazy
new file mode 100644 (file)
index 0000000..80b3c47
--- /dev/null
+++ b/.krazy
@@ -0,0 +1 @@
+SKIP /scripts/|/tests/|/testroundtrip
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..69f4a4f
--- /dev/null
@@ -0,0 +1,114 @@
+cmake_minimum_required(VERSION 3.16)
+
+set(KF_VERSION "5.103.0") # handled by release scripts
+set(KF_DEP_VERSION "5.103.0") # handled by release scripts
+
+project(KContacts VERSION ${KF_VERSION})
+
+# ECM setup
+include(FeatureSummary)
+find_package(ECM 5.103.0 NO_MODULE)
+set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules")
+feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)
+
+set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
+set(CMAKE_AUTORCC ON)
+
+set(REQUIRED_QT_VERSION 5.15.2)
+
+include(KDEInstallDirs)
+include(KDECMakeSettings)
+include(KDEGitCommitHooks)
+include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE)
+
+include(ECMGenerateExportHeader)
+include(ECMGenerateHeaders)
+include(ECMGeneratePriFile)
+include(ECMGenerateExportHeader)
+include(ECMDeprecationSettings)
+
+include(ECMSetupVersion)
+include(ECMQtDeclareLoggingCategory)
+include(ECMAddQch)
+
+set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].")
+
+option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF)
+add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)")
+
+set(KCONTACTS_LIB_VERSION ${KF_VERSION})
+
+ecm_setup_version(PROJECT VARIABLE_PREFIX KContacts
+                        VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kcontacts_version.h"
+                        PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfigVersion.cmake"
+                        SOVERSION 5
+)
+
+########### Find packages ###########
+find_package(Qt${QT_MAJOR_VERSION} ${REQUIRED_QT_VERSION} NO_MODULE COMPONENTS Gui Quick)
+set_package_properties(Qt${QT_MAJOR_VERSION}Gui PROPERTIES
+    TYPE REQUIRED
+    PURPOSE "Basic library component"
+)
+set_package_properties(Qt${QT_MAJOR_VERSION}Quick PROPERTIES
+    TYPE OPTIONAL
+    PURPOSE "QtQuick plugin"
+)
+find_package(KF5 ${KF_DEP_VERSION} REQUIRED COMPONENTS CoreAddons I18n Config Codecs)
+if (QT_MAJOR_VERSION STREQUAL "6")
+    find_package(Qt6Core5Compat)
+endif()
+
+########### Targets ###########
+
+add_definitions(-DTRANSLATION_DOMAIN=\"kcontacts5\")
+ki18n_install(po)
+
+ecm_set_disabled_deprecation_versions(
+    QT 5.15.2
+    KF 5.95.0
+)
+
+add_subdirectory(src)
+
+if(BUILD_TESTING)
+    add_subdirectory(autotests)
+    add_subdirectory(tests)
+endif()
+
+########### CMake Config Files ###########
+set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Contacts")
+
+if (BUILD_QCH)
+    ecm_install_qch_export(
+        TARGETS KF5Contacts_QCH
+        FILE KF5ContactsQchTargets.cmake
+        DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+        COMPONENT Devel
+    )
+    set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF5ContactsQchTargets.cmake\")")
+endif()
+
+configure_package_config_file(
+  "${CMAKE_CURRENT_SOURCE_DIR}/KF5ContactsConfig.cmake.in"
+  "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfig.cmake"
+  INSTALL_DESTINATION  ${CMAKECONFIG_INSTALL_DIR}
+)
+
+install(FILES
+  "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfig.cmake"
+  "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfigVersion.cmake"
+  DESTINATION "${CMAKECONFIG_INSTALL_DIR}"
+  COMPONENT Devel
+)
+
+install(EXPORT KF5ContactsTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5ContactsTargets.cmake NAMESPACE KF5::)
+
+install(FILES
+   ${CMAKE_CURRENT_BINARY_DIR}/kcontacts_version.h
+  DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts COMPONENT Devel
+)
+
+feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
+
+kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT)
diff --git a/KF5ContactsConfig.cmake.in b/KF5ContactsConfig.cmake.in
new file mode 100644 (file)
index 0000000..e8796f7
--- /dev/null
@@ -0,0 +1,10 @@
+@PACKAGE_INIT@
+include(CMakeFindDependencyMacro)
+find_dependency(KF5CoreAddons "@KF_DEP_VERSION@")
+find_dependency(KF5Config "@KF_DEP_VERSION@")
+find_dependency(KF5I18n "@KF_DEP_VERSION@")
+find_dependency(KF5Codecs "@KF_DEP_VERSION@")
+
+include("${CMAKE_CURRENT_LIST_DIR}/KF5ContactsTargets.cmake")
+
+@PACKAGE_INCLUDE_QCHTARGETS@
diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt
new file mode 100644 (file)
index 0000000..0741db7
--- /dev/null
@@ -0,0 +1,26 @@
+Copyright (c) <year> <owner>. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+may be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt
new file mode 100644 (file)
index 0000000..0e259d4
--- /dev/null
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+    HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+  i. the right to reproduce, adapt, distribute, perform, display,
+     communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+     likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+     subject to the limitations in paragraph 4(a), below;
+  v. rights protecting the extraction, dissemination, use and reuse of data
+     in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+     European Parliament and of the Council of 11 March 1996 on the legal
+     protection of databases, and under any national implementation
+     thereof, including any amended or successor version of such
+     directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+     world based on applicable law or treaty, and any national
+     implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+    surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+    warranties of any kind concerning the Work, express, implied,
+    statutory or otherwise, including without limitation warranties of
+    title, merchantability, fitness for a particular purpose, non
+    infringement, or the absence of latent or other defects, accuracy, or
+    the present or absence of errors, whether or not discoverable, all to
+    the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+    that may apply to the Work or any use thereof, including without
+    limitation any person's Copyright and Related Rights in the Work.
+    Further, Affirmer disclaims responsibility for obtaining any necessary
+    consents, permissions or other rights required for any use of the
+    Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+    party to this document and has no duty or obligation with respect to
+    this CC0 or use of the Work.
diff --git a/LICENSES/LGPL-2.0-or-later.txt b/LICENSES/LGPL-2.0-or-later.txt
new file mode 100644 (file)
index 0000000..5c96471
--- /dev/null
@@ -0,0 +1,446 @@
+GNU LIBRARY GENERAL PUBLIC LICENSE
+
+Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc.
+
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is numbered 2 because
+it goes with version 2 of the ordinary GPL.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public Licenses are intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users.
+
+This license, the Library General Public License, applies to some specially
+designated Free Software Foundation software, and to any other libraries whose
+authors decide to use it. You can use it for your libraries, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom
+to distribute copies of free software (and charge for this service if you
+wish), that you receive source code or can get it if you want it, that you
+can change the software or use pieces of it in new free programs; and that
+you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of
+the library, or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for
+a fee, you must give the recipients all the rights that we gave you. You must
+make sure that they, too, receive or can get the source code. If you link
+a program with the library, you must provide complete object files to the
+recipients so that they can relink them with the library, after making changes
+to the library and recompiling it. And you must show them these terms so they
+know their rights.
+
+Our method of protecting your rights has two steps: (1) copyright the library,
+and (2) offer you this license which gives you legal permission to copy, distribute
+and/or modify the library.
+
+Also, for each distributor's protection, we want to make certain that everyone
+understands that there is no warranty for this free library. If the library
+is modified by someone else and passed on, we want its recipients to know
+that what they have is not the original version, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that companies distributing free software will individually
+obtain patent licenses, thus in effect transforming the program into proprietary
+software. To prevent this, we have made it clear that any patent must be licensed
+for everyone's free use or not licensed at all.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU
+General Public License, which was designed for utility programs. This license,
+the GNU Library General Public License, applies to certain designated libraries.
+This license is quite different from the ordinary one; be sure to read it
+in full, and don't assume that anything in it is the same as in the ordinary
+license.
+
+The reason we have a separate public license for some libraries is that they
+blur the distinction we usually make between modifying or adding to a program
+and simply using it. Linking a program with a library, without changing the
+library, is in some sense simply using the library, and is analogous to running
+a utility program or application program. However, in a textual and legal
+sense, the linked executable is a combined work, a derivative of the original
+library, and the ordinary General Public License treats it as such.
+
+Because of this blurred distinction, using the ordinary General Public License
+for libraries did not effectively promote software sharing, because most developers
+did not use the libraries. We concluded that weaker conditions might promote
+sharing better.
+
+However, unrestricted linking of non-free programs would deprive the users
+of those programs of all benefit from the free status of the libraries themselves.
+This Library General Public License is intended to permit developers of non-free
+programs to use free libraries, while preserving your freedom as a user of
+such programs to change the free libraries that are incorporated in them.
+(We have not seen how to achieve this as regards changes in header files,
+but we have achieved it as regards changes in the actual functions of the
+Library.) The hope is that this will lead to faster development of free libraries.
+
+The precise terms and conditions for copying, distribution and modification
+follow. Pay close attention to the difference between a "work based on the
+library" and a "work that uses the library". The former contains code derived
+from the library, while the latter only works together with the library.
+
+Note that it is possible for a library to be covered by the ordinary General
+Public License rather than by this special one.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library which contains a
+notice placed by the copyright holder or other authorized party saying it
+may be distributed under the terms of this Library General Public License
+(also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared
+so as to be conveniently linked with application programs (which use some
+of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has
+been distributed under these terms. A "work based on the Library" means either
+the Library or any derivative work under copyright law: that is to say, a
+work containing the Library or a portion of it, either verbatim or with modifications
+and/or translated straightforwardly into another language. (Hereinafter, translation
+is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications
+to it. For a library, complete source code means all the source code for all
+modules it contains, plus any associated interface definition files, plus
+the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running a program
+using the Library is not restricted, and output from such a program is covered
+only if its contents constitute a work based on the Library (independent of
+the use of the Library in a tool for writing it). Whether that is true depends
+on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and disclaimer
+of warranty; keep intact all the notices that refer to this License and to
+the absence of any warranty; and distribute a copy of this License along with
+the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you
+may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it,
+thus forming a work based on the Library, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all
+of these conditions:
+
+      a) The modified work must itself be a software library.
+
+b) You must cause the files modified to carry prominent notices stating that
+you changed the files and the date of any change.
+
+c) You must cause the whole of the work to be licensed at no charge to all
+third parties under the terms of this License.
+
+d) If a facility in the modified Library refers to a function or a table of
+data to be supplied by an application program that uses the facility, other
+than as an argument passed when the facility is invoked, then you must make
+a good faith effort to ensure that, in the event an application does not supply
+such function or table, the facility still operates, and performs whatever
+part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose
+that is entirely well-defined independent of the application. Therefore, Subsection
+2d requires that any application-supplied function or table used by this function
+must be optional: if the application does not supply it, the square root function
+must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Library, and can be reasonably
+considered independent and separate works in themselves, then this License,
+and its terms, do not apply to those sections when you distribute them as
+separate works. But when you distribute the same sections as part of a whole
+which is a work based on the Library, the distribution of the whole must be
+on the terms of this License, whose permissions for other licensees extend
+to the entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise
+the right to control the distribution of derivative or collective works based
+on the Library.
+
+In addition, mere aggregation of another work not based on the Library with
+the Library (or with a work based on the Library) on a volume of a storage
+or distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License
+instead of this License to a given copy of the Library. To do this, you must
+alter all the notices that refer to this License, so that they refer to the
+ordinary GNU General Public License, version 2, instead of to this License.
+(If a newer version than version 2 of the ordinary GNU General Public License
+has appeared, then you can specify that version instead if you wish.) Do not
+make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy,
+so the ordinary GNU General Public License applies to all subsequent copies
+and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library
+into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of
+it, under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you accompany it with the complete corresponding
+machine-readable source code, which must be distributed under the terms of
+Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated
+place, then offering equivalent access to copy the source code from the same
+place satisfies the requirement to distribute the source code, even though
+third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but
+is designed to work with the Library by being compiled or linked with it,
+is called a "work that uses the Library". Such a work, in isolation, is not
+a derivative work of the Library, and therefore falls outside the scope of
+this License.
+
+However, linking a "work that uses the Library" with the Library creates an
+executable that is a derivative of the Library (because it contains portions
+of the Library), rather than a "work that uses the library". The executable
+is therefore covered by this License. Section 6 states terms for distribution
+of such executables.
+
+When a "work that uses the Library" uses material from a header file that
+is part of the Library, the object code for the work may be a derivative work
+of the Library even though the source code is not. Whether this is true is
+especially significant if the work can be linked without the Library, or if
+the work is itself a library. The threshold for this to be true is not precisely
+defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts
+and accessors, and small macros and small inline functions (ten lines or less
+in length), then the use of the object file is unrestricted, regardless of
+whether it is legally a derivative work. (Executables containing this object
+code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute
+the object code for the work under the terms of Section 6. Any executables
+containing that work also fall under Section 6, whether or not they are linked
+directly with the Library itself.
+
+6. As an exception to the Sections above, you may also compile or link a "work
+that uses the Library" with the Library to produce a work containing portions
+of the Library, and distribute that work under terms of your choice, provided
+that the terms permit modification of the work for the customer's own use
+and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library
+is used in it and that the Library and its use are covered by this License.
+You must supply a copy of this License. If the work during execution displays
+copyright notices, you must include the copyright notice for the Library among
+them, as well as a reference directing the user to the copy of this License.
+Also, you must do one of these things:
+
+a) Accompany the work with the complete corresponding machine-readable source
+code for the Library including whatever changes were used in the work (which
+must be distributed under Sections 1 and 2 above); and, if the work is an
+executable linked with the Library, with the complete machine-readable "work
+that uses the Library", as object code and/or source code, so that the user
+can modify the Library and then relink to produce a modified executable containing
+the modified Library. (It is understood that the user who changes the contents
+of definitions files in the Library will not necessarily be able to recompile
+the application to use the modified definitions.)
+
+b) Accompany the work with a written offer, valid for at least three years,
+to give the same user the materials specified in Subsection 6a, above, for
+a charge no more than the cost of performing this distribution.
+
+c) If distribution of the work is made by offering access to copy from a designated
+place, offer equivalent access to copy the above specified materials from
+the same place.
+
+d) Verify that the user has already received a copy of these materials or
+that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must
+include any data and utility programs needed for reproducing the executable
+from it. However, as a special exception, the source code distributed need
+not include anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the operating
+system on which the executable runs, unless that component itself accompanies
+the executable.
+
+It may happen that this requirement contradicts the license restrictions of
+other proprietary libraries that do not normally accompany the operating system.
+Such a contradiction means you cannot use both them and the Library together
+in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side
+in a single library together with other library facilities not covered by
+this License, and distribute such a combined library, provided that the separate
+distribution of the work based on the Library and of the other library facilities
+is otherwise permitted, and provided that you do these two things:
+
+a) Accompany the combined library with a copy of the same work based on the
+Library, uncombined with any other library facilities. This must be distributed
+under the terms of the Sections above.
+
+b) Give prominent notice with the combined library of the fact that part of
+it is a work based on the Library, and explaining where to find the accompanying
+uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library
+except as expressly provided under this License. Any attempt otherwise to
+copy, modify, sublicense, link with, or distribute the Library is void, and
+will automatically terminate your rights under this License. However, parties
+who have received copies, or rights, from you under this License will not
+have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed
+it. However, nothing else grants you permission to modify or distribute the
+Library or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the Library
+(or any work based on the Library), you indicate your acceptance of this License
+to do so, and all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library),
+the recipient automatically receives a license from the original licensor
+to copy, distribute, link with or modify the Library subject to these terms
+and conditions. You may not impose any further restrictions on the recipients'
+exercise of the rights granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement
+or for any other reason (not limited to patent issues), conditions are imposed
+on you (whether by court order, agreement or otherwise) that contradict the
+conditions of this License, they do not excuse you from the conditions of
+this License. If you cannot distribute so as to satisfy simultaneously your
+obligations under this License and any other pertinent obligations, then as
+a consequence you may not distribute the Library at all. For example, if a
+patent license would not permit royalty-free redistribution of the Library
+by all those who receive copies directly or indirectly through you, then the
+only way you could satisfy both it and this License would be to refrain entirely
+from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents
+or other property right claims or to contest validity of any such claims;
+this section has the sole purpose of protecting the integrity of the free
+software distribution system which is implemented by public license practices.
+Many people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose
+that choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Library under this License may add an explicit geographical
+distribution limitation excluding those countries, so that distribution is
+permitted only in or among countries not thus excluded. In such case, this
+License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of
+the Library General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to address
+new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies
+a version number of this License which applies to it and "any later version",
+you have the option of following the terms and conditions either of that version
+or of any later version published by the Free Software Foundation. If the
+Library does not specify a license version number, you may choose any version
+ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs
+whose distribution conditions are incompatible with these, write to the author
+to ask for permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make exceptions
+for this. Our decision will be guided by the two goals of preserving the free
+status of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+   NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY
+"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
+OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
+THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
+OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
+OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
+OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
+HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+
+If you develop a new library, and you want it to be of the greatest possible
+use to the public, we recommend making it free software that everyone can
+redistribute and change. You can do so by permitting redistribution under
+these terms (or, alternatively, under the terms of the ordinary General Public
+License).
+
+To apply these terms, attach the following notices to the library. It is safest
+to attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the "copyright"
+line and a pointer to where the full notice is found.
+
+one line to give the library's name and an idea of what it does.
+
+Copyright (C) year name of author
+
+This library is free software; you can redistribute it and/or modify it under
+the terms of the GNU Library General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+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 Library General Public License for more
+details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; if not, write to the Free Software Foundation, Inc.,
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the library, if necessary. Here
+is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+
+the library `Frob' (a library for tweaking knobs) written
+
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+
+Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt
new file mode 100644 (file)
index 0000000..204b93d
--- /dev/null
@@ -0,0 +1,19 @@
+MIT License Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/LICENSES/Unicode-DFS-2016.txt b/LICENSES/Unicode-DFS-2016.txt
new file mode 100644 (file)
index 0000000..80bd8b3
--- /dev/null
@@ -0,0 +1,49 @@
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories http://www.unicode.org/Public/,
+http://www.unicode.org/reports/, http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/,
+http://www.unicode.org/ivd/data/, and http://www.unicode.org/utility/trac/browser/.
+
+Unicode Data Files do not include PDF online code charts under the directory
+http://www.unicode.org/Public/.
+
+Software includes any source code published in the Unicode Standard or under
+the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/,
+and http://www.unicode.org/utility/trac/browser/.
+
+NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
+INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"),
+AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND
+BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE,
+DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE Copyright © 1991-2016 Unicode, Inc. All rights
+reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Unicode data files and any associated documentation (the "Data Files")
+or Unicode software and any associated documentation (the "Software") to deal
+in the Data Files or Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, and/or sell copies
+of the Data Files or Software, and to permit persons to whom the Data Files
+or Software are furnished to do so, provided that either
+
+(a) this copyright and permission notice appear with all copies of the Data
+Files or Software, or
+
+   (b) this copyright and permission notice appear in associated Documentation.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
+BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in these Data Files or Software without prior written authorization of the
+copyright holder.
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..85c2262
--- /dev/null
+++ b/README.md
@@ -0,0 +1,15 @@
+# KContacts
+
+Support for vCard contacts
+
+## Introduction
+
+KContact provides an API for contacts/address book data following the
+vCard standard (RFC 2425 / RFC 2426).
+
+## Features
+- vCard data model (see KContacts::Addressee).
+- vCard input/output (see KContacts::VCardConverter).
+- Contact group management (see KContacts::ContactGroup).
+- Locale-aware address formatting (see KContacts::Address).
+- Localized country name to ISO 3166-1 alpha 2 code mapping and vice verca (see KContacts::Address).
diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f33b444
--- /dev/null
@@ -0,0 +1,51 @@
+include(ECMAddTests)
+
+find_package(Qt${QT_MAJOR_VERSION}Test ${REQUIRED_QT_VERSION} CONFIG REQUIRED)
+
+########### next target ###############
+
+add_executable(testroundtrip)
+target_sources(testroundtrip PRIVATE testroundtrip.cpp testroundtrip.qrc)
+add_test(NAME kcontacts-testroundtrip COMMAND testroundtrip)
+target_link_libraries(testroundtrip KF5Contacts Qt${QT_MAJOR_VERSION}::Test)
+
+ecm_add_tests(birthdaytest.cpp
+    addresseetest.cpp
+    impptest.cpp
+    emailtest.cpp
+    addresstest.cpp
+    geotest.cpp
+    keytest.cpp
+    phonenumbertest.cpp
+    secrecytest.cpp
+    soundtest.cpp
+    timezonetest.cpp
+    contactgrouptest.cpp
+    vcarddragtest.cpp
+    langtest.cpp gendertest.cpp
+    calendarurltest.cpp
+    ldifconvertertest.cpp
+    relatedtest.cpp
+    resourcelocatorurltest.cpp
+    customidentifiertest.cpp
+    vcardlinetest.cpp
+    fieldgrouptest.cpp
+    importexportvcardtest.cpp
+    titletest.cpp
+    nicknametest.cpp
+    roletest.cpp
+    orgtest.cpp
+    datetimetest.cpp
+    clientpidmaptest.cpp
+    NAME_PREFIX "kcontacts-" LINK_LIBRARIES KF5Contacts Qt${QT_MAJOR_VERSION}::Test KF5::ConfigCore)
+
+ecm_add_test(addressformattest.cpp ../src/kcontacts.qrc
+    TEST_NAME addressformattest
+    NAME_PREFIX "kcontacts-" LINK_LIBRARIES KF5Contacts KF5::I18nLocaleData KF5::ConfigCore Qt${QT_MAJOR_VERSION}::Test)
+
+ecm_add_tests(picturetest.cpp
+    NAME_PREFIX "kcontacts-" LINK_LIBRARIES KF5Contacts Qt${QT_MAJOR_VERSION}::Test KF5::ConfigCore Qt${QT_MAJOR_VERSION}::Gui)
+
+# Benchmark, compiled, but not run automatically with ctest
+add_executable(vcardtool_benchmark vcardtool_benchmark.cpp)
+target_link_libraries(vcardtool_benchmark KF5Contacts Qt${QT_MAJOR_VERSION}::Test KF5::ConfigCore)
diff --git a/autotests/addresseetest.cpp b/autotests/addresseetest.cpp
new file mode 100644 (file)
index 0000000..0159ca8
--- /dev/null
@@ -0,0 +1,468 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+// krazy:excludeall=contractions
+
+#include "addresseetest.h"
+#include "kcontacts/addressee.h"
+#include <QTest>
+
+QTEST_MAIN(AddresseeTest)
+
+void AddresseeTest::emptyTest()
+{
+    KContacts::Addressee addressee;
+    QVERIFY(addressee.isEmpty());
+
+    KContacts::Addressee addresseeWithMail;
+    addresseeWithMail.addEmail(QStringLiteral("foo@bar.org"));
+    QVERIFY(!addresseeWithMail.isEmpty());
+}
+
+void AddresseeTest::storeTest()
+{
+    KContacts::Addressee addressee;
+
+    KContacts::Picture logo(QStringLiteral("http://scottlandyard.info/pics/logo.png"));
+    KContacts::Picture photo(QStringLiteral("http://scottlandyard.info/~sinclair/photo.png"));
+    KContacts::Sound sound(QStringLiteral("http://scottlandyard.info/~sinclair/sound.wav"));
+
+    QStringList emails;
+    emails << QStringLiteral("john@sinclair.com") << QStringLiteral("ghosthunter@sinclair.com");
+
+    KContacts::Key::List keys;
+    keys << KContacts::Key(QStringLiteral("SecretKey"));
+
+    QStringList categories;
+    categories << QStringLiteral("Helper") << QStringLiteral("Friend");
+
+    QStringList customs;
+    customs << QStringLiteral("X-Danger: high");
+
+    KContacts::Gender gender(QStringLiteral("H"));
+    addressee.setGender(gender);
+    KContacts::Lang lang(QLatin1String("lang"));
+    addressee.setLangs(KContacts::Lang::List() << lang);
+
+    addressee.setUid(QStringLiteral("My uid"));
+    addressee.setName(QStringLiteral("John Sinclair"));
+    addressee.setFormattedName(QStringLiteral("Sinclair, John"));
+    addressee.setFamilyName(QStringLiteral("Sinclair"));
+    addressee.setGivenName(QStringLiteral("John"));
+    addressee.setAdditionalName(QStringLiteral("Bob"));
+    addressee.setPrefix(QStringLiteral("Sir"));
+    addressee.setSuffix(QStringLiteral("II"));
+    addressee.setNickName(QStringLiteral("ghosthunter"));
+    addressee.setBirthday(QDate(1982, 7, 19));
+    addressee.setMailer(QStringLiteral("mutt"));
+    addressee.setTimeZone(KContacts::TimeZone(2));
+    addressee.setGeo(KContacts::Geo(42, 23));
+    addressee.setTitle(QStringLiteral("Ghost Hunter"));
+    addressee.setRole(QStringLiteral("Leader"));
+    addressee.setOrganization(QStringLiteral("Scottland Yard"));
+    addressee.setNote(QStringLiteral("Don't cross black deads way..."));
+    addressee.setProductId(QStringLiteral("ProductId45"));
+    addressee.setRevision(QDateTime(QDate(1982, 9, 15).startOfDay()));
+    addressee.setSortString(QStringLiteral("Name"));
+    KContacts::ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("www.scottlandyard.info")));
+    addressee.setUrl(url);
+    addressee.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Public));
+    addressee.setLogo(logo);
+    addressee.setPhoto(photo);
+    addressee.setSound(sound);
+    addressee.setEmails(emails);
+    addressee.setKeys(keys);
+    addressee.setCategories(categories);
+    addressee.setCustoms(customs);
+    addressee.setKind(QStringLiteral("foo"));
+    addressee.setChanged(false);
+    KContacts::Impp imp;
+    imp.setAddress(QUrl(QStringLiteral("gg:foo@kde.org")));
+    KContacts::Impp::List listImp;
+    listImp << imp;
+    addressee.setImppList(listImp);
+
+    QVERIFY(addressee.imppList() == listImp);
+    QVERIFY(addressee.langs() == (KContacts::Lang::List() << lang));
+    QVERIFY(addressee.gender() == gender);
+    QVERIFY(addressee.uid() == QLatin1String("My uid"));
+    QVERIFY(addressee.name() == QLatin1String("John Sinclair"));
+    QVERIFY(addressee.formattedName() == QLatin1String("Sinclair, John"));
+    QVERIFY(addressee.familyName() == QLatin1String("Sinclair"));
+    QVERIFY(addressee.givenName() == QLatin1String("John"));
+    QVERIFY(addressee.additionalName() == QLatin1String("Bob"));
+    QVERIFY(addressee.prefix() == QLatin1String("Sir"));
+    QVERIFY(addressee.suffix() == QLatin1String("II"));
+    QVERIFY(addressee.nickName() == QLatin1String("ghosthunter"));
+    QVERIFY(addressee.birthday().date() == QDate(1982, 7, 19));
+    QVERIFY(addressee.birthday().time() == QTime(0, 0));
+    QVERIFY(!addressee.birthdayHasTime());
+    QVERIFY(addressee.mailer() == QLatin1String("mutt"));
+    QVERIFY(addressee.timeZone() == KContacts::TimeZone(2));
+    QVERIFY(addressee.geo() == KContacts::Geo(42, 23));
+    QVERIFY(addressee.title() == QLatin1String("Ghost Hunter"));
+    QVERIFY(addressee.role() == QLatin1String("Leader"));
+    QVERIFY(addressee.organization() == QLatin1String("Scottland Yard"));
+    QVERIFY(addressee.note() == QLatin1String("Don't cross black deads way..."));
+    QVERIFY(addressee.productId() == QLatin1String("ProductId45"));
+    QVERIFY(addressee.revision() == QDateTime(QDate(1982, 9, 15).startOfDay()));
+    QVERIFY(addressee.sortString() == QLatin1String("Name"));
+    QVERIFY(addressee.url() == url);
+    QVERIFY(addressee.secrecy() == KContacts::Secrecy(KContacts::Secrecy::Public));
+    QVERIFY(addressee.logo() == logo);
+    QVERIFY(addressee.photo() == photo);
+    QVERIFY(addressee.sound() == sound);
+    QVERIFY(addressee.emails() == emails);
+    QVERIFY(addressee.keys() == keys);
+    QVERIFY(addressee.categories() == categories);
+    QVERIFY(addressee.customs() == customs);
+    QVERIFY(addressee.changed() == false);
+    QCOMPARE(addressee.kind(), QStringLiteral("foo"));
+}
+
+void AddresseeTest::equalsTest()
+{
+    KContacts::Addressee addressee1;
+    KContacts::Addressee addressee2;
+
+    KContacts::Picture logo(QStringLiteral("http://scottlandyard.info/pics/logo.png"));
+    KContacts::Picture photo(QStringLiteral("http://scottlandyard.info/~sinclair/photo.png"));
+    KContacts::Sound sound(QStringLiteral("http://scottlandyard.info/~sinclair/sound.wav"));
+
+    QStringList emails;
+    emails << QStringLiteral("john@sinclair.com") << QStringLiteral("ghosthunter@sinclair.com");
+
+    KContacts::Key::List keys;
+    keys << KContacts::Key(QStringLiteral("SecretKey"));
+
+    QStringList categories;
+    categories << QStringLiteral("Helper") << QStringLiteral("Friend");
+
+    QStringList customs;
+    customs << QStringLiteral("X-Danger: high");
+
+    addressee1.setUid(QStringLiteral("My uid"));
+    addressee1.setName(QStringLiteral("John Sinclair"));
+    addressee1.setFormattedName(QStringLiteral("Sinclair, John"));
+    addressee1.setFamilyName(QStringLiteral("Sinclair"));
+    addressee1.setGivenName(QStringLiteral("John"));
+    addressee1.setAdditionalName(QStringLiteral("Bob"));
+    addressee1.setPrefix(QStringLiteral("Sir"));
+    addressee1.setSuffix(QStringLiteral("II"));
+    addressee1.setNickName(QStringLiteral("ghosthunter"));
+    addressee1.setBirthday(QDateTime(QDate(1982, 7, 19).startOfDay()));
+    addressee1.setMailer(QStringLiteral("mutt"));
+    addressee1.setTimeZone(KContacts::TimeZone(2));
+    addressee1.setGeo(KContacts::Geo(42, 23));
+    addressee1.setTitle(QStringLiteral("Ghost Hunter"));
+    addressee1.setRole(QStringLiteral("Leader"));
+    addressee1.setOrganization(QStringLiteral("Scottland Yard"));
+    addressee1.setNote(QStringLiteral("Don't cross black deads way..."));
+    addressee1.setProductId(QStringLiteral("ProductId45"));
+    addressee1.setRevision(QDateTime(QDate(1982, 9, 15).startOfDay()));
+    addressee1.setSortString(QStringLiteral("Name"));
+    KContacts::ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("www.scottlandyard.info")));
+    addressee1.setUrl(url);
+    addressee1.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Public));
+    addressee1.setLogo(logo);
+    addressee1.setPhoto(photo);
+    addressee1.setSound(sound);
+    addressee1.setEmails(emails);
+    addressee1.setKeys(keys);
+    addressee1.setCategories(categories);
+    addressee1.setCustoms(customs);
+    addressee1.setChanged(false);
+
+    addressee2.setUid(QStringLiteral("My uid"));
+    addressee2.setName(QStringLiteral("John Sinclair"));
+    addressee2.setFormattedName(QStringLiteral("Sinclair, John"));
+    addressee2.setFamilyName(QStringLiteral("Sinclair"));
+    addressee2.setGivenName(QStringLiteral("John"));
+    addressee2.setAdditionalName(QStringLiteral("Bob"));
+    addressee2.setPrefix(QStringLiteral("Sir"));
+    addressee2.setSuffix(QStringLiteral("II"));
+    addressee2.setNickName(QStringLiteral("ghosthunter"));
+    addressee2.setBirthday(QDateTime(QDate(1982, 7, 19).startOfDay()));
+    addressee2.setMailer(QStringLiteral("mutt"));
+    addressee2.setTimeZone(KContacts::TimeZone(2));
+    addressee2.setGeo(KContacts::Geo(42, 23));
+    addressee2.setTitle(QStringLiteral("Ghost Hunter"));
+    addressee2.setRole(QStringLiteral("Leader"));
+    addressee2.setOrganization(QStringLiteral("Scottland Yard"));
+    addressee2.setNote(QStringLiteral("Don't cross black deads way..."));
+    addressee2.setProductId(QStringLiteral("ProductId45"));
+    addressee2.setRevision(QDateTime(QDate(1982, 9, 15).startOfDay()));
+    addressee2.setSortString(QStringLiteral("Name"));
+    addressee2.setUrl(url);
+    addressee2.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Public));
+    addressee2.setLogo(logo);
+    addressee2.setPhoto(photo);
+    addressee2.setSound(sound);
+    addressee2.setEmails(emails);
+    addressee2.setKeys(keys);
+    addressee2.setCategories(categories);
+    addressee2.setCustoms(customs);
+    addressee2.setChanged(false);
+
+    QVERIFY(addressee1 == addressee2);
+}
+
+void AddresseeTest::differsTest()
+{
+    KContacts::Addressee addressee1;
+    KContacts::Addressee addressee2;
+
+    addressee1.setNameFromString(QStringLiteral("John Sinclair"));
+    addressee2.setNameFromString(QStringLiteral("Suko"));
+
+    QVERIFY(addressee1 != addressee2);
+}
+
+void AddresseeTest::assignmentTest()
+{
+    KContacts::Addressee addressee1;
+    KContacts::Addressee addressee2;
+
+    KContacts::Picture logo(QStringLiteral("http://scottlandyard.info/pics/logo.png"));
+    KContacts::Picture photo(QStringLiteral("http://scottlandyard.info/~sinclair/photo.png"));
+    KContacts::Sound sound(QStringLiteral("http://scottlandyard.info/~sinclair/sound.wav"));
+
+    QStringList emails;
+    emails << QStringLiteral("john@sinclair.com") << QStringLiteral("ghosthunter@sinclair.com");
+
+    KContacts::Key::List keys;
+    keys << KContacts::Key(QStringLiteral("SecretKey"));
+
+    QStringList categories;
+    categories << QStringLiteral("Helper") << QStringLiteral("Friend");
+
+    QStringList customs;
+    customs << QStringLiteral("X-Danger: high");
+
+    addressee1.setUid(QStringLiteral("My uid"));
+    addressee1.setName(QStringLiteral("John Sinclair"));
+    addressee1.setFormattedName(QStringLiteral("Sinclair, John"));
+    addressee1.setFamilyName(QStringLiteral("Sinclair"));
+    addressee1.setGivenName(QStringLiteral("John"));
+    addressee1.setAdditionalName(QStringLiteral("Bob"));
+    addressee1.setPrefix(QStringLiteral("Sir"));
+    addressee1.setSuffix(QStringLiteral("II"));
+    addressee1.setNickName(QStringLiteral("ghosthunter"));
+    addressee1.setBirthday(QDateTime(QDate(1982, 7, 19).startOfDay()));
+    addressee1.setMailer(QStringLiteral("mutt"));
+    addressee1.setTimeZone(KContacts::TimeZone(2));
+    addressee1.setGeo(KContacts::Geo(42, 23));
+    addressee1.setTitle(QStringLiteral("Ghost Hunter"));
+    addressee1.setRole(QStringLiteral("Leader"));
+    addressee1.setOrganization(QStringLiteral("Scottland Yard"));
+    addressee1.setNote(QStringLiteral("Don't cross black deads way..."));
+    addressee1.setProductId(QStringLiteral("ProductId45"));
+    addressee1.setRevision(QDateTime(QDate(1982, 9, 15).startOfDay()));
+    addressee1.setSortString(QStringLiteral("Name"));
+    KContacts::ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("www.scottlandyard.info")));
+    addressee1.setUrl(url);
+    addressee1.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Public));
+    addressee1.setLogo(logo);
+    addressee1.setPhoto(photo);
+    addressee1.setSound(sound);
+    addressee1.setEmails(emails);
+    addressee1.setKeys(keys);
+    addressee1.setCategories(categories);
+    addressee1.setCustoms(customs);
+    addressee1.setChanged(false);
+
+    addressee2 = addressee1;
+
+    QVERIFY(addressee1 == addressee2);
+}
+
+void AddresseeTest::serializeTest()
+{
+    KContacts::Addressee addressee1;
+    KContacts::Addressee addressee2;
+
+    KContacts::Picture logo(QStringLiteral("http://scottlandyard.info/pics/logo.png"));
+    KContacts::Picture photo(QStringLiteral("http://scottlandyard.info/~sinclair/photo.png"));
+    KContacts::Sound sound(QStringLiteral("http://scottlandyard.info/~sinclair/sound.wav"));
+
+    QStringList emails;
+    emails << QStringLiteral("john@sinclair.com") << QStringLiteral("ghosthunter@sinclair.com");
+
+    KContacts::Key::List keys;
+    keys << KContacts::Key(QStringLiteral("SecretKey"));
+
+    QStringList categories;
+    categories << QStringLiteral("Helper") << QStringLiteral("Friend");
+
+    QStringList customs;
+    customs << QStringLiteral("FirstApp-FirstKey:FirstValue") << QStringLiteral("SecondApp-SecondKey:SecondValue")
+            << QStringLiteral("ThirdApp-ThirdKey:ThirdValue");
+
+    addressee1.setUid(QStringLiteral("My uid"));
+    addressee1.setName(QStringLiteral("John Sinclair"));
+    addressee1.setFormattedName(QStringLiteral("Sinclair, John"));
+    addressee1.setFamilyName(QStringLiteral("Sinclair"));
+    addressee1.setGivenName(QStringLiteral("John"));
+    addressee1.setAdditionalName(QStringLiteral("Bob"));
+    addressee1.setPrefix(QStringLiteral("Sir"));
+    addressee1.setSuffix(QStringLiteral("II"));
+    addressee1.setNickName(QStringLiteral("ghosthunter"));
+    addressee1.setBirthday(QDateTime(QDate(1982, 7, 19).startOfDay()));
+    addressee1.setMailer(QStringLiteral("mutt"));
+    addressee1.setTimeZone(KContacts::TimeZone(2));
+    addressee1.setGeo(KContacts::Geo(42, 23));
+    addressee1.setTitle(QStringLiteral("Ghost Hunter"));
+    addressee1.setRole(QStringLiteral("Leader"));
+    addressee1.setOrganization(QStringLiteral("Scottland Yard"));
+    addressee1.setNote(QStringLiteral("Don't cross black deads way..."));
+    addressee1.setProductId(QStringLiteral("ProductId45"));
+    addressee1.setRevision(QDateTime(QDate(1982, 9, 15).startOfDay()));
+    addressee1.setSortString(QStringLiteral("Name"));
+    KContacts::ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("www.scottlandyard.info")));
+
+    addressee1.setUrl(url);
+    addressee1.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Public));
+    addressee1.setLogo(logo);
+    addressee1.setPhoto(photo);
+    addressee1.setSound(sound);
+    addressee1.setEmails(emails);
+    addressee1.setKeys(keys);
+    addressee1.setCategories(categories);
+    addressee1.setCustoms(customs);
+    addressee1.setChanged(false);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << addressee1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> addressee2;
+
+    QVERIFY(addressee1 == addressee2);
+}
+
+void AddresseeTest::fullEmailTest()
+{
+    KContacts::Addressee a;
+    QStringList emails;
+    emails << QStringLiteral("foo@bar.com");
+    a.setEmails(emails);
+    a.setFormattedName(QStringLiteral("firstname \"nickname\" lastname"));
+    QCOMPARE(a.fullEmail(), QStringLiteral("\"firstname \\\"nickname\\\" lastname\" <foo@bar.com>"));
+}
+
+void AddresseeTest::nameFromStringTest()
+{
+    KContacts::Addressee a;
+    a.setNameFromString(QStringLiteral("Firstname Lastname"));
+    QCOMPARE(a.givenName(), QStringLiteral("Firstname"));
+    QCOMPARE(a.familyName(), QStringLiteral("Lastname"));
+    QCOMPARE(a.formattedName(), QStringLiteral("Firstname Lastname"));
+}
+
+void AddresseeTest::customFieldsTest()
+{
+    KContacts::Addressee a;
+
+    // test for empty
+    QVERIFY(a.customs().isEmpty());
+
+    // test insert
+    a.insertCustom(QStringLiteral("MyApp"), QStringLiteral("MyKey"), QStringLiteral("MyValue"));
+    QCOMPARE(a.customs().count(), 1);
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("MyKey")), QStringLiteral("MyValue"));
+
+    a.insertCustom(QStringLiteral("MyApp"), QStringLiteral("MyKey"), QStringLiteral("YourValue"));
+    QCOMPARE(a.customs().count(), 1); // still one, we overwrite...
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("MyKey")), QStringLiteral("YourValue"));
+
+    // test query non-existing app/key
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("UnknownKey")), QString());
+    QCOMPARE(a.custom(QStringLiteral("UnknownApp"), QStringLiteral("MyKey")), QString());
+
+    // test insert with different key
+    a.insertCustom(QStringLiteral("MyApp"), QStringLiteral("AnotherKey"), QStringLiteral("OtherValue"));
+    QCOMPARE(a.customs().count(), 2);
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("AnotherKey")), QStringLiteral("OtherValue"));
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("MyKey")), QStringLiteral("YourValue"));
+
+    // test insert with different app
+    a.insertCustom(QStringLiteral("OtherApp"), QStringLiteral("OtherKey"), QStringLiteral("OurValue"));
+    QCOMPARE(a.customs().count(), 3);
+    QCOMPARE(a.custom(QStringLiteral("OtherApp"), QStringLiteral("OtherKey")), QStringLiteral("OurValue"));
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("AnotherKey")), QStringLiteral("OtherValue"));
+    QCOMPARE(a.custom(QStringLiteral("MyApp"), QStringLiteral("MyKey")), QStringLiteral("YourValue"));
+
+#if 0 // Order is not defined now as we use a QHash
+    // test customs
+    QCOMPARE(a.customs().at(0), QStringLiteral("MyApp-MyKey:YourValue"));
+    QCOMPARE(a.customs().at(1), QStringLiteral("MyApp-AnotherKey:OtherValue"));
+    QCOMPARE(a.customs().at(2), QStringLiteral("OtherApp-OtherKey:OurValue"));
+#endif
+    // test equal operator
+    KContacts::Addressee b;
+    b.setUid(a.uid());
+    b.insertCustom(QStringLiteral("OtherApp"), QStringLiteral("OtherKey"), QStringLiteral("OurValue"));
+    b.insertCustom(QStringLiteral("MyApp"), QStringLiteral("MyKey"), QStringLiteral("YourValue"));
+    b.insertCustom(QStringLiteral("MyApp"), QStringLiteral("AnotherKey"), QStringLiteral("OtherValue"));
+
+    QCOMPARE(a, b);
+
+    b.insertCustom(QStringLiteral("MyApp"), QStringLiteral("AnotherKey"), QStringLiteral("WrongValue"));
+    QVERIFY(a != b);
+
+    // test setCustoms
+    KContacts::Addressee c;
+    c.insertCustom(QStringLiteral("ThisApp"), QStringLiteral("ShouldNotBe"), QStringLiteral("There"));
+    QCOMPARE(c.customs().count(), 1);
+
+    const QStringList testData = QStringList() << QStringLiteral("FirstApp-FirstKey:FirstValue") //
+                                               << QStringLiteral("SecondApp-SecondKey:SecondValue") //
+                                               << QStringLiteral("ThirdApp-ThirdKey:ThirdValue");
+
+    c.setCustoms(testData);
+    QCOMPARE(c.customs().count(), 3);
+
+    QCOMPARE(c.custom(QStringLiteral("FirstApp"), QStringLiteral("FirstKey")), QStringLiteral("FirstValue"));
+    QCOMPARE(c.custom(QStringLiteral("SecondApp"), QStringLiteral("SecondKey")), QStringLiteral("SecondValue"));
+    QCOMPARE(c.custom(QStringLiteral("ThirdApp"), QStringLiteral("ThirdKey")), QStringLiteral("ThirdValue"));
+
+    // test remove
+    QCOMPARE(c.customs().count(), 3);
+    c.removeCustom(QStringLiteral("UnknownApp"), QStringLiteral("FirstKey"));
+    QCOMPARE(c.customs().count(), 3);
+    c.removeCustom(QStringLiteral("FirstApp"), QStringLiteral("UnknownKey"));
+    QCOMPARE(c.customs().count(), 3);
+    c.removeCustom(QStringLiteral("FirstApp"), QStringLiteral("FirstKey"));
+    QCOMPARE(c.customs().count(), 2);
+}
+
+void AddresseeTest::parseEmailAddress_data()
+{
+    QTest::addColumn<QString>("inputEmail");
+    QTest::addColumn<QString>("email");
+    QTest::addColumn<QString>("name");
+    QTest::newRow("simpleemail") << QStringLiteral("foo@kde.org") << QStringLiteral("foo@kde.org") << QString();
+    QTest::newRow("email") << QStringLiteral("foo <foo@kde.org>") << QStringLiteral("foo@kde.org") << QStringLiteral("foo");
+    QTest::newRow("namewithdoublequote") << QStringLiteral("\"foo\" <foo@kde.org>") << QStringLiteral("foo@kde.org") << QStringLiteral("foo");
+}
+
+void AddresseeTest::parseEmailAddress()
+{
+    QFETCH(QString, inputEmail);
+    QFETCH(QString, email);
+    QFETCH(QString, name);
+
+    QString parsedName;
+    QString parsedEmail;
+    KContacts::Addressee::parseEmailAddress(inputEmail, parsedName, parsedEmail);
+    QCOMPARE(parsedEmail, email);
+    QCOMPARE(parsedName, name);
+}
diff --git a/autotests/addresseetest.h b/autotests/addresseetest.h
new file mode 100644 (file)
index 0000000..4532d23
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ADDRESSEE_TEST_H
+#define ADDRESSEE_TEST_H
+
+#include <QObject>
+
+class AddresseeTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void emptyTest();
+    void storeTest();
+    void equalsTest();
+    void differsTest();
+    void assignmentTest();
+    void serializeTest();
+    void fullEmailTest();
+    void nameFromStringTest();
+    void customFieldsTest();
+    void parseEmailAddress_data();
+    void parseEmailAddress();
+};
+
+#endif
diff --git a/autotests/addressformattest.cpp b/autotests/addressformattest.cpp
new file mode 100644 (file)
index 0000000..c40f322
--- /dev/null
@@ -0,0 +1,235 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addressformat.h"
+#include "addressformatparser.cpp"
+#include "addressformatscript.cpp"
+#include "addressformatter.cpp"
+
+#include <KConfig>
+#include <KConfigGroup>
+#include <KCountry>
+
+#include <QObject>
+#include <QtTest>
+
+using namespace KContacts;
+
+void initLocale()
+{
+    qputenv("LANGUAGE", "en_US");
+    QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
+}
+
+Q_CONSTRUCTOR_FUNCTION(initLocale)
+
+class AddressFormatTest : public QObject
+{
+    Q_OBJECT
+private:
+    AddressFormat parseFormat(QStringView f, QStringView u, QStringView country)
+    {
+        AddressFormat format;
+        auto fmt = AddressFormatPrivate::get(format);
+        fmt->upper = AddressFormatParser::parseFields(u);
+        fmt->elements = AddressFormatParser::parseElements(f);
+        fmt->country = country.toString();
+        return format;
+    }
+
+private Q_SLOTS:
+    void testRepostory()
+    {
+        auto fmt = AddressFormatRepository::formatForCountry(QStringLiteral("CA"), AddressFormatScriptPreference::Local);
+        QCOMPARE(fmt.requiredFields(),
+                 AddressFormatField::StreetAddress | AddressFormatField::Locality | AddressFormatField::PostalCode | AddressFormatField::Region);
+        QCOMPARE(fmt.upperCaseFields(),
+                 AddressFormatField::StreetAddress | AddressFormatField::Locality | AddressFormatField::PostalCode | AddressFormatField::Region
+                     | AddressFormatField::Name | AddressFormatField::Organization | AddressFormatField::Country);
+        QCOMPARE(fmt.usedFields(),
+                 AddressFormatField::StreetAddress | AddressFormatField::Locality | AddressFormatField::PostalCode | AddressFormatField::Region
+                     | AddressFormatField::Name | AddressFormatField::Organization | AddressFormatField::PostOfficeBox);
+        const auto &elems = fmt.elements();
+        QCOMPARE(elems.size(), 14);
+
+        QCOMPARE(elems[0].isField(), true);
+        QCOMPARE(elems[0].field(), AddressFormatField::Name);
+        QCOMPARE(elems[1].isSeparator(), true);
+        QCOMPARE(elems[2].isField(), true);
+        QCOMPARE(elems[2].field(), AddressFormatField::Organization);
+        QCOMPARE(elems[3].isSeparator(), true);
+        QCOMPARE(elems[6].isLiteral(), true);
+        QCOMPARE(elems[6].literal(), QLatin1String("PO BOX "));
+        QCOMPARE(elems[9].isField(), true);
+        QCOMPARE(elems[9].field(), AddressFormatField::Locality);
+        QCOMPARE(elems[10].isLiteral(), true);
+        QCOMPARE(elems[10].literal(), QLatin1String(" "));
+        QCOMPARE(elems[11].isField(), true);
+        QCOMPARE(elems[11].field(), AddressFormatField::Region);
+        QCOMPARE(elems[12].isLiteral(), true);
+        QCOMPARE(elems[12].literal(), QLatin1String(" "));
+        QCOMPARE(elems[13].isField(), true);
+        QCOMPARE(elems[13].field(), AddressFormatField::PostalCode);
+
+        QVERIFY(!fmt.postalCodeRegularExpression().isEmpty());
+        QCOMPARE(fmt.country(), QLatin1String("CA"));
+    }
+
+    void testFormatStyles()
+    {
+        Address addr;
+        addr.setCountry(QStringLiteral("DE"));
+        addr.setRegion(QStringLiteral("BE"));
+        addr.setLocality(QStringLiteral("Berlin"));
+        addr.setPostalCode(QStringLiteral("10969"));
+        addr.setStreet(QStringLiteral("Prinzenstraße 85 F"));
+        addr.setExtended(QStringLiteral("East wing"));
+
+        auto fmt = parseFormat(u"%O%n%N%nPostfach %P%n%A%n%Z %C", u"R", u"DE");
+        auto s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::Postal);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nEast wing\nPrinzenstraße 85 F\n10969 Berlin\n\nGERMANY"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineInternational);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nEast wing\nPrinzenstraße 85 F\n10969 Berlin\nGermany"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineDomestic);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nEast wing\nPrinzenstraße 85 F\n10969 Berlin"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineInternational);
+        QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, East wing, Prinzenstraße 85 F, 10969 Berlin, Germany"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, East wing, Prinzenstraße 85 F, 10969 Berlin"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::GeoUriQuery);
+        QCOMPARE(s, QStringLiteral("Prinzenstraße 85 F,10969 Berlin,DE"));
+
+        addr.setExtended(QString());
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::Postal);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\n\nGERMANY"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineInternational);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\nGermany"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineDomestic);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPrinzenstraße 85 F\n10969 Berlin"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineInternational);
+        QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Prinzenstraße 85 F, 10969 Berlin, Germany"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Prinzenstraße 85 F, 10969 Berlin"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::GeoUriQuery);
+        QCOMPARE(s, QStringLiteral("Prinzenstraße 85 F,10969 Berlin,DE"));
+
+        addr.setPostOfficeBox(QStringLiteral("42"));
+        addr.setStreet(QString());
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::Postal);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPostfach 42\n10969 Berlin\n\nGERMANY"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineInternational);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPostfach 42\n10969 Berlin\nGermany"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineDomestic);
+        QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPostfach 42\n10969 Berlin"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineInternational);
+        QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Postfach 42, 10969 Berlin, Germany"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Postfach 42, 10969 Berlin"));
+        s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::GeoUriQuery);
+        QCOMPARE(s, QStringLiteral("10969 Berlin,DE"));
+    }
+
+    void testFormatScript()
+    {
+        KContacts::Address address;
+        address.setCountry(QStringLiteral("JP"));
+        address.setRegion(QStringLiteral("東京"));
+        address.setLocality(QStringLiteral("都港区"));
+        address.setPostalCode(QStringLiteral("106-0047"));
+        address.setStreet(QStringLiteral("南麻布 4-6-28"));
+        auto fmt = parseFormat(u"〒%Z%n%S%C%A%n%O%n%N", u"SR", u"JP");
+        auto s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("〒106-0047東京都港区南麻布 4-6-28"));
+
+        address = {};
+        address.setCountry(QStringLiteral("EG"));
+        address.setLocality(QStringLiteral("القاهرة"));
+        address.setStreet(QStringLiteral("2005ج كورنيش النيل، رملة بولاق"));
+        fmt = parseFormat(u"%N%n%O%n%A%n%C%n%S%n%Z", u"", u"EG");
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("2005ج كورنيش النيل، رملة بولاق، القاهرة"));
+
+        address = {};
+        address.setCountry(QStringLiteral("KR"));
+        address.setRegion(QStringLiteral("서울특별시"));
+        address.setLocality(QStringLiteral("중구"));
+        address.setPostalCode(QStringLiteral("04637"));
+        address.setStreet(QStringLiteral("한강대로 416"));
+        fmt = parseFormat(u"%R%n%S %C%D%n%A%n%O%n%N%n%Z", u"Z", u"KR");
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("서울특별시 중구 한강대로 416 04637"));
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineDomestic);
+        QCOMPARE(s, QStringLiteral("서울특별시 중구\n한강대로 416\n04637"));
+        // the weird language mix is because we are in the wrong locale for KR here,
+        // the important part is that the country is in the front when using Hangul
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineInternational);
+        QCOMPARE(s, QStringLiteral("Korea, Republic of 서울특별시 중구 한강대로 416 04637"));
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineInternational);
+        QCOMPARE(s, QStringLiteral("Korea, Republic of\n서울특별시 중구\n한강대로 416\n04637"));
+
+        // reverse order address lines
+        address.setExtended(QStringLiteral("서울스퀘어 11층"));
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic);
+        QCOMPARE(s, QStringLiteral("서울특별시 중구 한강대로 416 서울스퀘어 11층 04637"));
+        s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineDomestic);
+        QCOMPARE(s, QStringLiteral("서울특별시 중구\n한강대로 416\n서울스퀘어 11층\n04637"));
+    }
+
+    void testIncompleteAddress()
+    {
+        KContacts::Address address;
+        address.setLocality(QStringLiteral("City"));
+        address.setPostalCode(QStringLiteral("XX 12345")); // region wrongly part of postal code field
+
+        auto fmt = parseFormat(u"%C, %S %Z", u"", u"US");
+        auto s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineDomestic);
+        QCOMPARE(s, QLatin1String("City XX 12345"));
+    }
+
+    void validateRepository()
+    {
+        KConfig config(QStringLiteral(":/org.kde.kcontacts/addressformatrc"), KConfig::SimpleConfig);
+        const auto groups = config.groupList();
+
+        for (const auto &countryCode : groups) {
+            // qDebug() << countryCode;
+            QVERIFY(KCountry::fromAlpha2(countryCode).isValid());
+            const auto group = config.group(countryCode);
+
+            QVERIFY(group.hasKey("AddressFormat"));
+            const auto upper = AddressFormatParser::parseFields(group.readEntry("Upper"));
+            const auto required = AddressFormatParser::parseFields(group.readEntry("Required"));
+
+            // TODO can we check all language variants as well?
+            for (const auto &key : {"AddressFormat", "BusinessAddressFormat", "LatinAddressFormat", "LatinBusinessAddressFormat"}) {
+                if (!group.hasKey(key)) {
+                    continue;
+                }
+                const auto elems = AddressFormatParser::parseElements(group.readEntry(key, QString()));
+
+                AddressFormatFields seen = AddressFormatField::NoField;
+                for (const auto &elem : elems) {
+                    if (!elem.isField()) {
+                        continue;
+                    }
+                    QCOMPARE(seen & elem.field() & ~(int)AddressFormatField::SortingCode, 0);
+                    seen |= elem.field();
+                }
+
+                QCOMPARE(seen & required, required);
+                QCOMPARE(seen & upper & ~(int)AddressFormatField::Country, upper & ~(int)AddressFormatField::Country);
+            }
+
+            const auto zipRegEx = group.readEntry("PostalCodeFormat", QString());
+            if (!zipRegEx.isEmpty()) {
+                QVERIFY(QRegularExpression(zipRegEx).isValid());
+            }
+        }
+    }
+};
+
+QTEST_GUILESS_MAIN(AddressFormatTest)
+
+#include "addressformattest.moc"
diff --git a/autotests/addresstest.cpp b/autotests/addresstest.cpp
new file mode 100644 (file)
index 0000000..fc6a9bc
--- /dev/null
@@ -0,0 +1,507 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addresstest.h"
+#include "addresseelist.h"
+#include "kcontacts/address.h"
+#include "vcardtool_p.h"
+#include <KConfig>
+#include <KConfigGroup>
+#include <QStandardPaths>
+#include <QTest>
+
+QTEST_MAIN(AddressTest)
+void initLocale()
+{
+    qputenv("LANG", "it_CH");
+    QLocale::setDefault(QLocale(QLocale::Italian, QLocale::Switzerland));
+}
+
+Q_CONSTRUCTOR_FUNCTION(initLocale)
+
+void AddressTest::initTestCase()
+{
+}
+
+void AddressTest::emptyTest()
+{
+    KContacts::Address address;
+
+    QVERIFY(address.isEmpty());
+}
+
+void AddressTest::storeTest()
+{
+    KContacts::Address address;
+
+    address.setId(QStringLiteral("My Id"));
+    address.setType(KContacts::Address::Home);
+    address.setPostOfficeBox(QStringLiteral("1234"));
+    address.setExtended(QStringLiteral("My Extended Label"));
+    address.setStreet(QStringLiteral("My Street"));
+    address.setLocality(QStringLiteral("My Locality"));
+    address.setRegion(QStringLiteral("My Region"));
+    address.setPostalCode(QStringLiteral("My PostalCode"));
+    address.setCountry(QStringLiteral("My Country"));
+    address.setLabel(QStringLiteral("My Label"));
+
+    QCOMPARE(address.id(), QStringLiteral("My Id"));
+    QCOMPARE(address.type(), KContacts::Address::Home);
+    QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
+    QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
+    QCOMPARE(address.street(), QStringLiteral("My Street"));
+    QCOMPARE(address.locality(), QStringLiteral("My Locality"));
+    QCOMPARE(address.region(), QStringLiteral("My Region"));
+    QCOMPARE(address.postalCode(), QStringLiteral("My PostalCode"));
+    QCOMPARE(address.country(), QStringLiteral("My Country"));
+    QCOMPARE(address.label(), QStringLiteral("My Label"));
+    QVERIFY(!address.geo().isValid());
+}
+
+void AddressTest::equalsTest()
+{
+    KContacts::Address address1;
+    KContacts::Address address2;
+
+    address1.setId(QStringLiteral("My Id"));
+    address1.setType(KContacts::Address::Home);
+    address1.setPostOfficeBox(QStringLiteral("1234"));
+    address1.setExtended(QStringLiteral("My Extended Label"));
+    address1.setStreet(QStringLiteral("My Street"));
+    address1.setLocality(QStringLiteral("My Locality"));
+    address1.setRegion(QStringLiteral("My Region"));
+    address1.setPostalCode(QStringLiteral("My Postalcode"));
+    address1.setCountry(QStringLiteral("My country"));
+    address1.setLabel(QStringLiteral("My Label"));
+
+    address2.setId(QStringLiteral("My Id"));
+    address2.setType(KContacts::Address::Home);
+    address2.setPostOfficeBox(QStringLiteral("1234"));
+    address2.setExtended(QStringLiteral("My Extended Label"));
+    address2.setStreet(QStringLiteral("My Street"));
+    address2.setLocality(QStringLiteral("My Locality"));
+    address2.setRegion(QStringLiteral("My Region"));
+    address2.setPostalCode(QStringLiteral("My Postalcode"));
+    address2.setCountry(QStringLiteral("My country"));
+    address2.setLabel(QStringLiteral("My Label"));
+
+    QVERIFY(address1 == address2);
+}
+
+void AddressTest::differsTest()
+{
+    KContacts::Address address1(KContacts::Address::Home);
+    KContacts::Address address2(KContacts::Address::Work);
+
+    QVERIFY(address1 != address2);
+}
+
+void AddressTest::assignmentTest()
+{
+    KContacts::Address address1;
+    KContacts::Address address2;
+
+    address1.setId(QStringLiteral("My Id"));
+    address1.setType(KContacts::Address::Home);
+    address1.setPostOfficeBox(QStringLiteral("1234"));
+    address1.setExtended(QStringLiteral("My Extended Label"));
+    address1.setStreet(QStringLiteral("My Street"));
+    address1.setLocality(QStringLiteral("My Locality"));
+    address1.setRegion(QStringLiteral("My Region"));
+    address1.setPostalCode(QStringLiteral("My Postalcode"));
+    address1.setCountry(QStringLiteral("My country"));
+    address1.setLabel(QStringLiteral("My Label"));
+
+    address2 = address1;
+
+    QVERIFY(address1 == address2);
+}
+
+void AddressTest::serializeTest()
+{
+    KContacts::Address address1;
+    KContacts::Address address2;
+
+    address1.setType(KContacts::Address::Work);
+    address1.setPostOfficeBox(QStringLiteral("1234"));
+    address1.setExtended(QStringLiteral("My Extended Label"));
+    address1.setStreet(QStringLiteral("My Street"));
+    address1.setLocality(QStringLiteral("My Locality"));
+    address1.setRegion(QStringLiteral("My Region"));
+    address1.setPostalCode(QStringLiteral("My Postalcode"));
+    address1.setCountry(QStringLiteral("My country"));
+    address1.setLabel(QStringLiteral("My Label"));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << address1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> address2;
+
+    QVERIFY(address1 == address2);
+}
+
+void AddressTest::formatTest()
+{
+    {
+        KContacts::Address address;
+        address.setStreet(QStringLiteral("Lummerlandstr. 1"));
+        address.setPostalCode(QStringLiteral("12345"));
+        address.setLocality(QStringLiteral("Lummerstadt"));
+        address.setCountry(QStringLiteral("Germany"));
+
+        const QString result(
+            QStringLiteral("Jim Knopf\nLummerlandstr. 1\n"
+                           "12345 Lummerstadt\n\nGERMANIA"));
+
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result);
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 92)
+        QCOMPARE(address.formattedAddress(QStringLiteral("Jim Knopf")), result);
+#endif
+    }
+
+    {
+        KContacts::Address address;
+        address.setStreet(QStringLiteral("457 Foobar Ave"));
+        address.setPostalCode(QStringLiteral("1A2B3C"));
+        address.setLocality(QStringLiteral("Nervousbreaktown"));
+        address.setRegion(QStringLiteral("DC"));
+        address.setCountry(QStringLiteral("United States of America"));
+
+        const QString result(
+            QStringLiteral("Huck Finn\n457 Foobar Ave\nNERVOUSBREAKTOWN,"
+                           " DC 1A2B3C\n\nSTATI UNITI"));
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Huck Finn")), result);
+    }
+
+    {
+        KContacts::Address address;
+        address.setStreet(QStringLiteral("Lummerlandstr. 1"));
+        address.setPostalCode(QStringLiteral("12345"));
+        address.setLocality(QStringLiteral("Lummerstadt"));
+        address.setCountry(QStringLiteral("Deutschland"));
+
+        const QString result(
+            QStringLiteral("Jim Knopf\nLummerlandstr. 1\n"
+                           "12345 Lummerstadt\n\nGERMANIA"));
+
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result);
+    }
+
+    {
+        KContacts::Address address;
+        address.setStreet(QStringLiteral("Lummerlandstr. 1"));
+        address.setPostalCode(QStringLiteral("12345"));
+        address.setLocality(QStringLiteral("Lummerstadt"));
+        address.setCountry(QString());
+
+        const QString result(QStringLiteral("Jim Knopf\nLummerlandstr. 1\n12345 Lummerstadt"));
+
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result);
+    }
+
+    {
+        KContacts::Address address;
+        address.setStreet(QStringLiteral("Haus Randa"));
+        address.setPostalCode(QStringLiteral("1234"));
+        address.setLocality(QStringLiteral("Randa"));
+        address.setPostOfficeBox(QStringLiteral("5678"));
+        address.setCountry(QStringLiteral("Schweiz"));
+
+        // we want the Italian variant of the Swiss format for it_CH
+        const QString result(QStringLiteral("Dr. Konqui\nCasella postale 5678\nHaus Randa\n1234 Randa\n\nSVIZZERA"));
+
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqui")), result);
+    }
+
+    {
+        KContacts::Address address;
+        address.setStreet(QStringLiteral("Haus Randa"));
+        address.setPostalCode(QStringLiteral("1234"));
+        address.setLocality(QStringLiteral("Randa"));
+        address.setPostOfficeBox(QStringLiteral("5678"));
+        address.setCountry(QStringLiteral("CH"));
+
+        // we want the Italian variant of the Swiss format for it_CH
+        const QString result(QStringLiteral("Dr. Konqui\nCasella postale 5678\nHaus Randa\n1234 Randa\n\nSVIZZERA"));
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqui")), result);
+    }
+
+    {
+        KContacts::Address address;
+        address.setCountry(QStringLiteral("CH"));
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QString()), QLatin1String("SVIZZERA"));
+    }
+
+    {
+        // business format for postal style
+        KContacts::Address address;
+        address.setCountry(QStringLiteral("AT"));
+        address.setLocality(QStringLiteral("Berlin"));
+        address.setPostalCode(QStringLiteral("10969"));
+        address.setStreet(QStringLiteral("Prinzenstraße 85 F"));
+        const auto result = QString::fromUtf8("KDE e.V.\nz.Hd. Dr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\n\nAUSTRIA");
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V.")), result);
+    }
+
+    {
+        // local vs latin script formats
+        KContacts::Address address;
+        address.setCountry(QStringLiteral("JP"));
+        address.setRegion(QStringLiteral("Tokyo"));
+        address.setLocality(QStringLiteral("Minato-ku"));
+        address.setPostalCode(QStringLiteral("106-0047"));
+        address.setStreet(QStringLiteral("4-6-28 Minami-Azabu"));
+        auto result = QString::fromUtf8("4-6-28 Minami-Azabu, Minato-ku\nTOKYO 106-0047\n\nGIAPPONE");
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal), result);
+
+        address.setRegion(QStringLiteral("東京"));
+        address.setLocality(QStringLiteral("都港区"));
+        address.setPostalCode(QStringLiteral("106-0047"));
+        address.setStreet(QStringLiteral("南麻布 4-6-28"));
+        result = QString::fromUtf8("〒106-0047\n東京都港区南麻布 4-6-28\n\nGIAPPONE");
+        QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal), result);
+    }
+}
+
+void AddressTest::shouldExportVcard3()
+{
+    KContacts::Address address;
+
+    address.setId(QStringLiteral("My Id"));
+    address.setType(KContacts::Address::Home);
+    address.setPostOfficeBox(QStringLiteral("1234"));
+    address.setExtended(QStringLiteral("My Extended Label"));
+    address.setStreet(QStringLiteral("My Street"));
+    address.setLocality(QStringLiteral("My Locality"));
+    address.setRegion(QStringLiteral("My Region"));
+    address.setPostalCode(QStringLiteral("My Postalcode"));
+    address.setCountry(QStringLiteral("My country"));
+    address.setLabel(QStringLiteral("My Label"));
+
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    addr.insertAddress(address);
+    lst << addr;
+
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "ADR;TYPE=home:1234;My Extended Label;My Street;My Locality;My Region;My Pos\r\n"
+        " talcode;My country\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "LABEL;TYPE=home:My Label\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void AddressTest::shouldParseAddressVCard3()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "ADR;TYPE=home:1234;My Extended Label;My Street;My Locality;My Region;My Pos\r\n"
+        " talcode;My country\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "LABEL;TYPE=home:My Label\r\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).addresses().count(), 1);
+    KContacts::Address address = lst.at(0).addresses().at(0);
+    QCOMPARE(address.type(), KContacts::Address::Home);
+    QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
+    QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
+    QCOMPARE(address.region(), QStringLiteral("My Region"));
+    QCOMPARE(address.street(), QStringLiteral("My Street"));
+    QCOMPARE(address.country(), QStringLiteral("My country"));
+    QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode"));
+    QCOMPARE(address.label(), QStringLiteral("My Label"));
+}
+
+void AddressTest::shouldParseAddressVCard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "ADR;LABEL=\"My Label\";TYPE=home:1234;My Extended Label;My Street;My Locality\r\n"
+        " ;My Region;My Postalcode;My country\r\nEMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).addresses().count(), 1);
+    KContacts::Address address = lst.at(0).addresses().at(0);
+    QCOMPARE(address.type(), KContacts::Address::Home);
+    QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
+    QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
+    QCOMPARE(address.region(), QStringLiteral("My Region"));
+    QCOMPARE(address.street(), QStringLiteral("My Street"));
+    QCOMPARE(address.country(), QStringLiteral("My country"));
+    QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode"));
+    QCOMPARE(address.label(), QStringLiteral("My Label"));
+}
+
+void AddressTest::shouldParseAddressVCard4WithGeoPosition()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "ADR;GEO=\"geo:22.500000,45.099998\";LABEL=\"My Label\";TYPE=home:1234;My Extend\r\n"
+        " ed Label;My Street;My Locality;My Region;My Postalcode;My country\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).addresses().count(), 1);
+    KContacts::Address address = lst.at(0).addresses().at(0);
+    QCOMPARE(address.type(), KContacts::Address::Home);
+    QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
+    QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
+    QCOMPARE(address.region(), QStringLiteral("My Region"));
+    QCOMPARE(address.street(), QStringLiteral("My Street"));
+    QCOMPARE(address.country(), QStringLiteral("My country"));
+    QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode"));
+    QCOMPARE(address.label(), QStringLiteral("My Label"));
+    KContacts::Geo geo = address.geo();
+    QVERIFY(geo.isValid());
+    QCOMPARE(geo.latitude(), 22.5f);
+    QCOMPARE(geo.longitude(), 45.1f);
+}
+
+void AddressTest::shouldExportVCard4WithGeoPosition()
+{
+    KContacts::Address address;
+
+    address.setId(QStringLiteral("My Id"));
+    address.setType(KContacts::Address::Home);
+    address.setPostOfficeBox(QStringLiteral("1234"));
+    address.setExtended(QStringLiteral("My Extended Label"));
+    address.setStreet(QStringLiteral("My Street"));
+    address.setLocality(QStringLiteral("My Locality"));
+    address.setRegion(QStringLiteral("My Region"));
+    address.setPostalCode(QStringLiteral("My Postalcode"));
+    address.setCountry(QStringLiteral("My country"));
+    address.setLabel(QStringLiteral("My Label"));
+
+    KContacts::Geo geo;
+
+    geo.setLatitude(22.5f);
+    geo.setLongitude(45.1f);
+    address.setGeo(geo);
+
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    addr.insertAddress(address);
+    lst << addr;
+
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "ADR;GEO=\"geo:22.500000,45.099998\";LABEL=\"My Label\";TYPE=home:1234;My Extend\r\n"
+        " ed Label;My Street;My Locality;My Region;My Postalcode;My country\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void AddressTest::shouldExportVcard4()
+{
+    KContacts::Address address;
+
+    address.setId(QStringLiteral("My Id"));
+    address.setType(KContacts::Address::Home);
+    address.setPostOfficeBox(QStringLiteral("1234"));
+    address.setExtended(QStringLiteral("My Extended Label"));
+    address.setStreet(QStringLiteral("My Street"));
+    address.setLocality(QStringLiteral("My Locality"));
+    address.setRegion(QStringLiteral("My Region"));
+    address.setPostalCode(QStringLiteral("My Postalcode"));
+    address.setCountry(QStringLiteral("My country"));
+    address.setLabel(QStringLiteral("My Label"));
+
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    addr.insertAddress(address);
+    lst << addr;
+
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "ADR;LABEL=\"My Label\";TYPE=home:1234;My Extended Label;My Street;My Locality\r\n"
+        " ;My Region;My Postalcode;My country\r\nEMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void AddressTest::countryToISOTest()
+{
+    using namespace KContacts;
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 89)
+    QCOMPARE(Address::countryToISO(QStringLiteral("France")), QLatin1String("fr"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("Frankreich")), QLatin1String("fr"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("Germany")), QLatin1String("de"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("Österreich")), QLatin1String("at"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("Disneyland")), QString());
+    QCOMPARE(Address::countryToISO(QStringLiteral("Østrig")), QLatin1String("at"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("Den Demokratiske Republik Congo")), QLatin1String("cd"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("South Sudan")), QLatin1String("ss"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("United States")), QLatin1String("us"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("United States Of America")), QLatin1String("us"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("United")), QString());
+    QCOMPARE(Address::countryToISO(QStringLiteral("대한민국")), QLatin1String("kr"));
+
+    QCOMPARE(Address::countryToISO(QStringLiteral("Osterreich")), QLatin1String("at"));
+    QCOMPARE(Address::countryToISO(QStringLiteral("Ünited  States\nOf America")), QLatin1String("us"));
+#endif
+}
+
+void AddressTest::isoToCountryTest()
+{
+    qunsetenv("LC_ALL");
+    qputenv("LANGUAGE", "en");
+
+    using namespace KContacts;
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 89)
+    QCOMPARE(Address::ISOtoCountry(QStringLiteral("FR")), QLatin1String("France"));
+    QCOMPARE(Address::ISOtoCountry(QStringLiteral("de")), QLatin1String("Germany"));
+
+    // invalid
+    QCOMPARE(Address::ISOtoCountry(QStringLiteral("EU")), QLatin1String("EU"));
+    QCOMPARE(Address::ISOtoCountry(QStringLiteral("zz")), QLatin1String("zz"));
+    QCOMPARE(Address::ISOtoCountry(QStringLiteral("0")), QLatin1String("0"));
+#endif
+}
diff --git a/autotests/addresstest.h b/autotests/addresstest.h
new file mode 100644 (file)
index 0000000..e55a12d
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ADDRESS_TEST_H
+#define ADDRESS_TEST_H
+
+#include <QObject>
+
+class AddressTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void initTestCase();
+    void emptyTest();
+    void storeTest();
+    void equalsTest();
+    void differsTest();
+    void assignmentTest();
+    void serializeTest();
+    void formatTest();
+    void shouldExportVcard4();
+    void shouldExportVcard3();
+    void shouldParseAddressVCard3();
+    void shouldParseAddressVCard4();
+    void shouldExportVCard4WithGeoPosition();
+    void shouldParseAddressVCard4WithGeoPosition();
+    void countryToISOTest();
+    void isoToCountryTest();
+};
+
+#endif
diff --git a/autotests/birthdaytest.cpp b/autotests/birthdaytest.cpp
new file mode 100644 (file)
index 0000000..40065e4
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+    This file is part of kcontacts.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "birthdaytest.h"
+#include "addressee.h"
+#include "vcard_p.h"
+#include <QTest>
+#include <vcardtool_p.h>
+
+BirthDayTest::BirthDayTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+BirthDayTest::~BirthDayTest()
+{
+}
+
+void BirthDayTest::shouldParseBirthDay()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "BDAY:19760505T120505\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QDateTime dt(QDate(1976, 5, 5), QTime(12, 5, 5));
+    QCOMPARE(lst.at(0).birthday(), dt);
+    QCOMPARE(lst.at(0).birthdayHasTime(), true);
+}
+
+void BirthDayTest::shouldParseBirthDayWithoutTime()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "BDAY:19760505\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QDateTime dt(QDate(1976, 5, 5).startOfDay());
+
+    QCOMPARE(lst.at(0).birthday(), dt);
+    QCOMPARE(lst.at(0).birthdayHasTime(), false);
+}
+
+void BirthDayTest::shouldParseBirthDayWithoutTimeAndYear()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "BDAY:--0505\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QDateTime dt(QDate(-1, 5, 5).startOfDay());
+    QCOMPARE(lst.at(0).birthday(), dt);
+    QCOMPARE(lst.at(0).birthdayHasTime(), false);
+}
+
+void BirthDayTest::shouldExportVcard4()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QDateTime dt(QDate(1976, 5, 5), QTime(12, 5, 5));
+    addr.setBirthday(dt);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "BDAY:19760505T120505\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void BirthDayTest::shouldExportVcard4WithoutTime()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QDate d(1976, 5, 5);
+    addr.setBirthday(d);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "BDAY:19760505\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void BirthDayTest::shouldExportVcard4WithoutTimeAndWithoutYear()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QDate d(-1, 5, 5);
+    addr.setBirthday(d);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "BDAY:--0505\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void BirthDayTest::shouldExportVcard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QDateTime dt(QDate(1976, 5, 5), QTime(12, 5, 5));
+    addr.setBirthday(dt);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "BDAY:1976-05-05T12:05:05\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void BirthDayTest::shouldExportVcard3WithoutTimeAndWithoutYear()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QDate d(-1, 5, 5);
+    addr.setBirthday(d);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "BDAY:--05-05\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void BirthDayTest::shouldExportVcard3WithoutTime()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QDate d(1976, 5, 5);
+    addr.setBirthday(d);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "BDAY:1976-05-05\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(BirthDayTest)
diff --git a/autotests/birthdaytest.h b/autotests/birthdaytest.h
new file mode 100644 (file)
index 0000000..438543d
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+    This file is part of kcontacts.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef BIRTHDAYTEST_H
+#define BIRTHDAYTEST_H
+
+#include <QObject>
+
+class BirthDayTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit BirthDayTest(QObject *parent = nullptr);
+    ~BirthDayTest() override;
+
+private Q_SLOTS:
+    void shouldExportVcard4();
+    void shouldExportVcard4WithoutTime();
+    void shouldExportVcard3();
+    void shouldExportVcard3WithoutTime();
+    void shouldParseBirthDay();
+    void shouldParseBirthDayWithoutTime();
+    void shouldParseBirthDayWithoutTimeAndYear();
+    void shouldExportVcard4WithoutTimeAndWithoutYear();
+    void shouldExportVcard3WithoutTimeAndWithoutYear();
+};
+
+#endif // BIRTHDAYTEST_H
diff --git a/autotests/calendarurltest.cpp b/autotests/calendarurltest.cpp
new file mode 100644 (file)
index 0000000..78281bf
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "calendarurltest.h"
+#include "parametermap_p.h"
+
+#include "calendarurl.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+using namespace KContacts;
+Q_DECLARE_METATYPE(KContacts::CalendarUrl::CalendarType)
+CalendarUrlTest::CalendarUrlTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+CalendarUrlTest::~CalendarUrlTest()
+{
+}
+
+void CalendarUrlTest::shouldHaveDefaultValue()
+{
+    CalendarUrl calendarUrl(CalendarUrl::FBUrl);
+    QVERIFY(!calendarUrl.isValid());
+    QVERIFY(calendarUrl.url().isEmpty());
+    QVERIFY(calendarUrl.params().empty());
+}
+
+void CalendarUrlTest::shouldAssignValue()
+{
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    CalendarUrl calendarUrl(CalendarUrl::FBUrl);
+    calendarUrl.setParams(params);
+    QVERIFY(!calendarUrl.isValid());
+    QCOMPARE(calendarUrl.type(), CalendarUrl::FBUrl);
+    QVERIFY(calendarUrl.url().isEmpty());
+    QVERIFY(!calendarUrl.params().empty());
+    QCOMPARE(calendarUrl.params(), params);
+}
+
+void CalendarUrlTest::shouldAssignExternal()
+{
+    CalendarUrl calendarUrl(CalendarUrl::FBUrl);
+    const CalendarUrl::CalendarType type = CalendarUrl::CALUri;
+    calendarUrl.setType(type);
+    QVERIFY(calendarUrl.url().isEmpty());
+    QCOMPARE(calendarUrl.type(), type);
+}
+
+void CalendarUrlTest::shouldSerialized()
+{
+    for (int i = 0; i < CalendarUrl::EndCalendarType; ++i) {
+        CalendarUrl calendarUrl;
+        CalendarUrl result;
+        CalendarUrl::CalendarType type = static_cast<CalendarUrl::CalendarType>(i);
+        calendarUrl.setType(type);
+        KContacts::ParameterMap params;
+        params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+        params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+        calendarUrl.setParams(params);
+        calendarUrl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org")));
+
+        QByteArray data;
+        QDataStream s(&data, QIODevice::WriteOnly);
+        s << calendarUrl;
+
+        QDataStream t(&data, QIODevice::ReadOnly);
+        t >> result;
+
+        QVERIFY(calendarUrl == result);
+    }
+}
+
+void CalendarUrlTest::shouldEqualCalendarUrl()
+{
+    for (int i = 0; i < CalendarUrl::EndCalendarType; ++i) {
+        CalendarUrl calendarUrl;
+        CalendarUrl result;
+        CalendarUrl::CalendarType type = static_cast<CalendarUrl::CalendarType>(i);
+        calendarUrl.setType(type);
+        KContacts::ParameterMap params;
+        params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+        params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+        calendarUrl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org")));
+        calendarUrl.setParams(params);
+
+        result = calendarUrl;
+        QVERIFY(calendarUrl == result);
+    }
+}
+
+void CalendarUrlTest::shouldParseCalendarUrl()
+{
+    for (int i = CalendarUrl::Unknown + 1; i < CalendarUrl::EndCalendarType; ++i) {
+        CalendarUrl::CalendarType type = static_cast<CalendarUrl::CalendarType>(i);
+        QByteArray baType;
+        switch (type) {
+        case CalendarUrl::Unknown:
+        case CalendarUrl::EndCalendarType:
+            break;
+        case CalendarUrl::FBUrl:
+            baType = QByteArray("FBURL");
+            break;
+        case CalendarUrl::CALUri:
+            baType = QByteArray("CALURI");
+            break;
+        case CalendarUrl::CALADRUri:
+            baType = QByteArray("CALADRURI");
+            break;
+        }
+
+        QByteArray vcarddata(
+            "BEGIN:VCARD\n"
+            "VERSION:3.0\n"
+            "N:LastName;FirstName;;;\n"
+            "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n");
+        vcarddata += baType;
+        vcarddata += QByteArray(
+            ";PREF=1:https://sherlockholmes.com/calendar/sherlockholmes\n"
+            "REV:2015-03-14T09:24:45+00:00\n"
+            "FN:FirstName LastName\n"
+            "END:VCARD\n");
+
+        KContacts::VCardTool vcard;
+        const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+        QCOMPARE(lst.count(), 1);
+        QCOMPARE(lst.at(0).calendarUrlList().count(), 1);
+        const CalendarUrl calurl = lst.at(0).calendarUrlList().at(0);
+        QCOMPARE(calurl.type(), type);
+        QCOMPARE(calurl.url(), QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+        QVERIFY(!calurl.params().empty());
+    }
+}
+
+void CalendarUrlTest::shouldGenerateVCard_data()
+{
+    QTest::addColumn<KContacts::CalendarUrl::CalendarType>("type");
+    QTest::addColumn<QByteArray>("value");
+    for (int i = CalendarUrl::Unknown + 1; i < CalendarUrl::EndCalendarType; ++i) {
+        KContacts::CalendarUrl::CalendarType type = static_cast<KContacts::CalendarUrl::CalendarType>(i);
+        QByteArray baType;
+        switch (type) {
+        case CalendarUrl::Unknown:
+        case CalendarUrl::EndCalendarType:
+            break;
+        case CalendarUrl::FBUrl:
+            baType = QByteArray("FBURL");
+            break;
+        case CalendarUrl::CALUri:
+            baType = QByteArray("CALURI");
+            break;
+        case CalendarUrl::CALADRUri:
+            baType = QByteArray("CALADRURI");
+            break;
+        }
+        QTest::newRow(baType.constData()) << type << baType;
+    }
+}
+
+void CalendarUrlTest::shouldGenerateVCard()
+{
+    QFETCH(KContacts::CalendarUrl::CalendarType, type);
+    QFETCH(QByteArray, value);
+
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    CalendarUrl url;
+    url.setType(type);
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    addr.insertCalendarUrl(url);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected;
+    // Different order
+    if (type == KContacts::CalendarUrl::FBUrl) {
+        expected = QByteArray(
+            "BEGIN:VCARD\r\n"
+            "VERSION:4.0\r\n"
+            "EMAIL:foo@kde.org\r\n");
+        expected += value
+            + QByteArray(
+                        ":https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+                        "N:;;;;\r\n"
+                        "UID:testuid\r\n"
+                        "END:VCARD\r\n\r\n");
+    } else {
+        expected = QByteArray(
+            "BEGIN:VCARD\r\n"
+            "VERSION:4.0\r\n");
+        expected += value
+            + QByteArray(
+                        ":https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+                        "EMAIL:foo@kde.org\r\n"
+                        "N:;;;;\r\n"
+                        "UID:testuid\r\n"
+                        "END:VCARD\r\n\r\n");
+    }
+
+    QCOMPARE(ba, expected);
+}
+
+void CalendarUrlTest::shouldGenerateVCardWithParameter()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    CalendarUrl url;
+    url.setType(CalendarUrl::CALUri);
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    url.setParams(params);
+    addr.insertCalendarUrl(url);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "CALURI;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void CalendarUrlTest::shouldNotGeneratedAttributeForVcard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    CalendarUrl url;
+    url.setType(CalendarUrl::CALUri);
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    url.setParams(params);
+    addr.insertCalendarUrl(url);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void CalendarUrlTest::shouldGenerateMultiCalendarUrl()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    CalendarUrl url;
+    url.setType(CalendarUrl::CALUri);
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    url.setParams(params);
+    addr.insertCalendarUrl(url);
+
+    url.setType(CalendarUrl::FBUrl);
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes2")));
+    params.clear();
+
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    url.setParams(params);
+    addr.insertCalendarUrl(url);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "CALURI;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "FBURL;FOO1=bla1,blo1:https://sherlockholmes.com/calendar/sherlockholmes2\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(CalendarUrlTest)
diff --git a/autotests/calendarurltest.h b/autotests/calendarurltest.h
new file mode 100644 (file)
index 0000000..2edb94d
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CALENDARURLTEST_H
+#define CALENDARURLTEST_H
+
+#include <QObject>
+
+class CalendarUrlTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit CalendarUrlTest(QObject *parent = nullptr);
+    ~CalendarUrlTest() override;
+
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualCalendarUrl();
+    void shouldParseCalendarUrl();
+    void shouldGenerateVCard_data();
+    void shouldGenerateVCard();
+    void shouldGenerateVCardWithParameter();
+    void shouldNotGeneratedAttributeForVcard3();
+    void shouldGenerateMultiCalendarUrl();
+};
+
+#endif // CALENDARURLTEST_H
diff --git a/autotests/clientpidmaptest.cpp b/autotests/clientpidmaptest.cpp
new file mode 100644 (file)
index 0000000..191fa03
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "clientpidmaptest.h"
+#include "clientpidmap.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+ClientPidMapTest::ClientPidMapTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+ClientPidMapTest::~ClientPidMapTest()
+{
+}
+
+void ClientPidMapTest::shouldHaveDefaultValue()
+{
+    KContacts::ClientPidMap role;
+    QVERIFY(!role.isValid());
+    QVERIFY(role.clientPidMap().isEmpty());
+    QVERIFY(role.params().empty());
+}
+
+void ClientPidMapTest::shouldAssignValue()
+{
+    const QString lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::ClientPidMap role(lang);
+    role.setParams(params);
+    QVERIFY(role.isValid());
+    QVERIFY(!role.clientPidMap().isEmpty());
+    QCOMPARE(role.clientPidMap(), lang);
+    QVERIFY(!role.params().empty());
+    QCOMPARE(role.params(), params);
+}
+
+void ClientPidMapTest::shouldAssignExternal()
+{
+    KContacts::ClientPidMap role;
+    const QString lang(QStringLiteral("fr"));
+    role.setClientPidMap(lang);
+    QVERIFY(role.isValid());
+    QCOMPARE(role.clientPidMap(), lang);
+}
+
+void ClientPidMapTest::shouldSerialized()
+{
+    KContacts::ClientPidMap role;
+    KContacts::ClientPidMap result;
+    const QString lang(QStringLiteral("fr"));
+    role.setClientPidMap(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    role.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << role;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(role == result);
+}
+
+void ClientPidMapTest::shouldEqualClientPidMap()
+{
+    KContacts::ClientPidMap role;
+    KContacts::ClientPidMap result;
+    const QString lang(QStringLiteral("fr"));
+    role.setClientPidMap(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    role.setParams(params);
+
+    result = role;
+    QVERIFY(role == result);
+}
+
+void ClientPidMapTest::shouldParseClientPidMap()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "CLIENTPIDMAP:boo\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).clientPidMapList().count(), 1);
+    QCOMPARE(lst.at(0).clientPidMapList().at(0).clientPidMap(), QStringLiteral("boo"));
+}
+
+void ClientPidMapTest::shouldParseWithoutClientPidMap()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).clientPidMapList().count(), 0);
+}
+
+void ClientPidMapTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ClientPidMap::List lstClientPidMap;
+    KContacts::ClientPidMap clientpidmap(QStringLiteral("fr"));
+    lstClientPidMap << clientpidmap;
+    addr.setClientPidMapList(lstClientPidMap);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "CLIENTPIDMAP:fr\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void ClientPidMapTest::shouldCreateVCardWithTwoClientPidMap()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ClientPidMap::List lstClientPidMap;
+    KContacts::ClientPidMap clientpidmap(QStringLiteral("fr"));
+    KContacts::ClientPidMap clientpidmap2(QStringLiteral("fr2"));
+    lstClientPidMap << clientpidmap << clientpidmap2;
+    addr.setClientPidMapList(lstClientPidMap);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "CLIENTPIDMAP:fr\r\n"
+        "CLIENTPIDMAP:fr2\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void ClientPidMapTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ClientPidMap::List lstClientPidMap;
+    KContacts::ClientPidMap clientpidmap(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    clientpidmap.setParams(params);
+    lstClientPidMap << clientpidmap;
+    addr.setClientPidMapList(lstClientPidMap);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "CLIENTPIDMAP;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void ClientPidMapTest::shouldGenerateClientPidMapForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ClientPidMap::List lstClientPidMap;
+    KContacts::ClientPidMap clientpidmap(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    clientpidmap.setParams(params);
+    lstClientPidMap << clientpidmap;
+    addr.setClientPidMapList(lstClientPidMap);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(ClientPidMapTest)
diff --git a/autotests/clientpidmaptest.h b/autotests/clientpidmaptest.h
new file mode 100644 (file)
index 0000000..1170218
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CLIENTPIDMAPTEST_H
+#define CLIENTPIDMAPTEST_H
+
+#include <QObject>
+
+class ClientPidMapTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ClientPidMapTest(QObject *parent = nullptr);
+    ~ClientPidMapTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualClientPidMap();
+    void shouldParseClientPidMap();
+    void shouldParseWithoutClientPidMap();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoClientPidMap();
+    void shouldCreateVCardWithParameters();
+    void shouldGenerateClientPidMapForVCard3();
+};
+
+#endif // CLIENTPIDMAPTEST_H
diff --git a/autotests/contactgrouptest.cpp b/autotests/contactgrouptest.cpp
new file mode 100644 (file)
index 0000000..ea77bef
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2008 Kevin Krammer <kevin.krammer@gmx.at>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QTest>
+
+#include "kcontacts/contactgroup.h"
+#include "kcontacts/contactgrouptool.h"
+
+#include <QBuffer>
+
+using namespace KContacts;
+
+class ContactGroupTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void contactGroupContactReference();
+    void contactGroupContactGroupReference();
+    void contactGroupData();
+    void contactGroup();
+    void testGroupRoundTrip();
+    void testGroupListRoundTrip();
+};
+
+QTEST_MAIN(ContactGroupTest)
+
+void ContactGroupTest::contactGroupContactReference()
+{
+    const QLatin1String uid("MyReferenceId");
+    const QLatin1String gid("GID");
+    const QLatin1String preferredEMail("tokoe@kde.org");
+    const QLatin1String customKey("MyCustomKey");
+    const QLatin1String customValue("MyCustomValue");
+
+    // uid test
+    {
+        ContactGroup::ContactReference ref(uid);
+        QCOMPARE(ref.uid(), uid);
+    }
+
+    // uid test
+    {
+        ContactGroup::ContactReference ref;
+        ref.setUid(uid);
+        QCOMPARE(ref.uid(), uid);
+    }
+
+    // preferredEmail test
+    {
+        ContactGroup::ContactReference ref(uid);
+        ref.setPreferredEmail(preferredEMail);
+        QCOMPARE(ref.preferredEmail(), preferredEMail);
+    }
+
+    // custom test
+    {
+        ContactGroup::ContactReference ref(uid);
+        ref.insertCustom(customKey, customValue);
+        QCOMPARE(ref.custom(customKey), customValue);
+        ref.removeCustom(customKey);
+        QCOMPARE(ref.custom(customKey), QString());
+    }
+
+    // assignment test
+    {
+        ContactGroup::ContactReference ref(uid);
+        ref.setGid(gid);
+        ref.setPreferredEmail(preferredEMail);
+        ref.insertCustom(customKey, customValue);
+
+        ContactGroup::ContactReference ref2(ref);
+        QCOMPARE(ref.uid(), ref2.uid());
+        QCOMPARE(ref.gid(), ref2.gid());
+        QCOMPARE(ref.preferredEmail(), ref2.preferredEmail());
+        QCOMPARE(ref.custom(customKey), ref2.custom(customKey));
+
+        QVERIFY(ref == ref2);
+    }
+
+    // const test
+    {
+        ContactGroup::ContactReference ref(uid);
+        ref.setPreferredEmail(preferredEMail);
+        ref.insertCustom(customKey, customValue);
+
+        const ContactGroup::ContactReference constRef(ref);
+        QCOMPARE(constRef.uid(), uid);
+        QCOMPARE(constRef.preferredEmail(), preferredEMail);
+        QCOMPARE(constRef.custom(customKey), customValue);
+        QVERIFY(constRef.gid().isEmpty());
+    }
+}
+
+void ContactGroupTest::contactGroupContactGroupReference()
+{
+    const QLatin1String uid("MyReferenceId");
+    const QLatin1String customKey("MyCustomKey");
+    const QLatin1String customValue("MyCustomValue");
+
+    // uid test
+    {
+        ContactGroup::ContactGroupReference ref(uid);
+        QCOMPARE(ref.uid(), uid);
+    }
+
+    // uid test
+    {
+        ContactGroup::ContactGroupReference ref;
+        ref.setUid(uid);
+        QCOMPARE(ref.uid(), uid);
+    }
+
+    // custom test
+    {
+        ContactGroup::ContactGroupReference ref(uid);
+        ref.insertCustom(customKey, customValue);
+        QCOMPARE(ref.custom(customKey), customValue);
+        ref.removeCustom(customKey);
+        QCOMPARE(ref.custom(customKey), QString());
+    }
+
+    // assignment test
+    {
+        ContactGroup::ContactGroupReference ref(uid);
+        ref.insertCustom(customKey, customValue);
+
+        ContactGroup::ContactGroupReference ref2(ref);
+        QCOMPARE(ref.uid(), ref2.uid());
+        QCOMPARE(ref.custom(customKey), ref2.custom(customKey));
+
+        QVERIFY(ref == ref2);
+    }
+
+    // const test
+    {
+        ContactGroup::ContactGroupReference ref(uid);
+        ref.insertCustom(customKey, customValue);
+
+        const ContactGroup::ContactGroupReference constRef(ref);
+        constRef.uid();
+        constRef.custom(customKey);
+    }
+}
+
+void ContactGroupTest::contactGroupData()
+{
+    const QLatin1String name("Tobias Koenig");
+    const QLatin1String email("tokoe@kde.org");
+    const QLatin1String customKey("MyCustomKey");
+    const QLatin1String customValue("MyCustomValue");
+
+    // name/email test
+    {
+        ContactGroup::Data data(name, email);
+        QCOMPARE(data.name(), name);
+        QCOMPARE(data.email(), email);
+    }
+
+    // name test
+    {
+        ContactGroup::Data data;
+        data.setName(name);
+        QCOMPARE(data.name(), name);
+    }
+
+    // email test
+    {
+        ContactGroup::Data data;
+        data.setEmail(email);
+        QCOMPARE(data.email(), email);
+    }
+
+    // custom test
+    {
+        ContactGroup::Data data(name, email);
+        data.insertCustom(customKey, customValue);
+        QCOMPARE(data.custom(customKey), customValue);
+        data.removeCustom(customKey);
+        QCOMPARE(data.custom(customKey), QString());
+    }
+
+    // assignment test
+    {
+        ContactGroup::Data data(name, email);
+        data.insertCustom(customKey, customValue);
+
+        ContactGroup::Data data2(data);
+        QCOMPARE(data.name(), data2.name());
+        QCOMPARE(data.email(), data2.email());
+        QCOMPARE(data.custom(customKey), data2.custom(customKey));
+
+        QVERIFY(data == data2);
+    }
+
+    // const test
+    {
+        ContactGroup::Data data(name, email);
+        data.insertCustom(customKey, customValue);
+
+        const ContactGroup::Data constData(data);
+        QCOMPARE(constData.name(), name);
+        QCOMPARE(constData.email(), email);
+        QCOMPARE(constData.custom(customKey), customValue);
+    }
+}
+
+void ContactGroupTest::contactGroup()
+{
+    const QLatin1String groupName("MyGroupName");
+    const QLatin1String groupId("MyGroupID");
+    const QLatin1String name("Tobias Koenig");
+    const QLatin1String email("tokoe@kde.org");
+    const QLatin1String uid("MyUid");
+
+    // name test
+    {
+        ContactGroup group(groupName);
+        QCOMPARE(group.name(), groupName);
+    }
+
+    // id test
+    {
+        ContactGroup group(groupName);
+        group.setId(groupId);
+        QCOMPARE(group.id(), groupId);
+    }
+
+    // contact reference test
+    {
+        ContactGroup group(groupName);
+        QCOMPARE(group.contactReferenceCount(), (unsigned int)0);
+
+        ContactGroup::ContactReference ref(uid);
+        ref.setPreferredEmail(email);
+
+        group.append(ref);
+        QCOMPARE(group.contactReferenceCount(), (unsigned int)1);
+
+        const ContactGroup::ContactReference ref2 = group.contactReference(0);
+        QCOMPARE(ref, ref2);
+
+        group.remove(ref);
+        QCOMPARE(group.contactReferenceCount(), (unsigned int)0);
+    }
+
+    // contact group reference test
+    {
+        ContactGroup group(groupName);
+        QCOMPARE(group.contactGroupReferenceCount(), (unsigned int)0);
+
+        ContactGroup::ContactGroupReference ref(uid);
+
+        group.append(ref);
+        QCOMPARE(group.contactGroupReferenceCount(), (unsigned int)1);
+
+        const ContactGroup::ContactGroupReference ref2 = group.contactGroupReference(0);
+        QCOMPARE(ref, ref2);
+
+        group.remove(ref);
+        QCOMPARE(group.contactGroupReferenceCount(), (unsigned int)0);
+    }
+
+    // data test
+    {
+        ContactGroup group(groupName);
+        QCOMPARE(group.dataCount(), (unsigned int)0);
+
+        ContactGroup::Data data(name, email);
+
+        group.append(data);
+        QCOMPARE(group.dataCount(), (unsigned int)1);
+
+        const ContactGroup::Data data2 = group.data(0);
+        QCOMPARE(data, data2);
+
+        group.remove(data);
+        QCOMPARE(group.dataCount(), (unsigned int)0);
+    }
+
+    // mimetype test
+    {
+        ContactGroup group(groupName);
+        QCOMPARE(group.mimeType(), QLatin1String("application/x-vnd.kde.contactgroup"));
+    }
+}
+
+void ContactGroupTest::testGroupRoundTrip()
+{
+    // TODO should also test empty group
+
+    ContactGroup group(QLatin1String("TestGroup"));
+    group.append(ContactGroup::ContactReference(QLatin1String("Xggdjetw")));
+    ContactGroup::ContactReference gidReference;
+    gidReference.setGid(QLatin1String("gid"));
+    group.append(gidReference);
+    group.append(ContactGroup::ContactGroupReference(QLatin1String("aaXggdjetw")));
+    group.append(ContactGroup::Data(QLatin1String("Tobias Koenig"), QLatin1String("tokoe@kde.org")));
+    group.append(ContactGroup::Data(QLatin1String("Kevin Krammer"), QLatin1String("kevin.krammer@gmx.at")));
+
+    QBuffer buffer;
+    buffer.open(QIODevice::WriteOnly);
+
+    QString errorMessage;
+    bool result = ContactGroupTool::convertToXml(group, &buffer, &errorMessage);
+
+    QVERIFY(result);
+    QVERIFY(errorMessage.isEmpty());
+    buffer.close();
+    QVERIFY(buffer.size() > 0);
+    buffer.open(QIODevice::ReadOnly);
+
+    ContactGroup group2;
+    result = ContactGroupTool::convertFromXml(&buffer, group2, &errorMessage);
+    QVERIFY(result);
+    QVERIFY(errorMessage.isEmpty());
+    QCOMPARE(group, group2);
+}
+
+void ContactGroupTest::testGroupListRoundTrip()
+{
+    // TODO should also test empty list
+
+    ContactGroup::List list;
+
+    ContactGroup group1(QLatin1String("TestGroup1"));
+    group1.append(ContactGroup::ContactReference(QLatin1String("Xggdjetw")));
+    group1.append(ContactGroup::Data(QLatin1String("Tobias Koenig"), QLatin1String("tokoe@kde.org")));
+    group1.append(ContactGroup::Data(QLatin1String("Kevin Krammer"), QLatin1String("kevin.krammer@gmx.at")));
+
+    list.append(group1);
+
+    ContactGroup group2(QLatin1String("TestGroup2"));
+    group2.append(ContactGroup::ContactReference(QLatin1String("Xggdjetw")));
+    group2.append(ContactGroup::Data(QLatin1String("Tobias Koenig"), QLatin1String("tokoe@kde.org")));
+    group2.append(ContactGroup::Data(QLatin1String("Kevin Krammer"), QLatin1String("kevin.krammer@gmx.at")));
+
+    list.append(group2);
+
+    QBuffer buffer;
+    buffer.open(QIODevice::WriteOnly);
+
+    QString errorMessage;
+    bool result = ContactGroupTool::convertToXml(list, &buffer, &errorMessage);
+
+    QVERIFY(result);
+    QVERIFY(errorMessage.isEmpty());
+    buffer.close();
+    QVERIFY(buffer.size() > 0);
+
+    buffer.open(QIODevice::ReadOnly);
+
+    ContactGroup::List list2;
+    result = ContactGroupTool::convertFromXml(&buffer, list2, &errorMessage);
+    QVERIFY(result);
+    QVERIFY(errorMessage.isEmpty());
+    QVERIFY(list2.size() == 2);
+    QCOMPARE(list2[0], group1);
+    QCOMPARE(list2[1], group2);
+}
+
+#include "contactgrouptest.moc"
diff --git a/autotests/customidentifiertest.cpp b/autotests/customidentifiertest.cpp
new file mode 100644 (file)
index 0000000..f4b4412
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "customidentifiertest.h"
+#include "addressee.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+CustomIdentifierTest::CustomIdentifierTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+CustomIdentifierTest::~CustomIdentifierTest()
+{
+}
+
+void CustomIdentifierTest::shouldHaveEmptyCustoms()
+{
+    KContacts::Addressee addresseeWithMail;
+    addresseeWithMail.addEmail(QStringLiteral("foo@bar.org"));
+    QVERIFY(!addresseeWithMail.isEmpty());
+    QVERIFY(addresseeWithMail.customs().isEmpty());
+}
+
+void CustomIdentifierTest::shouldExportVcard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-SpousesName"), QStringLiteral("foo"));
+    lst << addr;
+    KContacts::VCardTool vcard;
+    QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "X-KADDRESSBOOK-X-SpousesName:foo\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+
+    addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-ANNIVERSARY"), QStringLiteral("19960415"));
+    lst.clear();
+    lst << addr;
+    ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "X-KADDRESSBOOK-X-ANNIVERSARY:19960415\r\n"
+        "X-KADDRESSBOOK-X-SpousesName:foo\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void CustomIdentifierTest::shouldExportVcard4()
+{
+    // TODO don't work to export custom!
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-SpousesName"), QStringLiteral("foo"));
+    lst << addr;
+    KContacts::VCardTool vcard;
+    QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "RELATED;TYPE=spouse;VALUE=foo:;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+
+    QDate dt(12, 9, 3);
+    addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-ANNIVERSARY"), dt.toString(Qt::ISODate));
+    lst.clear();
+    lst << addr;
+    ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "ANNIVERSARY:00120903\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "RELATED;TYPE=spouse;VALUE=foo:;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(CustomIdentifierTest)
diff --git a/autotests/customidentifiertest.h b/autotests/customidentifiertest.h
new file mode 100644 (file)
index 0000000..3822d79
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CUSTOMIDENTIFIERTEST_H
+#define CUSTOMIDENTIFIERTEST_H
+
+#include <QObject>
+
+class CustomIdentifierTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit CustomIdentifierTest(QObject *parent = nullptr);
+    ~CustomIdentifierTest() override;
+
+private Q_SLOTS:
+    void shouldExportVcard4();
+    void shouldHaveEmptyCustoms();
+    void shouldExportVcard3();
+};
+
+#endif // CUSTOMIDENTIFIERTEST_H
diff --git a/autotests/data/testfullvcard.vcf b/autotests/data/testfullvcard.vcf
new file mode 100644 (file)
index 0000000..466d7e6
--- /dev/null
@@ -0,0 +1,33 @@
+BEGIN:VCARD
+VERSION:4.0
+FN:Sherlock Holmes
+TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+44-555-555-5555;ext=5555
+TEL;VALUE=uri;TYPE="voice,cell,text":tel:+44-555-555-6666
+TEL;VALUE=uri;TYPE="voice,work":tel:+44-555-555-7777
+N:Holmes;Sherlock;;Mr;;
+KIND:individual
+NICKNAME:Shirley
+PHOTO:
+BDAY:19531015T231000Z
+ANNIVERSARY:19960415
+GENDER:M
+ADR;GEO="geo:51.5237,0.1585";LABEL="Mr Sherlock Holmes, 221B Baker Street, London NW1, England, United Kingdom":;;221B Baker Street;London;;NW1;United Kingdom
+EMAIL;TYPE=home:sherlock.holmes@gmail.com
+EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com
+IMPP;PREF=1:xmpp:detective@sherlockholmes.com
+LANG;TYPE=work;PREF=1:en
+LANG;TYPE=work;PREF=2:fr
+TZ:London/Europe
+GEO:geo:51.5237,0.1585
+TITLE:Detective
+ROLE:Detective
+UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
+CATEGORIES:FICTION,LITERATURE
+PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN
+REV:2014722T222710Z
+URL:https://sherlockholmes.com
+KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holmes.pub.asc
+CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes
+FBURL;PREF=1:https://sherlockholmes.com/busy/detective
+CALADRURI;PREF=1:mailto:detective@sherlockholmes.com
+END:VCARD
diff --git a/autotests/data/testfullvcard.vcf.ref b/autotests/data/testfullvcard.vcf.ref
new file mode 100644 (file)
index 0000000..466d7e6
--- /dev/null
@@ -0,0 +1,33 @@
+BEGIN:VCARD
+VERSION:4.0
+FN:Sherlock Holmes
+TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+44-555-555-5555;ext=5555
+TEL;VALUE=uri;TYPE="voice,cell,text":tel:+44-555-555-6666
+TEL;VALUE=uri;TYPE="voice,work":tel:+44-555-555-7777
+N:Holmes;Sherlock;;Mr;;
+KIND:individual
+NICKNAME:Shirley
+PHOTO:
+BDAY:19531015T231000Z
+ANNIVERSARY:19960415
+GENDER:M
+ADR;GEO="geo:51.5237,0.1585";LABEL="Mr Sherlock Holmes, 221B Baker Street, London NW1, England, United Kingdom":;;221B Baker Street;London;;NW1;United Kingdom
+EMAIL;TYPE=home:sherlock.holmes@gmail.com
+EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com
+IMPP;PREF=1:xmpp:detective@sherlockholmes.com
+LANG;TYPE=work;PREF=1:en
+LANG;TYPE=work;PREF=2:fr
+TZ:London/Europe
+GEO:geo:51.5237,0.1585
+TITLE:Detective
+ROLE:Detective
+UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
+CATEGORIES:FICTION,LITERATURE
+PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN
+REV:2014722T222710Z
+URL:https://sherlockholmes.com
+KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holmes.pub.asc
+CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes
+FBURL;PREF=1:https://sherlockholmes.com/busy/detective
+CALADRURI;PREF=1:mailto:detective@sherlockholmes.com
+END:VCARD
diff --git a/autotests/data/v4_0.vcard1.vcf.ref b/autotests/data/v4_0.vcard1.vcf.ref
new file mode 100644 (file)
index 0000000..41030ef
--- /dev/null
@@ -0,0 +1,15 @@
+BEGIN:VCARD
+VERSION:4.0
+ADR;TYPE=parcel;TYPE=postal;TYPE=work:;;6544 Battleford Drive;Raleigh;NC;27
+ 613-3502;U.S.A.
+EMAIL;TYPE=PREF:Frank_Dawson@Lotus.com
+EMAIL:fdawson@earthlink.net
+FN:Frank Dawson
+N:;;;;
+ORG:Lotus Development Corporation
+TEL;TYPE=MSG;TYPE=VOICE;TYPE=WORK:+1-919-676-9515
+TEL;TYPE=FAX;TYPE=WORK:+1-919-676-9564
+UID:gDVbA6LY3t
+URL:http://home.earthlink.net/~fdawson
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard2.vcf.ref b/autotests/data/v4_0.vcard2.vcf.ref
new file mode 100644 (file)
index 0000000..446da45
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:4.0
+ADR;TYPE=work:;;501 E. Middlefield Rd.;Mountain View;CA; 94043;U.S.A.
+EMAIL:howes@netscape.com
+FN:Tim Howes
+N:;;;;
+ORG:Netscape Communications Corp.
+TEL;TYPE=MSG;TYPE=VOICE;TYPE=WORK:+1-415-937-3419
+TEL;TYPE=FAX;TYPE=WORK:+1-415-528-4164
+UID:1UgvYejJMs
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard3.vcf.ref b/autotests/data/v4_0.vcard3.vcf.ref
new file mode 100644 (file)
index 0000000..b91a5d7
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+VERSION:4.0
+EMAIL:geiseri@yahoo.com
+FN:ian geiser
+N:geiser;ian;;;
+ORG:Source eXtreme
+TITLE:VP of Engineering
+UID:ebvq9Wo9rO
+X-mozilla-cpt:;0
+X-mozilla-html:FALSE
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard4.vcf.ref b/autotests/data/v4_0.vcard4.vcf.ref
new file mode 100644 (file)
index 0000000..5e628d3
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD
+VERSION:4.0
+EMAIL:hello@ximian.com
+FN:
+LABEL;TYPE=work:401 Park Drive  3 West\nBoston\, MA 02215\nUSA
+NOTE:Welcome to the Ximian Addressbook.
+ORG:Ximian\, Inc.
+TEL;TYPE=VOICE;TYPE=WORK:(617) 236-0442
+TEL;TYPE=FAX;TYPE=WORK:(617) 236-8630
+UID:pas-id-3E136F9B00000000
+URL:www.ximian.com/
+X-EVOLUTION-FILE-AS:Ximian\, Inc.
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard5.vcf.ref b/autotests/data/v4_0.vcard5.vcf.ref
new file mode 100644 (file)
index 0000000..10f6749
--- /dev/null
@@ -0,0 +1,313 @@
+BEGIN:VCARD
+VERSION:4.0
+ADR;TYPE=home;TYPE=pref:;;Buehlauer Strasse 45;Dresden;Sachsen;01327;German
+ y
+ADR;TYPE=work:;;Prager Strasse 55;Dresden;Sachsen;01066;Germany
+BDAY:1955-07-19T00:00:00Z
+CATEGORIES:Friend
+CLASS:CONFIDENTIAL
+EMAIL;TYPE=PREF:heiko.mustermann@freenet.org
+EMAIL:heiko8@tst.inf.tu-dresden.de
+FN:Mustermann\, Heiko
+GEO:19.283333;166.616669
+LOGO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVU
+ AAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7aC
+ YMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k27
+ EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7DT
+ 7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACpV
+ sZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSgA
+ A15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlRL
+ vEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrLc
+ 9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgBM
+ vSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMPs
+ P7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gvq
+ NSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL5
+ 4WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kvy
+ d0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jyb
+ kfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq7
+ aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0omA
+ ACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy3
+ w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw0
+ 9IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQO
+ crOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6z
+ E+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO+
+ OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuDa
+ ANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbij
+ o19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGtV
+ X2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB6
+ 79OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaPm
+ 8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqici
+ biYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2aT
+ JtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYIl
+ x36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30u
+ OQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAUL
+ hYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6Y
+ nf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVOH
+ QzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44M
+ d3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhRi
+ Il23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGGY
+ UmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK6
+ YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXsv
+ GGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS5
+ 8CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN8
+ IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430w
+ D2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiXj
+ oGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxojd
+ ympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxpB
+ KXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3EmuF
+ VcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dtQ
+ 3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDgU
+ Ohz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe+
+ a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOms
+ tFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5efV
+ 1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4U
+ VCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo+
+ swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR0
+ 0bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6X
+ bktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLUJ
+ wH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5K
+ 1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQxG
+ MSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCmo
+ HLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYjG
+ VIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9GphG
+ WIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJuH
+ NGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZW
+ BOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHFc
+ WWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFFq
+ xh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMWV
+ 8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGWJ
+ xczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC
+N:Mustermann;Heiko;;;
+NICKNAME:clown
+NOTE:I'm a friendly note text\,\nplease copy me to your address book...
+ORG:KDE
+PHOTO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pV
+ UAAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7a
+ CYMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k2
+ 7EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7D
+ T7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACp
+ VsZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSg
+ AA15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlR
+ LvEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrL
+ c9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgB
+ MvSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMP
+ sP7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gv
+ qNSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL
+ 54WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kv
+ yd0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jy
+ bkfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq
+ 7aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0om
+ AACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy
+ 3w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw
+ 09IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQ
+ OcrOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6
+ zE+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO
+ +OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuD
+ aANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbi
+ jo19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGt
+ VX2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB
+ 679OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaP
+ m8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqic
+ ibiYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2a
+ TJtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYI
+ lx36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30
+ uOQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAU
+ LhYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6
+ Ynf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVO
+ HQzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44
+ Md3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhR
+ iIl23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGG
+ YUmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK
+ 6YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXs
+ vGGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS
+ 58CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN
+ 8IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430
+ wD2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiX
+ joGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxoj
+ dympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxp
+ BKXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3Emu
+ FVcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dt
+ Q3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDg
+ UOhz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe
+ +a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOm
+ stFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5ef
+ V1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4
+ UVCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo
+ +swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR
+ 00bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6
+ XbktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLU
+ JwH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5
+ K1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQx
+ GMSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCm
+ oHLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYj
+ GVIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9Gph
+ GWIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJu
+ HNGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZ
+ WBOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHF
+ cWWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFF
+ qxh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMW
+ V8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGW
+ JxczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC
+ROLE:Developer
+SOUND;ENCODING=b:UklGRiQgAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAgAA
+ B/f39/f39/f39/f39/f4B/gH+Af4CAgIGBgYGBgYGBgYGBgYGBgYGBgIGAgICBgYGBgYGBgYCAg
+ YGAgICAgICAgIGBgICAgYCAgICBgICAgICAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAf4CAgICAgICAgICAgICAgIB/f4CAgICAgICAgIB/f4B/f39/f39/f3+AgICAf4CAf3
+ 9/gIB/f4CAgH9/gICAgH+AgICAgICAgICAf4CAgIB/gICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgIB/gICAf39/f39/f3+Af4CAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgH9/f39/f39/f39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYCAgICB
+ gICAgYGBgICAgICAgICAgIGAgICBgICBgYGBgYGBgYGAgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYG
+ BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgYGBgIGBgYGAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgH+AgICAgICAgICAgICAgICAgICAf4CAgIB/gH+Af4B/f39/f39/f
+ 39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYG
+ BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY
+ GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAgIGBgYCAgICBgYCAgYGBgYCAgICBg
+ YCAgICAgICAgICAgICAgIGAgICAgICAgICAgICAgYGBgYGAgICAgIGBgYCAgICBgYGAgICAgIGA
+ gICAgICAgIGBgYCBgYGAgYGBgYGBgoGBgYGCgoGAgICBgYGBgYCBgYKCgYGBgYGBgYGAgYGBgH9
+ /gIB/f3+AgIB/gH9/gICAf4CBgYB/f35+gIB/f4CBgX9/gYCAgYKCgYCAgYOBgICAgoGAf4GCgn
+ 9/gIB/gICBgH5/f4GAfX+BgYB+fn9/fn+Afn6Af39+f35+fn9+fn6AgH9/f4CAgYCAgYKCgH9/g
+ IKBf3+AgYJ/f4GCg4F/gIGCgoOBfoCDgYF/fH+BgYGAfn6Af4CCgn58gIN/fX+AgICBgYGAgYCB
+ goOCgICBgYB/fXyBhIGAgH5+f4GBgX9/f35+gIKCgXt9goN/f318f4GAf4B/fHt9fn5+fXx+fn5
+ /gH9+fHx/gHx9f4CAfn18gIB9e4GBfn5+foCBfHyAgoGAfX6CgYCBgH+DgHt9gYN/fX2BhYB7en
+ 6AgH98foKCgH18foCAfoCAf4CAf31+fn+AgH1+goJ/fX5/gIKAgIGAfH6CgX17foCBf3+BgoB/g
+ YOBgIB/f4KDgoJ+e3+ChIOBfn1/gX+BfX2BgH59foCCfn1/gX99fICAgoB/f39/gISCf36AgoSB
+ foCBgYGAf4CCf4CCgX5/gYKDgYB/gH+BhIOBgYB/gIOEhIF9foGCg4OBgICBgoOCgICChIOBg4O
+ CgoSDgoKAgYKBgoODhISBf4CCg4SEgoGCg4SEgH6BhIWEgX+EhYKAgoKFhIB+gIKChYKAgYOCgo
+ B+gYWFhIKAg4WEg4ODhIWFhYaGhIWGhYWGh4eHhYOCgoSFg4B/gIB+fX1+fn57e3t7fHt6fH5/f
+ 4GDhYiMkJGQj5GVmZycmZiXlZGIfXRwcnZ4d3Nva2hoamppaWxvc3R0dXl+iJCPjZShqrCzvNHi
+ rFYxOmKSrJ6UmJOAbV1ZboSMjI6JfnNjW2JweYGFg4B/e3Z0c3Btc3p9fHp4fIGBf3+Dh4qLjJG
+ YnZuWkY6MhnpwbnN6fHlya2hlZmdmaW9ycXFzd3t/g42cpquzvMzd/sRADiBZkL6xpLa1jFpANV
+ iHoJ2ioJWGbEQ2VHaOm5aHhIFuYmZzgoVxZFxfdJCSgnt/kKewr7bDsopcSV6JopyRjpOQfmNXZ
+ HmGhYB8fXtvXExKXnyKgnJsc3t8fZC0ysfK0+vHTxEeXY6yr6rAxJRSNTdbh5+fp7KjglQ6PVx3
+ ho6Ph3dmW15oa2x0hIuNkK3R18jJ0Ys8LUlxkqais8WtdlBFT2yDjpywro9mS0VVaXaBiIdyX2J
+ rcG5udYKKjaXT4dfV2Y82JkBpiaKkvdO2eE9GTGZ4hZu6u51yTUNOX2l9kZWKdl5PXG93dHeAip
+ KZut7j2tacRjJIYHCOo77XvoRdVlFYZniVuL+kfl9ST1Rcb4mTjoNxW1pqdXd5fH6CiKHN4d7k2
+ 4E4N05Yaoqo1eO0emVbTU5ZdKDCuZV9b1tMSVlyiYp8dHl7cmpqdYCCgIqixNTR2OqnRTlPXFt3
+ ksbnw4lzcFdKS2KMtLWZiIZwV0lPZXZ1b3uNinZqbXJ3dX2XxOPg4/zDUDRCTUhmiMXx1p+If1g
+ +O1J7pK+yspN3W0pGVGdugYmCen54b21rb3V9i6vZ7vD92WpAS0gzSny04tq3qp5qPDhHX3uVrs
+ KukXVhT0hRYnF/gnuCh31ubG9zdHeMs+Dr8P7KalFVOylJeq7QzMPIqmtIRUZOY4KovqicknhZS
+ 1BWXWh6gIeLiH91b21vc4GcyuXt/umTZGhGIjJfh6y+yt7LkGlfTD1GYYOipKKwnXhkXldVUFhs
+ dYOMjYWBem9ucoCWvNTm9+2weHdZMSpQboujvtnUrY6BZEdDUmV4jZypppeFd2dcWVFWWWh8hYS
+ Ii393c3Z7iJ3A1ePp3aGDfVYyOVZkfJe5zsavpJNsU1BTVmR9kpmcn5uGdGxoWU5VVGZ0fIKLh4
+ F/d3Z6g4ufuc3e3depjoViPz9VWm2FqLu8tLGifmphWlJZbH+Lj5+elod+c19WU0xUZW11gISEg
+ nx6e3h6g4qWp7zM3NrSpZGIYkRFVVVlfZ6vsbW3qIl7b2BUWGVwe4ybn52TkIRuX2BVRVFjZmp7
+ hIF9fX12cnZ6eX6LlZyousfP0c++jot6X0ZRXF9sgaCnqa6yn4eAdGZZYGlvd4mcnqCWnY91aWN
+ cSUtYYmJxf399f351cXFzcHF4foOIlZ+hp7CytLm8uLKNg4RtYF5oanN8j5qZnqGaioV9dGpqb3
+ J1f42Rk5iZjIKAcmFcW1RXYGhwdXt+e3Z2c25tcXJxd3yChY2Tl5udn6Gho6ioq6uonoaHbWNzZ
+ GdxgoGPlZqdj5CJgHFzcWxwdH1/hYqOioSFfnFpaWBdX2Jqb3N5fHh4eHNxcXFxc3d7foOJjI6Q
+ lZOSlZOTl5eYnJucnpyZkYiEfnd1dnZ5fYKHio6QkIyHg394dHRzc3Z5fHt2enJrcG5obG9sbW9
+ ucHJzdnh3eXp5eXt9foCDhoeJjI6OkJGSk5aYmZudn6Gjn5qLh4J3cnJ0dHR5g4GEi42Ih4aBfH
+ h4dXR1eHl4dXhuaW5rZ2ltaWttbW5vcnR1dHZ2dXV2d3d7fn+BhIeIiYuOjpCTlJWZnJueoKarr
+ ZuJhntvaW1ucnh+hIWJi4qFg4F7d3V1c3R3fH1/gHlvbXJnXmdpYmdtamtxcW9vbm9tamxtbG5z
+ dXZ5fHx7fX9+fH6AgoWHioyNj5CRlZeYmp2TiYyGenp9eXh9fX19foB/fH1/e3p8e3l5e3x7e3x
+ 6d3FxcnBwcG9vb29vb29wb25tbWxsbW5vb3Fyc3N1dXV1dnd4ent9fn+BgoGAgoWEhoqJiYyLi4
+ yPioaLiYSEh4WDhIOCgoKAgX58fXx5eXp4eHl4dXZ1cnN0dHR1cnJycXBxcnJycW9ubGxsbW1ub
+ m5ub29vcXNzdHZ2dXh6enp+fn5/gYCBhIKFiYeGiomJi4qKjIuLjIyLiomKh4aKioeIiIWDgYB9
+ fHx7e3l4eHh2dnd3d3l7enp6enp5ent7e3x7enl6e3t7fHx7e3p8fX5/gIKDg4GCg4KCg4OEhoe
+ Hh4iJiomLjIqLi4uLi46Pjo2OjouJiomHh4aDgH9/fXp5eXh3d3h4eHh4d3V2d3Z0dnd0dXd3d3
+ p7fH59fX19fH5+fn+Af4CAf3+Af359f4KDgoSIiIeJjI6PkJOUk5SYmZiYmZqZmJqamJiZmJaWl
+ ZSTkZCQj46Ni4qHh4iFgoKBfn9+fn+AgYCAgYOCgoSEg4SFhIODg4OCgICBf35/gICAgYKCgYGD
+ hIOBgYOCgYGAgIGBgIGCgoKBgoSEg4KCgH9/f318fHt6e3t7enl5eHh5fH18foCAf4GDg4OFhoa
+ GhoeJh4aJioiIiYiIhoWGh4aGh4eHiImHh4mIiIeHh4iIiIqJioqJh4mKh4eJiYiHh4eHhoWGhY
+ OEhYWEhYWDg4SFhYWEg4SDgYKCgH+AgICBgoOCgYGBgYKEhoaGhoiIh4eJiYmKioqKiomKioiJi
+ oqJiYmJiIiIiYiHh4eHh4eGhYWFhISDgoKCgoKCgYGAf31+fXx9fn58e3x8fHx9fX19fX19fX19
+ fHx9fn5/gICBgYGCgoKCg4OCgoODgoKDg4OCgoKCgoGBgYGBgYGCgYCBgIGCgoKDg4KCg4OEhIS
+ FhYWFhYWFhYWFhoWGhoWEhISDg4ODg4ODg4ODg4SDgoKDg4OCg4SDgoKDgoGBgoGAgIB/f35+fn
+ 9+fn9/f35+fn5/gICAgIGBgYKCg4ODg4SEg4OEhIODhIODhIODg4ODg4OCgoKBgoKCg4OCgoODg
+ 4ODg4OEhISEhIWEhIWFhISEhISEhIWEhISEhIODhISEg4ODg4ODg4ODg4ODgoKCgoKCg4KCgoKC
+ goKCgoKCgoOCgoKCgoKBgYKCgoKCgoGBgYGAgICAgYGBgYCAf39/f39/f3+Af39/f39/f39/gIC
+ AgIB/f39/f39/gICAgIB/f39/gIB/f39/gH9/f39/f39/fn5+f39/f39/fn5+fn5/f39/f39/fn
+ 5+fn9/f39/f35+fn5+fn9/f35/f39+fn5+fn9/fn5+fn5+fn5+f39+fn5+fn19fX5+fn5+fn5+f
+ X5+fn5+fn5+fn19fn5+fn5+fX19fX59fn5+fn19fX19fX1+fX19fX19fX19fX19fX19fX19fX19
+ fX19fX19fX19fX19fX19fX19fX19fX19fXx9fX18fH19fXx8fXx9fXx8fHx8fHx8fH19fX19fXx
+ 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX
+ 19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
+ X19fX19fX19fX19fX19fX19fX19fX19fX1+fX5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
+ fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f
+ 39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/
+ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f35+fn5+f35/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+f
+ 39+fn5/fn5+f39/fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/
+ f39/f39/f39/f39/f39+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f4CAf39/f39/f39/gIB/f39/f39/f4B/f4CAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgIB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgIGBgYGAgYGBgICAgIGAgICBgYGAgYGBgYGBgYGBgYGBgY
+ GBgYGBgYGBgYGBgYGBgYGAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf39/gH9/f
+ 3+Af39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4CAgH9/gIB/f39/f4B/f3+AgICAf4CA
+ gICAgICAgICAgICAgH9/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgIB/f39/f39/f39/f4CAf39/f39/f39/f39/f39/f39+fn
+ 9/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fn5+fn5+fn9/f39/f4CAgICAgICBgYGBg
+ YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgYGAgICA
+ gICAgICAgICAgICBgYGAgICAgICAgICAgICAgICAgICAgICAgIB/gICAgH9/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgICAf39/f39/gH+AgI
+ CAgICAgIB/f39/f39/f4B/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn9/f39/f39/f39+f
+ 39/f39/f39/f39/f39/f39/f39/f4B/f4CAgICAf39/f39/gICAf39/gICAgICAgICAgICAgICA
+ gICAgIGAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICBgYGBgYGBgYCBgYGBgYCAgIG
+ BgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAf3+AgIB/f4CAf39/f39/f3+AgICAgH+AgICAf3+AgICAgICAgH9/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/gH9/gICAgICAgICAgIB/gICAgH+AgIB/f39/f39/gICAgICAgH9/f3+AgH9/f4B/f
+ 39/f39/f39/f39/f3+AgICAgICAf3+AgIB/f4CAgIB/f4CAgICAgICAgICAf39/f3+AgIB/f4CA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf39/f39
+ /f4CAgH9/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/gIB/f39/f39/f39/gH9/f3
+ 9/f4CAgICAgIB/gICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf4CAgICAgICAgIB/gICAf
+ 4CAgICAgH+Af4CAgH9/f39/f39/f39/gICAgICAgICAgICAf39/f39/f4CAgH9/gICAf3+AgICA
+ gICAgICAgICAgICAgICAgICAgIB/f39/gIB/f4CAgIB/f4CAgH9/gICAf39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAf39/gH9/f3+AgH9/f39/f39/f39/f39/f
+ 39/f39/f39/f39/f39/f39/f39/gICAf3+AgH9/f3+AgH9/f4CAgH9/gICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICBgYGBgIGBgYCAgYGAgICAgYCAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAf39/f39/f4CAgIB/f4CAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAf39/f3+Af39/f39/f39/f4B/f39/f4CAgICAgICAgICAgA==
+TEL;TYPE=HOME:0351 223344
+TEL;TYPE=WORK:0351 443322
+TEL;TYPE=CELL:0173 223344
+UID:P9HXg34Oav
+URL:http://www.mustermann.de/~heiko/
+X-KADDRESSBOOK-X-Anniversary:1982-07-07
+X-KADDRESSBOOK-X-AssistantsName:Mr. Smithers
+X-KADDRESSBOOK-X-Department:Edutainment
+X-KADDRESSBOOK-X-IMAddress:122334455
+X-KADDRESSBOOK-X-ManagersName:Mr. Burnes
+X-KADDRESSBOOK-X-Office:223 2nd stage
+X-KADDRESSBOOK-X-Profession:Clown
+X-KADDRESSBOOK-X-SpousesName:femal clown
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard6.vcf.ref b/autotests/data/v4_0.vcard6.vcf.ref
new file mode 100644 (file)
index 0000000..80622a6
--- /dev/null
@@ -0,0 +1,10 @@
+BEGIN:VCARD
+VERSION:4.0
+CLASS:PUBLIC
+EMAIL;TYPE=PREF:email1@abc.de
+EMAIL:email2@abc.de
+FN:Test User
+N:User;Test;;;
+UID:uJTkVqH5Qt
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard7.vcf.ref b/autotests/data/v4_0.vcard7.vcf.ref
new file mode 100644 (file)
index 0000000..64ff743
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:4.0
+FN:
+LABEL;TYPE=work:401 Park Drive  3 West\nBoston\, MA 02215\nUSA\nHerecomesye
+ tanotherline
+UID:pas-id-3E136F9B00000000
+END:VCARD
+
diff --git a/autotests/data/v4_0.vcard8.vcf.ref b/autotests/data/v4_0.vcard8.vcf.ref
new file mode 100644 (file)
index 0000000..55bf303
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN:VCARD
+VERSION:4.0
+FN:test
+N:test;;;;
+NOTE:line one\nline two\nline three\n
+UID:8OD165Pope
+END:VCARD
+
diff --git a/autotests/data/vcard1.vcf b/autotests/data/vcard1.vcf
new file mode 100644 (file)
index 0000000..da4613e
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:vCard
+VERSION:3.0
+UID:gDVbA6LY3t
+FN:Frank Dawson
+ORG:Lotus Development Corporation
+ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive
+ ;Raleigh;NC;27613-3502;U.S.A.
+TEL;TYPE=VOICE,MSG,WORK:+1-919-676-9515
+TEL;TYPE=FAX,WORK:+1-919-676-9564
+EMAIL;TYPE=INTERNET,PREF:Frank_Dawson@Lotus.com
+EMAIL;TYPE=INTERNET:fdawson@earthlink.net
+URL:http://home.earthlink.net/~fdawson
+END:vCard
+
diff --git a/autotests/data/vcard1.vcf.2_1ref b/autotests/data/vcard1.vcf.2_1ref
new file mode 100644 (file)
index 0000000..08ede3e
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+ADR;PARCEL;POSTAL;WORK:;;6544 Battleford Drive;Raleigh;NC;27613-3502;U.S.A.\r
+EMAIL;INTERNET;PREF:Frank_Dawson@Lotus.com\r
+EMAIL;INTERNET:fdawson@earthlink.net\r
+FN:Frank Dawson\r
+N:;;;;\r
+ORG:Lotus Development Corporation\r
+TEL;MSG;VOICE;WORK:+1-919-676-9515\r
+TEL;FAX;WORK:+1-919-676-9564\r
+UID:gDVbA6LY3t\r
+URL:http://home.earthlink.net/~fdawson\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard1.vcf.ref b/autotests/data/vcard1.vcf.ref
new file mode 100644 (file)
index 0000000..038cb5f
--- /dev/null
@@ -0,0 +1,15 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=parcel,postal,work:;;6544 Battleford Drive;Raleigh;NC;27613-3502;U\r
+ .S.A.\r
+EMAIL;TYPE=INTERNET,PREF:Frank_Dawson@Lotus.com\r
+EMAIL;TYPE=INTERNET:fdawson@earthlink.net\r
+FN:Frank Dawson\r
+N:;;;;\r
+ORG:Lotus Development Corporation\r
+TEL;TYPE=MSG,VOICE,WORK:+1-919-676-9515\r
+TEL;TYPE=FAX,WORK:+1-919-676-9564\r
+UID:gDVbA6LY3t\r
+URL:http://home.earthlink.net/~fdawson\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard10.vcf b/autotests/data/vcard10.vcf
new file mode 100644 (file)
index 0000000..821aea6
--- /dev/null
@@ -0,0 +1,56 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+UID:bfa5fdc5-fbfc-4ce2-8196-29ca0deb3bd3\r
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44=2D=53=74=61=C3=9F=65=20=\r
+=32=0A=30=30=30=30=30=20=44=44=44=44=44=44=44=44=44=44;;;;\r
+ORG:Bike Shop\r
+Note:This one has a funny character at the end in the contact list\r
+END:VCARD\r
+BEGIN:VCARD\r
+VERSION:2.1\r
+UID:f8361311-b25c-4237-a94e-3015d8fe19de\r
+N:;Broken;;;\r
+FN:Field after Address broken\r
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=41=41=41=41=41=41=41=2D=41=C3=A4=41=41=41=41=41=20=\r
+=31=31;=55=72=74;;=30=30=30=30=30;\r
+URL:http://some-webseite.com\r
+NOTE:This one's URL field is truncated (see contact's edit form). Remove the linebreak in the VCF's address field and the URL will will be correct.\r
+END:VCARD\r
+BEGIN:VCARD\r
+VERSION:2.1\r
+UID:462269fd-607c-4284-998b-6771143b63a7\r
+N:;Broken;;;\r
+FN:Field after Address not broken\r
+ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=41=41=41=41=41=41=41=2D=41=C3=A4=41=41=41=41=41=20=\r
+=31=31;=55=72=74;;=30=30=30=30=30;\r
+NOTE:this is identical to "Website broken", but with Note and URL swapped. The Note field does not get truncated as the URL field does.\r
+URL:http://some-webseite.com\r
+END:VCARD\r
+BEGIN:VCARD\r
+VERSION:2.1\r
+UID:b4fc4930-043f-446a-9a76-cf0b548368d8\r
+N:Name;Surname;;Dr. med.;\r
+FN:Dr. med. Surname Name\r
+TITLE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=46=61=63=68=61=72=7A=74=20=66=C3=BC=72=20=41=6C=6C=67=65=6D=65=69=6E=\r
+=6D=65=64=69=7A=69=6E\r
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=53=70=72=65=63=68=7A=65=69=74=65=6E=3A=0A=4D=6F=20=20=20=38=E2=80=93=\r
+=31=32=2C=20=31=35=E2=80=93=31=38=0A=44=69=20=20=20=20=20=38=E2=80=93=\r
+=31=32=0A=4D=69=20=20=20=20=38=E2=80=93=31=32=2C=20=31=34=E2=80=93=31=\r
+=35=0A=44=6F=20=31=34=E2=80=93=31=39=0A=46=72=20=20=20=20=20=38=E2=80=\r
+=93=31=32\r
+END:VCARD\r
+BEGIN:VCARD\r
+VERSION:2.1\r
+UID:941b057d-e959-4644-b41f-e122b26c3807\r
+N:Doctor;Second;;;\r
+FN:Second Doctor\r
+ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;=44=44=44=44=44=44=44=44=44=44=44=73=74=72=61=C3=9F=65=20=32=36=0A=30=\r
+=30=30=30=30=20=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44;;;;\r
+ORG:\r
+TITLE:Dentist\r
+NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=53=70=72=65=63=68=7A=65=69=74=65=6E=3A=0A=4D=6F=20=20=20=38=E2=80=93=\r
+=31=33=0A=44=69=20=20=20=31=30=E2=80=93=31=32=2C=20=31=33=E2=80=93=31=\r
+=38=0A=4D=69=20=20=31=30=E2=80=93=31=32=2C=20=31=33=E2=80=93=31=38=0A=\r
+=44=6F=20=20=31=33=E2=80=93=31=38=0A=46=72=20=20=20=20=20=20=38=E2=80=\r
+=93=31=32\r
+END:VCARD\r
diff --git a/autotests/data/vcard10.vcf.ref b/autotests/data/vcard10.vcf.ref
new file mode 100644 (file)
index 0000000..149a7ed
--- /dev/null
@@ -0,0 +1,53 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=work:;;DDDDDDDDDDDDDDD-Staße 2\n00000 DDDDDDDDDD;;;;\r
+N:;;;;\r
+NOTE:This one has a funny character at the end in the contact list\r
+ORG:Bike Shop\r
+UID:bfa5fdc5-fbfc-4ce2-8196-29ca0deb3bd3\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=home:;;AAAAAAA-AäAAAAA 11;Urt;;00000;\r
+FN:Field after Address broken\r
+N:;Broken;;;\r
+NOTE:This one's URL field is truncated (see contact's edit form). Remove th\r
+ e linebreak in the VCF's address field and the URL will will be correct.\r
+UID:f8361311-b25c-4237-a94e-3015d8fe19de\r
+URL:http://some-webseite.com\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=home:;;AAAAAAA-AäAAAAA 11;Urt;;00000;\r
+FN:Field after Address not broken\r
+N:;Broken;;;\r
+NOTE:this is identical to "Website broken"\, but with Note and URL swapped.\r
+  The Note field does not get truncated as the URL field does.\r
+UID:462269fd-607c-4284-998b-6771143b63a7\r
+URL:http://some-webseite.com\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:Dr. med. Surname Name\r
+N:Name;Surname;;Dr. med.;\r
+NOTE:Sprechzeiten:\nMo   8–12\, 15–18\nDi     8–12\nMi    8–12\, 14\r
+ –15\nDo 14–19\nFr     8–12\r
+TITLE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=46acharzt f=C3=BCr Allgemein\r
+ medizin\r
+UID:b4fc4930-043f-446a-9a76-cf0b548368d8\r
+END:VCARD\r
+\r
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=work:;;DDDDDDDDDDDstraße 26\n00000 DDDDDDDDDDDDDDDDD;;;;\r
+FN:Second Doctor\r
+N:Doctor;Second;;;\r
+NOTE:Sprechzeiten:\nMo   8–13\nDi   10–12\, 13–18\nMi  10–12\, 13\r
+ –18\nDo  13–18\nFr      8–12\r
+TITLE:Dentist\r
+UID:941b057d-e959-4644-b41f-e122b26c3807\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard11.vcf b/autotests/data/vcard11.vcf
new file mode 100644 (file)
index 0000000..904e083
--- /dev/null
@@ -0,0 +1,10 @@
+BEGIN:VCARD
+CLASS:PUBLIC
+EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com
+FN:Test User
+N:User;Test;;;
+UID:uJTkVqH5Qt
+VERSION:3.0
+END:VCARD
+
diff --git a/autotests/data/vcard11.vcf.ref b/autotests/data/vcard11.vcf.ref
new file mode 100644 (file)
index 0000000..2b8709a
--- /dev/null
@@ -0,0 +1,10 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+CLASS:PUBLIC\r
+EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com\r
+FN:Test User\r
+N:User;Test;;;\r
+UID:uJTkVqH5Qt\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard12.vcf b/autotests/data/vcard12.vcf
new file mode 100644 (file)
index 0000000..ecb2d6c
--- /dev/null
@@ -0,0 +1,15 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+UID:pas-id-54B2522600000001\r
+FN:Good Looking\r
+N:Looking;Good;;;\r
+PHOTO;TYPE=WORK;ENCODING=b:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA\r
+ CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiUrjAUGmgAAABl0RVh0Q29tbWVudABDcm\r
+ VhdGVkIHdpdGggR0lNUFeBDhcAAAAZSURBVAjXY/zPAAVMDAwMDP//MzAwMMLFAEMrBAHo3Yr/\r
+ AAAAAElFTkSuQmCC\r
+PHOTO;TYPE=HOME;ENCODING=b:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA\r
+ CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiQG0MFrrgAAABl0RVh0Q29tbWVudABDcm\r
+ VhdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY/j//z8DAwOEhAG4GACzagv1unIx3wAAAABJ\r
+ RU5ErkJggg==\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:goodlooking@example.com\r
+END:VCARD\r
diff --git a/autotests/data/vcard12.vcf.2_1ref b/autotests/data/vcard12.vcf.2_1ref
new file mode 100644 (file)
index 0000000..6560135
Binary files /dev/null and b/autotests/data/vcard12.vcf.2_1ref differ
diff --git a/autotests/data/vcard12.vcf.ref b/autotests/data/vcard12.vcf.ref
new file mode 100644 (file)
index 0000000..980372e
--- /dev/null
@@ -0,0 +1,16 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:goodlooking@example.com\r
+FN:Good Looking\r
+N:Looking;Good;;;\r
+PHOTO;ENCODING=b;TYPE=WORK:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA\r
+ CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiUrjAUGmgAAABl0RVh0Q29tbWVudABDcmV\r
+ hdGVkIHdpdGggR0lNUFeBDhcAAAAZSURBVAjXY/zPAAVMDAwMDP//MzAwMMLFAEMrBAHo3Yr/AA\r
+ AAAElFTkSuQmCC\r
+PHOTO;ENCODING=b;TYPE=HOME:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA\r
+ CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiQG0MFrrgAAABl0RVh0Q29tbWVudABDcmV\r
+ hdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY/j//z8DAwOEhAG4GACzagv1unIx3wAAAABJRU\r
+ 5ErkJggg==\r
+UID:pas-id-54B2522600000001\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard13.vcf b/autotests/data/vcard13.vcf
new file mode 100644 (file)
index 0000000..5e31757
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+CLASS:PUBLIC
+EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com
+FN:Test User
+N:User;Test;;;
+UID:uJTkVqH5Qt
+URL:test1.url
+URL:test2.url
+VERSION:3.0
+END:VCARD
+
diff --git a/autotests/data/vcard13.vcf.ref b/autotests/data/vcard13.vcf.ref
new file mode 100644 (file)
index 0000000..ce0cba0
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+CLASS:PUBLIC\r
+EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com\r
+FN:Test User\r
+N:User;Test;;;\r
+UID:uJTkVqH5Qt\r
+URL:test1.url\r
+URL:test2.url\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard14.vcf b/autotests/data/vcard14.vcf
new file mode 100644 (file)
index 0000000..8fe5db3
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+CLASS:PUBLIC\r
+EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com\r
+FN:Test User\r
+N:User;Test;;;\r
+UID:uJTkVqH5Qt\r
+SOURCE:http://www.kde.org\r
+SOURCE:http://www.kde1.org\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard14.vcf.2_1ref b/autotests/data/vcard14.vcf.2_1ref
new file mode 100644 (file)
index 0000000..367e523
--- /dev/null
@@ -0,0 +1,11 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+EMAIL;HOME;PREF;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com\r
+EMAIL;WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com\r
+FN:Test User\r
+N:User;Test;;;\r
+SOURCE:http://www.kde.org\r
+SOURCE:http://www.kde1.org\r
+UID:uJTkVqH5Qt\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard14.vcf.ref b/autotests/data/vcard14.vcf.ref
new file mode 100644 (file)
index 0000000..2488a73
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+CLASS:PUBLIC\r
+EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com\r
+EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com\r
+FN:Test User\r
+N:User;Test;;;\r
+SOURCE:http://www.kde.org\r
+SOURCE:http://www.kde1.org\r
+UID:uJTkVqH5Qt\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard15.vcf b/autotests/data/vcard15.vcf
new file mode 100644 (file)
index 0000000..7fa66c1
--- /dev/null
@@ -0,0 +1,10 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:Test Tester\r
+N:Tester;Test;;;\r
+RELATED;TYPE=child;VALUE=text:Child Tester\r
+item1.URL:http://www.example.com\r
+item1.X-ABLABEL:random_label\r
+TEL;TYPE=home:+1-800-123456\r
+UID:40f8971c-1d3a-466f-8cf5-55aad2021e1a\r
+END:VCARD\r
diff --git a/autotests/data/vcard15.vcf.ref b/autotests/data/vcard15.vcf.ref
new file mode 100644 (file)
index 0000000..576e330
--- /dev/null
@@ -0,0 +1,11 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:Test Tester\r
+N:Tester;Test;;;\r
+RELATED;TYPE=child;VALUE=text:Child Tester\r
+TEL;TYPE=HOME:+1-800-123456\r
+UID:40f8971c-1d3a-466f-8cf5-55aad2021e1a\r
+item1.URL:http://www.example.com\r
+item1.X-ABLABEL:random_label\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard2.vcf b/autotests/data/vcard2.vcf
new file mode 100644 (file)
index 0000000..13cd72e
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:vCard
+VERSION:3.0
+UID:1UgvYejJMs
+FN:Tim Howes
+ORG:Netscape Communications Corp.
+ADR;TYPE=WORK:;;501 E. Middlefield Rd.;Mountain View;
+ CA; 94043;U.S.A.
+TEL;TYPE=VOICE,MSG,WORK:+1-415-937-3419
+TEL;TYPE=FAX,WORK:+1-415-528-4164
+EMAIL;TYPE=INTERNET:howes@netscape.com
+END:vCard
+
diff --git a/autotests/data/vcard2.vcf.2_1ref b/autotests/data/vcard2.vcf.2_1ref
new file mode 100644 (file)
index 0000000..0af201c
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+ADR;WORK:;;501 E. Middlefield Rd.;Mountain View;CA; 94043;U.S.A.\r
+EMAIL;INTERNET:howes@netscape.com\r
+FN:Tim Howes\r
+N:;;;;\r
+ORG:Netscape Communications Corp.\r
+TEL;MSG;VOICE;WORK:+1-415-937-3419\r
+TEL;FAX;WORK:+1-415-528-4164\r
+UID:1UgvYejJMs\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard2.vcf.ref b/autotests/data/vcard2.vcf.ref
new file mode 100644 (file)
index 0000000..0cf6003
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=work:;;501 E. Middlefield Rd.;Mountain View;CA; 94043;U.S.A.\r
+EMAIL;TYPE=INTERNET:howes@netscape.com\r
+FN:Tim Howes\r
+N:;;;;\r
+ORG:Netscape Communications Corp.\r
+TEL;TYPE=MSG,VOICE,WORK:+1-415-937-3419\r
+TEL;TYPE=FAX,WORK:+1-415-528-4164\r
+UID:1UgvYejJMs\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard3.vcf b/autotests/data/vcard3.vcf
new file mode 100644 (file)
index 0000000..579e2da
--- /dev/null
@@ -0,0 +1,12 @@
+begin:vcard
+uid:ebvq9Wo9rO
+n:geiser;ian
+x-mozilla-html:FALSE
+org:Source eXtreme
+version:2.1
+email;internet:geiseri@yahoo.com
+title:VP of Engineering
+x-mozilla-cpt:;0
+fn:ian geiser
+end:vcard
+
diff --git a/autotests/data/vcard3.vcf.2_1ref b/autotests/data/vcard3.vcf.2_1ref
new file mode 100644 (file)
index 0000000..0a81e62
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+EMAIL;INTERNET:geiseri@yahoo.com\r
+FN:ian geiser\r
+N:geiser;ian;;;\r
+ORG:Source eXtreme\r
+TITLE:VP of Engineering\r
+UID:ebvq9Wo9rO\r
+X-mozilla-cpt:;0\r
+X-mozilla-html:FALSE\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard3.vcf.ref b/autotests/data/vcard3.vcf.ref
new file mode 100644 (file)
index 0000000..0eeeec2
--- /dev/null
@@ -0,0 +1,12 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+EMAIL;TYPE=internet:geiseri@yahoo.com\r
+FN:ian geiser\r
+N:geiser;ian;;;\r
+ORG:Source eXtreme\r
+TITLE:VP of Engineering\r
+UID:ebvq9Wo9rO\r
+X-mozilla-cpt:;0\r
+X-mozilla-html:FALSE\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard4.vcf b/autotests/data/vcard4.vcf
new file mode 100644 (file)
index 0000000..7152ceb
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD
+X-EVOLUTION-FILE-AS:Ximian, Inc.
+FN
+N:
+LABEL;QUOTED-PRINTABLE;WORK:401 Park Drive  3 West=0ABoston, MA 02215=0AUSA
+TEL;WORK;VOICE:(617) 236-0442
+TEL;WORK;FAX:(617) 236-8630
+EMAIL;INTERNET:hello@ximian.com
+URL:www.ximian.com/
+ORG:Ximian, Inc.
+NOTE:Welcome to the Ximian Addressbook.
+UID:pas-id-3E136F9B00000000
+END:VCARD
+
diff --git a/autotests/data/vcard4.vcf.ref b/autotests/data/vcard4.vcf.ref
new file mode 100644 (file)
index 0000000..28e0b58
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+EMAIL;TYPE=INTERNET:hello@ximian.com\r
+LABEL;TYPE=work:401 Park Drive  3 West\nBoston\, MA 02215\nUSA\r
+N:;;;;\r
+NOTE:Welcome to the Ximian Addressbook.\r
+ORG:Ximian\, Inc.\r
+TEL;TYPE=VOICE,WORK:(617) 236-0442\r
+TEL;TYPE=FAX,WORK:(617) 236-8630\r
+UID:pas-id-3E136F9B00000000\r
+URL:www.ximian.com/\r
+X-EVOLUTION-FILE-AS:Ximian\, Inc.\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard5.vcf b/autotests/data/vcard5.vcf
new file mode 100644 (file)
index 0000000..957a1e5
--- /dev/null
@@ -0,0 +1,313 @@
+BEGIN:VCARD
+ADR;TYPE=home;TYPE=pref:;;Buehlauer Strasse 45;Dresden;Sachsen;01327;German
+ y
+ADR;TYPE=work:;;Prager Strasse 55;Dresden;Sachsen;01066;Germany
+BDAY:1955-07-19T00:00:00Z
+CATEGORIES:Friend
+CLASS:CONFIDENTIAL
+EMAIL;TYPE=PREF:heiko.mustermann@freenet.org
+EMAIL:heiko8@tst.inf.tu-dresden.de
+FN:Mustermann, Heiko
+GEO:19.283333;166.616669
+LOGO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVU
+ AAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7aC
+ YMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k27
+ EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7DT
+ 7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACpV
+ sZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSgA
+ A15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlRL
+ vEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrLc
+ 9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgBM
+ vSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMPs
+ P7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gvq
+ NSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL5
+ 4WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kvy
+ d0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jyb
+ kfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq7
+ aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0omA
+ ACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy3
+ w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw0
+ 9IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQO
+ crOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6z
+ E+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO+
+ OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuDa
+ ANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbij
+ o19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGtV
+ X2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB6
+ 79OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaPm
+ 8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqici
+ biYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2aT
+ JtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYIl
+ x36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30u
+ OQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAUL
+ hYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6Y
+ nf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVOH
+ QzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44M
+ d3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhRi
+ Il23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGGY
+ UmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK6
+ YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXsv
+ GGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS5
+ 8CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN8
+ IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430w
+ D2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiXj
+ oGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxojd
+ ympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxpB
+ KXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3EmuF
+ VcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dtQ
+ 3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDgU
+ Ohz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe+
+ a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOms
+ tFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5efV
+ 1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4U
+ VCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo+
+ swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR0
+ 0bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6X
+ bktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLUJ
+ wH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5K
+ 1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQxG
+ MSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCmo
+ HLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYjG
+ VIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9GphG
+ WIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJuH
+ NGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZW
+ BOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHFc
+ WWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFFq
+ xh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMWV
+ 8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGWJ
+ xczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC
+N:Mustermann;Heiko;;;
+NICKNAME:clown
+NOTE:I'm a friendly note text,\nplease copy me to your address book...
+ORG:KDE
+PHOTO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pV
+ UAAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7a
+ CYMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k2
+ 7EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7D
+ T7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACp
+ VsZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSg
+ AA15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlR
+ LvEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrL
+ c9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgB
+ MvSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMP
+ sP7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gv
+ qNSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL
+ 54WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kv
+ yd0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jy
+ bkfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq
+ 7aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0om
+ AACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy
+ 3w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw
+ 09IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQ
+ OcrOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6
+ zE+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO
+ +OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuD
+ aANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbi
+ jo19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGt
+ VX2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB
+ 679OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaP
+ m8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqic
+ ibiYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2a
+ TJtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYI
+ lx36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30
+ uOQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAU
+ LhYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6
+ Ynf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVO
+ HQzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44
+ Md3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhR
+ iIl23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGG
+ YUmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK
+ 6YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXs
+ vGGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS
+ 58CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN
+ 8IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430
+ wD2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiX
+ joGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxoj
+ dympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxp
+ BKXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3Emu
+ FVcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dt
+ Q3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDg
+ UOhz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe
+ +a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOm
+ stFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5ef
+ V1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4
+ UVCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo
+ +swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR
+ 00bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6
+ XbktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLU
+ JwH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5
+ K1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQx
+ GMSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCm
+ oHLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYj
+ GVIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9Gph
+ GWIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJu
+ HNGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZ
+ WBOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHF
+ cWWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFF
+ qxh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMW
+ V8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGW
+ JxczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC
+ROLE:Developer
+SOUND;ENCODING=b:UklGRiQgAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAgAA
+ B/f39/f39/f39/f39/f4B/gH+Af4CAgIGBgYGBgYGBgYGBgYGBgYGBgIGAgICBgYGBgYGBgYCAg
+ YGAgICAgICAgIGBgICAgYCAgICBgICAgICAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAf4CAgICAgICAgICAgICAgIB/f4CAgICAgICAgIB/f4B/f39/f39/f3+AgICAf4CAf3
+ 9/gIB/f4CAgH9/gICAgH+AgICAgICAgICAf4CAgIB/gICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgIB/gICAf39/f39/f3+Af4CAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgH9/f39/f39/f39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYCAgICB
+ gICAgYGBgICAgICAgICAgIGAgICBgICBgYGBgYGBgYGAgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYG
+ BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgYGBgIGBgYGAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgH+AgICAgICAgICAgICAgICAgICAf4CAgIB/gH+Af4B/f39/f39/f
+ 39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYG
+ BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY
+ GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAgIGBgYCAgICBgYCAgYGBgYCAgICBg
+ YCAgICAgICAgICAgICAgIGAgICAgICAgICAgICAgYGBgYGAgICAgIGBgYCAgICBgYGAgICAgIGA
+ gICAgICAgIGBgYCBgYGAgYGBgYGBgoGBgYGCgoGAgICBgYGBgYCBgYKCgYGBgYGBgYGAgYGBgH9
+ /gIB/f3+AgIB/gH9/gICAf4CBgYB/f35+gIB/f4CBgX9/gYCAgYKCgYCAgYOBgICAgoGAf4GCgn
+ 9/gIB/gICBgH5/f4GAfX+BgYB+fn9/fn+Afn6Af39+f35+fn9+fn6AgH9/f4CAgYCAgYKCgH9/g
+ IKBf3+AgYJ/f4GCg4F/gIGCgoOBfoCDgYF/fH+BgYGAfn6Af4CCgn58gIN/fX+AgICBgYGAgYCB
+ goOCgICBgYB/fXyBhIGAgH5+f4GBgX9/f35+gIKCgXt9goN/f318f4GAf4B/fHt9fn5+fXx+fn5
+ /gH9+fHx/gHx9f4CAfn18gIB9e4GBfn5+foCBfHyAgoGAfX6CgYCBgH+DgHt9gYN/fX2BhYB7en
+ 6AgH98foKCgH18foCAfoCAf4CAf31+fn+AgH1+goJ/fX5/gIKAgIGAfH6CgX17foCBf3+BgoB/g
+ YOBgIB/f4KDgoJ+e3+ChIOBfn1/gX+BfX2BgH59foCCfn1/gX99fICAgoB/f39/gISCf36AgoSB
+ foCBgYGAf4CCf4CCgX5/gYKDgYB/gH+BhIOBgYB/gIOEhIF9foGCg4OBgICBgoOCgICChIOBg4O
+ CgoSDgoKAgYKBgoODhISBf4CCg4SEgoGCg4SEgH6BhIWEgX+EhYKAgoKFhIB+gIKChYKAgYOCgo
+ B+gYWFhIKAg4WEg4ODhIWFhYaGhIWGhYWGh4eHhYOCgoSFg4B/gIB+fX1+fn57e3t7fHt6fH5/f
+ 4GDhYiMkJGQj5GVmZycmZiXlZGIfXRwcnZ4d3Nva2hoamppaWxvc3R0dXl+iJCPjZShqrCzvNHi
+ rFYxOmKSrJ6UmJOAbV1ZboSMjI6JfnNjW2JweYGFg4B/e3Z0c3Btc3p9fHp4fIGBf3+Dh4qLjJG
+ YnZuWkY6MhnpwbnN6fHlya2hlZmdmaW9ycXFzd3t/g42cpquzvMzd/sRADiBZkL6xpLa1jFpANV
+ iHoJ2ioJWGbEQ2VHaOm5aHhIFuYmZzgoVxZFxfdJCSgnt/kKewr7bDsopcSV6JopyRjpOQfmNXZ
+ HmGhYB8fXtvXExKXnyKgnJsc3t8fZC0ysfK0+vHTxEeXY6yr6rAxJRSNTdbh5+fp7KjglQ6PVx3
+ ho6Ph3dmW15oa2x0hIuNkK3R18jJ0Ys8LUlxkqais8WtdlBFT2yDjpywro9mS0VVaXaBiIdyX2J
+ rcG5udYKKjaXT4dfV2Y82JkBpiaKkvdO2eE9GTGZ4hZu6u51yTUNOX2l9kZWKdl5PXG93dHeAip
+ KZut7j2tacRjJIYHCOo77XvoRdVlFYZniVuL+kfl9ST1Rcb4mTjoNxW1pqdXd5fH6CiKHN4d7k2
+ 4E4N05Yaoqo1eO0emVbTU5ZdKDCuZV9b1tMSVlyiYp8dHl7cmpqdYCCgIqixNTR2OqnRTlPXFt3
+ ksbnw4lzcFdKS2KMtLWZiIZwV0lPZXZ1b3uNinZqbXJ3dX2XxOPg4/zDUDRCTUhmiMXx1p+If1g
+ +O1J7pK+yspN3W0pGVGdugYmCen54b21rb3V9i6vZ7vD92WpAS0gzSny04tq3qp5qPDhHX3uVrs
+ KukXVhT0hRYnF/gnuCh31ubG9zdHeMs+Dr8P7KalFVOylJeq7QzMPIqmtIRUZOY4KovqicknhZS
+ 1BWXWh6gIeLiH91b21vc4GcyuXt/umTZGhGIjJfh6y+yt7LkGlfTD1GYYOipKKwnXhkXldVUFhs
+ dYOMjYWBem9ucoCWvNTm9+2weHdZMSpQboujvtnUrY6BZEdDUmV4jZypppeFd2dcWVFWWWh8hYS
+ Ii393c3Z7iJ3A1ePp3aGDfVYyOVZkfJe5zsavpJNsU1BTVmR9kpmcn5uGdGxoWU5VVGZ0fIKLh4
+ F/d3Z6g4ufuc3e3depjoViPz9VWm2FqLu8tLGifmphWlJZbH+Lj5+elod+c19WU0xUZW11gISEg
+ nx6e3h6g4qWp7zM3NrSpZGIYkRFVVVlfZ6vsbW3qIl7b2BUWGVwe4ybn52TkIRuX2BVRVFjZmp7
+ hIF9fX12cnZ6eX6LlZyousfP0c++jot6X0ZRXF9sgaCnqa6yn4eAdGZZYGlvd4mcnqCWnY91aWN
+ cSUtYYmJxf399f351cXFzcHF4foOIlZ+hp7CytLm8uLKNg4RtYF5oanN8j5qZnqGaioV9dGpqb3
+ J1f42Rk5iZjIKAcmFcW1RXYGhwdXt+e3Z2c25tcXJxd3yChY2Tl5udn6Gho6ioq6uonoaHbWNzZ
+ GdxgoGPlZqdj5CJgHFzcWxwdH1/hYqOioSFfnFpaWBdX2Jqb3N5fHh4eHNxcXFxc3d7foOJjI6Q
+ lZOSlZOTl5eYnJucnpyZkYiEfnd1dnZ5fYKHio6QkIyHg394dHRzc3Z5fHt2enJrcG5obG9sbW9
+ ucHJzdnh3eXp5eXt9foCDhoeJjI6OkJGSk5aYmZudn6Gjn5qLh4J3cnJ0dHR5g4GEi42Ih4aBfH
+ h4dXR1eHl4dXhuaW5rZ2ltaWttbW5vcnR1dHZ2dXV2d3d7fn+BhIeIiYuOjpCTlJWZnJueoKarr
+ ZuJhntvaW1ucnh+hIWJi4qFg4F7d3V1c3R3fH1/gHlvbXJnXmdpYmdtamtxcW9vbm9tamxtbG5z
+ dXZ5fHx7fX9+fH6AgoWHioyNj5CRlZeYmp2TiYyGenp9eXh9fX19foB/fH1/e3p8e3l5e3x7e3x
+ 6d3FxcnBwcG9vb29vb29wb25tbWxsbW5vb3Fyc3N1dXV1dnd4ent9fn+BgoGAgoWEhoqJiYyLi4
+ yPioaLiYSEh4WDhIOCgoKAgX58fXx5eXp4eHl4dXZ1cnN0dHR1cnJycXBxcnJycW9ubGxsbW1ub
+ m5ub29vcXNzdHZ2dXh6enp+fn5/gYCBhIKFiYeGiomJi4qKjIuLjIyLiomKh4aKioeIiIWDgYB9
+ fHx7e3l4eHh2dnd3d3l7enp6enp5ent7e3x7enl6e3t7fHx7e3p8fX5/gIKDg4GCg4KCg4OEhoe
+ Hh4iJiomLjIqLi4uLi46Pjo2OjouJiomHh4aDgH9/fXp5eXh3d3h4eHh4d3V2d3Z0dnd0dXd3d3
+ p7fH59fX19fH5+fn+Af4CAf3+Af359f4KDgoSIiIeJjI6PkJOUk5SYmZiYmZqZmJqamJiZmJaWl
+ ZSTkZCQj46Ni4qHh4iFgoKBfn9+fn+AgYCAgYOCgoSEg4SFhIODg4OCgICBf35/gICAgYKCgYGD
+ hIOBgYOCgYGAgIGBgIGCgoKBgoSEg4KCgH9/f318fHt6e3t7enl5eHh5fH18foCAf4GDg4OFhoa
+ GhoeJh4aJioiIiYiIhoWGh4aGh4eHiImHh4mIiIeHh4iIiIqJioqJh4mKh4eJiYiHh4eHhoWGhY
+ OEhYWEhYWDg4SFhYWEg4SDgYKCgH+AgICBgoOCgYGBgYKEhoaGhoiIh4eJiYmKioqKiomKioiJi
+ oqJiYmJiIiIiYiHh4eHh4eGhYWFhISDgoKCgoKCgYGAf31+fXx9fn58e3x8fHx9fX19fX19fX19
+ fHx9fn5/gICBgYGCgoKCg4OCgoODgoKDg4OCgoKCgoGBgYGBgYGCgYCBgIGCgoKDg4KCg4OEhIS
+ FhYWFhYWFhYWFhoWGhoWEhISDg4ODg4ODg4ODg4SDgoKDg4OCg4SDgoKDgoGBgoGAgIB/f35+fn
+ 9+fn9/f35+fn5/gICAgIGBgYKCg4ODg4SEg4OEhIODhIODhIODg4ODg4OCgoKBgoKCg4OCgoODg
+ 4ODg4OEhISEhIWEhIWFhISEhISEhIWEhISEhIODhISEg4ODg4ODg4ODg4ODgoKCgoKCg4KCgoKC
+ goKCgoKCgoOCgoKCgoKBgYKCgoKCgoGBgYGAgICAgYGBgYCAf39/f39/f3+Af39/f39/f39/gIC
+ AgIB/f39/f39/gICAgIB/f39/gIB/f39/gH9/f39/f39/fn5+f39/f39/fn5+fn5/f39/f39/fn
+ 5+fn9/f39/f35+fn5+fn9/f35/f39+fn5+fn9/fn5+fn5+fn5+f39+fn5+fn19fX5+fn5+fn5+f
+ X5+fn5+fn5+fn19fn5+fn5+fX19fX59fn5+fn19fX19fX1+fX19fX19fX19fX19fX19fX19fX19
+ fX19fX19fX19fX19fX19fX19fX19fX19fXx9fX18fH19fXx8fXx9fXx8fHx8fHx8fH19fX19fXx
+ 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX
+ 19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
+ X19fX19fX19fX19fX19fX19fX19fX19fX1+fX5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
+ fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f
+ 39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/
+ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f35+fn5+f35/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+f
+ 39+fn5/fn5+f39/fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/
+ f39/f39/f39/f39/f39+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f4CAf39/f39/f39/gIB/f39/f39/f4B/f4CAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgIB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgIGBgYGAgYGBgICAgIGAgICBgYGAgYGBgYGBgYGBgYGBgY
+ GBgYGBgYGBgYGBgYGBgYGAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf39/gH9/f
+ 3+Af39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4CAgH9/gIB/f39/f4B/f3+AgICAf4CA
+ gICAgICAgICAgICAgH9/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgIB/f39/f39/f39/f4CAf39/f39/f39/f39/f39/f39+fn
+ 9/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fn5+fn5+fn9/f39/f4CAgICAgICBgYGBg
+ YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgYGAgICA
+ gICAgICAgICAgICBgYGAgICAgICAgICAgICAgICAgICAgICAgIB/gICAgH9/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgICAf39/f39/gH+AgI
+ CAgICAgIB/f39/f39/f4B/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn9/f39/f39/f39+f
+ 39/f39/f39/f39/f39/f39/f39/f4B/f4CAgICAf39/f39/gICAf39/gICAgICAgICAgICAgICA
+ gICAgIGAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICBgYGBgYGBgYCBgYGBgYCAgIG
+ BgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAf3+AgIB/f4CAf39/f39/f3+AgICAgH+AgICAf3+AgICAgICAgH9/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/gH9/gICAgICAgICAgIB/gICAgH+AgIB/f39/f39/gICAgICAgH9/f3+AgH9/f4B/f
+ 39/f39/f39/f39/f3+AgICAgICAf3+AgIB/f4CAgIB/f4CAgICAgICAgICAf39/f3+AgIB/f4CA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf39/f39
+ /f4CAgH9/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/gIB/f39/f39/f39/gH9/f3
+ 9/f4CAgICAgIB/gICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf4CAgICAgICAgIB/gICAf
+ 4CAgICAgH+Af4CAgH9/f39/f39/f39/gICAgICAgICAgICAf39/f39/f4CAgH9/gICAf3+AgICA
+ gICAgICAgICAgICAgICAgICAgIB/f39/gIB/f4CAgIB/f4CAgH9/gICAf39/f39/f39/f39/f39
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAf39/gH9/f3+AgH9/f39/f39/f39/f39/f
+ 39/f39/f39/f39/f39/f39/f39/gICAf3+AgH9/f3+AgH9/f4CAgH9/gICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAgICAgICBgYGBgIGBgYCAgYGAgICAgYCAgICAgICAgICAgICAgICAg
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
+ CAgICAgICAgICAgICAgICAf39/f39/f4CAgIB/f4CAgICAgICAgICAgICAgICAgICAgICAgICAg
+ ICAf39/f3+Af39/f39/f39/f4B/f39/f4CAgICAgICAgICAgA==
+TEL;TYPE=HOME:0351 223344
+TEL;TYPE=WORK:0351 443322
+TEL;TYPE=CELL:0173 223344
+UID:P9HXg34Oav
+URL:http://www.mustermann.de/~heiko/
+VERSION:3.0
+X-KADDRESSBOOK-X-Anniversary:1982-07-07
+X-KADDRESSBOOK-X-AssistantsName:Mr. Smithers
+X-KADDRESSBOOK-X-Department:Edutainment
+X-KADDRESSBOOK-X-IMAddress:122334455
+X-KADDRESSBOOK-X-ManagersName:Mr. Burnes
+X-KADDRESSBOOK-X-Office:223 2nd stage
+X-KADDRESSBOOK-X-Profession:Clown
+X-KADDRESSBOOK-X-SpousesName:femal clown
+END:VCARD
+
diff --git a/autotests/data/vcard5.vcf.ref b/autotests/data/vcard5.vcf.ref
new file mode 100644 (file)
index 0000000..531271f
--- /dev/null
@@ -0,0 +1,312 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+ADR;TYPE=home,pref:;;Buehlauer Strasse 45;Dresden;Sachsen;01327;Germany\r
+ADR;TYPE=work:;;Prager Strasse 55;Dresden;Sachsen;01066;Germany\r
+BDAY:1955-07-19T00:00:00Z\r
+CATEGORIES:Friend\r
+CLASS:CONFIDENTIAL\r
+EMAIL;TYPE=PREF:heiko.mustermann@freenet.org\r
+EMAIL:heiko8@tst.inf.tu-dresden.de\r
+FN:Mustermann\, Heiko\r
+GEO:19.283333;166.616669\r
+LOGO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVU\r
+ AAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7aC\r
+ YMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k27\r
+ EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7DT\r
+ 7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACpV\r
+ sZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSgA\r
+ A15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlRL\r
+ vEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrLc\r
+ 9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgBM\r
+ vSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMPs\r
+ P7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gvq\r
+ NSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL5\r
+ 4WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kvy\r
+ d0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jyb\r
+ kfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq7\r
+ aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0omA\r
+ ACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy3\r
+ w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw0\r
+ 9IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQO\r
+ crOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6z\r
+ E+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO+\r
+ OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuDa\r
+ ANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbij\r
+ o19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGtV\r
+ X2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB6\r
+ 79OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaPm\r
+ 8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqici\r
+ biYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2aT\r
+ JtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYIl\r
+ x36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30u\r
+ OQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAUL\r
+ hYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6Y\r
+ nf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVOH\r
+ QzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44M\r
+ d3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhRi\r
+ Il23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGGY\r
+ UmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK6\r
+ YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXsv\r
+ GGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS5\r
+ 8CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN8\r
+ IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430w\r
+ D2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiXj\r
+ oGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxojd\r
+ ympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxpB\r
+ KXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3EmuF\r
+ VcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dtQ\r
+ 3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDgU\r
+ Ohz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe+\r
+ a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOms\r
+ tFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5efV\r
+ 1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4U\r
+ VCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo+\r
+ swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR0\r
+ 0bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6X\r
+ bktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLUJ\r
+ wH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5K\r
+ 1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQxG\r
+ MSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCmo\r
+ HLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYjG\r
+ VIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9GphG\r
+ WIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJuH\r
+ NGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZW\r
+ BOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHFc\r
+ WWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFFq\r
+ xh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMWV\r
+ 8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGWJ\r
+ xczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC\r
+N:Mustermann;Heiko;;;\r
+NICKNAME:clown\r
+NOTE:I'm a friendly note text\,\nplease copy me to your address book...\r
+ORG:KDE\r
+PHOTO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pV\r
+ UAAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7a\r
+ CYMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k2\r
+ 7EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7D\r
+ T7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACp\r
+ VsZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSg\r
+ AA15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlR\r
+ LvEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrL\r
+ c9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgB\r
+ MvSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMP\r
+ sP7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gv\r
+ qNSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL\r
+ 54WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kv\r
+ yd0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jy\r
+ bkfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq\r
+ 7aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0om\r
+ AACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy\r
+ 3w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw\r
+ 09IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQ\r
+ OcrOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6\r
+ zE+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO\r
+ +OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuD\r
+ aANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbi\r
+ jo19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGt\r
+ VX2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB\r
+ 679OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaP\r
+ m8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqic\r
+ ibiYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2a\r
+ TJtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYI\r
+ lx36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30\r
+ uOQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAU\r
+ LhYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6\r
+ Ynf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVO\r
+ HQzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44\r
+ Md3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhR\r
+ iIl23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGG\r
+ YUmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK\r
+ 6YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXs\r
+ vGGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS\r
+ 58CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN\r
+ 8IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430\r
+ wD2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiX\r
+ joGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxoj\r
+ dympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxp\r
+ BKXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3Emu\r
+ FVcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dt\r
+ Q3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDg\r
+ UOhz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe\r
+ +a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOm\r
+ stFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5ef\r
+ V1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4\r
+ UVCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo\r
+ +swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR\r
+ 00bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6\r
+ XbktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLU\r
+ JwH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5\r
+ K1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQx\r
+ GMSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCm\r
+ oHLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYj\r
+ GVIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9Gph\r
+ GWIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJu\r
+ HNGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZ\r
+ WBOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHF\r
+ cWWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFF\r
+ qxh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMW\r
+ V8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGW\r
+ JxczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC\r
+ROLE:Developer\r
+SOUND;ENCODING=b:UklGRiQgAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAgAA\r
+ B/f39/f39/f39/f39/f4B/gH+Af4CAgIGBgYGBgYGBgYGBgYGBgYGBgIGAgICBgYGBgYGBgYCAg\r
+ YGAgICAgICAgIGBgICAgYCAgICBgICAgICAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAf4CAgICAgICAgICAgICAgIB/f4CAgICAgICAgIB/f4B/f39/f39/f3+AgICAf4CAf3\r
+ 9/gIB/f4CAgH9/gICAgH+AgICAgICAgICAf4CAgIB/gICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgIB/gICAf39/f39/f3+Af4CAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgH9/f39/f39/f39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYCAgICB\r
+ gICAgYGBgICAgICAgICAgIGAgICBgICBgYGBgYGBgYGAgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYG\r
+ BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgYGBgIGBgYGAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgH+AgICAgICAgICAgICAgICAgICAf4CAgIB/gH+Af4B/f39/f39/f\r
+ 39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYG\r
+ BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY\r
+ GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAgIGBgYCAgICBgYCAgYGBgYCAgICBg\r
+ YCAgICAgICAgICAgICAgIGAgICAgICAgICAgICAgYGBgYGAgICAgIGBgYCAgICBgYGAgICAgIGA\r
+ gICAgICAgIGBgYCBgYGAgYGBgYGBgoGBgYGCgoGAgICBgYGBgYCBgYKCgYGBgYGBgYGAgYGBgH9\r
+ /gIB/f3+AgIB/gH9/gICAf4CBgYB/f35+gIB/f4CBgX9/gYCAgYKCgYCAgYOBgICAgoGAf4GCgn\r
+ 9/gIB/gICBgH5/f4GAfX+BgYB+fn9/fn+Afn6Af39+f35+fn9+fn6AgH9/f4CAgYCAgYKCgH9/g\r
+ IKBf3+AgYJ/f4GCg4F/gIGCgoOBfoCDgYF/fH+BgYGAfn6Af4CCgn58gIN/fX+AgICBgYGAgYCB\r
+ goOCgICBgYB/fXyBhIGAgH5+f4GBgX9/f35+gIKCgXt9goN/f318f4GAf4B/fHt9fn5+fXx+fn5\r
+ /gH9+fHx/gHx9f4CAfn18gIB9e4GBfn5+foCBfHyAgoGAfX6CgYCBgH+DgHt9gYN/fX2BhYB7en\r
+ 6AgH98foKCgH18foCAfoCAf4CAf31+fn+AgH1+goJ/fX5/gIKAgIGAfH6CgX17foCBf3+BgoB/g\r
+ YOBgIB/f4KDgoJ+e3+ChIOBfn1/gX+BfX2BgH59foCCfn1/gX99fICAgoB/f39/gISCf36AgoSB\r
+ foCBgYGAf4CCf4CCgX5/gYKDgYB/gH+BhIOBgYB/gIOEhIF9foGCg4OBgICBgoOCgICChIOBg4O\r
+ CgoSDgoKAgYKBgoODhISBf4CCg4SEgoGCg4SEgH6BhIWEgX+EhYKAgoKFhIB+gIKChYKAgYOCgo\r
+ B+gYWFhIKAg4WEg4ODhIWFhYaGhIWGhYWGh4eHhYOCgoSFg4B/gIB+fX1+fn57e3t7fHt6fH5/f\r
+ 4GDhYiMkJGQj5GVmZycmZiXlZGIfXRwcnZ4d3Nva2hoamppaWxvc3R0dXl+iJCPjZShqrCzvNHi\r
+ rFYxOmKSrJ6UmJOAbV1ZboSMjI6JfnNjW2JweYGFg4B/e3Z0c3Btc3p9fHp4fIGBf3+Dh4qLjJG\r
+ YnZuWkY6MhnpwbnN6fHlya2hlZmdmaW9ycXFzd3t/g42cpquzvMzd/sRADiBZkL6xpLa1jFpANV\r
+ iHoJ2ioJWGbEQ2VHaOm5aHhIFuYmZzgoVxZFxfdJCSgnt/kKewr7bDsopcSV6JopyRjpOQfmNXZ\r
+ HmGhYB8fXtvXExKXnyKgnJsc3t8fZC0ysfK0+vHTxEeXY6yr6rAxJRSNTdbh5+fp7KjglQ6PVx3\r
+ ho6Ph3dmW15oa2x0hIuNkK3R18jJ0Ys8LUlxkqais8WtdlBFT2yDjpywro9mS0VVaXaBiIdyX2J\r
+ rcG5udYKKjaXT4dfV2Y82JkBpiaKkvdO2eE9GTGZ4hZu6u51yTUNOX2l9kZWKdl5PXG93dHeAip\r
+ KZut7j2tacRjJIYHCOo77XvoRdVlFYZniVuL+kfl9ST1Rcb4mTjoNxW1pqdXd5fH6CiKHN4d7k2\r
+ 4E4N05Yaoqo1eO0emVbTU5ZdKDCuZV9b1tMSVlyiYp8dHl7cmpqdYCCgIqixNTR2OqnRTlPXFt3\r
+ ksbnw4lzcFdKS2KMtLWZiIZwV0lPZXZ1b3uNinZqbXJ3dX2XxOPg4/zDUDRCTUhmiMXx1p+If1g\r
+ +O1J7pK+yspN3W0pGVGdugYmCen54b21rb3V9i6vZ7vD92WpAS0gzSny04tq3qp5qPDhHX3uVrs\r
+ KukXVhT0hRYnF/gnuCh31ubG9zdHeMs+Dr8P7KalFVOylJeq7QzMPIqmtIRUZOY4KovqicknhZS\r
+ 1BWXWh6gIeLiH91b21vc4GcyuXt/umTZGhGIjJfh6y+yt7LkGlfTD1GYYOipKKwnXhkXldVUFhs\r
+ dYOMjYWBem9ucoCWvNTm9+2weHdZMSpQboujvtnUrY6BZEdDUmV4jZypppeFd2dcWVFWWWh8hYS\r
+ Ii393c3Z7iJ3A1ePp3aGDfVYyOVZkfJe5zsavpJNsU1BTVmR9kpmcn5uGdGxoWU5VVGZ0fIKLh4\r
+ F/d3Z6g4ufuc3e3depjoViPz9VWm2FqLu8tLGifmphWlJZbH+Lj5+elod+c19WU0xUZW11gISEg\r
+ nx6e3h6g4qWp7zM3NrSpZGIYkRFVVVlfZ6vsbW3qIl7b2BUWGVwe4ybn52TkIRuX2BVRVFjZmp7\r
+ hIF9fX12cnZ6eX6LlZyousfP0c++jot6X0ZRXF9sgaCnqa6yn4eAdGZZYGlvd4mcnqCWnY91aWN\r
+ cSUtYYmJxf399f351cXFzcHF4foOIlZ+hp7CytLm8uLKNg4RtYF5oanN8j5qZnqGaioV9dGpqb3\r
+ J1f42Rk5iZjIKAcmFcW1RXYGhwdXt+e3Z2c25tcXJxd3yChY2Tl5udn6Gho6ioq6uonoaHbWNzZ\r
+ GdxgoGPlZqdj5CJgHFzcWxwdH1/hYqOioSFfnFpaWBdX2Jqb3N5fHh4eHNxcXFxc3d7foOJjI6Q\r
+ lZOSlZOTl5eYnJucnpyZkYiEfnd1dnZ5fYKHio6QkIyHg394dHRzc3Z5fHt2enJrcG5obG9sbW9\r
+ ucHJzdnh3eXp5eXt9foCDhoeJjI6OkJGSk5aYmZudn6Gjn5qLh4J3cnJ0dHR5g4GEi42Ih4aBfH\r
+ h4dXR1eHl4dXhuaW5rZ2ltaWttbW5vcnR1dHZ2dXV2d3d7fn+BhIeIiYuOjpCTlJWZnJueoKarr\r
+ ZuJhntvaW1ucnh+hIWJi4qFg4F7d3V1c3R3fH1/gHlvbXJnXmdpYmdtamtxcW9vbm9tamxtbG5z\r
+ dXZ5fHx7fX9+fH6AgoWHioyNj5CRlZeYmp2TiYyGenp9eXh9fX19foB/fH1/e3p8e3l5e3x7e3x\r
+ 6d3FxcnBwcG9vb29vb29wb25tbWxsbW5vb3Fyc3N1dXV1dnd4ent9fn+BgoGAgoWEhoqJiYyLi4\r
+ yPioaLiYSEh4WDhIOCgoKAgX58fXx5eXp4eHl4dXZ1cnN0dHR1cnJycXBxcnJycW9ubGxsbW1ub\r
+ m5ub29vcXNzdHZ2dXh6enp+fn5/gYCBhIKFiYeGiomJi4qKjIuLjIyLiomKh4aKioeIiIWDgYB9\r
+ fHx7e3l4eHh2dnd3d3l7enp6enp5ent7e3x7enl6e3t7fHx7e3p8fX5/gIKDg4GCg4KCg4OEhoe\r
+ Hh4iJiomLjIqLi4uLi46Pjo2OjouJiomHh4aDgH9/fXp5eXh3d3h4eHh4d3V2d3Z0dnd0dXd3d3\r
+ p7fH59fX19fH5+fn+Af4CAf3+Af359f4KDgoSIiIeJjI6PkJOUk5SYmZiYmZqZmJqamJiZmJaWl\r
+ ZSTkZCQj46Ni4qHh4iFgoKBfn9+fn+AgYCAgYOCgoSEg4SFhIODg4OCgICBf35/gICAgYKCgYGD\r
+ hIOBgYOCgYGAgIGBgIGCgoKBgoSEg4KCgH9/f318fHt6e3t7enl5eHh5fH18foCAf4GDg4OFhoa\r
+ GhoeJh4aJioiIiYiIhoWGh4aGh4eHiImHh4mIiIeHh4iIiIqJioqJh4mKh4eJiYiHh4eHhoWGhY\r
+ OEhYWEhYWDg4SFhYWEg4SDgYKCgH+AgICBgoOCgYGBgYKEhoaGhoiIh4eJiYmKioqKiomKioiJi\r
+ oqJiYmJiIiIiYiHh4eHh4eGhYWFhISDgoKCgoKCgYGAf31+fXx9fn58e3x8fHx9fX19fX19fX19\r
+ fHx9fn5/gICBgYGCgoKCg4OCgoODgoKDg4OCgoKCgoGBgYGBgYGCgYCBgIGCgoKDg4KCg4OEhIS\r
+ FhYWFhYWFhYWFhoWGhoWEhISDg4ODg4ODg4ODg4SDgoKDg4OCg4SDgoKDgoGBgoGAgIB/f35+fn\r
+ 9+fn9/f35+fn5/gICAgIGBgYKCg4ODg4SEg4OEhIODhIODhIODg4ODg4OCgoKBgoKCg4OCgoODg\r
+ 4ODg4OEhISEhIWEhIWFhISEhISEhIWEhISEhIODhISEg4ODg4ODg4ODg4ODgoKCgoKCg4KCgoKC\r
+ goKCgoKCgoOCgoKCgoKBgYKCgoKCgoGBgYGAgICAgYGBgYCAf39/f39/f3+Af39/f39/f39/gIC\r
+ AgIB/f39/f39/gICAgIB/f39/gIB/f39/gH9/f39/f39/fn5+f39/f39/fn5+fn5/f39/f39/fn\r
+ 5+fn9/f39/f35+fn5+fn9/f35/f39+fn5+fn9/fn5+fn5+fn5+f39+fn5+fn19fX5+fn5+fn5+f\r
+ X5+fn5+fn5+fn19fn5+fn5+fX19fX59fn5+fn19fX19fX1+fX19fX19fX19fX19fX19fX19fX19\r
+ fX19fX19fX19fX19fX19fX19fX19fX19fXx9fX18fH19fXx8fXx9fXx8fHx8fHx8fH19fX19fXx\r
+ 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX\r
+ 19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\r
+ X19fX19fX19fX19fX19fX19fX19fX19fX1+fX5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+\r
+ fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39\r
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f3\r
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f\r
+ 39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/\r
+ f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/f39/f39/f39/f39\r
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3\r
+ 9/f39/f39/f39/f39/f39/f35+fn5+f35/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+f\r
+ 39+fn5/fn5+f39/fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/\r
+ f39/f39/f39/f39/f39+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39\r
+ /f39/f39/f39/f39/f39/f39/f39/f4CAf39/f39/f39/gIB/f39/f39/f4B/f4CAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgIB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgIGBgYGAgYGBgICAgIGAgICBgYGAgYGBgYGBgYGBgYGBgY\r
+ GBgYGBgYGBgYGBgYGBgYGAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf39/gH9/f\r
+ 3+Af39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4CAgH9/gIB/f39/f4B/f3+AgICAf4CA\r
+ gICAgICAgICAgICAgH9/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgIB/f39/f39/f39/f4CAf39/f39/f39/f39/f39/f39+fn\r
+ 9/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fn5+fn5+fn9/f39/f4CAgICAgICBgYGBg\r
+ YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgYGAgICA\r
+ gICAgICAgICAgICBgYGAgICAgICAgICAgICAgICAgICAgICAgIB/gICAgH9/f39/f39/f39/f39\r
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgICAf39/f39/gH+AgI\r
+ CAgICAgIB/f39/f39/f4B/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn9/f39/f39/f39+f\r
+ 39/f39/f39/f39/f39/f39/f39/f4B/f4CAgICAf39/f39/gICAf39/gICAgICAgICAgICAgICA\r
+ gICAgIGAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICBgYGBgYGBgYCBgYGBgYCAgIG\r
+ BgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAf3+AgIB/f4CAf39/f39/f3+AgICAgH+AgICAf3+AgICAgICAgH9/f39/f39\r
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3\r
+ 9/f39/f39/gH9/gICAgICAgICAgIB/gICAgH+AgIB/f39/f39/gICAgICAgH9/f3+AgH9/f4B/f\r
+ 39/f39/f39/f39/f3+AgICAgICAf3+AgIB/f4CAgIB/f4CAgICAgICAgICAf39/f3+AgIB/f4CA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf39/f39\r
+ /f4CAgH9/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/gIB/f39/f39/f39/gH9/f3\r
+ 9/f4CAgICAgIB/gICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf4CAgICAgICAgIB/gICAf\r
+ 4CAgICAgH+Af4CAgH9/f39/f39/f39/gICAgICAgICAgICAf39/f39/f4CAgH9/gICAf3+AgICA\r
+ gICAgICAgICAgICAgICAgICAgIB/f39/gIB/f4CAgIB/f4CAgH9/gICAf39/f39/f39/f39/f39\r
+ /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3\r
+ 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAf39/gH9/f3+AgH9/f39/f39/f39/f39/f\r
+ 39/f39/f39/f39/f39/f39/f39/gICAf3+AgH9/f3+AgH9/f4CAgH9/gICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAgICAgICBgYGBgIGBgYCAgYGAgICAgYCAgICAgICAgICAgICAgICAg\r
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\r
+ gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\r
+ AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\r
+ CAgICAgICAgICAgICAgICAf39/f39/f4CAgIB/f4CAgICAgICAgICAgICAgICAgICAgICAgICAg\r
+ ICAf39/f3+Af39/f39/f39/f4B/f39/f4CAgICAgICAgICAgA==\r
+TEL;TYPE=HOME:0351 223344\r
+TEL;TYPE=WORK:0351 443322\r
+TEL;TYPE=CELL:0173 223344\r
+UID:P9HXg34Oav\r
+URL:http://www.mustermann.de/~heiko/\r
+X-KADDRESSBOOK-X-Anniversary:1982-07-07\r
+X-KADDRESSBOOK-X-AssistantsName:Mr. Smithers\r
+X-KADDRESSBOOK-X-Department:Edutainment\r
+X-KADDRESSBOOK-X-IMAddress:122334455\r
+X-KADDRESSBOOK-X-ManagersName:Mr. Burnes\r
+X-KADDRESSBOOK-X-Office:223 2nd stage\r
+X-KADDRESSBOOK-X-Profession:Clown\r
+X-KADDRESSBOOK-X-SpousesName:femal clown\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard6.vcf b/autotests/data/vcard6.vcf
new file mode 100644 (file)
index 0000000..92339c7
--- /dev/null
@@ -0,0 +1,10 @@
+BEGIN:VCARD
+CLASS:PUBLIC
+EMAIL;TYPE=PREF:email1@abc.de
+EMAIL:email2@abc.de
+FN:Test User
+N:User;Test;;;
+UID:uJTkVqH5Qt
+VERSION:3.0
+END:VCARD
+
diff --git a/autotests/data/vcard6.vcf.2_1ref b/autotests/data/vcard6.vcf.2_1ref
new file mode 100644 (file)
index 0000000..d5a5a9b
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+EMAIL;PREF:email1@abc.de\r
+EMAIL:email2@abc.de\r
+FN:Test User\r
+N:User;Test;;;\r
+UID:uJTkVqH5Qt\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard6.vcf.ref b/autotests/data/vcard6.vcf.ref
new file mode 100644 (file)
index 0000000..712afe7
--- /dev/null
@@ -0,0 +1,10 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+CLASS:PUBLIC\r
+EMAIL;TYPE=PREF:email1@abc.de\r
+EMAIL:email2@abc.de\r
+FN:Test User\r
+N:User;Test;;;\r
+UID:uJTkVqH5Qt\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard7.vcf b/autotests/data/vcard7.vcf
new file mode 100644 (file)
index 0000000..8b5be8e
--- /dev/null
@@ -0,0 +1,7 @@
+BEGIN:VCARD
+N:
+LABEL;QUOTED-PRINTABLE;WORK:401 Park Drive  3 West=0ABoston, MA 02215=0AUSA=0A=
+Herecomesyetanotherline
+UID:pas-id-3E136F9B00000000
+END:VCARD
+
diff --git a/autotests/data/vcard7.vcf.2_1ref b/autotests/data/vcard7.vcf.2_1ref
new file mode 100644 (file)
index 0000000..5d4e702
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN:VCARD\r
+VERSION:2.1\r
+LABEL;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE;WORK:401 Park Drive  3 West\n\r
+ Boston\, MA 02215\nUSA\nHerecomesyetanotherline\r
+N:;;;;\r
+UID:pas-id-3E136F9B00000000\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard7.vcf.ref b/autotests/data/vcard7.vcf.ref
new file mode 100644 (file)
index 0000000..b099b98
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+LABEL;TYPE=work:401 Park Drive  3 West\nBoston\, MA 02215\nUSA\nHerecomesye\r
+ tanotherline\r
+N:;;;;\r
+UID:pas-id-3E136F9B00000000\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard8.vcf b/autotests/data/vcard8.vcf
new file mode 100644 (file)
index 0000000..eff34b8
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN:VCARD\r
+FN:test\r
+N:test;;;;\r
+NOTE:line one\Nline two\Nline three\N\r
+UID:8OD165Pope\r
+VERSION:3.0\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard8.vcf.ref b/autotests/data/vcard8.vcf.ref
new file mode 100644 (file)
index 0000000..54f7dbc
--- /dev/null
@@ -0,0 +1,8 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:test\r
+N:test;;;;\r
+NOTE:line one\nline two\nline three\n\r
+UID:8OD165Pope\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard9.vcf b/autotests/data/vcard9.vcf
new file mode 100644 (file)
index 0000000..c38153b
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD\r
+FN:βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγ\r
+ δεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεα\r
+ βγδ1βγδεαβγδ1βγδεαβγδ1\r
+N:123ㄓㄕㄖbcdeαβγδαβγδαβγδαβγδαβγδαβγδαβㄤ\r
+ ㄓㄕㄖ;;;;\r
+NOTE:Длинный комментарий на русском языке\,\r
+  Ñ\87Ñ\82обÑ\8b Ð² Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82е Ð¿Ð¾Ð»Ñ\83Ñ\87илаÑ\81Ñ\8c Ñ\81Ñ\82Ñ\80ока Ð±Ð¾Ð\r
+ »ÐµÐµ 70 Ñ\81имволов.\r
+PRODID:-//ownCloud//NONSGML Contacts 0.3//EN\r
+UID:20140316T155019.877e370c11@martin\r
+VERSION:3.0\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard9.vcf.ref b/autotests/data/vcard9.vcf.ref
new file mode 100644 (file)
index 0000000..cbb9ed8
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγ\r
+ δεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεα\r
+ βγδ1βγδεαβγδ1βγδεαβγδ1\r
+N:123ㄓㄕㄖbcdeαβγδαβγδαβγδαβγδαβγδαβγδαβㄤ\r
+ ㄓㄕㄖ;;;;\r
+NOTE:Длинный комментарий на русском языке\,\r
+  чтобы в результате получилась строка бо\r
+ лее 70 символов.\r
+PRODID:-//ownCloud//NONSGML Contacts 0.3//EN\r
+UID:20140316T155019.877e370c11@martin\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard_extension_case_normalization.vcf b/autotests/data/vcard_extension_case_normalization.vcf
new file mode 100644 (file)
index 0000000..7262727
--- /dev/null
@@ -0,0 +1,18 @@
+BEGIN:VCARD
+VERSION:3.0
+FN:My Name
+N:Name;My;;;
+UID:628d6072-5385-41d3-ad45-cb79a3afa987
+X-KADDRESSBOOK-BLOGFEED:https://my.blog/
+X-KADDRESSBOOK-CRYPTOENCRYPTPREF:askAlways
+X-KADDRESSBOOK-CRYPTOPROTOPREF:inline openpgp\,openpgp/mime\,s/mime\,s/mime
+  opaque\,any s/mime\,any openpgp
+X-KADDRESSBOOK-CRYPTOSIGNPREF:always
+X-KADDRESSBOOK-X-ANNIVERSARY:1970-01-01
+X-KADDRESSBOOK-X-ASSISTANTSNAME:Mycroft
+X-KADDRESSBOOK-X-MANAGERSNAME:My Boss
+X-KADDRESSBOOK-X-OFFICE:My Office
+X-KADDRESSBOOK-X-PROFESSION:My Job
+X-KADDRESSBOOK-X-SPOUSESNAME:My Spouse
+END:VCARD
+
diff --git a/autotests/data/vcard_extension_case_normalization.vcf.ref b/autotests/data/vcard_extension_case_normalization.vcf.ref
new file mode 100644 (file)
index 0000000..a173526
--- /dev/null
@@ -0,0 +1,18 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:My Name\r
+N:Name;My;;;\r
+UID:628d6072-5385-41d3-ad45-cb79a3afa987\r
+X-KADDRESSBOOK-BlogFeed:https://my.blog/\r
+X-KADDRESSBOOK-CRYPTOENCRYPTPREF:askAlways\r
+X-KADDRESSBOOK-CRYPTOPROTOPREF:inline openpgp\,openpgp/mime\,s/mime\,s/mime\r
+  opaque\,any s/mime\,any openpgp\r
+X-KADDRESSBOOK-CRYPTOSIGNPREF:always\r
+X-KADDRESSBOOK-X-Anniversary:1970-01-01\r
+X-KADDRESSBOOK-X-AssistantsName:Mycroft\r
+X-KADDRESSBOOK-X-ManagersName:My Boss\r
+X-KADDRESSBOOK-X-Office:My Office\r
+X-KADDRESSBOOK-X-Profession:My Job\r
+X-KADDRESSBOOK-X-SpousesName:My Spouse\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcard_legacy_messaging_fields.vcf b/autotests/data/vcard_legacy_messaging_fields.vcf
new file mode 100644 (file)
index 0000000..c983129
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN:VCARD
+VERSION:3.0
+FN:My Name
+N:Name;My;;;
+UID:12345
+X-messaging/twitter-All:kdecommunity
+X-messaging/irc-All:konqui
+X-messaging/xmpp-All:one@test.orgtwo@test.org
+END:VCARD
diff --git a/autotests/data/vcard_legacy_messaging_fields.vcf.ref b/autotests/data/vcard_legacy_messaging_fields.vcf.ref
new file mode 100644 (file)
index 0000000..d10b9d7
--- /dev/null
@@ -0,0 +1,11 @@
+BEGIN:VCARD\r
+VERSION:3.0\r
+FN:My Name\r
+IMPP:irc:konqui\r
+IMPP:twitter:kdecommunity\r
+IMPP:xmpp:one@test.org\r
+IMPP:xmpp:two@test.org\r
+N:Name;My;;;\r
+UID:12345\r
+END:VCARD\r
+\r
diff --git a/autotests/data/vcardwithitemasapplesupport.vcf b/autotests/data/vcardwithitemasapplesupport.vcf
new file mode 100644 (file)
index 0000000..8d3b51b
--- /dev/null
@@ -0,0 +1,13 @@
+BEGIN:VCARD
+VERSION:3.0
+FN:Name of Broken Card
+N:;SOMENAME;;;
+NOTE:SOME NOTES
+ORG:SOME COMPANY
+PRODID:-//Apple Inc.//Mac OS X 10.11.6//EN
+REV:2018-01-25T21:50:41Z
+TEL;TYPE=PREF,VOICE,WORK:(111) 111-1111
+UID:fe395f83-d5a6-49e3-ae22-ae0799a5aa99
+X-ABShowAs-ABShowAs:COMPANY
+item1.ADR;TYPE=WORK,pref:;;STREET;CITY;STATE;ZIP;COUNTRY
+END:VCARD
diff --git a/autotests/data/vcardwithitemasapplesupport.vcf.ref b/autotests/data/vcardwithitemasapplesupport.vcf.ref
new file mode 100644 (file)
index 0000000..8541896
--- /dev/null
@@ -0,0 +1,14 @@
+BEGIN:VCARD
+VERSION:3.0
+ADR;TYPE=pref,work:;;STREET;CITY;STATE;ZIP;COUNTRY
+FN:Name of Broken Card
+N:;SOMENAME;;;
+NOTE:SOME NOTES
+ORG:SOME COMPANY
+PRODID:-//Apple Inc.//Mac OS X 10.11.6//EN
+REV:2018-01-25T21:50:41Z
+TEL;TYPE=PREF,VOICE,WORK:(111) 111-1111
+UID:fe395f83-d5a6-49e3-ae22-ae0799a5aa99
+X-ABShowAs-ABShowAs:COMPANY
+END:VCARD
+
diff --git a/autotests/datetimetest.cpp b/autotests/datetimetest.cpp
new file mode 100644 (file)
index 0000000..51846d4
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+    This file is part of kcontacts.
+    SPDX-FileCopyrightText: 2016 Benjamin Löwe <benni@mytum.de>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "datetimetest.h"
+#include <QTest>
+#include <vcardtool_p.h>
+
+DateTimeTest::DateTimeTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+DateTimeTest::~DateTimeTest()
+{
+}
+
+void DateTimeTest::shouldParseDateTime()
+{
+    using namespace KContacts;
+
+    QDateTime expected;
+    QDateTime dt;
+    bool timeIsValid;
+
+    dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33:30+0200"));
+    expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, 2 * 3600);
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33:30+02"));
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("20160120T123330+0200"));
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33Z"));
+    expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 0), Qt::UTC);
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33-0300"));
+    expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 0), Qt::OffsetFromUTC, -3 * 3600);
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33"), &timeIsValid);
+    expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 0), Qt::LocalTime);
+    QCOMPARE(dt, expected);
+    QVERIFY(timeIsValid);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20"), &timeIsValid);
+    expected = QDateTime(QDate(2016, 1, 20), QTime(), Qt::LocalTime);
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+    QVERIFY(!timeIsValid);
+    QCOMPARE(dt.time(), QTime(0, 0));
+
+    dt = VCardTool::parseDateTime(QStringLiteral("T1233Z"), &timeIsValid);
+    QVERIFY(!dt.isValid());
+    QVERIFY(timeIsValid);
+    QCOMPARE(dt.time(), QTime(12, 33));
+
+    dt = VCardTool::parseDateTime(QStringLiteral("--0120"));
+    expected = QDateTime(QDate(-1, 1, 20).startOfDay());
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+
+    dt = VCardTool::parseDateTime(QStringLiteral("--01-20"));
+    expected = QDateTime(QDate(-1, 1, 20).startOfDay());
+    QCOMPARE(dt, expected);
+    QVERIFY(dt.isValid());
+}
+
+void DateTimeTest::shouldCreateDateTime()
+{
+    using namespace KContacts;
+
+    QDateTime dt;
+    QString str;
+    QString expected;
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::UTC);
+    str = VCardTool::createDateTime(dt, VCard::v4_0);
+    expected = QStringLiteral("20160120T123330Z");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(), Qt::UTC);
+    str = VCardTool::createDateTime(dt, VCard::v4_0);
+    expected = QStringLiteral("20160120T000000Z");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::LocalTime);
+    str = VCardTool::createDateTime(dt, VCard::v4_0);
+    expected = QStringLiteral("20160120T123330");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, -2 * 3600);
+    str = VCardTool::createDateTime(dt, VCard::v4_0);
+    expected = QStringLiteral("20160120T123330-0200");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, +2.5 * 3600);
+    str = VCardTool::createDateTime(dt, VCard::v4_0);
+    expected = QStringLiteral("20160120T123330+0230");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, -2 * 3600);
+    str = VCardTool::createDateTime(dt, VCard::v3_0);
+    expected = QStringLiteral("2016-01-20T12:33:30-02:00");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(), QTime(12, 33, 30), Qt::OffsetFromUTC, -2 * 3600);
+    str = VCardTool::createDateTime(dt, VCard::v3_0);
+    expected = QString();
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30));
+    str = VCardTool::createDateTime(dt, VCard::v3_0, false);
+    expected = QStringLiteral("2016-01-20");
+    QCOMPARE(str, expected);
+
+    dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30));
+    str = VCardTool::createDateTime(dt, VCard::v4_0, false);
+    expected = QStringLiteral("20160120");
+    QCOMPARE(str, expected);
+}
+
+void DateTimeTest::shouldCreateDate()
+{
+    using namespace KContacts;
+
+    QDate d;
+    QString str;
+    QString expected;
+
+    d = QDate(2016, 1, 20);
+    str = VCardTool::createDate(d, VCard::v3_0);
+    expected = QStringLiteral("2016-01-20");
+    QCOMPARE(str, expected);
+
+    d = QDate(2016, 1, 20);
+    str = VCardTool::createDate(d, VCard::v4_0);
+    expected = QStringLiteral("20160120");
+    QCOMPARE(str, expected);
+
+    d = QDate(-1, 1, 20);
+    str = VCardTool::createDate(d, VCard::v3_0);
+    expected = QStringLiteral("--01-20");
+    QCOMPARE(str, expected);
+
+    d = QDate(-1, 1, 20);
+    str = VCardTool::createDate(d, VCard::v4_0);
+    expected = QStringLiteral("--0120");
+    QCOMPARE(str, expected);
+}
+
+QTEST_MAIN(DateTimeTest)
diff --git a/autotests/datetimetest.h b/autotests/datetimetest.h
new file mode 100644 (file)
index 0000000..e1e3a30
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+    This file is part of kcontacts.
+    SPDX-FileCopyrightText: 2016 Benjamin Löwe <benni@mytum.de>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef DATETIMETEST_H
+#define DATETIMETEST_H
+
+#include <QObject>
+
+class DateTimeTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit DateTimeTest(QObject *parent = nullptr);
+    ~DateTimeTest() override;
+
+private Q_SLOTS:
+    void shouldParseDateTime();
+    void shouldCreateDateTime();
+    void shouldCreateDate();
+};
+
+#endif // DATETIMETEST_H
diff --git a/autotests/emailtest.cpp b/autotests/emailtest.cpp
new file mode 100644 (file)
index 0000000..697667a
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+#include "emailtest.h"
+#include "email.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+EmailTest::EmailTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+EmailTest::~EmailTest()
+{
+}
+
+void EmailTest::shouldHaveDefaultValue()
+{
+    KContacts::Email email;
+    QVERIFY(!email.isValid());
+    QVERIFY(email.mail().isEmpty());
+    QVERIFY(email.params().empty());
+}
+
+void EmailTest::shouldAssignValue()
+{
+    const QString mail(QStringLiteral("foo@kde.org"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Email email(mail);
+    email.setParams(params);
+    QVERIFY(email.isValid());
+    QVERIFY(!email.mail().isEmpty());
+    QCOMPARE(email.mail(), mail);
+    QVERIFY(!email.params().empty());
+    QCOMPARE(email.params(), params);
+}
+
+void EmailTest::shouldAssignExternal()
+{
+    KContacts::Email email;
+    const QString mail(QStringLiteral("foo@kde.org"));
+    email.setEmail(mail);
+    QVERIFY(email.isValid());
+    QVERIFY(!email.mail().isEmpty());
+    QCOMPARE(email.mail(), mail);
+}
+
+void EmailTest::shouldSerialized()
+{
+    KContacts::Email email;
+    KContacts::Email result;
+    const QString mail(QStringLiteral("foo@kde.org"));
+    email.setEmail(mail);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    email.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << email;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(email == result);
+}
+
+void EmailTest::shouldEqualEmail()
+{
+    KContacts::Email email;
+    KContacts::Email result;
+    const QString mail(QStringLiteral("foo@kde.org"));
+    email.setEmail(mail);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    email.setParams(params);
+
+    result = email;
+    QVERIFY(email == result);
+}
+
+void EmailTest::shouldParseEmailVCard()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:foo@foo.com\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(!lst.at(0).emailList().isEmpty());
+    QCOMPARE(lst.at(0).emailList().count(), 1);
+    KContacts::Email email = lst.at(0).emailList().at(0);
+    QCOMPARE(email.mail(), QStringLiteral("foo@foo.com"));
+    QCOMPARE(email.params().size(), 2);
+}
+
+void EmailTest::shouldParseEmailVCardWithMultiEmails()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=2:foo@foo.com\n"
+        "EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:bla@bla.com\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(!lst.at(0).emailList().isEmpty());
+    QCOMPARE(lst.at(0).emailList().count(), 2);
+    KContacts::Email email = lst.at(0).emailList().at(0);
+    QCOMPARE(email.mail(), QStringLiteral("bla@bla.com"));
+    QCOMPARE(email.type(), KContacts::Email::Home);
+    QVERIFY(email.isPreferred());
+    email = lst.at(0).emailList().at(1);
+    QCOMPARE(email.mail(), QStringLiteral("foo@foo.com"));
+    QCOMPARE(email.type(), KContacts::Email::Work);
+    QVERIFY(!email.isPreferred());
+
+    QCOMPARE(email.params().size(), 2);
+}
+
+void EmailTest::shouldParseEmailVCardWithoutEmail()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(lst.at(0).emailList().isEmpty());
+}
+
+void EmailTest::shouldExportVcard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    KContacts::VCardTool vcard;
+    QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "EMAIL:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+
+    KContacts::Addressee addr2;
+    addr2.setUid(QStringLiteral("testuid"));
+    KContacts::Email email1;
+    KContacts::Email email2;
+    email1.setEmail(QStringLiteral("foo@kde.org"));
+    email1.setType(KContacts::Email::Work);
+    email1.setPreferred(true);
+    email2.setEmail(QStringLiteral("bla@kde.org"));
+    email2.setType(KContacts::Email::Home);
+    addr2.setEmailList({email1, email2});
+    ba = vcard.exportVCards({addr2}, KContacts::VCard::v4_0);
+    QByteArray expected2(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL;TYPE=WORK,PREF:foo@kde.org\r\n"
+        "EMAIL;TYPE=HOME:bla@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected2);
+}
+
+QTEST_MAIN(EmailTest)
diff --git a/autotests/emailtest.h b/autotests/emailtest.h
new file mode 100644 (file)
index 0000000..daa9ea1
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef EMAILTEST_H
+#define EMAILTEST_H
+
+#include <QObject>
+
+class EmailTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit EmailTest(QObject *parent = nullptr);
+    ~EmailTest() override;
+
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualEmail();
+    void shouldParseEmailVCard();
+    void shouldParseEmailVCardWithoutEmail();
+    void shouldParseEmailVCardWithMultiEmails();
+    void shouldExportVcard();
+};
+
+#endif // EMAILTEST_H
diff --git a/autotests/fieldgrouptest.cpp b/autotests/fieldgrouptest.cpp
new file mode 100644 (file)
index 0000000..cd93f3d
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "fieldgrouptest.h"
+#include "fieldgroup.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+FieldGroupTest::FieldGroupTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+FieldGroupTest::~FieldGroupTest()
+{
+}
+
+void FieldGroupTest::shouldHaveDefaultValue()
+{
+    KContacts::FieldGroup fieldgroup;
+    QVERIFY(!fieldgroup.isValid());
+    QVERIFY(fieldgroup.fieldGroupName().isEmpty());
+    QVERIFY(fieldgroup.params().empty());
+    QVERIFY(fieldgroup.value().isEmpty());
+}
+
+void FieldGroupTest::shouldAssignValue()
+{
+    const QString fielgroundname(QStringLiteral("fr"));
+    const QString value(QStringLiteral("bla"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::FieldGroup fieldGroup(fielgroundname);
+    fieldGroup.setParams(params);
+    fieldGroup.setValue(value);
+    QVERIFY(fieldGroup.isValid());
+    QVERIFY(!fieldGroup.fieldGroupName().isEmpty());
+    QCOMPARE(fieldGroup.fieldGroupName(), fielgroundname);
+    QVERIFY(!fieldGroup.params().empty());
+    QCOMPARE(fieldGroup.params(), params);
+    QCOMPARE(fieldGroup.value(), value);
+}
+
+void FieldGroupTest::shouldAssignExternal()
+{
+    KContacts::FieldGroup fieldgroup;
+    const QString fieldgroundname(QStringLiteral("fr"));
+    const QString value(QStringLiteral("bla"));
+    fieldgroup.setValue(value);
+    fieldgroup.setFieldGroupName(fieldgroundname);
+    QVERIFY(fieldgroup.isValid());
+    QCOMPARE(fieldgroup.fieldGroupName(), fieldgroundname);
+    QCOMPARE(fieldgroup.value(), value);
+}
+
+void FieldGroupTest::shouldSerialized()
+{
+    KContacts::FieldGroup fieldGroup;
+    KContacts::FieldGroup result;
+    const QString lang(QStringLiteral("fr"));
+    fieldGroup.setFieldGroupName(lang);
+    const QString value(QStringLiteral("bla"));
+    fieldGroup.setValue(value);
+
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    fieldGroup.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << fieldGroup;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(fieldGroup == result);
+}
+
+void FieldGroupTest::shouldEqualFieldGroup()
+{
+    KContacts::FieldGroup fieldGroup;
+    KContacts::FieldGroup result;
+    const QString lang(QStringLiteral("fr"));
+    const QString value(QStringLiteral("bla"));
+    fieldGroup.setValue(value);
+    fieldGroup.setFieldGroupName(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    fieldGroup.setParams(params);
+
+    result = fieldGroup;
+    QVERIFY(fieldGroup == result);
+}
+
+void FieldGroupTest::shouldParseFieldGroup()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "fr.foo:bla\n"
+        "fr2.foo:bla\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).fieldGroupList().count(), 2);
+}
+
+void FieldGroupTest::shouldParseWithoutFieldGroup()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).fieldGroupList().count(), 0);
+}
+
+void FieldGroupTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::FieldGroup::List lstFieldGroup;
+    KContacts::FieldGroup fieldGroup(QStringLiteral("fr"));
+    const QString value(QStringLiteral("bla"));
+    fieldGroup.setValue(value);
+    lstFieldGroup << fieldGroup;
+    addr.setFieldGroupList(lstFieldGroup);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "fr:bla\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void FieldGroupTest::shouldCreateVCardWithTwoLang()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::FieldGroup::List lstFieldGroup;
+    KContacts::FieldGroup fieldGroup1(QStringLiteral("fr"));
+    const QString value(QStringLiteral("bla"));
+    fieldGroup1.setValue(value);
+
+    KContacts::FieldGroup fieldGroup2(QStringLiteral("fr2"));
+    fieldGroup2.setValue(value);
+    lstFieldGroup << fieldGroup1 << fieldGroup2;
+    addr.setFieldGroupList(lstFieldGroup);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "fr:bla\r\n"
+        "fr2:bla\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void FieldGroupTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    const QString value(QStringLiteral("bla"));
+    KContacts::FieldGroup::List lstFieldGroup;
+    KContacts::FieldGroup fieldGroup(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    fieldGroup.setParams(params);
+    fieldGroup.setValue(value);
+    lstFieldGroup << fieldGroup;
+    addr.setFieldGroupList(lstFieldGroup);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "fr;FOO1=bla1,blo1;FOO2=bla2,blo2:bla\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void FieldGroupTest::shouldNotGenerateFieldGroupForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::FieldGroup::List lstFieldGroup;
+    KContacts::FieldGroup fieldGroup(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    fieldGroup.setParams(params);
+    const QString value(QStringLiteral("bla"));
+    fieldGroup.setValue(value);
+    lstFieldGroup << fieldGroup;
+    addr.setFieldGroupList(lstFieldGroup);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "fr;FOO1=bla1,blo1;FOO2=bla2,blo2:bla\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(FieldGroupTest)
diff --git a/autotests/fieldgrouptest.h b/autotests/fieldgrouptest.h
new file mode 100644 (file)
index 0000000..819475e
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef FieldGroupTest_H
+#define FieldGroupTest_H
+
+#include <QObject>
+
+class FieldGroupTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit FieldGroupTest(QObject *parent = nullptr);
+    ~FieldGroupTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualFieldGroup();
+    void shouldParseFieldGroup();
+    void shouldParseWithoutFieldGroup();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoLang();
+    void shouldCreateVCardWithParameters();
+    void shouldNotGenerateFieldGroupForVCard3();
+};
+
+#endif // FieldGroupTest_H
diff --git a/autotests/gendertest.cpp b/autotests/gendertest.cpp
new file mode 100644 (file)
index 0000000..d5d1360
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "gendertest.h"
+#include "gender.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+GenderTest::GenderTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+GenderTest::~GenderTest()
+{
+}
+
+void GenderTest::shouldHaveDefaultValue()
+{
+    KContacts::Gender gender;
+    QVERIFY(!gender.isValid());
+    QVERIFY(gender.gender().isEmpty());
+    QVERIFY(gender.comment().isEmpty());
+}
+
+void GenderTest::shouldAssignValue()
+{
+    const QString genderStr(QStringLiteral("F"));
+    KContacts::Gender gender(genderStr);
+    const QString commentStr(QStringLiteral("foo"));
+    gender.setComment(commentStr);
+    QVERIFY(gender.isValid());
+    QVERIFY(!gender.gender().isEmpty());
+    QCOMPARE(gender.gender(), genderStr);
+    QVERIFY(!gender.comment().isEmpty());
+    QCOMPARE(gender.comment(), commentStr);
+}
+
+void GenderTest::shouldAssignExternal()
+{
+    KContacts::Gender gender;
+    const QString genderStr(QStringLiteral("H"));
+    gender.setGender(genderStr);
+    QVERIFY(gender.isValid());
+    QVERIFY(!gender.gender().isEmpty());
+    QCOMPARE(gender.gender(), genderStr);
+}
+
+void GenderTest::shouldSerialized()
+{
+    KContacts::Gender gender;
+    KContacts::Gender result;
+    const QString genderStr(QStringLiteral("H"));
+    gender.setGender(genderStr);
+    gender.setComment(QStringLiteral("foo"));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << gender;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(gender == result);
+}
+
+void GenderTest::shouldEqualGender()
+{
+    KContacts::Gender gender;
+    KContacts::Gender result;
+    const QString genderStr(QStringLiteral("H"));
+    gender.setGender(genderStr);
+    gender.setComment(QStringLiteral("foo"));
+
+    result = gender;
+    QVERIFY(gender == result);
+}
+
+void GenderTest::shouldParseGender_data()
+{
+    QTest::addColumn<QByteArray>("vcarddata");
+    QTest::addColumn<QString>("genre");
+    QTest::addColumn<QString>("comment");
+    QTest::addColumn<bool>("hasGender");
+
+    QByteArray str(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+    QTest::newRow("nogender") << str << QString() << QString() << false;
+
+    str = QByteArray(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "GENDER:H\n"
+        "END:VCARD\n");
+    QTest::newRow("hasgenderbutnocomment") << str << QStringLiteral("H") << QString() << true;
+
+    str = QByteArray(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "GENDER:;foo\n"
+        "END:VCARD\n");
+    QTest::newRow("hasgenderbutnotypebutcomment") << str << QString() << QStringLiteral("foo") << true;
+
+    str = QByteArray(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "GENDER:H;foo\n"
+        "END:VCARD\n");
+    QTest::newRow("hasgendertypeandcomment") << str << QStringLiteral("H") << QStringLiteral("foo") << true;
+}
+
+void GenderTest::shouldParseGender()
+{
+    QFETCH(QByteArray, vcarddata);
+    QFETCH(QString, genre);
+    QFETCH(QString, comment);
+    QFETCH(bool, hasGender);
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).gender().isValid(), hasGender);
+    QCOMPARE(lst.at(0).gender().comment(), comment);
+    QCOMPARE(lst.at(0).gender().gender(), genre);
+}
+
+QByteArray GenderTest::createCard(const QByteArray &gender)
+{
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n");
+    if (!gender.isEmpty()) {
+        expected += gender + "\r\n";
+    }
+    expected += QByteArray(
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    return expected;
+}
+
+void GenderTest::shouldExportEmptyGender()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected = createCard(QByteArray());
+    QCOMPARE(ba, expected);
+}
+
+void GenderTest::shouldExportOnlyGenderWithoutCommentGender()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Gender gender;
+    gender.setGender(QStringLiteral("H"));
+    addr.setGender(gender);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected = createCard(QByteArray("GENDER:H"));
+    QCOMPARE(ba, expected);
+}
+
+void GenderTest::shouldExportOnlyGenderWithCommentGender()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Gender gender;
+    gender.setGender(QStringLiteral("H"));
+    gender.setComment(QStringLiteral("comment"));
+    addr.setGender(gender);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected = createCard(QByteArray("GENDER:H;comment"));
+    QCOMPARE(ba, expected);
+}
+
+void GenderTest::shouldExportOnlyGenderWithoutTypeCommentGender()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Gender gender;
+    gender.setComment(QStringLiteral("comment"));
+    addr.setGender(gender);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected = createCard(QByteArray("GENDER:;comment"));
+    QCOMPARE(ba, expected);
+}
+
+void GenderTest::shouldNotExportInVcard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Gender gender;
+    gender.setComment(QStringLiteral("comment"));
+    addr.setGender(gender);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(GenderTest)
diff --git a/autotests/gendertest.h b/autotests/gendertest.h
new file mode 100644 (file)
index 0000000..e49ad0c
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef GENDERTEST_H
+#define GENDERTEST_H
+
+#include <QObject>
+
+class GenderTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit GenderTest(QObject *parent = nullptr);
+    ~GenderTest() override;
+
+private:
+    QByteArray createCard(const QByteArray &gender);
+
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualGender();
+    void shouldParseGender();
+    void shouldParseGender_data();
+    void shouldExportOnlyGenderWithoutCommentGender();
+    void shouldExportEmptyGender();
+    void shouldExportOnlyGenderWithCommentGender();
+    void shouldExportOnlyGenderWithoutTypeCommentGender();
+    void shouldNotExportInVcard3();
+};
+
+#endif // GENDERTEST_H
diff --git a/autotests/geotest.cpp b/autotests/geotest.cpp
new file mode 100644 (file)
index 0000000..1d9be6d
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "geotest.h"
+#include "kcontacts/geo.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+QTEST_MAIN(GeoTest)
+
+void GeoTest::constructor()
+{
+    KContacts::Geo geo(1.2f, 3.4f);
+
+    QVERIFY((float)geo.latitude() == (float)1.2);
+    QVERIFY((float)geo.longitude() == (float)3.4);
+}
+
+void GeoTest::isValid()
+{
+    KContacts::Geo geo;
+
+    QVERIFY(!geo.isValid());
+
+    geo.setLatitude(23);
+
+    QVERIFY(!geo.isValid());
+
+    geo.setLongitude(45);
+
+    QVERIFY(geo.isValid());
+
+    geo.clear();
+
+    QVERIFY(!geo.isValid());
+    QVERIFY(geo == KContacts::Geo());
+}
+
+void GeoTest::setData()
+{
+    KContacts::Geo geo;
+
+    geo.setLatitude(22.5f);
+    geo.setLongitude(45.1f);
+
+    QVERIFY((float)geo.latitude() == (float)22.5);
+    QVERIFY((float)geo.longitude() == (float)45.1);
+}
+
+void GeoTest::equals()
+{
+    KContacts::Geo geo1(22.5f, 33.7f);
+    KContacts::Geo geo2(22.5f, 33.7f);
+
+    QVERIFY(geo1 == geo2);
+}
+
+void GeoTest::differs()
+{
+    KContacts::Geo geo1(22.5f, 33.7f);
+    KContacts::Geo geo2(22.5f, 33.6f);
+
+    QVERIFY(geo1 != geo2);
+}
+
+void GeoTest::serialization()
+{
+    KContacts::Geo geo1(22.5f, 33.7f);
+    QByteArray data;
+
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << geo1;
+
+    KContacts::Geo geo2;
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> geo2;
+
+    QVERIFY(geo1 == geo2);
+}
+
+void GeoTest::shouldParseGeoVCard3()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "GEO:22.5;180.0\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(lst.at(0).geo().isValid());
+    KContacts::Geo geo = lst.at(0).geo();
+    QCOMPARE(geo.latitude(), 22.5);
+    QCOMPARE(geo.longitude(), 180.0);
+}
+
+void GeoTest::shouldParseGeoVCard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:4.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "GEO:geo:22.5,180.0\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(lst.at(0).geo().isValid());
+    KContacts::Geo geo = lst.at(0).geo();
+    QCOMPARE(geo.latitude(), 22.5);
+    QCOMPARE(geo.longitude(), 180.0);
+}
+
+void GeoTest::shouldGenerateVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+
+    KContacts::Geo geo;
+    geo.setLongitude(180.0);
+    geo.setLatitude(22.5);
+    addr.setGeo(geo);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "GEO:22.500000;180.000000\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void GeoTest::shouldGenerateVCard4()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+
+    KContacts::Geo geo;
+    geo.setLongitude(180.0);
+    geo.setLatitude(22.5);
+    addr.setGeo(geo);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "GEO:geo:22.500000,180.000000\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void GeoTest::shouldGenerateWithoutGeo()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
diff --git a/autotests/geotest.h b/autotests/geotest.h
new file mode 100644 (file)
index 0000000..d8c784c
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef GEOTEST_H
+#define GEOTEST_H
+
+#include <QObject>
+
+class GeoTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void constructor();
+    void isValid();
+    void setData();
+    void equals();
+    void differs();
+    void serialization();
+    void shouldParseGeoVCard3();
+    void shouldParseGeoVCard4();
+    void shouldGenerateVCard3();
+    void shouldGenerateVCard4();
+    void shouldGenerateWithoutGeo();
+};
+
+#endif
diff --git a/autotests/importexportvcardtest.cpp b/autotests/importexportvcardtest.cpp
new file mode 100644 (file)
index 0000000..7cc9890
--- /dev/null
@@ -0,0 +1,221 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "importexportvcardtest.h"
+#include "vcardtool_p.h"
+#include <QDebug>
+#include <QTest>
+
+ImportExportVCardTest::ImportExportVCardTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+ImportExportVCardTest::~ImportExportVCardTest()
+{
+}
+
+static void compareBuffers(const QByteArray &outputData, const QByteArray &expected)
+{
+    if (outputData != expected) {
+        qDebug() << " outputData " << outputData;
+        qDebug() << " expected " << expected;
+    }
+    const QList<QByteArray> outputLines = outputData.split('\n');
+    const QList<QByteArray> outputRefLines = expected.split('\n');
+    for (int i = 0; i < qMin(outputLines.count(), outputRefLines.count()); ++i) {
+        const QByteArray &actual = outputLines.at(i);
+        const QByteArray &expect = outputRefLines.at(i);
+        if (actual != expect) {
+            qCritical() << "Mismatch at output line" << (i + 1);
+            QCOMPARE(actual, expect);
+            QCOMPARE(actual.count(), expect.count());
+        }
+    }
+    QCOMPARE(outputLines.count(), outputRefLines.count());
+    QCOMPARE(outputData.size(), expected.size());
+}
+
+void ImportExportVCardTest::shouldExportFullTestVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "FN:Sherlock Holmes\r\n"
+        "TEL;VALUE=uri;PREF=1;TYPE=\"voice,home\":tel:+44-555-555-5555;ext=5555\r\n"
+        "TEL;VALUE=uri;TYPE=\"voice,cell,text\":tel:+44-555-555-6666\r\n"
+        "TEL;VALUE=uri;TYPE=\"voice,work\":tel:+44-555-555-7777\r\n"
+        "N:Holmes;Sherlock;;Mr;;\r\n"
+        "KIND:individual\r\n"
+        "NICKNAME:Shirley\r\n"
+        "PHOTO:\r\n"
+        "BDAY:19531015T231000Z\r\n"
+        "ANNIVERSARY:19960415\r\n"
+        "GENDER:M\r\n"
+        "ADR;GEO=\"geo:51.5237,0.1585\";LABEL=\"Mr Sherlock Holmes, 221B Baker Street, London NW1, England, United Kingdom\":;;221B Baker "
+        "Street;London;;NW1;United Kingdom\r\n"
+        "EMAIL;TYPE=home:sherlock.holmes@gmail.com\r\n"
+        "EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com\r\n"
+        "IMPP;PREF=1:xmpp:detective@sherlockholmes.com\r\n"
+        "LANG;TYPE=work;PREF=1:en\r\n"
+        "LANG;TYPE=work;PREF=2:fr\r\n"
+        "TZ:London/Europe\r\n"
+        "GEO:geo:51.5237,0.1585\r\n"
+        "TITLE;ALTID=1;LANGUAGE=fr:Patron\r\n"
+        "TITLE;ALTID=2;LANGUAGE=en:Boss\r\n"
+        "ROLE:Detective\r\n"
+        "UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519\r\n"
+        "CATEGORIES:FICTION,LITERATURE\r\n"
+        "PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN\r\n"
+        "REV:20140722T222710Z\r\n"
+        "URL;TYPE=home:https://sherlockholmes.com\r\n"
+        "KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holmes.pub.asc\r\n"
+        "CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "FBURL;PREF=1:https://sherlockholmes.com/busy/detective\r\n"
+        "CALADRURI;PREF=1:mailto:detective@sherlockholmes.com\r\n"
+        "END:VCARD\r\n\r\n");
+    QByteArray vcardexpected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "ADR;GEO=\"geo:51.523701,0.158500\";LABEL=\"Mr Sherlock Holmes, 221B Baker Stre\r\n"
+        " et, London NW1, England, United Kingdom\";TYPE:;;221B Baker Street;London;;\r\n"
+        " NW1;United Kingdom\r\n"
+        "ANNIVERSARY:19960415\r\n"
+        "BDAY:19531015T231000Z\r\n"
+        "CALADRURI;PREF=1:mailto:detective@sherlockholmes.com\r\n"
+        "CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "CATEGORIES:FICTION,LITERATURE\r\n"
+        "EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com\r\n"
+        "EMAIL;TYPE=home:sherlock.holmes@gmail.com\r\n"
+        "FBURL;PREF=1:https://sherlockholmes.com/busy/detective\r\n"
+        "FN:Sherlock Holmes\r\n"
+        "GENDER:M\r\n"
+        "GEO:geo:51.523701,0.158500\r\n"
+        "IMPP;PREF=1:xmpp:detective@sherlockholmes.com\r\n"
+        "KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holm\r\n"
+        " es.pub.asc\r\nKIND:individual\r\n"
+        "LANG;PREF=1;TYPE=work:en\r\n"
+        "LANG;PREF=2;TYPE=work:fr\r\n"
+        "N:Holmes;Sherlock;;Mr;\r\n"
+        "NICKNAME:Shirley\r\n"
+        "PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN\r\n"
+        "REV:20140722T222710Z\r\n"
+        "ROLE:Detective\r\n"
+        "TEL;TYPE=\"home,voice\";PREF=1;VALUE=uri:tel:+44-555-555-5555;ext=5555\r\n"
+        "TEL;TYPE=\"cell,voice\";VALUE=uri:tel:+44-555-555-6666\r\n"
+        "TEL;TYPE=\"voice,work\";VALUE=uri:tel:+44-555-555-7777\r\n"
+        "TITLE;ALTID=1;LANGUAGE=fr:Patron\r\n"
+        "TITLE;ALTID=2;LANGUAGE=en:Boss\r\n"
+        "TZ:+00:00\r\n"
+        "UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519\r\n"
+        "URL;TYPE=home:https://sherlockholmes.com\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+
+    const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    compareBuffers(result, vcardexpected);
+}
+
+void ImportExportVCardTest::shouldExportMiscElementVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1\r\n"
+        "FN;PID=1.1:J. Doe\r\n"
+        "N:Doe;J.;;;\r\n"
+        "EMAIL;PID=1.1:jdoe@example.com\r\n"
+        "EMAIL;PID=2.1:boss@example.com\r\n"
+        "TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555\r\n"
+        "TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666\r\n"
+        "CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556\r\n"
+        "END:VCARD\r\n\r\n");
+    QByteArray vcardexpected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556\r\n"
+        "EMAIL;PID=1.1:jdoe@example.com\r\n"
+        "EMAIL;PID=2.1:boss@example.com\r\n"
+        "FN:J. Doe\r\n"
+        "N:Doe;J.;;;\r\n"
+        "TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555\r\n"
+        "TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666\r\n"
+        "UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+
+    const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    compareBuffers(result, vcardexpected);
+}
+
+void ImportExportVCardTest::shouldExportMemberElementVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD"
+        "VERSION:4.0\r\n"
+        "KIND:group\r\n"
+        "FN:Funky distribution list\r\n"
+        "MEMBER:mailto:subscriber1@example.com\r\n"
+        "MEMBER:xmpp:subscriber2@example.com\r\n"
+        "MEMBER:sip:subscriber3@example.com\r\n"
+        "MEMBER:tel:+1-418-555-5555\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n"
+        "END:VCARD\r\n");
+
+    QByteArray vcardexpected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "FN:Funky distribution list\r\n"
+        "KIND:group\r\n"
+        "MEMBER:mailto:subscriber1@example.com\r\n"
+        "MEMBER:xmpp:subscriber2@example.com\r\n"
+        "MEMBER:sip:subscriber3@example.com\r\n"
+        "MEMBER:tel:+1-418-555-5555\r\n"
+        "N:;;;;\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+
+    const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    compareBuffers(result, vcardexpected);
+}
+
+void ImportExportVCardTest::shouldExportMissingNewlineVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD"
+        "VERSION:4.0\r\n"
+        "KIND:group\r\n"
+        "FN:Funky distribution list\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n"
+        "END:VCARD");
+
+    QByteArray vcardexpected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "FN:Funky distribution list\r\n"
+        "KIND:group\r\n"
+        "N:;;;;\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+
+    const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    compareBuffers(result, vcardexpected);
+}
+
+// TODO please make this data driven before copy/pasting more methods here...
+
+QTEST_MAIN(ImportExportVCardTest)
diff --git a/autotests/importexportvcardtest.h b/autotests/importexportvcardtest.h
new file mode 100644 (file)
index 0000000..3723d6c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef IMPORTEXPORTVCARDTEST_H
+#define IMPORTEXPORTVCARDTEST_H
+
+#include <QObject>
+
+class ImportExportVCardTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ImportExportVCardTest(QObject *parent = nullptr);
+    ~ImportExportVCardTest() override;
+private Q_SLOTS:
+    void shouldExportFullTestVcard4();
+    void shouldExportMiscElementVcard4();
+    void shouldExportMemberElementVcard4();
+    void shouldExportMissingNewlineVcard4();
+};
+
+#endif // IMPORTEXPORTVCARDTEST_H
diff --git a/autotests/impptest.cpp b/autotests/impptest.cpp
new file mode 100644 (file)
index 0000000..8133ae5
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+    This file is part of libkabc.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "impptest.h"
+#include "impp.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+ImppTest::ImppTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+ImppTest::~ImppTest()
+{
+}
+
+void ImppTest::shouldHaveDefaultValue()
+{
+    KContacts::Impp impp;
+    QVERIFY(!impp.isValid());
+    QVERIFY(impp.address().isEmpty());
+    QVERIFY(impp.serviceType().isEmpty());
+    QVERIFY(impp.params().empty());
+}
+
+void ImppTest::shouldAssignValue()
+{
+    const QUrl address(QStringLiteral("icq:address"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Impp impp;
+    impp.setParams(params);
+    impp.setAddress(address);
+    QVERIFY(impp.isValid());
+    QVERIFY(!impp.address().isEmpty());
+    QCOMPARE(impp.address(), address);
+    QCOMPARE(impp.serviceType(), QLatin1String("icq"));
+    QCOMPARE(impp.serviceIcon(), QLatin1String("im-icq"));
+    QVERIFY(!impp.params().empty());
+    QCOMPARE(impp.params(), params);
+}
+
+void ImppTest::shouldSerialized()
+{
+    const QUrl address(QStringLiteral("icq:address"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Impp impp;
+    impp.setParams(params);
+    impp.setAddress(address);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << impp;
+
+    KContacts::Impp result;
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(impp == result);
+}
+
+void ImppTest::shouldEqualImpp()
+{
+    const QUrl address(QStringLiteral("icq:address"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Impp impp;
+    impp.setParams(params);
+    impp.setAddress(address);
+
+    KContacts::Impp result(impp);
+    QVERIFY(impp == result);
+}
+
+void ImppTest::shouldParseWithoutImpp()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "LANG:fr"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).imppList().count(), 0);
+}
+
+void ImppTest::shouldParseImpp()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "IMPP;X-SERVICE-TYPE=skype:skype:xxxxxxxx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).imppList().count(), 1);
+    KContacts::Impp impp = lst.at(0).imppList().at(0);
+    QCOMPARE(impp.address(), QUrl(QStringLiteral("skype:xxxxxxxx")));
+    QCOMPARE(impp.serviceType(), QLatin1String("skype"));
+}
+
+void ImppTest::shouldParseImppVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:4.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "IMPP;PREF=1:skype:xxxxxxxx\n"
+        "IMPP:skype:1234567890\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).imppList().count(), 2);
+    KContacts::Impp impp = lst.at(0).imppList().at(0);
+    QCOMPARE(impp.address(), QUrl(QStringLiteral("skype:xxxxxxxx")));
+    QCOMPARE(impp.serviceType(), QLatin1String("skype"));
+    QVERIFY(impp.isPreferred());
+    impp = lst.at(0).imppList().at(1);
+    QCOMPARE(impp.address(), QUrl(QStringLiteral("skype:1234567890")));
+    QCOMPARE(impp.serviceType(), QLatin1String("skype"));
+    QVERIFY(!impp.isPreferred());
+}
+
+QByteArray createCard(const QString &type)
+{
+    QByteArray expected(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "EMAIL:foo@kde.org\n");
+    if (!type.isEmpty()) {
+        expected += "IMPP;X-SERVICE-TYPE=" + type.toLatin1() + ":" + type.toLatin1() + ":address\n";
+    }
+    expected += QByteArray(
+        "N:;;;;\n"
+        "UID:testuid\n"
+        "END:VCARD\n\n");
+    return expected;
+}
+
+void ImppTest::shouldParseServiceType_data()
+{
+    QTest::addColumn<QString>("type");
+    QTest::addColumn<bool>("hasImpp");
+    QTest::newRow("withoutimpp") << QString() << false;
+    for (const auto &type : KContacts::Impp::serviceTypes()) {
+        QTest::newRow(type.toLatin1().constData()) << type << true;
+    }
+}
+
+void ImppTest::shouldParseServiceType()
+{
+    QFETCH(QString, type);
+    QFETCH(bool, hasImpp);
+
+    QByteArray vcarddata = createCard(type);
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+
+    QCOMPARE(!lst.at(0).imppList().isEmpty(), hasImpp);
+    if (hasImpp) {
+        KContacts::Impp impp = lst.at(0).imppList().at(0);
+        QCOMPARE(impp.address(), QUrl(QStringLiteral("%1:address").arg(type)));
+        QCOMPARE(impp.serviceType(), type);
+    }
+}
+
+QByteArray expectedVcard(const QString &type)
+{
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n");
+    if (!type.isEmpty()) {
+        expected += "IMPP:" + type.toLatin1() + ":address\r\n";
+    }
+
+    expected +=
+        ("N:;;;;\r\n"
+         "UID:testuid\r\n"
+         "END:VCARD\r\n\r\n");
+    return expected;
+}
+
+void ImppTest::shouldExportEmptyType()
+{
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QCOMPARE(ba, expected);
+}
+
+void ImppTest::shouldExportType_data()
+{
+    QTest::addColumn<QString>("type");
+    for (const auto &type : KContacts::Impp::serviceTypes()) {
+        QTest::newRow(type.toLatin1().constData()) << type;
+    }
+}
+
+void ImppTest::shouldExportType()
+{
+    QFETCH(QString, type);
+
+    QByteArray expected = expectedVcard(type);
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Impp impp;
+    impp.setAddress(QUrl(type + QStringLiteral(":address")));
+    addr.insertImpp(impp);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QCOMPARE(ba, expected);
+}
+
+void ImppTest::shouldExportWithParameters()
+{
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "IMPP;FOO1=bla1,blo1;FOO2=bla2,blo2:skype:address\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Impp impp;
+    impp.setAddress(QUrl(QStringLiteral("skype:address")));
+    impp.setParams(params);
+    impp.setPreferred(false);
+    addr.insertImpp(impp);
+    lst << addr;
+
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QCOMPARE(ba, expected);
+}
+
+void ImppTest::shouldShouldNotExportTwiceServiceType()
+{
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "IMPP;FOO1=bla1,blo1;FOO2=bla2,blo2;PREF=1:skype:address\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    params.push_back({QStringLiteral("X-SERVICE-TYPE"), QStringList() << QStringLiteral("aim")});
+    KContacts::Impp impp;
+    impp.setAddress(QUrl(QStringLiteral("skype:address")));
+    impp.setParams(params);
+    impp.setPreferred(true);
+    addr.insertImpp(impp);
+    lst << addr;
+
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QCOMPARE(ba, expected);
+}
+
+void ImppTest::testProtocolInformation()
+{
+    const auto types = KContacts::Impp::serviceTypes();
+    QVERIFY(types.size() > 10);
+    QVERIFY(types.contains(QLatin1String("xmpp")));
+
+    for (const auto &type : types) {
+        QVERIFY(!KContacts::Impp::serviceLabel(type).isEmpty());
+    }
+
+    QCOMPARE(KContacts::Impp::serviceIcon(QStringLiteral("xmpp")), QLatin1String("im-jabber"));
+}
+
+QTEST_MAIN(ImppTest)
diff --git a/autotests/impptest.h b/autotests/impptest.h
new file mode 100644 (file)
index 0000000..429be49
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+    This file is part of libkabc.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef IMPPTEST_H
+#define IMPPTEST_H
+
+#include <QObject>
+
+class ImppTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ImppTest(QObject *parent = nullptr);
+    ~ImppTest() override;
+
+private Q_SLOTS:
+    void shouldParseImppVcard4();
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldSerialized();
+    void shouldEqualImpp();
+    void shouldParseWithoutImpp();
+    void shouldParseImpp();
+    void shouldParseServiceType_data();
+    void shouldParseServiceType();
+    void shouldExportEmptyType();
+
+    void shouldExportType_data();
+    void shouldExportType();
+
+    void shouldExportWithParameters();
+    void shouldShouldNotExportTwiceServiceType();
+
+    void testProtocolInformation();
+};
+
+#endif // IMPPTEST_H
diff --git a/autotests/keytest.cpp b/autotests/keytest.cpp
new file mode 100644 (file)
index 0000000..113ee47
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "keytest.h"
+#include "kcontacts/key.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+QTEST_MAIN(KeyTest)
+
+void KeyTest::storeTest()
+{
+    KContacts::Key key;
+
+    key.setId(QStringLiteral("My Id"));
+    key.setType(KContacts::Key::Custom);
+    key.setCustomTypeString(QStringLiteral("GnuPG"));
+    key.setTextData(QStringLiteral("That's my super secret key"));
+
+    QVERIFY(key.id() == QLatin1String("My Id"));
+    QVERIFY(key.type() == KContacts::Key::Custom);
+    QVERIFY(key.customTypeString() == QLatin1String("GnuPG"));
+    QVERIFY(key.textData() == QLatin1String("That's my super secret key"));
+    QVERIFY(key.isBinary() == false);
+}
+
+void KeyTest::equalsTest()
+{
+    KContacts::Key key1;
+    KContacts::Key key2;
+
+    key1.setId(QStringLiteral("My Id"));
+    key1.setType(KContacts::Key::Custom);
+    key1.setCustomTypeString(QStringLiteral("GnuPG"));
+    key1.setTextData(QStringLiteral("That's my super secret key"));
+
+    key2.setId(QStringLiteral("My Id"));
+    key2.setType(KContacts::Key::Custom);
+    key2.setCustomTypeString(QStringLiteral("GnuPG"));
+    key2.setTextData(QStringLiteral("That's my super secret key"));
+
+    QVERIFY(key1 == key2);
+}
+
+void KeyTest::differsTest()
+{
+    KContacts::Key key1(QStringLiteral("TextKey"), KContacts::Key::PGP);
+    KContacts::Key key2(QStringLiteral("TextKey"), KContacts::Key::Custom);
+
+    QVERIFY(key1 != key2);
+}
+
+void KeyTest::assignmentTest()
+{
+    KContacts::Key key1;
+    KContacts::Key key2;
+
+    key1.setId(QStringLiteral("My Id"));
+    key1.setType(KContacts::Key::Custom);
+    key1.setCustomTypeString(QStringLiteral("GnuPG"));
+    key1.setTextData(QStringLiteral("That's my super secret key"));
+
+    key2 = key1;
+
+    QVERIFY(key1 == key2);
+}
+
+void KeyTest::serializeTest()
+{
+    KContacts::Key key1;
+    KContacts::Key key2;
+
+    key1.setId(QStringLiteral("My Id"));
+    key1.setType(KContacts::Key::Custom);
+    key1.setCustomTypeString(QStringLiteral("GnuPG"));
+    key1.setTextData(QStringLiteral("That's my super secret key"));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << key1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> key2;
+
+    QVERIFY(key1 == key2);
+}
+
+void KeyTest::shouldExportVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Key key1(QStringLiteral("https://foo.org/sherlock-holmes.pub.asc"), KContacts::Key::PGP);
+    addr.setKeys(KContacts::Key::List{key1});
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "KEY;TYPE=PGP:https://foo.org/sherlock-holmes.pub.asc\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void KeyTest::shouldExportVCard4()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Key key1(QStringLiteral("https://foo.org/sherlock-holmes.pub.asc"), KContacts::Key::PGP);
+    addr.setKeys(KContacts::Key::List{key1});
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "KEY;MEDIATYPE=application/pgp-keys:https://foo.org/sherlock-holmes.pub.asc\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void KeyTest::shouldParseVcard3()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "KEY;TYPE=PGP:https://foo.org/sherlock-holmes.pub.asc\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(!lst.at(0).keys().isEmpty());
+    QCOMPARE(lst.at(0).keys().count(), 1);
+
+    KContacts::Key key = lst.at(0).keys().at(0);
+    QCOMPARE(key.type(), KContacts::Key::PGP);
+    QCOMPARE(key.textData(), QStringLiteral("https://foo.org/sherlock-holmes.pub.asc"));
+}
+
+void KeyTest::shouldParseVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "KEY;MEDIATYPE=application/pgp-keys:https://foo.org/sherlock-holmes.pub.asc\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(!lst.at(0).keys().isEmpty());
+    QCOMPARE(lst.at(0).keys().count(), 1);
+
+    KContacts::Key key = lst.at(0).keys().at(0);
+    QCOMPARE(key.type(), KContacts::Key::PGP);
+    QCOMPARE(key.textData(), QStringLiteral("https://foo.org/sherlock-holmes.pub.asc"));
+}
diff --git a/autotests/keytest.h b/autotests/keytest.h
new file mode 100644 (file)
index 0000000..556dd8f
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KEY_TEST_H
+#define KEY_TEST_H
+
+#include <QObject>
+
+class KeyTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void storeTest();
+    void equalsTest();
+    void differsTest();
+    void assignmentTest();
+    void serializeTest();
+    void shouldExportVCard3();
+    void shouldExportVCard4();
+    void shouldParseVcard3();
+    void shouldParseVcard4();
+};
+
+#endif
diff --git a/autotests/langtest.cpp b/autotests/langtest.cpp
new file mode 100644 (file)
index 0000000..7eda69c
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "langtest.h"
+#include "lang.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+LangTest::LangTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+LangTest::~LangTest()
+{
+}
+
+void LangTest::shouldHaveDefaultValue()
+{
+    KContacts::Lang language;
+    QVERIFY(!language.isValid());
+    QVERIFY(language.language().isEmpty());
+    QVERIFY(language.params().empty());
+}
+
+void LangTest::shouldAssignValue()
+{
+    const QString lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Lang language(lang);
+    language.setParams(params);
+    QVERIFY(language.isValid());
+    QVERIFY(!language.language().isEmpty());
+    QCOMPARE(language.language(), lang);
+    QVERIFY(!language.params().empty());
+    QCOMPARE(language.params(), params);
+}
+
+void LangTest::shouldAssignExternal()
+{
+    KContacts::Lang language;
+    const QString lang(QStringLiteral("fr"));
+    language.setLanguage(lang);
+    QVERIFY(language.isValid());
+    QCOMPARE(language.language(), lang);
+}
+
+void LangTest::shouldSerialized()
+{
+    KContacts::Lang language;
+    KContacts::Lang result;
+    const QString lang(QStringLiteral("fr"));
+    language.setLanguage(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    language.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << language;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(language == result);
+}
+
+void LangTest::shouldEqualLanguage()
+{
+    KContacts::Lang language;
+    KContacts::Lang result;
+    const QString lang(QStringLiteral("fr"));
+    language.setLanguage(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    language.setParams(params);
+
+    result = language;
+    QVERIFY(language == result);
+}
+
+void LangTest::shouldParseLanguage()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "LANG:fr\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).langs().count(), 1);
+    QCOMPARE(lst.at(0).langs().at(0).language(), QStringLiteral("fr"));
+}
+
+void LangTest::shouldParseWithoutLanguage()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).langs().count(), 0);
+}
+
+void LangTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Lang::List lstLang;
+    KContacts::Lang lang(QStringLiteral("fr"));
+    lstLang << lang;
+    addr.setLangs(lstLang);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "LANG:fr\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void LangTest::shouldCreateVCardWithTwoLang()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Lang::List lstLang;
+    KContacts::Lang lang(QStringLiteral("fr"));
+    KContacts::Lang lang2(QStringLiteral("fr2"));
+    lstLang << lang << lang2;
+    addr.setLangs(lstLang);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "LANG:fr\r\n"
+        "LANG:fr2\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void LangTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Lang::List lstLang;
+    KContacts::Lang lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    lang.setParams(params);
+    lstLang << lang;
+    addr.setLangs(lstLang);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "LANG;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void LangTest::shouldNotGenerateLangForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Lang::List lstLang;
+    KContacts::Lang lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    lang.setParams(params);
+    lstLang << lang;
+    addr.setLangs(lstLang);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(LangTest)
diff --git a/autotests/langtest.h b/autotests/langtest.h
new file mode 100644 (file)
index 0000000..51cb50d
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef LANGTEST_H
+#define LANGTEST_H
+
+#include <QObject>
+
+class LangTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit LangTest(QObject *parent = nullptr);
+    ~LangTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualLanguage();
+    void shouldParseLanguage();
+    void shouldParseWithoutLanguage();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoLang();
+    void shouldCreateVCardWithParameters();
+    void shouldNotGenerateLangForVCard3();
+};
+
+#endif // LANGTEST_H
diff --git a/autotests/ldifconvertertest.cpp b/autotests/ldifconvertertest.cpp
new file mode 100644 (file)
index 0000000..132c87b
--- /dev/null
@@ -0,0 +1,574 @@
+/*
+    This file is part of libkabc.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "ldifconvertertest.h"
+#include "converter/ldifconverter.h"
+#include <QTest>
+using namespace KContacts;
+
+LDifConverterTest::LDifConverterTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+LDifConverterTest::~LDifConverterTest()
+{
+}
+
+void LDifConverterTest::shouldImportEmail()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "mail: foo@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).emails().count(), 1);
+    QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("foo@kde.org"));
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportMultiEmails()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "mail: foo@kde.org\n"
+        "mail: foo2@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).emails().count(), 2);
+    QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("foo@kde.org"));
+    QCOMPARE(lst.at(0).emails().at(1), QStringLiteral("foo2@kde.org"));
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportStandardBirthday()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "birthyear: 2015\n"
+        "birthmonth: 3\n"
+        "birthday: 19\n"
+        "mail: foo@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(lst.at(0).birthday().date().isValid());
+    QCOMPARE(lst.at(0).birthday().date(), QDate(2015, 3, 19));
+    QVERIFY(!lst.at(0).birthdayHasTime());
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportStandardBirthdayWithoutYear()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "birthmonth: 3\n"
+        "birthday: 19\n"
+        "mail: foo@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(lst.at(0).birthday().date().isValid());
+    QCOMPARE(lst.at(0).birthday().date(), QDate(-1, 3, 19));
+    QVERIFY(!lst.at(0).birthdayHasTime());
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportTheBatsBirthday()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "xbatBirthday: 20150319\n"
+        "mail: foo@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(lst.at(0).birthday().date().isValid());
+    QCOMPARE(lst.at(0).birthday().date(), QDate(2015, 3, 19));
+    QVERIFY(!lst.at(0).birthdayHasTime());
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportTheBatsEmails()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "mail: foo@kde.org\n"
+        "othermailbox: foo2@kde.org\n"
+        "othermailbox: foo3@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).emails().count(), 3);
+    QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("foo@kde.org"));
+    QCOMPARE(lst.at(0).emails().at(1), QStringLiteral("foo2@kde.org"));
+    QCOMPARE(lst.at(0).emails().at(2), QStringLiteral("foo3@kde.org"));
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportTitle()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "title: foo\n"
+        "mail: foo@kde.org\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).title(), QStringLiteral("foo"));
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportWorkStreet()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "title: foo\n"
+        "mail: foo@kde.org\n"
+        "street: work address\n"
+        "mozillaWorkStreet2: work address next\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).address(Address::Work).street(), QStringLiteral("work address\nwork address next"));
+    QCOMPARE(contactGroup.count(), 0);
+}
+
+void LDifConverterTest::shouldImportContactGroup()
+{
+    QString str = QStringLiteral(
+        "dn: cn=test,mail=\n"
+        "cn: test\n"
+        "modifyTimeStamp: 20080526T234914Z\n"
+        "display-name: Test\n"
+        "objectclass: top\n"
+        "objectclass: groupOfNames\n"
+        "member: cn=Jim Doe,mail=jim.doe@foobar.com\n"
+        "member: cn=Jane Doe,mail=jane.doe@foobar.com\n"
+        "member: cn=John Doe,mail=john.doe@foobar.com\n");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 0);
+    QCOMPARE(contactGroup.count(), 1);
+    ContactGroup first = contactGroup.first();
+    QCOMPARE(first.name(), QStringLiteral("Test"));
+    QCOMPARE((int)first.count(), 3);
+}
+
+void LDifConverterTest::shouldImportMultiEntries()
+{
+    QString str = QStringLiteral(
+        "dn: cn=test1,mail=test1@test.test\n"
+        "sn: test1\n"
+        "cn: test1\n"
+        "uid: jpgdf2NrLQ\n"
+        "mail: test1@test.test\n"
+        "modifytimestamp: 20121219T140848Z\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "\n"
+        "dn: cn=test2,mail=test2@test.test\n"
+        "sn: test2\n"
+        "cn: test2\n"
+        "uid: ow2mwdUb6A\n"
+        "mail: test2@test.test\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n");
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 2);
+    QCOMPARE(contactGroup.count(), 0);
+    QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("test1@test.test"));
+    QCOMPARE(lst.at(1).emails().at(0), QStringLiteral("test2@test.test"));
+}
+
+void LDifConverterTest::shouldImportGroupAndAddress()
+{
+    QString str = QStringLiteral(
+        "dn: cn=laurent,mail=foo@kde.org\n"
+        "sn: laurent\n"
+        "cn: laurent\n"
+        "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n"
+        "title: foo\n"
+        "mail: foo@kde.org\n"
+        "street: work address\n"
+        "mozillaWorkStreet2: work address next\n"
+        "objectclass: top_n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "\n"
+        "dn: cn=test,mail=\n"
+        "cn: test\n"
+        "modifyTimeStamp: 20080526T234914Z\n"
+        "display-name: Test\n"
+        "objectclass: top\n"
+        "objectclass: groupOfNames\n"
+        "member: cn=Jim Doe,mail=jim.doe@foobar.com\n"
+        "member: cn=Jane Doe,mail=jane.doe@foobar.com\n"
+        "member: cn=John Doe,mail=john.doe@foobar.com\n");
+
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup);
+    QVERIFY(result);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(contactGroup.count(), 1);
+}
+
+void LDifConverterTest::shouldExportEmail()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+    QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n\n");
+
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportMultiEmails()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("foo2@kde.org") << QStringLiteral("foo3@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+    QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "mozillasecondemail: foo2@kde.org\n"
+        "othermailbox: foo3@kde.org\n"
+        "\n");
+
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportBirthday()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    Addressee addr;
+    QDate date(2015, 3, 3);
+    addr.setBirthday(date);
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+    QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "birthyear: 2015\n"
+        "birthmonth: 3\n"
+        "birthday: 3\n"
+        "\n");
+
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportBirthdayWithoutYear()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    Addressee addr;
+    QDate date(-1, 3, 3);
+    addr.setBirthday(date);
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+    QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "birthmonth: 3\n"
+        "birthday: 3\n"
+        "\n");
+
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportTitle()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setTitle(QStringLiteral("foo"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+    QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "title: foo\n"
+        "\n");
+
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportMultiEntries()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setTitle(QStringLiteral("foo"));
+    addr.setUid(QStringLiteral("testuid"));
+    lst << addr;
+
+    Addressee addr2;
+    QDate date(2015, 3, 3);
+    addr2.setBirthday(date);
+    addr2.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr2.setUid(QStringLiteral("testuid"));
+    lst << addr2;
+
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+
+    const QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "title: foo\n"
+        "\n"
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "birthyear: 2015\n"
+        "birthmonth: 3\n"
+        "birthday: 3\n"
+        "\n");
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportGroup()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    ContactGroup grp;
+    ContactGroup::Data data;
+    data.setEmail(QStringLiteral("foo@kde.org"));
+    data.setName(QStringLiteral("foo"));
+    grp.append(data);
+    ContactGroup::Data data2;
+    data2.setEmail(QStringLiteral("foo2@kde.org"));
+    data2.setName(QStringLiteral("foo2"));
+    grp.append(data2);
+    contactGroup.append(grp);
+
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+
+    const QString expected = QStringLiteral(
+        "objectclass: top\n"
+        "objectclass: groupOfNames\n"
+        "member: cn=foo,mail=foo@kde.org\n"
+        "member: cn=foo2,mail=foo2@kde.org\n"
+        "\n");
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportWorkStreet()
+{
+    AddresseeList lst;
+    Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    Address address(Address::Work);
+    address.setStreet(QStringLiteral("work address"));
+    address.setPostalCode(QStringLiteral("postal"));
+    addr.insertAddress(address);
+    lst << addr;
+    ContactGroup::List contactGroup;
+
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+
+    const QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "uid: testuid\n"
+        "mail: foo@kde.org\n"
+        "postalcode: postal\n"
+        "streetaddress: work address\n"
+        "street: work address\n"
+        "\n");
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::shouldExportFullName()
+{
+    AddresseeList lst;
+    Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    addr.setName(QStringLiteral("name"));
+    addr.setNickName(QStringLiteral("nickname"));
+    addr.setFamilyName(QStringLiteral("familyname"));
+    lst << addr;
+    ContactGroup::List contactGroup;
+
+    QString str;
+    bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(result);
+
+    const QString expected = QStringLiteral(
+        "dn: cn=,mail=foo@kde.org\n"
+        "objectclass: top\n"
+        "objectclass: person\n"
+        "objectclass: organizationalPerson\n"
+        "sn: familyname\n"
+        "uid: testuid\n"
+        "nickname: nickname\n"
+        "xmozillanickname: nickname\n"
+        "mozillanickname: nickname\n"
+        "mail: foo@kde.org\n"
+        "\n");
+
+    QCOMPARE(str, expected);
+}
+
+void LDifConverterTest::testGarbage()
+{
+    AddresseeList lst;
+    ContactGroup::List contactGroup;
+    QString str;
+    bool result;
+
+    result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str);
+    QVERIFY(!result);
+    result = LDIFConverter::contactGroupToLDIF(contactGroup, str);
+    QVERIFY(!result);
+    result = LDIFConverter::addresseeToLDIF(lst, str);
+    QVERIFY(!result);
+
+    Addressee addr;
+    result = LDIFConverter::addresseeToLDIF(addr, str);
+    QVERIFY(!result);
+}
+
+QTEST_MAIN(LDifConverterTest)
diff --git a/autotests/ldifconvertertest.h b/autotests/ldifconvertertest.h
new file mode 100644 (file)
index 0000000..96f43c3
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+    This file is part of libkabc.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef LDIFCONVERTERTEST_H
+#define LDIFCONVERTERTEST_H
+
+#include <QObject>
+
+class LDifConverterTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit LDifConverterTest(QObject *parent = nullptr);
+    ~LDifConverterTest() override;
+
+private Q_SLOTS:
+    // Import
+    void shouldImportEmail();
+    void shouldImportMultiEmails();
+    void shouldImportStandardBirthday();
+    void shouldImportStandardBirthdayWithoutYear();
+    void shouldImportTheBatsBirthday();
+    void shouldImportTheBatsEmails();
+    void shouldImportTitle();
+    void shouldImportWorkStreet();
+    void shouldImportContactGroup();
+    void shouldImportMultiEntries();
+    void shouldImportGroupAndAddress();
+
+    // Export
+    void shouldExportEmail();
+    void shouldExportBirthday();
+    void shouldExportBirthdayWithoutYear();
+    void shouldExportTitle();
+    void shouldExportMultiEntries();
+    void shouldExportGroup();
+    void shouldExportWorkStreet();
+    void shouldExportMultiEmails();
+    void shouldExportFullName();
+
+    // Garbage tests
+    void testGarbage();
+};
+
+#endif // LDIFCONVERTERTEST_H
diff --git a/autotests/nicknametest.cpp b/autotests/nicknametest.cpp
new file mode 100644 (file)
index 0000000..7341036
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "nicknametest.h"
+#include "nickname.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+NickNameTest::NickNameTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+NickNameTest::~NickNameTest()
+{
+}
+
+void NickNameTest::shouldHaveDefaultValue()
+{
+    KContacts::NickName nickname;
+    QVERIFY(!nickname.isValid());
+    QVERIFY(nickname.nickname().isEmpty());
+    QVERIFY(nickname.params().empty());
+}
+
+void NickNameTest::shouldAssignValue()
+{
+    const QString lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::NickName nickname(lang);
+    nickname.setParams(params);
+    QVERIFY(nickname.isValid());
+    QVERIFY(!nickname.nickname().isEmpty());
+    QCOMPARE(nickname.nickname(), lang);
+    QVERIFY(!nickname.params().empty());
+    QCOMPARE(nickname.params(), params);
+}
+
+void NickNameTest::shouldAssignExternal()
+{
+    KContacts::NickName nickname;
+    const QString lang(QStringLiteral("fr"));
+    nickname.setNickName(lang);
+    QVERIFY(nickname.isValid());
+    QCOMPARE(nickname.nickname(), lang);
+}
+
+void NickNameTest::shouldSerialized()
+{
+    KContacts::NickName nickname;
+    KContacts::NickName result;
+    const QString lang(QStringLiteral("fr"));
+    nickname.setNickName(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    nickname.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << nickname;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(nickname == result);
+}
+
+void NickNameTest::shouldEqualNickName()
+{
+    KContacts::NickName nickname;
+    KContacts::NickName result;
+    const QString lang(QStringLiteral("fr"));
+    nickname.setNickName(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    nickname.setParams(params);
+
+    result = nickname;
+    QVERIFY(nickname == result);
+}
+
+void NickNameTest::shouldParseNickName()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "NickName:boo\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraNickNameList().count(), 1);
+    QCOMPARE(lst.at(0).extraNickNameList().at(0).nickname(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).nickName(), QStringLiteral("boo"));
+}
+
+void NickNameTest::shouldParseWithoutNickName()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraNickNameList().count(), 0);
+    QCOMPARE(lst.at(0).nickName(), QString());
+}
+
+void NickNameTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::NickName::List lstNickName;
+    KContacts::NickName title(QStringLiteral("blo"));
+    lstNickName << title;
+    addr.setExtraNickNameList(lstNickName);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "NICKNAME:blo\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void NickNameTest::shouldCreateVCardWithTwoNickName()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::NickName::List lstNickName;
+    KContacts::NickName title(QStringLiteral("fr"));
+    KContacts::NickName title2(QStringLiteral("fr2"));
+    lstNickName << title << title2;
+    addr.setExtraNickNameList(lstNickName);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "NICKNAME:fr\r\n"
+        "NICKNAME:fr2\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void NickNameTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::NickName::List lstNickName;
+    KContacts::NickName title(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    title.setParams(params);
+    lstNickName << title;
+    addr.setExtraNickNameList(lstNickName);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "NICKNAME;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void NickNameTest::shouldGenerateNickNameForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::NickName::List lstNickName;
+    KContacts::NickName title(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    title.setParams(params);
+    lstNickName << title;
+    addr.setExtraNickNameList(lstNickName);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "NICKNAME;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(NickNameTest)
diff --git a/autotests/nicknametest.h b/autotests/nicknametest.h
new file mode 100644 (file)
index 0000000..0f0a452
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef NICKNAMETEST_H
+#define NICKNAMETEST_H
+
+#include <QObject>
+
+class NickNameTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit NickNameTest(QObject *parent = nullptr);
+    ~NickNameTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualNickName();
+    void shouldParseNickName();
+    void shouldParseWithoutNickName();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoNickName();
+    void shouldCreateVCardWithParameters();
+    void shouldGenerateNickNameForVCard3();
+};
+
+#endif // NICKNAMETEST_H
diff --git a/autotests/orgtest.cpp b/autotests/orgtest.cpp
new file mode 100644 (file)
index 0000000..0e5402b
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "orgtest.h"
+#include "org.h"
+#include "parametermap_p.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+OrgTest::OrgTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+OrgTest::~OrgTest()
+{
+}
+
+void OrgTest::shouldHaveDefaultValue()
+{
+    KContacts::Org org;
+    QVERIFY(!org.isValid());
+    QVERIFY(org.organization().isEmpty());
+    QVERIFY(org.params().empty());
+}
+
+void OrgTest::shouldAssignValue()
+{
+    const QString organization(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Org org(organization);
+    org.setParams(params);
+    QVERIFY(org.isValid());
+    QVERIFY(!org.organization().isEmpty());
+    QCOMPARE(org.organization(), organization);
+    QVERIFY(!org.params().empty());
+    QCOMPARE(org.params(), params);
+}
+
+void OrgTest::shouldAssignExternal()
+{
+    KContacts::Org org;
+    const QString organization(QStringLiteral("fr"));
+    org.setOrganization(organization);
+    QVERIFY(org.isValid());
+    QCOMPARE(org.organization(), organization);
+}
+
+void OrgTest::shouldSerialized()
+{
+    KContacts::Org org;
+    KContacts::Org result;
+    const QString organization(QStringLiteral("fr"));
+    org.setOrganization(organization);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    org.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << org;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(org == result);
+}
+
+void OrgTest::shouldEqualOrg()
+{
+    KContacts::Org org;
+    KContacts::Org result;
+    const QString organization(QStringLiteral("fr"));
+    org.setOrganization(organization);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    org.setParams(params);
+
+    result = org;
+    QVERIFY(org == result);
+}
+
+void OrgTest::shouldParseOrg()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "Org:boo\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraOrganizationList().count(), 1);
+    QCOMPARE(lst.at(0).organization(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).extraOrganizationList().at(0).organization(), QStringLiteral("boo"));
+}
+
+void OrgTest::shouldParseVcardWithTwoOrg()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "Org:boo\n"
+        "Org:bla\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraOrganizationList().count(), 2);
+    QCOMPARE(lst.at(0).extraOrganizationList().at(0).organization(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).extraOrganizationList().at(1).organization(), QStringLiteral("bla"));
+}
+
+void OrgTest::shouldCreateVCardWithSemiColon()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Org::List lstOrg;
+    KContacts::Org org(QStringLiteral("fr;bla"));
+    lstOrg << org;
+    addr.setExtraOrganizationList(lstOrg);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ORG:fr\\\\;bla\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void OrgTest::shouldParseWithoutOrg()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraOrganizationList().count(), 0);
+}
+
+void OrgTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Org::List lstOrg;
+    KContacts::Org org(QStringLiteral("fr"));
+    lstOrg << org;
+    addr.setExtraOrganizationList(lstOrg);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ORG:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void OrgTest::shouldCreateVCardWithTwoOrg()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Org::List lstOrg;
+    KContacts::Org org(QStringLiteral("fr"));
+    KContacts::Org org2(QStringLiteral("fr2"));
+    lstOrg << org << org2;
+    addr.setExtraOrganizationList(lstOrg);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ORG:fr\r\n"
+        "ORG:fr2\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void OrgTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Org::List lstOrg;
+    KContacts::Org org(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    org.setParams(params);
+    lstOrg << org;
+    addr.setExtraOrganizationList(lstOrg);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ORG;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void OrgTest::shouldGenerateOrgForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Org::List lstOrg;
+    KContacts::Org org(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    org.setParams(params);
+    lstOrg << org;
+    addr.setExtraOrganizationList(lstOrg);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ORG;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(OrgTest)
diff --git a/autotests/orgtest.h b/autotests/orgtest.h
new file mode 100644 (file)
index 0000000..eb8c7e9
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ORGTEST_H
+#define ORGTEST_H
+
+#include <QObject>
+
+class OrgTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit OrgTest(QObject *parent = nullptr);
+    ~OrgTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualOrg();
+    void shouldParseOrg();
+    void shouldParseWithoutOrg();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoOrg();
+    void shouldCreateVCardWithParameters();
+    void shouldGenerateOrgForVCard3();
+    void shouldParseVcardWithTwoOrg();
+    void shouldCreateVCardWithSemiColon();
+};
+
+#endif // ORGTEST_H
diff --git a/autotests/phonenumbertest.cpp b/autotests/phonenumbertest.cpp
new file mode 100644 (file)
index 0000000..54b748d
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "phonenumbertest.h"
+#include "kcontacts/phonenumber.h"
+#include <QTest>
+#include <addressee.h>
+#include <addresseelist.h>
+#include <vcardtool_p.h>
+
+QTEST_MAIN(PhoneNumberTest)
+
+#ifndef Q_OS_WIN
+void initLocale()
+{
+    qputenv("LC_ALL", "en_US.utf-8");
+}
+
+Q_CONSTRUCTOR_FUNCTION(initLocale)
+#endif
+
+void PhoneNumberTest::emptyTest()
+{
+    KContacts::PhoneNumber number;
+
+    QVERIFY(number.isEmpty());
+}
+
+void PhoneNumberTest::storeTest()
+{
+    KContacts::PhoneNumber number;
+
+    number.setId(QStringLiteral("My Id"));
+    number.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number.setNumber(QStringLiteral("2734826345"));
+
+    QVERIFY(number.id() == QLatin1String("My Id"));
+    QVERIFY(number.type() == (KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell));
+    QVERIFY(number.number() == QLatin1String("2734826345"));
+}
+
+void PhoneNumberTest::equalsTest()
+{
+    KContacts::PhoneNumber number1;
+    KContacts::PhoneNumber number2;
+
+    number1.setId(QStringLiteral("My Id"));
+    number1.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number1.setNumber(QStringLiteral("2734826345"));
+
+    number2.setId(QStringLiteral("My Id"));
+    number2.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number2.setNumber(QStringLiteral("2734826345"));
+
+    QVERIFY(number1 == number2);
+}
+
+void PhoneNumberTest::differsTest()
+{
+    KContacts::PhoneNumber number1(QStringLiteral("123"), KContacts::PhoneNumber::Home);
+    KContacts::PhoneNumber number2(QStringLiteral("123"), KContacts::PhoneNumber::Work);
+
+    QVERIFY(number1 != number2);
+}
+
+void PhoneNumberTest::assignmentTest()
+{
+    KContacts::PhoneNumber number1;
+    KContacts::PhoneNumber number2;
+
+    number1.setId(QStringLiteral("My Id"));
+    number1.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number1.setNumber(QStringLiteral("2734826345"));
+
+    number1 = number2;
+
+    QVERIFY(number1 == number2);
+}
+
+void PhoneNumberTest::serializeTest()
+{
+    KContacts::PhoneNumber number1;
+    KContacts::PhoneNumber number2;
+
+    number1.setId(QStringLiteral("My Id"));
+    number1.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number1.setNumber(QStringLiteral("2734826345"));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << number1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> number2;
+
+    QVERIFY(number1 == number2);
+}
+
+void PhoneNumberTest::labelTest()
+{
+    QMap<KContacts::PhoneNumber::Type, QString> labels;
+
+    const KContacts::PhoneNumber::TypeList types = KContacts::PhoneNumber::typeList();
+
+    // check all types standalone
+    for (KContacts::PhoneNumber::Type type : types) {
+        const KContacts::PhoneNumber phone(QStringLiteral("1"), type);
+        QCOMPARE(phone.type(), type);
+
+        // Pref is special cased
+        if (type != KContacts::PhoneNumber::Pref) {
+            QCOMPARE(phone.typeLabel(), KContacts::PhoneNumber::typeFlagLabel((KContacts::PhoneNumber::TypeFlag)(int)type));
+            labels.insert(type, phone.typeLabel());
+        } else {
+            labels.insert(type, KContacts::PhoneNumber::typeFlagLabel((KContacts::PhoneNumber::TypeFlag)(int)type));
+        }
+        QCOMPARE(KContacts::PhoneNumber::typeLabel(type), phone.typeLabel());
+    }
+
+    // combine all with Pref
+    for (KContacts::PhoneNumber::Type type : std::as_const(types)) {
+        KContacts::PhoneNumber::Type combinedType = type | KContacts::PhoneNumber::Pref;
+        const KContacts::PhoneNumber phone(QLatin1String("1"), combinedType);
+        QCOMPARE(phone.type(), combinedType);
+        QCOMPARE(KContacts::PhoneNumber::typeLabel(combinedType), phone.typeLabel());
+
+        if (type < KContacts::PhoneNumber::Pref) {
+            const QString expectedCombinedString = QStringLiteral("%1/%2").arg(labels[type]).arg(labels[KContacts::PhoneNumber::Pref]);
+            QCOMPARE(phone.typeLabel(), expectedCombinedString);
+        } else if (type > KContacts::PhoneNumber::Pref) {
+            const QString expectedCombinedString = QStringLiteral("%1/%2").arg(labels[KContacts::PhoneNumber::Pref]).arg(labels[type]);
+            QCOMPARE(phone.typeLabel(), expectedCombinedString);
+        }
+    }
+
+    // combine all with Fax
+    for (KContacts::PhoneNumber::Type type : std::as_const(types)) {
+        KContacts::PhoneNumber::Type combinedType = type | KContacts::PhoneNumber::Fax;
+        const KContacts::PhoneNumber phone(QLatin1String("1"), combinedType);
+        QCOMPARE(phone.type(), combinedType);
+        QCOMPARE(KContacts::PhoneNumber::typeLabel(combinedType), phone.typeLabel());
+
+        if (type == KContacts::PhoneNumber::Home || type == KContacts::PhoneNumber::Work) {
+            // special cased
+        } else if (type < KContacts::PhoneNumber::Fax) {
+            const QString expectedCombinedString = QStringLiteral("%1/%2").arg(labels[type]).arg(labels[KContacts::PhoneNumber::Fax]);
+            QCOMPARE(phone.typeLabel(), expectedCombinedString);
+        } else if (type > KContacts::PhoneNumber::Fax) {
+            const QString expectedCombinedString = QStringLiteral("%1/%2").arg(labels[KContacts::PhoneNumber::Fax]).arg(labels[type]);
+            QCOMPARE(phone.typeLabel(), expectedCombinedString);
+        }
+    }
+
+    // special cases
+    QCOMPARE(KContacts::PhoneNumber::typeLabel(KContacts::PhoneNumber::Pref), QLatin1String("Preferred Number"));
+    QCOMPARE(KContacts::PhoneNumber::typeLabel(KContacts::PhoneNumber::Home //
+                                               | KContacts::PhoneNumber::Fax),
+             QLatin1String("Home Fax"));
+    QCOMPARE(KContacts::PhoneNumber::typeLabel(KContacts::PhoneNumber::Work //
+                                               | KContacts::PhoneNumber::Fax),
+             QLatin1String("Work Fax"));
+    QCOMPARE(KContacts::PhoneNumber::typeLabel(KContacts::PhoneNumber::Home //
+                                               | KContacts::PhoneNumber::Fax //
+                                               | KContacts::PhoneNumber::Pref),
+             QLatin1String("Home Fax/Preferred"));
+    QCOMPARE(KContacts::PhoneNumber::typeLabel(KContacts::PhoneNumber::Work //
+                                               | KContacts::PhoneNumber::Fax //
+                                               | KContacts::PhoneNumber::Pref),
+             QLatin1String("Work Fax/Preferred"));
+}
+
+void PhoneNumberTest::shouldParseVCard21()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:2.1\n"
+        "EMAIL:foo@kde.org\n"
+        "N:;;;;\n"
+        "TEL;CELL;WORK:+1-919-676-9564\n"
+        "UID:testuid\n"
+        "END:VCARD\n"
+        "\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    const KContacts::Addressee &addr = lst.at(0);
+    QCOMPARE(addr.phoneNumbers().count(), 1);
+    KContacts::PhoneNumber number1 = addr.phoneNumbers().at(0);
+    QCOMPARE(number1.number(), QLatin1String("+1-919-676-9564"));
+    QVERIFY(number1.supportsSms());
+    QVERIFY(!number1.isPreferred());
+}
+
+void PhoneNumberTest::shouldExportVCard21()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+
+    KContacts::PhoneNumber number1;
+
+    number1.setId(QStringLiteral("My Id"));
+    number1.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number1.setNumber(QStringLiteral("+1-919-676-9564"));
+    addr.setPhoneNumbers(KContacts::PhoneNumber::List() << number1);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v2_1);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:2.1\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TEL;CELL;WORK:+1-919-676-9564\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n"
+        "\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void PhoneNumberTest::shouldExportVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+
+    KContacts::PhoneNumber number1;
+
+    number1.setId(QStringLiteral("My Id"));
+    number1.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number1.setNumber(QStringLiteral("+1-919-676-9564"));
+    addr.setPhoneNumbers(KContacts::PhoneNumber::List() << number1);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TEL;TYPE=CELL,WORK:+1-919-676-9564\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n"
+        "\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void PhoneNumberTest::shouldExportVCard4()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+
+    KContacts::PhoneNumber number1;
+
+    number1.setId(QStringLiteral("My Id"));
+    number1.setType(KContacts::PhoneNumber::Work | KContacts::PhoneNumber::Cell);
+    number1.setNumber(QStringLiteral("+1-919-676-9564"));
+    addr.setPhoneNumbers(KContacts::PhoneNumber::List() << number1);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TEL;TYPE=\"cell,work\":+1-919-676-9564\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n"
+        "\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void PhoneNumberTest::shouldParseVcard3()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "TEL;VALUE=uri;PREF=1;TYPE=\"voice,home\":tel:+44-555-555-5555;ext=5555\r\n"
+        "TEL;VALUE=uri;TYPE=\"voice,cell,text\":tel:+44-555-555-6666\r\n"
+        "TEL;VALUE=uri;TYPE=\"voice,work\":tel:+44-555-555-7777\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "LANG:fr\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    const KContacts::Addressee &addr = lst.at(0);
+    QCOMPARE(addr.phoneNumbers().count(), 3);
+}
+
+void PhoneNumberTest::shouldParseVcard4()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:4.0\n"
+        "N:LastName;FirstName;;;\n"
+        "TEL;VALUE=uri;PREF=1;TYPE=\"voice,home\":tel:+44-555-555-5555;ext=5555\r\n"
+        "TEL;VALUE=uri;TYPE=\"voice,cell,text\":tel:+44-555-555-6666\r\n"
+        "TEL;VALUE=uri;TYPE=\"voice,work\":tel:+44-555-555-7777\r\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "LANG:fr\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    const KContacts::Addressee &addr = lst.at(0);
+    QCOMPARE(addr.phoneNumbers().count(), 3);
+}
+
+void PhoneNumberTest::testNormalizeNumber_data()
+{
+    QTest::addColumn<QString>("input");
+    QTest::addColumn<QString>("expected");
+
+    QTest::newRow("empty") << QString() << QString();
+    QTest::newRow("normalized") << QStringLiteral("+49123456789") << QStringLiteral("+49123456789");
+    QTest::newRow("formatted") << QStringLiteral("+49(123) 456 - 789") << QStringLiteral("+49123456789");
+}
+
+void PhoneNumberTest::testNormalizeNumber()
+{
+    QFETCH(QString, input);
+    QFETCH(QString, expected);
+
+    KContacts::PhoneNumber num;
+    num.setNumber(input);
+    QCOMPARE(num.normalizedNumber(), expected);
+}
diff --git a/autotests/phonenumbertest.h b/autotests/phonenumbertest.h
new file mode 100644 (file)
index 0000000..8340f9d
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef PHONENUMBER_TEST_H
+#define PHONENUMBER_TEST_H
+
+#include <QObject>
+
+class PhoneNumberTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void emptyTest();
+    void storeTest();
+    void equalsTest();
+    void differsTest();
+    void assignmentTest();
+    void serializeTest();
+    void labelTest();
+
+    void shouldExportVCard3();
+    void shouldExportVCard4();
+    void shouldParseVcard3();
+    void shouldParseVcard4();
+
+    void shouldExportVCard21();
+    void shouldParseVCard21();
+
+    void testNormalizeNumber_data();
+    void testNormalizeNumber();
+};
+
+#endif
diff --git a/autotests/picturetest.cpp b/autotests/picturetest.cpp
new file mode 100644 (file)
index 0000000..6658418
--- /dev/null
@@ -0,0 +1,266 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "picturetest.h"
+#include "kcontacts/picture.h"
+#include <QBuffer>
+#include <QPainter>
+#include <QTest>
+
+QTEST_MAIN(PictureTest)
+
+static QImage testImage()
+{
+    static QImage image;
+
+    if (image.isNull()) {
+        image = QImage(200, 200, QImage::Format_RGB32);
+        QPainter p(&image);
+        p.drawRect(10, 10, 50, 50);
+    }
+
+    return image;
+}
+
+static QByteArray testImageRawPNG()
+{
+    static QByteArray raw;
+
+    if (raw.isNull()) {
+        QBuffer buffer(&raw);
+        buffer.open(QIODevice::WriteOnly);
+        testImage().save(&buffer, "PNG");
+    }
+
+    return raw;
+}
+
+static QByteArray testImageRawJPEG()
+{
+    static QByteArray raw;
+
+    if (raw.isNull()) {
+        QBuffer buffer(&raw);
+        buffer.open(QIODevice::WriteOnly);
+        testImage().save(&buffer, "JPEG");
+    }
+
+    return raw;
+}
+
+void PictureTest::emptyTest()
+{
+    KContacts::Picture picture;
+
+    QVERIFY(picture.isEmpty());
+}
+
+void PictureTest::storeTestInternImage()
+{
+    KContacts::Picture picture;
+
+    picture.setData(testImage());
+
+    QVERIFY(picture.isEmpty() == false);
+    QVERIFY(picture.isIntern() == true);
+    QVERIFY(picture.type() == QLatin1String("jpeg"));
+    QVERIFY(picture.data() == testImage());
+    QVERIFY(picture.rawData() == testImageRawJPEG());
+}
+
+void PictureTest::storeTestInternRawData()
+{
+    KContacts::Picture picture;
+
+    picture.setRawData(testImageRawPNG(), QStringLiteral("png"));
+
+    QVERIFY(picture.isEmpty() == false);
+    QVERIFY(picture.isIntern() == true);
+    QVERIFY(picture.type() == QLatin1String("png"));
+    QVERIFY(picture.rawData() == testImageRawPNG());
+    QVERIFY(picture.data() == testImage());
+}
+
+void PictureTest::storeTestExtern()
+{
+    KContacts::Picture picture;
+
+    picture.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    QVERIFY(picture.isEmpty() == false);
+    QVERIFY(picture.isIntern() == false);
+    QVERIFY(picture.type() == QLatin1String("png"));
+    QVERIFY(picture.url() == QLatin1String("http://myhomepage.com/foto.png"));
+}
+
+void PictureTest::equalsTestInternImage()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setData(testImage());
+
+    picture2.setData(testImage());
+
+    QVERIFY(picture1 == picture2);
+
+    // access rawData() so a QByteArray is created
+    QVERIFY(!picture1.rawData().isNull());
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::equalsTestInternRawData()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setRawData(testImageRawPNG(), QStringLiteral("png"));
+
+    picture2.setRawData(testImageRawPNG(), QStringLiteral("png"));
+
+    QVERIFY(picture1 == picture2);
+
+    // access data() so a QImage is created
+    QVERIFY(!picture1.data().isNull());
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::equalsTestInternImageAndRawData()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setData(testImage());
+
+    picture2.setRawData(testImageRawJPEG(), QStringLiteral("jpeg"));
+
+    QVERIFY(picture1.rawData() == picture2.rawData());
+}
+
+void PictureTest::equalsTestExtern()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    picture2.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::differsTest()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    picture2.setData(testImage());
+
+    QVERIFY(picture1 != picture2);
+}
+
+void PictureTest::differsTestInternRawData()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setRawData(testImageRawJPEG(), QStringLiteral("jpeg"));
+
+    picture2.setRawData(testImageRawPNG(), QStringLiteral("png"));
+
+    QVERIFY(picture1 != picture2);
+    QVERIFY(picture1.rawData() != picture2.rawData());
+}
+
+void PictureTest::differsTestExtern()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    picture1.setUrl(QStringLiteral("http://myhomepage.com/foto2.png"), QStringLiteral("png"));
+
+    QVERIFY(picture1 != picture2);
+}
+
+void PictureTest::assignmentTestIntern()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setData(testImage());
+
+    picture2 = picture1;
+
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::assignmentTestExtern()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    picture2 = picture1;
+
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::serializeTestInternImage()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setData(testImage());
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << picture1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> picture2;
+
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::serializeTestInternRawData()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setRawData(testImageRawPNG(), QStringLiteral("png"));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << picture1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> picture2;
+
+    QVERIFY(picture1 == picture2);
+}
+
+void PictureTest::serializeTestExtern()
+{
+    KContacts::Picture picture1;
+    KContacts::Picture picture2;
+
+    picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png"));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << picture1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> picture2;
+
+    QVERIFY(picture1 == picture2);
+}
diff --git a/autotests/picturetest.h b/autotests/picturetest.h
new file mode 100644 (file)
index 0000000..b525a00
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef PICTURE_TEST_H
+#define PICTURE_TEST_H
+
+#include <QObject>
+
+class PictureTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void emptyTest();
+    void storeTestInternImage();
+    void storeTestInternRawData();
+    void storeTestExtern();
+    void equalsTestInternImage();
+    void equalsTestInternRawData();
+    void equalsTestInternImageAndRawData();
+    void equalsTestExtern();
+    void differsTest();
+    void differsTestInternRawData();
+    void differsTestExtern();
+    void assignmentTestIntern();
+    void assignmentTestExtern();
+    void serializeTestInternImage();
+    void serializeTestInternRawData();
+    void serializeTestExtern();
+};
+
+#endif
diff --git a/autotests/relatedtest.cpp b/autotests/relatedtest.cpp
new file mode 100644 (file)
index 0000000..04755f5
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "relatedtest.h"
+
+#include "parametermap_p.h"
+#include "related.h"
+#include "vcardtool_p.h"
+
+#include <QTest>
+
+RelatedTest::RelatedTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+RelatedTest::~RelatedTest()
+{
+}
+
+void RelatedTest::shouldHaveDefaultValue()
+{
+    KContacts::Related related;
+    QVERIFY(!related.isValid());
+    QVERIFY(related.related().isEmpty());
+    QVERIFY(related.params().empty());
+}
+
+void RelatedTest::shouldAssignValue()
+{
+    const QString relatedTo(QStringLiteral("friend"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Related related(relatedTo);
+    related.setParams(params);
+    QVERIFY(related.isValid());
+    QVERIFY(!related.related().isEmpty());
+    QCOMPARE(related.related(), relatedTo);
+    QVERIFY(!related.params().empty());
+    QCOMPARE(related.params(), params);
+}
+
+void RelatedTest::shouldAssignExternal()
+{
+    KContacts::Related related;
+    const QString relatedTo(QStringLiteral("friend"));
+    related.setRelated(relatedTo);
+    QVERIFY(related.isValid());
+    QCOMPARE(related.related(), relatedTo);
+}
+
+void RelatedTest::shouldSerialized()
+{
+    KContacts::Related related;
+    KContacts::Related result;
+    const QString relatedTo(QStringLiteral("friend"));
+    related.setRelated(relatedTo);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    related.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << related;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(related == result);
+}
+
+void RelatedTest::shouldEqualRelated()
+{
+    KContacts::Related related;
+    KContacts::Related result;
+    const QString relatedTo(QStringLiteral("friend"));
+    related.setRelated(relatedTo);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    related.setParams(params);
+
+    result = related;
+    QVERIFY(related == result);
+}
+
+void RelatedTest::shouldParseRelated()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:4.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "RELATED:friend\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).relationships().count(), 1);
+    const KContacts::Related related = lst.at(0).relationships().at(0);
+    QCOMPARE(related.related(), QStringLiteral("friend"));
+}
+
+void RelatedTest::shouldParseRelatedWithArgument()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:4.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "RELATED;FOO1=bla1,blo1;FOO2=bla2,blo2:friend\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).relationships().count(), 1);
+    const KContacts::Related related = lst.at(0).relationships().at(0);
+    QCOMPARE(related.related(), QStringLiteral("friend"));
+    QCOMPARE(related.params().size(), 2);
+}
+
+void RelatedTest::shouldParseWithoutRelated()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).relationships().count(), 0);
+}
+
+void RelatedTest::shouldCreateVCard4()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Related::List lstRelated;
+    KContacts::Related related(QStringLiteral("friend"));
+    lstRelated << related;
+    addr.setRelationships(lstRelated);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "RELATED:friend\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void RelatedTest::shouldCreateVCardWithTwoRelated()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Related::List lstRelated;
+    KContacts::Related related(QStringLiteral("friend"));
+    KContacts::Related related2(QStringLiteral("kde"));
+    lstRelated << related << related2;
+    addr.setRelationships(lstRelated);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "RELATED:friend\r\n"
+        "RELATED:kde\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void RelatedTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Related::List lstRelated;
+    KContacts::Related related(QStringLiteral("friend"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    related.setParams(params);
+    lstRelated << related;
+    addr.setRelationships(lstRelated);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "RELATED;FOO1=bla1,blo1;FOO2=bla2,blo2:friend\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void RelatedTest::shouldNotExportInVcard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Related::List lstRelated;
+    KContacts::Related related(QStringLiteral("friend"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    related.setParams(params);
+    lstRelated << related;
+    addr.setRelationships(lstRelated);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "RELATED;FOO1=bla1,blo1;FOO2=bla2,blo2:friend\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(RelatedTest)
diff --git a/autotests/relatedtest.h b/autotests/relatedtest.h
new file mode 100644 (file)
index 0000000..73b18b2
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef RELATEDTEST_H
+#define RELATEDTEST_H
+
+#include <QObject>
+
+class RelatedTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit RelatedTest(QObject *parent = nullptr);
+    ~RelatedTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualRelated();
+    void shouldParseRelated();
+    void shouldParseWithoutRelated();
+    void shouldCreateVCard4();
+    void shouldCreateVCardWithTwoRelated();
+    void shouldCreateVCardWithParameters();
+    void shouldNotExportInVcard3();
+    void shouldParseRelatedWithArgument();
+};
+
+#endif // RELATEDTEST_H
diff --git a/autotests/resourcelocatorurltest.cpp b/autotests/resourcelocatorurltest.cpp
new file mode 100644 (file)
index 0000000..0af7145
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "resourcelocatorurltest.h"
+
+#include "parametermap_p.h"
+#include "resourcelocatorurl.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+using namespace KContacts;
+ResourceLocatorUrlTest::ResourceLocatorUrlTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+ResourceLocatorUrlTest::~ResourceLocatorUrlTest()
+{
+}
+
+void ResourceLocatorUrlTest::shouldHaveDefaultValue()
+{
+    ResourceLocatorUrl ResourceLocatorUrl;
+    QVERIFY(!ResourceLocatorUrl.isValid());
+    QVERIFY(ResourceLocatorUrl.url().isEmpty());
+    QVERIFY(ResourceLocatorUrl.params().empty());
+}
+
+void ResourceLocatorUrlTest::shouldAssignValue()
+{
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    ResourceLocatorUrl ResourceLocatorUrl;
+    ResourceLocatorUrl.setParams(params);
+    QVERIFY(!ResourceLocatorUrl.isValid());
+    QVERIFY(ResourceLocatorUrl.url().isEmpty());
+    QVERIFY(!ResourceLocatorUrl.params().empty());
+    QCOMPARE(ResourceLocatorUrl.params(), params);
+}
+
+void ResourceLocatorUrlTest::shouldAssignExternal()
+{
+    ResourceLocatorUrl resourcelocatorurl;
+    QUrl url = QUrl(QStringLiteral("https://www.kde.org"));
+    resourcelocatorurl.setUrl(url);
+    QVERIFY(!resourcelocatorurl.url().isEmpty());
+    QCOMPARE(resourcelocatorurl.url(), url);
+}
+
+void ResourceLocatorUrlTest::shouldSerialized()
+{
+    ResourceLocatorUrl resourcelocatorurl;
+    ResourceLocatorUrl result;
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    resourcelocatorurl.setParams(params);
+    resourcelocatorurl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org")));
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << resourcelocatorurl;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(resourcelocatorurl == result);
+}
+
+void ResourceLocatorUrlTest::shouldEqualResourceLocatorUrl()
+{
+    ResourceLocatorUrl resourcelocatorurl;
+    ResourceLocatorUrl result;
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    resourcelocatorurl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org")));
+    resourcelocatorurl.setParams(params);
+
+    result = resourcelocatorurl;
+    QVERIFY(resourcelocatorurl == result);
+}
+
+void ResourceLocatorUrlTest::shouldParseResourceLocatorUrl()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "URL;PREF=1;TYPE=HOME:https://firsturl\n"
+        "URL;TYPE=WORK,PREF:https://sherlockholmes.com/calendar/sherlockholmes\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraUrlList().count(), 2);
+    auto calurl = lst.at(0).extraUrlList().at(0);
+    QCOMPARE(calurl.url(), QUrl(QStringLiteral("https://firsturl")));
+    QVERIFY(calurl.isPreferred());
+    QCOMPARE(calurl.type(), KContacts::ResourceLocatorUrl::Home);
+    QVERIFY(!calurl.params().empty());
+    calurl = lst.at(0).extraUrlList().at(1);
+    QCOMPARE(calurl.url(), QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    QVERIFY(calurl.isPreferred());
+    QCOMPARE(calurl.type(), KContacts::ResourceLocatorUrl::Work);
+    QVERIFY(!calurl.params().empty());
+}
+
+void ResourceLocatorUrlTest::shouldGenerateVCard4()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ResourceLocatorUrl webpage;
+    webpage.setUrl(QUrl(QStringLiteral("https://www.kde.org")));
+    addr.setUrl(webpage);
+    ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    addr.insertExtraUrl(url);
+    url.setUrl(QUrl(QStringLiteral("https://foo.kde.org")));
+    addr.insertExtraUrl(url);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "URL:https://www.kde.org\r\n"
+        "URL:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "URL:https://foo.kde.org\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void ResourceLocatorUrlTest::shouldGenerateVCardWithParameter()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ResourceLocatorUrl webpage;
+    webpage.setUrl(QUrl(QStringLiteral("https://www.kde.org")));
+    addr.setUrl(webpage);
+    ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    url.setParams(params);
+    addr.insertExtraUrl(url);
+    url.setUrl(QUrl(QStringLiteral("https://foo.kde.org")));
+    ParameterMap params2;
+    url.setParams(params2);
+    addr.insertExtraUrl(url);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "URL:https://www.kde.org\r\n"
+        "URL;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "URL:https://foo.kde.org\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void ResourceLocatorUrlTest::shouldGenerateVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::ResourceLocatorUrl webpage;
+    webpage.setUrl(QUrl(QStringLiteral("https://www.kde.org")));
+    addr.setUrl(webpage);
+    ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    url.setParams(params);
+    addr.insertExtraUrl(url);
+    url.setUrl(QUrl(QStringLiteral("https://foo.kde.org")));
+    ParameterMap params2;
+    url.setParams(params2);
+    url.setType(ResourceLocatorUrl::Work);
+    url.setPreferred(true);
+    addr.insertExtraUrl(url);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "UID:testuid\r\n"
+        "URL:https://www.kde.org\r\n"
+        "URL;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
+        "URL;TYPE=WORK,PREF:https://foo.kde.org\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(ResourceLocatorUrlTest)
diff --git a/autotests/resourcelocatorurltest.h b/autotests/resourcelocatorurltest.h
new file mode 100644 (file)
index 0000000..10c5dd7
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ResourceLocatorUrlTest_H
+#define ResourceLocatorUrlTest_H
+
+#include <QObject>
+
+class ResourceLocatorUrlTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ResourceLocatorUrlTest(QObject *parent = nullptr);
+    ~ResourceLocatorUrlTest() override;
+
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualResourceLocatorUrl();
+    void shouldParseResourceLocatorUrl();
+    void shouldGenerateVCard4();
+    void shouldGenerateVCardWithParameter();
+    void shouldGenerateVCard3();
+};
+
+#endif // ResourceLocatorUrlTest_H
diff --git a/autotests/roletest.cpp b/autotests/roletest.cpp
new file mode 100644 (file)
index 0000000..6db11fb
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "roletest.h"
+#include "parametermap_p.h"
+#include "role.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+RoleTest::RoleTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+RoleTest::~RoleTest()
+{
+}
+
+void RoleTest::shouldHaveDefaultValue()
+{
+    KContacts::Role role;
+    QVERIFY(!role.isValid());
+    QVERIFY(role.role().isEmpty());
+    QVERIFY(role.params().empty());
+}
+
+void RoleTest::shouldAssignValue()
+{
+    const QString lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Role role(lang);
+    role.setParams(params);
+    QVERIFY(role.isValid());
+    QVERIFY(!role.role().isEmpty());
+    QCOMPARE(role.role(), lang);
+    QVERIFY(!role.params().empty());
+    QCOMPARE(role.params(), params);
+}
+
+void RoleTest::shouldAssignExternal()
+{
+    KContacts::Role role;
+    const QString lang(QStringLiteral("fr"));
+    role.setRole(lang);
+    QVERIFY(role.isValid());
+    QCOMPARE(role.role(), lang);
+}
+
+void RoleTest::shouldSerialized()
+{
+    KContacts::Role role;
+    KContacts::Role result;
+    const QString lang(QStringLiteral("fr"));
+    role.setRole(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    role.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << role;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(role == result);
+}
+
+void RoleTest::shouldEqualRole()
+{
+    KContacts::Role role;
+    KContacts::Role result;
+    const QString lang(QStringLiteral("fr"));
+    role.setRole(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    role.setParams(params);
+
+    result = role;
+    QVERIFY(role == result);
+}
+
+void RoleTest::shouldParseRole()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "Role:boo\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraRoleList().count(), 1);
+    QCOMPARE(lst.at(0).role(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).extraRoleList().at(0).role(), QStringLiteral("boo"));
+}
+
+void RoleTest::shouldParseWithoutRole()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraRoleList().count(), 0);
+    QCOMPARE(lst.at(0).role(), QString());
+}
+
+void RoleTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Role::List lstRole;
+    KContacts::Role role(QStringLiteral("fr"));
+    lstRole << role;
+    addr.setExtraRoleList(lstRole);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ROLE:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void RoleTest::shouldCreateVCardWithTwoRole()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Role::List lstRole;
+    KContacts::Role role(QStringLiteral("fr"));
+    KContacts::Role role2(QStringLiteral("fr2"));
+    lstRole << role << role2;
+    addr.setExtraRoleList(lstRole);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ROLE:fr\r\n"
+        "ROLE:fr2\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void RoleTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Role::List lstRole;
+    KContacts::Role role(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    role.setParams(params);
+    lstRole << role;
+    addr.setExtraRoleList(lstRole);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ROLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void RoleTest::shouldGenerateRoleForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Role::List lstRole;
+    KContacts::Role role(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    role.setParams(params);
+    lstRole << role;
+    addr.setExtraRoleList(lstRole);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "ROLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(RoleTest)
diff --git a/autotests/roletest.h b/autotests/roletest.h
new file mode 100644 (file)
index 0000000..c35ff6e
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ROLETEST_H
+#define ROLETEST_H
+
+#include <QObject>
+
+class RoleTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit RoleTest(QObject *parent = nullptr);
+    ~RoleTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualRole();
+    void shouldParseRole();
+    void shouldParseWithoutRole();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoRole();
+    void shouldCreateVCardWithParameters();
+    void shouldGenerateRoleForVCard3();
+};
+
+#endif // ROLETEST_H
diff --git a/autotests/secrecytest.cpp b/autotests/secrecytest.cpp
new file mode 100644 (file)
index 0000000..4d32aef
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "secrecytest.h"
+#include "kcontacts/secrecy.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+QTEST_MAIN(SecrecyTest)
+
+void SecrecyTest::emptyTest()
+{
+    KContacts::Secrecy secrecy;
+
+    QVERIFY(secrecy.type() == KContacts::Secrecy::Invalid);
+}
+
+void SecrecyTest::storeTest()
+{
+    KContacts::Secrecy secrecy;
+
+    secrecy.setType(KContacts::Secrecy::Private);
+
+    QVERIFY(secrecy.type() == KContacts::Secrecy::Private);
+}
+
+void SecrecyTest::equalsTest()
+{
+    KContacts::Secrecy secrecy1;
+    KContacts::Secrecy secrecy2;
+
+    secrecy1.setType(KContacts::Secrecy::Confidential);
+    secrecy2.setType(KContacts::Secrecy::Confidential);
+
+    QVERIFY(secrecy1 == secrecy2);
+}
+
+void SecrecyTest::differsTest()
+{
+    KContacts::Secrecy secrecy1(KContacts::Secrecy::Private);
+    KContacts::Secrecy secrecy2(KContacts::Secrecy::Confidential);
+
+    QVERIFY(secrecy1 != secrecy2);
+}
+
+void SecrecyTest::assignmentTest()
+{
+    KContacts::Secrecy secrecy1;
+    KContacts::Secrecy secrecy2;
+
+    secrecy1.setType(KContacts::Secrecy::Confidential);
+    secrecy1 = secrecy2;
+
+    QVERIFY(secrecy1 == secrecy2);
+}
+
+void SecrecyTest::serializeTest()
+{
+    KContacts::Secrecy secrecy1;
+    KContacts::Secrecy secrecy2;
+
+    secrecy1.setType(KContacts::Secrecy::Confidential);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << secrecy1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> secrecy2;
+
+    QVERIFY(secrecy1 == secrecy2);
+}
diff --git a/autotests/secrecytest.h b/autotests/secrecytest.h
new file mode 100644 (file)
index 0000000..dc38edb
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef SECRECY_TEST_H
+#define SECRECY_TEST_H
+
+#include <QObject>
+
+class SecrecyTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void emptyTest();
+    void storeTest();
+    void equalsTest();
+    void differsTest();
+    void assignmentTest();
+    void serializeTest();
+};
+
+#endif
diff --git a/autotests/soundtest.cpp b/autotests/soundtest.cpp
new file mode 100644 (file)
index 0000000..0ef0bba
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "soundtest.h"
+#include "addressee.h"
+#include "kcontacts/sound.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+QTEST_MAIN(SoundTest)
+
+static QByteArray testData()
+{
+    static QByteArray data;
+
+    if (data.isNull()) {
+        for (int i = 0; i < 20; ++i) {
+            data.append(char(i));
+        }
+    }
+
+    return data;
+}
+
+void SoundTest::emptyTest()
+{
+    KContacts::Sound sound;
+
+    QVERIFY(sound.isEmpty());
+}
+
+void SoundTest::storeTestIntern()
+{
+    KContacts::Sound sound;
+
+    sound.setData(testData());
+
+    QVERIFY(sound.isIntern() == true);
+    QVERIFY(sound.data() == testData());
+}
+
+void SoundTest::storeTestExtern()
+{
+    KContacts::Sound sound;
+
+    sound.setUrl(QLatin1String("http://myhomepage.com/sound.wav"));
+
+    QVERIFY(sound.isIntern() == false);
+    QVERIFY(sound.url() == QLatin1String("http://myhomepage.com/sound.wav"));
+}
+
+void SoundTest::equalsTestIntern()
+{
+    KContacts::Sound sound1;
+    KContacts::Sound sound2;
+
+    sound1.setData(testData());
+    sound2.setData(testData());
+
+    QVERIFY(sound1 == sound2);
+}
+
+void SoundTest::equalsTestExtern()
+{
+    KContacts::Sound sound1;
+    KContacts::Sound sound2;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    sound2.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+
+    QVERIFY(sound1 == sound2);
+}
+
+void SoundTest::differsTest()
+{
+    KContacts::Sound sound1;
+    KContacts::Sound sound2;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    sound2.setData(testData());
+
+    QVERIFY(sound1 != sound2);
+}
+
+void SoundTest::assignmentTestIntern()
+{
+    KContacts::Sound sound1;
+    KContacts::Sound sound2;
+
+    sound1.setData(testData());
+
+    sound2 = sound1;
+
+    QVERIFY(sound1 == sound2);
+}
+
+void SoundTest::assignmentTestExtern()
+{
+    KContacts::Sound sound1;
+    KContacts::Sound sound2;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+
+    sound2 = sound1;
+
+    QVERIFY(sound1 == sound2);
+}
+
+void SoundTest::serializeTest()
+{
+    KContacts::Sound sound1;
+    KContacts::Sound sound2;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    sound1.setData(testData());
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << sound1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> sound2;
+
+    QVERIFY(sound1 == sound2);
+}
+
+void SoundTest::shouldParseSource()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "SOUND;VALUE=URI:http://myhomepage.com/sound.wav\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QVERIFY(!lst.at(0).sound().isEmpty());
+    KContacts::Sound sound = lst.at(0).sound();
+    QVERIFY(!sound.isIntern());
+    QCOMPARE(sound.url(), QStringLiteral("http://myhomepage.com/sound.wav"));
+}
+
+void SoundTest::shouldGenerateVCard4WithData()
+{
+    KContacts::Addressee::List lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Sound sound1;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    sound1.setData(testData());
+    addr.setSound(sound1);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "SOUND;ENCODING=b:AAECAwQFBgcICQoLDA0ODxAREhM=\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void SoundTest::shouldGenerateVCard4WithUrl()
+{
+    KContacts::Addressee::List lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Sound sound1;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    addr.setSound(sound1);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "SOUND;VALUE=URI:http://myhomepage.com/sound.wav\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void SoundTest::shouldGenerateVCard3WithData()
+{
+    KContacts::Addressee::List lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Sound sound1;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    sound1.setData(testData());
+    addr.setSound(sound1);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "SOUND;ENCODING=b:AAECAwQFBgcICQoLDA0ODxAREhM=\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void SoundTest::shouldGenerateVCard3WithUrl()
+{
+    KContacts::Addressee::List lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Sound sound1;
+
+    sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav"));
+    addr.setSound(sound1);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "SOUND;VALUE=URI:http://myhomepage.com/sound.wav\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
diff --git a/autotests/soundtest.h b/autotests/soundtest.h
new file mode 100644 (file)
index 0000000..785ec28
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef SOUND_TEST_H
+#define SOUND_TEST_H
+
+#include <QObject>
+
+class SoundTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void emptyTest();
+    void storeTestIntern();
+    void storeTestExtern();
+    void equalsTestIntern();
+    void equalsTestExtern();
+    void differsTest();
+    void assignmentTestIntern();
+    void assignmentTestExtern();
+    void serializeTest();
+    void shouldParseSource();
+    void shouldGenerateVCard4WithData();
+    void shouldGenerateVCard4WithUrl();
+    void shouldGenerateVCard3WithData();
+    void shouldGenerateVCard3WithUrl();
+};
+
+#endif
diff --git a/autotests/testlock.h b/autotests/testlock.h
new file mode 100644 (file)
index 0000000..9282823
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+    This file is part of the KContacts framework.
+
+    SPDX-FileCopyrightText: 2003 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+#ifndef KCONTACTS_TESTLOCK_H
+#define KCONTACTS_TESTLOCK_H
+
+#include <QLabel>
+#include <QWidget>
+
+#include "kcontacts/lock.h"
+
+class QLabel;
+class QTreeWidget;
+
+class LockWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    LockWidget(const QString &identifier);
+    ~LockWidget();
+
+protected Q_SLOTS:
+    void lock();
+    void unlock();
+
+    void updateLockView();
+
+private:
+    KContacts::Lock *mLock = nullptr;
+
+    QLabel *mStatus = nullptr;
+    QTreeWidget *mLockView = nullptr;
+};
+
+#endif
diff --git a/autotests/testroundtrip.cpp b/autotests/testroundtrip.cpp
new file mode 100644 (file)
index 0000000..0d709ad
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2012 Kevin Krammer <krammer@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addressee.h"
+
+#include "converter/vcardconverter.h"
+
+#include <QDebug>
+#include <QDir>
+#include <QObject>
+#include <QTest>
+
+using namespace KContacts;
+
+class RoundtripTest : public QObject
+{
+    Q_OBJECT
+
+private:
+    QDir mInputDir;
+    QDir mOutput2_1Dir;
+    QDir mOutput3_0Dir;
+    QDir mOutput4_0Dir;
+
+    QStringList mInputFiles;
+
+private Q_SLOTS:
+    void initTestCase();
+    void testVCardRoundtrip_data();
+    void testVCardRoundtrip();
+};
+
+// check the validity of our test data set
+void RoundtripTest::initTestCase()
+{
+    // check that all resource prefixes exist
+
+    mInputDir = QDir(QStringLiteral(":/input"));
+    QVERIFY(mInputDir.exists());
+    QVERIFY(mInputDir.cd(QStringLiteral("data")));
+
+    mOutput2_1Dir = QDir(QStringLiteral(":/output2.1"));
+    QVERIFY(mOutput2_1Dir.exists());
+    QVERIFY(mOutput2_1Dir.cd(QStringLiteral("data")));
+
+    mOutput3_0Dir = QDir(QStringLiteral(":/output3.0"));
+    QVERIFY(mOutput3_0Dir.exists());
+    QVERIFY(mOutput3_0Dir.cd(QStringLiteral("data")));
+
+    mOutput4_0Dir = QDir(QStringLiteral(":/output4.0"));
+    QVERIFY(mOutput4_0Dir.exists());
+    QVERIFY(mOutput4_0Dir.cd(QStringLiteral("data")));
+
+    // check that there are input files
+
+    mInputFiles = mInputDir.entryList();
+
+    QVERIFY(!mInputFiles.isEmpty());
+}
+
+void RoundtripTest::testVCardRoundtrip_data()
+{
+    QTest::addColumn<QString>("inputFile");
+    QTest::addColumn<QString>("output2_1File");
+    QTest::addColumn<QString>("output3_0File");
+    QTest::addColumn<QString>("output4_0File");
+
+    QString outFile21Pattern = QLatin1String("%1.2_1ref");
+    QString outFile4Pattern = QLatin1String("v4_0.%1.ref");
+    QString outFilePattern = QLatin1String("%1.ref");
+    for (const QString &inputFile : std::as_const(mInputFiles)) {
+        const QString outFile = outFilePattern.arg(inputFile);
+        const QString outFileV2_1 = outFile21Pattern.arg(inputFile);
+        const QString outFileV4 = outFile4Pattern.arg(inputFile);
+        QTest::newRow(QFile::encodeName(inputFile).constData())
+            << inputFile << (mOutput2_1Dir.exists(outFileV2_1) ? outFileV2_1 : QString()) << (mOutput3_0Dir.exists(outFile) ? outFile : QString())
+            << (mOutput4_0Dir.exists(outFileV4) ? outFileV4 : QString());
+    }
+}
+
+static void compareBuffers(const char *version, const QByteArray &outputData, const QByteArray &outputRefData)
+{
+    if (outputData != outputRefData) {
+        qDebug() << " outputData " << outputData;
+        qDebug() << " outputRefData " << outputRefData;
+    }
+    const QList<QByteArray> outputLines = outputData.split('\n');
+    const QList<QByteArray> outputRefLines = outputRefData.split('\n');
+    for (int i = 0; i < qMin(outputLines.count(), outputRefLines.count()); ++i) {
+        const QByteArray &actual = outputLines.at(i);
+        const QByteArray &expect = outputRefLines.at(i);
+        if (actual != expect) {
+            qCritical() << "Mismatch in" << version << "output line" << (i + 1);
+            QCOMPARE(actual, expect);
+            QCOMPARE(actual.count(), expect.count());
+        }
+    }
+    QCOMPARE(outputLines.count(), outputRefLines.count());
+    QCOMPARE(outputData.size(), outputRefData.size());
+}
+
+void RoundtripTest::testVCardRoundtrip()
+{
+    QFETCH(QString, inputFile);
+    QFETCH(QString, output2_1File);
+    QFETCH(QString, output3_0File);
+    QFETCH(QString, output4_0File);
+
+    QVERIFY2(!output2_1File.isEmpty() || !output3_0File.isEmpty() || !output4_0File.isEmpty(), "No reference output file for either format version");
+
+    QFile input(QFileInfo(mInputDir, inputFile).absoluteFilePath());
+    QVERIFY(input.open(QIODevice::ReadOnly));
+
+    const QByteArray inputData = input.readAll();
+    QVERIFY(!inputData.isEmpty());
+
+    VCardConverter converter;
+    const Addressee::List list = converter.parseVCards(inputData);
+    QVERIFY(!list.isEmpty());
+
+    if (!output2_1File.isEmpty()) {
+        const QByteArray outputData = converter.createVCards(list, VCardConverter::v2_1);
+
+        QFile outputFile(QFileInfo(mOutput2_1Dir, output2_1File).absoluteFilePath());
+        QVERIFY(outputFile.open(QIODevice::ReadOnly));
+
+        const QByteArray outputRefData = outputFile.readAll();
+        compareBuffers("v2.1", outputData, outputRefData);
+    }
+
+    if (!output3_0File.isEmpty()) {
+        const QByteArray outputData = converter.createVCards(list, VCardConverter::v3_0);
+
+        QFile outputFile(QFileInfo(mOutput3_0Dir, output3_0File).absoluteFilePath());
+        QVERIFY(outputFile.open(QIODevice::ReadOnly));
+
+        const QByteArray outputRefData = outputFile.readAll();
+        compareBuffers("v3.0", outputData, outputRefData);
+    }
+#if 0
+    if (!output4_0File.isEmpty()) {
+        const QByteArray outputData = converter.createVCards(list, VCardConverter::v4_0);
+
+        QFile outputFile(QFileInfo(mOutput4_0Dir, output4_0File).absoluteFilePath());
+        QVERIFY(outputFile.open(QIODevice::ReadOnly));
+
+        const QByteArray outputRefData = outputFile.readAll();
+        compareBuffers("v4.0", outputData, outputRefData);
+    }
+#endif
+}
+
+QTEST_MAIN(RoundtripTest)
+
+#include "testroundtrip.moc"
diff --git a/autotests/testroundtrip.qrc b/autotests/testroundtrip.qrc
new file mode 100644 (file)
index 0000000..af1c2d3
--- /dev/null
@@ -0,0 +1,71 @@
+<!DOCTYPE RCC><RCC version="1.0">
+  <!-- input files -->
+  <qresource prefix="/input">
+    <file>data/vcard1.vcf</file>
+    <file>data/vcard2.vcf</file>
+    <file>data/vcard3.vcf</file>
+    <file>data/vcard4.vcf</file>
+    <file>data/vcard5.vcf</file>
+    <file>data/vcard6.vcf</file>
+    <file>data/vcard7.vcf</file>
+    <file>data/vcard8.vcf</file>
+    <file>data/vcard9.vcf</file>
+    <file>data/vcard10.vcf</file>
+    <file>data/vcard11.vcf</file>
+    <file>data/vcard12.vcf</file>
+    <file>data/vcard13.vcf</file>
+    <file>data/vcard14.vcf</file>
+    <file>data/vcard15.vcf</file>
+    <file>data/vcard_extension_case_normalization.vcf</file>
+    <file>data/vcard_legacy_messaging_fields.vcf</file>
+    <!-- <file>data/testfullvcard.vcf</file> -->
+    <!-- <file>data/vcardwithitemasapplesupport.vcf</file> -->
+  </qresource>
+  
+  <!-- output files formatted for vcard version 2.1 -->
+  <qresource prefix="/output2.1">
+    <file>data/vcard1.vcf.2_1ref</file>
+    <file>data/vcard2.vcf.2_1ref</file>
+    <file>data/vcard3.vcf.2_1ref</file>
+    <file>data/vcard6.vcf.2_1ref</file>
+    <file>data/vcard7.vcf.2_1ref</file>
+    <file>data/vcard12.vcf.2_1ref</file>
+    <file>data/vcard14.vcf.2_1ref</file>
+  </qresource>
+  
+  <!-- output files formatted for vcard version 3.0 -->
+  <qresource prefix="/output3.0">
+    <file>data/vcard1.vcf.ref</file>
+    <file>data/vcard2.vcf.ref</file>
+    <file>data/vcard3.vcf.ref</file>
+    <file>data/vcard4.vcf.ref</file>
+    <file>data/vcard5.vcf.ref</file>
+    <file>data/vcard6.vcf.ref</file>
+    <file>data/vcard7.vcf.ref</file>
+    <file>data/vcard8.vcf.ref</file>
+    <file>data/vcard9.vcf.ref</file>
+    <file>data/vcard10.vcf.ref</file>
+    <file>data/vcard11.vcf.ref</file>
+    <file>data/vcard12.vcf.ref</file>
+    <file>data/vcard13.vcf.ref</file>
+    <file>data/vcard14.vcf.ref</file>
+    <file>data/vcard15.vcf.ref</file>
+    <file>data/vcard_extension_case_normalization.vcf.ref</file>
+    <file>data/vcard_legacy_messaging_fields.vcf.ref</file>
+    <!-- <file>data/testfullvcard.vcf.ref</file> -->
+    <!-- <file>data/vcardwithitemasapplesupport.vcf.ref</file> -->
+  </qresource>
+
+  <!-- output files formatted for vcard version 4.0 -->
+  <qresource prefix="/output4.0">
+    <file>data/v4_0.vcard1.vcf.ref</file>
+    <file>data/v4_0.vcard2.vcf.ref</file>
+    <file>data/v4_0.vcard3.vcf.ref</file>
+    <file>data/v4_0.vcard4.vcf.ref</file>
+    <file>data/v4_0.vcard5.vcf.ref</file>
+    <file>data/v4_0.vcard6.vcf.ref</file>
+    <file>data/v4_0.vcard7.vcf.ref</file>
+    <file>data/v4_0.vcard8.vcf.ref</file>
+  </qresource>
+
+</RCC>
diff --git a/autotests/timezonetest.cpp b/autotests/timezonetest.cpp
new file mode 100644 (file)
index 0000000..02acc9e
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "timezonetest.h"
+#include "kcontacts/timezone.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+QTEST_MAIN(TimeZoneTest)
+
+void TimeZoneTest::emptyTest()
+{
+    KContacts::TimeZone timezone;
+
+    QVERIFY(timezone.isValid() == false);
+}
+
+void TimeZoneTest::storeTest()
+{
+    KContacts::TimeZone timezone;
+
+    timezone.setOffset(2);
+
+    QVERIFY(timezone.offset() == 2);
+}
+
+void TimeZoneTest::equalsTest()
+{
+    KContacts::TimeZone timezone1;
+    KContacts::TimeZone timezone2;
+
+    timezone1.setOffset(2);
+    timezone2.setOffset(2);
+
+    QVERIFY(timezone1 == timezone2);
+}
+
+void TimeZoneTest::differsTest()
+{
+    KContacts::TimeZone timezone1(2);
+    KContacts::TimeZone timezone2(3);
+
+    QVERIFY(timezone1 != timezone2);
+    QVERIFY(timezone1 != KContacts::TimeZone());
+}
+
+void TimeZoneTest::assignmentTest()
+{
+    KContacts::TimeZone timezone1;
+    KContacts::TimeZone timezone2;
+
+    timezone1.setOffset(2);
+    timezone1 = timezone2;
+
+    QVERIFY(timezone1 == timezone2);
+}
+
+void TimeZoneTest::serializeTest()
+{
+    KContacts::TimeZone timezone1;
+    KContacts::TimeZone timezone2;
+
+    timezone1.setOffset(2);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << timezone1;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> timezone2;
+
+    QVERIFY(timezone1 == timezone2);
+}
+
+void TimeZoneTest::shouldGenerateVCard3()
+{
+    KContacts::Addressee::List lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::TimeZone timezone;
+
+    timezone.setOffset(2);
+    addr.setTimeZone(timezone);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected;
+    expected = QByteArray(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TZ:+00:02\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void TimeZoneTest::shouldGenerateVCard4()
+{
+    // TODO fixme.
+    KContacts::Addressee::List lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::TimeZone timezone;
+
+    timezone.setOffset(2);
+    addr.setTimeZone(timezone);
+
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    const QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TZ:+00:02\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
diff --git a/autotests/timezonetest.h b/autotests/timezonetest.h
new file mode 100644 (file)
index 0000000..2ecd513
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef TIMEZONE_TEST_H
+#define TIMEZONE_TEST_H
+
+#include <QObject>
+
+class TimeZoneTest : public QObject
+{
+    Q_OBJECT
+
+private Q_SLOTS:
+    void emptyTest();
+    void storeTest();
+    void equalsTest();
+    void differsTest();
+    void assignmentTest();
+    void serializeTest();
+    void shouldGenerateVCard3();
+    void shouldGenerateVCard4();
+};
+
+#endif
diff --git a/autotests/titletest.cpp b/autotests/titletest.cpp
new file mode 100644 (file)
index 0000000..8b2aaea
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "titletest.h"
+#include "parametermap_p.h"
+#include "title.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+TitleTest::TitleTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+TitleTest::~TitleTest()
+{
+}
+
+void TitleTest::shouldHaveDefaultValue()
+{
+    KContacts::Title title;
+    QVERIFY(!title.isValid());
+    QVERIFY(title.title().isEmpty());
+    QVERIFY(title.params().empty());
+}
+
+void TitleTest::shouldAssignValue()
+{
+    const QString lang(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    KContacts::Title title(lang);
+    title.setParams(params);
+    QVERIFY(title.isValid());
+    QVERIFY(!title.title().isEmpty());
+    QCOMPARE(title.title(), lang);
+    QVERIFY(!title.params().empty());
+    QCOMPARE(title.params(), params);
+}
+
+void TitleTest::shouldAssignExternal()
+{
+    KContacts::Title title;
+    const QString lang(QStringLiteral("fr"));
+    title.setTitle(lang);
+    QVERIFY(title.isValid());
+    QCOMPARE(title.title(), lang);
+}
+
+void TitleTest::shouldSerialized()
+{
+    KContacts::Title title;
+    KContacts::Title result;
+    const QString lang(QStringLiteral("fr"));
+    title.setTitle(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    title.setParams(params);
+
+    QByteArray data;
+    QDataStream s(&data, QIODevice::WriteOnly);
+    s << title;
+
+    QDataStream t(&data, QIODevice::ReadOnly);
+    t >> result;
+
+    QVERIFY(title == result);
+}
+
+void TitleTest::shouldEqualTitle()
+{
+    KContacts::Title title;
+    KContacts::Title result;
+    const QString lang(QStringLiteral("fr"));
+    title.setTitle(lang);
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    title.setParams(params);
+
+    result = title;
+    QVERIFY(title == result);
+}
+
+void TitleTest::shouldParseTwoTitles()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "Title:boo\n"
+        "Title:bla\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraTitleList().count(), 2);
+    QCOMPARE(lst.at(0).title(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).extraTitleList().at(0).title(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).extraTitleList().at(1).title(), QStringLiteral("bla"));
+}
+
+void TitleTest::shouldParseTitle()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "Title:boo\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraTitleList().count(), 1);
+    QCOMPARE(lst.at(0).title(), QStringLiteral("boo"));
+    QCOMPARE(lst.at(0).extraTitleList().at(0).title(), QStringLiteral("boo"));
+}
+
+void TitleTest::shouldParseWithoutTitle()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    KContacts::VCardTool vcard;
+    const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+    QCOMPARE(lst.count(), 1);
+    QCOMPARE(lst.at(0).extraTitleList().count(), 0);
+    QCOMPARE(lst.at(0).title(), QString());
+}
+
+void TitleTest::shouldCreateVCard()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Title::List lstTitle;
+    KContacts::Title title(QStringLiteral("fr"));
+    lstTitle << title;
+    addr.setExtraTitleList(lstTitle);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TITLE:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void TitleTest::shouldCreateVCardWithTwoTitle()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Title::List lstTitle;
+    KContacts::Title title(QStringLiteral("fr"));
+    KContacts::Title title2(QStringLiteral("fr2"));
+    lstTitle << title << title2;
+    addr.setExtraTitleList(lstTitle);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TITLE:fr\r\n"
+        "TITLE:fr2\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+
+    QCOMPARE(ba, expected);
+}
+
+void TitleTest::shouldCreateVCardWithParameters()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Title::List lstTitle;
+    KContacts::Title title(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    title.setParams(params);
+    lstTitle << title;
+    addr.setExtraTitleList(lstTitle);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TITLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+void TitleTest::shouldGenerateTitleForVCard3()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Title::List lstTitle;
+    KContacts::Title title(QStringLiteral("fr"));
+    KContacts::ParameterMap params;
+    params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
+    params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
+    title.setParams(params);
+    lstTitle << title;
+    addr.setExtraTitleList(lstTitle);
+    lst << addr;
+    KContacts::VCardTool vcard;
+    const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:3.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TITLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QCOMPARE(ba, expected);
+}
+
+QTEST_MAIN(TitleTest)
diff --git a/autotests/titletest.h b/autotests/titletest.h
new file mode 100644 (file)
index 0000000..6ed9e14
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef TITLETEST_H
+#define TITLETEST_H
+
+#include <QObject>
+
+class TitleTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit TitleTest(QObject *parent = nullptr);
+    ~TitleTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValue();
+    void shouldAssignExternal();
+    void shouldSerialized();
+    void shouldEqualTitle();
+    void shouldParseTwoTitles();
+    void shouldParseTitle();
+    void shouldParseWithoutTitle();
+    void shouldCreateVCard();
+    void shouldCreateVCardWithTwoTitle();
+    void shouldCreateVCardWithParameters();
+    void shouldGenerateTitleForVCard3();
+};
+
+#endif // TITLETEST_H
diff --git a/autotests/vcarddragtest.cpp b/autotests/vcarddragtest.cpp
new file mode 100644 (file)
index 0000000..c21c35e
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+  This file is part of the KContacts framework.
+  SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB a KDAB Group company <info@kdab.net>
+  SPDX-FileContributor: Kevin Krammer <krake@kdab.com>
+
+  SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QTest>
+
+#include "converter/kcontacts/vcardconverter.h"
+#include "kcontacts/vcarddrag.h"
+
+#include <QMimeData>
+using namespace KContacts;
+
+class VCardDragTest : public QObject
+{
+    Q_OBJECT
+
+public:
+    VCardDragTest();
+
+private:
+    Addressee mAddressee1;
+    Addressee mAddressee2;
+
+private Q_SLOTS:
+    void testPopulate();
+    void testCanDecode();
+    void testFromMimeData();
+};
+
+QTEST_MAIN(VCardDragTest)
+
+VCardDragTest::VCardDragTest()
+    : QObject()
+{
+    mAddressee1.setGivenName(QStringLiteral("Kevin"));
+    mAddressee1.setFamilyName(QStringLiteral("Krammer"));
+    mAddressee1.addEmail(QStringLiteral("kevin.krammer@gmx.at"));
+
+    mAddressee2.setGivenName(QStringLiteral("Tobias"));
+    mAddressee2.setFamilyName(QStringLiteral("König"));
+    mAddressee2.addEmail(QStringLiteral("tokoe@kde.org"));
+}
+
+void VCardDragTest::testPopulate()
+{
+    VCardConverter converter;
+    const QByteArray vcard = converter.createVCard(mAddressee1);
+    QVERIFY(!vcard.isEmpty());
+
+    QMimeData *data = new QMimeData();
+    bool result = VCardDrag::populateMimeData(data, vcard);
+    QVERIFY(result);
+    QVERIFY(data->hasFormat(KContacts::Addressee::mimeType()));
+    QCOMPARE(data->data(KContacts::Addressee::mimeType()), vcard);
+    delete data;
+
+    data = new QMimeData();
+    result = VCardDrag::populateMimeData(data, Addressee::List() << mAddressee1);
+    QVERIFY(result);
+    QVERIFY(data->hasFormat(KContacts::Addressee::mimeType()));
+    QCOMPARE(data->data(KContacts::Addressee::mimeType()), vcard);
+    delete data;
+
+    const QByteArray vcards = converter.createVCards(Addressee::List() << mAddressee1 << mAddressee2);
+    data = new QMimeData();
+    result = VCardDrag::populateMimeData(data, Addressee::List() << mAddressee1 << mAddressee2);
+    QVERIFY(result);
+    QVERIFY(data->hasFormat(KContacts::Addressee::mimeType()));
+    QCOMPARE(data->data(KContacts::Addressee::mimeType()), vcards);
+    delete data;
+
+    data = new QMimeData();
+    result = VCardDrag::populateMimeData(data, Addressee::List());
+    QVERIFY(!result);
+    QVERIFY(!data->hasFormat(KContacts::Addressee::mimeType()));
+    delete data;
+}
+
+void VCardDragTest::testCanDecode()
+{
+    VCardConverter converter;
+    const QByteArray vcard = converter.createVCard(mAddressee1);
+    QVERIFY(!vcard.isEmpty());
+
+    QMimeData *data = new QMimeData();
+    data->setData(Addressee::mimeType(), vcard);
+    QVERIFY(VCardDrag::canDecode(data));
+    delete data;
+
+    data = new QMimeData();
+    data->setData(QStringLiteral("text/x-vcard"), vcard);
+    QVERIFY(VCardDrag::canDecode(data));
+    delete data;
+
+    data = new QMimeData();
+    data->setData(QStringLiteral("application/octetstream"), vcard);
+    QVERIFY(!VCardDrag::canDecode(data));
+    delete data;
+}
+
+void VCardDragTest::testFromMimeData()
+{
+    VCardConverter converter;
+    const QByteArray vcard = converter.createVCard(mAddressee1);
+    QVERIFY(!vcard.isEmpty());
+
+    QByteArray content;
+
+    QMimeData *data = new QMimeData();
+    data->setData(Addressee::mimeType(), vcard);
+    bool result = VCardDrag::fromMimeData(data, content);
+    QVERIFY(result);
+    QCOMPARE(content, vcard);
+    delete data;
+
+    data = new QMimeData();
+    data->setData(QStringLiteral("text/x-vcard"), vcard);
+    result = VCardDrag::fromMimeData(data, content);
+    QVERIFY(result);
+    QCOMPARE(content, vcard);
+    delete data;
+
+    data = new QMimeData();
+    data->setData(QStringLiteral("application/octetstream"), vcard);
+    result = VCardDrag::fromMimeData(data, content);
+    QVERIFY(!result);
+    delete data;
+
+    const QByteArray vcards = converter.createVCards(Addressee::List() << mAddressee1 << mAddressee2);
+    QVERIFY(!vcards.isEmpty());
+
+    Addressee::List addresseeList;
+
+    data = new QMimeData();
+    data->setData(Addressee::mimeType(), vcards);
+    result = VCardDrag::fromMimeData(data, addresseeList);
+    QVERIFY(result);
+    QCOMPARE(addresseeList.count(), 2);
+    QCOMPARE(addresseeList[0], mAddressee1);
+    QCOMPARE(addresseeList[1], mAddressee2);
+    delete data;
+
+    data = new QMimeData();
+    data->setData(QStringLiteral("text/x-vcard"), vcards);
+    result = VCardDrag::fromMimeData(data, addresseeList);
+    QVERIFY(result);
+    QCOMPARE(addresseeList.count(), 2);
+    QCOMPARE(addresseeList[0], mAddressee1);
+    QCOMPARE(addresseeList[1], mAddressee2);
+    delete data;
+
+    data = new QMimeData();
+    data->setData(QStringLiteral("application/octetstream"), vcards);
+    result = VCardDrag::fromMimeData(data, addresseeList);
+    QVERIFY(!result);
+    delete data;
+
+    data = new QMimeData();
+    data->setData(Addressee::mimeType(), QByteArray());
+    result = VCardDrag::fromMimeData(data, addresseeList);
+    QVERIFY(!result);
+    delete data;
+}
+
+#include "vcarddragtest.moc"
diff --git a/autotests/vcardlinetest.cpp b/autotests/vcardlinetest.cpp
new file mode 100644 (file)
index 0000000..55f078d
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "vcardlinetest.h"
+#include "vcardline_p.h"
+#include <QTest>
+
+VCardLineTest::VCardLineTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+VCardLineTest::~VCardLineTest()
+{
+}
+
+void VCardLineTest::shouldHaveDefaultValue()
+{
+    KContacts::VCardLine line;
+    QVERIFY(line.identifier().isEmpty());
+    QVERIFY(line.group().isEmpty());
+    QVERIFY(line.parameterList().isEmpty());
+    QVERIFY(line.value().isNull());
+}
+
+void VCardLineTest::shouldAssignValues()
+{
+    KContacts::VCardLine line;
+    const QString identifier(QStringLiteral("foo"));
+    const QString group(QStringLiteral("bla"));
+    line.setIdentifier(identifier);
+    line.setGroup(group);
+    QMap<QString, QString> map;
+    for (int i = 0; i < 5; ++i) {
+        map.insert(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i));
+        line.addParameter(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i));
+    }
+    const QVariant valueVariant = QVariant(QStringLiteral("a"));
+    line.setValue(valueVariant);
+
+    QVERIFY(!line.parameterList().isEmpty());
+    QCOMPARE(line.parameterList(), QStringList() << map.keys());
+
+    QCOMPARE(line.identifier(), identifier);
+
+    QCOMPARE(line.group(), group);
+    QCOMPARE(line.value(), valueVariant);
+}
+
+void VCardLineTest::shouldCopyValue()
+{
+    KContacts::VCardLine line;
+    const QString identifier(QStringLiteral("foo"));
+    const QString group(QStringLiteral("bla"));
+    line.setIdentifier(identifier);
+    line.setGroup(group);
+    QMap<QString, QString> map;
+    for (int i = 0; i < 5; ++i) {
+        map.insert(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i));
+        line.addParameter(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i));
+    }
+    const QVariant valueVariant = QVariant(QStringLiteral("a"));
+    line.setValue(valueVariant);
+
+    QVERIFY(!line.parameterList().isEmpty());
+    QCOMPARE(line.parameterList(), QStringList() << map.keys());
+
+    QCOMPARE(line.identifier(), identifier);
+
+    QCOMPARE(line.group(), group);
+    QCOMPARE(line.value(), valueVariant);
+
+    KContacts::VCardLine copyLine(line);
+    QVERIFY(!copyLine.parameterList().isEmpty());
+    QCOMPARE(copyLine.parameterList(), QStringList() << map.keys());
+
+    QCOMPARE(copyLine.identifier(), identifier);
+
+    QCOMPARE(copyLine.group(), group);
+    QCOMPARE(copyLine.value(), valueVariant);
+}
+
+void VCardLineTest::shouldEqualValue()
+{
+    KContacts::VCardLine line;
+    const QString identifier(QStringLiteral("foo"));
+    const QString group(QStringLiteral("bla"));
+    line.setIdentifier(identifier);
+    line.setGroup(group);
+    QMap<QString, QString> map;
+    for (int i = 0; i < 5; ++i) {
+        map.insert(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i));
+        line.addParameter(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i));
+    }
+    const QVariant valueVariant = QVariant(QStringLiteral("a"));
+    line.setValue(valueVariant);
+
+    QVERIFY(!line.parameterList().isEmpty());
+    QCOMPARE(line.parameterList(), QStringList() << map.keys());
+
+    QCOMPARE(line.identifier(), identifier);
+
+    QCOMPARE(line.group(), group);
+    QCOMPARE(line.value(), valueVariant);
+
+    KContacts::VCardLine copyLine(line);
+    QVERIFY(line == copyLine);
+}
+
+QTEST_MAIN(VCardLineTest)
diff --git a/autotests/vcardlinetest.h b/autotests/vcardlinetest.h
new file mode 100644 (file)
index 0000000..9992884
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef VCARDLINETEST_H
+#define VCARDLINETEST_H
+
+#include <QObject>
+
+class VCardLineTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit VCardLineTest(QObject *parent = nullptr);
+    ~VCardLineTest() override;
+private Q_SLOTS:
+    void shouldHaveDefaultValue();
+    void shouldAssignValues();
+    void shouldCopyValue();
+    void shouldEqualValue();
+};
+
+#endif // VCARDLINETEST_H
diff --git a/autotests/vcardtool_benchmark.cpp b/autotests/vcardtool_benchmark.cpp
new file mode 100644 (file)
index 0000000..602d45b
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016 David Faure <faure@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "vcardtool_benchmark.h"
+#include "title.h"
+#include "vcardtool_p.h"
+#include <QTest>
+
+PerformanceTest::PerformanceTest(QObject *parent)
+    : QObject(parent)
+{
+}
+
+PerformanceTest::~PerformanceTest()
+{
+}
+
+void PerformanceTest::testParserPerformance()
+{
+    QByteArray vcarddata(
+        "BEGIN:VCARD\n"
+        "VERSION:3.0\n"
+        "N:LastName;FirstName;;;\n"
+        "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
+        "Title:boo\n"
+        "REV:2015-03-14T09:24:45+00:00\n"
+        "FN:FirstName LastName\n"
+        "END:VCARD\n");
+
+    QBENCHMARK {
+        KContacts::VCardTool vcard;
+        const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
+        QCOMPARE(lst.count(), 1);
+    }
+}
+
+void PerformanceTest::testExportPerformance()
+{
+    KContacts::AddresseeList lst;
+    KContacts::Addressee addr;
+    addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
+    addr.setUid(QStringLiteral("testuid"));
+    KContacts::Title::List lstTitle;
+    KContacts::Title title(QStringLiteral("fr"));
+    lstTitle << title;
+    addr.setExtraTitleList(lstTitle);
+    lst << addr;
+    QByteArray expected(
+        "BEGIN:VCARD\r\n"
+        "VERSION:4.0\r\n"
+        "EMAIL:foo@kde.org\r\n"
+        "N:;;;;\r\n"
+        "TITLE:fr\r\n"
+        "UID:testuid\r\n"
+        "END:VCARD\r\n\r\n");
+    QBENCHMARK {
+        KContacts::VCardTool vcard;
+        const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
+        QCOMPARE(ba, expected);
+    }
+}
+
+QTEST_GUILESS_MAIN(PerformanceTest)
diff --git a/autotests/vcardtool_benchmark.h b/autotests/vcardtool_benchmark.h
new file mode 100644 (file)
index 0000000..96442b6
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016 David Faure <faure@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef VCARDTOOL_BENCHMARK_H
+#define VCARDTOOL_BENCHMARK_H
+
+#include <QObject>
+
+class PerformanceTest : public QObject
+{
+    Q_OBJECT
+public:
+    explicit PerformanceTest(QObject *parent = nullptr);
+    ~PerformanceTest() override;
+private Q_SLOTS:
+    void testParserPerformance();
+    void testExportPerformance();
+};
+
+#endif
diff --git a/docs/AddressFormat.md b/docs/AddressFormat.md
new file mode 100644 (file)
index 0000000..bd89f83
--- /dev/null
@@ -0,0 +1,64 @@
+# Localized Address Formats
+
+KContact's address formatting largely follows the approach taken by
+[libaddressinput](https://github.com/google/libaddressinput), with adding
+a few additional fields and formatting styles.
+
+Address formatting rules are specified in the `addressformatrc` file in the `src`
+directory, grouped by country. The formatting rules format is compatible
+with [that of libaddressinput](https://github.com/google/libaddressinput/wiki/AddressValidationMetadata).
+
+## Address Format Information
+
+* AddressFormat: the default address format using native script, using the placeholders
+  specified below (mandatory).
+* LatinAddressFormat: for countries using a non-latin script this can provide
+  an alternative format for addresses transliterated to a latin script (optional).
+* BusinessAddressFormat: used for formatting postal addresses of an organization.
+  This only needs to be specified if the format differs from the generic case.
+* LatinBusinessAddressFormat: see LatinAddressFormat.
+
+All of the above values may be specified in multiple variants for multi-lingual countries.
+This is typically only needed when the format rule contains literal strings, e.g.
+for specifying a post office box.
+
+* Required: The address fields that are minimally required to form a valid address
+  in this country.
+* Upper: The address fields to be formatted in upper case regardless of the input
+  for postal addresses.
+
+The above values are specified as a string containing the single letter address field
+identifiers listed below. E.g. "AZC" would indicate that a street address, postal code
+and locality (city) are required.
+
+* PostalCodeFormat: A regular expression matching all valid postal codes in
+  this country.
+
+## Address Field Identifiers
+
+The following identifiers are used in the formatting rules to refer to specific
+parts of an address:
+
+* N - Name of a person/Recipient of a letter
+* O - Organization
+* A – Street address
+* C – Locality (city)
+* S – Region (country subdivision/administrative area/state/etc)
+* Z – Postal code/zip code
+* R - Country
+
+Identifiers used by libaddressinput but not by KContacts:
+
+* D – Dependent locality (may be an inner-city district or a suburb)
+* X – Sorting code
+
+## Address Formatting Rules
+
+Address formatting rules consist of a sequence of elements of the following
+three types:
+* Fields - Insert the value of the corresponding address field, specified as a `%` sign
+  followed by a field identifier (see above).
+* Separators - Represented as `%n`. Depending on the formatting style those are replaced
+  e.g. a line break or a script-dependent separator string.
+* Literals - Any other string. Inserted as-is in the output, given it is neither preceded nor
+  followed by an empty field.
diff --git a/docs/Doxyfile.local b/docs/Doxyfile.local
new file mode 100644 (file)
index 0000000..de04a8b
--- /dev/null
@@ -0,0 +1,10 @@
+### KApiDox Project-specific Overrides File
+
+# define so that deprecated API is not skipped
+PREDEFINED += \
+    "KCONTACTS_ENABLE_DEPRECATED_SINCE(x, y)=1" \
+    "KCONTACTS_BUILD_DEPRECATED_SINCE(x, y)=1" \
+    "KCONTACTS_DEPRECATED_VERSION(x, y, t)=" \
+    "KCONTACTS_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)=" \
+    "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION(x, y, t)=" \
+    "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)="
diff --git a/metainfo.yaml b/metainfo.yaml
new file mode 100644 (file)
index 0000000..d66fcfa
--- /dev/null
@@ -0,0 +1,17 @@
+maintainer: mlaurent
+description: Support for vCard contacts
+tier: 2
+type: functional
+public_lib: true
+platforms:
+    - name: All
+portingAid: false
+deprecated: false
+libraries:
+ - qmake: KContacts
+   cmake: "KF5::Contacts"
+cmakename: KF5Contacts
+
+group: Frameworks
+subgroup: Tier 2
+release: true
diff --git a/po/ar/kcontacts5.po b/po/ar/kcontacts5.po
new file mode 100644 (file)
index 0000000..500d65f
--- /dev/null
@@ -0,0 +1,745 @@
+# translation of kabc.po to Arabic
+# translation of kabc.po to
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Youssef Chahibi <chahibi@gmail.com>, 2007.
+# zayed <zayed.alsaidi@gmail.com>, 2009, 2021.
+# Safa Alfulaij <safa1996alfulaij@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2021-12-22 18:17+0400\n"
+"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
+"Language-Team: ar\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+"X-Generator: Lokalize 21.07.70\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "صندوق البريد"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "معلومات العنوان الموسّعة"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "الشّارع"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "المحلّة"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "المنطقة"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "الرّمز البريديّ"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "الدّولة"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "ملصق التّسليم"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "محليّ"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "عالميّ"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "بريديّ"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "للطّرود"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "المنزل"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "العمل"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "العنوان المفضّل"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "آخر"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "المعرّف الفريد"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "الاسم"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "الاسم المنسّق"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "اسم العائلة"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "الاسم المُعطى"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "أسماء إضافيّة"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "السّوابق التّشريفيّة"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "اللواحق التّشريفيّة"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "الاسم المستعار"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "عيد الميلاد"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "عنوان المنزل، الشّارع"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "عنوان المنزل، صندوق البريد"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "عنوان المنزل، المدينة"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "عنوان المنزل، المقاطعة"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "عنوان المنزل، الرّمز البريديّ"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "عنوان المنزل، الدّولة"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "ملصق عنوان المنزل"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "عنوان العمل، الشّارع"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "عنوان العمل، صندوق البريد"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "عنوان العمل، المدينة"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "عنوان العمل، المقاطعة"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "عنوان العمل، الرّمز البريديّ"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "عنوان العمل، الدّولة"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "ملصق عنوان العمل"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "هاتف المنزل"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "هاتف العمل"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "الهاتف المحمول"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "فاكس المنزل"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "فاكس العمل"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "هاتف السّيارة"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "المنادي"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "عنوان البريد الإلكترونيّ"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "عميل البريد"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "المنطقة الزمنيّة"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "الموقع الجغرافيّ"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "اللقب"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "الدّور"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "المنظّمة"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "القِسم"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "الملاحظة"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "معرف المنتج"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "تاريخ المراجعة"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "سلسلة الفرز"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "الصّفحة الرّئيسيّة"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "التصنيف الأمني"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "الشّعار"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "الصّورة"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "الصّوت"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "د."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "الآنسة"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "السّيّد"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "السّيّدة"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "الفاضلة"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "البروفيسور"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "الأوّل"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "الثّاني"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "الثّالث"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "الابن"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "الأبّ"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "حقل مجهول"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "الكلّ"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "متكرّر"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "العنوان"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "البريد الإلكترونيّ"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "شخصيّ"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "مخصّص"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "غير معرّف"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "مخصّص"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "نوع مجهول"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "رقم الهاتف"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "المنزل"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "العمل"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "المرسال"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "المفضّل"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "الصّوت"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "الفاكس"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "المحمول"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "الڤديو"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "صندوق البريد"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "المودم"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "السّيارة"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "آخر"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "الرّقم المفضّل"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "فاكس العمل"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "عامّ"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "خاصّ"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "سرّيّ"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "نوع مجهول"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "مفضلة"
+
+#~ msgid "List of Emails"
+#~ msgstr "قائمة بالبريد إلكتروني"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Mohamed SAAD محمد سعد, Majed Ali"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "metehyi@free.fr, GMajedli@gmail.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "غير قادر على تحميل المورد '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "انتقِ المرسل إليه"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "الاسم"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "البريد الإلكتروني"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "مُنتقى"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "ألغ الانتقاء"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "اضبط قوائم التوزيع"
+
+#~ msgid "Select Email Address"
+#~ msgstr "اختر عنوان البريد الإلكتروني"
+
+#~ msgid "Email Addresses"
+#~ msgstr "عناوين البريد الإلكتروني"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "نعم"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "لا"
+
+#~ msgid "New List..."
+#~ msgstr "قائمة جديدة..."
+
+#~ msgid "Rename List..."
+#~ msgstr "أعد تسمية قائمة..."
+
+#~ msgid "Remove List"
+#~ msgstr "إحذف القائمة"
+
+#~ msgid "Available addresses:"
+#~ msgstr "العناوين المتوفرة:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "البريد الإلكتروني المفضل"
+
+#~ msgid "Add Entry"
+#~ msgstr "اضف خانة"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "البريد الإلكتروني"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "استخدم المفضل"
+
+#~ msgid "Change Email..."
+#~ msgstr "غيّر البريد الإلكتروني..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "إزالة خانة"
+
+#~ msgid "New Distribution List"
+#~ msgstr "قائمة توزيع جديدة"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "فضلا أدخل الإ&سم:"
+
+#~ msgid "Distribution List"
+#~ msgstr "قائمة التوزيع"
+
+#~ msgid "Please change &name:"
+#~ msgstr "فضلا غيِّر الا&سم:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "حذف قائمة التوزيع '%1'  ؟"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "العناوين المنتقاة:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "العناوين المنتقاة في '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "لا"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "تنسيق vCard"
+
+#~ msgid "No description available."
+#~ msgstr "لا يوجد وصف."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "غير قادر على فتح ملف القفل."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "المورد '%1' مقفل بواسطة التطبيق '%2'."
+
+#~ msgid "Error"
+#~ msgstr "خطأ"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "فشل إلغاء القفل. ملف القفل مملوك لعملية أخرى: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: نجحت جميع عمليات القفل لكن لم يحدث أي قفل حقيقي."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: فشلت جميع عمليات القفل."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "فشل في حفظ المورد '%1'."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "فشل في حفظ المورد '%1'."
+
+#, fuzzy
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "غير قادر على تحميل المورد '%1'"
+
+#, fuzzy
+#~ msgid "Default Address Book"
+#~ msgstr "دفتر العناوين الإفتراضي"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "غير قادر على حفظ المورد '%1' . لأنها مقفلة."
diff --git a/po/az/kcontacts5.po b/po/az/kcontacts5.po
new file mode 100644 (file)
index 0000000..f906531
--- /dev/null
@@ -0,0 +1,585 @@
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+#
+# Xəyyam <xxmn77@gmail.com>, 2020, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2022-07-31 23:13+0400\n"
+"Last-Translator: Kheyyam <xxmn77@gmail.com>\n"
+"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
+"Language: az\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 22.04.3\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poçt Abunəçi Qutusu"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Ünvan haqqında ətraflı məlumat"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Küçə"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Yaşayış Məskəni"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Bölgə"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Poçt Kodu"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Ölkə"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Çatdırılma Etiketi"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Ölkə Daxili Ünvan"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Beynəlxalq"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Məktubların çatdırılma ünvanı"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Göndərişlər üçün ünvan"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Ev Ünvanı"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "İş Ünvanı"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Əsas ünvan"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Başqa ünvanlar"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unikal İdentifikator"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ad"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Tam Adı"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Soyadı"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Adı"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Əlavə Adlar"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Fəxri Müraciətlər (adın əvvəlində)"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Fəxri Müraciətlər (adın sonunda)"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Ləqəb"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Ad günü"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Ev Ünvanı: küçə"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Ev Ünvanı: Poçt qutusu"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Ev Ünvanı: şəhər"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Ev Ünvanı: Rayon/Bölgə"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Ev Ünvanı İndeksi"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Ev Ünvanı: Olkə"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Ev Ünvanı: yarlıq"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Xidməti Ünvan: küçə"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Xidməti Ünvan: Abunəçi Qutusu"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Xidməti Ünvan: Şəhər"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Xidməti Ünvan: Rayon/Bölgə"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Xidməti Ünvan: indeks"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Xidməti Ünvan: Ölkə"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Xidməti Ünvan: yarlıq"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Ev Telefonu"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Xidməti Telefon"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobil Telefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Ev Faksı"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Xidməti Faks"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Avtomobil Telefonu"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "İSDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Peycer"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-poçt ünvanı"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-poçt müştərisi"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Saat Qurşağı"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Coğrafi Məkan"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Müraciət forması"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Vəzifəsi"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Təşkilat"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Şöbə"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Qeyd"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Məhsulun identifikatoru"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Düzəliş Tarixi"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Çeşidləmə"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Veb Sayt"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Təlükəsizlik Səviyyəsi"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Loqo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Səs"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Xanım"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Cənab"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Xanım"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Xanım"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Kiçik"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Böyük"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Naməlum Sahə"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Bütün"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Tez-tez təkrar olunan"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Ünvan"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-poçt"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Şəxsi"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Fərdi"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Qeyri-müəyyən"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+# "Ən Yaxşı Məxfilik Açarı"
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP (məxfilik açarı)("
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Fərdi açar"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Naməlum növ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefon nömrəsi"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Ev Telefonu"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "İş Telefonu"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mesencer"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Əsas Telefon"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Səs"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "E-poçt qutusu"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Avtomobil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Digər Telefon Növü"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Əsas Nömrə"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Xidməti Faks"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publik"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Gizli"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Məxfi"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Naməlum Növ"
diff --git a/po/be/kcontacts5.po b/po/be/kcontacts5.po
new file mode 100644 (file)
index 0000000..78e44fe
--- /dev/null
@@ -0,0 +1,773 @@
+# translation of kabc.po to Belarusian
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Darafei Praliaskouski <komzpa@licei2.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2007-05-30 17:58+0300\n"
+"Last-Translator: Darafei Praliaskouski <komzpa@licei2.com>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || n%10>=5 && n%10<=9 || n"
+"%100>=11 && n%100<=14 ? 2 : 3);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Абанентавая скрыня"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Пашыраная інфармацыя аб адрасе"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Вуліца"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Раён"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Рэгіён"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Паштовы індэкс"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Краіна"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr ""
+
+#: address.cpp:353
+#, fuzzy, kde-format
+#| msgid "Domestic"
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Унутраны"
+
+#: address.cpp:355
+#, fuzzy, kde-format
+#| msgid "International"
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Міжнародны"
+
+#: address.cpp:357
+#, fuzzy, kde-format
+#| msgid "Postal"
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Паштовы"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr ""
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Хатні"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr ""
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Асноўны адрас"
+
+#: address.cpp:367
+#, fuzzy, kde-format
+#| msgid "Other"
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Іншы"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, fuzzy, kde-format
+#| msgid "Name"
+msgid "Name"
+msgstr "Назва"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr ""
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr ""
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, fuzzy, kde-format
+#| msgid "Name"
+msgid "Nick Name"
+msgstr "Назва"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr ""
+
+#: addressee.cpp:868
+#, fuzzy, kde-format
+#| msgid "Select Addressee"
+msgid "Home Address Street"
+msgstr "Выберыце адрасата"
+
+#: addressee.cpp:873
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Home Address Post Office Box"
+msgstr "Абанентавая скрыня"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Home Address State"
+msgstr "Адрасы электроннай пошты"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Home Address Label"
+msgstr "Адрасы электроннай пошты"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Business Address Post Office Box"
+msgstr "Абанентавая скрыня"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr ""
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr ""
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Хатні факс"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Пэйджэр"
+
+#: addressee.cpp:978
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Email Address"
+msgstr "Адрасы электроннай пошты"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr ""
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr ""
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr ""
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr ""
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr ""
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr ""
+
+#: addressee.cpp:1231
+#, fuzzy, kde-format
+#| msgid "No"
+msgid "Note"
+msgstr "Не"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, fuzzy, kde-format
+#| msgctxt "Home Address"
+#| msgid "Home"
+msgid "Homepage"
+msgstr "Хатні"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr ""
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr ""
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr ""
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Др."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Сп-ня"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Сп."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Сп."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Сп."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Праф."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "мал."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Сп."
+
+#: field.cpp:206
+#, fuzzy, kde-format
+#| msgid "Unknown type"
+msgid "Unknown Field"
+msgstr "Невядомы тып"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr ""
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr ""
+
+#: field.cpp:223
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Адрасы электроннай пошты"
+
+#: field.cpp:225
+#, fuzzy, kde-format
+#| msgid "Email"
+msgid "Email"
+msgstr "Электронная пошта"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr ""
+
+#: field.cpp:231
+#, fuzzy, kde-format
+#| msgid "Custom"
+msgid "Custom"
+msgstr "Асаблівы"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr ""
+
+#: key.cpp:198
+#, fuzzy, kde-format
+#| msgid "X509"
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, fuzzy, kde-format
+#| msgid "PGP"
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, fuzzy, kde-format
+#| msgid "Custom"
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Асаблівы"
+
+#: key.cpp:207
+#, fuzzy, kde-format
+#| msgid "Unknown type"
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Невядомы тып"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Хатні"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Працоўны"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Для паведамленняў"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr ""
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Голас"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr ""
+
+#: phonenumber.cpp:186
+#, fuzzy, kde-format
+#| msgid "Video"
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Відэа"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Паштовая скрыня"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Мадэм"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr ""
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, fuzzy, kde-format
+#| msgid "Other"
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Іншы"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Асноўны нумар"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Працоўны факс"
+
+#: secrecy.cpp:98
+#, fuzzy, kde-format
+#| msgid "Public"
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Публічны"
+
+#: secrecy.cpp:101
+#, fuzzy, kde-format
+#| msgid "Private"
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Прыватны"
+
+#: secrecy.cpp:104
+#, fuzzy, kde-format
+#| msgid "Confidential"
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Канфідэнцыйны"
+
+#: secrecy.cpp:107
+#, fuzzy, kde-format
+#| msgid "Unknown type"
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Невядомы тып"
+
+#~ msgid "List of Emails"
+#~ msgstr "Спіс электронных скрыняў"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Дарафей Праляскоўскі"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "komzpa@licei2.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Немагчыма адкрыць рэсурс '%1'"
+
+#, fuzzy
+#~| msgid "Select Addressee"
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Выберыце адрасата"
+
+#, fuzzy
+#~| msgid "Name"
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Назва"
+
+#, fuzzy
+#~| msgid "Email"
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Электронная пошта"
+
+#, fuzzy
+#~| msgid "Selected"
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Вылучаны"
+
+#, fuzzy
+#~| msgid "Unselect"
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Зняць выбар"
+
+#, fuzzy
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Настаўленні спісаў распаўсюджвання"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Выберыце адрас электроннай пошты"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Адрасы электроннай пошты"
+
+#, fuzzy
+#~| msgid "Yes"
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Так"
+
+#, fuzzy
+#~| msgid "No"
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Не"
+
+#~ msgid "New List..."
+#~ msgstr "Новы спіс..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Пераназваць спіс..."
+
+#~ msgid "Remove List"
+#~ msgstr "Выдаліць спіс"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Наяўныя адрасы:"
+
+#, fuzzy
+#~| msgid "Preferred Email"
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Асноўная электронная скрыня"
+
+#~ msgid "Add Entry"
+#~ msgstr "Дадаць запіс"
+
+#, fuzzy
+#~| msgid "Email"
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Электронная пошта"
+
+#, fuzzy
+#~| msgid "Use Preferred"
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Выкарыстоўваць асноўны"
+
+#~ msgid "Change Email..."
+#~ msgstr "Змяніць электронную скрыню..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Выдаліць запіс"
+
+#, fuzzy
+#~ msgid "New Distribution List"
+#~ msgstr "Новы спіс распаўсюджвання"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Калі ласка, вызначыце &назву:"
+
+#, fuzzy
+#~ msgid "Distribution List"
+#~ msgstr "Спіс распаўсюджвання"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Калі ласка, змяніце &назву:"
+
+#, fuzzy
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Выдаліць спіс распаўсюджвання '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Выбраныя адрасаты:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Выбраныя адрасы ў '%1':"
+
+#, fuzzy
+#~| msgid "No"
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Не"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Фармат vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Апісанне недаступнае."
+
+#~ msgid "Error"
+#~ msgstr "Памылка"
+
+#, fuzzy
+#~| msgid "Unable to load resource '%1'"
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Немагчыма адкрыць рэсурс '%1'"
+
+#, fuzzy
+#~| msgid "Select Addressee"
+#~ msgid "Default Address Book"
+#~ msgstr "Выберыце адрасата"
diff --git a/po/bg/kcontacts5.po b/po/bg/kcontacts5.po
new file mode 100644 (file)
index 0000000..f8deb6d
--- /dev/null
@@ -0,0 +1,581 @@
+# Mincho Kondarev <mkondarev@yahoo.de>, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2022-05-20 18:57+0200\n"
+"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
+"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 22.04.0\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Пощенска кутия"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Информация за разширен адрес"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Улица"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Местност"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Регион"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Пощенски код"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Държава"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Етикет за доставка"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Вътрешни"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Международен"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Пощенски"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Парцел"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Домашен адрес"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Служебен адрес"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Предпочитан адрес"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Други"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Уникален идентификатор"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Име"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Форматирано име"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Фамилно име"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Собствено име"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Допълнителни имена"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Почетни префикси"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Почетни суфикси"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Псевдоним"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Рожден ден"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Улица с домашен адрес"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Пощенска кутия на домашен адрес"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Град на домашен адрес"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Област на домашния адрес"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Пощенски код за домашен адрес"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Държава на домашен адрес"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Етикет с домашен адрес"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Улица на служебен адрес"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Пощенска кутия за служебен адрес"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Служебен адрес град"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Държавен адрес на служебен адреса"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Пощенски код на служебен адрес"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Държава на служебен адреса"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Етикет за служебен адрес"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Домашен телефон"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Служебен Телефон"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Мобилен телефон"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Домашен факс"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Служебен факс"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Телефон на кола"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Пейджър"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Имейл адрес"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Пощенски клиент"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Часова зона"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Географско положение"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Заглавие"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Позиция"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Организация"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Отдел"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Забележка"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Идентификатор на продукта"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Дата на контрол"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Сортиращ низ"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Начална страница"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Клас на сигурност"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Лого"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Снимка"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Звук"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Д-р"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Госпожица"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Г-н"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Г-жа"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Г-ца"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Проф."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Младши"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Старши"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Поле непознати"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Всички"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Често срещан"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Адрес"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Електронна поща"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Лични"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Персонализиран"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Неопределен"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Персонализиран"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Неизвестен тип"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Телефонен номер"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Домашен"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Работен"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Съобщения"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Предпочитан"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Глас"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Мобилен"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Видео"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Пощенска кутия"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Кола"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Други"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Предпочитан номер"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Служебен факс"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Публичен"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Частен"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Поверителен"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Неизвестен тип"
diff --git a/po/bs/kcontacts5.po b/po/bs/kcontacts5.po
new file mode 100644 (file)
index 0000000..b8638e9
--- /dev/null
@@ -0,0 +1,744 @@
+# Bosnian translation for kdepimlibs
+# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# This file is distributed under the same license as the kdepimlibs package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kdepimlibs\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2013-10-18 20:19+0000\n"
+"Last-Translator: Vedran Ljubovic <vljubovic@smartnet.ba>\n"
+"Language-Team: Bosnian <bs@li.org>\n"
+"Language: bs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Launchpad (build 16807)\n"
+"X-Launchpad-Export-Date: 2013-10-19 05:16+0000\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poštanski pretinac"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Dodatne informacije o adresi"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Ulica"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Lokalitet"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Oblast"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Poštanski broj"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Zemlja:"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Dostavna oznaka"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domaći"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Međunarodno"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poštanski"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paket"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Početak"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Posao"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Preferirana adresa"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Ostale"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Jedinstveni identifikator"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ime"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Uobličeno ime"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Prezime"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Ime"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Dodatna imena"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Počasni prefiksi"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Počasni sufiksi"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Nadimak"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Rođendan"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Kućna adresa - Ulica"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Kućna adresa, poštanski fah"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Kućna adresa - Grad"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Kućna adresa - Kanton"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Kućna adresa - Pošt. br."
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Kućna adresa - Država"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Kućna adresa - Oznaka"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Poslovna adresa - Ulica"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Poslovna adresa, poštanski fah"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Poslovna adresa - Grad"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Poslovna adresa - Kanton"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Poslovna adresa - Pošt. br."
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Poslovna adresa - Država"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Poslovna adresa - Oznaka"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Kućni telefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon na poslu"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobilni telefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Kućni faks"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax na poslu"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefon u automobilu"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pejdžer"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-mail adresa"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Klijent pošte"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Vremenska zona"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografski položaj"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Naslov"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Uloga"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizacija"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Odjeljenje"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Bilješka"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identifikator proizvoda"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Datum revizije"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "String za sortiranje"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Početna stranica"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Sigurnosna klasa"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotip"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotografija"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Zvuk"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Gđica"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Gdin."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Gđa."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "gđica"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Ml."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "St."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Nepoznato polje"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Sve"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Često"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresa"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Lično"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Prilagođeno"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nedefinisano"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Prilagođeno"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Nepoznata vrsta"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Početak"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Posao"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Glasnik"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferirano"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Glas"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobilni"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Sandučić"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Automobil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Ostali"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Preferirani broj"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Faks na poslu"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Javni"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privatni"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Povjerljivi"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Nepoznat tip"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferirano"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista e-mail adresa"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Samir Ribić,Vedran Ljubovic"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "samir.ribic@etf.unsa.ba,vljubovic@smartnet.ba"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Ne mogu čitati sa resursa '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Izaberite adresanta"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Ime"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Odabrano"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Poništi odabir"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Podesite liste distribucije"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Izaberite e-adresu"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-adrese"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "New List..."
+#~ msgstr "Nova lista..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Preimenuj listu..."
+
+#~ msgid "Remove List"
+#~ msgstr "Ukloni listu"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Dostupne adrese:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Preferirani email"
+
+#~ msgid "Add Entry"
+#~ msgstr "Dodaj unos"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Koristi preferirani"
+
+#~ msgid "Change Email..."
+#~ msgstr "Promijeni e-adresu..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Ukloni stavku"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nova distribuciona lista"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Molim unesite &ime:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Lista distribucije"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Molim izmijenite &ime:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Da brišem distribucionu listu '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Izabrani adresanti:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Izabrane adrese u '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Format vCard-a"
+
+#~ msgid "No description available."
+#~ msgstr "Opis nije dostupan."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Ne mogu otvoriti lock datoteku."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Resurs '%1' je zaključan od strane aplikacije '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Greška"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Otključavanje nije uspjelo. Lock datoteku posjeduje drugi proces: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Sve brave su u funkciji ali do zaključavanja ustvari nije došlo."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Sva zaključavanja su neuspješna."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Neuspjelo učitavanje resursa '%1'."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Neuspjelo snimanje resursa '%1'."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Ne mogu da otvorim resurs '%1'."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Podrazumijevani adresar"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Ne mogu snimiti resurs '%1' zato što je zaključan."
diff --git a/po/ca/kcontacts5.po b/po/ca/kcontacts5.po
new file mode 100644 (file)
index 0000000..332458b
--- /dev/null
@@ -0,0 +1,741 @@
+# Translation of kcontacts5.po to Catalan
+# Copyright (C) 2007-2017 This_file_is_part_of_KDE
+# This file is distributed under the license LGPL version 2.1 or
+# version 3 or later versions approved by the membership of KDE e.V.
+#
+# Josep M. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2015, 2017.
+# Albert Astals Cid <aacid@kde.org>, 2009.
+# Manuel Tortosa Moreno <manutortosa@gmail.com>, 2009.
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2014, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2017-12-29 18:45+0100\n"
+"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
+"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Accelerator-Marker: &\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Apartat de correus"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informació ampliada de l'adreça"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Carrer"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localitat"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Província"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Codi postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiqueta de lliurament"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Nacional"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paquets postals"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Llar"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Feina"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Adreça preferida"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Altra"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificador únic"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nom"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nom amb format"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Cognoms"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nom"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Noms addicionals"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixos honorífics"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufixos honorífics"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Sobrenom"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Data de naixement"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Carrer de l'adreça particular"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Apartat de correus de l'adreça particular"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Població de l'adreça particular"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Província de l'adreça particular"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Codi postal de l'adreça particular"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "País de l'adreça particular"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiqueta de l'adreça particular"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Carrer de l'adreça professional"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Apartat de correus de l'adreça professional"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Població de l'adreça professional"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Província de l'adreça professional"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Codi postal de l'adreça professional"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "País de l'adreça professional"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etiqueta de l'adreça professional"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telèfon particular"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telèfon professional"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telèfon mòbil"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax de la llar"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax professional"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telèfon del cotxe"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "XDSI"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Cercapersones"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adreça de correu electrònic"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Client de correu"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zona horària"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posició geogràfica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Títol"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Funció"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organització"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departament"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificador del producte"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data de la revisió"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Text curt"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Pàgina personal"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe de seguretat"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotip"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "So"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Sra."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Sra."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Sra."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Camp desconegut"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Tot"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Freqüent"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adreça"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Correu electrònic"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalitzada"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Sense definir"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalitzada"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipus desconegut"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Número de telèfon"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Llar"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Feina"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferit"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Veu"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mòbil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vídeo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Bústia"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Mòdem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Cotxe"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Altres"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Número preferit"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax de la feina"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Públic"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidencial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipus desconegut"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferida"
+
+#~ msgid "List of Emails"
+#~ msgstr "Llista d'adreces electròniques"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "No s'ha pogut carregar el recurs «%1»"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Selecció del destinatari"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Adreça electrònica"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Selecciona"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Desselecciona"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Configuració de les llistes de distribució"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Selecció de l'adreça de correu electrònic"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Adreces de correu electrònic"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Sí"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "New List..."
+#~ msgstr "Llista nova..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Reanomena una llista..."
+
+#~ msgid "Remove List"
+#~ msgstr "Suprimeix la llista"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Adreces disponibles:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Adreça electrònica preferida"
+
+#~ msgid "Add Entry"
+#~ msgstr "Afegeix una entrada"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Adreça electrònica"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Usa la preferida"
+
+#~ msgid "Change Email..."
+#~ msgstr "Canvia l'adreça de correu..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Suprimeix una entrada"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Llista de distribució nova"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Introduïu el &nom:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Llista de distribució"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Canvieu el &nom:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Suprimeixo la llista de distribució «%1»?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Destinatari seleccionat:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Adreces seleccionades en «%1»:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Format vCard"
+
+#~ msgid "No description available."
+#~ msgstr "No hi ha disponible cap descripció."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "No s'ha pogut obrir el fitxer de bloqueig."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "El recurs «%1» està bloquejat per l'aplicació «%2»."
+
+#~ msgid "Error"
+#~ msgstr "Error"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "El desbloqueig ha fallat. Un altre procés té el fitxer de bloqueig: %1 "
+#~ "(%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: tots els bloqueigs han funcionat, però no s'ha fet cap bloqueig "
+#~ "real."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: tots els bloqueigs han fallat."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "La càrrega del recurs «%1» ha fallat."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "El desament del recurs «%1» ha fallat."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "No s'ha pogut obrir el recurs «%1»."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Llibreta d'adreces per omissió"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "No s'ha pogut desar en el recurs «%1». Està bloquejat."
diff --git a/po/ca@valencia/kcontacts5.po b/po/ca@valencia/kcontacts5.po
new file mode 100644 (file)
index 0000000..251fd3d
--- /dev/null
@@ -0,0 +1,590 @@
+# Translation of kcontacts5.po to Catalan (Valencian)
+# Copyright (C) 2007-2017 This_file_is_part_of_KDE
+# This file is distributed under the license LGPL version 2.1 or
+# version 3 or later versions approved by the membership of KDE e.V.
+#
+# Josep M. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2015, 2017.
+# Albert Astals Cid <aacid@kde.org>, 2009.
+# Manuel Tortosa Moreno <manutortosa@gmail.com>, 2009.
+# Antoni Bella Pérez <antonibella5@yahoo.com>, 2014, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2017-12-29 18:45+0100\n"
+"Last-Translator: Josep M. Ferrer <txemaq@gmail.com>\n"
+"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
+"Language: ca@valencia\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Accelerator-Marker: &\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Apartat de correus"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informació ampliada de l'adreça"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Carrer"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localitat"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Província"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Codi postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiqueta de lliurament"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Nacional"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paquets postals"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Llar"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Faena"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Adreça preferida"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Altra"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificador únic"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nom"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nom amb format"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Cognoms"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nom"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Noms addicionals"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixos honorífics"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufixos honorífics"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Sobrenom"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Data de naixement"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Carrer de l'adreça particular"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Apartat de correus de l'adreça particular"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Població de l'adreça particular"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Província de l'adreça particular"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Codi postal de l'adreça particular"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "País de l'adreça particular"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiqueta de l'adreça particular"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Carrer de l'adreça professional"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Apartat de correus de l'adreça professional"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Població de l'adreça professional"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Província de l'adreça professional"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Codi postal de l'adreça professional"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "País de l'adreça professional"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etiqueta de l'adreça professional"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telèfon particular"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telèfon professional"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telèfon mòbil"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax de la llar"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax professional"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telèfon del cotxe"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "XDSI"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Buscapersones"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adreça de correu electrònic"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Client de correu"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zona horària"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posició geogràfica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Títol"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Funció"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organització"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departament"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificador del producte"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data de la revisió"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Text curt"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Pàgina personal"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe de seguretat"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotip"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "So"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Sra."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Sra."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Sra."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Camp desconegut"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Tot"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Freqüent"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adreça"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Correu electrònic"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalitzada"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Sense definir"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalitzada"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipus desconegut"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Número de telèfon"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Llar"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Faena"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferit"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Veu"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mòbil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vídeo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Bústia"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Mòdem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Cotxe"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Altres"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Número preferit"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax de la faena"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Públic"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidencial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipus desconegut"
diff --git a/po/cs/kcontacts5.po b/po/cs/kcontacts5.po
new file mode 100644 (file)
index 0000000..4debc02
--- /dev/null
@@ -0,0 +1,585 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Lukáš Tinkl <ltinkl@redhat.com>, 2010.
+# Vít Pelčák <vit@pelcak.org>, 2011, 2012, 2014, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2017-02-27 11:18+0100\n"
+"Last-Translator: Vít Pelčák <vit@pelcak.org>\n"
+"Language-Team: Czech <kde-i18n-doc@kde.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Lokalize 2.0\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poštovní schránka"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Rozšířená informace o adrese"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Ulice"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Město"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "PSČ"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Země"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Štítek"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domácí"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Mezinárodní"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poštovní"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Balík"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Domů"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Pracovní"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Preferovaná adresa"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Jiné"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unikátní identifikátor"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Jméno"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formátované jméno"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Jméno rodiny"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Jméno"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Další jména"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Před jménem"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Za jménem"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Přezdívka"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Narozeniny"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Ulice domácí adresy"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Poštovní schránka domů"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Město domácí adresy"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Stát domácí adresy"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "PSČ domácí adresy"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Země domácí adresy"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Popisek domácí adresy"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Ulice obchodní adresy"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Poštovní schránka do práce"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Město obchodní adresy"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Stát obchodní adresy"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "PSČ obchodní adresy"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Země obchodní adresy"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Popisek obchodní adresy"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefon domů"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon do práce"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobilní telefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax domů"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax do práce"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefon do auta"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-mailová adresa"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Poštovní klient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Časové pásmo"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Zeměpisná pozice"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titul"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Role"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizace"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Oddělení"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Poznámka"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identifikátor produktu"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Datum revize"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Třídící řetězec"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Domovská stránka"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Bezpečnostní třída"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotka"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Zvuk"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Slečna"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Pan"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Paní"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Pí."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Neznámé pole"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Vše"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Časté"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresa"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Osobní"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Vlastní"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nedefinovaný"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Vlastní"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Neznámý typ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonní číslo"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Domů"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Pracovní"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Komunikátor"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferovaný"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Hlas"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobilní"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Poštovní schránka"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Auto"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Jiný"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Preferované číslo"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax do práce"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Veřejný"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Soukromý"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Důvěrný"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Neznámý typ"
diff --git a/po/da/kcontacts5.po b/po/da/kcontacts5.po
new file mode 100644 (file)
index 0000000..89f4f8d
--- /dev/null
@@ -0,0 +1,742 @@
+# translation of kabc.po to dansk
+# translation of kabc.po to
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Martin Schlander <mschlander@opensuse.org>, 2008, 2009, 2016.
+# Jan Madsen <jan.madsen.pt@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2016-07-11 21:52+0100\n"
+"Last-Translator: Martin Schlander <mschlander@opensuse.org>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postboks"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Udvidet adresseinformation"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Gade"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Egn"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postnummer"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Leveringsetiket"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Indenrigs"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "International"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Post"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Pakke"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Hjemme"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Arbejde"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Foretrukken adresse"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Andet"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unik identifikator"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Navn"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formateret navn"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Efternavn"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Fornavn"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Yderligere navne"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Ærestitel (før)"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Ærestitel (efter)"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Kaldenavn"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Fødselsdag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Vejnavn, hjemmeadresse"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Hjemmeadresse, postboks"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "By, hjemmeadresse"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Delstat, hjemmeadresse"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Postnummer, hjemmeadresse"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Land, hjemmeadresse"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiket med hjemmeadresse"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Vejnavn, erhvervsadresse"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Erhvervsadresse, postboks"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "By, erhvervsadresse"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Delstat, erhvervsadresse"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Postnummer, erhvervsadresse"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Land, erhvervsadresse"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etiket med erhvervsadresse"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Hjemmetelefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Arbejdstelefon"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiltelefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Hjemmefax"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Arbejdsfax"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Biltelefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Personsøger"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-mailadresse"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Mail-klient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Tidszone"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografisk position"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Funktion"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisation"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Afdeling"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Note"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produkt-identifikator"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Ændringsdato"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorteringsstreng"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Hjemmeside"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Sikkerhedsniveau"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Lyd"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Fr."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Hr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Fr."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Fr."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Ukendt felt"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Alle"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Hyppig"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresse"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personligt"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Brugerdefineret"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Udefineret"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Brugerdefineret"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Ukendt type"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonnummer"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Hjemme"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Arbejde"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Foretrukket"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voice"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postkasse"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Bil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Andet"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Foretrukket nummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Arbejdsfax"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Offentlig"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Fortrolig"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Ukendt type"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Foretrukken"
+
+#~ msgid "List of Emails"
+#~ msgstr "Liste over e-mails"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Martin Schlander"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "mschlander@opensuse.org"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Kan ikke indlæse ressourcen '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Vælg adressat"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Navn"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Valgt"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Fravælg"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Indstil distributionslister"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Vælg e-mailadresse"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-mailadresser"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nej"
+
+#~ msgid "New List..."
+#~ msgstr "Ny liste..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Omdøb liste..."
+
+#~ msgid "Remove List"
+#~ msgstr "Fjern liste"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Tilgængelige adresser:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Foretrukken e-mail"
+
+#~ msgid "Add Entry"
+#~ msgstr "Tilføj indgang"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Brug foretrukken"
+
+#~ msgid "Change Email..."
+#~ msgstr "Ændr e-mail..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Fjern indgang"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Ny distributionsliste"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Indtast venligst &navn:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Distributionsliste"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Ændr venligst &navn:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Slet distributionslisten '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Valgte adresserede:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Valgte adresser i '%1'."
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nej"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard-format"
+
+#~ msgid "No description available."
+#~ msgstr "Ingen beskrivelse tilgængelig."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Kan ikke åbne lock-fil."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Ressourcen '%1' er låst af programmet '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Fejl"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "Lås op fejlede. Lock-fil er ejet af en anden proces: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: Alle låse gennemføres men ingen låsning udføres faktisk."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Alle låse fejler."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Indlæsning af ressourcen '%1' fejlede."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Gemning af ressourcen '%1' fejlede."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Kan ikke åbne ressourcen \"%1\"."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Standardadressebog"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Kan ikke gemme til ressourcen '%1'. Den er låst."
diff --git a/po/de/kcontacts5.po b/po/de/kcontacts5.po
new file mode 100644 (file)
index 0000000..4a11782
--- /dev/null
@@ -0,0 +1,743 @@
+# Stephan Johach <hunsum@gmx.de>, 2007.
+# Burkhard Lück <lueck@hube-lueck.de>, 2008, 2009, 2021.
+# Thomas Reitelbach <tr@erdfunkstelle.de>, 2009.
+# Frederik Schwarzer <schwarzer@kde.org>, 2010, 2013, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2021-05-14 13:24+0200\n"
+"Last-Translator: Burkhard Lück <lueck@hube-lueck.de>\n"
+"Language-Team: German <kde-i18n-de@kde.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postfach"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Erweiterte Adressinformationen"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Straße"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Ort"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postleitzahl"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Adressaufkleber"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Inland"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "International"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postanschrift"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paketanschrift"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Privat"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Dienstlich"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Bevorzugte Adresse"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Sonstige"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Eindeutiger Bezeichner"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Name"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatierter Name"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Nachname"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Vorname"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Zusätzliche Namen"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Titel-Abk. (vor Name)"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Titel-Abk. (nach Name)"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Spitzname"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Geburtstag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Straße (privat)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Postfach (privat)"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Stadt (privat)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Staat/Bundesland (privat)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Postleitzahl (privat)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Land (privat)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Aufkleber (Privatadresse)"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Straße (geschäftlich)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Postfach (geschäftlich)"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Stadt (geschäftlich)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Staat/Bundesland (geschäftlich)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Postleitzahl (geschäftlich)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Land (geschäftlich)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Aufkleber (Geschäftsadresse)"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefon (privat)"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon (geschäftlich)"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiltelefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax (privat)"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax (geschäftlich)"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Autotelefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-Mail-Adresse"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Mail-Programm"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zeitzone"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Ort"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rolle"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisation"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Abteilung"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Notiz"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produktkennung"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Korrekturdatum"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sortierungsschlüssel"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Internetseite"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Sicherheitsklasse"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Klang"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Fräulein"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Herr"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Frau"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Frau"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jun."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sen."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Unbekanntes Feld"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Alle"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Häufig"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresse"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-Mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Persönlich"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Benutzerdefiniert"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nicht definiert"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Benutzerdefiniert"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Unbekannter Typ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonnummer"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Privat"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Dienstlich"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Bevorzugte"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voice"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Mailbox"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Autotelefon"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Sonstige"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Bevorzugte Telefonnummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax dienstlich"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Öffentlich"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Vertraulich"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Unbekannter Typ"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Bevorzugte"
+
+#~ msgid "List of Emails"
+#~ msgstr "E-Mail-Liste"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Stephan Johach"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "hunsum@gmx.de"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Die Ressource „%1“ kann nicht geladen werden"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Empfänger auswählen"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-Mail-Adresse"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Ausgewählt"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Auswahl aufheben"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Verteilerlisten einrichten"
+
+#~ msgid "Select Email Address"
+#~ msgstr "E-Mail-Adresse auswählen"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-Mail-Adressen"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nein"
+
+#~ msgid "New List..."
+#~ msgstr "Neue Liste ..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Liste umbenennen ..."
+
+#~ msgid "Remove List"
+#~ msgstr "Liste löschen"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Verfügbare Adressen:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Bevorzugte E-Mail-Adresse"
+
+#~ msgid "Add Entry"
+#~ msgstr "Eintrag hinzufügen"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-Mail-Adresse"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Bevorzugte verwenden"
+
+#~ msgid "Change Email..."
+#~ msgstr "E-Mail bearbeiten ..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Eintrag löschen"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Neue Verteilerliste"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "&Name:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Verteilerliste"
+
+#~ msgid "Please change &name:"
+#~ msgstr "&Namen ändern:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Möchten Sie die Verteilerliste „%1“ löschen?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Ausgewählte Empfänger:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Ausgewählte Empfänger in „%1“:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nein"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard-Format"
+
+#~ msgid "No description available."
+#~ msgstr "Keine Beschreibung verfügbar."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Die Sperrdatei kann nicht geöffnet werden."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Die Ressource „%1“ ist von der Anwendung „%2“ gesperrt."
+
+#~ msgid "Error"
+#~ msgstr "Fehler"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Das Entsperren ist fehlgeschlagen. Die Sperrdatei gehört zu einem anderen "
+#~ "Prozess: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Alle Sperren waren erfolgreich, es wurde aber keine echte "
+#~ "Sperrung durchgeführt."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Alle Sperren sind fehlgeschlagen."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Das Laden der Ressource „%1“ ist fehlgeschlagen."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Das Speichern der Ressource „%1“ ist fehlgeschlagen."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Die Ressource „%1“ kann nicht geöffnet werden"
+
+#~ msgid "Default Address Book"
+#~ msgstr "Standard-Adressbuch"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr ""
+#~ "Die Ressource „%1“ kann nicht gespeichert werden, da sie gesperrt ist."
diff --git a/po/el/kcontacts5.po b/po/el/kcontacts5.po
new file mode 100644 (file)
index 0000000..23f4e96
--- /dev/null
@@ -0,0 +1,747 @@
+# translation of kabc.po to greek
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Spiros Georgaras <sng@hellug.gr>, 2007.
+# Toussis Manolis <manolis@koppermind.homelinux.org>, 2008, 2009.
+# Dimitrios Glentadakis <dglent@gmail.com>, 2010, 2013.
+# Stelios <sstavra@gmail.com>, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2020-09-07 14:02+0300\n"
+"Last-Translator: Stelios <sstavra@gmail.com>\n"
+"Language-Team: Greek <kde-i18n-el@kde.org>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 20.04.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Ταχυδρομική θυρίδα"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Εκτεταμένες πληροφορίες διεύθυνσης"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Οδός"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Δήμος/Πόλη"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Νομός/Περιφέρεια"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Ταχυδρομικός κώδικας"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Χώρα"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Ετικέτα παράδοσης"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Εγχώρια"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Διεθνής"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Ταχυδρομική"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Δεμάτων"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Οικία"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Εργασία"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Προτιμώμενη διεύθυνση"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Άλλη"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Μοναδικό αναγνωριστικό"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Όνομα"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Μορφοποιημένο όνομα"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Όνομα οικογενείας"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Δοσμένο όνομα"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Πρόσθετα ονόματα"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Τιμητικά προθέματα"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Τιμητικά επιθέματα"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Ψευδώνυμο"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Γενέθλια"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Οδός διεύθυνσης οικίας"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Ταχυδρομική θυρίδα διεύθυνσης οικίας"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Πόλη διεύθυνσης οικίας"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Νομός/Περιφέρεια διεύθυνσης οικίας"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Ταχ. κώδ. διεύθυνσης οικίας"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Χώρα διεύθυνσης οικίας"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Ετικέτα διεύθυνσης οικίας"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Οδός διεύθυνσης επιχείρησης"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Ταχυδρομική θυρίδα διεύθυνσης επιχείρισης"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Πόλη διεύθυνσης επιχείρησης"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Νομός/Περιφέρεια διεύθυνσης επιχείρησης"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Ταχ. κώδ. διεύθυνσης επιχείρησης"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Χώρα διεύθυνσης επιχείρησης"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Ετικέτα διεύθυνσης επιχείρησης"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Τηλέφωνο οικίας"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Τηλέφωνο επιχείρησης"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Κινητό τηλέφωνο"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Φαξ οικίας"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Φαξ επιχείρησης"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Τηλέφωνο αυτοκινήτου"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Βομβητής"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Διεύθυνση ηλ. αλληλογραφίας"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Πελάτης ταχυδρομείου"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Ωρολογιακή ζώνη"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Γεωγραφική θέση"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Τίτλος"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Ρόλος"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Οργανισμός"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Τμήμα"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Σημείωση"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Αναγνωριστικό προϊόντος"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Ημερομηνία αναθεώρησης"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Συμβολοσειρά ταξινόμησης"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Προσωπική σελίδα"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Κλάση ασφαλείας"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Λογότυπο"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Φωτογραφία"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Ήχος"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Δρ."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Δις"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "κ."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "κα."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "κα."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Καθ."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Σερ"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Άγνωστο πεδίο"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Όλα"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Συχνά"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Διεύθυνση"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Ηλ. αλληλογραφία"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Προσωπικά"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Προσαρμοσμένο"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Μη ορισμένο"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Προσαρμοσμένο"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Άγνωστος τύπος"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Αριθμός τηλεφώνου"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Οικία"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Εργασία"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Αποστολέας μηνυμάτων"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Προτεινόμενο"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Φωνή"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Φαξ"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Κινητό"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Βίντεο"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Γραμματοκιβώτιο"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Μόντεμ"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Τηλέφωνο αυτοκινήτου"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Άλλο"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Προτιμώμενος αριθμός"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Φαξ εργασίας"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Δημόσιο"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Ιδιωτικό"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Εμπιστευτικό"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Άγνωστος τύπος"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Προτεινόμενο"
+
+#~ msgid "List of Emails"
+#~ msgstr "Λίστα διευθύνσεων ηλ. αλληλογραφίας"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Σπύρος Γεωργαράς, Τούσης Μανώλης"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "sng@hellug.gr, manolis@koppermind.homelinux.org"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Δεν είναι δυνατή η φόρτωση του πόρου '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Επιλέξτε παραλήπτη"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Όνομα"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Επιλεγμένο"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Αποεπιλογή"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Ρύθμιση λιστών διανομής"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Επιλέξτε διεύθυνση ηλ. αλληλογραφίας"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Διευθύνσεις ηλ. αλληλογραφίας"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Ναι"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Όχι"
+
+#~ msgid "New List..."
+#~ msgstr "Νέα λίστα..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Μετονομασία λίστας..."
+
+#~ msgid "Remove List"
+#~ msgstr "Αφαίρεση λίστας"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Διαθέσιμες διευθύνσεις:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Προτιμώμενη ηλ. αλληλογραφία"
+
+#~ msgid "Add Entry"
+#~ msgstr "Προσθήκη καταχώρησης"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Ηλ. αλληλογραφία"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Χρήση προτιμώμενου"
+
+#~ msgid "Change Email..."
+#~ msgstr "Αλλαγή ηλ. αλληλογραφίας..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Αφαίρεση καταχώρησης"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Νέα λίστα διανομής"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Παρακαλώ δώστε ό&νομα:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Λίστα διανομής"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Παρακαλώ αλλάξτε ό&νομα:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Διαγραφή της λίστας διανομής '%1';"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Επιλεγμένοι παραλήπτες:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Επιλεγμένοι παραλήπτες στο '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Όχι"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Μορφή vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Περιγραφή μη διαθέσιμη."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Δεν είναι δυνατό το άνοιγμα του αρχείου κλειδώματος."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Ο πόρος '%1' είναι κλειδωμένος από την εφαρμογή '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Σφάλμα"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Το ξεκλείδωμα απέτυχε. Το αρχείο κλειδώματος ανήκει σε άλλη διεργασία: %1 "
+#~ "(%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Όλα τα κλειδώματα πετυχαίνουν αλλά δε γίνεται πραγματικό "
+#~ "κλείδωμα."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Όλα τα κλειδώματα αποτυγχάνουν."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Η φόρτωση του πόρου '%1' απέτυχε."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Η αποθήκευση ßτου πόρου '%1' απέτυχε."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Αδύνατο το άνοιγμα του πόρου «%1»."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Προκαθορισμένο βιβλίο διευθύνσεων"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Δεν είναι δυνατή η αποθήκευση στον πόρο '%1'. Είναι κλειδωμένος."
diff --git a/po/en_GB/kcontacts5.po b/po/en_GB/kcontacts5.po
new file mode 100644 (file)
index 0000000..53b658e
--- /dev/null
@@ -0,0 +1,591 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Steve Allewell <steve.allewell@gmail.com>, 2014, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2016-01-10 13:55+0000\n"
+"Last-Translator: Steve Allewell <steve.allewell@gmail.com>\n"
+"Language-Team: British English <kde-l10n-en_gb@kde.org>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Post Office Box"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Extended Address Information"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Street"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Locality"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postal Code"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Country"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Delivery Label"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domestic"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "International"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Parcel"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Home"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Work"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Preferred Address"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Other"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unique Identifier"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Name"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatted Name"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Family Name"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Given Name"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Additional Names"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Honorific Prefixes"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Honorific Suffixes"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Nick Name"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Birthday"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Home Address Street"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Home Address Post Office Box"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Home Address City"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Home Address County"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Home Address Post Code"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Home Address Country"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Home Address Label"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Business Address Street"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Business Address Post Office Box"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Business Address City"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Business Address County"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Business Address Post Code"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Business Address Country"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Business Address Label"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Home Phone"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Business Phone"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobile Phone"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Home Fax"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Business Fax"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Car Phone"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Email Address"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Mail Client"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Time Zone"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geographic Position"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Title"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Role"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisation"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Department"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Note"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Product Identifier"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Revision Date"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sort String"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Homepage"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Security Class"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Photo"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Sound"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Mr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mrs."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Unknown Field"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "All"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frequent"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Address"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Email"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Custom"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Undefined"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Custom"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Unknown type"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telephone number"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Home"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Work"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferred"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voice"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobile"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Mailbox"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Car"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Other"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Preferred Number"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Work Fax"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Public"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Private"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidential"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Unknown type"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferred"
+
+#~ msgid "List of Emails"
+#~ msgstr "List of Emails"
diff --git a/po/eo/kcontacts5.po b/po/eo/kcontacts5.po
new file mode 100644 (file)
index 0000000..2cee2d0
--- /dev/null
@@ -0,0 +1,587 @@
+# Translation of kcontacts5.pot to esperanto.
+# Copyright (C) 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the "kcontacts" package.
+# Axel Rousseau <axel@esperanto-jeunes.org>, 2009.
+# Oliver Kellogg <okellogg@users.sourceforge.net>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2023-01-07 01:00+0100\n"
+"Last-Translator: Oliver Kellogg <okellogg@users.sourceforge.net>\n"
+"Language-Team: esperanto <kde-i18n-eo@kde.org>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: pology\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poŝtofica Kesto"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Etenditaj Adres-Informoj"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Strato"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Loko"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regiono"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Poŝtkodo"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Lando"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Liveretikedo"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Enlanda"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacia"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poŝta"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Pakaĵo"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Hejmo"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Laboro"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Preferata adreso"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Alia"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unika Identigilo"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nomo"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatita Nomo"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Familinomo"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Donita Nomo"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Pluaj Nomoj"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Honorindaj Prefiksoj"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Honorindaj Sufiksoj"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Kromnomo"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Naskiĝdato"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Hejmadresa Strato"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Hejmadresa Poŝtkesto"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Hejmadresa Urbo"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Hejmadresa Ŝtato"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Hejmadresa Poŝtkodo"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Hejmadresa Lando"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Hejmadresa Etikedo"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr ""
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr ""
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr ""
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr ""
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Mesaĝricevilo"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Retpoŝta adreso"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr ""
+
+#: addressee.cpp:1018
+#, fuzzy, kde-format
+#| msgid "Timezone Error"
+msgid "Time Zone"
+msgstr "Tempzona eraro"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr ""
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr ""
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizaĵo"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Distrikto"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Noto"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "TTT-hejmpaĝo"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Sekureca Kategorio"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr ""
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Sono"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "D-ro"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Sinjorino"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "S-ro"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "S-ino"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "F-ino"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "P-ro"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jn"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Mjn"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr ""
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Ĉiuj"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Ofta"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adreso"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Retpoŝto"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personaj"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Propra"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nedifinita"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Propra"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Nekonata tipo"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonnumero"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Hejm"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Labpra"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr ""
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferata"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voĉa"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobila"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Poŝtkesto"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Aŭtomobila"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Alia"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Preferata Numero"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Laboreja Fakso"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publika"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privata"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidenca"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Nekonata tipo"
diff --git a/po/es/kcontacts5.po b/po/es/kcontacts5.po
new file mode 100644 (file)
index 0000000..60f3944
--- /dev/null
@@ -0,0 +1,591 @@
+# translation of kabc.po to Spanish
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Santiago Fernández Sancho <santi@kde-es.org>, 2007, 2008.
+# Dario Andres Rodriguez <andresbajotierra@gmail.com>, 2008, 2009.
+# Jaime Robles <jaime@kde.org>, 2009.
+# Adrián Martínez <sfxgt3@gmail.com>, 2010.
+# Javier Vinal <fjvinal@gmail.com>, 2011, 2012, 2013, 2015.
+# Cristina Yenyxe González García <the.blue.valkyrie@gmail.com>, 2011.
+# Eloy Cuadra <ecuadra@eloihr.net>, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2020-04-21 02:05+0200\n"
+"Last-Translator: Eloy Cuadra <ecuadra@eloihr.net>\n"
+"Language-Team: Spanish <kde-l10n-es@kde.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 20.03.90\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Dirección postal"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Información extendida de la dirección"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Calle"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localidad"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Región"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Código postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiqueta de entrega"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Nacional"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paquetería"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Particular"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Trabajo"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Direcciones preferidas"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Otra"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificador único"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nombre"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nombre formateado"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Apellidos"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nombre"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nombres adicionales"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefijos honoríficos"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufijos honoríficos"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Apodo"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Cumpleaños"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Calle de la dirección particular"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Apartado de correos de la dirección particular"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Ciudad de la dirección particular"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Estado de la dirección particular"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Código postal de la dirección particular"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "País de la dirección particular"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiqueta de la dirección particular"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Calle de la dirección de trabajo"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Apartado de correos de la dirección de trabajo"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Ciudad de la dirección de trabajo"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Estado de la dirección de trabajo"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Código postal de la dirección de trabajo"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "País de la dirección de trabajo"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etiqueta de la dirección de trabajo"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Teléfono particular"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Teléfono del trabajo"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Teléfono móvil"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax particular"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax del trabajo"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Teléfono del automóvil"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "RDSI"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Busca"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Dirección de correo electrónico"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Cliente de correo"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zona horaria"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posición geográfica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Título"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Papel"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organización"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departamento"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificador de producto"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Fecha de revisión"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Ordenar cadena"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Página web"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Clase de seguridad"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotografía"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Sonido"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Srta."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Sra."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Srta."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Campo desconocido"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Todos"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frecuente"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Dirección"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Correo electrónico"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalizado"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Sin definir"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalizada"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipo desconocido"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Número de teléfono"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Particular"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Trabajo"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mensajería"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferido"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voz"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Móvil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vídeo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Buzón"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Módem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Automóvil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Otro"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Número preferido"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax del trabajo"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Público"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privado"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidencial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipo desconocido"
diff --git a/po/et/kcontacts5.po b/po/et/kcontacts5.po
new file mode 100644 (file)
index 0000000..a611b15
--- /dev/null
@@ -0,0 +1,740 @@
+# translation of kabc.po to
+#
+# Marek Laane <bald@starman.ee>, 2006-2007.
+# Marek Laane <bald@smail.ee>, 2007-2009, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2016-01-14 17:41+0200\n"
+"Last-Translator: Marek Laane <qiilaq69@gmail.com>\n"
+"Language-Team: Estonian <kde-et@linux.ee>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postkast"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Laiendatud aadressiteave"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Tänav"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Asula"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Piirkond"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postiindeks"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Riik"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Posti etikett"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Kodumaine"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Rahvusvaheline"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postiindeks"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Postipakk"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Kodu"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Töö"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Eelistatud aadress"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Muu"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unikaalne identifikaator"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nimi"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Vormindatud nimi"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Perekonnanimi"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Eesnimi"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Lisanimed"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Austavad eesliited"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Austavad järelliited"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Hüüdnimi"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Sünnipäev"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Koduse aadressi tänav"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Koduse aadressi postkast"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Koduse aadressi linn"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Koduse aadressi maakond/provints"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Koduse aadressi postiindeks"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Koduse aadressi riik"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Koduse aadressi etikett"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Tööaadressi tänav"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Tööaadressi postkast"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Tööaadressi linn"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Tööaadressi maakond/provints"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Tööaadressi postiindeks"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Tööaadressi riik"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Tööaadressi etikett"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Kodune telefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Töötelefon"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiiltelefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Kodune faks"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Tööfaks"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Autotelefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Peiler"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-posti aadress"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-posti klient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Ajavöönd"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geograafiline asukoht"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Tiitel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Amet"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisatsioon"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Osakond"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Märkus"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Toote identifikaator"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Versiooni kuupäev"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorteerimisalus"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Kodulehekülg"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Turbeklass"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Heli"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Preili"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Hr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Pr."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Pr."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Tundmatu väli"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Kõik"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Sagedased"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Aadress"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-post"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Isiklik"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Kohandatud"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Määramata"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Kohandatud"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tundmatu tüüp"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefoninumber"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Kodu"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Töö"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Automaatvastaja"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Eelistatud"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Hääl"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobiil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postkast"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Auto"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Muu"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Eelistatud number"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Töö faks"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Avalik"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privaatne"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidentsiaalne"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tundmatu tüüp"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Eelistatud"
+
+#~ msgid "List of Emails"
+#~ msgstr "E-kirjade nimekiri"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Marek Laane"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "bald@smail.ee"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Ressursi '%1' laadimine nurjus"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Adressaadi valik"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nimi"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-post"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Valitud"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Tühista valik"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Postiloendite seadistamine"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Vali e-posti aadress"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-posti aadressid"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Jah"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Ei"
+
+#~ msgid "New List..."
+#~ msgstr "Uus loend..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Nimeta loend ümber..."
+
+#~ msgid "Remove List"
+#~ msgstr "Eemalda loend"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Saadaolevad aadressid:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Eelistatud e-posti aadress"
+
+#~ msgid "Add Entry"
+#~ msgstr "Lisa kirje"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-post"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Eelistatud kirje"
+
+#~ msgid "Change Email..."
+#~ msgstr "Muuda e-posti aadressi..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Eemalda kirje"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Uus postiloend"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Palun sisesta &nimi:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Postiloend"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Palun muuda &nime:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Kas kustutada postiloend '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Valitud adressaadid:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Valitud adressaadid nimekirjas '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Ei"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCardi vorming"
+
+#~ msgid "No description available."
+#~ msgstr "Kirjeldus puudub."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Lukufaili pole võimalik avada."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Ressursi '%1' on lukustanud rakendus '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Viga"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "Luku avamine nurjus. Lukufail kuulub muule protsessile: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: kõik lukustused õnnestusid, aga tegelikult midagi ei lukustatud."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: kõik lukustused nurjusid."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Ressursi '%1' laadimine nurjus."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Ressursi '%1' salvestamine nurjus."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Ressursi '%1' avamine nurjus."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Vaikimisi aadressiraamat"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Ressursi '%1' salvestamine nurjus, sest ressurss on lukus."
diff --git a/po/eu/kcontacts5.po b/po/eu/kcontacts5.po
new file mode 100644 (file)
index 0000000..2f0f137
--- /dev/null
@@ -0,0 +1,589 @@
+# Translation of kcontacts5.po to Euskara/Basque (eu).
+# Copyright (C) 2019, This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+# KDE euskaratzeko proiektuaren arduraduna <xalba@euskalnet.net>.
+#
+# Translators:
+# Iñigo Salvador Azurmendi <xalba@euskalnet.net>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-10-20 22:14+0200\n"
+"Last-Translator: Iñigo Salvador Azurmendi <xalba@euskalnet.net>\n"
+"Language-Team: Basque <kde-i18n-eu@kde.org>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 19.08.2\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Posta-kutxa"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Helbidearen informazio hedatua"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Kalea"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Herria"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Eskualdea"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Posta-kodea"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Herrialdea"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Banatze etiketa"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Nazionala"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Nazioartekoa"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postala"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paketeak"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Etxekoa"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Lanekoa"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Hobetsitako helbidea"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Bestelakoak"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identifikatzaile bakuna"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Izena"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatudun izena"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Abizenak"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Izena"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Gainerako izenak"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Ohorezko aurrizkiak"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Ohorezko atzizkiak"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Goitizena"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Urtemuga"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Etxeko helbideko kalea"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Etxeko helbideko posta-kutxa"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Etxeko helbideko hiria"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Etxeko helbideko probintzia"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Etxeko helbideko posta-kodea"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Etxeko helbideko herrialdea"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etxeko helbideko etiketa"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Laneko helbideko kalea"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Laneko helbideko posta-kutxa"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Laneko helbideko hiria"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Laneko helbideko probintzia"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Laneko helbideko posta-kodea"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Laneko helbideko herrialdea"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Laneko helbideko etiketa"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Etxeko telefonoa"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Laneko telefonoa"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telefono mugikorra"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Etxeko faxa"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Laneko faxa"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Beribileko telefonoa"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "RDSI (ISDN)"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Bilagailua"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Eposta helbidea"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Posta bezeroa"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Ordu eremua"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Kokapen geografikoa"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titulua"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rola"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Erakundea"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Saila"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Oharra"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produktuaren identifikatzailea"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Berrikuspen data"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sailkatzeko katea"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Orri nagusia"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Segurtasun klasea"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logoa"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Argazkia"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Soinua"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "dk."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Andereño"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "jn."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "and."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "adño."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "irak."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "jr."
+
+# xalba 2019-10-20 ig. Bere horretan utzi dut euskaraz nola ipini ez dudalako aurkitu.
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Eremu ezezaguna"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Guztia"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Maiztasuna"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Helbidea"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-posta"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Pertsonala"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Norberak finkatua"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Definitu gabea"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Norberak finkatua"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Mota ezezagunekoa"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefono zenbakia"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Etxekoa"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Lanekoa"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mezularia"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Hobetsia"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Ahotsa"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faxa"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mugikorra"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Bideoa"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postontzia"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modema"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Beribila"
+
+# Personal Communications Service
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Bestelakoak"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Hobetsitako zenbakia"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Laneko faxa"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publikoa"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Pribatua"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Isilpekoa"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Mota ezezaguna"
diff --git a/po/fi/kcontacts5.po b/po/fi/kcontacts5.po
new file mode 100644 (file)
index 0000000..5bd7953
--- /dev/null
@@ -0,0 +1,596 @@
+# Translation of kabc.po to Finnish
+# Copyright © 2007, 2009, 2012 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kdepimlibs package.
+# Mikko Piippo <piippo@cc.helsinki.fi>, 2007.
+# Tommi Nieminen <translator@legisign.org>, 2009, 2012.
+# Lasse Liehu <lasse.liehu@gmail.com>, 2013, 2015.
+#
+# KDE Finnish translation sprint participants:
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2015-12-27 18:23+0200\n"
+"Last-Translator: Lasse Liehu <lasse.liehu@gmail.com>\n"
+"Language-Team: Finnish <kde-i18n-doc@kde.org>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-POT-Import-Date: 2012-12-01 22:25:17+0000\n"
+"X-Generator: Lokalize 2.0\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "PL"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Tarkemmat osoitetiedot"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Katuosoite"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Paikkakunta"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Alue"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postinumero"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Maa"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Toimitusosoite"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Kotimaan osoite"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Kansainvälinen osoite"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postiosoite"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Pakettiosoite"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Koti"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Työ"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Ensisijainen osoite"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Muu "
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Ainutkertainen tunniste"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nimi"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Muotoiltu nimi"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Sukunimi"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Etunimi"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Lisänimet"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Kunnioittavat etuliitteet"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Kunnioittavat jälkiliitteet"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Kutsumanimi"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Syntymäpäivä"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Kotiosoitteen katuosoite"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Kotiosoitteen postilokero"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Kotiosoitteen kaupunki"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Kotiosoitteen osavaltio"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Kotiosoitteen postinumero"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Kotiosoitteen maa"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Kotiosoite"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Työosoitteen katuosoite"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Työosoitteen postilokero"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Työosoitteen kaupunki"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Työosoitteen osavaltio"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Työosoitteen postinumero"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Työosoitteen maa"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Työosoite"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Kotipuhelin"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Työpuhelin"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Matkapuhelin"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Kotifaksi"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Työfaksi"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Autopuhelin"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Hakulaite"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Sähköpostiosoite"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Postiohjelma"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Aikavyöhyke"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Maantieteellinen sijainti"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Ammatti"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Työnkuva"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisaatio"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Osasto"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Huomautukset"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Tuotteen tunniste"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Tarkistuspäivä"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Lajittelujono"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Kotisivu"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Turvallisuusluokitus"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Valokuva"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Äänitiedosto"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Tri"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Neiti"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Herra"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Rouva"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Rouva"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "nuor."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "vanh."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Tuntematon kenttä"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Kaikki"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Säännöllinen"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Osoite"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Sähköposti"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Henkilökohtainen"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Oma"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Määrittämätön"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Oma"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tuntematon tyyppi"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Puhelinnumero"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Koti"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Työ"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Pikaviestin"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Ensisijainen"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Ääni"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faksi"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Matkapuhelin"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postilaatikko"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modeemi"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Auto"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Muu "
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Ensisijainen numero"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Työfaksi"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Julkinen"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Yksityinen"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Luottamuksellinen"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tuntematon tyyppi"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Ensisijainen"
+
+#~ msgid "List of Emails"
+#~ msgstr "Luettelo sähköposteista"
diff --git a/po/fr/kcontacts5.po b/po/fr/kcontacts5.po
new file mode 100644 (file)
index 0000000..4a9c09b
--- /dev/null
@@ -0,0 +1,768 @@
+# translation of kabc.po to Francais
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Francois Grange <rumbaya@gmail.com>, 2007, 2008.
+# Guillaume Pujol <guill.p@gmail.com>, 2008.
+# Sébastien Renard <Sebastien.Renard@digitalfox.org>, 2008.
+# Mickael Sibelle <kimael@gmail.com>, 2008.
+# Sebastien Renard <Sebastien.Renard@digitalfox.org>, 2010, 2013.
+# xavier <xavier.besnard@neuf.fr>, 2013.
+# Vincent Pinon <vpinon@kde.org>, 2017.
+#
+# Xavier BESNARD <xavier.besnard]neuf.fr>, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2023-01-06 19:23+0100\n"
+"Last-Translator: Xavier BESNARD <xavier.besnard]neuf.fr>\n"
+"Language-Team: fr\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Lokalize 22.12.0\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Boîte postale"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informations de complément d'adresse"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Rue"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Ville"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Région"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Code postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Pays"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Étiquette de livraison"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "National"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "International"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paquet"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Domicile"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Travail"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Adresse préférée"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Autre"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identifiant unique"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nom"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nom formaté"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Nom de famille"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Prénom"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Noms additionnels"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Préfixes honorifiques"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Suffixes honorifiques"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Pseudonyme"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Date d'anniversaire"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Rue du domicile"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Code postal du domicile"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Ville du domicile"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "État du domicile"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Code postal du domicile"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Pays du domicile"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Libellé de l'adresse du domicile"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Rue du lieu de travail"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Code postal du lieu de travail"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Ville du lieu de travail"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "État du lieu de travail"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Code postal du lieu de travail"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Pays du lieu de travail"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Libellé du lieu de travail"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Téléphone du domicile"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Téléphone professionnel"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Téléphone mobile"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax personnel"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax professionnel"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Téléphone de voiture"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "RNIS"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adresse de courrier électronique"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Client de courrier électronique"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fuseau horaire"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Position géographique"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titre"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rôle"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisation"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Département"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Note"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identifiant du produit"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Date de révision"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Chaîne de tri"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Page d'accueil"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe de sécurité"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Photo"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Son"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Mlle"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "M."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mme"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Mme"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Pr."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I "
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III "
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Champ inconnu"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Tous"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Fréquent"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresse"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Adresse de courrier électronique"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personnel"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personnalisé"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Indéfini"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personnalisé"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Type inconnu"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Numéro de téléphone"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Domicile"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Professionnel"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messagerie"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Préféré"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Boîte vocale"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Portable"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vidéo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Boîte aux lettres"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Voiture"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Autre"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Numéro préféré"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax professionnel"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Public"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privé"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Type inconnu"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Adresse préférée"
+
+#~ msgid "List of Emails"
+#~ msgstr "Liste des adresses de courrier électronique"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Nicolas Ternisien"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "nicolas.ternisien@gmail.com"
+
+# unreviewed-context
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Impossible de charger la ressource « %1 »"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Sélectionner le destinataire"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Adresse de courrier électronique"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Sélectionné"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Dé-sélectionné"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Configurer les listes de distribution"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Sélectionner l'adresse de courrier électronique"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Adresse de courrier électronique"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Oui"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Non"
+
+#~ msgid "New List..."
+#~ msgstr "Nouvelle liste..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Renommer une liste..."
+
+#~ msgid "Remove List"
+#~ msgstr "Supprimer une liste"
+
+# unreviewed-context
+#~ msgid "Available addresses:"
+#~ msgstr "Adresses disponibles :"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Adresse préférée de courrier électronique"
+
+#~ msgid "Add Entry"
+#~ msgstr "Ajouter une entrée"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Adresse de courrier électronique"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Utiliser l'adresse préférée de courrier électronique "
+
+#~ msgid "Change Email..."
+#~ msgstr "Modifier les adresses de courrier électronique..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Supprimer une entrée"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nouvelle liste de distribution"
+
+# unreviewed-context
+#~ msgid "Please enter &name:"
+#~ msgstr "Veuillez saisir un &nom : "
+
+#~ msgid "Distribution List"
+#~ msgstr "Liste de distribution"
+
+# unreviewed-context
+#~ msgid "Please change &name:"
+#~ msgstr "Veuillez modifier le &nom : "
+
+# unreviewed-context
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Supprimer la liste de distribution « %1 » ?"
+
+# unreviewed-context
+#~ msgid "Selected addressees:"
+#~ msgstr "Destinataires sélectionnés :"
+
+# unreviewed-context
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Destinataires sélectionnés dans « %1 » :"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Non"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Format « vCard »"
+
+#~ msgid "No description available."
+#~ msgstr "Aucune description disponible."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Impossible d'ouvrir un fichier verrouillé."
+
+# unreviewed-context
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "La ressource « %1 » est verrouillée par l'application « %2 »."
+
+#~ msgid "Error"
+#~ msgstr "Erreur"
+
+# unreviewed-context
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Échec du déverrouillage. Le fichier verrouillé appartient à un autre "
+#~ "processus : %1 (%2)"
+
+# unreviewed-context
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull : tous les verrouillages ont réussi mais rien n'est verrouillé."
+
+# unreviewed-context
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull : tous les verrouillages ont échoué."
+
+# unreviewed-context
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Échec du chargement de la ressource « %1 »."
+
+# unreviewed-context
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Échec de l'enregistrement de la ressource « %1 »."
+
+# unreviewed-context
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Impossible de charger la ressource « %1 »"
+
+#~ msgid "Default Address Book"
+#~ msgstr "Carnet d'adresses par défaut"
+
+# unreviewed-context
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Impossible d'enregistrer la ressource « %1 ». Elle est verrouillée."
diff --git a/po/ga/kcontacts5.po b/po/ga/kcontacts5.po
new file mode 100644 (file)
index 0000000..87af786
--- /dev/null
@@ -0,0 +1,742 @@
+# Irish translation of kabc
+# Copyright (C) 2009 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kabc package.
+# Kevin Scannell <kscanne@gmail.com>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdepimlibs/kabc.po\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2007-06-27 10:27-0500\n"
+"Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"Language: ga\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n < 11 ? "
+"3 : 4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Bosca Oifig an Phoist"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Eolas Seolta Breisithe"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Sráid"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Ceantar"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Réigiún"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Cód Poist"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Tír"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Lipéad Seachadta"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Intíre"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Idirnáisiúnta"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Post"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Beart"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Baile"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Obair"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Seoladh de Rogha"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Eile"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Aitheantóir Sainiúil"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ainm"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Ainm Formáidithe"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Sloinne"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Ainm"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Ainmneacha Eile"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Réimíreanna Ómóis"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Iarmhíreanna Ómóis"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Leasainm"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Lá Breithe"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Seoladh Baile - Sráid"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Bosca Oifig an Phoist - Baile"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Seoladh Baile - Cathair"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Seoladh Baile - Stát"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Seoladh Baile - Cód Poist"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Seoladh Baile - Tír"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Seoladh Baile - Lipéad"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Seoladh Gnó - Sráid"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Bosca Oifig an Phoist - Gnó"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Seoladh Gnó - Cathair"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Seoladh Gnó - Stát"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Seoladh Gnó - Cód Poist"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Seoladh Gnó - Tír"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Seoladh Gnó - Lipéad"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Fón Baile"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Fón Gnó"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Fón Póca"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Facs Baile"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Facs Gnó"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Fón Cairr"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "LDSC"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Glaoire"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Seoladh Ríomhphoist"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Cliant Ríomhphoist"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Crios Ama"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Suíomh Geografach"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Teideal"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Ról"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Eagras"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Roinn"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nóta"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Aitheantóir Táirge"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Dáta Leasaithe"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Teaghrán Sórtála"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Leathanach Baile"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Aicme Slándála"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Lógó"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Grianghraf"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Fuaim"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "An Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Iníon"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "An tUas."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Bean"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "An tOll."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Óg"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Mór"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Réimse Anaithnid"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Uile"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Go Minic"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Seoladh"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Ríomhphost"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Pearsanta"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Saincheaptha"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Neamhshainithe"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X.509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Saincheaptha"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Cineál anaithnid"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Baile"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Obair"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Teachtaire"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Molta"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Guth"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Facs"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Fón Póca"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Fón Físe"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Bosca Poist"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Móideim"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Carr"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Eile"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Uimhir de Rogha"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Facs oibre"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Poiblí"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Príobháideach"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Faoi Rún"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Cineál anaithnid"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "De Rogha"
+
+#~ msgid "List of Emails"
+#~ msgstr "Liosta Ríomhphost"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Kevin Scannell"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "kscanne@gmail.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Ní féidir acmhainn '%1' a luchtú"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Roghnaigh an Seolaí"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Ainm"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Ríomhphost"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Roghnaithe"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Díroghnaigh"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Cumraigh Liostaí Dáilte"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Roghnaigh Seoladh Ríomhphoist"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Seoltaí Ríomhphoist"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Tá"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Níl"
+
+#~ msgid "New List..."
+#~ msgstr "Liosta Nua..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Athainmnigh Liosta..."
+
+#~ msgid "Remove List"
+#~ msgstr "Bain Liosta"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Seoltaí ar fáil:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Ríomhphost de Rogha"
+
+#~ msgid "Add Entry"
+#~ msgstr "Cuir Iontráil Leis"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Ríomhphost"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Úsáid an ceann de rogha"
+
+#~ msgid "Change Email..."
+#~ msgstr "Athraigh Seoladh Ríomhphoist..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Bain Iontráil"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Liosta Dáilte Nua"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Iontráil ai&nm:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Liosta Dáilte"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Athraigh an t-ai&nm le do thoil:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Scrios an liosta dáilte '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Seolaithe roghnaithe:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Seoltaí roghnaithe i '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Níl"
+
+#~ msgid "vCard"
+#~ msgstr "v-Chárta"
+
+#~ msgid "vCard Format"
+#~ msgstr "Formáid v-Chárta"
+
+#~ msgid "No description available."
+#~ msgstr "Níl cur síos ar fáil."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Ní féidir comhad glais a oscailt."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Tá acmhainn '%1' faoi ghlas ag feidhmchlár '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Earráid"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Theip ar oscailt an ghlais. Is le próiseas eile an comhad ghlais:  %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: D'éirigh le gach glas ach níor chuir aon rud faoi ghlas i "
+#~ "ndáiríre."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Theip ar gach glas."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Níorbh fhéidir acmhainn '%1' a luchtú."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Níorbh fhéidir acmhainn '%1' a shábháil."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Ní féidir acmhainn '%1' a oscailt."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Leabhar Seoltaí Réamhshocraithe"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Ní féidir acmhainn '%1' a shábháil. Tá sí faoi ghlas."
diff --git a/po/gl/kcontacts5.po b/po/gl/kcontacts5.po
new file mode 100644 (file)
index 0000000..48fce3c
--- /dev/null
@@ -0,0 +1,753 @@
+# translation of kabc.po to galician
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# mvillarino <mvillarino@users.sourceforge.net>, 2007, 2008, 2009.
+# Marce Villarino <mvillarino@users.sourceforge.net>, 2009.
+# marce villarino <mvillarino@users.sourceforge.net>, 2009.
+# Xosé <xosecalvo@gmail.com>, 2009.
+# Marce Villarino <mvillarino@kde-espana.es>, 2012, 2013.
+# Adrián Chaves Fernández (Gallaecio) <adriyetichaves@gmail.com>, 2015.
+# Adrián Chaves (Gallaecio) <adrian@chaves.io>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2017-07-29 09:52+0100\n"
+"Last-Translator: Adrián Chaves (Gallaecio) <adrian@chaves.io>\n"
+"Language-Team: Galician <kde-i18n-doc@kde.org>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Apartado de correos"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Información ampliada do enderezo"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Rúa"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localidade"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Rexión"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Código postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiqueta de envío"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Nacional"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paquetaría"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Casa"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Traballo"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Enderezo preferido"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Outro"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificador único"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nome"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nome Formatado"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Apelido"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nome Propio"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nomes Adicionais"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixos Honoríficos"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufixos Honoríficos"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Alcume"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Aniversario"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Rúa do enderezo particular"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Apartado de correos do enderezo particular"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Cidade do enderezo particular"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Provincia do enderezo particular"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Código postal do enderezo particular"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "País do enderezo particular"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiqueta do enderezo particular"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Rúa do enderezo do traballo"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Caixa de correo do enderezo do traballo"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Cidade do enderezo do traballo"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Provincia do enderezo do traballo"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Código postal do enderezo do traballo"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "País do enderezo do traballo"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etiqueta do enderezo do traballo"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Teléfono privado"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Teléfono do traballo"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Móbil"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax privado"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax do traballo"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Teléfono do coche"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "RDSI"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Busca"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Enderezo de correo electrónico"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Cliente de correo"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fuso horario"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posición xeográfica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Título"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Función"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organización"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departamento"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificador do produto"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data de revisión"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Ordenar a cadea"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Páxina web"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Clase de seguranza"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotipo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Son"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Sra."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Srta."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Sra."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Campo descoñecido"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Todos"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frecuente"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Enderezo"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Correo electrónico"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Persoal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalizado"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Non definido"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalizado"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipo descoñecido"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Número de teléfono"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Casa"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Traballo"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mensaxaría"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferido"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voz"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Móbil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vídeo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Caixa de correo"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Módem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Coche"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Outro"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Número preferido"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax do traballo"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Público"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privado"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidencial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipo descoñecido"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferido"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista de correos electrónicos"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr ""
+#~ "mvillarino, \n"
+#~ "Xosé Calvo"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr ""
+#~ "mvillarino@users.sourceforge.net, \n"
+#~ "xosecalvo@gmail.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Non foi posíbel cargar o recurso «%1»"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Escoller o destinatario"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Correo electrónico"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Escollidos"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Anular a selección"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Configurar as listas de distribución"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Escoller o enderezo de correo electrónico"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Enderezos de correo electrónico"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Si"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Non"
+
+#~ msgid "New List..."
+#~ msgstr "Lista nova..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Mudar o nome da lista..."
+
+#~ msgid "Remove List"
+#~ msgstr "Eliminar a lista"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Enderezos dispoñíbeis:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Correo electrónico preferido"
+
+#~ msgid "Add Entry"
+#~ msgstr "Engadir unha entrada"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Correo electrónico"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Utilizar o preferido"
+
+#~ msgid "Change Email..."
+#~ msgstr "Mudar o correo electrónico..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Eliminar a entrada"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nova lista de distribución"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Escriba o &nome:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Lista de distribución"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Mude o &nome:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Borrar a lista de distribución «%1»?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Escolla os destinatarios:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Enderezos escollidos en «%1»:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Non"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Formato vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Non hai ningunha descrición dispoñíbel."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Non foi posíbel abrir o ficheiro de bloqueo."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "O recurso «%1» está trancado polo programa «%2»."
+
+#~ msgid "Error"
+#~ msgstr "Erro"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Fallou o desbloqueo. O ficheiro de bloqueo é propiedade de outros "
+#~ "procesos: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Todos os bloqueos tiveron éxito pero non se trancou nada "
+#~ "realmente."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Todos os bloqueos fallaron."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Fallou a carga do recurso «%1»."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Fallou o gardado do recurso «%1»."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Foi imposíbel abrir o recurso «%1»"
+
+#~ msgid "Default Address Book"
+#~ msgstr "Caderno de enderezos predeterminado"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Non foi posíbel gardar no recurso «%1». Está trancado."
diff --git a/po/hi/kcontacts5.po b/po/hi/kcontacts5.po
new file mode 100644 (file)
index 0000000..d5beb8b
--- /dev/null
@@ -0,0 +1,809 @@
+# translation of kabc.po to Hindi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Ravishankar Shrivastava <raviratlami@yahoo.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2008-01-28 11:36+0530\n"
+"Last-Translator: Ravishankar Shrivastava <aviratlami@aol.in>\n"
+"Language-Team: Hindi <indlinux-hindi@lists.sourceforge.net>\n"
+"Language: hi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "पोस्ट बॉक्स नं."
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "पता की विस्तारित जानकारी"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "सड़क"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "जगह"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "क्षेत्र"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "पिन कोड"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "देश"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "डिलेवरी लेबल"
+
+#: address.cpp:353
+#, fuzzy, kde-format
+#| msgid "Domestic"
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "घरेलू"
+
+#: address.cpp:355
+#, fuzzy, kde-format
+#| msgid "International"
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "अंतर्राष्ट्रीय"
+
+#: address.cpp:357
+#, fuzzy, kde-format
+#| msgid "Postal"
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "पोस्टल"
+
+#: address.cpp:359
+#, fuzzy, kde-format
+#| msgid "Parcel"
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "पार्सल"
+
+#: address.cpp:361
+#, fuzzy, kde-format
+#| msgid "Home"
+msgctxt "Home Address"
+msgid "Home"
+msgstr "घर"
+
+#: address.cpp:363
+#, fuzzy, kde-format
+#| msgid "Work"
+msgctxt "Work Address"
+msgid "Work"
+msgstr "कार्यस्थल"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "पसंदीदा पता"
+
+#: address.cpp:367
+#, fuzzy, kde-format
+#| msgid "Other"
+msgctxt "another type of address"
+msgid "Other"
+msgstr "अन्य"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, fuzzy, kde-format
+#| msgid "Name"
+msgid "Name"
+msgstr "नाम"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr ""
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr ""
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, fuzzy, kde-format
+#| msgid "Name"
+msgid "Nick Name"
+msgstr "नाम"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr ""
+
+#: addressee.cpp:868
+#, fuzzy, kde-format
+#| msgid "Select Addressee"
+msgid "Home Address Street"
+msgstr "पाने वाला चुनें"
+
+#: addressee.cpp:873
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Home Address Post Office Box"
+msgstr "पोस्ट बॉक्स नं."
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Home Address State"
+msgstr "ईमेल पता"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Home Address Label"
+msgstr "ईमेल पता"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Business Address Post Office Box"
+msgstr "पोस्ट बॉक्स नं."
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr ""
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, fuzzy, kde-format
+#| msgid "Mobile"
+msgid "Mobile Phone"
+msgstr "मोबिल"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "घर का फ़ैक्स"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "आईएसडीएन"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "पेजर"
+
+#: addressee.cpp:978
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Email Address"
+msgstr "ईमेल पता"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr ""
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr ""
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr ""
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr ""
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr ""
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr ""
+
+#: addressee.cpp:1231
+#, fuzzy, kde-format
+#| msgid "No"
+msgid "Note"
+msgstr "नहीं"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, fuzzy, kde-format
+#| msgid "Home"
+msgid "Homepage"
+msgstr "घर"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr ""
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr ""
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr ""
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "डॉ."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "कुमारी"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "श्रीमान्"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "श्रीमती"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "सुश्री"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "प्रा."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "कनिष्ठ"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "वरिष्ठ"
+
+#: field.cpp:206
+#, fuzzy, kde-format
+#| msgid "Unknown type"
+msgid "Unknown Field"
+msgstr "अज्ञात क़िस्म"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr ""
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr ""
+
+#: field.cpp:223
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgctxt "street/postal"
+msgid "Address"
+msgstr "ईमेल पता"
+
+#: field.cpp:225
+#, fuzzy, kde-format
+#| msgid "Email"
+msgid "Email"
+msgstr "ईमेल"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr ""
+
+#: field.cpp:231
+#, fuzzy, kde-format
+#| msgid "Custom"
+msgid "Custom"
+msgstr "मनपसंद"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr ""
+
+#: key.cpp:198
+#, fuzzy, kde-format
+#| msgid "X509"
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "एक्स509"
+
+#: key.cpp:201
+#, fuzzy, kde-format
+#| msgid "PGP"
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "पीजीपी"
+
+#: key.cpp:204
+#, fuzzy, kde-format
+#| msgid "Custom"
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "मनपसंद"
+
+#: key.cpp:207
+#, fuzzy, kde-format
+#| msgid "Unknown type"
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "अज्ञात क़िस्म"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, fuzzy, kde-format
+#| msgid "Home"
+msgctxt "Home phone"
+msgid "Home"
+msgstr "घर"
+
+#: phonenumber.cpp:174
+#, fuzzy, kde-format
+#| msgid "Work"
+msgctxt "Work phone"
+msgid "Work"
+msgstr "कार्यस्थल"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "मेसेंजर "
+
+#: phonenumber.cpp:178
+#, fuzzy, kde-format
+#| msgid "Preferred"
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "पसंदीदा"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "आवाज़"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "फ़ैक्स"
+
+#: phonenumber.cpp:184
+#, fuzzy, kde-format
+#| msgid "Mobile"
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "मोबिल"
+
+#: phonenumber.cpp:186
+#, fuzzy, kde-format
+#| msgid "Video"
+msgctxt "Video phone"
+msgid "Video"
+msgstr "वीडियो"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "डाक डिब्बा"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "मॉडेम"
+
+#: phonenumber.cpp:192
+#, fuzzy, kde-format
+#| msgid "Car"
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "कार"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "पीसीएस"
+
+#: phonenumber.cpp:200
+#, fuzzy, kde-format
+#| msgid "Other"
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "अन्य"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "पसंदीदा संख्या"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "ऑफिस का फ़ैक्स"
+
+#: secrecy.cpp:98
+#, fuzzy, kde-format
+#| msgid "Public"
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "सार्वजनिक"
+
+#: secrecy.cpp:101
+#, fuzzy, kde-format
+#| msgid "Private"
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "निजी"
+
+#: secrecy.cpp:104
+#, fuzzy, kde-format
+#| msgid "Confidential"
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "गोपनीय"
+
+#: secrecy.cpp:107
+#, fuzzy, kde-format
+#| msgid "Unknown type"
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "अज्ञात क़िस्म"
+
+#, fuzzy
+#~| msgid "Preferred"
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "पसंदीदा"
+
+#~ msgid "List of Emails"
+#~ msgstr "ई-मेल सूची"
+
+#, fuzzy
+#~| msgid "Your names"
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "रविशंकर श्रीवास्तव, जी. करूणाकर"
+
+#, fuzzy
+#~| msgid "Your emails"
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "raviratlami@aol.in"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "रिसोर्स  '%1'  लोड करने में अक्षम."
+
+#, fuzzy
+#~| msgid "Select Addressee"
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "पाने वाला चुनें"
+
+#, fuzzy
+#~| msgid "Name"
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "नाम"
+
+#, fuzzy
+#~| msgid "Email"
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "ईमेल"
+
+#, fuzzy
+#~| msgid "Selected"
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "चुना गया"
+
+#, fuzzy
+#~| msgid "Unselect"
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "अचयनित"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "वितरण सूचियाँ कॉन्फ़िगर  करें"
+
+#~ msgid "Select Email Address"
+#~ msgstr "ई-मेल पता चुनें"
+
+#~ msgid "Email Addresses"
+#~ msgstr "ईमेल पता"
+
+#, fuzzy
+#~| msgid "Yes"
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "हाँ"
+
+#, fuzzy
+#~| msgid "No"
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "नहीं"
+
+#~ msgid "New List..."
+#~ msgstr "नई सूची..."
+
+#~ msgid "Rename List..."
+#~ msgstr "सूची का नया नाम..."
+
+#~ msgid "Remove List"
+#~ msgstr "सूची मिटाएँ"
+
+#~ msgid "Available addresses:"
+#~ msgstr "उपलब्ध पताः"
+
+#, fuzzy
+#~| msgid "Preferred Email"
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "प्राथमिकता ईमेल "
+
+#~ msgid "Add Entry"
+#~ msgstr "एन्ट्री जोड़ें"
+
+#, fuzzy
+#~| msgid "Email"
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "ईमेल"
+
+#, fuzzy
+#~| msgid "Use Preferred"
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "पसंदीदा इस्तेमाल करें"
+
+#~ msgid "Change Email..."
+#~ msgstr "ईमेल बदलें..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "एन्ट्री हटाएँ"
+
+#~ msgid "New Distribution List"
+#~ msgstr "नई वितरण सूची"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "कृपया नाम भरें (&n):"
+
+#~ msgid "Distribution List"
+#~ msgstr "वितरण सूची"
+
+#~ msgid "Please change &name:"
+#~ msgstr "कृपया नाम बदलें (&n):"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "वितरण सूची '%1' हटाएँ?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "चुने हुए पतेः"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr " '%1' में चुने हुए पते:"
+
+#, fuzzy
+#~| msgid "No"
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "नहीं"
+
+#~ msgid "vCard"
+#~ msgstr "वीकार्ड "
+
+#~ msgid "vCard Format"
+#~ msgstr "वीकार्ड फॉर्मेट"
+
+#~ msgid "No description available."
+#~ msgstr "कोई वर्णन उपलब्ध नहीं"
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "लाक फ़ाइल खोलने में अक्षम."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "रिसोर्स '%1' अनुप्रयोग '%2' द्वारा तालाबंद है."
+
+#~ msgid "Error"
+#~ msgstr "त्रुटि"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "ताला खोलने में असफल. लाक फ़ाइल अन्य प्रक्रम के स्वामित्व में है: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: सभी तालाबंद सफल किंतु वास्तविक ताला नहीं लगाया."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: सभी ताला असफल."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "संसाधन '%1' लोड करना असफल."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "संसाधन '%1' सहेना असफल."
+
+#, fuzzy
+#~| msgid "Unable to load resource '%1'"
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "रिसोर्स  '%1'  लोड करने में अक्षम."
+
+#, fuzzy
+#~| msgid "Select Addressee"
+#~ msgid "Default Address Book"
+#~ msgstr "पाने वाला चुनें"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "संसाधन '%1' पर सहेजने में अक्षम. यह ताला बंद है."
diff --git a/po/hne/kcontacts5.po b/po/hne/kcontacts5.po
new file mode 100644 (file)
index 0000000..df9fae7
--- /dev/null
@@ -0,0 +1,746 @@
+# translation of kabc.po to Hindi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Ravishankar Shrivastava <raviratlami@yahoo.com>, 2008.
+# Ravishankar Shrivastava <raviratlami@aol.in>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2009-02-28 21:51+0530\n"
+"Last-Translator: Ravishankar Shrivastava <raviratlami@aol.in>\n"
+"Language-Team: Hindi <kde-i18n-doc@lists.kde.org>\n"
+"Language: hne\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 0.2\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "पोस्ट डब्बा नं."
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "पता के विस्तारित जानकारी"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "सड़क"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "जगह"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "छेत्र"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "पिन कोड"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "देस"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "डिलेवरी लेबल"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "घरेलू"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "अंतररास्ट्रीय"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "पोस्टल"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "पार्सल"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "घर"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "कामस्थल"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "निसानी पता"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "अन्य"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "बेजोड़ पहचान"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "नांव"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "फार्मेटेड नाम"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "कुटुंब नाम"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "दे गे नाम"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "अतिरिक्त नाम"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "उप नांव"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "जन्मदिन"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "घर के पता सड़क"
+
+#: addressee.cpp:873
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Home Address Post Office Box"
+msgstr "पोस्ट डब्बा नं."
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "घर के पता सहर"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "घर के पता राज्य"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "घर के पता जिप कोड"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "घर के पता देस"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "घर के पता लेबल"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Business Address Post Office Box"
+msgstr "पोस्ट डब्बा नं."
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "घर फोन"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "व्यवसाय फोन"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "मोबाइल फोन"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "घर के फैक्स"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "व्यवसाय फेक्स"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "कार फोन"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "आईएसडीएन"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "पेजर"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "ईमेल पता"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "डाकिया"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "समय छेत्र"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "भौगोलिक स्थिति"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "सीर्सक"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "भूमिका"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "संगठन "
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "विभाग"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "टिप्पनी"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "संसोधन तारीक"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "मुख पेज"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "सुरक्छा क्लास"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "लोगो"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "फोटू"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "अवाज"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "डा."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "कुमारी"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "स्रीमान्"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "स्रीमती"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "सुस्री"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "प्रा."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "कनिस्ठ"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "वरिस्ठ"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "अग्यात छेत्र"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "सब्बो"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "बारंबार"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "पता"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "ईमेल"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "निजी"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "मनमाफिक"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "अपरिभासित "
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "एक्स509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "पीजीपी"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "मनमाफिक"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "अग्यात किसिम"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "घर"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "कामस्थल"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "मेसेंजर "
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "निसानी"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "अवाज"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "फैक्स"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "मोबाइल"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "वीडियो"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "डाक डिब्बा"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "माडेम"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "कार"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "पीसीएस"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "अन्य"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "निसानी संख्या"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "आफिस के फैक्स"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "सार्वजनिक"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "निजी"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "गोपनीय"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "अग्यात किसिम"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "निसानी"
+
+#~ msgid "List of Emails"
+#~ msgstr "ई-मेल सूची"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "रविसंकर सिरीवास्तव, जी. करूनाकर"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "raviratlami@aol.in,"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "रिसोर्स  '%1'  लोड करे मं अक्छम."
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "पावइया चुनव"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "नांव"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "ईमेल"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "चुने गे"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "मतचुनव"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "वितरन सूचियाँ कान्फिगर  करव"
+
+#~ msgid "Select Email Address"
+#~ msgstr "ई-मेल पता चुनव"
+
+#~ msgid "Email Addresses"
+#~ msgstr "ईमेल पता"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "हाँ"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "नइ"
+
+#~ msgid "New List..."
+#~ msgstr "नवा सूची..."
+
+#~ msgid "Rename List..."
+#~ msgstr "सूची के नवा नाम..."
+
+#~ msgid "Remove List"
+#~ msgstr "सूची मेटाव"
+
+#~ msgid "Available addresses:"
+#~ msgstr "मिलत पताः"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "प्राथमिकता ईमेल "
+
+#~ msgid "Add Entry"
+#~ msgstr "एन्ट्री जोड़व"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "ईमेल"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "निसानी उपयोग करव"
+
+#~ msgid "Change Email..."
+#~ msgstr "ईमेल बदलव..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "एन्ट्री हटाव"
+
+#~ msgid "New Distribution List"
+#~ msgstr "नवा वितरन सूची"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "किरपा करके, नाम भरव (&n):"
+
+#~ msgid "Distribution List"
+#~ msgstr "वितरन सूची"
+
+#~ msgid "Please change &name:"
+#~ msgstr "किरपा करके, नाम बदलव (&n):"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "वितरन सूची '%1' हटाव?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "चुने हुए पतेः"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr " '%1' मं चुने हुए पते:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "नइ"
+
+#~ msgid "vCard"
+#~ msgstr "वीकार्ड "
+
+#~ msgid "vCard Format"
+#~ msgstr "वीकार्ड फार्मेट"
+
+#~ msgid "No description available."
+#~ msgstr "कोई वर्नन नइ मिलत"
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "लाक फाइल खोले मं अक्छम."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "रिसोर्स '%1' अनुपरयोग '%2' से तालाबंद हे."
+
+#~ msgid "Error"
+#~ msgstr "गलती"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "ताला खोले मं फेल. लाक फाइल अउ प्रक्रम के मालिकाना मं हे: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: सब्बो तालाबंद सफल किंतु सही ताला नइ लगाही."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: सब्बो ताला फेल."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "संसाधन '%1' लोड करना फेल."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "संसाधन '%1' सहेना फेल."
+
+#, fuzzy
+#~| msgid "Unable to load resource '%1'"
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "रिसोर्स  '%1'  लोड करे मं अक्छम."
+
+#, fuzzy
+#~ msgid "Default Address Book"
+#~ msgstr "पावइया चुनव"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "संसाधन '%1' मं सहेजे मं अक्छम. ए ताला बंद हे."
diff --git a/po/hu/kcontacts5.po b/po/hu/kcontacts5.po
new file mode 100644 (file)
index 0000000..f8239bf
--- /dev/null
@@ -0,0 +1,742 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Tamas Szanto <tszanto@interware.hu>, 2007.
+# Kristóf Kiszel <ulysses@kubuntu.org>, 2010, 2014, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: KDE 4.3\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-11-12 19:44+0100\n"
+"Last-Translator: Kristóf Kiszel <ulysses@kubuntu.org>\n"
+"Language-Team: Hungarian <kde-l10n-hu@kde.org>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 20.03.70\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postafiók"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Kibővített címadatok"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Utca"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Helység"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Megye/régió"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Irányítószám"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Ország"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Kézbesítési címke"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Belföldi"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Külföldi"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postai cím"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Csomag"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Otthoni"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Munkahelyi"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Elsődleges cím"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Egyéb"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Egyedi azonosító"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Név"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formázott név"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Családi név"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Utónév"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Egyéb nevek"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Előtagok"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Utótagok"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Becenév"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Születésnap"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Utca (otthoni)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Postafiók (otthoni)"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Helység (otthoni)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Állam (otthoni)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Irányítószám (otthoni)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Ország (otthoni)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Címke (otthoni)"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Utca (munkahelyi)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Postafiók (munkahelyi)"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Helység (munkahelyi)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Állam (munkahelyi)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Irányítószám (munkahelyi)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Ország (munkahelyi)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Címke (munkahelyi)"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefon (otthoni)"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon (munkahelyi)"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobil"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax (otthoni)"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax (munkahelyi)"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Autótelefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Csipogó"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-mail cím"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Levelezőprogram"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Időzóna"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Földrajzi pozíció"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Megszólítás"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Beosztás"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Szervezet"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Osztály"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Megjegyzés"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Termékazonosító"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Verzió"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Rendezési sztring"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Honlap"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Biztonsági osztály"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logó"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fénykép"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Hang"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Mr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mrs."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Ismeretlen mező"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Mind"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "A fontosabbak"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Cím"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail cím"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Privát"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Egyedi"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nincs megadva"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Egyedi"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Ismeretlen címtípus"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonszám"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Otthoni"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Munkahelyi"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Üzenetküldő"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Elsődleges"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Hang"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Videó"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postaláda"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Autó"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Egyéb"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Elsődleges telefonszám"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Munkahelyi fax"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Nyilvános"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privát"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Bizalmas"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Ismeretlen"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Elsődleges"
+
+#~ msgid "List of Emails"
+#~ msgstr "E-mail címek"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Szántó Tamás,Kiszel Kristóf"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "tszanto@interware.hu,ulysses@kubuntu.org"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Nem sikerült betölteni ezt az erőforrást: „%1”."
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Címzett kiválasztása"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Név"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-mail cím"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Kijelölve"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Nincs kijelölve"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Címlisták beállítása"
+
+#~ msgid "Select Email Address"
+#~ msgstr "E-mail cím kiválasztása"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-mail címek"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Igen"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nem"
+
+#~ msgid "New List..."
+#~ msgstr "Új lista…"
+
+#~ msgid "Rename List..."
+#~ msgstr "Lista átnevezése…"
+
+#~ msgid "Remove List"
+#~ msgstr "Lista eltávolítása"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Címek:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Elsődleges e-mail cím"
+
+#~ msgid "Add Entry"
+#~ msgstr "Új bejegyzés"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-mail cím"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Az elsődleges cím használata"
+
+#~ msgid "Change Email..."
+#~ msgstr "E-mail cím módosítása…"
+
+#~ msgid "Remove Entry"
+#~ msgstr "Bejegyzés törlése"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Új címlista"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Né&v:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Címlista"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Változtassa meg a n&evet:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Törölni szeretné ezt a címlistát: „%1”?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Kijelölt címzettek:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Kijelölt címzettek itt: „%1”:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nem"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard formátum"
+
+#~ msgid "No description available."
+#~ msgstr "Nincs leírás."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Nem sikerült megnyitni egy zárolófájlt."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "A(z) „%2” alkalmazás zárolta ezt a fájlt: „%1”."
+
+#~ msgid "Error"
+#~ msgstr "Hiba"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "A feloldás nem sikerült, mert a zárolófájlt fogja ez a folyamat: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "A zárolások sikerültek, de nem történt tényleges zárolás."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "Egy zárolás sem sikerült."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Nem sikerült betölteni ezt az erőforrást: „%1”."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Nem sikerült elmenteni ezt az erőforrást: „%1”."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Nem sikerült megnyitni ezt az erőforrást: „%1”."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Alapértelmezett címjegyzék"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr ""
+#~ "A következő erőforrás zárolt, ezért nem sikerült bele menteni: „%1”."
diff --git a/po/ia/kcontacts5.po b/po/ia/kcontacts5.po
new file mode 100644 (file)
index 0000000..0bd605b
--- /dev/null
@@ -0,0 +1,743 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# g.sora <g.sora@tiscali.it>, 2011, 2012, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-12-21 23:51+0100\n"
+"Last-Translator: Giovanni Sora <g.sora@tiscali.it>\n"
+"Language-Team: Interlingua <kde-i18n-doc@kde.org>\n"
+"Language: ia\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Cassa de officio de posta"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Information de adresse extendite"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Strata"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localitate"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Codice postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Pais"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiquetta de livration"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domestic"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "International"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Parcella"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Domo"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Labor"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Adresse preferite"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Altere"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificator unic"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nomine"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nomine formatate"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Nomine de Familia"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nomine date"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nomines additional"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixos honorific"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Suffixos honorific"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Pseudonymo"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Anniversario de nativitate"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Strata de adresse de domo"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Cassa de officio de posta de adresse de domo"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Citate de adresse de domo"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Stato de adresse de domo"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Codice postal de adresse de domo"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Pais de adresse de domo"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiquetta de adresse de domo"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Strata de adresse de labor"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Cassa de officio de posta de adresse de labor"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Citate de adresse de labor"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Stato de adresse de labor"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Codice postal de adresse de labor"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Pais de adresse de labor"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etiquetta de adresse de labor"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telephono de domo"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telephono de affaires"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telephono mobile"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax de domo"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax de affaires"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telephono de automobile"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adresse de E-Posta"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Cliente de e-posta"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zona de Tempore"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Position geographic"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titulo"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rolo"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organization"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departimento"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificator de producto"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data de revision"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Ordina catena"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Pagina Domo o Principal"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe de securitate"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Photo"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Sono"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Senioretta"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Senior"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Seniora"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Seniora"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Campo incognite"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Omne"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frequente"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresse"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-posta"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalisate"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Non definite"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalisate"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Typo incognite"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Numero de telephono"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Domo"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Labor"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messagero"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferite"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voce"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobile"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Cassa postal"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Automobile"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Altere"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Numero preferite"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax de labor"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Public"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Private"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidential"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Typo incognite"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferite"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista de e-postas"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Giovanni Sora"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "g.sora@tiscali.it"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Incapace de cargar ressource:  '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Selige destinatario"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nomine"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-posta"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Seligite"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "De-selige"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Configura listas de distribution"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Selige adresses de e-posta"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Adresses de E-Posta"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Si"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "New List..."
+#~ msgstr "Nove lista..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Renomina lista..."
+
+#~ msgid "Remove List"
+#~ msgstr "Remove lista"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Adresses disponibile:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "E-posta preferite"
+
+#~ msgid "Add Entry"
+#~ msgstr "Adde Entrata"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-posta"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Usa preferite"
+
+#~ msgid "Change Email..."
+#~ msgstr "Cambia e-posta..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Remove entrata"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nove lista de distribution"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Per favor inserta &nomine:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Lista de distribution"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Pro favor cambia &nomine:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Dele lista de distribution '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Destinatarios seligite:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Adresses seligite in '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Formato de vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Nulle description disponibile."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Incapace de aperir file de bloco."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Le ressource '%1' es blocate per application '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Error"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Il falleva a disblocar. File de bloco es de proprietate de un altere "
+#~ "processo: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Tote blocos habeva successo ma nulle bloco in realitate ha "
+#~ "essite facite."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Omne blocos falleva."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Il falleva a cargar ressource '%1'."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Il falleva a salveguardar ressource '%1'."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Incapace de aperir ressource '%1'."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Adressario predefinite"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Incapace de salveguardar ressource '%1'. Il es blocate."
diff --git a/po/id/kcontacts5.po b/po/id/kcontacts5.po
new file mode 100644 (file)
index 0000000..c02fb98
--- /dev/null
@@ -0,0 +1,583 @@
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+# Wantoyo <wantoyek@gmail.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-10-13 07:49+0700\n"
+"Last-Translator: Wantoyo <wantoyek@gmail.com>\n"
+"Language-Team: Indonesian <kde-i18n-doc@kde.org>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Kotak Kantor Pos"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informasi Alamat Diperluas"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Jalan"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Lokalitas"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Kode Pos"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Negeri"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Label Pengiriman"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domestik"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internasional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Kartu Pos"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Parsel"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Rumah"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Kantor"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Alamat yang Disukai"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Lainnya"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Pengidentifikasi Unik"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nama"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nama yang Diformat"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Nama Keluarga"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nama yang Diberikan"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nama-nama Tambahan"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Awalan Kehormatan"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Akhiran Kehormatan"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Nama Panggilan"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Hari Lahir"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Jalan Alamat Rumah"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Kotak Kantor Pos Alamat Rumah"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Kota Alamat Rumah"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Negara Alamat Rumah"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Kode Zip Alamat Rumah"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Negeri Alamat Rumah"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Label Alamat Rumah"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Jalan Alamat Bisnis"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Kotak Kantor Pos Alamat Bisnis"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Kota Alamat Bisnis"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Negara Alamat Bisnis"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Kode Zip Alamat Bisnis"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Negeri Alamat Bisnis"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Label Alamat Bisnis"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telepon Rumah"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telepon Bisnis"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telepon Genggam"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax Rumah"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax Bianis"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telepon Mobil"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pèjer (Pager)"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Alamat Email"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Klien Mail"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zona Waktu"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posisi Geografis"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Judul"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Peran"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisasi"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Jawatan"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Catatan"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Pengidentifikasi Produk"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Tanggal Revisi"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Urutkan String"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Laman"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Kelas Keamanan"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Suara"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Nona"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Tn."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Ny."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Nn."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Bidang tak diketahui"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Semua"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Sering"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Alamat"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Email"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Kustom"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Tak ditentukan"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Kustom"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipe tak diketahui"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Nomor telepon"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Rumah"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Kantor"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Perpesanan"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Disukai"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Suara"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Seluler"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Kotak Surat"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Mobil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Lainnya"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Nomor yang Disukai"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax Kantor"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publik"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Diberi Kepercayaan"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipe tak diketahui"
diff --git a/po/it/kcontacts5.po b/po/it/kcontacts5.po
new file mode 100644 (file)
index 0000000..0e7819f
--- /dev/null
@@ -0,0 +1,746 @@
+# translation of kabc.po to Italian
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the kabc package.
+# Federico Zenith <federico.zenith@member.fsf.org>, 2007.
+# Pino Toscano <toscano.pino@tiscali.it>, 2009.
+# Luigi Toscano <luigi.toscano@tiscali.it>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2015-12-28 16:57+0100\n"
+"Last-Translator: Luigi Toscano <luigi.toscano@tiscali.it>\n"
+"Language-Team: Italian <kde-i18n-it@kde.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Casella postale"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informazioni estese sull'indirizzo"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Via"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Località"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regione"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Codice postale"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Nazione"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etichetta di consegna"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domestico"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internazionale"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postale"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Pacco"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Casa"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Lavoro"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Indirizzo preferito"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Altro"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificatore univoco"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nome"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nome formattato"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Cognome"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nome"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Altri nomi"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefissi onorifici"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Suffissi onorifici"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Soprannome"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Data di nascita"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Via indirizzo di casa"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Casella postale indirizzo di casa"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Città indirizzo di casa"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Stato indirizzo di casa"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "CAP indirizzo di casa"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Stato indirizzo di casa"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etichetta indirizzo di casa"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Via indirizzo di lavoro"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Casella postale indirizzo di lavoro"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Città indirizzo di lavoro"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Stato indirizzo di lavoro"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "CAP indirizzo di lavoro"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Stato indirizzo di lavoro"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etichetta indirizzo di lavoro"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefono di casa"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefono di lavoro"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telefono cellulare"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax a casa"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax di lavoro"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefono auto"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Cercapersone"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Indirizzo di posta elettronica"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Programma di posta elettronica"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fuso orario"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posizione geografica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titolo"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Ruolo"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizzazione"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Dipartimento"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificativo prodotto"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data di revisione"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Stringa di ordinamento"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Homepage"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe di sicurezza"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Suono"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dott."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Sig.rina"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sig."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Sig.ra"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ing."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Campo sconosciuto"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Tutto"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frequente"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Indirizzo"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Posta elettronica"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personale"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalizzato"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Non definito"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalizzata"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipo sconosciuto"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Numero di telefono"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Casa"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Lavoro"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messaggistica"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferito"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voce"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Cellulare"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Casella"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Macchina"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Altro"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Numero preferito"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax al lavoro"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Pubblico"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privato"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidenziale"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipo sconosciuto"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferito"
+
+#~ msgid "List of Emails"
+#~ msgstr "Elenco di indirizzi"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Federico Zenith"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "federico.zenith@member.fsf.org"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Impossibile caricare la risorsa «%1»"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Seleziona destinatario"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Posta elettronica"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Selezionato"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Deseleziona"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Configura liste di distribuzione"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Seleziona indirizzo di posta"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Indirizzi di posta"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Sì"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "New List..."
+#~ msgstr "Nuova lista..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Rinomina lista..."
+
+#~ msgid "Remove List"
+#~ msgstr "Rimuovi lista"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Indirizzi disponibili:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Indirizzo di posta preferito"
+
+#~ msgid "Add Entry"
+#~ msgstr "Aggiungi voce"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Posta elettronica"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Usa preferito"
+
+#~ msgid "Change Email..."
+#~ msgstr "Cambia indirizzo di posta..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Rimuovi voce"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nuova lista di distribuzione"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Inserisci il &nome:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Lista di distribuzione"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Cambia il &nome:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Eliminare la lista di distribuzione «%1»?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Destinatari selezionati:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Destinatari selezionati in «%1»:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "No"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Formato vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Nessuna descrizione disponibile."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Impossibile aprire file di blocco."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "La risorsa «%1» è bloccata dall'applicazione «%2»."
+
+#~ msgid "Error"
+#~ msgstr "Errore"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Sblocco non riuscito. Il file di blocco è di proprietà di un altro "
+#~ "processo: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "Blocco nullo: tutti i blocchi sono riusciti, ma non è stato effettuato "
+#~ "nessun blocco."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "Blocco nullo: nessun blocco è riuscito."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Caricamento della risorsa «%1» non riuscito."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Salvataggio della risorsa «%1» non riuscito."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Impossibile aprire la risorsa «%1»"
+
+#~ msgid "Default Address Book"
+#~ msgstr "Rubrica predefinita"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Impossibile salvare la risorsa «%1»: è bloccata."
diff --git a/po/ja/kcontacts5.po b/po/ja/kcontacts5.po
new file mode 100644 (file)
index 0000000..366e16b
--- /dev/null
@@ -0,0 +1,585 @@
+# Translation of kabc into Japanese.
+# This file is distributed under the same license as the kdepimlibs package.
+# Yukiko Bando <ybando@k6.dion.ne.jp>, 2007, 2008, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-01-27 01:03+0900\n"
+"Last-Translator: Yukiko Bando <ybando@k6.dion.ne.jp>\n"
+"Language-Team: Japanese <kde-jp@kde.org>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "私書箱"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "住所の詳細"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "番地"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "区市町村"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "都道府県"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "郵便番号"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "国"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "宛先ラベル"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "国内"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "国際"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "郵便"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "小包"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "自宅"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "勤務先"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "優先住所"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "その他"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "一意の識別子"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "名前"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "フォーマットされた名前"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "姓"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "名"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "付加的な名前"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "敬称 (前)"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "敬称 (後)"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "ニックネーム"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "誕生日"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "自宅住所 番地"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "自宅住所 私書箱"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "自宅住所 市"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "自宅住所 都道府県"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "自宅住所 郵便番号"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "自宅住所 国"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "自宅住所 ラベル"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "勤務先住所 番地"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "勤務先住所 私書箱"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "勤務先住所 市"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "勤務先住所 都道府県"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "勤務先住所 郵便番号"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "勤務先住所 国"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "勤務先住所 ラベル"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "自宅電話"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "勤務先電話"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "携帯電話"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "自宅のファクス"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "勤務先ファクス"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "車載電話"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "ポケットベル"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "メールアドレス"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "メールクライアント"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "タイムゾーン"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "地理的な位置"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "肩書"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "役割"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "組織"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "部署"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "備考"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "製品の識別子"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "改訂日付"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "ソート文字列"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "ホームページ"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "セキュリティクラス"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "ロゴ"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "写真"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "音声"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Mr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mrs."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "未知のフィールド"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "すべて"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "よく使う"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "住所"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "メール"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "個人的"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "カスタム"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "未定義"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X.509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "カスタム"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "未知のタイプ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "自宅"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "勤務先"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "メッセンジャー"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "優先電話番号"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "ボイスフォン"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "ファクス"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "携帯電話"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "ビデオフォン"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "メールボックス"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "モデム"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "自動車電話"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "その他"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "優先番号"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "勤務先のファクス"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "公開"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "プライベート"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "内密"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "未知のタイプ"
diff --git a/po/ka/kcontacts5.po b/po/ka/kcontacts5.po
new file mode 100644 (file)
index 0000000..cd38a38
--- /dev/null
@@ -0,0 +1,585 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2022-09-18 11:56+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <kde-i18n-doc@kde.org>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "საფოსტო ყუთი"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "გაფართოებული მისამართი"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "ქუჩა"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "რაიონი"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "რეგიონი"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "საფოსტო კოდი"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "ქვეყანა"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "მიწოდების ეტიკეტი"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "შიდა"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "საერთაშორისო"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "საფოსტო კოდი"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "ამანათი"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "სახლი"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "სამუშაო"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "სასურველი მისამართი"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "სხვა"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "უნიკალური იდენტიფიკატორი"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "სახელი"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "ფორმატირებული სახელი"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "საოჯახო სახელი"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "სახელი"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "დამატებითი სახელები"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "საპატიო პრეფიქსი"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "საპატიო სუფიქსი"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "მეტსახელი"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "დაბადების დღე"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "სახლის მისამართი ქუჩა"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "სახლის მისამართი საფოსტო ყუთი"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "სახლის მისამართი ქალაქი"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "სახლის მისამართი შტატი"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "სახლის მისამართი საფოსტო კოდი"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "სახლის მისამართი ქვეყანა"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "სახლის მისამართი ჭდე"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "სამსახურის მისამართი ქუჩა"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "სამსახურის მისამართი საფოსტო ყუთი"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "სამსახურის მისამართი ქალაქი"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "სამსახურის მისამართი შტატი"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "სამსახურის მისამართი საფოსტო კოდი"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "სამსახურის მისამართი ქვეყანა"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "სამსახურის მისამართი ჭდე"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "სახლის ტელეფონი"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "სამსახურის ტელეფონი"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "მობილური ტელეფონი"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "სახლის ფაქსი"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "სამსახურის ფაქსი"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "მანქანის ტელეფონი"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "პეიჯერი"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "ელ-ფოსტის მისამართი"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "საფოსტო კლიენტი"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "დროის სარტყელი"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "გეოგრაფიული მდებარეობა"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "სათაური"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "როლი"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "ორგანიზაცია"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "დეპარტამენტი"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "შენიშვნა"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "პროდუქტის იდენტიფიკატორი"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "გადასინჯვის თარიღი"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "დალაგების სტრიქონი"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "საწყისი გვერდი"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "უსაფრთხოების კლასი"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "ლოგო"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "სურათი"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "ხმა"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "დრ."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "ქნ"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "ბნ."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "ქნ."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "ქნ."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "პროფ."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "უმც."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "უფრ."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "უცნობი ველი"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "ყველა"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "ხშირი"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "მისამართი"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "ელფოტა"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "პერსონალური"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "ხელით მითითება"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "გაურკვეველი"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "ხელით მითითება"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "უცნობი ტიპი"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "ტელეფონის ნომერი"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "სახლი"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "სამუშაო"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "მესინჯერი"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "მირჩევნია"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "ხმა"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "ფაქსი"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "მობაილი"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "ვიდეო"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "საფოსტო ყუთი"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "მოდემი"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "მანქანა"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "სხვა"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "სასურველი ნომერი"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "სამსახურის ფაქსი"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "საჯარო"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "პირადი"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "კონფიდენციალური"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "უცნობი ტიპი"
diff --git a/po/kk/kcontacts5.po b/po/kk/kcontacts5.po
new file mode 100644 (file)
index 0000000..da2d986
--- /dev/null
@@ -0,0 +1,741 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Sairan Kikkarin <sairan@computer.org>, 2011, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2013-04-19 06:20+0600\n"
+"Last-Translator: Sairan Kikkarin <sairan@computer.org>\n"
+"Language-Team: Kazakh <kde-i18n-doc@kde.org>\n"
+"Language: kk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Абоненттік жәшік"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Кеңейтілген адресі"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Көше"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Елді мекен"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Өлке/Обылыс"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Пошта индексі"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Ел"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Жапсырма жарлық"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Ел ішіндегі"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Халықаралық"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Хаттарға арналған"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Дестелерге арналған"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Ұй"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Жұмыс"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Негізгі адресі"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Басқа"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Бірегей идентификаторы"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Аты-жөні"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Пішімделген атау"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Тегі"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Өз аты"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Әкесінің (қосымша) аты"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Қошеметтеу префиксі"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Қошеметтеу жұрнағы"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Бүркеншік аты"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Туған күні"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Үй адрес көшесі"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Үй адрес абоненттік жәшігі"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Үй адрес қаласы"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Үй адрес уәлаят/облысы"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Үй адрес пошта индексі"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Үй адрес Елі"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Үй адрес жапсырма жарлығы"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Жұмыс адрес көшесі"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Жұмыс адрес абоненттік жәшігі"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Жұмыс адрес қаласы"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Жұмыс адрес уәлаят/облысы"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Жұмыс адрес пошта индексі"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Жұмыс адрес Елі"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Жұмыс адрес жапсырма жарлығы"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Үй телефоны"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Жұмыс телефоны"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Қалта телефоны"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Үйдегі факсы"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Жұмыстағы факс"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Машинадағы телефоны"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr " "
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Пейджері"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Эл.пошта адресі"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Пошта клиенті"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Уақыт белдеуі"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Географиялық орны"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Атағы"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Қызметі"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Ұйымы"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Бөлімі"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Жазба"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Өнім идентификаторы"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Соңғы өзгертілген кезі"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Реттеу"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Мекен парағы"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Қауіпсіздік класы"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Логотипі"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Фотосуреті"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Дыбысы"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "д-р"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "мис."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "мистер"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "мадам"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "миссис"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "проф."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Беймәлім өріс"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Бүкілі"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Жиі қолданатын"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Адресі"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Эл.поштасы"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Дербес"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Өзге"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Анықталмаған"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Өзге"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Беймәлім түрі"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Ұй"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Жұмыс"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Хабарласу"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Негізгісі"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Дауыс"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Қалтафон"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Бейнефон"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Дауыс поштасы"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Машинадағы телефон"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS (GSM-1900)"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Басқа"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Негізгі тел. нөмірі"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Жұмыс факсы"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Ашық"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Жеке"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Сырлы"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Беймәлім түрі"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Негізгі адресі"
+
+#~ msgid "List of Emails"
+#~ msgstr "Эл.пошта адрестер тізімі"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Сайран Киккарин"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "sairan@computer.org"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "'%1' дерек көздегісі жүктеуге келмейді"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Адресатты таңдау"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Аты-жөні"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Эл.поштасы"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Таңдағаны"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Таңдаудан шығару"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Тарату тізімдерін баптау"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Эл.пошта адресін таңдау"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Эл.пошта адрестері"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Иә"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Жоқ"
+
+#~ msgid "New List..."
+#~ msgstr "Жаңа тізім..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Тізім атауын өзгерту..."
+
+#~ msgid "Remove List"
+#~ msgstr "Тізімді өшіру"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Бар адрестері:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Негізгі эл.пошта адресі"
+
+#~ msgid "Add Entry"
+#~ msgstr "Жазуды қосу"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Эл.пошта"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Қолданатыны"
+
+#~ msgid "Change Email..."
+#~ msgstr "Эл.поштаны өзгерту..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Жазуды өшіру"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Жаңа тарату тізімі"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "&Атауы:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Тарату тізімі"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Атауын өзгертіңіз:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "'%1' тарату тізімін өшірмексіз бе?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Таңдалған адрестері:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "'%1' дегенде таңдалғаны:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Жоқ"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "VCard пішімі"
+
+#~ msgid "No description available."
+#~ msgstr "Сипаттамасы жоқ."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Бұғаттау файл ашылмады."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "'%1' деректер көзін '%2' бағдарламасы бұғаттаған."
+
+#~ msgid "Error"
+#~ msgstr "Қате"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "Бұғаты шешу жаңылысы. Бұғат файлдың ие-процесі: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Бүкіл бұғаттаулар сәтті өтті, бірақ іс жүзінде ештеңе "
+#~ "бұғатталған жоқ."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Бұкіл бұғаттаулар жаңылды."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "'%1' деген ресурс жүктелмеді."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "'%1' деген ресурс сақталмады."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "'%1' ресурсы ашылмады."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Әдетті адрестік кітапша"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "'%1' ресурсына сақталмады, себебі ол бұғатталған."
diff --git a/po/km/kcontacts5.po b/po/km/kcontacts5.po
new file mode 100644 (file)
index 0000000..465dd37
--- /dev/null
@@ -0,0 +1,745 @@
+# translation of kabc.po to Khmer
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Khoem Sokhem <khoemsokhem@khmeros.info>, 2008, 2009, 2010.
+# Morn Met, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-01-25 15:44+0700\n"
+"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
+"Language-Team: Khmer <support@khmeros.info>\n"
+"Language: km\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"\n"
+"\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "ប្រអប់​សំបុត្រ"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "ព័ត៌មាន​អាសយដ្ឋាន​បន្ថែម"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "ផ្លូវ"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "មូលដ្ឋាន"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "តំបន់"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "កូដ​​ប្រៃសណីយ៍"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "ប្រទេស"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "ស្លាក​បញ្ចូន"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "ក្នុង​ប្រទេស"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "អន្តរជាតិ"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "ប្រៃសណីយ៍"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "កញ្ចប់"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "ផ្ទះ"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "ការងារ"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "អាសយដ្ឋាន​ដែល​ពេញចិត្ត"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "ផ្សេងៗ"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "ឧបករណ៍​កំណត់​អត្តសញ្ញាណ​តែ​មួយ​គត់"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "ឈ្មោះ"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "ឈ្មោះ​មានទ្រង់ទ្រាយ"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "នាម​ត្រកូល"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "នាម​ខ្លួន"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "ឈ្មោះ​បន្ថែម"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "បុព្វបទ​កិត្តិយស"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "បច្ច័យ​កិត្តិយស"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "សម្មតិនាម"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "ថ្ងៃ​កំណើត"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "ផ្លូវ​អាសយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "ប្រអប់​សំបុត្រ​នៃ​អាយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "ទីក្រុង​អាសយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "រដ្ឋ​អាសយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "កូដ​តំបន់​អាសយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "ប្រទេស​អាសយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "ស្លាក​អាសយដ្ឋាន​ផ្ទះ"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "ផ្លូវ​អាសយដ្ឋាន​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "ប្រអប់​សំបុត្រ​នៃ​អាសយដ្ឋាន​កន្លែង​ធ្វើការ"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "ទីក្រុង​អាសយដ្ឋាន​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "រដ្ឋ​អាសយដ្ឋាន​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "កូដ​តំបន់​អាសយដ្ឋាន​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "ប្រភេទ​អាសយដ្ឋាន​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "ស្លាក​អាសយដ្ឋាន​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "ទូរស័ព្ទ​ផ្ទះ"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "ទូរស័ព្ទ​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "ទូរស័ព្ទ​ចល័ត"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "ទូរសារ​នៅ​ផ្ទះ"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "ទូរសារ​ពាណិជ្ជកម្ម"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "ទូរស័ព្ទ​រថយន្ត"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "ភេកយ័រ"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "អាសយដ្ឋាន​អ៊ីមែល"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "កម្មវិធី​អ៊ីមែល"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "តំបន់​ពេលវេលា"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "ទីតាំង​ភូមិសាស្ត្រ"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "មុខងារ"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "តួនាទី"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "អង្គភាព"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "នាយកដ្ឋាន"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "ចំណាំ"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "ឧបករណ៍​កំណត់​អត្តសញ្ញាណ​ផលិតផល"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "កាលបរិច្ឆេទ​ពិនិត្យ​ឡើង​វិញ"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "តម្រៀប​ខ្សែអក្សរ"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "គេហទំព័រ"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "ថ្នាក់​សុវត្ថិភាព"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "រូបសញ្ញា"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "រូបថត"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "សំឡេង"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "វេជ្ជបណ្ឌិត"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "កញ្ញា"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "លោក"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "អ្នក​ស្រី"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "អ្នកនាង"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "សាស្ត្រាចារ្យ"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "មិនស្គាល់​វាល"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "ទាំងអស់"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "ញឹកញាប់"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "អាសយដ្ឋាន"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "អ៊ីមែល"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "ផ្ទាល់ខ្លួន"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "ផ្ទាល់ខ្លួន"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "មិន​បាន​កំណត់"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "ផ្ទាល់ខ្លួន"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "ប្រភេទ​មិន​ស្គាល់"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "ផ្ទះ"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "ការងារ"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "កម្មវិធី​ផ្ញើ​សំបុត្រ"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "បាន​ពេញចិត្ត"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "សំឡេង"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "ទូរសារ"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "ចល័ត"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "វីដេអូ"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "ប្រអប់​សំបុត្រ"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "ម៉ូដឹម"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "រថយន្ត"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "ផ្សេងៗ"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "លេខ​ពេញ​ចិត្ត"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "ទូរសារ​កន្លែង​ធ្វើការ"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "សាធារណៈ"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "ឯកជន"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "សម្ងាត់"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "ប្រភេទ​មិន​ស្គាល់"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "ពេញចិត្ត"
+
+#~ msgid "List of Emails"
+#~ msgstr "បញ្ជី​អ៊ីមែល"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "ខឹម សុខែម, អេង វណ្ណៈ, អោក ពិសិដ្ឋ​​"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr ""
+#~ "khoemsokhem@khmeros.info,​​evannak@khmeros.info,piseth_dv@khmeros.info"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "មិន​អាច​ផ្ទុក​ធនធាន '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "ជ្រើស​អ្នក​ទទួ\9b​សំបុត្រ"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "ឈ្មោះ"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "អ៊ីមែល"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "បាន​ជ្រើស"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "ដោះ​ជ្រើស"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "កំណត់​រចនាសម្ព័ន្ធ​បញ្ជី​ចែកចាយ"
+
+#~ msgid "Select Email Address"
+#~ msgstr "ជ្រើស​អាសយដ្ឋាន​អ៊ីមែល"
+
+#~ msgid "Email Addresses"
+#~ msgstr "អាសយដ្ឋាន​អ៊ីមែល"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "បាទ/ចាស"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "ទេ"
+
+#~ msgid "New List..."
+#~ msgstr "បញ្ជី​ថ្មី..."
+
+#~ msgid "Rename List..."
+#~ msgstr "ប្ដូរ​ឈ្មោះ​បញ្ជី..."
+
+#~ msgid "Remove List"
+#~ msgstr "យក​បញ្ជី​ចេញ"
+
+#~ msgid "Available addresses:"
+#~ msgstr "អាសយដ្ឋាន​ដែល​មាន ៖"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "អ៊ីមែល​ដែល​ចូល​ចិត្ត"
+
+#~ msgid "Add Entry"
+#~ msgstr "បន្ថែម​ធាតុបញ្ចូល"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "អ៊ីមែល"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "ការប្រើ​ដែល​ចូលចិត្ត"
+
+#~ msgid "Change Email..."
+#~ msgstr "ផ្លាស់ប្ដូរ​អ៊ីមែល..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "យក​ធាតុ​ចេញ"
+
+#~ msgid "New Distribution List"
+#~ msgstr "បញ្ជី​ចែកចាយ​ថ្មី"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "សូម​បញ្ចូល​ឈ្មោះ ៖"
+
+#~ msgid "Distribution List"
+#~ msgstr "បញ្ជី​ចែកចាយ"
+
+#~ msgid "Please change &name:"
+#~ msgstr "សូម​ផ្លាស់ប្ដូរ​ឈ្មោះ ៖"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "លុប​បញ្ជី​ចែកចាយ '%1' ?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "អ្នក​ទទួល​សំបុត្រ​ដែល​បាន​ជ្រើស ៖"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "អាសយដ្ឋាន​ដែល​បាន​ជ្រើស​ក្នុង '%1' ៖"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "ទេ"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "ទ្រង់ទ្រាយ vCard"
+
+#~ msgid "No description available."
+#~ msgstr "មិន​មាន​​ការ​ពិពណ៌នា ។"
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "មិន​អាច​បើក​ឯកសារ​ជាប់​សោ ។"
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "ធនធាន '%1' ត្រូវ​បាន​ចាក់សោ​ដោយ​កម្មវិធី '%2' ។"
+
+#~ msgid "Error"
+#~ msgstr "កំហុស"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "បាន​បរាជ័យ​ក្នុង​ការដោះសោ ។ ឯកសារ​ជាប់សោ​ជា​កម្មសិទ្ធិ​របស់​ដំណើរការ​ផ្សេង ៖ %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull ៖ ការ​ចាក់សោ​​​ទាំងអស់​ជោគជ័យ  ប៉ុន្តែ​គ្មាន​ការចាក់សោ​ពិតប្រាកដ​ត្រូវ​បាន​ធ្វើនោះ​ទេ ។"
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull ៖ ការចាក់សោ​ទាំងអស់​បាន​បរាជ័យ ។"
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "បានបរាជ័យ​ក្នុង​កា​រផ្ទុក '%1' ។"
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "បាន​បរាជ័យ​ក្នុង​កា​ររក្សាទុក​ធនធាន '%1' ។"
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "មិនអាច​បើក​ធនធាន '%1' បាន​ទេ ។"
+
+#~ msgid "Default Address Book"
+#~ msgstr "សៀវភៅ​អាសយដ្ឋាន​លំនាំដើម"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "មិន​អាច​រក្សាទុក​ទៅ​កាន់​ធនធាន '%1' ។ វា​ជាប់​សោ ។"
diff --git a/po/ko/kcontacts5.po b/po/ko/kcontacts5.po
new file mode 100644 (file)
index 0000000..216a76b
--- /dev/null
@@ -0,0 +1,739 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Shinjo Park <kde@peremen.name>, 2015, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2016-12-11 22:23+0100\n"
+"Last-Translator: Shinjo Park <kde@peremen.name>\n"
+"Language-Team: Korean <kde-kr@kde.org>\n"
+"Language: ko\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-Generator: Lokalize 2.0\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "우편 사서함"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "확장 주소 정보"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "도로명"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "자치구"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "지역"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "우편 번호"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "국가"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "배달 정보"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "국내"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "국제"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "우편"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "소포"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "집"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "직장"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "선호 주소"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "기타"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "고유 식별자"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "이름"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "형식 있는 이름"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "성"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "성 제외 이름"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "추가 이름"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "존칭 접두사"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "존칭 접미사"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "별명"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "생일"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "집 주소 도로명"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "집 주소 사서함"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "집 주소 도시"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "집 주소 도/광역시"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "집 주소 우편 번호"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "집 주소 국가"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "집 주소 레이블"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "직장 주소 도로명"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "직장 주소 사서함"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "직장 주소 도시"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "직장 주소 도/광역시"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "직장 주소 우편 번호"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "직장 주소 국가"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "직장 주소 레이블"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "집 전화"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "직장 전화"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "휴대 전화"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "집 팩스"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "직장 팩스"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "카폰"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "호출기"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "이메일 주소"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "메일 클라이언트"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "시간대"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "지리적 위치"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "직위"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "직급"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "조직"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "부서"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "메모"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "제품 식별자"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "리비전 날짜"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "정렬 문자열"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "홈페이지"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "보안 등급"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "로고"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "사진"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "소리"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "박사"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr ""
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr ""
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr ""
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr ""
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "교수"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "1세"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "2세"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "3세"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr ""
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr ""
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "알 수 없는 필드"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "모두"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "자주"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "주소"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "이메일"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "개인"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "사용자 정의"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "정의되지 않음"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "사용자 정의"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "알 수 없는 형식"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "전화 번호"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "홈"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "직장"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "메신저"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "선호함"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "음성"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "팩스"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "휴대폰"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "동영상"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "사서함"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "모뎀"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "카폰"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "기타"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "선호하는 번호"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "직장 팩스"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "공공"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "개인"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "통제됨"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "알 수 없는 형식"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "선호함"
+
+#~ msgid "List of Emails"
+#~ msgstr "이메일 목록"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Shinjo Park"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "kde@peremen.name"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "자원 '%1'을(를) 불러올 수 없음"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "주소 대상 선택"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "이름"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "이메일"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "선택됨"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "선택 해제"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "분배 목록 설정"
+
+#~ msgid "Select Email Address"
+#~ msgstr "이메일 주소 선택"
+
+#~ msgid "Email Addresses"
+#~ msgstr "이메일 주소"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "예"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "아니요"
+
+#~ msgid "New List..."
+#~ msgstr "새 목록..."
+
+#~ msgid "Rename List..."
+#~ msgstr "목록 이름 변경..."
+
+#~ msgid "Remove List"
+#~ msgstr "목록 삭제"
+
+#~ msgid "Available addresses:"
+#~ msgstr "사용 가능한 주소:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "선호하는 이메일"
+
+#~ msgid "Add Entry"
+#~ msgstr "항목 추가"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "이메일"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "선호 사용"
+
+#~ msgid "Change Email..."
+#~ msgstr "이메일 변경..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "항목 삭제"
+
+#~ msgid "New Distribution List"
+#~ msgstr "새 분배 목록"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "이름 입력(&N):"
+
+#~ msgid "Distribution List"
+#~ msgstr "분배 목록"
+
+#~ msgid "Please change &name:"
+#~ msgstr "이름 변경(&N):"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "분배 목록 '%1'을(를) 삭제하시겠습니까?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "주소 선택:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "'%1'의 주소 선택:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "아니요"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard 형식"
+
+#~ msgid "No description available."
+#~ msgstr "설명 없음."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "잠금 파일을 열 수 없습니다."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "자원 '%1'을(를) 프로그램 '%2'에서 잠갔습니다."
+
+#~ msgid "Error"
+#~ msgstr "오류"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "잠금 실패. 다른 프로세스에서 잠금 파일을 소유하고 있습니다: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: 모든 잠금이 성공하였지만 실제로 잠기지 않았습니다."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: 모든 잠금이 실패하였습니다."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "자원 '%1'을(를) 불러올 수 없습니다."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "자원 '%1'을(를) 저장할 수 없습니다."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "자원 '%1'을(를) 열 수 없습니다."
+
+#~ msgid "Default Address Book"
+#~ msgstr "기본 주소록"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "자원 '%1'을(를) 저장할 수 없습니다. 잠겼습니다."
diff --git a/po/lt/kcontacts5.po b/po/lt/kcontacts5.po
new file mode 100644 (file)
index 0000000..445d117
--- /dev/null
@@ -0,0 +1,593 @@
+# translation of kabc.po to Lithuanian
+# This file is distributed under the same license as the kabc package.
+# Donatas Glodenis <dgvirtual@akl.lt>, 2007-2009.
+# Tomas Straupis <tomasstraupis@gmail.com>, 2011.
+# Remigijus Jarmalavičius <remigijus@jarmalavicius.lt>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-12-04 23:51+0200\n"
+"Last-Translator: Remigijus Jarmalavičius <remigijus@jarmalavicius.lt>\n"
+"Language-Team: Lithuanian <kde-i18n-lt@kde.org>\n"
+"Language: lt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n"
+"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n"
+"X-Generator: Poedit 2.2.4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Pašto dėžutė"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Papildoma adreso informacija"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Gatvė"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Vietovė"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regionas"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Pašto indeksas"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Šalis"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Pristatymo etiketė"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Šalies viduje"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Tarptautinis"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Pašto"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Siuntinys"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Namų"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Darbo"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Pageidautinas adresas"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Kita"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unikalus identifikatorius"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Vardas"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatuotas vardas"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Pavardė"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Vardas"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Kiti vardai"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Garbės priešdėliai"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Garbės priesagos"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Slapyvardis"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Gimimo diena"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Namų adreso gatvė"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Namų adreso pašto dėžutė"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Namų adreso miestas"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Namų adreso valstija"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Namų adreso pašto kodas"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Namų adreso šalis"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Namų adreso etiketė"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Darbo adreso gatvė"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Darbo adreso pašto dėžutė"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Darbo adreso miestas"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Darbo adreso valstija"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Darbo adreso pašto kodas"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Darbo adreso šalis"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Darbo adreso etiketė"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Namų telefonas"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Verslo telefonas"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobilus telefonas"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Namų faksas"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Darbo faksas"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Automobilio telefonas"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pranešimų gaviklis"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "El. pašto adresas"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Pašto klientas"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Laiko zona"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografinė vieta"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Antraštė"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Vaidmuo"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizacija"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Skyrius"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Pastaba"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produkto identifikatorius"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Keitimo data"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Rikiavimo eilutė"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Namų puslapis"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Saugumo klasė"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Nuotrauka"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Garsas"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Panelė"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Ponas"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Ponia"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "P."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jaun."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Vyr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Nežinomas laukas"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Visi"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Dažnus"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresas"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "El. paštas"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Asmeninis"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Pasirinktas"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Neapibrėžtas"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Pasirinktas"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Nežinomas tipas"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefono numeris"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Namų"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Darbo"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Pranešėjas"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Pagrindinis"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Balsas"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faksas"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobilus"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Pašto dėžutė"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modemas"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Automobilinis"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Kita"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Pageidautinas numeris"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Darbo faksas"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Vieša"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Asmeninė"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidenciali"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Nežinomas tipas"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Pageidautinas"
+
+#~ msgid "List of Emails"
+#~ msgstr "El. pašto sąrašas"
diff --git a/po/lv/kcontacts5.po b/po/lv/kcontacts5.po
new file mode 100644 (file)
index 0000000..290bf81
--- /dev/null
@@ -0,0 +1,745 @@
+# translation of kabc.po to Latvian
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Viesturs Zarins <viesturs.zarins@mii.lu.lv>, 2007, 2008, 2010.
+# Maris Nartiss <maris.kde@gmail.com>, 2008.
+# Viesturs Zariņš <viesturs.zarins@mii.lu.lv>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-01-01 14:26+0200\n"
+"Last-Translator: Viesturs Zarins <viesturs.zarins@mii.lu.lv>\n"
+"Language-Team: Latvian <locale@laka.lv>\n"
+"Language: lv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
+"2);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Pasta kastīte"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Paplašināta adreses informācija"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Iela"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Apvidus"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Reģions"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Pasta indekss"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Valsts"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Piegādes uzlīme"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Iekšzemes"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Starptautisks"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Pastam"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paciņām"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Mājas"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Darbs"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Vēlamā adrese"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Cita"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unikāls identifikators"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Vārds"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatēts vārds"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Uzvārds"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Vārds"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Papildus vārdi"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Goda prefiksi"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Goda sufiksi"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Iesauka"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Dzimšanas diena"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Mājas adreses iela"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Mājas adreses pasta nodaļas kastīte"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Mājas adreses pilsēta"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Mājas adreses štats"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Mājas adreses pasta indekss"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Mājas adreses valsts"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Mājas adreses birka"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Darba adreses iela"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Darba adrese pasta nodaļas kastīte"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Darba adreses pilsēta"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Darba adreses štats"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Darba adreses pasta indekss"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Darba adreses valsts"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Darba adreses birka"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Mājas tālrunis"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Darba tālrunis"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobīlais tālrunis"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Mājas fakss"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Darba fakss"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Automašīnas tālrunis"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Peidžers"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-pasta adrese"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Pasta klients"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Laika zona"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Ģeogrāfiskais novietojums"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Amats"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Loma"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizācija"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departaments"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Piezīme"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produkta identifikators"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Revīzijas datums"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Kārtošanas virkne"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Mājaslapa"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Drošības klase"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Skaņa"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Kungs"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Kundze"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Misiz"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jun."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sers"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Nezināms lauks"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Visi"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Biežs"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adrese"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-pasts"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personīgs"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Pielāgots"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nenodefinēts"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Pielāgota"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Nezināma tipa"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Mājas"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Darbs"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Ziņojumprogramma"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Vēlamais"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Balss"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fakss"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobīlais"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Pastkastīte"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modēms"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Mašīna"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Cits"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Vēlamais numurs"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fakss darbā"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publisks"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privāts"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidenciāls"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Nezināms tips"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Vēlamais"
+
+#~ msgid "List of Emails"
+#~ msgstr "E-pastu saraksts"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Viesturs Zarins"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "viesturs.zarins@mi.lu.lv"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Neizdevās ielādēt resursu '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Izvēlieties adresātu"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Vārds"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-pasts"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Izvēlēts"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Noņemt izvēli"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Konfigurēt adresātu sarakstus"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Izvēlēties epasta adresi"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Epasta adreses"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Jā"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nē"
+
+#~ msgid "New List..."
+#~ msgstr "Jauns saraksts..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Pārdēvēt sarakstu..."
+
+#~ msgid "Remove List"
+#~ msgstr "Izmest sarakstu"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Pieejamās adreses:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Vēlamais e-pasts"
+
+#~ msgid "Add Entry"
+#~ msgstr "Pievienot vienību"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-pasts"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Izmantot vēlamo"
+
+#~ msgid "Change Email..."
+#~ msgstr "Mainīt epastu..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Izņemt ierakstu"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Jauns adresātu saraksts"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Lūdzu ievadiet &nosaukumu:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Adresātu saraksts"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Lūdzu mainiet &nosaukumu:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Dzēst adresātu sarakstu '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Izvēlētās adreses:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Izvēlētās adreses no '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nē"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard formāts"
+
+#~ msgid "No description available."
+#~ msgstr "Apraksts nav piejams."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Neizdevās atvērt slēgšanas failu."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Resursu '%1' jau ir slēgusi programma '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Kļūda"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "Neizdevās atslēgt. Slēgšanas fails pieder procesam: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Visas slēgšanas operācijas veiksmīgas, bet reāli neviena "
+#~ "slēgšana nenotika."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Visas slēgšanas operācijas neveiksmīgas."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Resursa '%1' ielāde neveiksmīga."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Resursa '%1' saglabāšana neveiksmīga."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Neizdevās atvērt resursu '%1'."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Noklusētā adrešu grāmata"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Neizdevās saglabāt '%1', šis resurss ir slēgts."
diff --git a/po/mai/kcontacts5.po b/po/mai/kcontacts5.po
new file mode 100644 (file)
index 0000000..a2c50ce
--- /dev/null
@@ -0,0 +1,636 @@
+# translation of kabc.po to Maithili
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Rajesh Ranjan <rajesh672@gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-09-24 20:39+0530\n"
+"Last-Translator: Rajesh Ranjan <rajesh672@gmail.com>\n"
+"Language-Team: Maithili <bhashaghar@googlegroups.com>\n"
+"Language: mai\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr ""
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr ""
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "सड़क"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "नगर"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "क्षेत्र"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "पोस्टल कोड"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "देश"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr ""
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "घरेलू"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "अंतर्राष्ट्रीय"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "पोस्टल"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "पार्सल"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "घर"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "कामकाज"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr ""
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "आन"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "नाम"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "घरक नाम"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "देल नाम"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr ""
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "जन्मदिन"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr ""
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr ""
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr ""
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "फोन आवास"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "मोबाइल फोन"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "घरक फैक्स"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "पेजर"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "इमेल पता"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "डाकिया"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "समय क्षेत्र"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "भौगोलिक स्थिति"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "शीर्षक"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "भूमिका"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "संस्था"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "विभाग"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "नोट"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "मुख्य पृष्ठ"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "लोगो"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "चित्र"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "ध्वनि"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr ""
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr ""
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr ""
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr ""
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr ""
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr ""
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr ""
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr ""
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr ""
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr ""
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr ""
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "सभ"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr ""
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "पता"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "इमेल"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "व्यक्तिगत"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "पसंदीदा"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "अपरिभाषित"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr ""
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "पीजीपी"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "पसंदीदा"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "अज्ञात प्रकार"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "घर"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "कामकाज"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr ""
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "पसंदीदा"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "आवाज"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "फैक्स"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "मोबाइल"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "वीडियो"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr ""
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "माडेम"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "कार"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr ""
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "आन"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr ""
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "कार्यालय फ़ैक्स"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "सार्वजनिक"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "निजी"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "गोपनीय"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "अज्ञात प्रकार"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "पसंदीदा"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "संगीता कुमारी"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "sangeeta09@gmail.com"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "नाम"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "इमेल"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "चयनित"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "विचयनित करू"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "हँ"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "नहि"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "इमेल"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "नहि"
+
+#~ msgid "No description available."
+#~ msgstr "कोनो विवरण उपलब्ध नहि अछि."
+
+#~ msgid "Error"
+#~ msgstr "त्रुटि"
diff --git a/po/ml/kcontacts5.po b/po/ml/kcontacts5.po
new file mode 100644 (file)
index 0000000..beacc3a
--- /dev/null
@@ -0,0 +1,585 @@
+# Malayalam translations for kcontacts package.
+# Copyright (C) 2019 This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+# Automatically generated, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-06-19 03:19+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: Swathanthra|സ്വതന്ത്ര Malayalam|മലയാളം Computing|കമ്പ്യൂട്ടിങ്ങ് <smc."
+"org.in>\n"
+"Language: ml\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr ""
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr ""
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr ""
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr ""
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr ""
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr ""
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr ""
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr ""
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr ""
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr ""
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr ""
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr ""
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr ""
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr ""
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr ""
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr ""
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr ""
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr ""
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr ""
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr ""
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr ""
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr ""
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr ""
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr ""
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr ""
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr ""
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr ""
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr ""
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr ""
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr ""
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr ""
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr ""
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr ""
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr ""
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr ""
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr ""
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr ""
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr ""
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr ""
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr ""
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr ""
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr ""
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr ""
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr ""
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr ""
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr ""
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr ""
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr ""
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr ""
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr ""
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr ""
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr ""
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr ""
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr ""
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr ""
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr ""
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr ""
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr ""
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr ""
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr ""
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr ""
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr ""
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr ""
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr ""
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr ""
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr ""
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr ""
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr ""
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr ""
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr ""
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr ""
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr ""
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr ""
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr ""
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr ""
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr ""
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr ""
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr ""
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr ""
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr ""
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr ""
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr ""
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr ""
diff --git a/po/mr/kcontacts5.po b/po/mr/kcontacts5.po
new file mode 100644 (file)
index 0000000..5c1dfd1
--- /dev/null
@@ -0,0 +1,642 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Chetan Khona <chetan@kompkin.com>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2013-03-07 18:21+0530\n"
+"Last-Translator: Chetan Khona <chetan@kompkin.com>\n"
+"Language-Team: Marathi <kde-i18n-doc@kde.org>\n"
+"Language: mr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr ""
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr ""
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr ""
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr ""
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "विभाग"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr ""
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "देश"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr ""
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr ""
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr ""
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr ""
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr ""
+
+#: address.cpp:361
+#, fuzzy, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "मुख्य"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr ""
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr ""
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "इतर"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "नाव"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr ""
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr ""
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr ""
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "वाढदिवस"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr ""
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr ""
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr ""
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, fuzzy, kde-format
+msgid "Home Phone"
+msgstr "घरचा फोन (&M):"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr ""
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr ""
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr ""
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "पेजर"
+
+#: addressee.cpp:978
+#, fuzzy, kde-format
+msgid "Email Address"
+msgstr "इमेल पत्ता :"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "मेल ग्राहक"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "वेळ क्षेत्र"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "शिर्षक"
+
+#: addressee.cpp:1140
+#, fuzzy, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "भूमीका :"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "संस्था"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr ""
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "नोंद"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "मुख्यपान"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, fuzzy, kde-format
+msgid "Logo"
+msgstr "प्रतिकचिन्ह (&L):"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr ""
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "ध्वनी"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Mr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mrs."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr ""
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "सर्व"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr ""
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "पत्ता"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "इमेल"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "खाजगी"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "ऐच्छिक"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "व्याख्यारहित"
+
+#: key.cpp:198
+#, fuzzy, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "x"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr ""
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "ऐच्छिक"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr ""
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, fuzzy, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "मुख्य"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr ""
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr ""
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "पसंतीचे"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr ""
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr ""
+
+#: phonenumber.cpp:184
+#, fuzzy, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "मोबाईल"
+
+#: phonenumber.cpp:186
+#, fuzzy, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "दृश्य"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr ""
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "मोडेम"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr ""
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr ""
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "इतर"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr ""
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr ""
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "सार्वजनिक"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "वैयक्तिक"
+
+#: secrecy.cpp:104
+#, fuzzy, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "गुप्त"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr ""
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "पसंतीचे"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "चेतन खोना"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "chetan@kompkin.com"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "नाव"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "इमेल"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "निवडलेले"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "निवड काढून टाका"
+
+#, fuzzy
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "हो"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "नाही"
+
+#~ msgid "Add Entry"
+#~ msgstr "नोंद जोडा"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "इमेल"
+
+#~ msgid "Remove Entry"
+#~ msgstr "नोंद काढून टाका"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "नाही"
+
+#, fuzzy
+#~ msgid "No description available."
+#~ msgstr "वर्णन उपलब्ध नाही."
+
+#~ msgid "Error"
+#~ msgstr "त्रुटी"
diff --git a/po/nb/kcontacts5.po b/po/nb/kcontacts5.po
new file mode 100644 (file)
index 0000000..2579776
--- /dev/null
@@ -0,0 +1,587 @@
+# Translation of kcontacts5 to Norwegian Bokmål
+#
+# Nils Kristian Tomren <slx@nilsk.net>, 2007.
+# Bjørn Steensrud <bjornst@skogkatt.homelinux.org>, 2008, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2009-11-22 10:26+0100\n"
+"Last-Translator: Bjørn Steensrud <bjornst@skogkatt.homelinux.org>\n"
+"Language-Team: Norwegian Bokmål <l10n-no@lister.huftis.org>\n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postboks"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Utvidet adresseinformasjon"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Gate"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Sted"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Område"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postnummer"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Leveringsetikett"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Innenlands"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internasjonalt"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Post"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Pakke"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Hjem"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Arbeid"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Foretrukket adresse"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Andre"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Entydig identifikasjon"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Navn"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formattert navn"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Etternavn"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Fornavn"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Flere navn"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Høflige prefikser"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Høflige suffikser"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Kallenavn"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Fødselsdag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Hjemmeadresse,gate"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Hjemmeadresse, postboks"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Hjemmeadresse, by"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Hjemmeadresse, stat"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Hjemmeadresse, postnummer"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Hjemmeadresse, land"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Hjemmeadresse, merkelapp"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Firmaadresse, gate"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Firmaadresse, postboks"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Firmaadresse, by"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Firmaadresse, stat"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Firmaadresse, postnummer"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Firmaadresse, land"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Firmaadresse, merkelapp"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Hjemmetelefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon arbeid"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiltelefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Hjemmefaks"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Faks arbeid"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefon i bil"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Personsøker"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-postadresse"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-postklient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Tidssone"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografisk plassering"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Tittel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rolle"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisasjon"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Avdeling"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Merknad"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produkt-identifikator"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Revidert dato"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorteringsstreng"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Hjemmeside"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Sikkerhetsklasse"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Lyd"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Frøken"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Herr"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Fru"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Fr."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Ukjent felt"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Alle"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Ofte"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresse"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-post"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Privat"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Tilpasset"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Udefinert"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Tilpasset"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Ukjent type"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Hjem"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Arbeid"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Meldingstjeneste"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Foretrukket"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Stemme"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postkasse"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Bil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Andre"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Foretrukket nummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Arbeidsfaks"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Offentlig"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidensiell"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Ukjent type"
diff --git a/po/nds/kcontacts5.po b/po/nds/kcontacts5.po
new file mode 100644 (file)
index 0000000..ad138f1
--- /dev/null
@@ -0,0 +1,594 @@
+# Translation of kabc.po to Low Saxon
+# translation of kabc.po to Low Saxon
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Sönke Dibbern <s_dibbern@web.de>, 2007, 2008.
+# Manfred Wiese <m.j.wiese@web.de>, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-01-25 07:37+0100\n"
+"Last-Translator: Manfred Wiese <m.j.wiese@web.de>\n"
+"Language-Team: Low Saxon <kde-i18n-nds@kde.org>\n"
+"Language: nds\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postfach"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Verwiedert Adressinformatschonen"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Straat"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Oort"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regioon"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postleddtall"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Leveropbacker"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Binnenlannsch"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Butenlannsch"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postadress"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paketadress"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Tohuus"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Arbeit"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Vörtrocken Adress"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Annerswat"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Eenkennig Beteker"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Naam"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formateert Naam"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Familiennaam"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Vörnaam"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Naams bito"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Höflichkeits-Prefixen"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Höflichkeits-Suffixen"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Ökelnaam"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Geboortsdag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Straat (Tohuus)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Postfach (Tohuus)"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Stadt (Tohuus)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Bunnsland (Tohuus)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Postleddtall (Tohuus)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Land (Tohuus)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Adressopbacker (Tohuus)"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Straat (Arbeit)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Postfach (Arbeit)"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Stadt (Arbeit)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Land (Arbeit)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Postleddtall (Arbeit)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Land (Arbeit)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Adressopbacker (Arbeit)"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefoon (Tohuus)"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefoon (Arbeit)"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiltelefoon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax (Tohuus)"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax (Arbeit)"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Autotelefoon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Nettpostadress"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Nettpostprogramm"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Tietrebeet"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geograafsch Steed"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rull"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisatschoon"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Afdelen"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Notiz"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produktbeteker"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Revischoondatum"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorteer-Tekenkeed"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Tohuussiet"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Sekerheitklass"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Klang"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Fru"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Herr"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Fru"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Fru"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Perf."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jun."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sen."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Nich begäng Feld"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "All"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Faken"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adress"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Nettpost"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Persöönlich"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Anner"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nich fastleggt"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Anner"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Typ nich begäng"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Tohuus"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Arbeit"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Kortnarichten"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Vörtrocken"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Stimm"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobiltelefoon"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Antermaschien"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Auto"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Annerswat"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Vörtrocken Nummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax (Arbeit)"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Apen"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privaat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Vertrolich"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Typ nich begäng"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Vörtrocken"
+
+#~ msgid "List of Emails"
+#~ msgstr "Nettbreven-List"
diff --git a/po/nl/kcontacts5.po b/po/nl/kcontacts5.po
new file mode 100644 (file)
index 0000000..19eab59
--- /dev/null
@@ -0,0 +1,748 @@
+# translation of kabc.po to Nederlands
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Bram Schoenmakers <bramschoenmakers@kde.nl>, 2007.
+# Antoon Tolboom <atolboo@casema.nl>, 2008.
+# Kristof Bal <kristof.bal@gmail.com>, 2009.
+# Freek de Kruijf <freekdekruijf@kde.nl>, 2010, 2015, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2022-06-24 10:23+0200\n"
+"Last-Translator: Freek de Kruijf <freekdekruijf@kde.nl>\n"
+"Language-Team: \n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 22.04.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postbus"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Uitgebreide adresinformatie"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Straat"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Plaats"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regio"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postcode"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Bezorglabel"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Binnenlands"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internationaal"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postadres"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Perceel"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Thuis"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Werk"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Voorkeuradres"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Overige"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unieke identifier"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Naam"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Opgemaakte naam"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Achternaam"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Voornaam"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Extra namen"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Titel voorvoegsel"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Titel-achtervoegsels"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Bijnaam"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Verjaardag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Straat privé"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Postbus van huisadres"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Plaats privé"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Provincie privé"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Postcode privé"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Land privé"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Label privé"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Straat zakelijk"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Postbus van zakelijke adres"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Plaats zakelijk"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Provincie zakelijk"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Postcode zakelijk"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Land zakelijk"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Label zakelijk"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefoon privé"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefoon zakelijk"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiele telefoon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax privé"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax zakelijk"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Autotelefoon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Semafoon"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-mailadres"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-mailprogramma"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Tijdzone"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografische positie"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Functie"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisatie"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Afdeling"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Notitie"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Product-identifier"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Revisiedatum"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorteertekst"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Webpagina"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Beveiligingsklasse"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Geluid"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Mej."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Men."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mevr."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Mevr."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Onbekend veld"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Alles"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Vaak"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adres"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mailadres"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Persoonlijk"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Aangepast"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Ongedefinieerd"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Aangepast"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Onbekend type"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefoonnummer"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Thuis"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Werk"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Voorkeur"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Stem"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobiel"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postbus"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Auto"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Overige"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Voorkeurnummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax zakelijk"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publiek"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privé"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Vertrouwelijk"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Onbekend type"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Voorkeur"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lijst met e-mailberichten"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Bram Schoenmakers,Antoon Tolboom"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "bramschoenmakers@kde.nl,atolboo@casema.nl"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "De hulpbron '%1' kon niet worden geladen"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Geadresseerde selecteren"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Naam"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Geselecteerd"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Deselecteren"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Distributielijsten instellen"
+
+#~ msgid "Select Email Address"
+#~ msgstr "E-mailadressen selecteren"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-mailadressen"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nee"
+
+#~ msgid "New List..."
+#~ msgstr "Nieuwe lijst..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Lijst hernoemen..."
+
+#~ msgid "Remove List"
+#~ msgstr "Lijst verwijderen"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Beschikbare adressen:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Voorkeur e-mail"
+
+#~ msgid "Add Entry"
+#~ msgstr "Item toevoegen"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-mail"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Voorkeur gebruiken"
+
+#~ msgid "Change Email..."
+#~ msgstr "E-mail wijzigen..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Ingang verwijderen"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nieuwe distributielijst"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Voer een &naam in:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Distributielijst"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Wijzig de &naam:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Distributielijst '%1' verwijderen?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Geselecteerde adressen:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Geselecteerde adressen in '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nee"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard-opmaak"
+
+#~ msgid "No description available."
+#~ msgstr "Geen beschrijving beschikbaar."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Lock-bestand kon niet worden geopend."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "De hulpbron '%1' is vergrendeld door toepassing '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Fout"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Het ontgrendelen is niet gelukt. Het Lock-bestand is eigendom van een "
+#~ "ander proces: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Alle vergrendelingen zijn gelukt, maar vonden niet werkelijk "
+#~ "plaats."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Alle vergrendelingen mislukken."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Laden van hulpbron '%1' is mislukt."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Het opslaan van hulpbron '%1' is mislukt."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "De hulpbron '%1' kon niet worden geopend."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Standaard adresboek"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr ""
+#~ "Er kon niet worden opgeslagen naar hulpbron '%1'. Deze is vergrendeld."
diff --git a/po/nn/kcontacts5.po b/po/nn/kcontacts5.po
new file mode 100644 (file)
index 0000000..2044866
--- /dev/null
@@ -0,0 +1,587 @@
+# Translation of kcontacts5 to Norwegian Nynorsk
+#
+# Eirik U. Birkeland <eirbir@gmail.com>, 2008, 2009.
+# Karl Ove Hufthammer <karl@huftis.org>, 2008, 2010, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-08-04 09:48+0200\n"
+"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
+"Language-Team: Norwegian Nynorsk <l10n-no@lister.huftis.org>\n"
+"Language: nn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 19.04.3\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postboks"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Utvida adresseinformasjon"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Adresse"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Stad"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Område"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postnummer"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Leveringsetikett"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Lokal"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internasjonal"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Post"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Pakke"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Heime"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Arbeid"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Føretrekt adresse"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Anna"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unik identifikator"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Namn"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formatert namn"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Etternamn"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Fornamn"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Andre namn"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Titlar før namnet"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Titlar etter namnet"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Kallenamn"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Fødselsdag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Adresse, heime"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Postboks, heime"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Poststad, heime"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Delstat/region, heime"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Postnummer, heime"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Land, heime"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Merkelapp, heime"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Adresse, firma"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Postboks, firma"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Poststad, firma"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Delstat/region, firma"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Postnummer, firma"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Land, firma"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Merkelapp, firma"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Heimetelefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Jobbtelefon"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiltelefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Heimefaks"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Firmafaks"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Biltelefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Personsøkjar"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-postadresse"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-postklient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Tidssone"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografisk plassering"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Tittel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rolle"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisasjon"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Avdeling"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Notat"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produktidentifikasjon"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Revisjonsdato"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorter streng"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Heimeside"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Tryggleiksklasse"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Lyd"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Frøken"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Herr"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Fru"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Fr."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Ukjent felt"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Alle"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Vanleg"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresse"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-post"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personleg"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Tilpassa"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Udefinert"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Tilpassa"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Ukjend type"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonnummer"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Heime"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Arbeid"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Meldingsteneste"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Føretrekt"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Stemme"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Postkasse"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Bil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Anna"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Føretrekt nummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Faks, arbeid"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Offentleg"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidensiell"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Ukjend type"
diff --git a/po/pa/kcontacts5.po b/po/pa/kcontacts5.po
new file mode 100644 (file)
index 0000000..a35d4d0
--- /dev/null
@@ -0,0 +1,741 @@
+# translation of kabc.po to Punjabi
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# AP S Alam <aalam@users.sf.net>, 2007.
+# A S Alam <aalam@users.sf.net>, 2007, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-02-01 08:16+0530\n"
+"Last-Translator: A S Alam <aalam@users.sf.net>\n"
+"Language-Team: ਪੰਜਾਬੀ <punjabi-users@lists.sf.net>\n"
+"Language: pa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "ਪੋਸਟ ਆਫਿਸ ਬਾਕਸ"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "ਹੋਰ ਸਿਰਨਾਵਾਂ ਜਾਣਕਾਰੀ"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "ਗਲੀ"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "ਟਿਕਾਣਾ"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "ਖੇਤਰ"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "ਪੋਸਟ ਕੋਡ"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "ਦੇਸ਼"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "ਪਚਾਉਣਯੋਗ ਲੇਬਲ"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "ਘਰੇਲੂ"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "ਅੰਤਰਰਾਸ਼ਟਰੀ"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "ਪੋਸਟ"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "ਪਾਰਸਲ"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "ਘਰ"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "ਕੰਮ"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "ਪਸੰਦੀਦਾ ਸਿਰਨਾਵਾਂ"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "ਹੋਰ"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "ਵਿਲੱਖਣ ਪਛਾਣਕਰਤਾ"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "ਨਾਂ"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "ਫਾਰਮੈਟ ਕੀਤਾ ਨਾਂ"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "ਪਰਵਾਰਿਕ ਨਾਂ"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "ਦਿੱਤਾ ਨਾਂ"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "ਹੋਰ ਨਾਂ"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "ਛੋਟਾ ਨਾਂ"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "ਜਨਮਦਿਨ"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਗਲੀ"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਪੋਸਟ ਆਫਿਸ ਬਾਕਸ"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਸ਼ਹਿਰ"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਸੂਬਾ"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਜ਼ਿਪਕੋਡ"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਦੇਸ਼"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "ਘਰ ਐਡਰੈੱਸ ਲੇਬਲ"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਗਲੀ"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਪੋਸਟ ਆਫਿਸ ਬਾਕਸ"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਸ਼ਹਿਰ"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਸੂਬਾ"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਜ਼ਿੱਪਕੋਡ"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਦੇਸ਼"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਲੇਬਲ"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "ਘਰ ਫੋਨ"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "ਵਪਾਰਕ ਫੋਨ"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "ਮੋਬਾਇਲ ਫੋਨ"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "ਫੈਕਸ ਘਰ"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "ਵਪਾਰਕ ਫੈਕਸ"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "ਕਾਰ ਫੋਨ"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "ਪੇਜ਼ਰ"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "ਈਮੇਲ ਐਡਰੈਸ"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "ਮੇਲ ਕਲਾਇਟ"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "ਟਾਈਮ ਜ਼ੋਨ"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "ਭੂਗੋਲਿਕ ਸਥਿਤੀ"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "ਟਾਈਟਲ"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "ਰੋਲ"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "ਸੰਗਠਨ"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "ਵਿਭਾਗ"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "ਨੋਟ"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "ਪਰੋਡੱਕਟ ਪਛਾਣਕਰਤਾ"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "ਰੀਵਿਜ਼ਨ ਮਿਤੀ"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "ਲੜੀਬੱਧ ਲਾਈਨ"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "ਮੁੱਖ ਪੇਜ਼"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "ਸੁਰੱਖਿਆ ਕਲਾਸ"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "ਲੋਗੋ"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "ਫੋਟੋ"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "ਸਾਊਂਡ"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "ਡਾ."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "ਕੁਮਾਰੀ"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "ਸ੍ਰੀਮਾਨ"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "ਸ੍ਰੀਮਤੀ"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "ਸ੍ਰੀਮਤੀ"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "ਪ੍ਰੋ:"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "ਜੂਨੀ"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "ਸੀਨੀ"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "ਅਣਜਾਣ ਖੇਤਰ"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "ਸਭ"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "ਅਕਸਰ"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "ਐਡਰੈੱਸ"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "ਈਮੇਲ"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "ਨਿੱਜੀ"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "ਕਸਟਮ"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "ਅਣ-ਪਰਭਾਸ਼ਿਤ"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "ਕਸਟਮ"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "ਅਣਜਾਣ ਕਿਸਮ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "ਘਰ"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "ਕੰਮ"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "ਮੈਸੰਜਰ"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "ਪਸੰਦੀਦਾ"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "ਅਵਾਜ਼"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "ਫੈਕਸ"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "ਮੋਬਾਇਲ"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "ਵੀਡਿਓ"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "ਪੱਤਰ-ਬਕਸਾ"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "ਮਾਡਮ"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "ਕਾਰ"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "ਹੋਰ"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "ਪਸੰਦੀਦਾ ਨੰਬਰ"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "ਫੈਕਸ ਕੰਮ"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "ਪਬਲਿਕ"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "ਪ੍ਰਾਈਵੇਟ"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "ਗੁਪਤ"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "ਅਣਜਾਣ ਕਿਸਮ"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "ਪਸੰਦੀਦਾ"
+
+#~ msgid "List of Emails"
+#~ msgstr "ਈਮੇਲਾਂ ਦੀ ਲਿਸਟ"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "aalam@users.sf.net"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "ਸਰੋਤ '%1' ਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "ਐਡਰੈੱਸ ਚੁਣੋ"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "ਨਾਂ"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "ਈਮੇਲ"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "ਚੁਣੇ"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "ਅਣ-ਚੁਣੇ"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "ਵੰਡ ਲਿਸਟ ਸੰਰਚਨਾ"
+
+#~ msgid "Select Email Address"
+#~ msgstr "ਈਮੇਲ ਸਿਰਨਾਵਾਂ ਚੁਣੋ"
+
+#~ msgid "Email Addresses"
+#~ msgstr "ਈਮੇਲ ਸਿਰਨਾਵਾਂ"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "ਹਾਂ"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "ਨਹੀਂ"
+
+#~ msgid "New List..."
+#~ msgstr "ਨਵੀਂ ਲਿਸਟ..."
+
+#~ msgid "Rename List..."
+#~ msgstr "ਲਿਸਟ ਨਾਂ ਬਦਲੋ"
+
+#~ msgid "Remove List"
+#~ msgstr "ਲਿਸਟ ਹਟਾਓ"
+
+#~ msgid "Available addresses:"
+#~ msgstr "ਉਪਲੱਬਧ ਸਿਰਨਾਵੀਂ:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "ਪਸੰਦੀਦਾ ਈ-ਮੇਲ"
+
+#~ msgid "Add Entry"
+#~ msgstr "ਇੰਦਰਾਜ਼ ਸ਼ਾਮਲ"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "ਈਮੇਲ"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "ਪਸੰਦੀਦਾ ਵਰਤੋਂ"
+
+#~ msgid "Change Email..."
+#~ msgstr "ਈਮੇਲ ਬਦਲੋ"
+
+#~ msgid "Remove Entry"
+#~ msgstr "ਇੰਦਰਾਜ਼ ਹਟਾਓ"
+
+#~ msgid "New Distribution List"
+#~ msgstr "ਨਵੀਂ ਵੰਡ ਲਿਸਟ"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "ਨਾਂ ਦਿਓ ਜੀ(&n):"
+
+#~ msgid "Distribution List"
+#~ msgstr "ਵੰਡ ਲਿਸਟ"
+
+#~ msgid "Please change &name:"
+#~ msgstr "ਆਪਣਾ ਨਾਂ ਬਦਲੋ ਜੀ(&n):"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "ਕੀ ਵੰਡ ਲਿਸਟ '%1' ਹਟਾਉਣੀ ਹੈ?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "ਚੁਣੇ ਸਿਰਨਾਵੀਂ:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "'%1' ਵਿੱਚ ਚੁਣੇ ਐਡਰੈੱਸ:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "ਨਹੀਂ"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard ਫਾਰਮੈਟ"
+
+#~ msgid "No description available."
+#~ msgstr "ਕੋਈ ਵੇਰਵਾ ਨਹੀਂ ਹੈ।"
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "ਲਾਕ ਫਾਇਲ ਖੋਲ੍ਹਣ ਤੋਂ ਅਸਮਰੱਥ ਹੈ।"
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "ਕਾਰਜ '%2' ਨੇ ਸਰੋਤ '%1' ਤੇ ਲਾਕ ਲਗਾਇਆ ਹੈ।"
+
+#~ msgid "Error"
+#~ msgstr "ਗਲਤੀ"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "ਅਣ-ਲਾਕ ਅਸਫਲ, ਲਾਕ ਫਾਇਲ਼ ਹੋਰ ਕਾਰਜ ਨੇ ਸੰਭਾਲ ਹੈ: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: ਸਾਰੇ ਲਾਕ ਸਫਲ ਰਹੇ ਹਨ, ਪਰ ਅਸਲ ਵਿੱਚ ਅਸਲੀ ਲਾਕਿੰਗ ਅਸਫਲ ਹੈ।"
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: ਸਾਰੇ ਲਾਕ ਅਸਫਲ।"
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "ਸਰੋਤ '%1' ਲੋਡ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ।"
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "ਸਰੋਤ '%1' ਸੰਭਾਲਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "ਸਰੋਤ '%1' ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ"
+
+#~ msgid "Default Address Book"
+#~ msgstr "ਡਿਫਾਲਟ ਐਡਰੈਸ ਬੁੱਕ"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "ਸਰੋਤ '%1' ਸੰਭਾਲਣ ਲਈ ਅਸਮਰੱਥ। ਇਹ ਲਾਕ ਹੈ।"
diff --git a/po/pl/kcontacts5.po b/po/pl/kcontacts5.po
new file mode 100644 (file)
index 0000000..333c745
--- /dev/null
@@ -0,0 +1,592 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>, 2014, 2015, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2016-12-04 10:12+0100\n"
+"Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>\n"
+"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 2.0\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Skrytka pocztowa"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Rozszerzone informacje adresowe"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Ulica"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Miejscowość"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Region"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Kod pocztowy"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Kraj"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etykieta dostarczania"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Krajowy"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Międzynarodowy"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poczta"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Parcela"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Dom"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Praca"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Domyślny adres"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Inny"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Niepowtarzalny identyfikator"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nazwa"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Sformatowana nazwa"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Nazwisko"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Imię"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Dodatkowe imiona"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Tytuły (przedrostki)"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Tytuły (przyrostki)"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Pseudonim"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Urodziny"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Adres (ulica)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Skrytka pocztowa adresu domowego"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Adres (miasto)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Adres (województwo, prowincja, stan)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Adres (kod pocztowy)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Adres (kraj)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etykieta adresowa"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Adres do pracy (ulica)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Skrytka pocztowa adresu w pracy"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Adres do pracy (miasto)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Adres do pracy (województwo, prowincja, stan)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Adres do pracy (kod pocztowy)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Adres do pracy (kraj)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Etykieta adresowa do pracy"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefon domowy"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon do pracy"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telefon komórkowy"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Domowy fax"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax w pracy"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefon w samochodzie"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adres e-mail"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Program pocztowy"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Strefa czasowa"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Położenie geograficzne"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Tytuł"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rola"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizacja"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Dział"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Notatka"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identyfikator produktu"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data wydania"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Ciąg sortujący"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Strona domowa"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Klasa bezpieczeństwa"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Zdjęcie"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Dźwięk"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Panna"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Pan"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Pani"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Pani"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Junior"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Senior"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Nieznany rodzaj pola"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Wszystkie"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Częsty"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adres"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Osobiste"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Własny"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nieokreślony"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Własny"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Nieznany rodzaj"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Numer telefonu"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Dom"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Praca"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Komunikator"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferowane"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Głosowy"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Telefon komórkowy"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Wideo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Skrzynka pocztowa"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Samochód"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Inny"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Numer preferowany"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Faks w pracy"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publiczny"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Prywatny"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Poufny"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Nieznany rodzaj"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferowany"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista adresów e-mail"
diff --git a/po/pt/kcontacts5.po b/po/pt/kcontacts5.po
new file mode 100644 (file)
index 0000000..f4fda65
--- /dev/null
@@ -0,0 +1,585 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2015-12-25 12:52+0000\n"
+"Last-Translator: José Nuno Coelho Pires <zepires@gmail.com>\n"
+"Language-Team: pt <kde-i18n-pt@kde.org>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-POFile-SpellExtra: Mails Pager LockNull Jr PCS Srt\n"
+"X-POFile-IgnoreConsistency: Name\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Caixa de Correio"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informação Estendida do Endereço"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Rua"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localidade"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Região"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Código Postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Legenda de Entrega"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Doméstico"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Parcela"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Residência"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Emprego"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Endereço Preferido"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Outro"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificador Único"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nome"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nome Formatado"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Apelido"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Nome Próprio"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nomes Adicionais"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixos Honoríficos"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufixos Honoríficos"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Alcunha"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Data de Nascimento"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Endereço da Residência"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Caixa de Correio da Residência"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Cidade do Endereço da Residência"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Província do Endereço da Residência"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Código Postal do Endereço da Residência"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "País do Endereço da Residência"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Legenda do Endereço da Residência"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Rua do Endereço de Trabalho"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Caixa de Correio do Endereço de Trabalho"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Cidade do Endereço de Trabalho"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Província do Endereço de Trabalho"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Código Postal do Endereço de Trabalho"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "País do Endereço de Trabalho"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Legenda do Endereço de Trabalho"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefone da Residência"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefone do Trabalho"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telemóvel"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax de Casa"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax do Trabalho"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefone do Carro"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "RDIS"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "'Pager'"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Endereço de E-mail"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Cliente de E-mail"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fuso-Horário"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posição Geográfica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Título"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Papel"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organização"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departamento"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificador do Produto"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data de Revisão"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Texto de Ordenação"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Página Web"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe de Segurança"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logótipo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotografia"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Som"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Menina"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Srª."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Srtª."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Campo Desconhecido"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Tudo"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frequente"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Endereço"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Pessoal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalizado"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Indefinido"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalizada"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipo desconhecido"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Número de telefone"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Residência"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Emprego"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mensageiro"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferido"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voz"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Telemóvel"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vídeo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Caixa de Correio"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "vCard"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Outro"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Número Preferido"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax do Emprego"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Público"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privado"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidencial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipo desconhecido"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferido"
diff --git a/po/pt_BR/kcontacts5.po b/po/pt_BR/kcontacts5.po
new file mode 100644 (file)
index 0000000..55d7928
--- /dev/null
@@ -0,0 +1,591 @@
+# Translation of kcontacts5.po to Brazilian Portuguese
+# Copyright (C) 2014-2015 This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# André Marcelo Alvarenga <alvarenga@kde.org>, 2014, 2015.
+# Luiz Fernando Ranghetti <elchevive@opensuse.org>, 2020, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2021-02-17 14:20-0300\n"
+"Last-Translator: Luiz Fernando Ranghetti <elchevive@opensuse.org>\n"
+"Language-Team: Brazilian Portuguese <kde-i18n-pt_BR@kde.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Lokalize 20.04.2\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Caixa postal"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informação estendida do endereço"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Rua"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localidade"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Região"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "CEP"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiqueta de entrega"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Nacional"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internacional"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Encomenda"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Residencial"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Comercial"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Endereço preferido"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Outro"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificador único"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nome"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nome formatado"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Sobrenome"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Primeiro nome"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nomes adicionais"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixos honoríficos"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufixos honoríficos"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Nome de exibição"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Aniversário"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Endereço residencial"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Caixa de correio do endereço residencial"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Cidade do endereço residencial"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Estado do endereço residencial"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "CEP do endereço residencial"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "País do endereço residencial"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Legenda do endereço residencial"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Endereço comercial"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Caixa de correio do endereço comercial"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Cidade do endereço comercial"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Estado do endereço comercial"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "CEP do endereço comercial"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "País do endereço comercial"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Legenda do endereço comercial"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefone residencial"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefone comercial"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Celular"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax residencial"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax comercial"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefone do carro"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+# Dispositivo eletrônico "Bip". (Alvarenga)
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Endereço de e-mail"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Cliente de e-mail"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fuso horário"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Posição geográfica"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Título"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Função"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Empresa"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departamento"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Observação"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificador do produto"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data de revisão"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "String de ordenação"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Site"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Classe de segurança"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotipo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Som"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr(a)."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Srta."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Sr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Srª."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Srª."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof(a)."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Campo desconhecido"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Todos"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frequente"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Endereço"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Pessoal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalizado"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Não definido"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalizada"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tipo desconhecido"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Número do telefone"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Residencial"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Comercial"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mensageiro"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferido"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voz"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Celular"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Vídeo"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Caixa de e-mail"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Carro"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Outro"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Número preferido"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax comercial"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Público"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privado"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidencial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tipo desconhecido"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferido"
diff --git a/po/ro/kcontacts5.po b/po/ro/kcontacts5.po
new file mode 100644 (file)
index 0000000..33a4b41
--- /dev/null
@@ -0,0 +1,744 @@
+# translation of kabc to Romanian
+# Copyright (C) 2008 This_file_is_part_of_KDE
+# This file is distributed under the same license as the kabc package.
+# Laurenţiu Buzdugan <lbuz@rolix.org>, 2008".
+# Sergiu Bivol <sergiu@cip.md>, 2008, 2009, 2013, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2020-09-07 00:06+0100\n"
+"Last-Translator: Sergiu Bivol <sergiu@cip.md>\n"
+"Language-Team: Romanian\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
+"20)) ? 1 : 2;\n"
+"X-Generator: Lokalize 19.12.3\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Căsuță poștală"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informații adresă extinse"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Strada"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Localitate"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regiune"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Cod poștal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Țară"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etichetă livrare"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domiciliu"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internațională"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poștală"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Colet"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Acasă"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Serviciu"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Adresa preferată"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Alta"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identificator unic"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nume"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Nume formatat"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Nume de familie"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Prenume"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Nume suplimentare"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefixe onorifice"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Sufixe onorifice"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Poreclă"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Zi de naștere"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Strada adresei de acasă"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Căsuța poștală a adresei de acasă"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Orașul adresei de acasă"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Statul adresei de acasă"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Cod poștal al adresei de acasă"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Țara adresei de acasă"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Eticheta adresei de acasă"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Strada adresei de afaceri"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Căsuța poștală a adresei de afaceri"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Orașul adresei de afaceri"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Statul adresei de afaceri"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Cod poștal al adresei de afaceri"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Țara adresei de afaceri"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Eticheta adresei de afaceri"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefon la domiciliu"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon de afaceri"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telefon mobil"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax acasă"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax de afaceri"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefon în mașină"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adresă de e-mail"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Program de poștă electronică"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fus orar"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Poziție geografică"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titlu"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Rol"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizație"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departament"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Notă"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identificator produs"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Dată revizie"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sortează șirul"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Pagină WEB"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Clasă de securitate"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotografie"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Sunet"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Domnișoara"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Dl."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "D-na."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "D-șoara."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Câmp necunoscut"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Toate"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Frecvent"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresă"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Email"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Personalizat"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nedefinit"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Personalizat"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Tip necunoscut"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Număr de telefon"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Acasă"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Serviciu"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mesager"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Preferat"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Voce"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Cutie poștală"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Mașină"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Alta"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Număr preferat"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax serviciu"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Public"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Confidențial"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Tip necunoscut"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferată"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista adreselor"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Sergiu Bivol"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "sergiu@ase.md"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Imposibil de încărcat resursa „%1”"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Alege destinatar"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Nume"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Selectat"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Deselectează"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Configurează liste de disctribuție"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Alege adresa de email"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Adrese e-mail"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nu"
+
+#~ msgid "New List..."
+#~ msgstr "Listă nouă..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Redenumire listă..."
+
+#~ msgid "Remove List"
+#~ msgstr "Elimină lista"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Adrese disponibile:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Email preferat"
+
+#~ msgid "Add Entry"
+#~ msgstr "Adaugă înregistrare"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Utilizează preferat"
+
+#~ msgid "Change Email..."
+#~ msgstr "Schimbare email..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Elimină înregistrarea"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Listă de distribuție nouă"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Introduceți de&numirea:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Listă de distribuție"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Schimbați de&numirea:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Ștergeți lista de distribuție „%1”?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Destinatari aleși:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nu"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Format vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Nicio descriere disponibilă."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Imposibil de deschis fișierul de blocare."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Resursa „%1” este blocată de aplicația „%2”."
+
+#~ msgid "Error"
+#~ msgstr "Eroare"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Deblocarea a eșuat. Fișierul de blocare este deținut de alt proces: %1 "
+#~ "(%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Toate blocările reușesc dar nu are loc blocarea propriu-zisă."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Toate blocările eșuează."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Încărcarea resursei „%1” a eșuat."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Salvarea resursei „%1” a eșuat."
+
+#, fuzzy
+#~| msgid "Unable to load resource '%1'"
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Imposibil de încărcat resursa „%1”"
+
+#~ msgid "Default Address Book"
+#~ msgstr "Carte de adrese implicită"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Imposibil de salvat în resursa „%1”. Este blocată."
diff --git a/po/ru/kcontacts5.po b/po/ru/kcontacts5.po
new file mode 100644 (file)
index 0000000..69b5929
--- /dev/null
@@ -0,0 +1,751 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Чуплыгин Сергей <neochapay@gmail.com>, 2007.
+# Nick Shaforostoff <shaforostoff@kde.ru>, 2007, 2008.
+# Andrey Cherepanov <skull@kde.ru>, 2009.
+# Alexander Potashev <aspotashev@gmail.com>, 2010, 2011, 2016.
+# Alexander Yavorsky <kekcuha@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-01-19 15:09+0300\n"
+"Last-Translator: Alexander Yavorsky <kekcuha@gmail.com>\n"
+"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 18.12.1\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Абонентский ящик"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Расширенная информация об адресе"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Улица"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Населённый пункт"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Область"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Почтовый индекс"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Страна"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Наклейка на конверт"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Адрес внутри страны"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Международный адрес"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Адрес для корреспонденции"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Адрес для посылок"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Домашний адрес"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Служебный адрес"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Основной адрес"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Другой адрес"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Уникальный идентификатор"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Имя"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Полное имя"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Фамилия"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Имя"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Дополнительные имена"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Почтительное обращение (в начале)"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Почтительное обращение (в конце)"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Ник"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "День рождения"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Домашний адрес: улица"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Домашний адрес: а/я"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Домашний адрес: город"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Домашний адрес: область/край"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Домашний адрес: индекс"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Домашний адрес: страна"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Домашний адрес: наклейка"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Служебный адрес: улица"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Служебный адрес: а/я"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Служебный адрес: город"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Служебный адрес: область/край"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Служебный адрес: индекс"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Служебный адрес: страна"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Служебный адрес: наклейка"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Домашний телефон"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Служебный телефон"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Мобильный телефон"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Домашний факс"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Служебный факс"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Телефон в автомобиле"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Пейджер"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Адрес электронной почты"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Почтовый клиент"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Часовой пояс"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Географическое местоположение"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Обращение"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Должность"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Организация"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Отдел"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Заметка"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Идентификатор продукта"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Дата изменения"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Сортировка"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Веб-сайт"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Класс безопасности"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Логотип"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Фотография"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Звуковой файл"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Д-р"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Г-жа"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Г-н"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Г-жа"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Г-жа"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Проф."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "мл."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "ст."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Неизвестное поле"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Все"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Часто используемые"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Адрес"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Адрес электронной почты"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Персональный"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Другой"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Не определён"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Другой"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Неизвестный тип"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Номер телефона"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Домашний телефон"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Служебный телефон"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Мгновенные сообщения"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Основной телефон"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Обычный"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Мобильный"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Видеофон"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Голосовая почта"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Телефон в автомобиле"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Другой тип"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Основной номер"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Служебный факс"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Доступен всем"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Приватный доступ"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Конфиденциальный доступ"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Неизвестный доступ"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Основной адрес"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Чуплыгин Сергей, Николай Шафоростов"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "chapay_s@list.ru, shaforostoff@kde.ru"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Невозможно открыть источник «%1»"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Выбор адресата"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Имя"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Адрес электронной почты"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Выбрано"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Отменить выбор"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Настройка списков рассылки"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Выбор адресов электронной почты"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Адреса электронной почты"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Да"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Нет"
+
+#~ msgid "New List..."
+#~ msgstr "Новый список..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Переименовать список..."
+
+#~ msgid "Remove List"
+#~ msgstr "Удалить список..."
+
+#~ msgid "Available addresses:"
+#~ msgstr "Доступные адреса:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Основной адрес"
+
+#~ msgid "Add Entry"
+#~ msgstr "Добавить адрес"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Адрес электронной почты"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Использовать основной"
+
+#~ msgid "Change Email..."
+#~ msgstr "Изменить адрес..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Удалить адрес"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Новый список рассылки"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Введите &имя:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Список рассылки"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Измените &имя:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Удалить список рассылки «%1»?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Выбранные адреса:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Выбранные адреса в «%1»:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Не основной"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Формат vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Описание отсутствует."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Невозможно открыть файл блокировки."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Источник «%1» заблокирован приложением «%2»."
+
+#~ msgid "Error"
+#~ msgstr "Ошибка"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Ошибка разблокирования. Файл блокировки принадлежит другому процессу: %1 "
+#~ "(%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: все операции блокировки выполнены успешно, но никаких "
+#~ "блокировок не установлено."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: блокировки не выполнены."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Невозможно открыть источник «%1»."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Невозможно сохранить в источнике «%1»."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Не удалось открыть источник «%1»."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Адресная книга по умолчанию"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Невозможно сохранить в источнике «%1»: источник заблокирован."
+
+#~ msgid "List of Emails"
+#~ msgstr "Список адресов"
diff --git a/po/se/kcontacts5.po b/po/se/kcontacts5.po
new file mode 100644 (file)
index 0000000..06aeb55
--- /dev/null
@@ -0,0 +1,586 @@
+# Translation of kcontacts5 to Northern Sami
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2007-09-11 22:44+0200\n"
+"Last-Translator: Northern Sami translation team <i18n-sme@lister.ping.uio."
+"no>\n"
+"Language-Team: Northern Sami <l10n-no@lister.huftis.org>\n"
+"Language: se\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Environment: kde\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr ""
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr ""
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr ""
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr ""
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr ""
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr ""
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr ""
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr ""
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr ""
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr ""
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr ""
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr ""
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr ""
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr ""
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr ""
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr ""
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr ""
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr ""
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr ""
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr ""
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr ""
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr ""
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr ""
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr ""
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr ""
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr ""
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr ""
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr ""
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr ""
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr ""
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr ""
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr ""
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr ""
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr ""
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr ""
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr ""
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr ""
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr ""
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr ""
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr ""
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr ""
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr ""
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr ""
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr ""
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr ""
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr ""
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr ""
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr ""
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr ""
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr ""
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr ""
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr ""
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr ""
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr ""
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr ""
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr ""
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr ""
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr ""
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr ""
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr ""
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr ""
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr ""
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr ""
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr ""
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr ""
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr ""
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr ""
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr ""
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr ""
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr ""
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr ""
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr ""
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr ""
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr ""
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr ""
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr ""
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr ""
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr ""
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr ""
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr ""
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr ""
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr ""
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr ""
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr ""
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr ""
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr ""
diff --git a/po/sk/kcontacts5.po b/po/sk/kcontacts5.po
new file mode 100644 (file)
index 0000000..93621fa
--- /dev/null
@@ -0,0 +1,589 @@
+# translation of kabc5.po to Slovak
+# Roman Paholík <wizzardsk@gmail.com>, 2014, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2015-12-26 14:17+0100\n"
+"Last-Translator: Roman Paholik <wizzardsk@gmail.com>\n"
+"Language-Team: Slovak <kde-sk@linux.sk>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poštová schránka"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Rozšírené adresové informácie"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Ulica"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Lokalita"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Región"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "PSČ"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Krajina"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Návestie doručenia"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domáci"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Medzinárodný"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poštový"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Balík"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Doma"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Práca"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Preferovaná adresa"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Ostatné"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Jedinečný identifikátor"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Názov"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formátované meno"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Priezvisko"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Krstné meno"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Ďalšie mená"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Titul pred menom"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Titul za menom"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Prezývka"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Narodeniny"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Adresa domov - ulica"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Poštová schránka domácej adresy"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Adresa domov - mesto"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Adresa domov - štát"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Adresa domov - PSČ"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Adresa domov - krajina"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Návestie adresy domov"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Adresa  - ulica"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Poštová schránka pracovnej adresy"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Adresa do zamestnania - mesto"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Adresa do zamestnania - štát"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Adresa do zamestnania - PSČ"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Adresa do zamestnania - krajina"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Návestie adresy do zamestnania"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefón domov"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefón do práce"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobilný telefón"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Fax domov"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Fax do práce"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefón v aute"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-mailová adresa"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Poštový klient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Časové pásmo"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografická pozícia"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titul"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Funkcia"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizácia"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Oddelenie"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Poznámka"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identifikátor produktu"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Dátum revízie"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Zoradiť reťazec"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Domovská stránka"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Trieda bezpečnosti"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotka"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Zvuk"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Slečna"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Pán"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Pani"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Slečna"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Neznáme pole"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Všetko"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Častý"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresa"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-mail"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Osobné"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Vlastné"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nedefinované"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Vlastné"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Neznámy typ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefóne číslo"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Domov"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Práca"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Doručovateľ"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Uprednostňovaný"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Hlas"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Mailbox"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Auto"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Ostatné"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Uprednostňované číslo"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax do práce"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Verejný"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Súkromný"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Dôverné"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Neznámy typ"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Preferovaný"
+
+#~ msgid "List of Emails"
+#~ msgstr "Zoznam  emailov"
diff --git a/po/sl/kcontacts5.po b/po/sl/kcontacts5.po
new file mode 100644 (file)
index 0000000..b3f0e94
--- /dev/null
@@ -0,0 +1,747 @@
+# translation of kabc.po to Slovenian
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Andrej Vernekar <andrej.vernekar@moj.net>, 2007, 2008, 2010.
+# Jure Repinc <jlp@holodeck1.com>, 2009, 2012.
+# Andrej Mernik <andrejm@ubuntu.si>, 2014, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2020-02-27 12:57+0100\n"
+"Last-Translator: \n"
+"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Translator: Andrej Mernik <andrejm@ubuntu.si>\n"
+"X-Generator: Poedit 2.3\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poštni predal"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Razširjeni podatki o naslovu"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Ulica"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Ime pošte"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Območje"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Poštna številka"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Država"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Oznaka za dostavo"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Notranji"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Mednarodni"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poštni"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paketni"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Domači"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Službeni"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Prednostni naslov"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Drugi"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Edinstven določilnik"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ime"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Oblikovano ime"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Priimek"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Dano ime"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Dodatna imena"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Častne predpone"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Častne pripone"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Vzdevek"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Rojstni dan"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Ulica domačega naslova"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Poštni predal domačega naslova"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Mesto domačega naslova"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Zvezna država domačega naslova"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Poštna številka domačega naslova"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Država domačega naslova"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Oznaka domačega naslova"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Ulica poslovnega naslova"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Poštni predal poslovnega naslova"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Mesto poslovnega naslova"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Zvezna država poslovnega naslova"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Poštna številka poslovnega naslova"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Država poslovnega naslova"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Oznaka poslovnega naslova"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Domači telefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Poslovni telefon"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Prenosni telefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Domači faks"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Poslovni faks"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Avtomobilski telefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pozivnik"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-poštni naslov"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Poštni odjemalec"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Časovni pas"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografski položaj"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Naziv"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Vloga"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizacija"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Oddelek"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Opomba"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Določilnik izdelka"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Datum predelave"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Niz za razvrščanje"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Domača stran"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Varnostni razred"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotip"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotografija"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Zvok"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Gdč."
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "G."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Ga."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ga./Gdč."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "ml."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "st."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Neznano polje"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Vse"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Pogosto"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Naslov"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-pošta"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Osebno"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Po meri"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Nedoločeno"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Po meri"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Neznana vrsta"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonska številka"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Domači"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Službeni"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Sporočilnik"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Prednostni"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Glasovna pošta"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Prenosni"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Poštni predal"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Avtomobilski"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Drugo"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Prednostna številka"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Službeni faks"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Javen"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Zasebni"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Zaupni"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Neznana vrsta"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Prednostni"
+
+#~ msgid "List of Emails"
+#~ msgstr "Seznam e-pošt"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Jure Repinc,Andrej Vernekar,Gregor Rakar"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "jlp@holodeck1.com,andrej.vernekar@gmail.com,gregor.rakar@kiss.si"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Ni moč naložiti vira »%1«"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Izberite naslovnika"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Ime"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-pošta"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Izbrano"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Odizberi"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Nastavi sezname za razpošiljanje"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Izberite e-poštni naslov"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-poštni naslovi"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "New List..."
+#~ msgstr "Nov seznam ..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Preimenuj seznam ..."
+
+#~ msgid "Remove List"
+#~ msgstr "Odstrani seznam"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Razpoložljivi naslovi:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Prednostna e-pošta"
+
+#~ msgid "Add Entry"
+#~ msgstr "Dodaj vnos"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-pošta"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Uporabi prednostno"
+
+#~ msgid "Change Email..."
+#~ msgstr "Spremeni e-pošto ..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Odstrani vnos"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Nov seznam za razpošiljanje"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "V&nesite ime:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Seznam za razpošiljanje"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Spreme&nite ime:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Ali izbrišem seznam za razpošiljanje »%1«?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Izbrani naslovniki:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Izbrani naslovi v »%1«:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Ne"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "Oblika vCard"
+
+#~ msgid "No description available."
+#~ msgstr "Opis ni na voljo."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Ni moč odpreti zaklepne datoteke."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Program »%2« je zaklenil vir »%1«."
+
+#~ msgid "Error"
+#~ msgstr "Napaka"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Odklepanje ni uspelo. Zaklepno datoteko si lasti drug proces: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Vsa zaklepanja so uspela, vendar noben dejansko ni bil "
+#~ "opravljen."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Vsa zaklepanja odpovedo."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Nalaganje vira »%1« ni uspelo."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Shranjevanje vira »%1« ni uspelo."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Ni moč odpreti vira »%1«"
+
+#~ msgid "Default Address Book"
+#~ msgstr "Privzeti imenik"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Ni moč shraniti v vir »%1«, je zaklenjen."
diff --git a/po/sq/kcontacts5.po b/po/sq/kcontacts5.po
new file mode 100644 (file)
index 0000000..70f0eda
--- /dev/null
@@ -0,0 +1,746 @@
+# Albanian translation for kdepimlibs
+# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009
+# This file is distributed under the same license as the kdepimlibs package.
+#
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
+# Agron Selimaj <as9902613@gmail.com>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdepimlibs\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2021-03-24 11:00-0400\n"
+"Last-Translator: Agron Selimaj <as9902613@gmail.com>\n"
+"Language-Team: kdeshqip\n"
+"Language: sq\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-04-21 22:43+0000\n"
+"X-Generator: Lokalize 20.12.3\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Kuti Zyre Postale"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Informacion i Zgjeruar i Adresës"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Rruga"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Lokaliteti"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Rajoni"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Kodi Postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Vendi"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Kodi i Shpërndarjes"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Vendas"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Ndërkombëtar"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Postal"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Dëftesa"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Shtëpia"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Puna"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Adresa e Preferuar"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Të Tjera"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Identifikues i Vetëm"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Emri"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Emër i Formatuar"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Mbiemri"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Emri i dhënë"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Emra Shtesë"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Prefikse Nderimi"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Shtesa Nderimi"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "I Mbiquajtur"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Ditëlindja"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Rruga e Adresës së Shtëpisë"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Kutia e Zyrës Postare të Adresës së Shtëpisë"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Qyteti i Adresës së Shtëpisë"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Shteti i Adresës së Shtëpisë"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Zip Kodi i Adresës së Shtëpisë"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Vendi i Adresës së Shtëpisë"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Etiketa e Adresës së Shtëpisë"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Adresa e Rrugës së Biznesit"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Kutia e Zyrës Postare të Adresës së Biznesit"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Qyteti i Adresës së Biznesit"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Shteti i Adresës së Biznesit"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Kodi Zip i Adresës së Biznesit"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Vendi i Adresës së Biznesit"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Shënimi i Adresës së Biznesit"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Telefoni i Shtëpisë"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefoni i Zyrës"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Telefoni Celular"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Faksi i Shtëpisë"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Faksi i Zyrës"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Telefoni në makinë"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Pager"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Adresa Email"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Klient Poste"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zona Kohore"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Pozicioni Gjeografik"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titulli"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Roli"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organizata"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departamenti"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Shënim"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Identifikuesi i Produktit"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Data e Rishikimit"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Shiriti i Nisjes"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Faqja Kryesore"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Shkalla e Sigurisë"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Stema"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Zëri"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Zonjusha"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Zoti"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Zonja"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Zonja"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Zt."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Fushë e Panjohur"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Të Gjitha"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Shpesh"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adresa"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Email"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personale"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "E Personalizuar"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "E papërcaktuar"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "E Personalizuar"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Lloj i panjohur"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Numri i telefonit"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Shtëpia"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Puna"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Messenger"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "I Preferuar"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Zë"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Telefon Celular"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Kuti Postare"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Makina"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Të Tjera"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Numri i Preferuar"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Faks Pune"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Publike"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Private"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Në konfidencë"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Lloj i panjohur"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "I Preferuar"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista e email-eve"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "KDE Shqip, Launchpad Contributions: Vilson Gjeci"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "kde-shqip@yahoogroups.com,vilsongjeci@gmail.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Nuk qemë në gjendje të ngarkojmë resursin '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Zgjidhni të Adresuarin"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Emri"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "I zgjedhur"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Hiqe Përzgjedhjen"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Konfiguro Listat Shpërndarëse"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Zgjidh Adresën Email"
+
+#~ msgid "Email Addresses"
+#~ msgstr "Adresat Email"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Po"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Jo"
+
+#~ msgid "New List..."
+#~ msgstr "Listë E Re..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Riemërto Listën..."
+
+#~ msgid "Remove List"
+#~ msgstr "Hiqe Listën"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Adresat e Disponueshme:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Email i Preferuar"
+
+#~ msgid "Add Entry"
+#~ msgstr "Shto Hyrje"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "Email"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Përdor të Preferuarat"
+
+#~ msgid "Change Email..."
+#~ msgstr "Ndrysho Email..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Hiqe Hyrjen"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Listë e Re Distribucioni"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Ju lutemi vendosni një &emër:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Lista e Distribucioneve"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Ju lutemi ndryshoni &emrin:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Ta fshij listën e distribucionit '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Adresat e përzgjedhura:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Adresat e përzgjedhura në '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Jo"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard Format"
+
+#~ msgid "No description available."
+#~ msgstr "Asnjë përshkrim në dispozicion."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Nuk mundëm të hapim skedarin e bllokuar."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Resursi '%1' është bllokuar nga programi '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Gabim"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Zhbllokimi dështoi. Skedari i bllokuar po përdoret nga një proçes tjetër: "
+#~ "%1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr ""
+#~ "LockNull: Të gjitha bllokimet ndodhën pro nuk u krye asnjë bllokim aktual."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Të gjitha bllokimet dështuan."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Ngarkimi i resursit '%1' dështoi."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Ruajtja e resursit '%1' dështoi."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Nuk jemi në gjendje të hapim burimin '%1'."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Libri i Parazgjedhur i Adresave"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr ""
+#~ "Nuk qemë në gjendje të regjistrojmë në resursin '%1'. Është i bllokuar."
diff --git a/po/sr/kcontacts5.po b/po/sr/kcontacts5.po
new file mode 100644 (file)
index 0000000..74dbf03
--- /dev/null
@@ -0,0 +1,606 @@
+# Translation of kcontacts5.po into Serbian.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2007, 2009, 2015, 2017.
+# Dalibor Djuric <dalibor.djuric@mozilla-srbija.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2019-12-03 02:53+0100\n"
+"PO-Revision-Date: 2015-12-26 22:15+0100\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#: address.cpp:397
+#, kde-format
+msgid "Post Office Box"
+msgstr "Поштански фах"
+
+#: address.cpp:413
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Додатни адресни подаци"
+
+#: address.cpp:429
+#, kde-format
+msgid "Street"
+msgstr "Улица"
+
+#: address.cpp:445
+#, kde-format
+msgid "Locality"
+msgstr "Локалитет"
+
+#: address.cpp:461
+#, kde-format
+msgid "Region"
+msgstr "Регија"
+
+#: address.cpp:477
+#, kde-format
+msgid "Postal Code"
+msgstr "Поштански број"
+
+#: address.cpp:493
+#, kde-format
+msgid "Country"
+msgstr "Држава"
+
+#: address.cpp:509
+#, kde-format
+msgid "Delivery Label"
+msgstr "Етикета испоруке"
+
+#: address.cpp:527
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Домаћа"
+
+#: address.cpp:529
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Међународна"
+
+#: address.cpp:531
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Поштанска"
+
+#: address.cpp:533
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Пакетна"
+
+# >> @label Address type
+#: address.cpp:535
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Кућна"
+
+# >> @label Address type
+#: address.cpp:537
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Пословна"
+
+# >> @label Address type
+#: address.cpp:539
+#, kde-format
+msgid "Preferred Address"
+msgstr "Пожељна адреса"
+
+#: address.cpp:541
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Друга"
+
+#: addressee.cpp:433
+#, kde-format
+msgid "Unique Identifier"
+msgstr "јединствени идентификатор"
+
+#: addressee.cpp:453
+#, kde-format
+msgid "Name"
+msgstr "име и презиме"
+
+#: addressee.cpp:649
+#, kde-format
+msgid "Formatted Name"
+msgstr "форматирано име"
+
+#: addressee.cpp:669
+#, kde-format
+msgid "Family Name"
+msgstr "презиме"
+
+#: addressee.cpp:689
+#, kde-format
+msgid "Given Name"
+msgstr "име"
+
+#: addressee.cpp:709
+#, kde-format
+msgid "Additional Names"
+msgstr "додатна имена"
+
+#: addressee.cpp:729
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "титуларни префикси"
+
+#: addressee.cpp:749
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "титуларни суфикси"
+
+#: addressee.cpp:800
+#, kde-format
+msgid "Nick Name"
+msgstr "надимак"
+
+#: addressee.cpp:840
+#, kde-format
+msgid "Birthday"
+msgstr "рођендан"
+
+#: addressee.cpp:845
+#, kde-format
+msgid "Home Address Street"
+msgstr "кућна адреса, улица"
+
+#: addressee.cpp:850
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "кућна адреса, поштански фах"
+
+#: addressee.cpp:855
+#, kde-format
+msgid "Home Address City"
+msgstr "кућна адреса, град"
+
+#: addressee.cpp:860
+#, kde-format
+msgid "Home Address State"
+msgstr "кућна адреса, република"
+
+#: addressee.cpp:865
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "кућна адреса, поштански број"
+
+#: addressee.cpp:870
+#, kde-format
+msgid "Home Address Country"
+msgstr "кућна адреса, држава"
+
+#: addressee.cpp:875
+#, kde-format
+msgid "Home Address Label"
+msgstr "кућна адреса, етикета"
+
+#: addressee.cpp:880
+#, kde-format
+msgid "Business Address Street"
+msgstr "пословна адреса, улица"
+
+#: addressee.cpp:885
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "пословна адреса, поштански фах"
+
+#: addressee.cpp:890
+#, kde-format
+msgid "Business Address City"
+msgstr "пословна адреса, град"
+
+#: addressee.cpp:895
+#, kde-format
+msgid "Business Address State"
+msgstr "пословна адреса, република"
+
+#: addressee.cpp:900
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "пословна адреса, поштански број"
+
+#: addressee.cpp:905
+#, kde-format
+msgid "Business Address Country"
+msgstr "пословна адреса, држава"
+
+#: addressee.cpp:910
+#, kde-format
+msgid "Business Address Label"
+msgstr "пословна адреса, етикета"
+
+#: addressee.cpp:915
+#, kde-format
+msgid "Home Phone"
+msgstr "кућни телефон"
+
+#: addressee.cpp:920
+#, kde-format
+msgid "Business Phone"
+msgstr "пословни телефон"
+
+#: addressee.cpp:925
+#, kde-format
+msgid "Mobile Phone"
+msgstr "мобилни телефон"
+
+#: addressee.cpp:930 phonenumber.cpp:231
+#, kde-format
+msgid "Home Fax"
+msgstr "Кућни факс"
+
+#: addressee.cpp:935
+#, kde-format
+msgid "Business Fax"
+msgstr "пословни факс"
+
+#: addressee.cpp:940
+#, kde-format
+msgid "Car Phone"
+msgstr "телефон у колима"
+
+#: addressee.cpp:945 phonenumber.cpp:207
+#, kde-format
+msgid "ISDN"
+msgstr "ИСДН"
+
+#: addressee.cpp:950 phonenumber.cpp:211
+#, kde-format
+msgid "Pager"
+msgstr "Пејџер"
+
+#: addressee.cpp:955
+#, kde-format
+msgid "Email Address"
+msgstr "адреса е‑поште"
+
+#: addressee.cpp:975
+#, kde-format
+msgid "Mail Client"
+msgstr "поштански клијент"
+
+#: addressee.cpp:995
+#, kde-format
+msgid "Time Zone"
+msgstr "временска зона"
+
+#: addressee.cpp:1015
+#, kde-format
+msgid "Geographic Position"
+msgstr "географски положај"
+
+#: addressee.cpp:1066
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "титула"
+
+#: addressee.cpp:1117
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "положај"
+
+#: addressee.cpp:1168 field.cpp:241
+#, kde-format
+msgid "Organization"
+msgstr "организација"
+
+#: addressee.cpp:1188
+#, kde-format
+msgid "Department"
+msgstr "одељење"
+
+#: addressee.cpp:1208
+#, kde-format
+msgid "Note"
+msgstr "напомена"
+
+#: addressee.cpp:1228
+#, kde-format
+msgid "Product Identifier"
+msgstr "идентификатор производа"
+
+#: addressee.cpp:1248
+#, kde-format
+msgid "Revision Date"
+msgstr "датум ревизије"
+
+#: addressee.cpp:1268
+#, kde-format
+msgid "Sort String"
+msgstr "ниска за ређање"
+
+#: addressee.cpp:1294
+#, kde-format
+msgid "Homepage"
+msgstr "домаћа страница"
+
+#: addressee.cpp:1314
+#, kde-format
+msgid "Security Class"
+msgstr "безбедносна класа"
+
+#: addressee.cpp:1334
+#, kde-format
+msgid "Logo"
+msgstr "логотип"
+
+#: addressee.cpp:1354
+#, kde-format
+msgid "Photo"
+msgstr "фотографија"
+
+#: addressee.cpp:1374
+#, kde-format
+msgid "Sound"
+msgstr "звук"
+
+#: addresseehelper.cpp:74
+#, kde-format
+msgid "Dr."
+msgstr "др"
+
+#: addresseehelper.cpp:75
+#, kde-format
+msgid "Miss"
+msgstr "гђица"
+
+#: addresseehelper.cpp:76
+#, kde-format
+msgid "Mr."
+msgstr "гдин"
+
+#: addresseehelper.cpp:77
+#, kde-format
+msgid "Mrs."
+msgstr "гђа"
+
+#: addresseehelper.cpp:78
+#, kde-format
+msgid "Ms."
+msgstr "гђица"
+
+#: addresseehelper.cpp:79
+#, kde-format
+msgid "Prof."
+msgstr "проф."
+
+#: addresseehelper.cpp:81
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:82
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:83
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:84
+#, kde-format
+msgid "Jr."
+msgstr "млађи"
+
+#: addresseehelper.cpp:85
+#, kde-format
+msgid "Sr."
+msgstr "старији"
+
+#: field.cpp:218
+#, kde-format
+msgid "Unknown Field"
+msgstr "непознато поље"
+
+# >> @item category of fields
+#: field.cpp:231
+#, kde-format
+msgid "All"
+msgstr "сва"
+
+# >> @item category of fields
+#: field.cpp:233
+#, kde-format
+msgid "Frequent"
+msgstr "честа"
+
+# >> @item category of fields
+#: field.cpp:235
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "адреса"
+
+# >> @item category of fields
+#: field.cpp:237
+#, kde-format
+msgid "Email"
+msgstr "е‑пошта"
+
+# >> @item category of fields
+#: field.cpp:239
+#, kde-format
+msgid "Personal"
+msgstr "лична"
+
+# >> @item category of fields
+#: field.cpp:243
+#, kde-format
+msgid "Custom"
+msgstr "посебна"
+
+# >> @item category of fields
+#: field.cpp:245
+#, kde-format
+msgid "Undefined"
+msgstr "недефинисана"
+
+#: key.cpp:214
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "Икс.509"
+
+#: key.cpp:217
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "ПГП"
+
+#: key.cpp:220
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "посебан"
+
+#: key.cpp:223
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "непознат"
+
+#: phonenumber.cpp:183
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Број телефона"
+
+# >> @label Communication resource: home phone
+#: phonenumber.cpp:185
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Кућни"
+
+# >> @label Communication resource: work phone
+#: phonenumber.cpp:187
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Пословни"
+
+# >> @label Communication resource
+#: phonenumber.cpp:189
+#, kde-format
+msgid "Messenger"
+msgstr "Гласник"
+
+# >> @label Communication resource: preferred phone
+#: phonenumber.cpp:191
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Пожељни"
+
+# >> @label Communication resource
+#: phonenumber.cpp:193
+#, kde-format
+msgid "Voice"
+msgstr "Гласовни"
+
+# >> @label Communication resource
+#: phonenumber.cpp:195
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:197
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Мобилни"
+
+#: phonenumber.cpp:199
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Видео"
+
+# >> @label Communication resource
+#: phonenumber.cpp:201
+#, kde-format
+msgid "Mailbox"
+msgstr "Сандуче"
+
+# >> @label Communication resource
+#: phonenumber.cpp:203
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+# >> @label Communication resource
+#: phonenumber.cpp:205
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "У колима"
+
+#: phonenumber.cpp:209
+#, kde-format
+msgid "PCS"
+msgstr "ПЦС"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Други"
+
+# >> @label Communication resource
+#: phonenumber.cpp:226
+#, kde-format
+msgid "Preferred Number"
+msgstr "Пожељни број"
+
+#: phonenumber.cpp:236
+#, kde-format
+msgid "Work Fax"
+msgstr "Пословни факс"
+
+#: secrecy.cpp:111
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "јавно"
+
+#: secrecy.cpp:114
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "приватно"
+
+#: secrecy.cpp:117
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "поверљиво"
+
+#: secrecy.cpp:120
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "непознато"
diff --git a/po/sr@ijekavian/kcontacts5.po b/po/sr@ijekavian/kcontacts5.po
new file mode 100644 (file)
index 0000000..5643936
--- /dev/null
@@ -0,0 +1,606 @@
+# Translation of kcontacts5.po into Serbian.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2007, 2009, 2015, 2017.
+# Dalibor Djuric <dalibor.djuric@mozilla-srbija.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2019-12-03 02:53+0100\n"
+"PO-Revision-Date: 2015-12-26 22:15+0100\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr@ijekavian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#: address.cpp:397
+#, kde-format
+msgid "Post Office Box"
+msgstr "Поштански фах"
+
+#: address.cpp:413
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Додатни адресни подаци"
+
+#: address.cpp:429
+#, kde-format
+msgid "Street"
+msgstr "Улица"
+
+#: address.cpp:445
+#, kde-format
+msgid "Locality"
+msgstr "Локалитет"
+
+#: address.cpp:461
+#, kde-format
+msgid "Region"
+msgstr "Регија"
+
+#: address.cpp:477
+#, kde-format
+msgid "Postal Code"
+msgstr "Поштански број"
+
+#: address.cpp:493
+#, kde-format
+msgid "Country"
+msgstr "Држава"
+
+#: address.cpp:509
+#, kde-format
+msgid "Delivery Label"
+msgstr "Етикета испоруке"
+
+#: address.cpp:527
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Домаћа"
+
+#: address.cpp:529
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Међународна"
+
+#: address.cpp:531
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Поштанска"
+
+#: address.cpp:533
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Пакетна"
+
+# >> @label Address type
+#: address.cpp:535
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Кућна"
+
+# >> @label Address type
+#: address.cpp:537
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Пословна"
+
+# >> @label Address type
+#: address.cpp:539
+#, kde-format
+msgid "Preferred Address"
+msgstr "Пожељна адреса"
+
+#: address.cpp:541
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Друга"
+
+#: addressee.cpp:433
+#, kde-format
+msgid "Unique Identifier"
+msgstr "јединствени идентификатор"
+
+#: addressee.cpp:453
+#, kde-format
+msgid "Name"
+msgstr "име и презиме"
+
+#: addressee.cpp:649
+#, kde-format
+msgid "Formatted Name"
+msgstr "форматирано име"
+
+#: addressee.cpp:669
+#, kde-format
+msgid "Family Name"
+msgstr "презиме"
+
+#: addressee.cpp:689
+#, kde-format
+msgid "Given Name"
+msgstr "име"
+
+#: addressee.cpp:709
+#, kde-format
+msgid "Additional Names"
+msgstr "додатна имена"
+
+#: addressee.cpp:729
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "титуларни префикси"
+
+#: addressee.cpp:749
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "титуларни суфикси"
+
+#: addressee.cpp:800
+#, kde-format
+msgid "Nick Name"
+msgstr "надимак"
+
+#: addressee.cpp:840
+#, kde-format
+msgid "Birthday"
+msgstr "рођендан"
+
+#: addressee.cpp:845
+#, kde-format
+msgid "Home Address Street"
+msgstr "кућна адреса, улица"
+
+#: addressee.cpp:850
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "кућна адреса, поштански фах"
+
+#: addressee.cpp:855
+#, kde-format
+msgid "Home Address City"
+msgstr "кућна адреса, град"
+
+#: addressee.cpp:860
+#, kde-format
+msgid "Home Address State"
+msgstr "кућна адреса, република"
+
+#: addressee.cpp:865
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "кућна адреса, поштански број"
+
+#: addressee.cpp:870
+#, kde-format
+msgid "Home Address Country"
+msgstr "кућна адреса, држава"
+
+#: addressee.cpp:875
+#, kde-format
+msgid "Home Address Label"
+msgstr "кућна адреса, етикета"
+
+#: addressee.cpp:880
+#, kde-format
+msgid "Business Address Street"
+msgstr "пословна адреса, улица"
+
+#: addressee.cpp:885
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "пословна адреса, поштански фах"
+
+#: addressee.cpp:890
+#, kde-format
+msgid "Business Address City"
+msgstr "пословна адреса, град"
+
+#: addressee.cpp:895
+#, kde-format
+msgid "Business Address State"
+msgstr "пословна адреса, република"
+
+#: addressee.cpp:900
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "пословна адреса, поштански број"
+
+#: addressee.cpp:905
+#, kde-format
+msgid "Business Address Country"
+msgstr "пословна адреса, држава"
+
+#: addressee.cpp:910
+#, kde-format
+msgid "Business Address Label"
+msgstr "пословна адреса, етикета"
+
+#: addressee.cpp:915
+#, kde-format
+msgid "Home Phone"
+msgstr "кућни телефон"
+
+#: addressee.cpp:920
+#, kde-format
+msgid "Business Phone"
+msgstr "пословни телефон"
+
+#: addressee.cpp:925
+#, kde-format
+msgid "Mobile Phone"
+msgstr "мобилни телефон"
+
+#: addressee.cpp:930 phonenumber.cpp:231
+#, kde-format
+msgid "Home Fax"
+msgstr "Кућни факс"
+
+#: addressee.cpp:935
+#, kde-format
+msgid "Business Fax"
+msgstr "пословни факс"
+
+#: addressee.cpp:940
+#, kde-format
+msgid "Car Phone"
+msgstr "телефон у колима"
+
+#: addressee.cpp:945 phonenumber.cpp:207
+#, kde-format
+msgid "ISDN"
+msgstr "ИСДН"
+
+#: addressee.cpp:950 phonenumber.cpp:211
+#, kde-format
+msgid "Pager"
+msgstr "Пејџер"
+
+#: addressee.cpp:955
+#, kde-format
+msgid "Email Address"
+msgstr "адреса е‑поште"
+
+#: addressee.cpp:975
+#, kde-format
+msgid "Mail Client"
+msgstr "поштански клијент"
+
+#: addressee.cpp:995
+#, kde-format
+msgid "Time Zone"
+msgstr "временска зона"
+
+#: addressee.cpp:1015
+#, kde-format
+msgid "Geographic Position"
+msgstr "географски положај"
+
+#: addressee.cpp:1066
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "титула"
+
+#: addressee.cpp:1117
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "положај"
+
+#: addressee.cpp:1168 field.cpp:241
+#, kde-format
+msgid "Organization"
+msgstr "организација"
+
+#: addressee.cpp:1188
+#, kde-format
+msgid "Department"
+msgstr "одељење"
+
+#: addressee.cpp:1208
+#, kde-format
+msgid "Note"
+msgstr "напомена"
+
+#: addressee.cpp:1228
+#, kde-format
+msgid "Product Identifier"
+msgstr "идентификатор производа"
+
+#: addressee.cpp:1248
+#, kde-format
+msgid "Revision Date"
+msgstr "датум ревизије"
+
+#: addressee.cpp:1268
+#, kde-format
+msgid "Sort String"
+msgstr "ниска за ређање"
+
+#: addressee.cpp:1294
+#, kde-format
+msgid "Homepage"
+msgstr "домаћа страница"
+
+#: addressee.cpp:1314
+#, kde-format
+msgid "Security Class"
+msgstr "безбједносна класа"
+
+#: addressee.cpp:1334
+#, kde-format
+msgid "Logo"
+msgstr "логотип"
+
+#: addressee.cpp:1354
+#, kde-format
+msgid "Photo"
+msgstr "фотографија"
+
+#: addressee.cpp:1374
+#, kde-format
+msgid "Sound"
+msgstr "звук"
+
+#: addresseehelper.cpp:74
+#, kde-format
+msgid "Dr."
+msgstr "др"
+
+#: addresseehelper.cpp:75
+#, kde-format
+msgid "Miss"
+msgstr "гђица"
+
+#: addresseehelper.cpp:76
+#, kde-format
+msgid "Mr."
+msgstr "гдин"
+
+#: addresseehelper.cpp:77
+#, kde-format
+msgid "Mrs."
+msgstr "гђа"
+
+#: addresseehelper.cpp:78
+#, kde-format
+msgid "Ms."
+msgstr "гђица"
+
+#: addresseehelper.cpp:79
+#, kde-format
+msgid "Prof."
+msgstr "проф."
+
+#: addresseehelper.cpp:81
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:82
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:83
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:84
+#, kde-format
+msgid "Jr."
+msgstr "млађи"
+
+#: addresseehelper.cpp:85
+#, kde-format
+msgid "Sr."
+msgstr "старији"
+
+#: field.cpp:218
+#, kde-format
+msgid "Unknown Field"
+msgstr "непознато поље"
+
+# >> @item category of fields
+#: field.cpp:231
+#, kde-format
+msgid "All"
+msgstr "сва"
+
+# >> @item category of fields
+#: field.cpp:233
+#, kde-format
+msgid "Frequent"
+msgstr "честа"
+
+# >> @item category of fields
+#: field.cpp:235
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "адреса"
+
+# >> @item category of fields
+#: field.cpp:237
+#, kde-format
+msgid "Email"
+msgstr "е‑пошта"
+
+# >> @item category of fields
+#: field.cpp:239
+#, kde-format
+msgid "Personal"
+msgstr "лична"
+
+# >> @item category of fields
+#: field.cpp:243
+#, kde-format
+msgid "Custom"
+msgstr "посебна"
+
+# >> @item category of fields
+#: field.cpp:245
+#, kde-format
+msgid "Undefined"
+msgstr "недефинисана"
+
+#: key.cpp:214
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "Икс.509"
+
+#: key.cpp:217
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "ПГП"
+
+#: key.cpp:220
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "посебан"
+
+#: key.cpp:223
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "непознат"
+
+#: phonenumber.cpp:183
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Број телефона"
+
+# >> @label Communication resource: home phone
+#: phonenumber.cpp:185
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Кућни"
+
+# >> @label Communication resource: work phone
+#: phonenumber.cpp:187
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Пословни"
+
+# >> @label Communication resource
+#: phonenumber.cpp:189
+#, kde-format
+msgid "Messenger"
+msgstr "Гласник"
+
+# >> @label Communication resource: preferred phone
+#: phonenumber.cpp:191
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Пожељни"
+
+# >> @label Communication resource
+#: phonenumber.cpp:193
+#, kde-format
+msgid "Voice"
+msgstr "Гласовни"
+
+# >> @label Communication resource
+#: phonenumber.cpp:195
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:197
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Мобилни"
+
+#: phonenumber.cpp:199
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Видео"
+
+# >> @label Communication resource
+#: phonenumber.cpp:201
+#, kde-format
+msgid "Mailbox"
+msgstr "Сандуче"
+
+# >> @label Communication resource
+#: phonenumber.cpp:203
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+# >> @label Communication resource
+#: phonenumber.cpp:205
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "У колима"
+
+#: phonenumber.cpp:209
+#, kde-format
+msgid "PCS"
+msgstr "ПЦС"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Други"
+
+# >> @label Communication resource
+#: phonenumber.cpp:226
+#, kde-format
+msgid "Preferred Number"
+msgstr "Пожељни број"
+
+#: phonenumber.cpp:236
+#, kde-format
+msgid "Work Fax"
+msgstr "Пословни факс"
+
+#: secrecy.cpp:111
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "јавно"
+
+#: secrecy.cpp:114
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "приватно"
+
+#: secrecy.cpp:117
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "повјерљиво"
+
+#: secrecy.cpp:120
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "непознато"
diff --git a/po/sr@ijekavianlatin/kcontacts5.po b/po/sr@ijekavianlatin/kcontacts5.po
new file mode 100644 (file)
index 0000000..3e0c7f0
--- /dev/null
@@ -0,0 +1,606 @@
+# Translation of kcontacts5.po into Serbian.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2007, 2009, 2015, 2017.
+# Dalibor Djuric <dalibor.djuric@mozilla-srbija.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2019-12-03 02:53+0100\n"
+"PO-Revision-Date: 2015-12-26 22:15+0100\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr@ijekavianlatin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#: address.cpp:397
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poštanski fah"
+
+#: address.cpp:413
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Dodatni adresni podaci"
+
+#: address.cpp:429
+#, kde-format
+msgid "Street"
+msgstr "Ulica"
+
+#: address.cpp:445
+#, kde-format
+msgid "Locality"
+msgstr "Lokalitet"
+
+#: address.cpp:461
+#, kde-format
+msgid "Region"
+msgstr "Regija"
+
+#: address.cpp:477
+#, kde-format
+msgid "Postal Code"
+msgstr "Poštanski broj"
+
+#: address.cpp:493
+#, kde-format
+msgid "Country"
+msgstr "Država"
+
+#: address.cpp:509
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiketa isporuke"
+
+#: address.cpp:527
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domaća"
+
+#: address.cpp:529
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Međunarodna"
+
+#: address.cpp:531
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poštanska"
+
+#: address.cpp:533
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paketna"
+
+# >> @label Address type
+#: address.cpp:535
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Kućna"
+
+# >> @label Address type
+#: address.cpp:537
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Poslovna"
+
+# >> @label Address type
+#: address.cpp:539
+#, kde-format
+msgid "Preferred Address"
+msgstr "Poželjna adresa"
+
+#: address.cpp:541
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Druga"
+
+#: addressee.cpp:433
+#, kde-format
+msgid "Unique Identifier"
+msgstr "jedinstveni identifikator"
+
+#: addressee.cpp:453
+#, kde-format
+msgid "Name"
+msgstr "ime i prezime"
+
+#: addressee.cpp:649
+#, kde-format
+msgid "Formatted Name"
+msgstr "formatirano ime"
+
+#: addressee.cpp:669
+#, kde-format
+msgid "Family Name"
+msgstr "prezime"
+
+#: addressee.cpp:689
+#, kde-format
+msgid "Given Name"
+msgstr "ime"
+
+#: addressee.cpp:709
+#, kde-format
+msgid "Additional Names"
+msgstr "dodatna imena"
+
+#: addressee.cpp:729
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "titularni prefiksi"
+
+#: addressee.cpp:749
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "titularni sufiksi"
+
+#: addressee.cpp:800
+#, kde-format
+msgid "Nick Name"
+msgstr "nadimak"
+
+#: addressee.cpp:840
+#, kde-format
+msgid "Birthday"
+msgstr "rođendan"
+
+#: addressee.cpp:845
+#, kde-format
+msgid "Home Address Street"
+msgstr "kućna adresa, ulica"
+
+#: addressee.cpp:850
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "kućna adresa, poštanski fah"
+
+#: addressee.cpp:855
+#, kde-format
+msgid "Home Address City"
+msgstr "kućna adresa, grad"
+
+#: addressee.cpp:860
+#, kde-format
+msgid "Home Address State"
+msgstr "kućna adresa, republika"
+
+#: addressee.cpp:865
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "kućna adresa, poštanski broj"
+
+#: addressee.cpp:870
+#, kde-format
+msgid "Home Address Country"
+msgstr "kućna adresa, država"
+
+#: addressee.cpp:875
+#, kde-format
+msgid "Home Address Label"
+msgstr "kućna adresa, etiketa"
+
+#: addressee.cpp:880
+#, kde-format
+msgid "Business Address Street"
+msgstr "poslovna adresa, ulica"
+
+#: addressee.cpp:885
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "poslovna adresa, poštanski fah"
+
+#: addressee.cpp:890
+#, kde-format
+msgid "Business Address City"
+msgstr "poslovna adresa, grad"
+
+#: addressee.cpp:895
+#, kde-format
+msgid "Business Address State"
+msgstr "poslovna adresa, republika"
+
+#: addressee.cpp:900
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "poslovna adresa, poštanski broj"
+
+#: addressee.cpp:905
+#, kde-format
+msgid "Business Address Country"
+msgstr "poslovna adresa, država"
+
+#: addressee.cpp:910
+#, kde-format
+msgid "Business Address Label"
+msgstr "poslovna adresa, etiketa"
+
+#: addressee.cpp:915
+#, kde-format
+msgid "Home Phone"
+msgstr "kućni telefon"
+
+#: addressee.cpp:920
+#, kde-format
+msgid "Business Phone"
+msgstr "poslovni telefon"
+
+#: addressee.cpp:925
+#, kde-format
+msgid "Mobile Phone"
+msgstr "mobilni telefon"
+
+#: addressee.cpp:930 phonenumber.cpp:231
+#, kde-format
+msgid "Home Fax"
+msgstr "Kućni faks"
+
+#: addressee.cpp:935
+#, kde-format
+msgid "Business Fax"
+msgstr "poslovni faks"
+
+#: addressee.cpp:940
+#, kde-format
+msgid "Car Phone"
+msgstr "telefon u kolima"
+
+#: addressee.cpp:945 phonenumber.cpp:207
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:950 phonenumber.cpp:211
+#, kde-format
+msgid "Pager"
+msgstr "Pejdžer"
+
+#: addressee.cpp:955
+#, kde-format
+msgid "Email Address"
+msgstr "adresa e‑pošte"
+
+#: addressee.cpp:975
+#, kde-format
+msgid "Mail Client"
+msgstr "poštanski klijent"
+
+#: addressee.cpp:995
+#, kde-format
+msgid "Time Zone"
+msgstr "vremenska zona"
+
+#: addressee.cpp:1015
+#, kde-format
+msgid "Geographic Position"
+msgstr "geografski položaj"
+
+#: addressee.cpp:1066
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "titula"
+
+#: addressee.cpp:1117
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "položaj"
+
+#: addressee.cpp:1168 field.cpp:241
+#, kde-format
+msgid "Organization"
+msgstr "organizacija"
+
+#: addressee.cpp:1188
+#, kde-format
+msgid "Department"
+msgstr "odeljenje"
+
+#: addressee.cpp:1208
+#, kde-format
+msgid "Note"
+msgstr "napomena"
+
+#: addressee.cpp:1228
+#, kde-format
+msgid "Product Identifier"
+msgstr "identifikator proizvoda"
+
+#: addressee.cpp:1248
+#, kde-format
+msgid "Revision Date"
+msgstr "datum revizije"
+
+#: addressee.cpp:1268
+#, kde-format
+msgid "Sort String"
+msgstr "niska za ređanje"
+
+#: addressee.cpp:1294
+#, kde-format
+msgid "Homepage"
+msgstr "domaća stranica"
+
+#: addressee.cpp:1314
+#, kde-format
+msgid "Security Class"
+msgstr "bezbjednosna klasa"
+
+#: addressee.cpp:1334
+#, kde-format
+msgid "Logo"
+msgstr "logotip"
+
+#: addressee.cpp:1354
+#, kde-format
+msgid "Photo"
+msgstr "fotografija"
+
+#: addressee.cpp:1374
+#, kde-format
+msgid "Sound"
+msgstr "zvuk"
+
+#: addresseehelper.cpp:74
+#, kde-format
+msgid "Dr."
+msgstr "dr"
+
+#: addresseehelper.cpp:75
+#, kde-format
+msgid "Miss"
+msgstr "gđica"
+
+#: addresseehelper.cpp:76
+#, kde-format
+msgid "Mr."
+msgstr "gdin"
+
+#: addresseehelper.cpp:77
+#, kde-format
+msgid "Mrs."
+msgstr "gđa"
+
+#: addresseehelper.cpp:78
+#, kde-format
+msgid "Ms."
+msgstr "gđica"
+
+#: addresseehelper.cpp:79
+#, kde-format
+msgid "Prof."
+msgstr "prof."
+
+#: addresseehelper.cpp:81
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:82
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:83
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:84
+#, kde-format
+msgid "Jr."
+msgstr "mlađi"
+
+#: addresseehelper.cpp:85
+#, kde-format
+msgid "Sr."
+msgstr "stariji"
+
+#: field.cpp:218
+#, kde-format
+msgid "Unknown Field"
+msgstr "nepoznato polje"
+
+# >> @item category of fields
+#: field.cpp:231
+#, kde-format
+msgid "All"
+msgstr "sva"
+
+# >> @item category of fields
+#: field.cpp:233
+#, kde-format
+msgid "Frequent"
+msgstr "česta"
+
+# >> @item category of fields
+#: field.cpp:235
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "adresa"
+
+# >> @item category of fields
+#: field.cpp:237
+#, kde-format
+msgid "Email"
+msgstr "e‑pošta"
+
+# >> @item category of fields
+#: field.cpp:239
+#, kde-format
+msgid "Personal"
+msgstr "lična"
+
+# >> @item category of fields
+#: field.cpp:243
+#, kde-format
+msgid "Custom"
+msgstr "posebna"
+
+# >> @item category of fields
+#: field.cpp:245
+#, kde-format
+msgid "Undefined"
+msgstr "nedefinisana"
+
+#: key.cpp:214
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X.509"
+
+#: key.cpp:217
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:220
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "poseban"
+
+#: key.cpp:223
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "nepoznat"
+
+#: phonenumber.cpp:183
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Broj telefona"
+
+# >> @label Communication resource: home phone
+#: phonenumber.cpp:185
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Kućni"
+
+# >> @label Communication resource: work phone
+#: phonenumber.cpp:187
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Poslovni"
+
+# >> @label Communication resource
+#: phonenumber.cpp:189
+#, kde-format
+msgid "Messenger"
+msgstr "Glasnik"
+
+# >> @label Communication resource: preferred phone
+#: phonenumber.cpp:191
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Poželjni"
+
+# >> @label Communication resource
+#: phonenumber.cpp:193
+#, kde-format
+msgid "Voice"
+msgstr "Glasovni"
+
+# >> @label Communication resource
+#: phonenumber.cpp:195
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:197
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobilni"
+
+#: phonenumber.cpp:199
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+# >> @label Communication resource
+#: phonenumber.cpp:201
+#, kde-format
+msgid "Mailbox"
+msgstr "Sanduče"
+
+# >> @label Communication resource
+#: phonenumber.cpp:203
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+# >> @label Communication resource
+#: phonenumber.cpp:205
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "U kolima"
+
+#: phonenumber.cpp:209
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Drugi"
+
+# >> @label Communication resource
+#: phonenumber.cpp:226
+#, kde-format
+msgid "Preferred Number"
+msgstr "Poželjni broj"
+
+#: phonenumber.cpp:236
+#, kde-format
+msgid "Work Fax"
+msgstr "Poslovni faks"
+
+#: secrecy.cpp:111
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "javno"
+
+#: secrecy.cpp:114
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "privatno"
+
+#: secrecy.cpp:117
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "povjerljivo"
+
+#: secrecy.cpp:120
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "nepoznato"
diff --git a/po/sr@latin/kcontacts5.po b/po/sr@latin/kcontacts5.po
new file mode 100644 (file)
index 0000000..83a6540
--- /dev/null
@@ -0,0 +1,606 @@
+# Translation of kcontacts5.po into Serbian.
+# Chusslove Illich <caslav.ilic@gmx.net>, 2007, 2009, 2015, 2017.
+# Dalibor Djuric <dalibor.djuric@mozilla-srbija.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2019-12-03 02:53+0100\n"
+"PO-Revision-Date: 2015-12-26 22:15+0100\n"
+"Last-Translator: Chusslove Illich <caslav.ilic@gmx.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"Language: sr@latin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Accelerator-Marker: &\n"
+"X-Text-Markup: kde4\n"
+"X-Environment: kde\n"
+
+#: address.cpp:397
+#, kde-format
+msgid "Post Office Box"
+msgstr "Poštanski fah"
+
+#: address.cpp:413
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Dodatni adresni podaci"
+
+#: address.cpp:429
+#, kde-format
+msgid "Street"
+msgstr "Ulica"
+
+#: address.cpp:445
+#, kde-format
+msgid "Locality"
+msgstr "Lokalitet"
+
+#: address.cpp:461
+#, kde-format
+msgid "Region"
+msgstr "Regija"
+
+#: address.cpp:477
+#, kde-format
+msgid "Postal Code"
+msgstr "Poštanski broj"
+
+#: address.cpp:493
+#, kde-format
+msgid "Country"
+msgstr "Država"
+
+#: address.cpp:509
+#, kde-format
+msgid "Delivery Label"
+msgstr "Etiketa isporuke"
+
+#: address.cpp:527
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Domaća"
+
+#: address.cpp:529
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Međunarodna"
+
+#: address.cpp:531
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Poštanska"
+
+#: address.cpp:533
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paketna"
+
+# >> @label Address type
+#: address.cpp:535
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Kućna"
+
+# >> @label Address type
+#: address.cpp:537
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Poslovna"
+
+# >> @label Address type
+#: address.cpp:539
+#, kde-format
+msgid "Preferred Address"
+msgstr "Poželjna adresa"
+
+#: address.cpp:541
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Druga"
+
+#: addressee.cpp:433
+#, kde-format
+msgid "Unique Identifier"
+msgstr "jedinstveni identifikator"
+
+#: addressee.cpp:453
+#, kde-format
+msgid "Name"
+msgstr "ime i prezime"
+
+#: addressee.cpp:649
+#, kde-format
+msgid "Formatted Name"
+msgstr "formatirano ime"
+
+#: addressee.cpp:669
+#, kde-format
+msgid "Family Name"
+msgstr "prezime"
+
+#: addressee.cpp:689
+#, kde-format
+msgid "Given Name"
+msgstr "ime"
+
+#: addressee.cpp:709
+#, kde-format
+msgid "Additional Names"
+msgstr "dodatna imena"
+
+#: addressee.cpp:729
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "titularni prefiksi"
+
+#: addressee.cpp:749
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "titularni sufiksi"
+
+#: addressee.cpp:800
+#, kde-format
+msgid "Nick Name"
+msgstr "nadimak"
+
+#: addressee.cpp:840
+#, kde-format
+msgid "Birthday"
+msgstr "rođendan"
+
+#: addressee.cpp:845
+#, kde-format
+msgid "Home Address Street"
+msgstr "kućna adresa, ulica"
+
+#: addressee.cpp:850
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "kućna adresa, poštanski fah"
+
+#: addressee.cpp:855
+#, kde-format
+msgid "Home Address City"
+msgstr "kućna adresa, grad"
+
+#: addressee.cpp:860
+#, kde-format
+msgid "Home Address State"
+msgstr "kućna adresa, republika"
+
+#: addressee.cpp:865
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "kućna adresa, poštanski broj"
+
+#: addressee.cpp:870
+#, kde-format
+msgid "Home Address Country"
+msgstr "kućna adresa, država"
+
+#: addressee.cpp:875
+#, kde-format
+msgid "Home Address Label"
+msgstr "kućna adresa, etiketa"
+
+#: addressee.cpp:880
+#, kde-format
+msgid "Business Address Street"
+msgstr "poslovna adresa, ulica"
+
+#: addressee.cpp:885
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "poslovna adresa, poštanski fah"
+
+#: addressee.cpp:890
+#, kde-format
+msgid "Business Address City"
+msgstr "poslovna adresa, grad"
+
+#: addressee.cpp:895
+#, kde-format
+msgid "Business Address State"
+msgstr "poslovna adresa, republika"
+
+#: addressee.cpp:900
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "poslovna adresa, poštanski broj"
+
+#: addressee.cpp:905
+#, kde-format
+msgid "Business Address Country"
+msgstr "poslovna adresa, država"
+
+#: addressee.cpp:910
+#, kde-format
+msgid "Business Address Label"
+msgstr "poslovna adresa, etiketa"
+
+#: addressee.cpp:915
+#, kde-format
+msgid "Home Phone"
+msgstr "kućni telefon"
+
+#: addressee.cpp:920
+#, kde-format
+msgid "Business Phone"
+msgstr "poslovni telefon"
+
+#: addressee.cpp:925
+#, kde-format
+msgid "Mobile Phone"
+msgstr "mobilni telefon"
+
+#: addressee.cpp:930 phonenumber.cpp:231
+#, kde-format
+msgid "Home Fax"
+msgstr "Kućni faks"
+
+#: addressee.cpp:935
+#, kde-format
+msgid "Business Fax"
+msgstr "poslovni faks"
+
+#: addressee.cpp:940
+#, kde-format
+msgid "Car Phone"
+msgstr "telefon u kolima"
+
+#: addressee.cpp:945 phonenumber.cpp:207
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:950 phonenumber.cpp:211
+#, kde-format
+msgid "Pager"
+msgstr "Pejdžer"
+
+#: addressee.cpp:955
+#, kde-format
+msgid "Email Address"
+msgstr "adresa e‑pošte"
+
+#: addressee.cpp:975
+#, kde-format
+msgid "Mail Client"
+msgstr "poštanski klijent"
+
+#: addressee.cpp:995
+#, kde-format
+msgid "Time Zone"
+msgstr "vremenska zona"
+
+#: addressee.cpp:1015
+#, kde-format
+msgid "Geographic Position"
+msgstr "geografski položaj"
+
+#: addressee.cpp:1066
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "titula"
+
+#: addressee.cpp:1117
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "položaj"
+
+#: addressee.cpp:1168 field.cpp:241
+#, kde-format
+msgid "Organization"
+msgstr "organizacija"
+
+#: addressee.cpp:1188
+#, kde-format
+msgid "Department"
+msgstr "odeljenje"
+
+#: addressee.cpp:1208
+#, kde-format
+msgid "Note"
+msgstr "napomena"
+
+#: addressee.cpp:1228
+#, kde-format
+msgid "Product Identifier"
+msgstr "identifikator proizvoda"
+
+#: addressee.cpp:1248
+#, kde-format
+msgid "Revision Date"
+msgstr "datum revizije"
+
+#: addressee.cpp:1268
+#, kde-format
+msgid "Sort String"
+msgstr "niska za ređanje"
+
+#: addressee.cpp:1294
+#, kde-format
+msgid "Homepage"
+msgstr "domaća stranica"
+
+#: addressee.cpp:1314
+#, kde-format
+msgid "Security Class"
+msgstr "bezbednosna klasa"
+
+#: addressee.cpp:1334
+#, kde-format
+msgid "Logo"
+msgstr "logotip"
+
+#: addressee.cpp:1354
+#, kde-format
+msgid "Photo"
+msgstr "fotografija"
+
+#: addressee.cpp:1374
+#, kde-format
+msgid "Sound"
+msgstr "zvuk"
+
+#: addresseehelper.cpp:74
+#, kde-format
+msgid "Dr."
+msgstr "dr"
+
+#: addresseehelper.cpp:75
+#, kde-format
+msgid "Miss"
+msgstr "gđica"
+
+#: addresseehelper.cpp:76
+#, kde-format
+msgid "Mr."
+msgstr "gdin"
+
+#: addresseehelper.cpp:77
+#, kde-format
+msgid "Mrs."
+msgstr "gđa"
+
+#: addresseehelper.cpp:78
+#, kde-format
+msgid "Ms."
+msgstr "gđica"
+
+#: addresseehelper.cpp:79
+#, kde-format
+msgid "Prof."
+msgstr "prof."
+
+#: addresseehelper.cpp:81
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:82
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:83
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:84
+#, kde-format
+msgid "Jr."
+msgstr "mlađi"
+
+#: addresseehelper.cpp:85
+#, kde-format
+msgid "Sr."
+msgstr "stariji"
+
+#: field.cpp:218
+#, kde-format
+msgid "Unknown Field"
+msgstr "nepoznato polje"
+
+# >> @item category of fields
+#: field.cpp:231
+#, kde-format
+msgid "All"
+msgstr "sva"
+
+# >> @item category of fields
+#: field.cpp:233
+#, kde-format
+msgid "Frequent"
+msgstr "česta"
+
+# >> @item category of fields
+#: field.cpp:235
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "adresa"
+
+# >> @item category of fields
+#: field.cpp:237
+#, kde-format
+msgid "Email"
+msgstr "e‑pošta"
+
+# >> @item category of fields
+#: field.cpp:239
+#, kde-format
+msgid "Personal"
+msgstr "lična"
+
+# >> @item category of fields
+#: field.cpp:243
+#, kde-format
+msgid "Custom"
+msgstr "posebna"
+
+# >> @item category of fields
+#: field.cpp:245
+#, kde-format
+msgid "Undefined"
+msgstr "nedefinisana"
+
+#: key.cpp:214
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X.509"
+
+#: key.cpp:217
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:220
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "poseban"
+
+#: key.cpp:223
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "nepoznat"
+
+#: phonenumber.cpp:183
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Broj telefona"
+
+# >> @label Communication resource: home phone
+#: phonenumber.cpp:185
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Kućni"
+
+# >> @label Communication resource: work phone
+#: phonenumber.cpp:187
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Poslovni"
+
+# >> @label Communication resource
+#: phonenumber.cpp:189
+#, kde-format
+msgid "Messenger"
+msgstr "Glasnik"
+
+# >> @label Communication resource: preferred phone
+#: phonenumber.cpp:191
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Poželjni"
+
+# >> @label Communication resource
+#: phonenumber.cpp:193
+#, kde-format
+msgid "Voice"
+msgstr "Glasovni"
+
+# >> @label Communication resource
+#: phonenumber.cpp:195
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:197
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobilni"
+
+#: phonenumber.cpp:199
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+# >> @label Communication resource
+#: phonenumber.cpp:201
+#, kde-format
+msgid "Mailbox"
+msgstr "Sanduče"
+
+# >> @label Communication resource
+#: phonenumber.cpp:203
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+# >> @label Communication resource
+#: phonenumber.cpp:205
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "U kolima"
+
+#: phonenumber.cpp:209
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Drugi"
+
+# >> @label Communication resource
+#: phonenumber.cpp:226
+#, kde-format
+msgid "Preferred Number"
+msgstr "Poželjni broj"
+
+#: phonenumber.cpp:236
+#, kde-format
+msgid "Work Fax"
+msgstr "Poslovni faks"
+
+#: secrecy.cpp:111
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "javno"
+
+#: secrecy.cpp:114
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "privatno"
+
+#: secrecy.cpp:117
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "poverljivo"
+
+#: secrecy.cpp:120
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "nepoznato"
diff --git a/po/sv/kcontacts5.po b/po/sv/kcontacts5.po
new file mode 100644 (file)
index 0000000..9f67915
--- /dev/null
@@ -0,0 +1,740 @@
+# translation of kabc.po to Swedish
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Stefan Asserhäll <stefan.asserhall@bredband.net>, 2007, 2008, 2009, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2015-12-28 20:14+0100\n"
+"Last-Translator: Stefan Asserhäll <stefan.asserhall@bredband.net>\n"
+"Language-Team: Swedish <kde-i18n-doc@kde.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Postbox"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Utökad adressinformation"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Gata"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Plats"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Område"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Postnummer"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Land"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Leveransetikett"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Inrikes"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Internationell"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Post"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paket"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Hem"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Arbete"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Önskad adress"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Övriga"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Unik identifiering"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Namn"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Formaterat namn"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Efternamn"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Tilltalsnamn"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Andra namn"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Inledande titlar"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Efterföljande titlar"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Smeknamn"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Födelsedag"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Gatuadress hem"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Postboxadress hem"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Stadsadress hem"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Stat hem"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Postnummer hem"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Landsadress hem"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Adressetikett hem"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Gatuadress arbete"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Postboxadress arbete"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Stadsadress arbete"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Stat arbete"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Postnummer arbete"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Landsadress arbete"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Adressetikett arbete"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Hemtelefon"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Telefon arbete"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Mobiltelefon"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Hemtelefax"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Arbetsfax"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Biltelefon"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Personsökare"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-postadress"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-postklient"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Tidszon"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Geografisk plats"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Titel"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Roll"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Organisation"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Avdelning"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Anteckning"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Produktidentifiering"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Ändringsdatum"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sorteringsbegrepp"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Hemsida"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Säkerhetsklass"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logotyp"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Ljud"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Fröken"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Herr"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Fru"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Professor"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Okänt fält"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Alla"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Vanlig"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adress"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-post"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personligt"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Egen"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Odefinierad"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Egen"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Okänd typ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefonnummer"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Hem"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Arbete"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Meddelandetjänst"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Önskat"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Röst"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Fax"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Mobil"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Brevlåda"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Bil"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Övriga"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Önskat nummer"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Arbetstelefax"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Öppen"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Privat"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Konfidentiell"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Okänd typ"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Föredragen"
+
+#~ msgid "List of Emails"
+#~ msgstr "Lista med e-post"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Stefan Asserhäll"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "stefan.asserhall@bredband.net"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "Kan inte ladda resursen '%1'"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Välj adressat"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "Namn"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-post"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Markerad"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Avmarkera"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Anpassa distributionslistor"
+
+#~ msgid "Select Email Address"
+#~ msgstr "Välj e-postadress"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-postadresser"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Nej"
+
+#~ msgid "New List..."
+#~ msgstr "Ny lista..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Byt namn på lista..."
+
+#~ msgid "Remove List"
+#~ msgstr "Ta bort lista"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Tillgängliga adresser:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Önskad e-post"
+
+#~ msgid "Add Entry"
+#~ msgstr "Lägg till post"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-post"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Använd önskad"
+
+#~ msgid "Change Email..."
+#~ msgstr "Ändra e-post..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Ta bort post"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Ny distributionslista"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Ange &namn:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Distributionslista"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Ändra &namn:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "Ta bort distributionslistan '%1'?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Valda adressater:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "Valda adresser i '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Nej"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard-format"
+
+#~ msgid "No description available."
+#~ msgstr "Ingen beskrivning tillgänglig."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Kan inte öppna låsfil."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "Resursen '%1' är låst av programmet '%2'."
+
+#~ msgid "Error"
+#~ msgstr "Fel"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "Upplåsning misslyckades. Låsfilen ägs av en annan process: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: Alla lås lyckas, men ingen verklig låsning görs."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Alla lås misslyckas."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "Misslyckades ladda resursen '%1'."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "Misslyckades spara resursen '%1'."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "Kan inte öppna resursen '%1'."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Förvald adressbok"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "Kan inte spara till resursen '%1' eftersom den är låst."
diff --git a/po/tg/kcontacts5.po b/po/tg/kcontacts5.po
new file mode 100644 (file)
index 0000000..43c4690
--- /dev/null
@@ -0,0 +1,584 @@
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+#
+# Victor Ibragimov <victor.ibragimov@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2019-09-19 10:36+0500\n"
+"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
+"Language-Team: English <kde-i18n-doc@kde.org>\n"
+"Language: tg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 19.04.3\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Нишонии почта"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Маълумоти васеъшудаи нишонӣ"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Кӯча"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Маҳал"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Ноҳия"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Рамзи почта"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Кишвар"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Тамғаи таҳвил"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Дохилӣ"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Байналмилалӣ"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Почтаӣ"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Бӯғча"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Хонагӣ"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Корӣ"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Нишонии пазируфта"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Дигар"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Рақами мушаххас"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ном"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Номи пурра"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Насаб"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Номи падар"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Номҳои иловагӣ"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Пешванди номи бошараф"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Пасванди номи бошараф"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Тахаллус"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Зодрӯз"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Кӯчаи нишонии хонагӣ"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Нишонии почта (Нишонии хонагӣ)"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Шаҳри нишонии хонагӣ"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Ноҳияи нишонии хонагӣ"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Рамзи почтаи нишонии хонагӣ"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Кишвари нишонии хонагӣ"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Тамғаи нишонии хонагӣ"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Кӯчаи нишонии корӣ"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Нишонии почта (Нишонии корӣ)"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Шаҳри нишонии корӣ"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Ноҳияи нишонии корӣ"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Рамзи почтаи нишонии корӣ"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Кишвари нишонии корӣ"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Тамғаи нишонии корӣ"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Рақами телефони хонагӣ"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Рақами телефони корӣ"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Рақами телефони дастӣ"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Факси хонагӣ"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Факси корӣ"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Телефони мошинӣ"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Пейҷер"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Нишонии почтаи электронӣ"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Мизоҷи почта"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Минтақаи вақт"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Мавқеи ҷуғрофӣ"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Унвон"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Вазифа"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Ташкилот"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Шуъба"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Тавзеҳ"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Рақами мушаххаси маҳсул"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Санаи тафтиш"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Мураттабсозӣ"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Сомона"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Дараҷаи амният"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Тамға"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Сурат"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Овоз"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Доктор"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Хонум"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Раис"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Раиса"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Бону"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Профессор"
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Хурд"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Ҷаноб"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Сатри номаълум"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Ҳама"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Оддӣ"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Нишонӣ"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Почтаи электронӣ"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Шахсӣ"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Фармоишӣ"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Номуайян"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Фармоишӣ"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Навъи номаълум"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Рақами телефон"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Хонагӣ"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Корӣ"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Паёмнависӣ"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Пазируфта"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Овозӣ"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Дастӣ"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Видеоӣ"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Қутти почта"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Мошинӣ"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Дигар"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Рақами пазируфта"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Факси корӣ"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Ҷамъиятӣ"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Шахсӣ"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Махфӣ"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Навъи номаълум"
diff --git a/po/th/kcontacts5.po b/po/th/kcontacts5.po
new file mode 100644 (file)
index 0000000..35d5a15
--- /dev/null
@@ -0,0 +1,744 @@
+# translation of kabc.po to Thai
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Thanomsub Noppaburana <donga.nb@gmail.com>, 2008, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2010-03-25 14:10+0700\n"
+"Last-Translator: Thanomsub Noppaburana <donga.nb@gmail.com>\n"
+"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
+"Language: th\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "ตู้ไปรษณีย์"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "ข้อมูลที่อยู่เพิ่มเติม"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "ถนน"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "แขวง/ตำบล"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "เขต/อำเภอ"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "รหัสไปรษณีย์"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "ประเทศ"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "ป้ายจัดส่ง"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "ในประเทศ"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "ต่างประเทศ"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "ไปรษณีย์"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "ที่จัดส่งพัสดุ"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "ที่บ้าน"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "ที่ทำงาน"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "ที่อยู่ที่ควรใช้"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "อื่น ๆ"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "ชื่อ"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "ชื่อตามรูปแบบ"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "นามสกุล"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "ชื่อจริง"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "ชื่อเล่น"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "วันเกิด"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "ที่อยู่ที่บ้าน"
+
+#: addressee.cpp:873
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Home Address Post Office Box"
+msgstr "ตู้ไปรษณีย์"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Home Address State"
+msgstr "ที่อยู่อีเมล"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, fuzzy, kde-format
+#| msgid "Email Addresses"
+msgid "Home Address Label"
+msgstr "ที่อยู่อีเมล"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, fuzzy, kde-format
+#| msgid "Post Office Box"
+msgid "Business Address Post Office Box"
+msgstr "ตู้ไปรษณีย์"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "โทรศัพท์ที่บ้าน"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "โทรศัพท์ภาคธุรกิจ"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "โทรศัพท์เคลื่อนที่"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "โทรสารที่บ้าน"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "โทรสารภาคธุรกิจ"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "โทรศัพท์ติดรถยนตร์"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "หมายเลข ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "เพจเจอร์"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "ที่อยู่อีเมล"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "โปรแกรมรับส่งอีเมล"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "เขตเวลา"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "ตำแหน่งพิกัดทางภูมิศาสตร์"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "ตำแหน่ง"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "บทบาทหน้าที่"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "องค์กร"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "แผนก"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "บันทึกย่อ"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "ค่าประจำตัวผลิตภัณฑ์"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "วันที่ปรับปรุงใหม่"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "เรียงลำดับข้อความ"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "หน้าเว็บหลัก"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "ระดับความปลอดภัย"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "โลโก้"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "ภาพถ่าย"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "เสียง"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "ดร."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "นางสาว"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "นาย"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "นาง"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "น.ส."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "ศ."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "ด.ช."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "ด.ช."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "ช่องข้อมูลที่ไม่รู้จัก"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "ทั้งหมด"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "ความถี่"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "ที่อยู่"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "อีเมล"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "ส่วนบุคคล"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "กำหนดเอง"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "ยังไม่กำหนด"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "แบบ X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "แบบ PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "กำหนดเอง"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "ไม่ทราบประเภท"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "ที่บ้าน"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "ที่ทำงาน"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "ข้อความด่วนทันใจ"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "ที่ควรใช้"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "เสียง"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "โทรสาร"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "โทรศัพท์เคลื่อนที่"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "โทรศัพท์ภาพ"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "กล่องจดหมาย"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "โมเด็ม"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "โทรศัพท์ติดรถยนต์"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "หมายเลข PCT"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "อื่น ๆ"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "หมายเลขที่ควรใช้"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "โทรสารที่ทำงาน"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "สาธารณะ"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "ส่วนบุคคล"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "ชั้นความลับ"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "ไม่ทราบประเภท"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "ที่ควรใช้"
+
+#~ msgid "List of Emails"
+#~ msgstr "รายการอีเมล"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "ถนอมทรัพย์ นพบูรณ์"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "donga.nb@gmail.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "ไม่สามารถโหลดทรัพยากร '%1' ได้"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "เลือกที่อยู่"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "ชื่อ"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "อีเมล"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "ที่เลือก"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "ไม่เลือก"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "ปรับแต่งรายการผู้รวบรวมแจกจ่าย"
+
+#~ msgid "Select Email Address"
+#~ msgstr "เลือกที่อยู่อีเมล"
+
+#~ msgid "Email Addresses"
+#~ msgstr "ที่อยู่อีเมล"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "ใช่"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "ไม่"
+
+#~ msgid "New List..."
+#~ msgstr "รายการใหม่..."
+
+#~ msgid "Rename List..."
+#~ msgstr "เปลี่ยนชื่อรายการ..."
+
+#~ msgid "Remove List"
+#~ msgstr "ลบรายการ"
+
+#~ msgid "Available addresses:"
+#~ msgstr "ที่อยู่ที่มีอยู่:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "อีเมลที่ควรใช้"
+
+#~ msgid "Add Entry"
+#~ msgstr "เพิ่มข้อมูล"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "อีเมล"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "ใช้ที่ควรใช้"
+
+#~ msgid "Change Email..."
+#~ msgstr "แก้ไขอีเมล..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "ลบข้อมูล"
+
+#~ msgid "New Distribution List"
+#~ msgstr "รายการผู้รวบรวมแจกจ่ายใหม่"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "โปรดกรอกชื่อ:"
+
+#~ msgid "Distribution List"
+#~ msgstr "รายการผู้รวบรวมแจกจ่าย"
+
+#~ msgid "Please change &name:"
+#~ msgstr "โปรดแก้ไขชื่อ:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "ต้องการลบรายการผู้รวบรวมแจกจ่าย '%1' ?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "ที่อยู่ที่เลือกไว้:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "ที่อยู่ที่เลือกใน '%1':"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "ไม่"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "รูปแบบ vCard"
+
+#~ msgid "No description available."
+#~ msgstr "ไม่มีข้อมูลรายละเอียด"
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "ไม่สามารถเปิดแฟ้มล็อคได้"
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "ทรัพยากร '%1' ถูกล็อคโดยแอพพลิเคชัน '%2'"
+
+#~ msgid "Error"
+#~ msgstr "ผิดพลาด"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr "การปลดล็อคล้มเหลว แฟ้มล็อคเป็นของโพรเซสอื่น: %1 (%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: การล็อคทั้งหมดสำเร็จ แต่ไม่มีการล็อคจริงเกิดขึ้น"
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: การล็อคทั้งหมดล้มเหลว"
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "ล้มเหลวในการโหลดทรัพยากร '%1'"
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "ล้มเหลวในการบันทึกทรัพยากร '%1'"
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "ไม่สามารถเปิดทรัพยากร '%1' ได้"
+
+#~ msgid "Default Address Book"
+#~ msgstr "สมุดที่อยู่ปริยาย"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "ไม่สามารถบันทึกทรัพยากร '%1' ได้ เนื่องจากมันถูกล็อคอยู่"
diff --git a/po/tr/kcontacts5.po b/po/tr/kcontacts5.po
new file mode 100644 (file)
index 0000000..3001e9a
--- /dev/null
@@ -0,0 +1,746 @@
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Translators:
+# H. İbrahim Güngör <ibrahim@pardus.org.tr>, 2010.
+# obsoleteman <tulliana@gmail.com>, 2008-2009.
+# Volkan Gezer <volkangezer@gmail.com>, 2013-2014, 2017.
+# Kaan Ozdincer <kaanozdincer@gmail.com>, 2014.
+# Emir SARI <emir_sari@icloud.com>, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: kdepimlibs-kde4\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2022-03-11 13:54+0300\n"
+"Last-Translator: Emir SARI <emir_sari@icloud.com>\n"
+"Language-Team: Turkish <kde-l10n-tr@kde.org>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Lokalize 21.12.3\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Posta Kutusu"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Genişletilmiş Adres Bilgisi"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Cadde"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Semt"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Bölge"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Posta Kodu"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Ülke"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Dağıtım Etiketi"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Yerel"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Uluslararası"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Posta"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Paket"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Ev"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "İş"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Tercih Edilen Adres"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Diğer"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Özgün Tanımlayıcı"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ad"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Biçimlendirilmiş Ad"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Soyad"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Verilen Ad"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Ek Adlar"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Unvan Önekleri"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Unvan Sonekleri"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Takma Ad"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Doğum Günü"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Ev Adresi Cadde"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Ev Adresi Posta Kutusu"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Ev Adresi Şehir"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Ev Adresi Eyalet"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Ev Adresi Posta Kodu"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Ev Adresi Ülke"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Ev Adresi Etiketi"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "İş Adresi Cadde"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "İş Adresi Posta Kutusu"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "İş Adresi Şehir"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "İş Adresi Eyalet"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "İş Adresi Posta Kodu"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "İş Adresi Ülke"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "İş Adresi Etiketi"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Ev Telefonu"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "İş Telefonu"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Cep Telefonu"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Ev Faksı"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "İş Faks Numarası"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Araç Telefonu"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Çağrı Aygıtı"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "E-posta Adresi"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "E-posta İstemcisi"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Zaman Dilimi"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Coğrafi Konum"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Başlık"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Unvan"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Kurum"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Bölüm"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Not"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Ürün Tanımlayıcı"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Değiştirilme Tarihi"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Sıralama Dizisi"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Anasayfa"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Güvenlik Sınıfı"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Logo"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Fotoğraf"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Ses"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Bayan"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Bay"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Bayan"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Bayan"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Bilinmeyen Alan"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Tümü"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Sık Sık"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Adres"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "E-posta"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Kişisel"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Özel"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Tanımlanmamış"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Özel"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Bilinmeyen tür"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Telefon numarası"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Ev"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "İş"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Anında İletileşme"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Tercih Edilen"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Ses"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Faks"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Cep"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Video"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Posta Kutusu"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Araba"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Diğer"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Tercih Edilen Numara"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "İş Faksı"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Genel"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Özel"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Güvenilir"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Bilinmeyen tür"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Tercih Edilen"
+
+#~ msgid "List of Emails"
+#~ msgstr "E-postaların Listesi"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "Serdar Soytetir"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "tulliana@gmail.com"
+
+#~ msgid "Unable to load resource '%1'"
+#~ msgstr "'%1' kaynağı yüklenemedi"
+
+#~ msgctxt "@title:window"
+#~ msgid "Select Addressee"
+#~ msgstr "Adres Seç"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "İsim"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "E-posta"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "Seç"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "Seçme"
+
+#~ msgid "Configure Distribution Lists"
+#~ msgstr "Dağıtım Listesini Yapılandır"
+
+#~ msgid "Select Email Address"
+#~ msgstr "E-posta Adresini Seç"
+
+#~ msgid "Email Addresses"
+#~ msgstr "E-posta Adresleri"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "Evet"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "Hayır"
+
+#~ msgid "New List..."
+#~ msgstr "Yeni Liste..."
+
+#~ msgid "Rename List..."
+#~ msgstr "Listeyi Yeniden Adlandır..."
+
+#~ msgid "Remove List"
+#~ msgstr "Listeyi Kaldır"
+
+#~ msgid "Available addresses:"
+#~ msgstr "Kullanılabilir adresler:"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Preferred Email"
+#~ msgstr "Tercih Edilen E-posta"
+
+#~ msgid "Add Entry"
+#~ msgstr "Girdi Ekle"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "E-posta"
+
+#~ msgctxt "@title:column use preferred email"
+#~ msgid "Use Preferred"
+#~ msgstr "Tercih Edileni Kullan"
+
+#~ msgid "Change Email..."
+#~ msgstr "E-postayı Değiştir..."
+
+#~ msgid "Remove Entry"
+#~ msgstr "Girdiyi Kaldır"
+
+#~ msgid "New Distribution List"
+#~ msgstr "Yeni Dağıtım Listesi"
+
+#~ msgid "Please enter &name:"
+#~ msgstr "Lütfen ismi giri&n:"
+
+#~ msgid "Distribution List"
+#~ msgstr "Dağıtım Listesi"
+
+#~ msgid "Please change &name:"
+#~ msgstr "Lütfen ismi değiştiri&n:"
+
+#~ msgid "Delete distribution list '%1'?"
+#~ msgstr "'%1' dağıtım listesi silinsin mi?"
+
+#~ msgid "Selected addressees:"
+#~ msgstr "Seçilen adresler:"
+
+#~ msgid "Selected addresses in '%1':"
+#~ msgstr "'%1' içerisinden seçilen adresler:"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "Hayır"
+
+#~ msgid "vCard"
+#~ msgstr "vCard"
+
+#~ msgid "vCard Format"
+#~ msgstr "vCard Biçimi"
+
+#~ msgid "No description available."
+#~ msgstr "Açıklama yok."
+
+#~ msgid "Unable to open lock file."
+#~ msgstr "Kilit dosyası açılamadı."
+
+#~ msgid "The resource '%1' is locked by application '%2'."
+#~ msgstr "'%1' kaynağı '%2' uygulaması tarafından kilitlenmiş."
+
+#~ msgid "Error"
+#~ msgstr "Hata"
+
+#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)"
+#~ msgstr ""
+#~ "Kilidi açma işlemi başarısız oldu. Kilit dosyası başka bir sürece ait: %1 "
+#~ "(%2)"
+
+#~ msgid "LockNull: All locks succeed but no actual locking is done."
+#~ msgstr "LockNull: Tüm kilitler başarılı hiç gerçek kilitleme yapılamadı."
+
+#~ msgid "LockNull: All locks fail."
+#~ msgstr "LockNull: Tüm kilitler başarısız."
+
+#~ msgid "Loading resource '%1' failed."
+#~ msgstr "'%1' kaynağı yüklenemedi."
+
+#~ msgid "Saving resource '%1' failed."
+#~ msgstr "'%1' kaynağı kaydedilemedi."
+
+#~ msgid "Unable to open resource '%1'."
+#~ msgstr "'%1' kaynağı açılamadı."
+
+#~ msgid "Default Address Book"
+#~ msgstr "Öntanımlı Adres Defteri"
+
+#~ msgid "Unable to save to resource '%1'. It is locked."
+#~ msgstr "'%1' kaynağı kaydedilemedi. Kilitli."
diff --git a/po/ug/kcontacts5.po b/po/ug/kcontacts5.po
new file mode 100644 (file)
index 0000000..bebc5e5
--- /dev/null
@@ -0,0 +1,652 @@
+# Uyghur translation for kabc.
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+# Sahran <sahran.ug@gmail.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2013-09-08 07:05+0900\n"
+"Last-Translator: Gheyret Kenji <gheyret@gmail.com>\n"
+"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
+"Language: ug\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"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Post Office Box"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr ""
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "كوچا"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "ئورۇن"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "رايون"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr ""
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "دۆلەت"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr ""
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr ""
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "خەلقئارا"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr ""
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr ""
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "ماكان"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "ئىش"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "ئامراق ئادرېس"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "باشقا"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr ""
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "ئاتى"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr ""
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "تەگات"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "بېرىلگەن ئاتى"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr ""
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr ""
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr ""
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "لەقىمى"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "تۇغۇلغان كۈن"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr ""
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr ""
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr ""
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr ""
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "ئوي ئادرېسى ئەنى"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr ""
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr ""
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr ""
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr ""
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr ""
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr ""
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr ""
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "ئۆي تېلېفون"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "شىركەت تېلېفون"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "يانفون"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "ئوي فاكىسى"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "خىزمەت فاكىس"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "ماشىنا تېلېفونى"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "چاقىرغۇ"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "ئېلخەت ئادرېسلىرى"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "خەت خېرىدارى"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "ۋاقىت رايونى"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr ""
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "ماۋزۇ"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "رول"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "ئورگان"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "تارماق"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "ئىزاھات"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr ""
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr ""
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr ""
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "باش بەت"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "تۇغ"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "سۈرەت"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "ئاۋاز"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "دوكتور"
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "خانقىز"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "ئەپەندى"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "خانىم"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "خانىم"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "ئەۋلاد"
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "ئەجداد"
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr ""
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "ھەممىسى"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "دائىم"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "ئادرېس"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "ئېلخەت"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "شەخسىي"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "ئىختىيارى"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "ئېنىقلىمىسىز"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr ""
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "ئىختىيارى"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "نامەلۇم تىپ"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr ""
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "ماكان"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "ئىش"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "مۇڭداشقۇ"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "1-تاللاش تۈرى"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "ئاۋاز"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "فاكىس"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "يانفون"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "سىن"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "خەت ساندۇقى"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "مودېم"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "ماشىنا"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr ""
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "باشقا"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr ""
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "خىزمەتتىكى فاكىس"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "ئاممىۋى"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "شەخسىي"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "مەخپىي"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "نامەلۇم تىپ"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "1-تاللاش تۈرى"
+
+#~ msgctxt "NAME OF TRANSLATORS"
+#~ msgid "Your names"
+#~ msgstr "ئابدۇقادىر ئابلىز, غەيرەت كەنجى"
+
+#~ msgctxt "EMAIL OF TRANSLATORS"
+#~ msgid "Your emails"
+#~ msgstr "sahran.ug@gmail.com,  gheyret@gmail.com"
+
+#~ msgctxt "@title:column addressee name"
+#~ msgid "Name"
+#~ msgstr "ئاتى"
+
+#~ msgctxt "@title:column addressee email"
+#~ msgid "Email"
+#~ msgstr "ئېلخەت"
+
+#~ msgctxt "@title:group selected addressees"
+#~ msgid "Selected"
+#~ msgstr "تاللانغان"
+
+#~ msgctxt "@action:button unselect addressee"
+#~ msgid "Unselect"
+#~ msgstr "تاللىما"
+
+#~ msgid "Email Addresses"
+#~ msgstr "ئېلخەت ئادرېسلىرى"
+
+#~ msgctxt "this the preferred email address"
+#~ msgid "Yes"
+#~ msgstr "ھەئە"
+
+#~ msgctxt "this is not the preferred email address"
+#~ msgid "No"
+#~ msgstr "ياق"
+
+#~ msgid "New List..."
+#~ msgstr "يېڭى تىزىم…"
+
+#~ msgid "Remove List"
+#~ msgstr "تىزىمنى چىقىرىۋېتىش"
+
+#~ msgid "Add Entry"
+#~ msgstr "كىرگۈ قوش"
+
+#~ msgctxt "@title:column addressee preferred email"
+#~ msgid "Email"
+#~ msgstr "ئېلخەت"
+
+#~ msgid "Remove Entry"
+#~ msgstr "تۈرنى چىقىرىۋەت"
+
+#~ msgid "New Distribution List"
+#~ msgstr "يېڭى تارقىتىلما تىزىمى"
+
+#~ msgctxt "this is not preferred email address"
+#~ msgid "No"
+#~ msgstr "ياق"
+
+#~ msgid "No description available."
+#~ msgstr "چۈشەندۈرۈشى يوق."
+
+#~ msgid "Error"
+#~ msgstr "خاتالىق"
diff --git a/po/uk/kcontacts5.po b/po/uk/kcontacts5.po
new file mode 100644 (file)
index 0000000..fe345c3
--- /dev/null
@@ -0,0 +1,594 @@
+# Translation of kcontacts5.po to Ukrainian
+# Copyright (C) 2018 This_file_is_part_of_KDE
+# This file is distributed under the license LGPL version 2.1 or
+# version 3 or later versions approved by the membership of KDE e.V.
+#
+# Yuri Chornoivan <yurchor@ukr.net>, 2014, 2015.
+msgid ""
+msgstr ""
+"Project-Id-Version: kcontacts5\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2015-12-25 16:12+0200\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "Абонентська скринька"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "Додаткова інформація про адресу"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Вулиця"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Район"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Область"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Поштовий код"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Країна"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "Надпис доставки"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "Домашня"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "Міжнародна"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "Поштова"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "Для посилок"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Домашня"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Робоча"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "Головна адреса"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "Інша"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "Унікальний ідентифікатор"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Ім’я"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "Форматоване ім’я"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "Прізвище"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "Ім'я"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "Додаткові імена"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "Почесні префікси"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "Почесні суфікси"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "Псевдонім"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "День народження"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "Домашня адреса (вулиця)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "Абонентська скринька домашньої адреси"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "Домашня адреса (місто)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "Домашня адреса (область)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "Домашня адреса (поштовий код)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "Домашня адреса (країна)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "Домашня адреса (мітка)"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "Робоча адреса (вулиця)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "Абонентська скринька робочої адреси"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "Робоча адреса (місто)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "Робоча адреса (область)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "Робоча адреса (поштовий код)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "Робоча адреса (країна)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "Робоча адреса (мітка)"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "Домашній телефон"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Робочий телефон"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Мобільний телефон"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "Домашній факс"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "Робочий факс"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Автомобільний телефон"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Пейджер"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Адреса ел. пошти"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Поштовий клієнт"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Часовий пояс"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "Географічне розташування"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "Титул"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "Посада"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "Установа"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Відділ"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Примітка"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "Ідентифікатор продукту"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "Дата модифікації"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "Рядок сорту"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "Домашня сторінка"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "Клас безпеки"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "Логотип"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Фото"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Звук"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Др."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "панна"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "пан"
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "пані"
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "пані"
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Проф."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Мол."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Ст."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "Невідоме поле"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "Всі"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "Часті"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "Адреса"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "Ел. пошта"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Особисті"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "Нетипові"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "Не визначено"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "Нетиповий"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "Невідомий тип"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "Номер телефону"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Домашній"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Робочий"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Кур'єр"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "Головний"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "Голос"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "Факс"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "Мобільний"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "Відео"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "Поштова скринька"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Модем"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "Автомобільний"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Інший"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "Головний номер"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Робочий факс"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "Публічний"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "Особистий"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "Конфіденційний"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "Невідомий тип"
+
+#~ msgctxt "Preferred address"
+#~ msgid "Preferred"
+#~ msgstr "Головна"
+
+#~ msgid "List of Emails"
+#~ msgstr "Список адрес ел. пошти"
diff --git a/po/zh_CN/kcontacts5.po b/po/zh_CN/kcontacts5.po
new file mode 100644 (file)
index 0000000..1b76efe
--- /dev/null
@@ -0,0 +1,584 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: kdeorg\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2023-01-12 10:30\n"
+"Last-Translator: \n"
+"Language-Team: Chinese Simplified\n"
+"Language: zh_CN\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-Crowdin-Project: kdeorg\n"
+"X-Crowdin-Project-ID: 269464\n"
+"X-Crowdin-Language: zh-CN\n"
+"X-Crowdin-File: /kf5-trunk/messages/kcontacts/kcontacts5.pot\n"
+"X-Crowdin-File-ID: 10972\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "邮局邮箱"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "扩展地址信息"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "街道"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "位置"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "地域"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "邮政编码"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "国家"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "邮递标签"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "国内"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "国际"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "邮局"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "包裹"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "家庭"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "办公"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "首选地址"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "其他"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "唯一标识符"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "名字"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "格式化姓名"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "姓氏"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "姓名"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "其他姓名"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "敬称前缀"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "敬称后缀"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "昵名"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "生日"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "居住地址(街道)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "住宅邮局邮箱"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "居住地址(城市)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "居住地址(区域)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "居住地址(邮编)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "居住地址(国家)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "居住地址(标志)"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "办公地址(街道)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "办公地址邮局信箱"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "办公地址(城市)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "办公地址(地区)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "办公地址(邮编)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "办公地址(城市)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "办公地址(标签)"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "宅电"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "办公电话"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "移动电话"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "家庭传真"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "办公传真"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "汽车电话"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "寻呼机"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "电子邮件地址"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "邮件客户端"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "时区"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "地理位置"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "头衔"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "职务"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "组织"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "部门"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "备注"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "产品标识符"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "修订日期"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "排序字符串"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "主页"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "安全类别"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "徽标"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "照片"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "声音"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr."
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Mr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mrs."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "未知字段"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "全部"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "频繁"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "地址"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "电子邮件"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "个人"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "自定义"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "未定义"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "自定义"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "未知类型"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "电话号码"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "家庭"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "办公"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "信使"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "首选"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "语音"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "传真"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "手机"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "视频"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "邮箱"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "调制解调器"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "车载"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "其他"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "首选号码"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "办公传真"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "公共"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "个人"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "机密"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "未知类型"
diff --git a/po/zh_TW/kcontacts5.po b/po/zh_TW/kcontacts5.po
new file mode 100644 (file)
index 0000000..901c4a9
--- /dev/null
@@ -0,0 +1,587 @@
+# translation of kabc.po to Chinese Traditional
+# Copyright (C) YEAR This_file_is_part_of_KDE
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Franklin Weng <franklin at goodhorse dot idv dot tw>, 2007, 2008.
+# Frank Weng (a.k.a. Franklin) <franklin at goodhorse dot idv dot tw>, 2008, 2009.
+# pan93412 <pan93412@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: kabc\n"
+"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
+"POT-Creation-Date: 2022-02-27 00:41+0000\n"
+"PO-Revision-Date: 2018-04-05 20:16+0800\n"
+"Last-Translator: pan93412 <pan93412@gmail.com>\n"
+"Language-Team: Chinese <zh-l10n@lists.linux.org.tw>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 2.0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: address.cpp:223
+#, kde-format
+msgid "Post Office Box"
+msgstr "郵政信箱"
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr "延伸位址資訊"
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "街道"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "位置"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "區域"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "郵遞區號"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "國家"
+
+#: address.cpp:335
+#, kde-format
+msgid "Delivery Label"
+msgstr "傳送標籤"
+
+#: address.cpp:353
+#, kde-format
+msgctxt "Address is in home country"
+msgid "Domestic"
+msgstr "家庭"
+
+#: address.cpp:355
+#, kde-format
+msgctxt "Address is not in home country"
+msgid "International"
+msgstr "國際"
+
+#: address.cpp:357
+#, kde-format
+msgctxt "Address for delivering letters"
+msgid "Postal"
+msgstr "郵局"
+
+#: address.cpp:359
+#, kde-format
+msgctxt "Address for delivering packages"
+msgid "Parcel"
+msgstr "包裹"
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "住家"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "工作"
+
+#: address.cpp:365
+#, kde-format
+msgid "Preferred Address"
+msgstr "預設位址"
+
+#: address.cpp:367
+#, kde-format
+msgctxt "another type of address"
+msgid "Other"
+msgstr "其他"
+
+#: addressee.cpp:456
+#, kde-format
+msgid "Unique Identifier"
+msgstr "唯一身份"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "名稱"
+
+#: addressee.cpp:672
+#, kde-format
+msgid "Formatted Name"
+msgstr "格式化名稱"
+
+#: addressee.cpp:692
+#, kde-format
+msgid "Family Name"
+msgstr "姓氏"
+
+#: addressee.cpp:712
+#, kde-format
+msgid "Given Name"
+msgstr "指定名稱"
+
+#: addressee.cpp:732
+#, kde-format
+msgid "Additional Names"
+msgstr "額外名稱"
+
+#: addressee.cpp:752
+#, kde-format
+msgid "Honorific Prefixes"
+msgstr "前置敬語"
+
+#: addressee.cpp:772
+#, kde-format
+msgid "Honorific Suffixes"
+msgstr "後置敬語"
+
+#: addressee.cpp:823
+#, kde-format
+msgid "Nick Name"
+msgstr "暱稱"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "生日"
+
+#: addressee.cpp:868
+#, kde-format
+msgid "Home Address Street"
+msgstr "住家地址(街道)"
+
+#: addressee.cpp:873
+#, kde-format
+msgid "Home Address Post Office Box"
+msgstr "住家地址郵政信箱"
+
+#: addressee.cpp:878
+#, kde-format
+msgid "Home Address City"
+msgstr "住家地址(城市)"
+
+#: addressee.cpp:883
+#, kde-format
+msgid "Home Address State"
+msgstr "住家地址(省、州)"
+
+#: addressee.cpp:888
+#, kde-format
+msgid "Home Address Zip Code"
+msgstr "住家地址(郵遞區號)"
+
+#: addressee.cpp:893
+#, kde-format
+msgid "Home Address Country"
+msgstr "住家地址(國家)"
+
+#: addressee.cpp:898
+#, kde-format
+msgid "Home Address Label"
+msgstr "住家地址標籤"
+
+#: addressee.cpp:903
+#, kde-format
+msgid "Business Address Street"
+msgstr "辦公室地址(街道)"
+
+#: addressee.cpp:908
+#, kde-format
+msgid "Business Address Post Office Box"
+msgstr "辦公室地址郵政信箱"
+
+#: addressee.cpp:913
+#, kde-format
+msgid "Business Address City"
+msgstr "辦公室地址(城市)"
+
+#: addressee.cpp:918
+#, kde-format
+msgid "Business Address State"
+msgstr "辦公室地址(省、州)"
+
+#: addressee.cpp:923
+#, kde-format
+msgid "Business Address Zip Code"
+msgstr "辦公室地址(郵遞區號)"
+
+#: addressee.cpp:928
+#, kde-format
+msgid "Business Address Country"
+msgstr "辦公室地址(國家)"
+
+#: addressee.cpp:933
+#, kde-format
+msgid "Business Address Label"
+msgstr "辦公室地址標籤"
+
+#: addressee.cpp:938
+#, kde-format
+msgid "Home Phone"
+msgstr "住家電話"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "辦公室電話"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "行動電話"
+
+#: addressee.cpp:953 phonenumber.cpp:218
+#, kde-format
+msgid "Home Fax"
+msgstr "家用傳真"
+
+#: addressee.cpp:958
+#, kde-format
+msgid "Business Fax"
+msgstr "辦公室傳真"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "車上電話"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "呼叫器"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "電子郵件地址"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "郵件處理程式"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "時區"
+
+#: addressee.cpp:1038
+#, kde-format
+msgid "Geographic Position"
+msgstr "地理位置"
+
+#: addressee.cpp:1089
+#, kde-format
+msgctxt "a person's title"
+msgid "Title"
+msgstr "職稱"
+
+#: addressee.cpp:1140
+#, kde-format
+msgctxt "of a person in an organization"
+msgid "Role"
+msgstr "角色"
+
+#: addressee.cpp:1191 field.cpp:229
+#, kde-format
+msgid "Organization"
+msgstr "組織"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "部門"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "附註"
+
+#: addressee.cpp:1251
+#, kde-format
+msgid "Product Identifier"
+msgstr "產品識別"
+
+#: addressee.cpp:1271
+#, kde-format
+msgid "Revision Date"
+msgstr "版本日期"
+
+#: addressee.cpp:1291
+#, kde-format
+msgid "Sort String"
+msgstr "排序字串"
+
+#: addressee.cpp:1317
+#, kde-format
+msgid "Homepage"
+msgstr "首頁"
+
+#: addressee.cpp:1337
+#, kde-format
+msgid "Security Class"
+msgstr "安全類別"
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr "圖標"
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "相片"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "音效"
+
+#: addresseehelper.cpp:59
+#, kde-format
+msgid "Dr."
+msgstr "Dr. "
+
+#: addresseehelper.cpp:60
+#, kde-format
+msgid "Miss"
+msgstr "Miss"
+
+#: addresseehelper.cpp:61
+#, kde-format
+msgid "Mr."
+msgstr "Mr."
+
+#: addresseehelper.cpp:62
+#, kde-format
+msgid "Mrs."
+msgstr "Mrs."
+
+#: addresseehelper.cpp:63
+#, kde-format
+msgid "Ms."
+msgstr "Ms."
+
+#: addresseehelper.cpp:64
+#, kde-format
+msgid "Prof."
+msgstr "Prof."
+
+#: addresseehelper.cpp:66
+#, kde-format
+msgid "I"
+msgstr "I"
+
+#: addresseehelper.cpp:67
+#, kde-format
+msgid "II"
+msgstr "II"
+
+#: addresseehelper.cpp:68
+#, kde-format
+msgid "III"
+msgstr "III"
+
+#: addresseehelper.cpp:69
+#, kde-format
+msgid "Jr."
+msgstr "Jr."
+
+#: addresseehelper.cpp:70
+#, kde-format
+msgid "Sr."
+msgstr "Sr."
+
+#: field.cpp:206
+#, kde-format
+msgid "Unknown Field"
+msgstr "未知的欄位"
+
+#: field.cpp:219
+#, kde-format
+msgid "All"
+msgstr "全部"
+
+#: field.cpp:221
+#, kde-format
+msgid "Frequent"
+msgstr "頻繁"
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr "地址"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr "電子郵件"
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "個人"
+
+#: field.cpp:231
+#, kde-format
+msgid "Custom"
+msgstr "自訂"
+
+#: field.cpp:233
+#, kde-format
+msgid "Undefined"
+msgstr "未定義"
+
+#: key.cpp:198
+#, kde-format
+msgctxt "X.509 public key"
+msgid "X509"
+msgstr "X509"
+
+#: key.cpp:201
+#, kde-format
+msgctxt "Pretty Good Privacy key"
+msgid "PGP"
+msgstr "PGP"
+
+#: key.cpp:204
+#, kde-format
+msgctxt "A custom key"
+msgid "Custom"
+msgstr "自訂"
+
+#: key.cpp:207
+#, kde-format
+msgctxt "another type of encryption key"
+msgid "Unknown type"
+msgstr "未知的型態"
+
+#: phonenumber.cpp:170
+#, kde-format
+msgctxt "Undefined phone type"
+msgid "Telephone number"
+msgstr "電話號碼"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "住家"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "工作"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "即時訊息"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr "預設"
+
+#: phonenumber.cpp:180
+#, kde-format
+msgid "Voice"
+msgstr "語音"
+
+#: phonenumber.cpp:182
+#, kde-format
+msgid "Fax"
+msgstr "傳真"
+
+#: phonenumber.cpp:184
+#, kde-format
+msgctxt "Mobile Phone"
+msgid "Mobile"
+msgstr "行動電話"
+
+#: phonenumber.cpp:186
+#, kde-format
+msgctxt "Video phone"
+msgid "Video"
+msgstr "影像"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr "郵政信箱"
+
+#: phonenumber.cpp:190
+#, kde-format
+msgid "Modem"
+msgstr "Modem"
+
+#: phonenumber.cpp:192
+#, kde-format
+msgctxt "Car Phone"
+msgid "Car"
+msgstr "車用電話"
+
+#: phonenumber.cpp:196
+#, kde-format
+msgid "PCS"
+msgstr "PCS"
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "其他"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr "預設號碼"
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "工作傳真"
+
+#: secrecy.cpp:98
+#, kde-format
+msgctxt "access is for everyone"
+msgid "Public"
+msgstr "公開"
+
+#: secrecy.cpp:101
+#, kde-format
+msgctxt "access is by owner only"
+msgid "Private"
+msgstr "私人"
+
+#: secrecy.cpp:104
+#, kde-format
+msgctxt "access is by owner and a controlled group"
+msgid "Confidential"
+msgstr "機密"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr "未知的型態"
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3a34c9c
--- /dev/null
@@ -0,0 +1,224 @@
+add_library(KF5Contacts)
+add_library(KF5::Contacts ALIAS KF5Contacts)
+
+target_sources(KF5Contacts PRIVATE
+    address.cpp
+    addressee.cpp
+    addressee.h
+    addresseehelper.cpp
+    addresseehelper.h
+    addresseelist.h
+    addressformat.cpp
+    addressformatparser.cpp
+    addressformatscript.cpp
+    addressformatter.cpp
+    address.h
+    calendarurl.cpp
+    calendarurl.h
+    clientpidmap.cpp
+    clientpidmap.h
+    contactgroup.cpp
+    contactgroup.h
+    contactgrouptool.cpp
+    contactgrouptool.h
+    converter/ldifconverter.cpp
+    converter/ldifconverter.h
+    converter/vcardconverter.cpp
+    converter/vcardconverter.h
+    email.cpp
+    email.h
+    field.cpp
+    fieldgroup.cpp
+    fieldgroup.h
+    field.h
+    gender.cpp
+    gender.h
+    geo.cpp
+    geo.h
+    impp.cpp
+    impp.h
+    key.cpp
+    key.h
+    lang.cpp
+    lang.h
+    ldif.cpp
+    ldif_p.h
+    namespace.cpp
+    nickname.cpp
+    nickname.h
+    note.cpp
+    note.h
+    org.cpp
+    org.h
+    parametermap_p.h
+    phonenumber.cpp
+    phonenumber.h
+    picture.cpp
+    picture.h
+    related.cpp
+    related.h
+    resourcelocatorurl.cpp
+    resourcelocatorurl.h
+    role.cpp
+    role.h
+    secrecy.cpp
+    secrecy.h
+    sound.cpp
+    sound.h
+    timezone.cpp
+    timezone.h
+    title.cpp
+    title.h
+    vcarddrag.cpp
+    vcarddrag.h
+    vcardparser/vcard.cpp
+    vcardparser/vcardline.cpp
+    vcardparser/vcardline_p.h
+    vcardparser/vcardparser.cpp
+    vcardparser/vcardparser_p.h
+    vcardparser/vcard_p.h
+    vcardtool.cpp
+    vcardtool_p.h
+
+
+  kcontacts.qrc
+  improtocols/improtocols.qrc
+)
+
+ecm_qt_declare_logging_category(KF5Contacts
+    HEADER kcontacts_debug.h
+    IDENTIFIER KCONTACTS_LOG
+    CATEGORY_NAME kf.contacts
+    OLD_CATEGORY_NAMES log_kcontacts org.kde.pim.kcontacts
+    DESCRIPTION "KContacts"
+    EXPORT KCONTACTS
+)
+
+ecm_generate_export_header(KF5Contacts
+    EXPORT_FILE_NAME kcontacts_export.h
+    BASE_NAME kcontacts
+    GROUP_BASE_NAME KF
+    VERSION ${KF_VERSION}
+    DEPRECATED_BASE_VERSION 0
+    DEPRECATION_VERSIONS 5.88 5.89 5.92
+    EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
+)
+
+target_include_directories(KF5Contacts INTERFACE "$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR_KF}/KContacts>")
+set(KContacts_BUILD_INCLUDE_DIRS
+    ${KContacts_SOURCE_DIR}/src
+    ${KContacts_BINARY_DIR}/src
+    ${KContacts_SOURCE_DIR}/src/vcardparser
+)
+target_include_directories(KF5Contacts PUBLIC "$<BUILD_INTERFACE:${KContacts_BUILD_INCLUDE_DIRS}>")
+
+target_link_libraries(KF5Contacts
+PUBLIC
+    Qt${QT_MAJOR_VERSION}::Core
+    Qt${QT_MAJOR_VERSION}::Gui
+PRIVATE
+    KF5::CoreAddons
+    KF5::ConfigCore
+    KF5::I18n
+    KF5::I18nLocaleData
+    KF5::Codecs # for the vcard parser
+)
+
+if (TARGET Qt6::Core5Compat)
+    target_link_libraries(KF5Contacts PRIVATE Qt6::Core5Compat) # QTextCodec
+endif()
+
+set_target_properties(KF5Contacts PROPERTIES
+    VERSION ${KContacts_VERSION}
+    SOVERSION ${KContacts_SOVERSION}
+    EXPORT_NAME Contacts
+)
+
+install(TARGETS KF5Contacts EXPORT KF5ContactsTargets ${KF_INSTALL_TARGETS_DEFAULT_ARGS})
+
+ecm_generate_headers(KContacts_CamelCase_HEADERS
+  HEADER_NAMES
+  Address
+  AddressFormat
+  Addressee
+  AddresseeList
+  CalendarUrl
+  ContactGroup
+  ContactGroupTool
+  Email
+  Field
+  Geo
+  Gender
+  Key
+  Lang
+  Namespace
+  Impp
+  PhoneNumber
+  Picture
+  Related
+  ResourceLocatorUrl
+  Secrecy
+  Sound
+  TimeZone
+  Title
+  Role
+  Note
+  Org
+  NickName
+  VCardDrag
+  FieldGroup
+  ClientPidMap
+  PREFIX KContacts
+  REQUIRED_HEADERS KContacts_HEADERS
+)
+
+add_subdirectory(converter)
+
+install(FILES
+    ${CMAKE_CURRENT_BINARY_DIR}/kcontacts_export.h
+    ${KContacts_HEADERS}
+    DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/kcontacts
+    COMPONENT Devel
+)
+
+install(FILES
+    ${KContacts_CamelCase_HEADERS}
+    DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/KContacts
+    COMPONENT Devel
+)
+
+ecm_qt_install_logging_categories(
+    EXPORT KCONTACTS
+    FILE kcontacts.categories
+    DESTINATION "${KDE_INSTALL_LOGGINGCATEGORIESDIR}"
+)
+
+ecm_generate_pri_file(BASE_NAME KContacts LIB_NAME KF5Contacts DEPS "KCoreAddons" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts)
+install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR})
+
+if(BUILD_QCH)
+    ecm_add_qch(
+        KF5Contacts_QCH
+        NAME KContacts
+        BASE_NAME KF5Contacts
+        VERSION ${KContacts_VERSION}
+        ORG_DOMAIN org.kde
+        SOURCES # using only public headers, to cover only public API
+            ${KContacts_HEADERS}
+            "${CMAKE_SOURCE_DIR}/docs/AddressFormat.md"
+        MD_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md"
+        LINK_QCHS
+            Qt5Core_QCH
+        INCLUDE_DIRS
+            ${KContacts_BUILD_INCLUDE_DIRS}
+        BLANK_MACROS
+            KCONTACTS_EXPORT
+            "KCONTACTS_DEPRECATED_VERSION(x, y, t)"
+            "KCONTACTS_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)"
+            "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION(x, y, t)"
+            "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)"
+        TAGFILE_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
+        QCH_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
+        COMPONENT Devel
+    )
+endif()
diff --git a/src/Messages.sh b/src/Messages.sh
new file mode 100644 (file)
index 0000000..98e3c3c
--- /dev/null
@@ -0,0 +1,2 @@
+#! /usr/bin/env bash
+$XGETTEXT *.cpp -o $podir/kcontacts5.pot
diff --git a/src/address.cpp b/src/address.cpp
new file mode 100644 (file)
index 0000000..7d227f8
--- /dev/null
@@ -0,0 +1,456 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "address.h"
+#include "addressformat.h"
+#include "addressformatter_p.h"
+
+#include "kcontacts_debug.h"
+#include <KConfig>
+#include <KCountry>
+#include <KLocalizedString>
+#include <krandom.h>
+
+#include <KConfigGroup>
+
+#include <QDataStream>
+#include <QSharedData>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Address::Private : public QSharedData
+{
+public:
+    Private()
+        : mEmpty(true)
+    {
+        mId = KRandom::randomString(10);
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mEmpty = other.mEmpty;
+        mId = other.mId;
+        mType = other.mType;
+
+        mPostOfficeBox = other.mPostOfficeBox;
+        mExtended = other.mExtended;
+        mStreet = other.mStreet;
+        mLocality = other.mLocality;
+        mRegion = other.mRegion;
+        mPostalCode = other.mPostalCode;
+        mCountry = other.mCountry;
+        mLabel = other.mLabel;
+    }
+
+    bool mEmpty;
+    QString mId;
+    Type mType;
+    Geo mGeo;
+
+    QString mPostOfficeBox;
+    QString mExtended;
+    QString mStreet;
+    QString mLocality;
+    QString mRegion;
+    QString mPostalCode;
+    QString mCountry;
+    QString mLabel;
+};
+
+Address::Address()
+    : d(new Private)
+{
+}
+
+Address::Address(Type type)
+    : d(new Private)
+{
+    d->mType = type;
+}
+
+Address::Address(const Address &other)
+    : d(other.d)
+{
+}
+
+Address::~Address()
+{
+}
+
+Address &Address::operator=(const Address &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool Address::operator==(const Address &other) const
+{
+    if (d->mId != other.d->mId) {
+        return false;
+    }
+    if (d->mType != other.d->mType) {
+        return false;
+    }
+    if (d->mPostOfficeBox != other.d->mPostOfficeBox) {
+        return false;
+    }
+    if (d->mExtended != other.d->mExtended) {
+        return false;
+    }
+    if (d->mStreet != other.d->mStreet) {
+        return false;
+    }
+    if (d->mLocality != other.d->mLocality) {
+        return false;
+    }
+    if (d->mRegion != other.d->mRegion) {
+        return false;
+    }
+    if (d->mPostalCode != other.d->mPostalCode) {
+        return false;
+    }
+    if (d->mCountry != other.d->mCountry) {
+        return false;
+    }
+    if (d->mLabel != other.d->mLabel) {
+        return false;
+    }
+
+    if (d->mGeo != other.d->mGeo) {
+        return false;
+    }
+
+    return true;
+}
+
+bool Address::operator!=(const Address &a) const
+{
+    return !(a == *this);
+}
+
+bool Address::isEmpty() const
+{
+    return d->mEmpty;
+}
+
+void Address::clear()
+{
+    *this = Address();
+}
+
+void Address::setId(const QString &id)
+{
+    d->mEmpty = false;
+    d->mId = id;
+}
+
+QString Address::id() const
+{
+    return d->mId;
+}
+
+void Address::setType(Type type)
+{
+    d->mEmpty = false;
+    d->mType = type;
+}
+
+Address::Type Address::type() const
+{
+    return d->mType;
+}
+
+QString Address::typeLabel(Type type)
+{
+    QString label;
+    const TypeList list = typeList();
+
+    for (const auto typeFlag : list) {
+        // these are actually flags
+        const TypeFlag flag = static_cast<TypeFlag>(static_cast<int>(typeFlag));
+        if (type & flag) {
+            label.append(QLatin1Char('/') + typeFlagLabel(flag));
+        }
+    }
+
+    // Remove the first '/'
+    if (!label.isEmpty()) {
+        label.remove(0, 1);
+    }
+
+    return label;
+}
+
+QString Address::typeLabel() const
+{
+    QString label;
+    const TypeList list = typeList();
+
+    for (const auto f : list) {
+        if ((type() & f) && (f != Pref)) {
+            label.append(QLatin1Char('/') + typeLabel(f));
+        }
+    }
+    // Remove the first '/'
+    if (!label.isEmpty()) {
+        label.remove(0, 1);
+    }
+    return label;
+}
+
+void Address::setPostOfficeBox(const QString &postOfficeBox)
+{
+    d->mEmpty = false;
+    d->mPostOfficeBox = postOfficeBox;
+}
+
+QString Address::postOfficeBox() const
+{
+    return d->mPostOfficeBox;
+}
+
+QString Address::postOfficeBoxLabel()
+{
+    return i18n("Post Office Box");
+}
+
+void Address::setExtended(const QString &extended)
+{
+    d->mEmpty = false;
+    d->mExtended = extended;
+}
+
+QString Address::extended() const
+{
+    return d->mExtended;
+}
+
+QString Address::extendedLabel()
+{
+    return i18n("Extended Address Information");
+}
+
+void Address::setStreet(const QString &street)
+{
+    d->mEmpty = false;
+    d->mStreet = street;
+}
+
+QString Address::street() const
+{
+    return d->mStreet;
+}
+
+QString Address::streetLabel()
+{
+    return i18n("Street");
+}
+
+void Address::setLocality(const QString &locality)
+{
+    d->mEmpty = false;
+    d->mLocality = locality;
+}
+
+QString Address::locality() const
+{
+    return d->mLocality;
+}
+
+QString Address::localityLabel()
+{
+    return i18n("Locality");
+}
+
+void Address::setRegion(const QString &region)
+{
+    d->mEmpty = false;
+    d->mRegion = region;
+}
+
+QString Address::region() const
+{
+    return d->mRegion;
+}
+
+QString Address::regionLabel()
+{
+    return i18n("Region");
+}
+
+void Address::setPostalCode(const QString &postalCode)
+{
+    d->mEmpty = false;
+    d->mPostalCode = postalCode;
+}
+
+QString Address::postalCode() const
+{
+    return d->mPostalCode;
+}
+
+QString Address::postalCodeLabel()
+{
+    return i18n("Postal Code");
+}
+
+void Address::setCountry(const QString &country)
+{
+    d->mEmpty = false;
+    d->mCountry = country;
+}
+
+QString Address::country() const
+{
+    return d->mCountry;
+}
+
+QString Address::countryLabel()
+{
+    return i18n("Country");
+}
+
+void Address::setLabel(const QString &label)
+{
+    d->mEmpty = false;
+    d->mLabel = label;
+}
+
+QString Address::label() const
+{
+    return d->mLabel;
+}
+
+QString Address::labelLabel()
+{
+    return i18n("Delivery Label");
+}
+
+Address::TypeList Address::typeList()
+{
+    static TypeList list;
+
+    if (list.isEmpty()) {
+        list << Dom << Intl << Postal << Parcel << Home << Work << Pref;
+    }
+
+    return list;
+}
+
+QString Address::typeFlagLabel(TypeFlag type)
+{
+    switch (type) {
+    case Dom:
+        return i18nc("Address is in home country", "Domestic");
+    case Intl:
+        return i18nc("Address is not in home country", "International");
+    case Postal:
+        return i18nc("Address for delivering letters", "Postal");
+    case Parcel:
+        return i18nc("Address for delivering packages", "Parcel");
+    case Home:
+        return i18nc("Home Address", "Home");
+    case Work:
+        return i18nc("Work Address", "Work");
+    case Pref:
+        return i18n("Preferred Address");
+    }
+    return i18nc("another type of address", "Other");
+}
+
+void Address::setGeo(const Geo &geo)
+{
+    d->mEmpty = false;
+    d->mGeo = geo;
+}
+
+Geo Address::geo() const
+{
+    return d->mGeo;
+}
+
+QString Address::toString() const
+{
+    QString str = QLatin1String("Address {\n");
+    str += QStringLiteral("  IsEmpty: %1\n").arg(d->mEmpty ? QStringLiteral("true") : QStringLiteral("false"));
+    str += QStringLiteral("  Id: %1\n").arg(d->mId);
+    str += QStringLiteral("  Type: %1\n").arg(typeLabel(d->mType));
+    str += QStringLiteral("  Post office box: %1\n").arg(d->mPostOfficeBox);
+    str += QStringLiteral("  Extended: %1\n").arg(d->mExtended);
+    str += QStringLiteral("  Street: %1\n").arg(d->mStreet);
+    str += QStringLiteral("  Locality: %1\n").arg(d->mLocality);
+    str += QStringLiteral("  Region: %1\n").arg(d->mRegion);
+    str += QStringLiteral("  Postal code: %1\n").arg(d->mPostalCode);
+    str += QStringLiteral("  Country: %1\n").arg(d->mCountry);
+    str += QStringLiteral("  Label: %1\n").arg(d->mLabel);
+    str += QStringLiteral("  Geo: %1\n").arg(d->mGeo.toString());
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 92)
+QString Address::formattedAddress(const QString &realName, const QString &orgaName) const
+{
+    return formatted(AddressFormatStyle::Postal, realName, orgaName);
+}
+#endif
+
+QString Address::formatted(AddressFormatStyle style, const QString &realName, const QString &orgaName) const
+{
+    const auto formatPref = (orgaName.isEmpty() || style != AddressFormatStyle::Postal) ? AddressFormatPreference::Generic : AddressFormatPreference::Business;
+    const auto format = AddressFormatRepository::formatForAddress(*this, formatPref);
+    return AddressFormatter::format(*this, realName, orgaName, format, style);
+}
+
+QString Address::formattedPostalAddress() const
+{
+    return formatted(AddressFormatStyle::Postal);
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 89)
+QString Address::countryToISO(const QString &cname)
+{
+    return KCountry::fromName(cname).alpha2().toLower();
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 89)
+QString Address::ISOtoCountry(const QString &ISOname)
+{
+    const auto c = KCountry::fromAlpha2(ISOname);
+    return c.isValid() ? c.name() : ISOname;
+}
+#endif
+
+// clang-format off
+QDataStream &KContacts::operator<<(QDataStream &s, const Address &addr)
+{
+    return s << addr.d->mId << (uint)addr.d->mType << addr.d->mPostOfficeBox
+             << addr.d->mExtended << addr.d->mStreet << addr.d->mLocality
+             << addr.d->mRegion << addr.d->mPostalCode << addr.d->mCountry
+             << addr.d->mLabel << addr.d->mEmpty << addr.d->mGeo;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Address &addr)
+{
+    uint type;
+    s >> addr.d->mId >> type >> addr.d->mPostOfficeBox >> addr.d->mExtended
+    >> addr.d->mStreet >> addr.d->mLocality >> addr.d->mRegion
+    >> addr.d->mPostalCode >> addr.d->mCountry >> addr.d->mLabel
+    >> addr.d->mEmpty >> addr.d->mGeo;
+
+    addr.d->mType = Address::Type(type);
+
+    return s;
+}
+// clang-format on
diff --git a/src/address.h b/src/address.h
new file mode 100644 (file)
index 0000000..04391f8
--- /dev/null
@@ -0,0 +1,414 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESS_H
+#define KCONTACTS_ADDRESS_H
+
+#include "geo.h"
+#include "kcontacts_export.h"
+#include "namespace.h"
+
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QString>
+#include <QVector>
+
+namespace KContacts
+{
+class Geo;
+/**
+  @brief
+  Postal address information.
+
+  This class represents information about a postal address.
+*/
+class KCONTACTS_EXPORT Address
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &s, const Address &addr);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &s, Address &addr);
+
+    Q_GADGET
+    Q_PROPERTY(QString id READ id WRITE setId)
+    Q_PROPERTY(bool isEmpty READ isEmpty)
+    Q_PROPERTY(Type type READ type WRITE setType)
+    Q_PROPERTY(QString typeLabel READ typeLabel)
+    Q_PROPERTY(QString postOfficeBox READ postOfficeBox WRITE setPostOfficeBox)
+    Q_PROPERTY(QString extended READ extended WRITE setExtended)
+    Q_PROPERTY(QString street READ street WRITE setStreet)
+    Q_PROPERTY(QString locality READ locality WRITE setLocality)
+    Q_PROPERTY(QString region READ region WRITE setRegion)
+    Q_PROPERTY(QString postalCode READ postalCode WRITE setPostalCode)
+    Q_PROPERTY(QString country READ country WRITE setCountry)
+    Q_PROPERTY(QString label READ label WRITE setLabel)
+    Q_PROPERTY(KContacts::Geo geo READ geo WRITE setGeo)
+
+    // TODO KF6: ideally this would be deprecated as it doesn't specify the formatting style
+    // we cannot do that yet though due to Grantlee themes needing this (which cannot call
+    // the invokable methods instead). The KF6::TextTemplate port might bring new options there,
+    // otherwise we can at least switch this from postal to the multi-line style for KF6
+    /**
+     * Country-specific formatted address without an addressee using postal address style.
+     * This is the same as calling formatted(AddressFormatStyle::Postal) with empty arguments.
+     * @see formatted()
+     * @since 5.12
+     */
+    Q_PROPERTY(QString formattedAddress READ formattedPostalAddress)
+
+public:
+    /**
+      List of addresses.
+    */
+    typedef QVector<Address> List;
+
+    /**
+      Address types:
+      @see Type
+    */
+    enum TypeFlag {
+        Dom = 1, /**< domestic */
+        Intl = 2, /**< international */
+        Postal = 4, /**< postal */
+        Parcel = 8, /**< parcel */
+        Home = 16, /**< home address */
+        Work = 32, /**< address at work */
+        Pref = 64, /**< preferred address */
+    };
+
+    /**
+     * Stores a combination of #TypeFlag values.
+     */
+    Q_DECLARE_FLAGS(Type, TypeFlag)
+    Q_FLAG(Type)
+
+    /**
+      List of address types.
+    */
+    typedef QList<TypeFlag> TypeList;
+
+    /**
+      Creates an empty address.
+    */
+    Address();
+
+    /**
+      Creates an address of the given @p type.
+    */
+    Address(Type type);
+
+    /**
+      Copy constructor.
+    */
+    Address(const Address &address);
+
+    /**
+      Destroys the address.
+    */
+    ~Address();
+
+    /**
+      Equality operator.
+
+      @param addr the address to compare to
+      @return @c true if @c this and @p addr are equal, otherwise @c false
+    */
+    Q_REQUIRED_RESULT bool operator==(const Address &other) const;
+
+    /**
+      Not-equal operator.
+
+      @param addr the address to compare to
+      @return @c true if @c this and @p addr are not equal, otherwise @c false
+    */
+    Q_REQUIRED_RESULT bool operator!=(const Address &other) const;
+
+    /**
+      Assignment operator.
+
+      @param addr the address data to assign to @c this
+      @return a reference to @c this
+    */
+    Address &operator=(const Address &other);
+
+    /**
+      Returns true, if the address is empty.
+    */
+    Q_REQUIRED_RESULT bool isEmpty() const;
+
+    /**
+      Clears all entries of the address.
+    */
+    void clear();
+
+    /**
+      Sets the unique @p identifier.
+    */
+    void setId(const QString &identifier);
+
+    /**
+      Returns the unique identifier.
+    */
+    Q_REQUIRED_RESULT QString id() const;
+
+    /**
+      Sets the type of address. See enum for definition of types.
+
+      @param type type, can be a bitwise or of multiple types.
+    */
+    void setType(Type type);
+
+    /**
+      Returns the type of address. Can be a bitwise or of multiple types.
+    */
+    Q_REQUIRED_RESULT Type type() const;
+
+    /**
+      Returns a translated string of all types the address has.
+    */
+    Q_REQUIRED_RESULT QString typeLabel() const;
+
+    /**
+      Sets the post office box.
+    */
+    void setPostOfficeBox(const QString &postOfficeBox);
+
+    /**
+      Returns the post office box.
+    */
+    Q_REQUIRED_RESULT QString postOfficeBox() const;
+
+    /**
+      Returns the translated label for post office box field.
+    */
+    static QString postOfficeBoxLabel();
+
+    /**
+      Sets the @p extended address information.
+    */
+    void setExtended(const QString &extended);
+
+    /**
+      Returns the extended address information.
+    */
+    Q_REQUIRED_RESULT QString extended() const;
+
+    /**
+      Returns the translated label for extended field.
+    */
+    static QString extendedLabel();
+
+    /**
+      Sets the @p street (including house number).
+    */
+    void setStreet(const QString &street);
+
+    /**
+      Returns the street.
+    */
+    Q_REQUIRED_RESULT QString street() const;
+
+    /**
+      Returns the translated label for street field.
+    */
+    static QString streetLabel();
+
+    /**
+      Sets the @p locality, e.g. city.
+
+      @param locality the locality of the address, e.g. city
+    */
+    void setLocality(const QString &locality);
+
+    /**
+      Returns the locality.
+    */
+    Q_REQUIRED_RESULT QString locality() const;
+
+    /**
+      Returns the translated label for locality field.
+    */
+    static QString localityLabel();
+
+    /**
+      Sets the @p region, e.g. state.
+
+      @param region the region the address falls into, e.g. state
+    */
+    void setRegion(const QString &region);
+
+    /**
+      Returns the region.
+    */
+    Q_REQUIRED_RESULT QString region() const;
+
+    /**
+      Returns the translated label for region field.
+    */
+    static QString regionLabel();
+
+    /**
+      Sets the postal @p code.
+    */
+    void setPostalCode(const QString &code);
+
+    /**
+      Returns the postal code.
+    */
+    Q_REQUIRED_RESULT QString postalCode() const;
+
+    /**
+      Returns the translated label for postal code field.
+    */
+    static QString postalCodeLabel();
+
+    /**
+      Sets the @p country.
+    */
+    void setCountry(const QString &country);
+
+    /**
+      Returns the country.
+    */
+    Q_REQUIRED_RESULT QString country() const;
+
+    /**
+      Returns the translated label for country field.
+    */
+    static QString countryLabel();
+
+    /**
+      Sets the delivery @p label. This is the literal text to be used as label.
+
+      @param label the string to use for delivery labels
+    */
+    void setLabel(const QString &label);
+
+    /**
+      Returns the delivery label.
+    */
+    Q_REQUIRED_RESULT QString label() const;
+
+    /**
+      Returns the translated label for delivery label field.
+    */
+    static QString labelLabel();
+
+    /**
+      Returns the list of available types.
+    */
+    static TypeList typeList();
+
+    /**
+      Returns the translated label for the given @p type.
+    */
+    static QString typeLabel(Type type);
+
+    /**
+      Returns a string representation of the address.
+    */
+    Q_REQUIRED_RESULT QString toString() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 92)
+    /**
+      Returns this address formatted according to the country-specific
+      postal address formatting rules. The formatting rules applied depend on
+      either the addresses {@link #country country} field, or (if the
+      latter is empty) on the system country setting. If companyName is
+      provided, an available business address format will be preferred.
+
+      @param realName   the formatted name of the contact
+      @param orgaName   the name of the organization or company
+      @return           the formatted address (containing newline characters)
+      @deprecated since 5.92, use formatted() instead, using AddressFormatStyle::Postal
+                  to obtain the identical result.
+    */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 92, "Use KContacts::Address::formatted() instead")
+    QString formattedAddress(const QString &realName = QString(), const QString &orgaName = QString()) const;
+#endif
+
+    // note: cannot be called "formattedAddress" due to a collision
+    // with the property of that name in QML
+    /**
+      Returns this address formatted according to the country-specific
+      address formatting rules. The formatting rules applied depend on
+      either the addresses {@link #country country} field, or (if the
+      latter is empty) on the system country setting.
+
+      @param style      the formatting style variant to use
+      @param realName   the formatted name of the contact
+      @param orgaName   the name of the organization or company
+      @return           the formatted address
+      @since 5.92
+    */
+    Q_REQUIRED_RESULT Q_INVOKABLE QString formatted(KContacts::AddressFormatStyle style,
+                                                    const QString &realName = QString(),
+                                                    const QString &orgaName = QString()) const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 89)
+    /**
+      Returns ISO code for a localized country name. Only localized country
+      names will be understood.
+      @param cname  name of the country
+      @return       two digit ISO code, empty string if the country was not
+                    recognized
+      @deprecated since 5.88, use KCountry::fromName() instead.
+                  Note that this function returned the ISO code incorrectly in lower case,
+                  while KCountry does not do that.
+    */
+    KCONTACTS_DEPRECATED_VERSION(5, 89, "Use KCountry::fromName()")
+    static QString countryToISO(const QString &cname);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 89)
+    /**
+      Returns a localized country name for a ISO code.
+      This might be replaced by a KLocale method in the future.
+      @param ISOname two digit ISO code
+      @return        localized name of the country
+      @deprecated since 5.88, use KCountry::fromAlpha2() instead.
+                  Note that this function returns @p ISOname if that is not a valid country code,
+                  while KCountry will need an explicit check for that case.
+    */
+    KCONTACTS_DEPRECATED_VERSION(5, 89, "Use KCountry::fromAlpha2()")
+    static QString ISOtoCountry(const QString &ISOname);
+#endif
+
+    static QString typeFlagLabel(TypeFlag type);
+
+    /**
+      Set geographic position.
+     */
+    void setGeo(const Geo &geo);
+
+    /**
+      Return geographic position.
+     */
+    Q_REQUIRED_RESULT Geo geo() const;
+
+private:
+    QString formattedPostalAddress() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(Address::Type)
+
+/**
+  Serializes the @p address object into the @p stream.
+*/
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Address &address);
+
+/**
+  Initializes the @p address object from the @p stream.
+*/
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Address &address);
+}
+
+Q_DECLARE_METATYPE(KContacts::Address)
+
+#endif
diff --git a/src/addressee.cpp b/src/addressee.cpp
new file mode 100644 (file)
index 0000000..d9f9037
--- /dev/null
@@ -0,0 +1,2766 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+    SPDX-FileCopyrightText: 2003 Carsten Pfeiffer <pfeiffer@kde.org>
+    SPDX-FileCopyrightText: 2005 Ingo Kloecker <kloecker@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QDate>
+#include <QRegularExpression>
+#include <QSharedData>
+#include <QUuid>
+
+#include "kcontacts_debug.h"
+#include <KLocalizedString>
+
+#include "addressee.h"
+#include "addresseehelper.h"
+#include "field.h"
+#include "parametermap_p.h"
+
+using namespace KContacts;
+
+static bool matchBinaryPattern(int value, int pattern);
+
+template<class L>
+static bool listEquals(const QVector<L> &list, const QVector<L> &pattern);
+static bool listEquals(const QStringList &list, const QStringList &pattern);
+
+struct CustomData {
+    QString name;
+    QString value;
+};
+
+inline bool operator==(const CustomData &a, const CustomData &b)
+{
+    return std::tie(a.name, a.value) == std::tie(b.name, b.value);
+}
+
+inline bool operator!=(const CustomData &a, const CustomData &b)
+{
+    return std::tie(a.name, a.value) != std::tie(b.name, b.value);
+}
+
+inline bool operator<(const CustomData &a, const CustomData &b)
+{
+    return a.name < b.name;
+}
+
+class Q_DECL_HIDDEN Addressee::Private : public QSharedData
+{
+public:
+    Private()
+        : mUid(QUuid::createUuid().toString().mid(1, 36))
+        , mEmpty(true)
+        , mChanged(false)
+        , mBirthdayWithTime(false)
+    {
+        // We avoid the curly braces so the string is RFC4122 compliant and can be used as urn
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mUid = other.mUid;
+        mName = other.mName;
+        mFormattedName = other.mFormattedName;
+        mFamilyName = other.mFamilyName;
+        mGivenName = other.mGivenName;
+        mAdditionalName = other.mAdditionalName;
+        mPrefix = other.mPrefix;
+        mSuffix = other.mSuffix;
+        mBirthday = other.mBirthday;
+        mBirthdayWithTime = other.mBirthdayWithTime;
+        mMailer = other.mMailer;
+        mTimeZone = other.mTimeZone;
+        mGeo = other.mGeo;
+        mDepartment = other.mDepartment;
+        mNote = other.mNote;
+        mProductId = other.mProductId;
+        mRevision = other.mRevision;
+        mSortString = other.mSortString;
+        mSecrecy = other.mSecrecy;
+        mLogo = other.mLogo;
+        mPhoto = other.mPhoto;
+        mSound = other.mSound;
+
+        mPhoneNumbers = other.mPhoneNumbers;
+        mAddresses = other.mAddresses;
+        mKeys = other.mKeys;
+        mLangs = other.mLangs;
+        mGender = other.mGender;
+        mEmails = other.mEmails;
+        mCategories = other.mCategories;
+        mCustomFields = other.mCustomFields;
+        mCalendarUrl = other.mCalendarUrl;
+        mSoundListExtra = other.mSoundListExtra;
+        mPhotoExtraList = other.mPhotoExtraList;
+        mLogoExtraList = other.mLogoExtraList;
+        mUrlExtraList = other.mUrlExtraList;
+        mMembers = other.mMembers;
+        mRelationships = other.mRelationships;
+        mSources = other.mSources;
+        mEmpty = other.mEmpty;
+        mImpps = other.mImpps;
+        mChanged = other.mChanged;
+        mTitleExtraList = other.mTitleExtraList;
+        mRoleExtraList = other.mRoleExtraList;
+        mOrgExtraList = other.mOrgExtraList;
+    }
+
+    ~Private()
+    {
+    }
+
+    std::vector<CustomData>::iterator findByName(const QString &qualifiedName)
+    {
+        return std::find_if(mCustomFields.begin(), mCustomFields.end(), [&qualifiedName](const CustomData &info) {
+            return info.name == qualifiedName;
+        });
+    }
+
+    std::vector<CustomData>::const_iterator findByName(const QString &qualifiedName) const
+    {
+        return std::find_if(mCustomFields.cbegin(), mCustomFields.cend(), [&qualifiedName](const CustomData &info) {
+            return info.name == qualifiedName;
+        });
+    }
+
+    QString mUid;
+    QString mName;
+    QString mFormattedName;
+    QString mFamilyName;
+    QString mGivenName;
+    QString mAdditionalName;
+    QString mPrefix;
+    QString mSuffix;
+    QDateTime mBirthday;
+    QString mMailer;
+    TimeZone mTimeZone;
+    Geo mGeo;
+    QString mDepartment;
+    QString mNote;
+    QString mProductId;
+    QDateTime mRevision;
+    QString mSortString;
+    Secrecy mSecrecy;
+    Picture mLogo;
+    Picture mPhoto;
+    Sound mSound;
+
+    PhoneNumber::List mPhoneNumbers;
+    Address::List mAddresses;
+    Key::List mKeys;
+    Email::List mEmails;
+    Lang::List mLangs;
+    Impp::List mImpps;
+    Gender mGender;
+    QString mKind;
+    QStringList mCategories;
+    std::vector<CustomData> mCustomFields;
+    CalendarUrl::List mCalendarUrl;
+    Sound::List mSoundListExtra;
+    Picture::List mPhotoExtraList;
+    Picture::List mLogoExtraList;
+    ResourceLocatorUrl::List mUrlExtraList;
+    QVector<QUrl> mSources;
+    QStringList mMembers;
+    Related::List mRelationships;
+    FieldGroup::List mFieldGroupList;
+    Title::List mTitleExtraList;
+    Role::List mRoleExtraList;
+    Org::List mOrgExtraList;
+    NickName::List mNickNameExtraList;
+    ClientPidMap::List mClientPidMapList;
+    bool mEmpty : 1;
+    bool mChanged : 1;
+    bool mBirthdayWithTime;
+};
+
+Addressee::Addressee()
+    : d(new Private)
+{
+}
+
+Addressee::~Addressee()
+{
+}
+
+Addressee::Addressee(const Addressee &other)
+    : d(other.d)
+{
+}
+
+Addressee &Addressee::operator=(const Addressee &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool Addressee::operator==(const Addressee &addressee) const
+{
+    if (d->mUid != addressee.d->mUid) {
+        qCDebug(KCONTACTS_LOG) << "uid differs";
+        return false;
+    }
+
+    if (d->mName != addressee.d->mName //
+        && !(d->mName.isEmpty() && addressee.d->mName.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "name differs";
+        return false;
+    }
+
+    if (d->mFormattedName != addressee.d->mFormattedName //
+        && !(d->mFormattedName.isEmpty() && addressee.d->mFormattedName.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "formattedName differs";
+        return false;
+    }
+
+    if (d->mFamilyName != addressee.d->mFamilyName //
+        && !(d->mFamilyName.isEmpty() && addressee.d->mFamilyName.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "familyName differs";
+        return false;
+    }
+
+    if (d->mGivenName != addressee.d->mGivenName //
+        && !(d->mGivenName.isEmpty() && addressee.d->mGivenName.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "givenName differs";
+        return false;
+    }
+
+    if (d->mAdditionalName != addressee.d->mAdditionalName //
+        && !(d->mAdditionalName.isEmpty() && addressee.d->mAdditionalName.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "additionalName differs";
+        return false;
+    }
+
+    if (d->mPrefix != addressee.d->mPrefix //
+        && !(d->mPrefix.isEmpty() && addressee.d->mPrefix.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "prefix differs";
+        return false;
+    }
+
+    if (d->mSuffix != addressee.d->mSuffix //
+        && !(d->mSuffix.isEmpty() && addressee.d->mSuffix.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "suffix differs";
+        return false;
+    }
+
+    if (d->mBirthday != addressee.d->mBirthday //
+        || d->mBirthdayWithTime != addressee.d->mBirthdayWithTime) {
+        qCDebug(KCONTACTS_LOG) << "birthday differs";
+        return false;
+    }
+
+    if (d->mMailer != addressee.d->mMailer //
+        && !(d->mMailer.isEmpty() && addressee.d->mMailer.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "mailer differs";
+        return false;
+    }
+
+    if (d->mTimeZone != addressee.d->mTimeZone) {
+        qCDebug(KCONTACTS_LOG) << "timeZone differs";
+        return false;
+    }
+
+    if (d->mGeo != addressee.d->mGeo) {
+        qCDebug(KCONTACTS_LOG) << "geo differs";
+        return false;
+    }
+
+    if (d->mDepartment != addressee.d->mDepartment //
+        && !(d->mDepartment.isEmpty() && addressee.d->mDepartment.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "department differs";
+        return false;
+    }
+
+    if (d->mNote != addressee.d->mNote //
+        && !(d->mNote.isEmpty() && addressee.d->mNote.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "note differs";
+        return false;
+    }
+
+    if (d->mProductId != addressee.d->mProductId //
+        && !(d->mProductId.isEmpty() && addressee.d->mProductId.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "productId differs";
+        return false;
+    }
+
+    if (d->mSortString != addressee.d->mSortString //
+        && !(d->mSortString.isEmpty() && addressee.d->mSortString.isEmpty())) {
+        qCDebug(KCONTACTS_LOG) << "sortString differs";
+        return false;
+    }
+
+    if (d->mSecrecy != addressee.d->mSecrecy) {
+        qCDebug(KCONTACTS_LOG) << "secrecy differs";
+        return false;
+    }
+
+    if (d->mLogo != addressee.d->mLogo) {
+        qCDebug(KCONTACTS_LOG) << "logo differs";
+        return false;
+    }
+
+    if (d->mPhoto != addressee.d->mPhoto) {
+        qCDebug(KCONTACTS_LOG) << "photo differs";
+        return false;
+    }
+
+    if (d->mSound != addressee.d->mSound) {
+        qCDebug(KCONTACTS_LOG) << "sound differs";
+        return false;
+    }
+
+    if (!listEquals(d->mPhoneNumbers, addressee.d->mPhoneNumbers)) {
+        qCDebug(KCONTACTS_LOG) << "phoneNumbers differs";
+        return false;
+    }
+
+    if (!listEquals(d->mAddresses, addressee.d->mAddresses)) {
+        qCDebug(KCONTACTS_LOG) << "addresses differs";
+        return false;
+    }
+
+    if (!listEquals(d->mKeys, addressee.d->mKeys)) {
+        qCDebug(KCONTACTS_LOG) << "keys differs";
+        return false;
+    }
+    if (!listEquals(d->mEmails, addressee.d->mEmails)) {
+        qCDebug(KCONTACTS_LOG) << "emails differs";
+        return false;
+    }
+
+    if (!listEquals(d->mCategories, addressee.d->mCategories)) {
+        qCDebug(KCONTACTS_LOG) << "categories differs";
+        return false;
+    }
+
+    if (d->mCustomFields != addressee.d->mCustomFields) {
+        qCDebug(KCONTACTS_LOG) << "custom differs";
+        return false;
+    }
+    if (d->mLangs != addressee.d->mLangs) {
+        qCDebug(KCONTACTS_LOG) << "langs differs";
+        return false;
+    }
+    if (d->mImpps != addressee.d->mImpps) {
+        qCDebug(KCONTACTS_LOG) << "impps differs";
+        return false;
+    }
+    if (d->mGender != addressee.d->mGender) {
+        qCDebug(KCONTACTS_LOG) << "gender differs";
+        return false;
+    }
+    if (d->mKind != addressee.d->mKind) {
+        qCDebug(KCONTACTS_LOG) << "kind differs";
+        return false;
+    }
+    if (!listEquals(d->mCalendarUrl, addressee.d->mCalendarUrl)) {
+        qCDebug(KCONTACTS_LOG) << "calendarUrl differs";
+        return false;
+    }
+    if (!listEquals(d->mSoundListExtra, addressee.d->mSoundListExtra)) {
+        qCDebug(KCONTACTS_LOG) << "Extra sound differs";
+        return false;
+    }
+    if (!listEquals(d->mPhotoExtraList, addressee.d->mPhotoExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra photo differs";
+        return false;
+    }
+    if (!listEquals(d->mLogoExtraList, addressee.d->mLogoExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra logo differs";
+        return false;
+    }
+    if (!listEquals(d->mUrlExtraList, addressee.d->mUrlExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra url differs";
+        return false;
+    }
+    if (!listEquals(d->mMembers, addressee.d->mMembers)) {
+        qCDebug(KCONTACTS_LOG) << "Extra url differs";
+        return false;
+    }
+    if (!listEquals(d->mRelationships, addressee.d->mRelationships)) {
+        qCDebug(KCONTACTS_LOG) << "Relationships differs";
+        return false;
+    }
+    if (!listEquals(d->mSources, addressee.d->mSources)) {
+        qCDebug(KCONTACTS_LOG) << "Sources differs";
+        return false;
+    }
+
+    if (!listEquals(d->mFieldGroupList, addressee.d->mFieldGroupList)) {
+        qCDebug(KCONTACTS_LOG) << "Field Groups differs";
+        return false;
+    }
+
+    if (!listEquals(d->mTitleExtraList, addressee.d->mTitleExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra TitleList differs";
+        return false;
+    }
+
+    if (!listEquals(d->mRoleExtraList, addressee.d->mRoleExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra RoleList differs";
+        return false;
+    }
+
+    if (!listEquals(d->mOrgExtraList, addressee.d->mOrgExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra Organization List differs";
+        return false;
+    }
+
+    if (!listEquals(d->mNickNameExtraList, addressee.d->mNickNameExtraList)) {
+        qCDebug(KCONTACTS_LOG) << "Extra NickName List differs";
+        return false;
+    }
+
+    if (!listEquals(d->mClientPidMapList, addressee.d->mClientPidMapList)) {
+        qCDebug(KCONTACTS_LOG) << "ClientPidMap List differs";
+        return false;
+    }
+    return true;
+}
+
+bool Addressee::operator!=(const Addressee &a) const
+{
+    return !(a == *this);
+}
+
+bool Addressee::isEmpty() const
+{
+    return d->mEmpty;
+}
+
+void Addressee::setUid(const QString &id)
+{
+    if (id == d->mUid) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mUid = id;
+}
+
+QString Addressee::uid() const
+{
+    return d->mUid;
+}
+
+QString Addressee::uidLabel()
+{
+    return i18n("Unique Identifier");
+}
+
+void Addressee::setName(const QString &name)
+{
+    if (name == d->mName) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mName = name;
+}
+
+QString Addressee::name() const
+{
+    return d->mName;
+}
+
+QString Addressee::nameLabel()
+{
+    return i18n("Name");
+}
+
+void Addressee::setKind(const QString &kind)
+{
+    if (kind == d->mKind) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mKind = kind;
+}
+
+QString Addressee::kind() const
+{
+    return d->mKind;
+}
+
+void Addressee::insertExtraSound(const Sound &sound)
+{
+    d->mEmpty = false;
+    d->mSoundListExtra.append(sound);
+}
+
+Sound::List Addressee::extraSoundList() const
+{
+    return d->mSoundListExtra;
+}
+
+void Addressee::insertExtraPhoto(const Picture &picture)
+{
+    d->mEmpty = false;
+    d->mPhotoExtraList.append(picture);
+}
+
+Picture::List Addressee::extraPhotoList() const
+{
+    return d->mPhotoExtraList;
+}
+
+void Addressee::insertExtraLogo(const Picture &logo)
+{
+    d->mEmpty = false;
+    d->mLogoExtraList.append(logo);
+}
+
+Picture::List Addressee::extraLogoList() const
+{
+    return d->mLogoExtraList;
+}
+
+void Addressee::setExtraSoundList(const Sound::List &soundList)
+{
+    d->mEmpty = false;
+    d->mSoundListExtra = soundList;
+}
+
+void Addressee::setExtraPhotoList(const Picture::List &pictureList)
+{
+    d->mEmpty = false;
+    d->mPhotoExtraList = pictureList;
+}
+
+void Addressee::setExtraLogoList(const Picture::List &logoList)
+{
+    d->mEmpty = false;
+    d->mLogoExtraList = logoList;
+}
+
+void Addressee::insertExtraUrl(const ResourceLocatorUrl &url)
+{
+    if (url.isValid()) {
+        d->mEmpty = false;
+        d->mUrlExtraList.append(url);
+    }
+}
+
+void Addressee::setExtraUrlList(const ResourceLocatorUrl::List &urlList)
+{
+    d->mEmpty = false;
+    d->mUrlExtraList = urlList;
+}
+
+ResourceLocatorUrl::List Addressee::extraUrlList() const
+{
+    return d->mUrlExtraList;
+}
+
+void Addressee::insertSourceUrl(const QUrl &url)
+{
+    d->mEmpty = false;
+    d->mSources.append(url);
+}
+
+void Addressee::setSourcesUrlList(const QVector<QUrl> &urlList)
+{
+    d->mEmpty = false;
+    d->mSources = urlList;
+}
+
+QVector<QUrl> Addressee::sourcesUrlList() const
+{
+    return d->mSources;
+}
+
+FieldGroup::List Addressee::fieldGroupList() const
+{
+    return d->mFieldGroupList;
+}
+
+void Addressee::setFieldGroupList(const FieldGroup::List &fieldGroupList)
+{
+    d->mEmpty = false;
+    d->mFieldGroupList = fieldGroupList;
+}
+
+void Addressee::insertFieldGroup(const FieldGroup &fieldGroup)
+{
+    if (fieldGroup.isValid()) {
+        d->mEmpty = false;
+        // TODO don't duplicate ?
+        d->mFieldGroupList.append(fieldGroup);
+    }
+}
+
+ClientPidMap::List Addressee::clientPidMapList() const
+{
+    return d->mClientPidMapList;
+}
+
+void Addressee::setClientPidMapList(const ClientPidMap::List &clientpidmaplist)
+{
+    d->mEmpty = false;
+    d->mClientPidMapList = clientpidmaplist;
+}
+
+void Addressee::insertClientPidMap(const ClientPidMap &clientpidmap)
+{
+    if (clientpidmap.isValid()) {
+        d->mEmpty = false;
+        // TODO don't duplicate ?
+        d->mClientPidMapList.append(clientpidmap);
+    }
+}
+
+void Addressee::insertImpp(const Impp &impp)
+{
+    if (impp.isValid()) {
+        d->mEmpty = false;
+        // Don't duplicate ?
+        d->mImpps.append(impp);
+    }
+}
+
+void Addressee::setImppList(const Impp::List &imppList)
+{
+    d->mEmpty = false;
+    d->mImpps = imppList;
+}
+
+Impp::List Addressee::imppList() const
+{
+    return d->mImpps;
+}
+
+void Addressee::insertCalendarUrl(const CalendarUrl &calendarUrl)
+{
+    d->mEmpty = false;
+    // TODO verify that there is not same calendarurl
+    if (calendarUrl.isValid()) {
+        d->mCalendarUrl.append(calendarUrl);
+    }
+}
+
+CalendarUrl::List Addressee::calendarUrlList() const
+{
+    return d->mCalendarUrl;
+}
+
+void Addressee::setFormattedName(const QString &formattedName)
+{
+    if (formattedName == d->mFormattedName) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mFormattedName = formattedName;
+}
+
+QString Addressee::formattedName() const
+{
+    return d->mFormattedName;
+}
+
+QString Addressee::formattedNameLabel()
+{
+    return i18n("Formatted Name");
+}
+
+void Addressee::setFamilyName(const QString &familyName)
+{
+    if (familyName == d->mFamilyName) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mFamilyName = familyName;
+}
+
+QString Addressee::familyName() const
+{
+    return d->mFamilyName;
+}
+
+QString Addressee::familyNameLabel()
+{
+    return i18n("Family Name");
+}
+
+void Addressee::setGivenName(const QString &givenName)
+{
+    if (givenName == d->mGivenName) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mGivenName = givenName;
+}
+
+QString Addressee::givenName() const
+{
+    return d->mGivenName;
+}
+
+QString Addressee::givenNameLabel()
+{
+    return i18n("Given Name");
+}
+
+void Addressee::setAdditionalName(const QString &additionalName)
+{
+    if (additionalName == d->mAdditionalName) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mAdditionalName = additionalName;
+}
+
+QString Addressee::additionalName() const
+{
+    return d->mAdditionalName;
+}
+
+QString Addressee::additionalNameLabel()
+{
+    return i18n("Additional Names");
+}
+
+void Addressee::setPrefix(const QString &prefix)
+{
+    if (prefix == d->mPrefix) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mPrefix = prefix;
+}
+
+QString Addressee::prefix() const
+{
+    return d->mPrefix;
+}
+
+QString Addressee::prefixLabel()
+{
+    return i18n("Honorific Prefixes");
+}
+
+void Addressee::setSuffix(const QString &suffix)
+{
+    if (suffix == d->mSuffix) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mSuffix = suffix;
+}
+
+QString Addressee::suffix() const
+{
+    return d->mSuffix;
+}
+
+QString Addressee::suffixLabel()
+{
+    return i18n("Honorific Suffixes");
+}
+
+void Addressee::setNickName(const QString &nickName)
+{
+    NickName t(nickName);
+    if (!d->mNickNameExtraList.isEmpty()) {
+        t = d->mNickNameExtraList.takeFirst();
+        t.setNickName(nickName);
+        d->mNickNameExtraList.prepend(t);
+        d->mEmpty = false;
+    } else {
+        insertExtraNickName(t);
+    }
+}
+
+void Addressee::setNickName(const NickName &nickName)
+{
+    insertExtraNickName(nickName);
+}
+
+void Addressee::insertExtraNickName(const NickName &nickName)
+{
+    if (nickName.isValid()) {
+        d->mEmpty = false;
+        d->mNickNameExtraList.append(nickName);
+    }
+}
+
+void Addressee::setExtraNickNameList(const NickName::List &nickNameList)
+{
+    d->mEmpty = false;
+    d->mNickNameExtraList = nickNameList;
+}
+
+NickName::List Addressee::extraNickNameList() const
+{
+    return d->mNickNameExtraList;
+}
+
+QString Addressee::nickName() const
+{
+    if (d->mNickNameExtraList.isEmpty()) {
+        return {};
+    } else {
+        return d->mNickNameExtraList.at(0).nickname();
+    }
+}
+
+QString Addressee::nickNameLabel()
+{
+    return i18n("Nick Name");
+}
+
+void Addressee::setBirthday(const QDateTime &birthday, bool withTime)
+{
+    if (birthday == d->mBirthday && d->mBirthdayWithTime == withTime) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mBirthday = birthday;
+    if (!withTime) {
+        d->mBirthday.setTime(QTime());
+    }
+    d->mBirthdayWithTime = withTime;
+}
+
+void Addressee::setBirthday(const QDate &birthday)
+{
+    if (birthday == d->mBirthday.date() && !d->mBirthdayWithTime) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mBirthday = QDateTime(birthday, QTime());
+    d->mBirthdayWithTime = false;
+}
+
+QDateTime Addressee::birthday() const
+{
+    return d->mBirthday;
+}
+
+bool Addressee::birthdayHasTime() const
+{
+    return d->mBirthdayWithTime;
+}
+
+QString Addressee::birthdayLabel()
+{
+    return i18n("Birthday");
+}
+
+QString Addressee::homeAddressStreetLabel()
+{
+    return i18n("Home Address Street");
+}
+
+QString Addressee::homeAddressPostOfficeBoxLabel()
+{
+    return i18n("Home Address Post Office Box");
+}
+
+QString Addressee::homeAddressLocalityLabel()
+{
+    return i18n("Home Address City");
+}
+
+QString Addressee::homeAddressRegionLabel()
+{
+    return i18n("Home Address State");
+}
+
+QString Addressee::homeAddressPostalCodeLabel()
+{
+    return i18n("Home Address Zip Code");
+}
+
+QString Addressee::homeAddressCountryLabel()
+{
+    return i18n("Home Address Country");
+}
+
+QString Addressee::homeAddressLabelLabel()
+{
+    return i18n("Home Address Label");
+}
+
+QString Addressee::businessAddressStreetLabel()
+{
+    return i18n("Business Address Street");
+}
+
+QString Addressee::businessAddressPostOfficeBoxLabel()
+{
+    return i18n("Business Address Post Office Box");
+}
+
+QString Addressee::businessAddressLocalityLabel()
+{
+    return i18n("Business Address City");
+}
+
+QString Addressee::businessAddressRegionLabel()
+{
+    return i18n("Business Address State");
+}
+
+QString Addressee::businessAddressPostalCodeLabel()
+{
+    return i18n("Business Address Zip Code");
+}
+
+QString Addressee::businessAddressCountryLabel()
+{
+    return i18n("Business Address Country");
+}
+
+QString Addressee::businessAddressLabelLabel()
+{
+    return i18n("Business Address Label");
+}
+
+QString Addressee::homePhoneLabel()
+{
+    return i18n("Home Phone");
+}
+
+QString Addressee::businessPhoneLabel()
+{
+    return i18n("Business Phone");
+}
+
+QString Addressee::mobilePhoneLabel()
+{
+    return i18n("Mobile Phone");
+}
+
+QString Addressee::homeFaxLabel()
+{
+    return i18n("Home Fax");
+}
+
+QString Addressee::businessFaxLabel()
+{
+    return i18n("Business Fax");
+}
+
+QString Addressee::carPhoneLabel()
+{
+    return i18n("Car Phone");
+}
+
+QString Addressee::isdnLabel()
+{
+    return i18n("ISDN");
+}
+
+QString Addressee::pagerLabel()
+{
+    return i18n("Pager");
+}
+
+QString Addressee::emailLabel()
+{
+    return i18n("Email Address");
+}
+
+void Addressee::setMailer(const QString &mailer)
+{
+    if (mailer == d->mMailer) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mMailer = mailer;
+}
+
+QString Addressee::mailer() const
+{
+    return d->mMailer;
+}
+
+QString Addressee::mailerLabel()
+{
+    return i18n("Mail Client");
+}
+
+void Addressee::setTimeZone(const TimeZone &timeZone)
+{
+    if (timeZone == d->mTimeZone) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mTimeZone = timeZone;
+}
+
+TimeZone Addressee::timeZone() const
+{
+    return d->mTimeZone;
+}
+
+QString Addressee::timeZoneLabel()
+{
+    return i18n("Time Zone");
+}
+
+void Addressee::setGeo(const Geo &geo)
+{
+    if (geo == d->mGeo) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mGeo = geo;
+}
+
+Geo Addressee::geo() const
+{
+    return d->mGeo;
+}
+
+QString Addressee::geoLabel()
+{
+    return i18n("Geographic Position");
+}
+
+void Addressee::setTitle(const QString &title)
+{
+    Title t(title);
+    if (!d->mTitleExtraList.isEmpty()) {
+        t = d->mTitleExtraList.takeFirst();
+        t.setTitle(title);
+        d->mTitleExtraList.prepend(t);
+        d->mEmpty = false;
+    } else {
+        insertExtraTitle(title);
+    }
+}
+
+void Addressee::setTitle(const Title &title)
+{
+    insertExtraTitle(title);
+}
+
+void Addressee::insertExtraTitle(const Title &title)
+{
+    if (title.isValid()) {
+        d->mEmpty = false;
+        d->mTitleExtraList.append(title);
+    }
+}
+
+QString Addressee::title() const
+{
+    if (d->mTitleExtraList.isEmpty()) {
+        return {};
+    } else {
+        return d->mTitleExtraList.at(0).title();
+    }
+}
+
+Title::List Addressee::extraTitleList() const
+{
+    return d->mTitleExtraList;
+}
+
+void Addressee::setExtraTitleList(const Title::List &urltitle)
+{
+    d->mEmpty = false;
+    d->mTitleExtraList = urltitle;
+}
+
+QString Addressee::titleLabel()
+{
+    return i18nc("a person's title", "Title");
+}
+
+void Addressee::setRole(const QString &role)
+{
+    Role t(role);
+    if (!d->mRoleExtraList.isEmpty()) {
+        t = d->mRoleExtraList.takeFirst();
+        t.setRole(role);
+        d->mRoleExtraList.prepend(t);
+        d->mEmpty = false;
+    } else {
+        insertExtraRole(t);
+    }
+}
+
+void Addressee::setRole(const Role &role)
+{
+    insertExtraRole(role);
+}
+
+void Addressee::insertExtraRole(const Role &role)
+{
+    if (role.isValid()) {
+        d->mEmpty = false;
+        d->mRoleExtraList.append(role);
+    }
+}
+
+void Addressee::setExtraRoleList(const Role::List &roleList)
+{
+    d->mEmpty = false;
+    d->mRoleExtraList = roleList;
+}
+
+Role::List Addressee::extraRoleList() const
+{
+    return d->mRoleExtraList;
+}
+
+QString Addressee::role() const
+{
+    if (d->mRoleExtraList.isEmpty()) {
+        return {};
+    } else {
+        return d->mRoleExtraList.at(0).role();
+    }
+}
+
+QString Addressee::roleLabel()
+{
+    return i18nc("of a person in an organization", "Role");
+}
+
+void Addressee::setOrganization(const QString &organization)
+{
+    Org t(organization);
+    if (!d->mOrgExtraList.isEmpty()) {
+        t = d->mOrgExtraList.takeFirst();
+        t.setOrganization(organization);
+        d->mOrgExtraList.prepend(t);
+        d->mEmpty = false;
+    } else {
+        insertExtraOrganization(t);
+    }
+}
+
+void Addressee::setOrganization(const Org &organization)
+{
+    insertExtraOrganization(organization);
+}
+
+void Addressee::insertExtraOrganization(const Org &organization)
+{
+    if (organization.isValid()) {
+        d->mEmpty = false;
+        d->mOrgExtraList.append(organization);
+    }
+}
+
+void Addressee::setExtraOrganizationList(const Org::List &orgList)
+{
+    d->mEmpty = false;
+    d->mOrgExtraList = orgList;
+}
+
+Org::List Addressee::extraOrganizationList() const
+{
+    return d->mOrgExtraList;
+}
+
+QString Addressee::organization() const
+{
+    if (d->mOrgExtraList.isEmpty()) {
+        return {};
+    } else {
+        return d->mOrgExtraList.at(0).organization();
+    }
+}
+
+QString Addressee::organizationLabel()
+{
+    return i18n("Organization");
+}
+
+void Addressee::setDepartment(const QString &department)
+{
+    if (department == d->mDepartment) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mDepartment = department;
+}
+
+QString Addressee::department() const
+{
+    return d->mDepartment;
+}
+
+QString Addressee::departmentLabel()
+{
+    return i18n("Department");
+}
+
+void Addressee::setNote(const QString &note)
+{
+    if (note == d->mNote) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mNote = note;
+}
+
+QString Addressee::note() const
+{
+    return d->mNote;
+}
+
+QString Addressee::noteLabel()
+{
+    return i18n("Note");
+}
+
+void Addressee::setProductId(const QString &productId)
+{
+    if (productId == d->mProductId) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mProductId = productId;
+}
+
+QString Addressee::productId() const
+{
+    return d->mProductId;
+}
+
+QString Addressee::productIdLabel()
+{
+    return i18n("Product Identifier");
+}
+
+void Addressee::setRevision(const QDateTime &revision)
+{
+    if (revision == d->mRevision) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mRevision = revision;
+}
+
+QDateTime Addressee::revision() const
+{
+    return d->mRevision;
+}
+
+QString Addressee::revisionLabel()
+{
+    return i18n("Revision Date");
+}
+
+void Addressee::setSortString(const QString &sortString)
+{
+    if (sortString == d->mSortString) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mSortString = sortString;
+}
+
+QString Addressee::sortString() const
+{
+    return d->mSortString;
+}
+
+QString Addressee::sortStringLabel()
+{
+    return i18n("Sort String");
+}
+
+void Addressee::setUrl(const QUrl &url)
+{
+    KContacts::ResourceLocatorUrl resourceLocator;
+    resourceLocator.setUrl(url);
+    insertExtraUrl(resourceLocator);
+}
+
+void Addressee::setUrl(const ResourceLocatorUrl &url)
+{
+    insertExtraUrl(url);
+}
+
+ResourceLocatorUrl Addressee::url() const
+{
+    if (d->mUrlExtraList.isEmpty()) {
+        return ResourceLocatorUrl();
+    } else {
+        return d->mUrlExtraList.at(0);
+    }
+}
+
+QString Addressee::urlLabel()
+{
+    return i18n("Homepage");
+}
+
+void Addressee::setSecrecy(const Secrecy &secrecy)
+{
+    if (secrecy == d->mSecrecy) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mSecrecy = secrecy;
+}
+
+Secrecy Addressee::secrecy() const
+{
+    return d->mSecrecy;
+}
+
+QString Addressee::secrecyLabel()
+{
+    return i18n("Security Class");
+}
+
+void Addressee::setLogo(const Picture &logo)
+{
+    if (logo == d->mLogo) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mLogo = logo;
+}
+
+Picture Addressee::logo() const
+{
+    return d->mLogo;
+}
+
+QString Addressee::logoLabel()
+{
+    return i18n("Logo");
+}
+
+void Addressee::setPhoto(const Picture &photo)
+{
+    if (photo == d->mPhoto) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mPhoto = photo;
+}
+
+Picture Addressee::photo() const
+{
+    return d->mPhoto;
+}
+
+QString Addressee::photoLabel()
+{
+    return i18n("Photo");
+}
+
+void Addressee::setSound(const Sound &sound)
+{
+    if (sound == d->mSound) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mSound = sound;
+}
+
+Sound Addressee::sound() const
+{
+    return d->mSound;
+}
+
+QString Addressee::soundLabel()
+{
+    return i18n("Sound");
+}
+
+void Addressee::setNameFromString(const QString &s)
+{
+    QString str = s;
+    // remove enclosing quotes from string
+    if (str.length() > 1 && s[0] == QLatin1Char('"') && s[s.length() - 1] == QLatin1Char('"')) {
+        str = s.mid(1, s.length() - 2);
+    }
+
+    setFormattedName(str);
+    setName(str);
+
+    // clear all name parts
+    setPrefix(QString());
+    setGivenName(QString());
+    setAdditionalName(QString());
+    setFamilyName(QString());
+    setSuffix(QString());
+
+    if (str.isEmpty()) {
+        return;
+    }
+
+    static QString spaceStr = QStringLiteral(" ");
+    static QString emptyStr = QStringLiteral("");
+    AddresseeHelper *helper = AddresseeHelper::self();
+
+    int i = str.indexOf(QLatin1Char(','));
+    if (i < 0) {
+        QStringList parts = str.split(spaceStr);
+        int leftOffset = 0;
+        int rightOffset = parts.count() - 1;
+
+        QString suffix;
+        while (rightOffset >= 0) {
+            if (helper->containsSuffix(parts[rightOffset])) {
+                suffix.prepend(parts[rightOffset] + (suffix.isEmpty() ? emptyStr : spaceStr));
+                rightOffset--;
+            } else {
+                break;
+            }
+        }
+        setSuffix(suffix);
+
+        if (rightOffset < 0) {
+            return;
+        }
+
+        if (rightOffset - 1 >= 0 && helper->containsPrefix(parts[rightOffset - 1].toLower())) {
+            setFamilyName(parts[rightOffset - 1] + spaceStr + parts[rightOffset]);
+            rightOffset--;
+        } else {
+            if (helper->treatAsFamilyName()) {
+                setFamilyName(parts[rightOffset]);
+            } else {
+                setGivenName(parts[rightOffset]);
+            }
+        }
+
+        QString prefix;
+        while (leftOffset < rightOffset) {
+            if (helper->containsTitle(parts[leftOffset])) {
+                prefix.append((prefix.isEmpty() ? emptyStr : spaceStr) + parts[leftOffset]);
+                leftOffset++;
+            } else {
+                break;
+            }
+        }
+        setPrefix(prefix);
+
+        if (leftOffset < rightOffset) {
+            setGivenName(parts[leftOffset]);
+            leftOffset++;
+        }
+
+        QString additionalName;
+        while (leftOffset < rightOffset) {
+            additionalName.append((additionalName.isEmpty() ? emptyStr : spaceStr) + parts[leftOffset]);
+            leftOffset++;
+        }
+        setAdditionalName(additionalName);
+    } else {
+        QString part1 = str.left(i);
+        QString part2 = str.mid(i + 1);
+
+        QStringList parts = part1.split(spaceStr);
+        int leftOffset = 0;
+        int rightOffset = parts.count() - 1;
+
+        if (!parts.isEmpty()) {
+            QString suffix;
+            while (rightOffset >= 0) {
+                if (helper->containsSuffix(parts[rightOffset])) {
+                    suffix.prepend(parts[rightOffset] + (suffix.isEmpty() ? emptyStr : spaceStr));
+                    rightOffset--;
+                } else {
+                    break;
+                }
+            }
+            setSuffix(suffix);
+
+            if (rightOffset - 1 >= 0 && helper->containsPrefix(parts[rightOffset - 1].toLower())) {
+                setFamilyName(parts[rightOffset - 1] + spaceStr + parts[rightOffset]);
+                rightOffset--;
+            } else {
+                setFamilyName(parts[rightOffset]);
+            }
+
+            QString prefix;
+            while (leftOffset < rightOffset) {
+                if (helper->containsTitle(parts[leftOffset])) {
+                    prefix.append((prefix.isEmpty() ? emptyStr : spaceStr) + parts[leftOffset]);
+                    leftOffset++;
+                } else {
+                    break;
+                }
+            }
+        } else {
+            setPrefix(QString());
+            setFamilyName(QString());
+            setSuffix(QString());
+        }
+
+        parts = part2.split(spaceStr);
+
+        leftOffset = 0;
+        rightOffset = parts.count();
+
+        if (!parts.isEmpty()) {
+            QString prefix;
+            while (leftOffset < rightOffset) {
+                if (helper->containsTitle(parts[leftOffset])) {
+                    prefix.append((prefix.isEmpty() ? emptyStr : spaceStr) + parts[leftOffset]);
+                    leftOffset++;
+                } else {
+                    break;
+                }
+            }
+            setPrefix(prefix);
+
+            if (leftOffset < rightOffset) {
+                setGivenName(parts[leftOffset]);
+                leftOffset++;
+            }
+
+            QString additionalName;
+            while (leftOffset < rightOffset) {
+                additionalName.append((additionalName.isEmpty() ? emptyStr : spaceStr) + parts[leftOffset]);
+                leftOffset++;
+            }
+            setAdditionalName(additionalName);
+        } else {
+            setGivenName(QString());
+            setAdditionalName(QString());
+        }
+    }
+}
+
+QString Addressee::realName() const
+{
+    QString n(formattedName());
+    if (!n.isEmpty()) {
+        return n;
+    }
+
+    n = assembledName();
+    if (!n.isEmpty()) {
+        return n;
+    }
+
+    n = name();
+    if (!n.isEmpty()) {
+        return n;
+    }
+
+    return organization();
+}
+
+QString Addressee::assembledName() const
+{
+    // clang-format off
+    const QString name = prefix() + QLatin1Char(' ')
+                         + givenName() + QLatin1Char(' ')
+                         + additionalName() + QLatin1Char(' ')
+                         + familyName() + QLatin1Char(' ')
+                         + suffix();
+    // clang-format on
+
+    return name.simplified();
+}
+
+QString Addressee::fullEmail(const QString &email) const
+{
+    QString e;
+    if (email.isNull()) {
+        e = preferredEmail();
+    } else {
+        e = email;
+    }
+    if (e.isEmpty()) {
+        return QString();
+    }
+
+    QString text;
+    if (realName().isEmpty()) {
+        text = e;
+    } else {
+        QRegularExpression needQuotes(QStringLiteral("[^ 0-9A-Za-z\\x{0080}-\\x{FFFF}]"));
+        if (realName().indexOf(needQuotes) != -1) {
+            QString name = realName();
+            name.replace(QLatin1String("\""), QLatin1String("\\\""));
+            text = QLatin1String("\"") + name + QLatin1String("\" <") + e + QLatin1Char('>');
+        } else {
+            text = realName() + QLatin1String(" <") + e + QLatin1Char('>');
+        }
+    }
+
+    return text;
+}
+
+void Addressee::addEmail(const Email &email)
+{
+    const QString mailAddr = email.mail();
+    auto it = std::find_if(d->mEmails.begin(), d->mEmails.end(), [&mailAddr](const Email &e) {
+        return e.mail() == mailAddr;
+    });
+    if (it != d->mEmails.end()) { // Already exists, modify it
+        *it = email;
+        if (email.isPreferred()) {
+            // Move it to the beginning of mEmails
+            std::rotate(d->mEmails.begin(), it, it + 1);
+        }
+        return;
+    }
+
+    // Add it to the list
+    d->mEmpty = false;
+    if (email.isPreferred()) {
+        d->mEmails.prepend(email);
+    } else {
+        d->mEmails.append(email);
+    }
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Addressee::insertEmail(const QString &email, bool preferred, const QMap<QString, QStringList> &param)
+{
+    if (email.simplified().isEmpty()) {
+        return;
+    }
+
+    for (int i = 0; i < d->mEmails.size(); ++i) {
+        if (d->mEmails.at(i).mail() == email) {
+            if (!preferred || i == 0) {
+                return;
+            }
+            Email tempMail = d->mEmails.takeAt(i);
+            d->mEmails.prepend(tempMail);
+            return;
+        }
+    }
+
+    Email mail(email);
+    mail.setParameters(param);
+    d->mEmpty = false;
+    if (preferred) {
+        d->mEmails.prepend(mail);
+    } else {
+        d->mEmails.append(mail);
+    }
+}
+#endif
+
+void Addressee::removeEmail(const QString &email)
+{
+    for (int i = 0; i < d->mEmails.size(); ++i) {
+        if (d->mEmails.at(i).mail() == email) {
+            d->mEmails.removeAt(i);
+        }
+    }
+}
+
+QString Addressee::preferredEmail() const
+{
+    if (d->mEmails.isEmpty()) {
+        return QString();
+    } else {
+        return d->mEmails.first().mail();
+    }
+}
+
+QStringList Addressee::emails() const
+{
+    QStringList list;
+    const int numberOfEmail = d->mEmails.size();
+    list.reserve(numberOfEmail);
+    for (int i = 0; i < numberOfEmail; ++i) {
+        list << d->mEmails.at(i).mail();
+    }
+
+    return list;
+}
+
+Email::List Addressee::emailList() const
+{
+    return d->mEmails;
+}
+
+void Addressee::setEmails(const QStringList &emails)
+{
+    d->mEmails.clear();
+    const int numEmails = emails.size();
+    d->mEmails.reserve(numEmails);
+    for (int i = 0; i < numEmails; ++i) {
+        d->mEmails.append(Email(emails.at(i)));
+    }
+    d->mEmpty = false;
+}
+
+void Addressee::setEmailList(const Email::List &list)
+{
+    d->mEmails = list;
+    d->mEmpty = false;
+}
+
+void Addressee::removeLang(const QString &language)
+{
+    for (int i = 0; i < d->mLangs.size(); ++i) {
+        if (d->mLangs.at(i).language() == language) {
+            d->mLangs.removeAt(i);
+        }
+    }
+}
+
+void Addressee::setLangs(const Lang::List &langs)
+{
+    d->mLangs = langs;
+    d->mEmpty = false;
+}
+
+void Addressee::insertLang(const Lang &language)
+{
+    const QString languageStr = language.language();
+    if (languageStr.simplified().isEmpty()) {
+        return;
+    }
+    d->mEmpty = false;
+
+    auto it = std::find_if(d->mLangs.begin(), d->mLangs.end(), [&languageStr](const Lang &lang) {
+        return lang.language() == languageStr;
+    });
+    if (it != d->mLangs.end()) {
+        (*it).setParams(language.params());
+        return;
+    }
+
+    d->mLangs.append(language);
+}
+
+Lang::List Addressee::langs() const
+{
+    return d->mLangs;
+}
+
+void Addressee::setGender(const Gender &gender)
+{
+    if (gender == d->mGender) {
+        return;
+    }
+
+    d->mEmpty = false;
+    d->mGender = gender;
+}
+
+Gender Addressee::gender() const
+{
+    return d->mGender;
+}
+
+void Addressee::insertPhoneNumber(const PhoneNumber &phoneNumber)
+{
+    d->mEmpty = false;
+
+    auto it = std::find_if(d->mPhoneNumbers.begin(), d->mPhoneNumbers.end(), [&phoneNumber](const PhoneNumber &pNumber) {
+        return pNumber.id() == phoneNumber.id();
+    });
+    if (it != d->mPhoneNumbers.end()) {
+        *it = phoneNumber;
+        return;
+    }
+
+    if (!phoneNumber.number().simplified().isEmpty()) {
+        d->mPhoneNumbers.append(phoneNumber);
+    }
+}
+
+void Addressee::removePhoneNumber(const PhoneNumber &phoneNumber)
+{
+    auto it = std::find_if(d->mPhoneNumbers.begin(), d->mPhoneNumbers.end(), [&phoneNumber](const PhoneNumber &p) {
+        return p.id() == phoneNumber.id();
+    });
+
+    if (it != d->mPhoneNumbers.end()) {
+        d->mPhoneNumbers.erase(it);
+    }
+}
+
+PhoneNumber Addressee::phoneNumber(PhoneNumber::Type type) const
+{
+    PhoneNumber phoneNumber(QString(), type);
+
+    for (const PhoneNumber &phone : d->mPhoneNumbers) {
+        if (matchBinaryPattern(phone.type(), type)) {
+            if (phone.type() & PhoneNumber::Pref) {
+                return phone;
+            } else if (phoneNumber.number().isEmpty()) {
+                phoneNumber = phone;
+            }
+        }
+    }
+
+    return phoneNumber;
+}
+
+PhoneNumber::List Addressee::phoneNumbers() const
+{
+    return d->mPhoneNumbers;
+}
+
+void Addressee::setPhoneNumbers(const PhoneNumber::List &phoneNumbers)
+{
+    d->mEmpty = false;
+    d->mPhoneNumbers.clear();
+    d->mPhoneNumbers = phoneNumbers;
+}
+
+PhoneNumber::List Addressee::phoneNumbers(PhoneNumber::Type type) const
+{
+    PhoneNumber::List list;
+
+    std::copy_if(d->mPhoneNumbers.cbegin(), d->mPhoneNumbers.cend(), std::back_inserter(list), [type](const auto &phone) {
+        return matchBinaryPattern(phone.type(), type);
+    });
+    return list;
+}
+
+PhoneNumber Addressee::findPhoneNumber(const QString &id) const
+{
+    auto it = std::find_if(d->mPhoneNumbers.cbegin(), d->mPhoneNumbers.cend(), [&id](const PhoneNumber &phone) {
+        return phone.id() == id;
+    });
+
+    return it != d->mPhoneNumbers.cend() ? *it : PhoneNumber{};
+}
+
+void Addressee::insertKey(const Key &key)
+{
+    d->mEmpty = false;
+
+    auto it = std::find_if(d->mKeys.begin(), d->mKeys.end(), [&key](Key &existing) {
+        return existing.id() == key.id();
+    });
+    if (it != d->mKeys.end()) {
+        *it = key;
+    } else {
+        d->mKeys.append(key);
+    }
+}
+
+void Addressee::removeKey(const Key &key)
+{
+    auto it = std::remove_if(d->mKeys.begin(), d->mKeys.end(), [&key](const Key &k) {
+        return k.id() == key.id();
+    });
+    d->mKeys.erase(it, d->mKeys.end());
+}
+
+Key Addressee::key(Key::Type type, const QString &customTypeString) const
+{
+    for (const auto &key : d->mKeys) {
+        if (key.type() == type) {
+            if (type == Key::Custom) {
+                if (customTypeString.isEmpty()) {
+                    return key;
+                } else {
+                    if (key.customTypeString() == customTypeString) {
+                        return key;
+                    }
+                }
+            } else {
+                return key;
+            }
+        }
+    }
+    return Key(QString(), type);
+}
+
+void Addressee::setKeys(const Key::List &list)
+{
+    d->mKeys = list;
+    d->mEmpty = false;
+}
+
+Key::List Addressee::keys() const
+{
+    return d->mKeys;
+}
+
+Key::List Addressee::keys(Key::Type type, const QString &customTypeString) const
+{
+    Key::List list;
+    auto matchFunc = [type, &customTypeString](const Key &key) {
+        if (key.type() == type) {
+            if (type == Key::Custom) {
+                if (customTypeString.isEmpty()) {
+                    return true;
+                } else {
+                    if (key.customTypeString() == customTypeString) {
+                        return true;
+                    }
+                }
+            } else {
+                return true;
+            }
+        }
+        return false;
+    };
+
+    std::copy_if(d->mKeys.cbegin(), d->mKeys.cend(), std::back_inserter(list), matchFunc);
+
+    return list;
+}
+
+Key Addressee::findKey(const QString &id) const
+{
+    auto it = std::find_if(d->mKeys.cbegin(), d->mKeys.cend(), [&id](const Key &key) {
+        return key.id() == id;
+    });
+
+    return it != d->mKeys.cend() ? *it : Key{};
+}
+
+QString Addressee::toString() const
+{
+    QString str = QLatin1String("Addressee {\n");
+    str += QStringLiteral("  Uid: %1\n").arg(uid());
+
+    str += QStringLiteral("  Name: %1\n").arg(name());
+    str += QStringLiteral("  FormattedName: %1\n").arg(formattedName());
+    str += QStringLiteral("  FamilyName: %1\n").arg(familyName());
+    str += QStringLiteral("  GivenName: %1\n").arg(givenName());
+    str += QStringLiteral("  AdditionalName: %1\n").arg(additionalName());
+    str += QStringLiteral("  Prefix: %1\n").arg(prefix());
+    str += QStringLiteral("  Suffix: %1\n").arg(suffix());
+    str += QStringLiteral("  NickName: %1\n").arg(nickName());
+    str += QStringLiteral("  Birthday: %1\n").arg(birthday().toString());
+    str += QStringLiteral("  Mailer: %1\n").arg(mailer());
+    str += QStringLiteral("  TimeZone: %1\n").arg(timeZone().toString());
+    str += QStringLiteral("  Geo: %1\n").arg(geo().toString());
+    str += QStringLiteral("  Title: %1\n").arg(title());
+    str += QStringLiteral("  Role: %1\n").arg(role());
+    str += QStringLiteral("  Organization: %1\n").arg(organization());
+    str += QStringLiteral("  Department: %1\n").arg(department());
+    str += QStringLiteral("  Note: %1\n").arg(note());
+    str += QStringLiteral("  ProductId: %1\n").arg(productId());
+    str += QStringLiteral("  Revision: %1\n").arg(revision().toString());
+    str += QStringLiteral("  SortString: %1\n").arg(sortString());
+    str += QStringLiteral("  Url: %1\n").arg(url().url().url());
+    str += QStringLiteral("  Secrecy: %1\n").arg(secrecy().toString());
+    str += QStringLiteral("  Logo: %1\n").arg(logo().toString());
+    str += QStringLiteral("  Photo: %1\n").arg(photo().toString());
+    str += QStringLiteral("  Sound: %1\n").arg(sound().toString());
+    str += QStringLiteral("  Gender: %1\n").arg(gender().toString());
+    str += QStringLiteral("  Kind: %1\n").arg(kind());
+
+    str += QLatin1String("  Emails {\n");
+    const Email::List listEmail = d->mEmails;
+    for (const Email &email : listEmail) {
+        str += email.toString();
+    }
+    str += QLatin1String("  }\n");
+
+    str += QLatin1String("  Langs {\n");
+    const Lang::List listLang = d->mLangs;
+    for (const Lang &lang : listLang) {
+        str += lang.toString();
+    }
+    str += QLatin1String("  }\n");
+
+    str += QLatin1String("  PhoneNumbers {\n");
+    const PhoneNumber::List phones = phoneNumbers();
+    for (const auto &p : phones) {
+        str += p.toString();
+    }
+    str += QLatin1String("  }\n");
+
+    str += QLatin1String("  Addresses {\n");
+    const Address::List addrList = addresses();
+    for (const auto &addr : addrList) {
+        str += addr.toString();
+    }
+    str += QLatin1String("  }\n");
+
+    str += QLatin1String("  Keys {\n");
+    const Key::List keyList = keys();
+    for (const auto &k : keyList) {
+        str += k.toString();
+    }
+    str += QLatin1String("  }\n");
+
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+void Addressee::insertAddress(const Address &address)
+{
+    if (address.isEmpty()) {
+        return;
+    }
+
+    d->mEmpty = false;
+
+    auto it = std::find_if(d->mAddresses.begin(), d->mAddresses.end(), [&address](const Address &addr) {
+        return addr.id() == address.id();
+    });
+    if (it != d->mAddresses.end()) {
+        *it = address;
+        return;
+    }
+
+    d->mAddresses.append(address);
+}
+
+void Addressee::removeAddress(const Address &address)
+{
+    auto it = std::find_if(d->mAddresses.begin(), d->mAddresses.end(), [&address](const Address &addr) {
+        return addr.id() == address.id();
+    });
+    if (it != d->mAddresses.end()) {
+        d->mAddresses.erase(it);
+    }
+}
+
+void Addressee::setAddresses(const Address::List &addresses)
+{
+    d->mEmpty = false;
+    d->mAddresses = addresses;
+}
+
+Address Addressee::address(Address::Type type) const
+{
+    Address address(type);
+    for (const Address &addr : d->mAddresses) {
+        if (matchBinaryPattern(addr.type(), type)) {
+            if (addr.type() & Address::Pref) {
+                return addr;
+            } else if (address.isEmpty()) {
+                address = addr;
+            }
+        }
+    }
+
+    return address;
+}
+
+Address::List Addressee::addresses() const
+{
+    return d->mAddresses;
+}
+
+Address::List Addressee::addresses(Address::Type type) const
+{
+    Address::List list;
+
+    std::copy_if(d->mAddresses.cbegin(), d->mAddresses.cend(), std::back_inserter(list), [type](const Address &addr) {
+        return matchBinaryPattern(addr.type(), type);
+    });
+
+    return list;
+}
+
+Address Addressee::findAddress(const QString &id) const
+{
+    auto it = std::find_if(d->mAddresses.cbegin(), d->mAddresses.cend(), [&id](const Address &addr) {
+        return addr.id() == id;
+    });
+    return it != d->mAddresses.cend() ? *it : Address{};
+}
+
+void Addressee::insertCategory(const QString &c)
+{
+    d->mEmpty = false;
+
+    if (d->mCategories.contains(c)) {
+        return;
+    }
+
+    d->mCategories.append(c);
+}
+
+void Addressee::removeCategory(const QString &category)
+{
+    if (d->mCategories.contains(category)) {
+        d->mCategories.removeAll(category);
+    }
+}
+
+bool Addressee::hasCategory(const QString &category) const
+{
+    return d->mCategories.contains(category);
+}
+
+void Addressee::setCategories(const QStringList &c)
+{
+    d->mEmpty = false;
+
+    d->mCategories = c;
+}
+
+QStringList Addressee::categories() const
+{
+    return d->mCategories;
+}
+
+void Addressee::insertMember(const QString &member)
+{
+    d->mEmpty = false;
+
+    if (d->mMembers.contains(member)) {
+        return;
+    }
+
+    d->mMembers.append(member);
+}
+
+void Addressee::setMembers(const QStringList &m)
+{
+    d->mEmpty = false;
+    d->mMembers = m;
+}
+
+QStringList Addressee::members() const
+{
+    return d->mMembers;
+}
+
+void Addressee::insertRelationship(const Related &relation)
+{
+    d->mEmpty = false;
+
+    if (d->mRelationships.contains(relation)) {
+        return;
+    }
+
+    d->mRelationships.append(relation);
+}
+
+void Addressee::setRelationships(const Related::List &c)
+{
+    d->mEmpty = false;
+    d->mRelationships = c;
+}
+
+Related::List Addressee::relationships() const
+{
+    return d->mRelationships;
+}
+
+static const auto VENDOR_ID = QStringLiteral("KADDRESSBOOK");
+static const auto X_ANNIVERSARY = QStringLiteral("X-Anniversary");
+static const auto X_ASSISTANTSNAME = QStringLiteral("X-AssistantsName");
+static const auto BLOGFEED = QStringLiteral("BlogFeed");
+static const auto X_MANAGERSNAME = QStringLiteral("X-ManagersName");
+static const auto X_OFFICE = QStringLiteral("X-Office");
+static const auto X_PROFESSION = QStringLiteral("X-Profession");
+static const auto X_SPOUSESNAME = QStringLiteral("X-SpousesName");
+
+QDate Addressee::anniversary() const
+{
+    return QDate::fromString(custom(VENDOR_ID, X_ANNIVERSARY), Qt::ISODate);
+}
+
+void Addressee::setAnniversary(const QDate &anniversary)
+{
+    if (anniversary.isValid()) {
+        insertCustom(VENDOR_ID, X_ANNIVERSARY, anniversary.toString(Qt::ISODate));
+    } else {
+        removeCustom(VENDOR_ID, X_ANNIVERSARY);
+    }
+}
+
+QString Addressee::assistantsName() const
+{
+    return custom(VENDOR_ID, X_ASSISTANTSNAME);
+}
+
+void Addressee::setAssistantsName(const QString &assistantsName)
+{
+    if (!assistantsName.isEmpty()) {
+        insertCustom(VENDOR_ID, X_ASSISTANTSNAME, assistantsName);
+    } else {
+        removeCustom(VENDOR_ID, X_ASSISTANTSNAME);
+    }
+}
+
+QUrl Addressee::blogFeed() const
+{
+    return QUrl(custom(VENDOR_ID, BLOGFEED));
+}
+
+void Addressee::setBlogFeed(const QUrl &blogFeed)
+{
+    if (!blogFeed.isEmpty()) {
+        insertCustom(VENDOR_ID, BLOGFEED, blogFeed.url());
+    } else {
+        removeCustom(VENDOR_ID, BLOGFEED);
+    }
+}
+
+QString Addressee::managersName() const
+{
+    return custom(VENDOR_ID, X_MANAGERSNAME);
+}
+
+void Addressee::setManagersName(const QString &managersName)
+{
+    if (!managersName.isEmpty()) {
+        insertCustom(VENDOR_ID, X_MANAGERSNAME, managersName);
+    } else {
+        removeCustom(VENDOR_ID, X_MANAGERSNAME);
+    }
+}
+
+QString Addressee::office() const
+{
+    return custom(VENDOR_ID, X_OFFICE);
+}
+
+void Addressee::setOffice(const QString &office)
+{
+    if (!office.isEmpty()) {
+        insertCustom(VENDOR_ID, X_OFFICE, office);
+    } else {
+        removeCustom(VENDOR_ID, X_OFFICE);
+    }
+}
+
+QString Addressee::profession() const
+{
+    return custom(VENDOR_ID, X_PROFESSION);
+}
+
+void Addressee::setProfession(const QString &profession)
+{
+    if (!profession.isEmpty()) {
+        insertCustom(VENDOR_ID, X_PROFESSION, profession);
+    } else {
+        removeCustom(VENDOR_ID, X_PROFESSION);
+    }
+}
+
+QString Addressee::spousesName() const
+{
+    return custom(VENDOR_ID, X_SPOUSESNAME);
+}
+
+void Addressee::setSpousesName(const QString &spousesName)
+{
+    if (!spousesName.isEmpty()) {
+        insertCustom(VENDOR_ID, X_SPOUSESNAME, spousesName);
+    } else {
+        removeCustom(VENDOR_ID, X_SPOUSESNAME);
+    }
+}
+
+void Addressee::insertCustom(const QString &app, const QString &name, const QString &value)
+{
+    if (value.isEmpty() || name.isEmpty() || app.isEmpty()) {
+        return;
+    }
+
+    d->mEmpty = false;
+
+    const QString qualifiedName = app + QLatin1Char('-') + name;
+
+    auto it = d->findByName(qualifiedName);
+    if (it != d->mCustomFields.end()) {
+        it->value = value;
+    } else {
+        const CustomData newdata{qualifiedName, value};
+        auto beforeIt = std::lower_bound(d->mCustomFields.begin(), d->mCustomFields.end(), newdata);
+        d->mCustomFields.insert(beforeIt, newdata);
+    }
+}
+
+void Addressee::removeCustom(const QString &app, const QString &name)
+{
+    const QString qualifiedName = app + QLatin1Char('-') + name;
+    auto it = d->findByName(qualifiedName);
+    if (it != d->mCustomFields.end()) {
+        d->mCustomFields.erase(it);
+    }
+}
+
+QString Addressee::custom(const QString &app, const QString &name) const
+{
+    const QString qualifiedName = app + QLatin1Char('-') + name;
+    auto it = d->findByName(qualifiedName);
+    return it != d->mCustomFields.cend() ? it->value : QString{};
+}
+
+void Addressee::setCustoms(const QStringList &customs)
+{
+    d->mEmpty = false;
+
+    d->mCustomFields.clear();
+
+    // Less than 10 elements in "customs", we needn't use a set
+    QStringList seen;
+    for (const QString &custom : customs) {
+        const int index = custom.indexOf(QLatin1Char(':'));
+        if (index == -1) {
+            continue;
+        }
+
+        const QString qualifiedName = custom.left(index);
+        const QString value = custom.mid(index + 1);
+
+        if (!seen.contains(qualifiedName)) {
+            d->mCustomFields.push_back({qualifiedName, value});
+            seen.push_back(qualifiedName);
+        }
+    }
+    std::sort(d->mCustomFields.begin(), d->mCustomFields.end());
+}
+
+QStringList Addressee::customs() const
+{
+    QStringList result;
+    result.reserve(d->mCustomFields.size());
+
+    static const QLatin1Char sep(':');
+    for (const auto &[name, value] : d->mCustomFields) {
+        result << name + sep + value;
+    }
+
+    return result;
+}
+
+void Addressee::parseEmailAddress(const QString &rawEmail, QString &fullName, QString &email)
+{
+    // This is a simplified version of KPIM::splitAddress().
+
+    fullName.clear();
+    email.clear();
+    if (rawEmail.isEmpty()) {
+        return; // KPIM::AddressEmpty;
+    }
+
+    // The code works on 8-bit strings, so convert the input to UTF-8.
+    QByteArray address = rawEmail.toUtf8();
+
+    QByteArray displayName;
+    QByteArray addrSpec;
+    QByteArray comment;
+
+    // The following is a primitive parser for a mailbox-list (cf. RFC 2822).
+    // The purpose is to extract a displayable string from the mailboxes.
+    // Comments in the addr-spec are not handled. No error checking is done.
+
+    enum sourceLevel {
+        TopLevel,
+        InComment,
+        InAngleAddress,
+    };
+    sourceLevel context = TopLevel;
+    bool inQuotedString = false;
+    int commentLevel = 0;
+    bool stop = false;
+
+    for (char *p = address.data(); *p && !stop; ++p) {
+        switch (context) {
+        case TopLevel:
+            switch (*p) {
+            case '"':
+                inQuotedString = !inQuotedString;
+                displayName += *p;
+                break;
+            case '(':
+                if (!inQuotedString) {
+                    context = InComment;
+                    commentLevel = 1;
+                } else {
+                    displayName += *p;
+                }
+                break;
+            case '<':
+                if (!inQuotedString) {
+                    context = InAngleAddress;
+                } else {
+                    displayName += *p;
+                }
+                break;
+            case '\\': // quoted character
+                displayName += *p;
+                ++p; // skip the '\'
+                if (*p) {
+                    displayName += *p;
+                } else {
+                    // return KPIM::UnexpectedEnd;
+                    goto ABORT_PARSING;
+                }
+                break;
+            case ',':
+                if (!inQuotedString) {
+                    // if ( allowMultipleAddresses )
+                    //  stop = true;
+                    // else
+                    //  return KPIM::UnexpectedComma;
+                    goto ABORT_PARSING;
+                } else {
+                    displayName += *p;
+                }
+                break;
+            default:
+                displayName += *p;
+            }
+            break;
+        case InComment:
+            switch (*p) {
+            case '(':
+                ++commentLevel;
+                comment += *p;
+                break;
+            case ')':
+                --commentLevel;
+                if (commentLevel == 0) {
+                    context = TopLevel;
+                    comment += ' '; // separate the text of several comments
+                } else {
+                    comment += *p;
+                }
+                break;
+            case '\\': // quoted character
+                comment += *p;
+                ++p; // skip the '\'
+                if (*p) {
+                    comment += *p;
+                } else {
+                    // return KPIM::UnexpectedEnd;
+                    goto ABORT_PARSING;
+                }
+                break;
+            default:
+                comment += *p;
+            }
+            break;
+        case InAngleAddress:
+            switch (*p) {
+            case '"':
+                inQuotedString = !inQuotedString;
+                addrSpec += *p;
+                break;
+            case '>':
+                if (!inQuotedString) {
+                    context = TopLevel;
+                } else {
+                    addrSpec += *p;
+                }
+                break;
+            case '\\': // quoted character
+                addrSpec += *p;
+                ++p; // skip the '\'
+                if (*p) {
+                    addrSpec += *p;
+                } else {
+                    // return KPIM::UnexpectedEnd;
+                    goto ABORT_PARSING;
+                }
+                break;
+            default:
+                addrSpec += *p;
+            }
+            break;
+        } // switch ( context )
+    }
+
+ABORT_PARSING:
+    displayName = displayName.trimmed();
+    comment = comment.trimmed();
+    addrSpec = addrSpec.trimmed();
+    fullName = QString::fromUtf8(displayName);
+    email = QString::fromUtf8(addrSpec); // check for errors
+    if (inQuotedString) {
+        return; // KPIM::UnbalancedQuote;
+    }
+    if (context == InComment) {
+        return; // KPIM::UnbalancedParens;
+    }
+    if (context == InAngleAddress) {
+        return; // KPIM::UnclosedAngleAddr;
+    }
+
+    if (addrSpec.isEmpty()) {
+        if (displayName.isEmpty()) {
+            return; // KPIM::NoAddressSpec;
+        } else {
+            // addrSpec = displayName;
+            // displayName.truncate( 0 );
+            // Address of the form "foo@bar" or "foo@bar (Name)".
+            email = fullName;
+            fullName = QString::fromUtf8(comment);
+        }
+    }
+
+    email = email.toLower();
+
+    // Check that the full name is not enclosed in balanced double quotes.
+    // If it is then remove them.
+    const unsigned int len = fullName.length();
+    if (len < 3) { // not long enough to be
+        return;
+    }
+    if (fullName.startsWith(QLatin1Char('"')) && fullName.endsWith(QLatin1Char('"'))) {
+        fullName = fullName.mid(1, len - 2);
+    }
+}
+
+void Addressee::setChanged(bool value)
+{
+    d->mChanged = value;
+}
+
+bool Addressee::changed() const
+{
+    return d->mChanged;
+}
+
+QString Addressee::mimeType()
+{
+    return QStringLiteral("text/directory");
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Addressee &a)
+{
+    s << a.d->mUid;
+
+    s << a.d->mName;
+    s << a.d->mFormattedName;
+    s << a.d->mFamilyName;
+    s << a.d->mGivenName;
+    s << a.d->mAdditionalName;
+    s << a.d->mPrefix;
+    s << a.d->mSuffix;
+    s << a.d->mBirthday;
+    s << a.d->mBirthdayWithTime;
+    s << a.d->mMailer;
+    s << a.d->mTimeZone;
+    s << a.d->mGeo;
+    s << a.d->mDepartment;
+    s << a.d->mNote;
+    s << a.d->mProductId;
+    s << a.d->mRevision;
+    s << a.d->mSortString;
+    s << a.d->mSecrecy;
+    s << a.d->mLogo;
+    s << a.d->mPhoto;
+    s << a.d->mSound;
+    s << a.d->mPhoneNumbers;
+    s << a.d->mAddresses;
+    s << a.d->mEmails;
+    s << a.d->mCategories;
+    s << a.customs();
+    s << a.d->mKeys;
+    s << a.d->mLangs;
+    s << a.d->mGender;
+    s << a.d->mKind;
+    s << a.d->mCalendarUrl;
+    s << a.d->mSoundListExtra;
+    s << a.d->mPhotoExtraList;
+    s << a.d->mLogoExtraList;
+    s << a.d->mUrlExtraList;
+    s << a.d->mMembers;
+    s << a.d->mRelationships;
+    s << a.d->mSources;
+    s << a.d->mImpps;
+    s << a.d->mFieldGroupList;
+    s << a.d->mTitleExtraList;
+    s << a.d->mRoleExtraList;
+    s << a.d->mOrgExtraList;
+    s << a.d->mNickNameExtraList;
+    s << a.d->mClientPidMapList;
+
+    return s;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Addressee &a)
+{
+    s >> a.d->mUid;
+
+    s >> a.d->mName;
+    s >> a.d->mFormattedName;
+    s >> a.d->mFamilyName;
+    s >> a.d->mGivenName;
+    s >> a.d->mAdditionalName;
+    s >> a.d->mPrefix;
+    s >> a.d->mSuffix;
+    s >> a.d->mBirthday;
+    s >> a.d->mBirthdayWithTime;
+    s >> a.d->mMailer;
+    s >> a.d->mTimeZone;
+    s >> a.d->mGeo;
+    s >> a.d->mDepartment;
+    s >> a.d->mNote;
+    s >> a.d->mProductId;
+    s >> a.d->mRevision;
+    s >> a.d->mSortString;
+    s >> a.d->mSecrecy;
+    s >> a.d->mLogo;
+    s >> a.d->mPhoto;
+    s >> a.d->mSound;
+    s >> a.d->mPhoneNumbers;
+    s >> a.d->mAddresses;
+    s >> a.d->mEmails;
+    s >> a.d->mCategories;
+    QStringList customFields;
+    s >> customFields;
+    a.setCustoms(customFields);
+    s >> a.d->mKeys;
+    s >> a.d->mLangs;
+    s >> a.d->mGender;
+    s >> a.d->mKind;
+    s >> a.d->mCalendarUrl;
+    s >> a.d->mSoundListExtra;
+    s >> a.d->mPhotoExtraList;
+    s >> a.d->mLogoExtraList;
+    s >> a.d->mUrlExtraList;
+    s >> a.d->mMembers;
+    s >> a.d->mRelationships;
+    s >> a.d->mSources;
+    s >> a.d->mImpps;
+    s >> a.d->mFieldGroupList;
+    s >> a.d->mTitleExtraList;
+    s >> a.d->mRoleExtraList;
+    s >> a.d->mOrgExtraList;
+    s >> a.d->mNickNameExtraList;
+    s >> a.d->mClientPidMapList;
+    a.d->mEmpty = false;
+
+    return s;
+}
+
+bool matchBinaryPattern(int value, int pattern)
+{
+    /**
+      We want to match all telephonnumbers/addresses which have the bits in the
+      pattern set. More are allowed.
+      if pattern == 0 we have a special handling, then we want only those with
+      exactly no bit set.
+     */
+    if (pattern == 0) {
+        return value == 0;
+    } else {
+        return pattern == (pattern & value);
+    }
+}
+
+template<class L>
+bool listEquals(const QVector<L> &list, const QVector<L> &pattern)
+{
+    if (list.count() != pattern.count()) {
+        return false;
+    }
+    const int numberOfElement(list.count());
+    for (int i = 0; i < numberOfElement; ++i) {
+        if (!pattern.contains(list[i])) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool listEquals(const QStringList &list, const QStringList &pattern)
+{
+    if (list.count() != pattern.count()) {
+        return false;
+    }
+
+    const int numberOfElement(list.count());
+    for (int i = 0; i < numberOfElement; ++i) {
+        if (!pattern.contains(list[i])) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+template<typename T>
+static QVariantList toVariantList(const QVector<T> &v)
+{
+    QVariantList l;
+    l.reserve(v.size());
+    std::transform(v.begin(), v.end(), std::back_inserter(l), [](const T &elem) {
+        return QVariant::fromValue(elem);
+    });
+    return l;
+}
+
+template<typename T>
+static QVector<T> fromVariantList(const QVariantList &v)
+{
+    QVector<T> l;
+    l.reserve(v.size());
+    std::transform(v.begin(), v.end(), std::back_inserter(l), [](const QVariant &elem) {
+        return elem.value<T>();
+    });
+    return l;
+}
+
+void Addressee::setBirthdayProperty(const QDateTime &birthday) {
+    // The property setter cannot pass withTime, so we have to guess.
+    setBirthday(birthday, birthday.time().msecsSinceStartOfDay() != 0);
+}
+
+QVariantList Addressee::emailsVariant() const
+{
+    return toVariantList(d->mEmails);
+}
+
+void Addressee::setEmailsVariant(const QVariantList &emails)
+{
+    setEmailList(fromVariantList<Email>(emails));
+}
+
+void Addressee::setPhoneNumbersVariant(const QVariantList &emails)
+{
+    setPhoneNumbers(fromVariantList<PhoneNumber>(emails));
+}
+
+QVariantList Addressee::phoneNumbersVariant() const
+{
+    return toVariantList(d->mPhoneNumbers);
+}
+
+QVariantList Addressee::addressesVariant() const
+{
+    return toVariantList(d->mAddresses);
+}
+
+QVariantList Addressee::urlsVariant() const
+{
+    return toVariantList(d->mUrlExtraList);
+}
+
+QVariantList Addressee::imppsVariant() const
+{
+    return toVariantList(d->mImpps);
+}
+
+void Addressee::setImppsVariant(const QVariantList &impps)
+{
+    setImppList(fromVariantList<Impp>(impps));
+}
+
+#include "moc_addressee.cpp"
diff --git a/src/addressee.h b/src/addressee.h
new file mode 100644 (file)
index 0000000..d4b4941
--- /dev/null
@@ -0,0 +1,1245 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+    SPDX-FileCopyrightText: 2013 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSEE_H
+#define KCONTACTS_ADDRESSEE_H
+
+#include <QDateTime>
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QStringList>
+#include <QUrl>
+
+#include "address.h"
+#include "addresseelist.h"
+#include "calendarurl.h"
+#include "clientpidmap.h"
+#include "email.h"
+#include "fieldgroup.h"
+#include "gender.h"
+#include "geo.h"
+#include "impp.h"
+#include "key.h"
+#include "lang.h"
+#include "nickname.h"
+#include "org.h"
+#include "phonenumber.h"
+#include "picture.h"
+#include "related.h"
+#include "resourcelocatorurl.h"
+#include "role.h"
+#include "secrecy.h"
+#include "sound.h"
+#include "timezone.h"
+#include "title.h"
+
+namespace KContacts
+{
+/**
+  @short address book entry
+
+  This class represents an entry in the address book.
+
+  The data of this class is implicitly shared. You can pass this class by value.
+
+  If you need the name of a field for presenting it to the user you should use
+  the functions ending in Label(). They return a translated string which can be
+  used as label for the corresponding field.
+
+  About the name fields:
+
+  givenName() is the first name and familyName() the last name. In some
+  countries the family name comes first, that's the reason for the
+  naming. formattedName() is the full name with the correct formatting.
+  It is used as an override, when the correct formatting can't be generated
+  from the other name fields automatically.
+
+  realName() returns a fully formatted name(). It uses formattedName, if set,
+  otherwise it constructs the name from the name fields. As fallback, if
+  nothing else is set it uses name().
+
+  name() is the NAME type of RFC2426. It can be used as internal name for the
+  data entry, but shouldn't be used for displaying the data to the user.
+ */
+class KCONTACTS_EXPORT Addressee
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Addressee &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Addressee &);
+
+    Q_GADGET
+    Q_PROPERTY(bool isEmpty READ isEmpty)
+    Q_PROPERTY(QString uid READ uid WRITE setUid)
+    Q_PROPERTY(QString name READ name WRITE setName)
+    Q_PROPERTY(QString formattedName READ formattedName WRITE setFormattedName)
+    Q_PROPERTY(QString familyName READ familyName WRITE setFamilyName)
+    Q_PROPERTY(QString givenName READ givenName WRITE setGivenName)
+    Q_PROPERTY(QString additionalName READ additionalName WRITE setAdditionalName)
+    Q_PROPERTY(QString prefix READ prefix WRITE setPrefix)
+    Q_PROPERTY(QString suffix READ suffix WRITE setSuffix)
+    Q_PROPERTY(QString nickName READ nickName)
+    Q_PROPERTY(QDateTime birthday READ birthday WRITE setBirthdayProperty) // special write method due to withTime argument
+    Q_PROPERTY(bool birthdayHasTime READ birthdayHasTime)
+    Q_PROPERTY(QString mailer READ mailer WRITE setMailer)
+    Q_PROPERTY(KContacts::Geo geo READ geo WRITE setGeo)
+    Q_PROPERTY(QString title READ title)
+    Q_PROPERTY(QString role READ role)
+    Q_PROPERTY(QString organization READ organization)
+    Q_PROPERTY(QString department READ department WRITE setDepartment)
+    Q_PROPERTY(QString note READ note WRITE setNote)
+    Q_PROPERTY(QString productId READ productId WRITE setProductId)
+    Q_PROPERTY(QDateTime revision READ revision)
+    Q_PROPERTY(QString sortString READ sortString WRITE setSortString)
+    Q_PROPERTY(KContacts::ResourceLocatorUrl url READ url WRITE setUrl)
+    Q_PROPERTY(QString realName READ realName)
+    Q_PROPERTY(QString assembledName READ assembledName)
+    Q_PROPERTY(QString preferredEmail READ preferredEmail)
+    Q_PROPERTY(QStringList categories READ categories WRITE setCategories)
+    Q_PROPERTY(QStringList customs READ customs)
+    Q_PROPERTY(bool changed READ changed WRITE setChanged)
+    Q_PROPERTY(QDate anniversary READ anniversary WRITE setAnniversary)
+    Q_PROPERTY(QString assistantsName READ assistantsName WRITE setAssistantsName)
+    Q_PROPERTY(QUrl blogFeed READ blogFeed WRITE setBlogFeed)
+    Q_PROPERTY(QString managersName READ managersName WRITE setManagersName)
+    Q_PROPERTY(QString office READ office WRITE setOffice)
+    Q_PROPERTY(QString profession READ profession WRITE setProfession)
+    Q_PROPERTY(QString spousesName READ spousesName WRITE setSpousesName)
+    Q_PROPERTY(KContacts::Picture photo READ photo WRITE setPhoto)
+
+    // using variants for QML compatibility, can be changed to proper types once QML supports that
+    Q_PROPERTY(QVariantList emails READ emailsVariant WRITE setEmailsVariant)
+    Q_PROPERTY(QVariantList phoneNumbers READ phoneNumbersVariant WRITE setPhoneNumbersVariant)
+    Q_PROPERTY(QVariantList addresses READ addressesVariant)
+    Q_PROPERTY(QVariantList urls READ urlsVariant)
+    Q_PROPERTY(QVariantList impps READ imppsVariant WRITE setImppsVariant)
+
+    // ### the following properties are still missing:
+    // - logos, photos, sounds
+    // - keys
+    // - the list variants for nicks, titles, roles, orgs
+    // - timezone, secrecy, gender, kind, members, relationships, language
+    // - field groups, sourceUrls, calendarUrls
+
+public:
+    /**
+      A list of addressee objects
+     */
+    typedef AddresseeList List;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+      A map from unique identifier to addressee.
+
+      @deprecated Since 5.88, as it's not used anywhere.
+
+      @see uid()
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "Deprecated, not used anywhere.")
+    typedef QHash<QString, Addressee> Map;
+#endif
+
+    /**
+      Construct an empty address book entry.
+     */
+    Addressee();
+
+    /**
+      Destroys the address book entry.
+     */
+    ~Addressee();
+
+    /**
+      Copy constructor.
+     */
+    Addressee(const Addressee &other);
+
+    /**
+      Assignment operator.
+
+      @return a reference to @c this
+    */
+    Addressee &operator=(const Addressee &other);
+
+    /**
+      Equality operator.
+
+      @return @c true if @c this and the given addressee are equal,
+              otherwise @c false
+    */
+    bool operator==(const Addressee &other) const;
+
+    /**
+      Not-equal operator.
+
+      @return @c true if @c this and the given addressee are not equal,
+              otherwise @c false
+    */
+    bool operator!=(const Addressee &other) const;
+
+    /**
+      Return if the address book entry is empty.
+     */
+    bool isEmpty() const;
+
+    /**
+      Set unique identifier.
+
+      @param uid the KABC unique identifier
+     */
+    void setUid(const QString &uid);
+
+    /**
+      Return unique identifier.
+     */
+    QString uid() const;
+
+    /**
+      Return translated label for uid field.
+     */
+    static QString uidLabel();
+
+    /**
+      Set name.
+     */
+    void setName(const QString &name);
+
+    /**
+      Return name.
+     */
+    QString name() const;
+
+    /**
+      Return translated label for name field.
+     */
+    static QString nameLabel();
+
+    /**
+      Set formatted name.
+     */
+    void setFormattedName(const QString &formattedName);
+
+    /**
+      Return formatted name.
+     */
+    QString formattedName() const;
+
+    /**
+      Return translated label for formattedName field.
+     */
+    static QString formattedNameLabel();
+
+    /**
+      Set family name.
+     */
+    void setFamilyName(const QString &familyName);
+
+    /**
+      Return family name.
+     */
+    QString familyName() const;
+
+    /**
+      Return translated label for familyName field.
+     */
+    static QString familyNameLabel();
+
+    /**
+      Set given name.
+     */
+    void setGivenName(const QString &givenName);
+
+    /**
+      Return given name.
+     */
+    QString givenName() const;
+
+    /**
+      Return translated label for givenName field.
+     */
+    static QString givenNameLabel();
+
+    /**
+      Set additional names.
+     */
+    void setAdditionalName(const QString &additionalName);
+
+    /**
+      Return additional names.
+     */
+    QString additionalName() const;
+
+    /**
+      Return translated label for additionalName field.
+     */
+    static QString additionalNameLabel();
+
+    /**
+      Set honorific prefixes.
+     */
+    void setPrefix(const QString &prefix);
+
+    /**
+      Return honorific prefixes.
+     */
+    QString prefix() const;
+
+    /**
+      Return translated label for prefix field.
+     */
+    static QString prefixLabel();
+
+    /**
+      Set honorific suffixes.
+     */
+    void setSuffix(const QString &suffix);
+
+    /**
+      Return honorific suffixes.
+     */
+    QString suffix() const;
+
+    /**
+      Return translated label for suffix field.
+     */
+    static QString suffixLabel();
+
+    /**
+      Set nick name.
+     */
+    void setNickName(const QString &nickName);
+    void setNickName(const NickName &nickName);
+    void insertExtraNickName(const NickName &nickName);
+    void setExtraNickNameList(const NickName::List &nickNameList);
+    NickName::List extraNickNameList() const;
+
+    /**
+      Return nick name.
+     */
+    QString nickName() const;
+
+    /**
+      Return translated label for nickName field.
+     */
+    static QString nickNameLabel();
+
+    /**
+      Set birthday (date and time). If withTime is false the time will be set
+      to midnight and birthdayHasTime() will return false afterwards.
+      @since 5.4
+     */
+    void setBirthday(const QDateTime &birthday, bool withTime = true);
+
+    /**
+      Set birthday (date only). birthdayHasTime() will return false afterwards.
+     */
+    void setBirthday(const QDate &birthday);
+
+    /**
+      Return birthday. (If a valid date has been set, birthday().time() will
+      always return a valid QTime!)
+     */
+    QDateTime birthday() const;
+
+    /**
+      Returns true if birthday has been set with a time. Returns false otherwise.
+     */
+    bool birthdayHasTime() const;
+
+    /**
+      Return translated label for birthday field.
+     */
+    static QString birthdayLabel();
+
+    /**
+      Return translated label for homeAddressStreet field.
+     */
+    static QString homeAddressStreetLabel();
+
+    /**
+      Return translated label for homeAddressPostOfficeBox field.
+     */
+    static QString homeAddressPostOfficeBoxLabel();
+
+    /**
+      Return translated label for homeAddressLocality field.
+     */
+    static QString homeAddressLocalityLabel();
+
+    /**
+      Return translated label for homeAddressRegion field.
+     */
+    static QString homeAddressRegionLabel();
+
+    /**
+      Return translated label for homeAddressPostalCode field.
+     */
+    static QString homeAddressPostalCodeLabel();
+
+    /**
+      Return translated label for homeAddressCountry field.
+     */
+    static QString homeAddressCountryLabel();
+
+    /**
+      Return translated label for homeAddressLabel field.
+     */
+    static QString homeAddressLabelLabel();
+
+    /**
+      Return translated label for businessAddressStreet field.
+     */
+    static QString businessAddressStreetLabel();
+
+    /**
+      Return translated label for businessAddressPostOfficeBox field.
+     */
+    static QString businessAddressPostOfficeBoxLabel();
+
+    /**
+      Return translated label for businessAddressLocality field.
+     */
+    static QString businessAddressLocalityLabel();
+
+    /**
+      Return translated label for businessAddressRegion field.
+     */
+    static QString businessAddressRegionLabel();
+
+    /**
+      Return translated label for businessAddressPostalCode field.
+     */
+    static QString businessAddressPostalCodeLabel();
+
+    /**
+      Return translated label for businessAddressCountry field.
+     */
+    static QString businessAddressCountryLabel();
+
+    /**
+      Return translated label for businessAddressLabel field.
+     */
+    static QString businessAddressLabelLabel();
+
+    /**
+      Return translated label for homePhone field.
+     */
+    static QString homePhoneLabel();
+
+    /**
+      Return translated label for businessPhone field.
+     */
+    static QString businessPhoneLabel();
+
+    /**
+      Return translated label for mobilePhone field.
+     */
+    static QString mobilePhoneLabel();
+
+    /**
+      Return translated label for homeFax field.
+     */
+    static QString homeFaxLabel();
+
+    /**
+      Return translated label for businessFax field.
+     */
+    static QString businessFaxLabel();
+
+    /**
+      Return translated label for carPhone field.
+     */
+    static QString carPhoneLabel();
+
+    /**
+      Return translated label for isdn field.
+     */
+    static QString isdnLabel();
+
+    /**
+      Return translated label for pager field.
+     */
+    static QString pagerLabel();
+
+    /**
+      Return translated label for email field.
+     */
+    static QString emailLabel();
+
+    /**
+      Set mail client.
+     */
+    void setMailer(const QString &mailer);
+
+    /**
+      Return mail client.
+     */
+    QString mailer() const;
+
+    /**
+      Return translated label for mailer field.
+     */
+    static QString mailerLabel();
+
+    /**
+      Set time zone.
+     */
+    void setTimeZone(const TimeZone &timeZone);
+
+    /**
+      Return time zone.
+     */
+    TimeZone timeZone() const;
+
+    /**
+      Return translated label for timeZone field.
+     */
+    static QString timeZoneLabel();
+
+    /**
+      Set geographic position.
+     */
+    void setGeo(const Geo &geo);
+
+    /**
+      Return geographic position.
+     */
+    Geo geo() const;
+
+    /**
+      Return translated label for geo field.
+     */
+    static QString geoLabel();
+
+    /**
+      Set title.
+     */
+    // Remove in kf6
+    void setTitle(const QString &title);
+    void setTitle(const Title &title);
+    void insertExtraTitle(const Title &title);
+    void setExtraTitleList(const Title::List &urltitle);
+    Title::List extraTitleList() const;
+    /**
+      Return title.
+     */
+    QString title() const;
+
+    /**
+      Return translated label for title field.
+     */
+    static QString titleLabel();
+
+    /**
+      Set role.
+     */
+    void setRole(const QString &role);
+    void setRole(const Role &role);
+    void insertExtraRole(const Role &role);
+    void setExtraRoleList(const Role::List &roleList);
+    Role::List extraRoleList() const;
+
+    /**
+      Return role.
+     */
+    QString role() const;
+
+    /**
+      Return translated label for role field.
+     */
+    static QString roleLabel();
+
+    /**
+      Set organization.
+     */
+    // Remove in kf6
+    void setOrganization(const QString &organization);
+    void setOrganization(const Org &organization);
+    void insertExtraOrganization(const Org &organization);
+    void setExtraOrganizationList(const Org::List &orgList);
+    Org::List extraOrganizationList() const;
+
+    /**
+      Return organization.
+     */
+    QString organization() const;
+
+    /**
+      Return translated label for organization field.
+     */
+    static QString organizationLabel();
+
+    /**
+      Set department.
+     */
+    void setDepartment(const QString &department);
+
+    /**
+      Return department.
+     */
+    QString department() const;
+
+    /**
+      Return translated label for department field.
+     */
+    static QString departmentLabel();
+
+    /**
+      Set note.
+     */
+    void setNote(const QString &note);
+
+    /**
+      Return note.
+     */
+    QString note() const;
+
+    /**
+      Return translated label for note field.
+     */
+    static QString noteLabel();
+
+    /**
+      Set product identifier.
+     */
+    void setProductId(const QString &productId);
+
+    /**
+      Return product identifier.
+     */
+    QString productId() const;
+
+    /**
+      Return translated label for productId field.
+     */
+    static QString productIdLabel();
+
+    /**
+      Set revision date.
+     */
+    void setRevision(const QDateTime &revision);
+
+    /**
+      Return revision date.
+     */
+    QDateTime revision() const;
+
+    /**
+      Return translated label for revision field.
+     */
+    static QString revisionLabel();
+
+    /**
+      Set sort string.
+     */
+    void setSortString(const QString &sortString);
+
+    /**
+      Return sort string.
+     */
+    QString sortString() const;
+
+    /**
+      Return translated label for sortString field.
+     */
+    static QString sortStringLabel();
+
+    /**
+      Set homepage.
+     */
+    void setUrl(const ResourceLocatorUrl &url);
+    // kf6: remove it
+    void setUrl(const QUrl &url);
+
+    /**
+      Return homepage.
+     */
+    ResourceLocatorUrl url() const;
+
+    /**
+      Return translated label for url field.
+     */
+    static QString urlLabel();
+
+    /**
+      Set security class.
+     */
+    void setSecrecy(const Secrecy &secrecy);
+
+    /**
+      Return security class.
+     */
+    Secrecy secrecy() const;
+
+    /**
+      Return translated label for secrecy field.
+     */
+    static QString secrecyLabel();
+
+    /**
+      Set logo.
+     */
+    void setLogo(const Picture &logo);
+
+    /**
+      Return logo.
+     */
+    Picture logo() const;
+
+    /**
+      Return translated label for logo field.
+     */
+    static QString logoLabel();
+
+    /**
+      Set photo.
+     */
+    void setPhoto(const Picture &photo);
+
+    /**
+      Return photo.
+     */
+    Picture photo() const;
+
+    /**
+      Return translated label for photo field.
+     */
+    static QString photoLabel();
+
+    /**
+      Set sound.
+     */
+    void setSound(const Sound &sound);
+
+    /**
+      Return sound.
+     */
+    Sound sound() const;
+
+    /**
+      Return translated label for sound field.
+     */
+    static QString soundLabel();
+
+    /**
+      Set name fields by parsing the given string and trying to associate the
+      parts of the string with according fields. This function should probably
+      be a bit more clever.
+     */
+    void setNameFromString(const QString &s);
+
+    /**
+      Return the name of the addressee. This is calculated from all the name
+      fields.
+     */
+    QString realName() const;
+
+    /**
+      Return the name that consists of all name parts.
+     */
+    QString assembledName() const;
+
+    /**
+      Return email address including real name.
+
+      @param email Email address to be used to construct the full email string.
+                   If this is QString() the preferred email address is used.
+     */
+    QString fullEmail(const QString &email = QString()) const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+      Insert an email address. If the email address already exists in this
+      addressee it is not duplicated.
+
+      @param email Email address
+      @param preferred Set to true, if this is the preferred email address of
+                       the addressee.
+
+      @deprecated Since 5.88, use addEmail(const Email &) instead; you can use the Email
+      methods to set any parameters, e.g. Email::setPreferred(), Email::setType() ...etc
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "Use addEmail(const Email &), and the Email class setter methods instead.")
+    void insertEmail(const QString &email, bool preferred = false, const QMap<QString, QStringList> &param = QMap<QString, QStringList>());
+#endif
+
+    /**
+      Adds an email address. If the email address (i.e. @p email.mail()) already
+      exists in this addressee it won't be duplicated, instead @p email is assigned
+      to it.
+
+      @since 5.88
+     */
+    void addEmail(const Email &email);
+
+    /**
+      Remove email address. If the email address doesn't exist, nothing happens.
+
+      @param email Email address to remove
+     */
+    void removeEmail(const QString &email);
+
+    /**
+      Return preferred email address. This is the first email address or the last
+      one added with insertEmail() or addEmail() with a set preferred parameter.
+     */
+    QString preferredEmail() const;
+
+    /**
+      Return list of all email addresses.
+     */
+    QStringList emails() const;
+
+    /**
+       Set the emails to @p list.
+       The first email address gets the preferred one!
+       @param list The list of email addresses.
+     */
+    void setEmails(const QStringList &list);
+
+    /**
+      Insert a phone number. If a phone number with the same id already exists
+      in this addressee it is not duplicated.
+
+      @param phoneNumber The telephone number to insert to the addressee
+     */
+    void insertPhoneNumber(const PhoneNumber &phoneNumber);
+
+    /**
+      Remove phone number. If no phone number with the given id exists for this
+      addressee, nothing happens.
+
+      @param phoneNumber The telephone number to remove from the addressee
+     */
+    void removePhoneNumber(const PhoneNumber &phoneNumber);
+
+    /**
+      Return phone number, which matches the given type.
+
+      @param type The type of phone number to get
+     */
+    PhoneNumber phoneNumber(PhoneNumber::Type type) const;
+
+    /**
+      Return list of all phone numbers.
+     */
+    PhoneNumber::List phoneNumbers() const;
+
+    void setPhoneNumbers(const PhoneNumber::List &phoneNumbers);
+
+    /**
+      Return list of phone numbers with a special type.
+
+      @param type The type of phone number to get
+     */
+    PhoneNumber::List phoneNumbers(PhoneNumber::Type type) const;
+
+    /**
+      Return phone number with the given id.
+
+      @param id The identifier of the phone number to look for.
+                See PhoneNumber::id()
+     */
+    PhoneNumber findPhoneNumber(const QString &id) const;
+
+    /**
+      Insert a key. If a key with the same id already exists
+      in this addressee it is not duplicated.
+
+      @param key The key to insert
+     */
+    void insertKey(const Key &key);
+
+    /**
+      Remove a key. If no key with the given id exists for this
+      addressee, nothing happens.
+
+      @param key The key to remove
+     */
+    void removeKey(const Key &key);
+
+    /**
+      Return key, which matches the given type.
+      If @p type == Key::Custom you can specify a string
+      that should match. If you leave the string empty, the first
+      key with a custom value is returned.
+
+      @param type The type of key to look for
+      @param customTypeString A string to match custom keys against when
+             @p type is @c Key::Custom
+     */
+    Key key(Key::Type type, const QString &customTypeString = QString()) const;
+
+    /**
+      Return list of all keys.
+     */
+    Key::List keys() const;
+
+    /**
+       Set the list of keys
+       @param keys The keys to be set.
+     */
+    void setKeys(const Key::List &keys);
+
+    /**
+      Return list of keys with a special type.
+      If @p type == Key::Custom you can specify a string
+      that should match. If you leave the string empty, all custom
+      keys will be returned.
+
+      @param type The type of key to look for
+      @param customTypeString A string to match custom keys against when
+             @p type is @c Key::Custom
+     */
+    Key::List keys(Key::Type type, const QString &customTypeString = QString()) const;
+
+    /**
+      Return key with the given id.
+
+      @param id The identifier of the key to look for. See Key::id()
+     */
+    Key findKey(const QString &id) const;
+
+    /**
+      Insert an address. If an address with the same id already exists
+      in this addressee it is not duplicated.
+
+      @param address The address to insert
+     */
+    void insertAddress(const Address &address);
+
+    /**
+      Remove address. If no address with the given id exists for this
+      addressee, nothing happens.
+
+      @param address The address to remove
+     */
+    void removeAddress(const Address &address);
+
+    /**
+      Set the addressee
+
+      @param addresses The new addresses
+      @since 5.100
+     */
+    void setAddresses(const Address::List &addresses);
+
+    /**
+      Return address, which matches the given type.
+
+      @param type The type of address to look for
+     */
+    Address address(Address::Type type) const;
+
+    /**
+      Return list of all addresses.
+     */
+    Address::List addresses() const;
+
+    /**
+      Return list of addresses with a special type.
+
+      @param type The type of addresses to look for
+     */
+    Address::List addresses(Address::Type type) const;
+
+    /**
+      Return address with the given id.
+
+      @param id The identifier of the address to look for. See Address::id()
+     */
+    Address findAddress(const QString &id) const;
+
+    /**
+      Insert category. If the category already exists it is not duplicated.
+     */
+    void insertCategory(const QString &category);
+
+    /**
+      Remove category.
+     */
+    void removeCategory(const QString &category);
+
+    /**
+      Return, if addressee has the given category.
+     */
+    bool hasCategory(const QString &category) const;
+
+    /**
+      Set categories to given value.
+     */
+    void setCategories(const QStringList &category);
+
+    /**
+      Return list of all set categories.
+     */
+    QStringList categories() const;
+
+    /**
+      Insert custom entry. The entry is identified by the name of the inserting
+      application and a unique name. If an entry with the given app and name
+      already exists its value is replaced with the new given value.
+
+      An empty value isn't allowed (nothing happens if this is called with
+      any of the three arguments being empty)
+
+      @param app Name of the application inserting this custom entry
+      @param name Name of this application specific custom entry
+      @param value Value of this application specific custom entry
+     */
+    void insertCustom(const QString &app, const QString &name, const QString &value);
+
+    /**
+      Remove custom entry.
+
+      @param app Name of the application which has inserted this custom entry
+      @param name Name of this application specific custom entry
+     */
+    void removeCustom(const QString &app, const QString &name);
+
+    /**
+      Return value of custom entry, identified by app and entry name.
+
+      @param app Name of the application which has inserted this custom entry
+      @param name Name of this application specific custom entry
+     */
+    QString custom(const QString &app, const QString &name) const;
+
+    /**
+      Set all custom entries.
+     */
+    void setCustoms(const QStringList &customs);
+
+    /**
+      Return list of all custom entries.
+
+      The format of the custom entries is 'app-key:value' and the list is sorted
+      alphabetically by 'app-key'.
+     */
+    QStringList customs() const;
+
+    /**
+      Parse full email address. The result is given back in fullName and email.
+
+      @param rawEmail The input string to parse for name and email
+      @param fullName The name part of the @p rawEmail input, if it contained one
+      @param email The email part of the @p rawEmail input, if it contained one
+     */
+    static void parseEmailAddress(const QString &rawEmail, QString &fullName, QString &email);
+
+    /**
+      Returns string representation of the addressee.
+     */
+    QString toString() const;
+
+    /**
+      Mark addressee as changed.
+
+      @param value Sets the status indicating changed data
+     */
+    void setChanged(bool value);
+
+    /**
+      Return whether the addressee is changed.
+     */
+    bool changed() const;
+
+    /**
+      Returns the MIME type used for Addressees
+     */
+    static QString mimeType();
+
+    KContacts::Email::List emailList() const;
+    void setEmailList(const Email::List &list);
+
+    /**
+     * Remove Language
+     * @brief removeLang
+     * @param language
+     */
+    void removeLang(const QString &language);
+    /**
+     * Insert Language
+     * @brief insertLang
+     * @param language
+     */
+    void insertLang(const Lang &language);
+    /**
+     * @brief langs
+     * @return List of lang
+     */
+    Lang::List langs() const;
+    void setLangs(const Lang::List &langs);
+
+    void setGender(const Gender &gender);
+    Gender gender() const;
+
+    QString kind() const;
+    void setKind(const QString &kind);
+
+    void insertCalendarUrl(const CalendarUrl &calendarUrl);
+    CalendarUrl::List calendarUrlList() const;
+
+    void insertExtraSound(const Sound &sound);
+    void setExtraSoundList(const Sound::List &soundList);
+    Sound::List extraSoundList() const;
+
+    void insertExtraPhoto(const Picture &picture);
+    void setExtraPhotoList(const Picture::List &pictureList);
+    Picture::List extraPhotoList() const;
+
+    void insertExtraLogo(const Picture &logo);
+    void setExtraLogoList(const Picture::List &logoList);
+    Picture::List extraLogoList() const;
+
+    ResourceLocatorUrl::List extraUrlList() const;
+    void setExtraUrlList(const ResourceLocatorUrl::List &urlList);
+    void insertExtraUrl(const ResourceLocatorUrl &url);
+
+    // Member
+    void insertMember(const QString &member);
+    void setMembers(const QStringList &c);
+    QStringList members() const;
+
+    // Relation
+    void insertRelationship(const Related &related);
+    void setRelationships(const Related::List &c);
+    Related::List relationships() const;
+
+    // Source
+    void insertSourceUrl(const QUrl &url);
+    void setSourcesUrlList(const QVector<QUrl> &urlList);
+    QVector<QUrl> sourcesUrlList() const;
+
+    // Impp
+    Impp::List imppList() const;
+    void setImppList(const Impp::List &imppList);
+    void insertImpp(const Impp &impp);
+
+    // FieldGroup
+    FieldGroup::List fieldGroupList() const;
+    void setFieldGroupList(const FieldGroup::List &fieldGroupList);
+    void insertFieldGroup(const FieldGroup &fieldGroup);
+
+    // ClientPidMap
+    ClientPidMap::List clientPidMapList() const;
+    void setClientPidMapList(const ClientPidMap::List &clientpidmaplist);
+    void insertClientPidMap(const ClientPidMap &clientpidmap);
+
+    /**
+     * Returns the contact's anniversary date.
+     * @note This is a non-standard extension using the @c X-Anniversary field.
+     * @since 5.12
+     */
+    QDate anniversary() const;
+    /**
+     * Sets the contact's anniversary date.
+     * @note This is a non-standard extension using the @c X-Anniversary field.
+     * @since 5.12
+     */
+    void setAnniversary(const QDate &anniversary);
+
+    /**
+     * Returns the contact's assistant's name.
+     * @note This is a non-standard extension using the @c X-AssistantsName field.
+     * @since 5.12
+     */
+    QString assistantsName() const;
+    /**
+     * Set the contact's assistant's name.
+     * @note This is a non-standard extension using the @c X-AssistantsName field.
+     * @since 5.12
+     */
+    void setAssistantsName(const QString &assistantsName);
+
+    /**
+     * Returns the contact's blog feed.
+     * @note This is a non-standard extension using the @c BlogFeed field.
+     * @since 5.12
+     */
+    QUrl blogFeed() const;
+    /**
+     * Set the contact's blog feed.
+     * @note This is a non-standard extension using the @c BlogFeed field.
+     * @since 5.12
+     */
+    void setBlogFeed(const QUrl &blogFeed);
+
+    /**
+     * Returns the contact's manager's name.
+     * @note This is a non-standard extension using the @c X-ManagersName field.
+     * @since 5.12
+     */
+    QString managersName() const;
+    /**
+     * Set the contact's manager's name.
+     * @note This is a non-standard extension using the @c X-ManagersName field.
+     * @since 5.12
+     */
+    void setManagersName(const QString &managersName);
+
+    /**
+     * Returns the contact's office.
+     * @note This is a non-standard extension using the @c X-Office field.
+     * @since 5.12
+     */
+    QString office() const;
+    /**
+     * Set the contact's office.
+     * @note This is a non-standard extension using the @c X-Office field.
+     * @since 5.12
+     */
+    void setOffice(const QString &office);
+
+    /**
+     * Returns the contact's profession.
+     * @note This is a non-standard extension using the @c X-Profession field.
+     * @since 5.12
+     */
+    QString profession() const;
+    /**
+     * Set the contact's profession.
+     * @note This is a non-standard extension using the @c X-Profession field.
+     * @since 5.12
+     */
+    void setProfession(const QString &profession);
+
+    /**
+     * Returns the contact's spouse's name.
+     * @note This is a non-standard extension using the @c X-SpousesName field.
+     * @since 5.12
+     */
+    QString spousesName() const;
+    /**
+     * Set the contact's spouse's name.
+     * @note This is a non-standard extension using the @c X-SpousesName field.
+     * @since 5.12
+     */
+    void setSpousesName(const QString &spousesName);
+
+private:
+    void setBirthdayProperty(const QDateTime &birthday);
+    QVariantList emailsVariant() const;
+    void setEmailsVariant(const QVariantList &emails);
+    QVariantList phoneNumbersVariant() const;
+    void setPhoneNumbersVariant(const QVariantList &emails);
+    QVariantList addressesVariant() const;
+    QVariantList urlsVariant() const;
+    QVariantList imppsVariant() const;
+    void setImppsVariant(const QVariantList &impps);
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Addressee &);
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Addressee &);
+}
+
+#define KCONTACTS_ADDRESSEE_METATYPE_DEFINED 1
+Q_DECLARE_METATYPE(KContacts::Addressee)
+
+#endif
diff --git a/src/addresseehelper.cpp b/src/addresseehelper.cpp
new file mode 100644 (file)
index 0000000..465369c
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+    This file is part of the KDE libraries
+    SPDX-FileCopyrightText: 2003 Carsten Pfeiffer <pfeiffer@kde.org>
+
+    This SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addresseehelper.h"
+
+#include <KConfig>
+#include <KConfigGroup>
+#include <KLocalizedString>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN KContacts::AddresseeHelperPrivate
+{
+public:
+    QSet<QString> mTitles;
+    QSet<QString> mPrefixes;
+    QSet<QString> mSuffixes;
+    bool mTreatAsFamilyName;
+};
+
+Q_GLOBAL_STATIC(AddresseeHelper, s_self)
+
+// static
+AddresseeHelper *AddresseeHelper::self()
+{
+    return s_self;
+}
+
+AddresseeHelper::AddresseeHelper()
+    : QObject()
+    , d(new AddresseeHelperPrivate)
+{
+    initSettings();
+}
+
+AddresseeHelper::~AddresseeHelper()
+{
+}
+
+static void addToSet(const QStringList &list, QSet<QString> &container)
+{
+    for (const auto &str : list) {
+        if (!str.isEmpty()) {
+            container.insert(str);
+        }
+    }
+}
+
+void AddresseeHelper::initSettings()
+{
+    d->mTitles.clear();
+    d->mSuffixes.clear();
+    d->mPrefixes.clear();
+
+    d->mTitles.insert(i18n("Dr."));
+    d->mTitles.insert(i18n("Miss"));
+    d->mTitles.insert(i18n("Mr."));
+    d->mTitles.insert(i18n("Mrs."));
+    d->mTitles.insert(i18n("Ms."));
+    d->mTitles.insert(i18n("Prof."));
+
+    d->mSuffixes.insert(i18n("I"));
+    d->mSuffixes.insert(i18n("II"));
+    d->mSuffixes.insert(i18n("III"));
+    d->mSuffixes.insert(i18n("Jr."));
+    d->mSuffixes.insert(i18n("Sr."));
+
+    d->mPrefixes.insert(QStringLiteral("van"));
+    d->mPrefixes.insert(QStringLiteral("von"));
+    d->mPrefixes.insert(QStringLiteral("de"));
+
+    KConfig _config(QStringLiteral("kabcrc"), KConfig::NoGlobals);
+    KConfigGroup config(&_config, "General");
+
+    addToSet(config.readEntry("Prefixes", QStringList()), d->mTitles);
+    addToSet(config.readEntry("Inclusions", QStringList()), d->mPrefixes);
+    addToSet(config.readEntry("Suffixes", QStringList()), d->mSuffixes);
+    d->mTreatAsFamilyName = config.readEntry("TreatAsFamilyName", true);
+}
+
+bool AddresseeHelper::containsTitle(const QString &title) const
+{
+    return d->mTitles.contains(title);
+}
+
+bool AddresseeHelper::containsPrefix(const QString &prefix) const
+{
+    return d->mPrefixes.contains(prefix);
+}
+
+bool AddresseeHelper::containsSuffix(const QString &suffix) const
+{
+    return d->mSuffixes.contains(suffix);
+}
+
+bool AddresseeHelper::treatAsFamilyName() const
+{
+    return d->mTreatAsFamilyName;
+}
diff --git a/src/addresseehelper.h b/src/addresseehelper.h
new file mode 100644 (file)
index 0000000..85cac8a
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+    This file is part of the KDE libraries
+    SPDX-FileCopyrightText: 2003 Carsten Pfeiffer <pfeiffer@kde.org>
+
+    This SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSEEHELPER_H
+#define KCONTACTS_ADDRESSEEHELPER_H
+
+#include "kcontacts_export.h"
+
+#include <QObject>
+
+namespace KContacts
+{
+class AddresseeHelperPrivate;
+
+// TODO KF6: unexport and turn into an implementation detail
+// this is unused externally, both as code as well as via the config file
+// so we only need this internally and can probably also drop the config
+// file access
+
+/**
+ * This singleton class stores static data, which is shared
+ * by all Addressee objects. It maintains three lists of
+ * strings, which can be queried using this class:
+ *
+ * - a list of honoric prefixes, like "Mrs.", "Prof." etc,
+ *   see containsTitle()
+ * - a list of inclusions, such as "van" or "de", see
+ *   containsPrefix()
+ * - a list of honoric suffixes, such as "I" or "Jr.", see
+ *   containsSuffix()
+ *
+ * All of these lists have a hardcoded and a configurable
+ * part. The configurable part is found in @c kabcrc, group
+ * @c General, fields @c Prefixes, @c Inclusions, and
+ * @c Suffixes.
+ *
+ * In addition to the above, this class stores one conveniece
+ * setting: it stores whether or not a single name component
+ * should be interpreted as a family name (see
+ * treatAsFamilyName()). The corresponding configuration
+ * field is @c TreatAsFamilyName.
+ *
+ * @warning Do not use, to be removed from the public interface in KF6.
+ */
+class KCONTACTS_EXPORT KCONTACTS_DEPRECATED_VERSION(5, 89, "unused externally") AddresseeHelper : public QObject
+{
+    Q_OBJECT
+
+public:
+    /**
+     * Singleton interface to this class
+     *
+     * @return a pointer to the unique instance of this class.
+     */
+    static AddresseeHelper *self();
+
+    /**
+     * Queries the list of honoric prefixes.
+     *
+     * @param title the honoric prefix to search for
+     * @return @c true, if @p title was found in the list,
+     *         @c false otherwise
+     */
+    Q_REQUIRED_RESULT bool containsTitle(const QString &title) const;
+
+    /**
+     * Queries the list of inclusions.
+     *
+     * @param prefix the inclusion to search for
+     * @return @c true, if @p prefix was found in the list,
+     *         @c false otherwise
+     */
+    Q_REQUIRED_RESULT bool containsPrefix(const QString &prefix) const;
+
+    /**
+     * Queries the list of honoric suffixes.
+     *
+     * @param suffix the honoric suffix to search for
+     * @return @c true, if @p suffix was found in the list,
+     *         @c false otherwise
+     */
+    Q_REQUIRED_RESULT bool containsSuffix(const QString &suffix) const;
+
+    /**
+     * Returns whether or not a single name component should
+     * be interpreted as a family name.
+     *
+     * @return @c true if single name component is a family name,
+     *         @c false otherwise.
+     */
+    Q_REQUIRED_RESULT bool treatAsFamilyName() const;
+
+    /** @internal */
+    AddresseeHelper();
+
+    ~AddresseeHelper() override;
+
+public Q_SLOTS:
+    /**
+     * Recreates the static data and reparses the configuration.
+     */
+    void initSettings();
+
+private:
+    QScopedPointer<AddresseeHelperPrivate> d;
+};
+}
+
+#endif
diff --git a/src/addresseelist.h b/src/addresseelist.h
new file mode 100644 (file)
index 0000000..9a468e3
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Jost Schenck <jost@schenck.de>
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSEELIST_H
+#define KCONTACTS_ADDRESSEELIST_H
+
+#include <QVector>
+
+namespace KContacts
+{
+class Addressee;
+
+/**
+ * @short  a QVector of Addressee.
+ */
+typedef QVector<Addressee> AddresseeList;
+
+}
+
+#endif
diff --git a/src/addressformat.cpp b/src/addressformat.cpp
new file mode 100644 (file)
index 0000000..9af3e66
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addressformat.h"
+#include "address.h"
+#include "addressformat_p.h"
+#include "addressformatparser_p.h"
+#include "addressformatscript_p.h"
+
+#include <KConfig>
+#include <KConfigGroup>
+#include <KCountry>
+
+#include <QDebug>
+#include <QLocale>
+
+using namespace KContacts;
+
+AddressFormatElement::AddressFormatElement()
+    : d(new AddressFormatElementPrivate)
+{
+}
+
+AddressFormatElement::AddressFormatElement(const AddressFormatElement &) = default;
+AddressFormatElement::~AddressFormatElement() = default;
+AddressFormatElement &AddressFormatElement::operator=(const AddressFormatElement &) = default;
+
+bool AddressFormatElement::isField() const
+{
+    return d->field != AddressFormatField::NoField;
+}
+
+AddressFormatField AddressFormatElement::field() const
+{
+    return d->field;
+}
+
+bool AddressFormatElement::isLiteral() const
+{
+    return !d->literal.isEmpty();
+}
+
+QString AddressFormatElement::literal() const
+{
+    return d->literal;
+}
+
+bool AddressFormatElement::isSeparator() const
+{
+    return !isField() && !isLiteral();
+}
+
+AddressFormat::AddressFormat()
+    : d(new AddressFormatPrivate)
+{
+}
+
+AddressFormat::AddressFormat(const AddressFormat &) = default;
+AddressFormat::~AddressFormat() = default;
+AddressFormat &AddressFormat::operator=(const AddressFormat &) = default;
+
+const std::vector<AddressFormatElement> &AddressFormat::elements() const
+{
+    return d->elements;
+}
+
+AddressFormatFields AddressFormat::requiredFields() const
+{
+    return d->required;
+}
+
+AddressFormatFields AddressFormat::usedFields() const
+{
+    return std::accumulate(d->elements.begin(), d->elements.end(), AddressFormatFields(AddressFormatField::NoField), [](auto lhs, const auto &rhs) {
+        return lhs | rhs.field();
+    });
+}
+
+AddressFormatFields AddressFormat::upperCaseFields() const
+{
+    return d->upper;
+}
+
+QString AddressFormat::postalCodeRegularExpression() const
+{
+    return d->postalCodeFormat;
+}
+
+QString AddressFormat::country() const
+{
+    return d->country;
+}
+
+QList<AddressFormatElement> AddressFormat::elementsForQml() const
+{
+    QList<AddressFormatElement> l;
+    l.reserve(d->elements.size());
+    std::copy(d->elements.begin(), d->elements.end(), std::back_inserter(l));
+    return l;
+}
+
+static QString addressFormatRc()
+{
+    Q_INIT_RESOURCE(kcontacts); // must be called outside of a namespace
+    return QStringLiteral(":/org.kde.kcontacts/addressformatrc");
+}
+
+AddressFormat
+AddressFormatRepository::formatForCountry(const QString &countryCode, AddressFormatScriptPreference scriptPref, AddressFormatPreference formatPref)
+{
+    static const KConfig entry(addressFormatRc(), KConfig::SimpleConfig);
+    KConfigGroup group = entry.group(countryCode.toUtf8());
+
+    AddressFormat format;
+    auto fmt = AddressFormatPrivate::get(format);
+    fmt->required = AddressFormatParser::parseFields(group.readEntry("Required", QString()));
+    fmt->upper = AddressFormatParser::parseFields(group.readEntry("Upper", QString()));
+
+    QString formatString;
+    if (scriptPref == AddressFormatScriptPreference::Latin && formatPref == AddressFormatPreference::Business) {
+        formatString = group.readEntry("LatinBusinessAddressFormat", QString());
+    }
+    if (formatString.isEmpty() && scriptPref == AddressFormatScriptPreference::Latin) {
+        formatString = group.readEntry("LatinAddressFormat", QString());
+    }
+    if (formatString.isEmpty() && formatPref == AddressFormatPreference::Business) {
+        formatString = group.readEntry("BusinessAddressFormat", QString());
+    }
+    if (formatString.isEmpty()) {
+        formatString = group.readEntry("AddressFormat", QStringLiteral("%N%n%O%n%A%nPO BOX %P%n%C %S %Z"));
+    }
+    fmt->elements = AddressFormatParser::parseElements(formatString);
+    fmt->postalCodeFormat = group.readEntry("PostalCodeFormat", QString());
+    fmt->country = countryCode;
+    return format;
+}
+
+AddressFormat AddressFormatRepository::formatForAddress(const Address &address, AddressFormatPreference formatPref)
+{
+    KCountry c;
+    if (address.country().size() == 2) {
+        c = KCountry::fromAlpha2(address.country());
+    }
+    if (!c.isValid()) {
+        c = KCountry::fromName(address.country());
+    }
+    // fall back to our own country
+    if (!c.isValid()) {
+        c = KCountry::fromQLocale(QLocale().country());
+    }
+
+    const auto scriptPref = AddressFormatScript::detect(address) == AddressFormatScript::LatinLikeScript ? AddressFormatScriptPreference::Latin
+                                                                                                         : AddressFormatScriptPreference::Local;
+    return formatForCountry(c.alpha2(), scriptPref, formatPref);
+}
diff --git a/src/addressformat.h b/src/addressformat.h
new file mode 100644 (file)
index 0000000..ab9b597
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSFORMAT_H
+#define KCONTACTS_ADDRESSFORMAT_H
+
+#include "kcontacts_export.h"
+#include "namespace.h"
+
+#include <QExplicitlySharedDataPointer>
+
+namespace KContacts
+{
+
+class Address;
+class AddressFormatElementPrivate;
+
+/** A single element in an address format.
+ *
+ *  A format element can be one of three types:
+ *  - a field from the address data
+ *  - a literal string
+ *  - a separator
+ *
+ *  @since 5.92
+ *  @see KContacts::AddressFormat
+ */
+class KCONTACTS_EXPORT AddressFormatElement
+{
+    Q_GADGET
+    Q_PROPERTY(bool isField READ isField)
+    Q_PROPERTY(KContacts::AddressFormatField field READ field)
+    Q_PROPERTY(bool isLiteral READ isLiteral)
+    Q_PROPERTY(QString literal READ literal)
+    Q_PROPERTY(bool isSeparator READ isSeparator)
+
+public:
+    explicit AddressFormatElement();
+    AddressFormatElement(const AddressFormatElement &);
+    ~AddressFormatElement();
+    AddressFormatElement &operator=(const AddressFormatElement &);
+
+    bool isField() const;
+    AddressFormatField field() const;
+
+    bool isLiteral() const;
+    QString literal() const;
+
+    bool isSeparator() const;
+
+private:
+    friend class AddressFormatElementPrivate;
+    QExplicitlySharedDataPointer<AddressFormatElementPrivate> d;
+};
+
+class AddressFormatPrivate;
+
+/** Information on how addresses are formatted in a specific country/language.
+ *  This is primarily used for displaying or printing addresses, but is also
+ *  useful for country specific adjustment in address edit forms, or for parsing
+ *  textual addresses.
+ *
+ *  @since 5.92
+ *  @see AddressFormatRepository
+ */
+class KCONTACTS_EXPORT AddressFormat
+{
+    Q_GADGET
+    Q_PROPERTY(QString country READ country)
+    Q_PROPERTY(QList<KContacts::AddressFormatElement> elements READ elementsForQml)
+    Q_PROPERTY(KContacts::AddressFormatFields requiredFields READ requiredFields)
+    Q_PROPERTY(KContacts::AddressFormatFields usedFields READ usedFields)
+    Q_PROPERTY(KContacts::AddressFormatFields upperCaseFields READ upperCaseFields)
+    Q_PROPERTY(QString postalCodeRegularExpression READ postalCodeRegularExpression)
+
+public:
+    AddressFormat();
+    AddressFormat(const AddressFormat &);
+    ~AddressFormat();
+    AddressFormat &operator=(const AddressFormat &);
+
+    /** ISO 3166-1 alpha2 code of the country this format is for. */
+    QString country() const;
+
+    /** A sequence of field/literal/separator elements for this address format. */
+    const std::vector<AddressFormatElement> &elements() const;
+
+    /** The address fields that are required by this format for a valid address.
+     *  @note This information is not available for all formats.
+     */
+    AddressFormatFields requiredFields() const;
+
+    /** The address fields that are used by this format.
+     *  This is a superset of requiredFields(), and this information is
+     *  available for all formats.
+     */
+    AddressFormatFields usedFields() const;
+
+    /** Fields that should be printed in upper case regardless
+     *  of the input casing.
+     */
+    AddressFormatFields upperCaseFields() const;
+
+    /** Regular expression matching the postal codes of this format. */
+    QString postalCodeRegularExpression() const;
+
+private:
+    QList<AddressFormatElement> elementsForQml() const;
+    friend class AddressFormatPrivate;
+    QExplicitlySharedDataPointer<AddressFormatPrivate> d;
+};
+
+/** Provides address format information for a given country.
+ *
+ *  @since 5.92
+ */
+class KCONTACTS_EXPORT AddressFormatRepository
+{
+    Q_GADGET
+public:
+    /** Look up format data for a country.
+     *  @param countryCode ISO 3166-1 alpha 2 country code.
+     */
+    static Q_INVOKABLE KContacts::AddressFormat formatForCountry(const QString &countryCode,
+                                                                 KContacts::AddressFormatScriptPreference scriptPref,
+                                                                 KContacts::AddressFormatPreference formatPref = AddressFormatPreference::Generic);
+
+    /** Look up format data for a given address.
+     *  The preferred script is determined from the script used in the address object.
+     *  If the address object has no country information set, the local country is assumed.
+     */
+    static KContacts::AddressFormat formatForAddress(const Address &address, AddressFormatPreference formatPref = AddressFormatPreference::Generic);
+};
+
+}
+
+Q_DECLARE_METATYPE(KContacts::AddressFormat)
+Q_DECLARE_METATYPE(KContacts::AddressFormatElement)
+Q_DECLARE_METATYPE(KContacts::AddressFormatRepository)
+
+#endif // KCONTACTS_ADDRESSFORMAT_H
diff --git a/src/addressformat_p.h b/src/addressformat_p.h
new file mode 100644 (file)
index 0000000..a85d78f
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSFORMAT_P_H
+#define KCONTACTS_ADDRESSFORMAT_P_H
+
+#include "addressformat.h"
+
+#include <QSharedData>
+
+namespace KContacts
+{
+
+class AddressFormatElementPrivate : public QSharedData
+{
+public:
+    static inline AddressFormatElementPrivate *get(const AddressFormatElement &elem)
+    {
+        return elem.d.data();
+    }
+
+    AddressFormatField field = AddressFormatField::NoField;
+    QString literal;
+};
+
+class AddressFormatPrivate : public QSharedData
+{
+public:
+    static inline AddressFormatPrivate *get(const AddressFormat &format)
+    {
+        return format.d.data();
+    }
+
+    AddressFormatFields upper = AddressFormatField::NoField;
+    AddressFormatFields required = AddressFormatField::NoField;
+    std::vector<AddressFormatElement> elements;
+    QString postalCodeFormat;
+    QString country;
+};
+
+}
+
+#endif // KCONTACTS_ADDRESSFORMAT_P_H
diff --git a/src/addressformatparser.cpp b/src/addressformatparser.cpp
new file mode 100644 (file)
index 0000000..b951513
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addressformat_p.h"
+#include "addressformatparser_p.h"
+
+#include <QDebug>
+
+using namespace KContacts;
+
+struct {
+    char c;
+    AddressFormatField f;
+} static constexpr const field_map[] = {
+    {'A', AddressFormatField::StreetAddress},
+    {'C', AddressFormatField::Locality},
+    {'D', AddressFormatField::DependentLocality},
+    {'N', AddressFormatField::Name},
+    {'O', AddressFormatField::Organization},
+    {'P', AddressFormatField::PostOfficeBox},
+    {'R', AddressFormatField::Country},
+    {'S', AddressFormatField::Region},
+    {'X', AddressFormatField::SortingCode},
+    {'Z', AddressFormatField::PostalCode},
+};
+
+AddressFormatField AddressFormatParser::parseField(QChar c)
+{
+    const auto it = std::lower_bound(std::begin(field_map), std::end(field_map), c.cell(), [](auto lhs, auto rhs) {
+        return lhs.c < rhs;
+    });
+    if (it == std::end(field_map) || (*it).c != c.cell() || c.row() != 0) {
+        return AddressFormatField::NoField;
+    }
+    return (*it).f;
+}
+
+AddressFormatFields AddressFormatParser::parseFields(QStringView s)
+{
+    AddressFormatFields fields;
+    for (auto c : s) {
+        fields |= parseField(c);
+    }
+    return fields;
+}
+
+std::vector<AddressFormatElement> AddressFormatParser::parseElements(QStringView s)
+{
+    std::vector<AddressFormatElement> elements;
+    QString literal;
+    for (auto it = s.begin(); it != s.end(); ++it) {
+        if ((*it) == QLatin1Char('%') && std::next(it) != s.end()) {
+            if (!literal.isEmpty()) {
+                AddressFormatElement elem;
+                auto e = AddressFormatElementPrivate::get(elem);
+                e->literal = std::move(literal);
+                elements.push_back(elem);
+            }
+            ++it;
+            if ((*it) == QLatin1Char('n')) {
+                elements.push_back(AddressFormatElement{});
+            } else {
+                const auto f = parseField(*it);
+                if (f == AddressFormatField::NoField) {
+                    qWarning() << "invalid format field element: %" << *it << "in" << s;
+                } else {
+                    AddressFormatElement elem;
+                    auto e = AddressFormatElementPrivate::get(elem);
+                    e->field = f;
+                    elements.push_back(elem);
+                }
+            }
+        } else {
+            literal.push_back(*it);
+        }
+    }
+    if (!literal.isEmpty()) {
+        AddressFormatElement elem;
+        auto e = AddressFormatElementPrivate::get(elem);
+        e->literal = std::move(literal);
+        elements.push_back(elem);
+    }
+    return elements;
+}
diff --git a/src/addressformatparser_p.h b/src/addressformatparser_p.h
new file mode 100644 (file)
index 0000000..3abd1f1
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSFORMATPARSER_P_H
+#define KCONTACTS_ADDRESSFORMATPARSER_P_H
+
+#include "addressformat.h"
+
+#include <vector>
+
+namespace KContacts
+{
+
+/** Parsing functions for address format data.
+ *  @internal
+ */
+namespace AddressFormatParser
+{
+AddressFormatField parseField(QChar c);
+AddressFormatFields parseFields(QStringView s);
+std::vector<AddressFormatElement> parseElements(QStringView s);
+}
+}
+
+#endif // KCONTACTS_ADDRESSFORMATPARSER_P_H
diff --git a/src/addressformatrc b/src/addressformatrc
new file mode 100644 (file)
index 0000000..457ab57
--- /dev/null
@@ -0,0 +1,949 @@
+[AD]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=AD[1-7]0\\d
+
+[AE]
+AddressFormat=%N%n%O%n%A%n%S
+LatinAddressFormat=%N%n%O%n%A%n%S
+Required=AS
+
+[AF]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+PostalCodeFormat=\\d{4}
+
+[AI]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+PostalCodeFormat=(?:AI-)?2640
+
+[AL]
+AddressFormat=%N%n%O%n%A%n%Z%n%C
+PostalCodeFormat=\\d{4}
+
+[AM]
+AddressFormat=%N%n%O%n%A%n%Z%n%C%n%S
+LatinAddressFormat=%N%n%O%n%A%n%Z%n%C%n%S
+PostalCodeFormat=(?:37)?\\d{4}
+
+[AR]
+AddressFormat=%N%n%O%nCasilla de Correo %P%n%A%n%Z %C%n%S
+Upper=ACZ
+PostalCodeFormat=((?:[A-HJ-NP-Z])?\\d{4})([A-Z]{3})?
+
+[AS]
+AddressFormat=%N%n%O%n%A%n%C %S %Z
+Upper=ACNOS
+Required=ACSZ
+PostalCodeFormat=(96799)(?:[ \\-](\\d{4}))?
+
+[AT]
+AddressFormat=%O%n%N%nPostfach %P%n%A%n%Z %C
+BusinessAddressFormat=%O%nz.Hd. %N%nPostfach %P%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[AU]
+AddressFormat=%O%n%N%n%A%nPO BOX %P%n%C %S %Z
+Upper=CSR
+Required=ACSZ
+PostalCodeFormat=\\d{4}
+
+[AX]
+AddressFormat=%O%n%N%nPB %P%n%A%nAX-%Z %C%n%R
+Required=ACZ
+Upper=R
+PostalCodeFormat=22\\d{3}
+
+[AZ]
+AddressFormat=%N%n%O%n%A%nAZ %Z %C
+PostalCodeFormat=\\d{4}
+
+[BA]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[BB]
+AddressFormat=%N%n%O%n%A%n%C, %S %Z
+PostalCodeFormat=BB\\d{5}
+
+[BD]
+AddressFormat=%N%n%O%n%A%n%C - %Z
+PostalCodeFormat=\\d{4}
+
+[BE]
+AddressFormat=%O%n%N%n%A%nPO Box %P%n%Z %C
+AddressFormat[de]=%O%n%N%n%A%nPostfach %P%n%Z %C
+AddressFormat[fr]=%O%n%N%n%A%nBP %P%n%Z %C
+AddressFormat[nl]=%O%n%N%n%A%nPostbus %P%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[BF]
+AddressFormat=%N%n%O%n%A%n%C %X
+
+[BG]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[BH]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=(?:\\d|1[0-2])\\d{2}
+
+[BL]
+AddressFormat=%O%n%N%n%A%nBP %P%n%Z %C %X
+Upper=ACXR
+Required=ACZ
+PostalCodeFormat=9[78][01]\\d{2}
+
+[BM]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=[A-Z]{2} ?[A-Z0-9]{2}
+
+[BN]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=[A-Z]{2} ?\\d{4}
+
+[BR]
+AddressFormat=%O%n%N%nCaixa Postal %P%n%A%n%D%n%C-%S%n%Z
+Upper=CS
+Required=ASCZ
+PostalCodeFormat=\\d{5}-?\\d{3}
+
+[BS]
+AddressFormat=%N%n%O%n%A%n%C, %S
+
+[BT]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=\\d{5}
+
+[BY]
+AddressFormat=%O%n%N%n%A%n%Z, %C%n%S
+PostalCodeFormat=\\d{6}
+
+[CA]
+AddressFormat=%N%n%O%n%A%nPO BOX %P%n%C %S %Z
+Upper=ACNOSZR
+Required=ACSZ
+PostalCodeFormat=[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d
+
+[CC]
+AddressFormat=%O%n%N%n%A%n%C %S %Z
+Upper=CS
+PostalCodeFormat=6799
+
+[CH]
+AddressFormat=%O%n%N%nP.O. Box %P%n%A%n%Z %C
+AddressFormat[de]=%O%n%N%nPostfach %P%n%A%n%Z %C
+AddressFormat[fr]=%O%n%N%nCase postale %P%n%A%n%Z %C
+AddressFormat[it]=%O%n%N%nCasella postale %P%n%A%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[CI]
+AddressFormat=%N%n%O%n%X %A %C %X
+
+[CL]
+AddressFormat=%N%n%O%n%A%n%Z %C%n%S
+PostalCodeFormat=\\d{7}
+
+[CN]
+AddressFormat=%Z%n%S%C%D%n%A%n%O%n%N
+LatinAddressFormat=%N%n%O%n%A%n%D%n%C%n%S, %Z
+Upper=S
+Required=ACSZ
+PostalCodeFormat=\\d{6}
+
+[CO]
+AddressFormat=%N%n%O%n%A%n%C, %S, %Z
+Required=AS
+PostalCodeFormat=\\d{6}
+
+[CR]
+AddressFormat=%N%n%O%n%A%n%S, %C%n%Z
+Required=ACS
+PostalCodeFormat=\\d{4,5}|\\d{3}-\\d{4}
+
+[CU]
+AddressFormat=%N%n%O%n%A%n%C %S%n%Z
+PostalCodeFormat=\\d{5}
+
+[CV]
+AddressFormat=%N%n%O%n%A%n%Z %C%n%S
+PostalCodeFormat=\\d{4}
+
+[CX]
+AddressFormat=%O%n%N%n%A%n%C %S %Z
+Upper=CS
+PostalCodeFormat=6798
+
+[CY]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[CZ]
+AddressFormat=%N%np. p. %P%n%O%n%A%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{3} ?\\d{2}
+
+[DE]
+AddressFormat=%N%n%O%nPostfach %P%n%A%n%Z %C
+AddressFormat[nds]=%N%n- %O -%nPostfach %P%n%A%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{5}
+
+[DK]
+AddressFormat=%N%n%O%n%A%nPostboks %P%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[DO]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[DZ]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[EC]
+AddressFormat=%N%n%O%n%A%n%Z%n%C
+Upper=CZ
+PostalCodeFormat=\\d{6}
+
+[EE]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{5}
+
+[EG]
+AddressFormat=%N%n%O%n%A%n%C%n%S%n%Z
+LatinAddressFormat=%N%n%O%n%A%n%C%n%S%n%Z
+PostalCodeFormat=\\d{5}
+
+[EH]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[ES]
+AddressFormat=%N%n%O%nApartado Postal %P%n%A%n%Z %C %S
+Upper=CS
+Required=ACSZ
+PostalCodeFormat=\\d{5}
+
+[ET]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[FI]
+AddressFormat=%O%n%N%nPB %P%n%A%nFI-%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{5}
+
+[FK]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=FIQQ 1ZZ
+
+[FM]
+AddressFormat=%N%n%O%n%A%n%C %S %Z
+Upper=ACNOS
+Required=ACSZ
+PostalCodeFormat=(9694[1-4])(?:[ \\-](\\d{4}))?
+
+[FO]
+AddressFormat=%N%n%O%n%A%nFO%Z %C
+PostalCodeFormat=\\d{3}
+
+[FR]
+AddressFormat=%O%n%N%n%A%nBP %P%n%Z %C
+Upper=CR
+Required=ACZ
+PostalCodeFormat=\\d{2} ?\\d{3}
+
+[GB]
+AddressFormat=%N%n%O%nPO Box %P%n%A%n%C%n%Z
+Upper=CZR
+Required=ACZ
+PostalCodeFormat=GIR ?0AA|(?:(?:AB|AL|B|BA|BB|BD|BF|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(?:\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}))|BFPO ?\\d{1,4}
+
+[GE]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[GF]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=9[78]3\\d{2}
+
+[GG]
+AddressFormat=%N%n%O%n%A%n%C%nGUERNSEY%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=GY\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}
+
+[GI]
+AddressFormat=%N%n%O%n%A%nGIBRALTAR%n%Z
+Required=A
+PostalCodeFormat=GX11 1AA
+
+[GL]
+AddressFormat=%N%n%O%n%A%n(Postboks %P%n%Z %C
+Required=ACZ
+PostalCodeFormat=39\\d{2}
+
+[GN]
+AddressFormat=%N%n%O%n%Z %A %C
+PostalCodeFormat=\\d{3}
+
+[GP]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=9[78][01]\\d{2}
+
+[GR]
+AddressFormat=%N%n%O%n%A%nP.O. BOX %P%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{3} ?\\d{2}
+
+[GS]
+AddressFormat=%N%n%O%n%A%n%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=SIQQ 1ZZ
+
+[GT]
+AddressFormat=%N%n%O%n%A%n%Z- %C
+PostalCodeFormat=\\d{5}
+
+[GU]
+AddressFormat=%N%n%O%n%A%n%C %Z
+Upper=ACNO
+Required=ACZ
+PostalCodeFormat=(969(?:[12]\\d|3[12]))(?:[ \\-](\\d{4}))?
+
+[GW]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[HK]
+AddressFormat=%S%n%C%n%A%n%O%n%N
+LatinAddressFormat=%N%n%O%n%A%n%C%n%S
+Upper=S
+Required=AS
+
+[HM]
+AddressFormat=%O%n%N%n%A%n%C %S %Z
+Upper=CS
+PostalCodeFormat=\\d{4}
+
+[HN]
+AddressFormat=%N%n%O%n%A%n%C, %S%n%Z
+Required=ACS
+PostalCodeFormat=\\d{5}
+
+[HR]
+AddressFormat=%N%n%O%n%A%nHR-%Z %C
+PostalCodeFormat=\\d{5}
+
+[HT]
+AddressFormat=%N%n%O%n%A%nHT%Z %C
+PostalCodeFormat=\\d{4}
+
+[HU]
+AddressFormat=%N%n%O%n%C%n%A%nPF. %P%n%Z
+Upper=ACNO
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[ID]
+AddressFormat=%N%n%O%n%A%n%C%n%S %Z
+Required=AS
+PostalCodeFormat=\\d{5}
+
+[IE]
+AddressFormat=%N%n%O%n%A%n%D%n%C%n%S%n%Z
+PostalCodeFormat=[\\dA-Z]{3} ?[\\dA-Z]{4}
+
+[IL]
+AddressFormat=%N%n%Oת.ד. %P%n%n%A%n%C %Z
+PostalCodeFormat=\\d{5}(?:\\d{2})?
+Upper=R
+
+[IM]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=IM\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}
+
+[IN]
+AddressFormat=%N%n%O%n%A%n%C %Z%n%S
+Required=ACSZ
+PostalCodeFormat=\\d{6}
+
+[IO]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=BBND 1ZZ
+
+[IQ]
+AddressFormat=%O%n%N%n%A%n%C, %S%n%Z
+Upper=CS
+Required=ACS
+PostalCodeFormat=\\d{5}
+
+[IR]
+AddressFormat=%O%n%N%n%S%n%C, %D%n%A%n%Z
+PostalCodeFormat=\\d{5}-?\\d{5}
+
+[IS]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{3}
+
+[IT]
+AddressFormat=%N%n%O%n%A%nCASELLA POSTALE %P%n%Z %C %S
+Upper=CSR
+Required=ACSZ
+PostalCodeFormat=\\d{5}
+
+[JE]
+AddressFormat=%N%n%O%n%A%n%C%nJERSEY%n%Z
+Upper=CZ
+PostalCodeFormat=JE\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}
+
+[JM]
+AddressFormat=%N%n%O%n%A%n%C%n%S %X
+Required=ACS
+
+[JO]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=\\d{5}
+
+[JP]
+AddressFormat=%R%n〒%Z%n%S%C%A%n%O%n%N
+LatinAddressFormat=%N%n%O%n%A, %C%n%S %Z
+Upper=SR
+Required=ASZ
+PostalCodeFormat=\\d{3}-?\\d{4}
+
+[KE]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+PostalCodeFormat=\\d{5}
+
+[KG]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{6}
+
+[KH]
+AddressFormat=%N%n%O%n%A%nP.O. Box %P%n%C %Z
+Upper=R
+PostalCodeFormat=\\d{5,6}
+
+[KI]
+AddressFormat=%N%n%O%n%A%n%S%n%C
+Upper=ACNOS
+
+[KN]
+AddressFormat=%N%n%O%n%A%n%C, %S
+Required=ACS
+
+[KR]
+AddressFormat=%R%n%S %C%D%n%A%n%O%n%N%n%Z
+LatinAddressFormat=%N%n%O%n%A%n%D%n%C%n%S%n%Z
+Upper=Z
+Required=ACSZ
+PostalCodeFormat=\\d{5}
+
+[KW]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[KY]
+AddressFormat=%N%n%O%n%A%n%S %Z
+Required=AS
+PostalCodeFormat=KY\\d-\\d{4}
+
+[KZ]
+AddressFormat=%Z%n%S%n%C%n%A%n%O%n%N
+PostalCodeFormat=\\d{6}
+
+[LA]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[LB]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=(?:\\d{4})(?: ?(?:\\d{4}))?
+
+[LI]
+AddressFormat=%O%n%N%n%A%nFL-%Z %C
+Required=ACZ
+PostalCodeFormat=948[5-9]|949[0-8]
+
+[LK]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+PostalCodeFormat=\\d{5}
+
+[LR]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[LS]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=\\d{3}
+
+[LT]
+AddressFormat=%O%n%N%n%A%nLT-%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{5}
+
+[LU]
+AddressFormat=%O%n%N%nPO Box %P%n%A%nL-%Z %C
+AddressFormat[fr]=%O%n%N%nBP %P%n%A%nL-%Z %C
+AddressFormat[de]=%O%n%N%nPostfach %P%n%A%nL-%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[LV]
+AddressFormat=%N%n%O%n%A%n%C, %Z
+Required=ACZ
+PostalCodeFormat=LV-\\d{4}
+
+[MA]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[MC]
+AddressFormat=%N%n%O%n%A%nMC-%Z %C %X
+PostalCodeFormat=980\\d{2}
+
+[MD]
+AddressFormat=%N%n%O%n%A%nMD-%Z %C
+PostalCodeFormat=\\d{4}
+
+[ME]
+AddressFormat=%N%n%O%n%A%npoštanski fah %P%n%Z %C
+AddressFormat[sr]=%N%n%O%n%A%nпоштански фах %P%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=8\\d{4}
+
+[MF]
+AddressFormat=%O%n%N%n%A%nBP %P%n%Z %C %X
+Upper=ACXR
+PostalCodeFormat=9[78][01]\\d{2}
+
+[MG]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{3}
+
+[MH]
+AddressFormat=%N%n%O%n%A%n%C %S %Z
+Upper=ACNOS
+Required=ACSZ
+PostalCodeFormat=(969[67]\\d)(?:[ \\-](\\d{4}))?
+
+[MK]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[MM]
+AddressFormat=%N%n%O%n%A%n%C, %Z
+PostalCodeFormat=\\d{5}
+
+[MN]
+AddressFormat=%N%n%O%n%A%n%C%n%S %Z
+PostalCodeFormat=\\d{5}
+
+[MO]
+AddressFormat=%A%n%O%n%N
+LatinAddressFormat=%N%n%O%n%A
+Required=A
+
+[MP]
+AddressFormat=%N%n%O%n%A%nPO BOX %P%n%C %S %Z
+Upper=ACNOSR
+Required=ACSZ
+PostalCodeFormat=(9695[012])(?:[ \\-](\\d{4}))?
+
+[MQ]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=9[78]2\\d{2}
+
+[MT]
+AddressFormat=%N%n%O%n%A%n%C %Z
+Upper=CZ
+PostalCodeFormat=[A-Z]{3} ?\\d{2,4}
+
+[MU]
+AddressFormat=%N%n%O%n%A%n%Z%n%C
+Upper=CZ
+PostalCodeFormat=\\d{3}(?:\\d{2}|[A-Z]{2}\\d{3})
+
+[MV]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=\\d{5}
+
+[MW]
+AddressFormat=%N%n%O%n%A%n%C %X
+
+[MX]
+AddressFormat=%N%n%O%n%A%n%D%n%Z %C, %S
+Upper=CSZ
+Required=ACSZ
+PostalCodeFormat=\\d{5}
+
+[MZ]
+AddressFormat=%N%n%O%n%A%n%Z %C%S
+PostalCodeFormat=\\d{4}
+
+[NA]
+AddressFormat=%N%n%O%n%A%n%C%nP.O. Box %P%n%Z
+PostalCodeFormat=\\d{5}
+
+[NC]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=988\\d{2}
+
+[NE]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[NF]
+AddressFormat=%O%n%N%n%A%n%C %S %Z
+Upper=CS
+PostalCodeFormat=2899
+
+[NG]
+AddressFormat=%N%n%O%n%A%n%D%n%C %Z%n%S
+Upper=CS
+PostalCodeFormat=\\d{6}
+
+[NI]
+AddressFormat=%N%n%O%n%A%n%Z%n%C, %S
+Upper=CS
+PostalCodeFormat=\\d{5}
+
+[NL]
+AddressFormat=%O%n%N%nPostbus %P%n%A%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{4} ?[A-Z]{2}
+
+[NO]
+AddressFormat=%N%n%O%nPostboks %P%n%A%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[NP]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=\\d{5}
+
+[NR]
+AddressFormat=%N%n%O%n%A%n%S
+Required=AS
+
+[NZ]
+AddressFormat=%N%n%O%nPO Box %P%n%A%n%D%n%C %Z
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[OM]
+AddressFormat=%N%n%O%n%A%n%Z%n%C
+PostalCodeFormat=(?:PC )?\\d{3}
+
+[PA]
+AddressFormat=%N%n%O%n%A%n%C%n%S
+Upper=CS
+
+[PE]
+AddressFormat=%N%n%O%n%A%n%C %Z%n%S
+PostalCodeFormat=(?:LIMA \\d{1,2}|CALLAO 0?\\d)|[0-2]\\d{4}
+
+[PF]
+AddressFormat=%N%n%O%n%A%n%Z %C %S
+Upper=CS
+Required=ACSZ
+PostalCodeFormat=987\\d{2}
+
+[PG]
+AddressFormat=%N%n%O%n%A%n%C %Z %S
+Required=ACS
+PostalCodeFormat=\\d{3}
+
+[PH]
+AddressFormat=%N%n%O%n%A%n%D, %C%n%Z %S
+PostalCodeFormat=\\d{4}
+
+[PK]
+AddressFormat=%N%n%O%n%A%n%C-%Z
+PostalCodeFormat=\\d{5}
+
+[PL]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{2}-\\d{3}
+
+[PM]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=9[78]5\\d{2}
+
+[PN]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=PCRN 1ZZ
+
+[PR]
+AddressFormat=%N%n%O%n%A%n%C PR %Z
+Upper=ACNO
+Required=ACZ
+PostalCodeFormat=(00[679]\\d{2})(?:[ \\-](\\d{4}))?
+
+[PT]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{4}-\\d{3}
+
+[PW]
+AddressFormat=%N%n%O%n%A%n%C %S %Z
+Upper=ACNOS
+Required=ACSZ
+PostalCodeFormat=(969(?:39|40))(?:[ \\-](\\d{4}))?
+
+[PY]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[RE]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=9[78]4\\d{2}
+
+[RO]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Upper=AC
+Required=ACZ
+PostalCodeFormat=\\d{6}
+
+[RS]
+AddressFormat=%N%n%O%n%A%nпоштански фах %P%n%Z %C
+AddressFormat[sr@latin]=%N%n%O%n%A%npoštanski fah %P%n%Z %C
+Upper=R
+Required=ACZ
+PostalCodeFormat=\\d{5,6}
+
+[RU]
+AddressFormat=%N%n%O%n%A%n%C%n%S%n%Z
+LatinAddressFormat=%N%n%O%n%A%n%C%n%S%n%Z
+Upper=AC
+PostalCodeFormat=\\d{6}
+
+[SA]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=\\d{5}
+
+[SC]
+AddressFormat=%N%n%O%n%A%n%C%n%S
+Upper=S
+
+[SD]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+PostalCodeFormat=\\d{5}
+
+[SE]
+AddressFormat=%O%n%N%nBox %P%n%A%nSE-%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{3} ?\\d{2}
+
+[SG]
+AddressFormat=%N%n%O%n%A%nSINGAPORE %Z
+Required=AZ
+PostalCodeFormat=\\d{6}
+
+[SH]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=(?:ASCN|STHL) 1ZZ
+
+[SI]
+AddressFormat=%N%n%O%n%A%np.p. %P%nSI-%Z %C
+PostalCodeFormat=\\d{4}
+
+[SJ]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[SK]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Required=ACZ
+PostalCodeFormat=\\d{3} ?\\d{2}
+
+[SM]
+AddressFormat=%N%n%O%n%A%n%Z %C
+Required=AZ
+PostalCodeFormat=4789\\d
+
+[SN]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
+
+[SO]
+AddressFormat=%N%n%O%n%A%n%C, %S %Z
+Upper=ACS
+Required=ACS
+PostalCodeFormat=[A-Z]{2} ?\\d{5}
+
+[SR]
+AddressFormat=%N%n%O%n%A%n%C%n%S
+Upper=AS
+
+[SV]
+AddressFormat=%N%n%O%n%A%n%Z-%C%n%S
+Upper=CSZ
+Required=ACS
+PostalCodeFormat=CP [1-3][1-7][0-2]\\d
+
+[SZ]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=ACZ
+PostalCodeFormat=[HLMS]\\d{3}
+
+[TC]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Upper=CZ
+Required=ACZ
+PostalCodeFormat=TKCA 1ZZ
+
+[TH]
+AddressFormat=%N%n%O%n%A%n%D %C%n%S %Z
+LatinAddressFormat=%N%n%O%n%A%n%D, %C%n%S %Z
+Upper=S
+PostalCodeFormat=\\d{5}
+
+[TJ]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{6}
+
+[TM]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{6}
+
+[TN]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4}
+
+[TR]
+AddressFormat=%N%n%O%n%A%n%Z %C/%S
+Required=ACZ
+PostalCodeFormat=\\d{5}
+
+[TV]
+AddressFormat=%N%n%O%n%A%n%C%n%S
+Upper=ACS
+
+[TW]
+AddressFormat=%Z%n%S%C%n%A%n%O%n%N
+LatinAddressFormat=%N%n%O%n%A%n%C, %S %Z
+Required=ACSZ
+PostalCodeFormat=\\d{3}(?:\\d{2,3})?
+
+[TZ]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{4,5}
+
+[UA]
+AddressFormat=%N%n%O%n%A%n%C%n%S%n%Z
+LatinAddressFormat=%N%n%O%n%A%n%C%n%S%n%Z
+Required=ACZ
+PostalCodeFormat=\\d{5}
+
+[UM]
+AddressFormat=%N%n%O%n%A%n%C %S %Z
+Upper=ACNOS
+Required=ACS
+PostalCodeFormat=96898
+
+[US]
+AddressFormat=%N%n%O%n%A%nPO BOX %P%n%C, %S %Z
+Upper=CSR
+Required=ACSZ
+PostalCodeFormat=(\\d{5})(?:[ \\-](\\d{4}))?
+
+[UY]
+AddressFormat=%N%n%O%n%A%n%Z %C %S
+Upper=CS
+PostalCodeFormat=\\d{5}
+
+[UZ]
+AddressFormat=%N%n%O%n%A%n%Z %C%n%S
+Upper=CS
+PostalCodeFormat=\\d{6}
+
+[VA]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=00120
+
+[VC]
+AddressFormat=%N%n%O%n%A%n%C %Z
+PostalCodeFormat=VC\\d{4}
+
+[VE]
+AddressFormat=%N%n%O%n%A%n%C %Z, %S
+Upper=CS
+Required=ACS
+PostalCodeFormat=\\d{4}
+
+[VG]
+AddressFormat=%N%n%O%n%A%n%C%n%Z
+Required=A
+PostalCodeFormat=VG\\d{4}
+
+[VI]
+AddressFormat=%N%n%O%n%A%n%C %S %Z
+Upper=ACNOS
+Required=ACSZ
+PostalCodeFormat=(008(?:(?:[0-4]\\d)|(?:5[01])))(?:[ \\-](\\d{4}))?
+
+[VN]
+AddressFormat=%N%n%O%n%A%n%C%n%S %Z
+LatinAddressFormat=%N%n%O%n%A%n%C%n%S %Z
+PostalCodeFormat=\\d{5}\\d?
+
+[WF]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=986\\d{2}
+
+[YT]
+AddressFormat=%O%n%N%n%A%n%Z %C %X
+Upper=ACX
+Required=ACZ
+PostalCodeFormat=976\\d{2}
+
+[ZA]
+AddressFormat=%N%n%O%n%A%n%D%n%C%n%Z
+Required=ACZ
+PostalCodeFormat=\\d{4}
+
+[ZM]
+AddressFormat=%N%n%O%n%A%n%Z %C
+PostalCodeFormat=\\d{5}
diff --git a/src/addressformatscript.cpp b/src/addressformatscript.cpp
new file mode 100644 (file)
index 0000000..512d7cb
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "address.h"
+#include "addressformatscript_p.h"
+
+using namespace KContacts;
+
+AddressFormatScript::ScriptType AddressFormatScript::detect(const QString &s)
+{
+    for (auto c : s) {
+        switch (c.script()) {
+        case QChar::Script_Arabic:
+            return AddressFormatScript::ArabicLikeScript;
+        case QChar::Script_Han:
+            return AddressFormatScript::HanLikeScript;
+        case QChar::Script_Hangul:
+        case QChar::Script_Thai:
+            return AddressFormatScript::HangulLikeScript;
+        default:
+            break;
+        }
+    }
+    return AddressFormatScript::LatinLikeScript;
+}
+
+AddressFormatScript::ScriptType AddressFormatScript::detect(const Address &addr)
+{
+    return std::max(detect(addr.street()), detect(addr.locality()));
+}
diff --git a/src/addressformatscript_p.h b/src/addressformatscript_p.h
new file mode 100644 (file)
index 0000000..f36e807
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSFORMATSCRIPT_P_H
+#define KCONTACTS_ADDRESSFORMATSCRIPT_P_H
+
+#include "addressformat.h"
+
+namespace KContacts
+{
+
+/**
+ * Classify the script used in an address.
+ * This is used for two things:
+ * - determining the line style separator
+ * - decide whether to use local or latin script format alternatives when available
+ *
+ * @see address_formatter.cc in libaddressinput
+ * @internal
+ */
+namespace AddressFormatScript
+{
+enum ScriptType {
+    LatinLikeScript,
+    ArabicLikeScript,
+    HanLikeScript,
+    HangulLikeScript,
+};
+
+ScriptType detect(const QString &s);
+ScriptType detect(const Address &addr);
+}
+}
+
+#endif // KCONTACTS_ADDRESSFORMATSCRIPT_P_H
diff --git a/src/addressformatter.cpp b/src/addressformatter.cpp
new file mode 100644 (file)
index 0000000..2b67652
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "addressformatter_p.h"
+
+#include "address.h"
+#include "addressformat.h"
+#include "addressformat_p.h"
+#include "addressformatscript_p.h"
+
+#include <KCountry>
+
+#include <QDebug>
+#include <QStringList>
+
+using namespace KContacts;
+
+static constexpr auto AllFields = AddressFormatField::Country | AddressFormatField::Region | AddressFormatField::Locality
+    | AddressFormatField::DependentLocality | AddressFormatField::SortingCode | AddressFormatField::PostalCode | AddressFormatField::StreetAddress
+    | AddressFormatField::Organization | AddressFormatField::Name | AddressFormatField::PostOfficeBox;
+static constexpr auto AllDomesticFields = AllFields & ~(int)AddressFormatField::Country;
+static constexpr auto GeoUriFields = AddressFormatField::StreetAddress | AddressFormatField::PostalCode | AddressFormatField::Locality
+    | AddressFormatField::DependentLocality | AddressFormatField::Region | AddressFormatField::Country;
+
+enum Separator { Newline, Comma, Native };
+
+// keep the same order as the enum!
+struct {
+    Separator separator;
+    bool honorUpper;
+    bool forceCountry;
+    AddressFormatFields includeFields;
+} static constexpr const style_map[] = {
+    {Newline, true, true, AllDomesticFields}, // AddressFormatStyle::Postal
+    {Newline, false, false, AllDomesticFields}, // AddressFormatStyle::MultiLineDomestic
+    {Newline, false, true, AllFields}, // AddressFormatStyle::MultiLineInternational
+    {Native, false, false, AllDomesticFields}, // AddressFormatStyle::SingleLineDomestic
+    {Native, false, true, AllFields}, // AddressFormatStyle::SingleLineInternational
+    {Comma, true, true, GeoUriFields}, // AddressFormatStyle::GeoUriQuery
+};
+
+static constexpr const char *separator_map[] = {"\n", ","};
+static constexpr const char *native_separator_map[] = {", ", "، ", "", " "};
+
+static bool isReverseOrder(const AddressFormat &fmt)
+{
+    return !fmt.elements().empty() && fmt.elements()[0].field() == AddressFormatField::Country;
+}
+
+QString
+AddressFormatter::format(const Address &address, const QString &name, const QString &organization, const AddressFormat &format, AddressFormatStyle style)
+{
+    const auto styleData = style_map[(int)style];
+    const auto isFieldEmpty = [&](AddressFormatField f) -> bool {
+        if ((styleData.includeFields & f) == 0) {
+            return true;
+        }
+        switch (f) {
+        case AddressFormatField::NoField:
+        case AddressFormatField::DependentLocality:
+        case AddressFormatField::SortingCode:
+            return true;
+        case AddressFormatField::Name:
+            return name.isEmpty();
+        case AddressFormatField::Organization:
+            return organization.isEmpty();
+        case AddressFormatField::PostOfficeBox:
+            return address.postOfficeBox().isEmpty();
+        case AddressFormatField::StreetAddress:
+            return address.street().isEmpty() && (address.extended().isEmpty() || style == AddressFormatStyle::GeoUriQuery);
+        case AddressFormatField::PostalCode:
+            return address.postalCode().isEmpty();
+        case AddressFormatField::Locality:
+            return address.locality().isEmpty();
+        case AddressFormatField::Region:
+            return address.region().isEmpty();
+        case AddressFormatField::Country:
+            return address.country().isEmpty();
+        }
+        return true;
+    };
+    const auto countryName = [&]() -> QString {
+        if (address.country().isEmpty()) {
+            return {};
+        }
+        // we use the already ISO 3166-1 resolved country from format here to
+        // avoid a potentially expensive second name-based lookup
+        return style == AddressFormatStyle::GeoUriQuery ? format.country() : KCountry::fromAlpha2(format.country()).name();
+    };
+
+    QStringList lines;
+    QString line, secondaryLine;
+
+    for (auto it = format.elements().begin(); it != format.elements().end(); ++it) {
+        // add separators if:
+        // - the preceding line is not empty
+        // - we use newline separators and the preceding element is another separator
+        const auto precedingSeparator = (it != format.elements().begin() && (*std::prev(it)).isSeparator());
+        if ((*it).isSeparator() && (!line.isEmpty() || (precedingSeparator && styleData.separator == Newline))) {
+            lines.push_back(line);
+            line.clear();
+            if (!secondaryLine.isEmpty()) {
+                lines.push_back(secondaryLine);
+                secondaryLine.clear();
+            }
+            continue;
+        }
+
+        // literals are only added if they not follow an empty field and are not preceding an empty field
+        // to support incomplete addresses we deviate from the libaddressinput algorithm here and also add
+        // the separator if any preceding field in the same line is non-empty, not just the immediate one.
+        // this is to produce useful output e.g. for "%C %S %Z" if %S is empty.
+        bool precedingFieldHasContent = (it == format.elements().begin() || (*std::prev(it)).isSeparator());
+        for (auto it2 = it; !(*it2).isSeparator(); --it2) {
+            if ((*it2).isField() && !isFieldEmpty((*it2).field())) {
+                precedingFieldHasContent = true;
+                break;
+            }
+            if (it2 == format.elements().begin()) {
+                break;
+            }
+        }
+        const auto followingFieldEmpty = (std::next(it) != format.elements().end() && (*std::next(it)).isField() && isFieldEmpty((*std::next(it)).field()));
+        if ((*it).isLiteral() && precedingFieldHasContent && !followingFieldEmpty) {
+            line += (*it).literal();
+            continue;
+        }
+
+        if ((*it).isField() && (styleData.includeFields & (*it).field())) {
+            QString v;
+            switch ((*it).field()) {
+            case AddressFormatField::NoField:
+            case AddressFormatField::DependentLocality:
+            case AddressFormatField::SortingCode:
+                break;
+            case AddressFormatField::Name:
+                v = name;
+                break;
+            case AddressFormatField::Organization:
+                v = organization;
+                break;
+            case AddressFormatField::PostOfficeBox:
+                v = address.postOfficeBox();
+                break;
+            case AddressFormatField::StreetAddress:
+                if (!address.street().isEmpty() && !address.extended().isEmpty() && style != AddressFormatStyle::GeoUriQuery) {
+                    if (isReverseOrder(format)) {
+                        secondaryLine = address.extended();
+                    } else {
+                        lines.push_back(address.extended());
+                    }
+                }
+                v = address.street().isEmpty() ? address.extended() : address.street();
+                break;
+            case AddressFormatField::PostalCode:
+                v = address.postalCode();
+                break;
+            case AddressFormatField::Locality:
+                v = address.locality();
+                break;
+            case AddressFormatField::Region:
+                v = address.region();
+                break;
+            case AddressFormatField::Country:
+                v = countryName();
+                break;
+            }
+            if (styleData.honorUpper && format.upperCaseFields() & (*it).field()) {
+                v = v.toUpper();
+            }
+            line += v;
+        }
+    }
+    if (!line.isEmpty()) {
+        lines.push_back(line);
+    }
+    if (!secondaryLine.isEmpty()) {
+        lines.push_back(secondaryLine);
+    }
+
+    // append country for formats that need it (international style + not yet present in format.elements())
+    if (styleData.forceCountry && (format.usedFields() & AddressFormatField::Country & styleData.includeFields) == 0 && !address.country().isEmpty()) {
+        auto c = countryName();
+        if (style == AddressFormatStyle::Postal) {
+            // the format of the country for postal addresses depends on the sending country, not the destination
+            const auto sourceCountry = KCountry::fromQLocale(QLocale().country());
+            const auto sourceFmt = AddressFormatRepository::formatForCountry(sourceCountry.alpha2(), AddressFormatScriptPreference::Local);
+            const auto shouldPrepend = isReverseOrder(sourceFmt);
+            if (!lines.isEmpty()) {
+                shouldPrepend ? lines.push_front({}) : lines.push_back({});
+            }
+            if (styleData.honorUpper && (sourceFmt.upperCaseFields() & AddressFormatField::Country)) {
+                c = c.toUpper();
+            }
+            shouldPrepend ? lines.push_front(c) : lines.push_back(c);
+        } else {
+            if (styleData.honorUpper && (format.upperCaseFields() & AddressFormatField::Country)) {
+                c = c.toUpper();
+            }
+            lines.push_back(c);
+        }
+    }
+
+    if (styleData.separator == Native) {
+        const auto script = AddressFormatScript::detect(address);
+        return lines.join(QString::fromUtf8(native_separator_map[script]));
+    }
+    return lines.join(QLatin1String(separator_map[styleData.separator]));
+}
diff --git a/src/addressformatter_p.h b/src/addressformatter_p.h
new file mode 100644 (file)
index 0000000..e4851a5
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_ADDRESSFORMATTER_H
+#define KCONTACTS_ADDRESSFORMATTER_H
+
+#include "namespace.h"
+
+class QString;
+
+namespace KContacts
+{
+
+class Address;
+class AddressFormat;
+
+/** Apply address formatting rules for a given address. */
+namespace AddressFormatter
+{
+QString format(const Address &address, const QString &name, const QString &organization, const AddressFormat &format, AddressFormatStyle style);
+};
+
+}
+
+#endif // KCONTACTS_ADDRESSFORMATTER_H
diff --git a/src/calendarurl.cpp b/src/calendarurl.cpp
new file mode 100644 (file)
index 0000000..ba2f5f7
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "calendarurl.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+#include <QUrl>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN CalendarUrl::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        type = other.type;
+        url = other.url;
+    }
+
+    static QString typeToString(CalendarUrl::CalendarType type);
+
+    ParameterMap mParamMap;
+    QUrl url;
+    CalendarUrl::CalendarType type;
+};
+
+QString CalendarUrl::Private::typeToString(CalendarUrl::CalendarType type)
+{
+    QString ret;
+    switch (type) {
+    case Unknown:
+    case EndCalendarType:
+        ret = QStringLiteral("Unknown");
+        break;
+    case FBUrl:
+        ret = QStringLiteral("FreeBusy");
+        break;
+    case CALUri:
+        ret = QStringLiteral("CalUri");
+        break;
+    case CALADRUri:
+        ret = QStringLiteral("Caladruri");
+        break;
+    }
+    return ret;
+}
+
+CalendarUrl::CalendarUrl()
+    : d(new Private)
+{
+    d->type = Unknown;
+}
+
+CalendarUrl::CalendarUrl(CalendarUrl::CalendarType type)
+    : d(new Private)
+{
+    d->type = type;
+}
+
+CalendarUrl::CalendarUrl(const CalendarUrl &other)
+    : d(other.d)
+{
+}
+
+CalendarUrl::~CalendarUrl()
+{
+}
+
+bool CalendarUrl::operator==(const CalendarUrl &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->type == other.type()) && (d->url == other.url());
+}
+
+bool CalendarUrl::operator!=(const CalendarUrl &other) const
+{
+    return !(other == *this);
+}
+
+CalendarUrl &CalendarUrl::operator=(const CalendarUrl &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString CalendarUrl::toString() const
+{
+    QString str = QLatin1String("CalendarUrl {\n");
+    str += QStringLiteral("    url: %1\n").arg(d->url.toString());
+    str += QStringLiteral("    type: %1\n").arg(CalendarUrl::Private::typeToString(d->type));
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void CalendarUrl::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> CalendarUrl::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void CalendarUrl::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap CalendarUrl::params() const
+{
+    return d->mParamMap;
+}
+
+bool CalendarUrl::isValid() const
+{
+    return (d->type != Unknown) && (d->url.isValid());
+}
+
+void CalendarUrl::setType(CalendarUrl::CalendarType type)
+{
+    d->type = type;
+}
+
+CalendarUrl::CalendarType CalendarUrl::type() const
+{
+    return d->type;
+}
+
+void CalendarUrl::setUrl(const QUrl &url)
+{
+    d->url = url;
+}
+
+QUrl CalendarUrl::url() const
+{
+    return d->url;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const CalendarUrl &calUrl)
+{
+    return s << calUrl.d->mParamMap << static_cast<uint>(calUrl.d->type) << calUrl.d->url;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, CalendarUrl &calUrl)
+{
+    uint type;
+    s >> calUrl.d->mParamMap >> type >> calUrl.d->url;
+    calUrl.d->type = static_cast<CalendarUrl::CalendarType>(type);
+    return s;
+}
diff --git a/src/calendarurl.h b/src/calendarurl.h
new file mode 100644 (file)
index 0000000..aa9f6a6
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CALENDARURL_H
+#define CALENDARURL_H
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+class QUrl;
+
+class CalendarUrlTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Calendar Url (FBURL/CALADRURI/CALURI)
+ *  @since 4.14.6
+ */
+class KCONTACTS_EXPORT CalendarUrl
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const CalendarUrl &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, CalendarUrl &);
+    friend class VCardTool;
+    friend class ::CalendarUrlTest;
+
+public:
+    enum CalendarType {
+        Unknown = 0,
+        FBUrl,
+        CALUri,
+        CALADRUri,
+        EndCalendarType,
+    };
+
+    CalendarUrl();
+    CalendarUrl(CalendarUrl::CalendarType type);
+    CalendarUrl(const CalendarUrl &other);
+
+    ~CalendarUrl();
+
+    typedef QVector<CalendarUrl> List;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    void setType(CalendarUrl::CalendarType type);
+    Q_REQUIRED_RESULT CalendarUrl::CalendarType type() const;
+
+    void setUrl(const QUrl &url);
+    QUrl url() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const CalendarUrl &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const CalendarUrl &other) const;
+
+    CalendarUrl &operator=(const CalendarUrl &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const CalendarUrl &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, CalendarUrl &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::CalendarUrl, Q_MOVABLE_TYPE);
+#endif // CALENDARURL_H
diff --git a/src/clientpidmap.cpp b/src/clientpidmap.cpp
new file mode 100644 (file)
index 0000000..fd45415
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "clientpidmap.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN ClientPidMap::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        clientpidmap = other.clientpidmap;
+    }
+
+    ParameterMap mParamMap;
+    QString clientpidmap;
+};
+
+ClientPidMap::ClientPidMap()
+    : d(new Private)
+{
+}
+
+ClientPidMap::ClientPidMap(const ClientPidMap &other)
+    : d(other.d)
+{
+}
+
+ClientPidMap::ClientPidMap(const QString &clientpidmap)
+    : d(new Private)
+{
+    d->clientpidmap = clientpidmap;
+}
+
+ClientPidMap::~ClientPidMap()
+{
+}
+
+void ClientPidMap::setClientPidMap(const QString &clientpidmap)
+{
+    d->clientpidmap = clientpidmap;
+}
+
+QString ClientPidMap::clientPidMap() const
+{
+    return d->clientpidmap;
+}
+
+bool ClientPidMap::isValid() const
+{
+    return !d->clientpidmap.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void ClientPidMap::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> ClientPidMap::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void ClientPidMap::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap ClientPidMap::params() const
+{
+    return d->mParamMap;
+}
+
+bool ClientPidMap::operator==(const ClientPidMap &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->clientpidmap == other.clientPidMap());
+}
+
+bool ClientPidMap::operator!=(const ClientPidMap &other) const
+{
+    return !(other == *this);
+}
+
+ClientPidMap &ClientPidMap::operator=(const ClientPidMap &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString ClientPidMap::toString() const
+{
+    QString str = QLatin1String("ClientPidMap {\n");
+    str += QStringLiteral("    clientpidmap: %1\n").arg(d->clientpidmap);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const ClientPidMap &clientpidmap)
+{
+    return s << clientpidmap.d->mParamMap << clientpidmap.d->clientpidmap;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, ClientPidMap &clientpidmap)
+{
+    s >> clientpidmap.d->mParamMap >> clientpidmap.d->clientpidmap;
+    return s;
+}
diff --git a/src/clientpidmap.h b/src/clientpidmap.h
new file mode 100644 (file)
index 0000000..8a09813
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef CLIENTPIDMAP_H
+#define CLIENTPIDMAP_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class ClientPidMapTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a ClientPidMap for a contact.
+ *  @since 5.4
+ */
+class KCONTACTS_EXPORT ClientPidMap
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const ClientPidMap &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, ClientPidMap &);
+    friend class VCardTool;
+    friend class ::ClientPidMapTest;
+
+public:
+    ClientPidMap();
+    ClientPidMap(const ClientPidMap &other);
+    ClientPidMap(const QString &clientpidmap);
+
+    ~ClientPidMap();
+
+    typedef QVector<ClientPidMap> List;
+
+    void setClientPidMap(const QString &clientpidmap);
+    Q_REQUIRED_RESULT QString clientPidMap() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const ClientPidMap &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const ClientPidMap &other) const;
+
+    ClientPidMap &operator=(const ClientPidMap &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const ClientPidMap &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, ClientPidMap &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::ClientPidMap, Q_MOVABLE_TYPE);
+#endif // CLIENTPIDMAP_H
diff --git a/src/contactgroup.cpp b/src/contactgroup.cpp
new file mode 100644 (file)
index 0000000..c474836
--- /dev/null
@@ -0,0 +1,483 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "contactgroup.h"
+
+#include <QMap>
+#include <QSharedData>
+#include <QString>
+#include <QUuid>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN ContactGroup::ContactReference::ContactReferencePrivate : public QSharedData
+{
+public:
+    ContactReferencePrivate()
+        : QSharedData()
+    {
+    }
+
+    ContactReferencePrivate(const ContactReferencePrivate &other)
+        : QSharedData(other)
+    {
+        mUid = other.mUid;
+        mPreferredEmail = other.mPreferredEmail;
+        mCustoms = other.mCustoms;
+    }
+
+    QString mUid;
+    QString mGid;
+    QString mPreferredEmail;
+    QMap<QString, QString> mCustoms;
+};
+
+ContactGroup::ContactReference::ContactReference()
+    : d(new ContactReferencePrivate)
+{
+}
+
+ContactGroup::ContactReference::ContactReference(const ContactReference &other)
+    : d(other.d)
+{
+}
+
+ContactGroup::ContactReference::ContactReference(const QString &uid)
+    : d(new ContactReferencePrivate)
+{
+    d->mUid = uid;
+}
+
+ContactGroup::ContactReference::~ContactReference()
+{
+}
+
+void ContactGroup::ContactReference::setUid(const QString &uid)
+{
+    d->mUid = uid;
+}
+
+QString ContactGroup::ContactReference::uid() const
+{
+    return d->mUid;
+}
+
+void ContactGroup::ContactReference::setGid(const QString &gid)
+{
+    d->mGid = gid;
+}
+
+QString ContactGroup::ContactReference::gid() const
+{
+    return d->mGid;
+}
+
+void ContactGroup::ContactReference::setPreferredEmail(const QString &email)
+{
+    d->mPreferredEmail = email;
+}
+
+QString ContactGroup::ContactReference::preferredEmail() const
+{
+    return d->mPreferredEmail;
+}
+
+void ContactGroup::ContactReference::insertCustom(const QString &key, const QString &value)
+{
+    d->mCustoms.insert(key, value);
+}
+
+void ContactGroup::ContactReference::removeCustom(const QString &key)
+{
+    d->mCustoms.remove(key);
+}
+
+QString ContactGroup::ContactReference::custom(const QString &key) const
+{
+    return d->mCustoms.value(key);
+}
+
+ContactGroup::ContactReference &ContactGroup::ContactReference::operator=(const ContactGroup::ContactReference &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool ContactGroup::ContactReference::operator==(const ContactReference &other) const
+{
+    return d->mUid == other.d->mUid && d->mPreferredEmail == other.d->mPreferredEmail && d->mCustoms == other.d->mCustoms;
+}
+
+class Q_DECL_HIDDEN ContactGroup::ContactGroupReference::ContactGroupReferencePrivate : public QSharedData
+{
+public:
+    ContactGroupReferencePrivate()
+        : QSharedData()
+    {
+    }
+
+    ContactGroupReferencePrivate(const ContactGroupReferencePrivate &other)
+        : QSharedData(other)
+    {
+        mUid = other.mUid;
+        mCustoms = other.mCustoms;
+    }
+
+    QString mUid;
+    QMap<QString, QString> mCustoms;
+};
+
+ContactGroup::ContactGroupReference::ContactGroupReference()
+    : d(new ContactGroupReferencePrivate)
+{
+}
+
+ContactGroup::ContactGroupReference::ContactGroupReference(const ContactGroupReference &other)
+    : d(other.d)
+{
+}
+
+ContactGroup::ContactGroupReference::ContactGroupReference(const QString &uid)
+    : d(new ContactGroupReferencePrivate)
+{
+    d->mUid = uid;
+}
+
+ContactGroup::ContactGroupReference::~ContactGroupReference()
+{
+}
+
+void ContactGroup::ContactGroupReference::setUid(const QString &uid)
+{
+    d->mUid = uid;
+}
+
+QString ContactGroup::ContactGroupReference::uid() const
+{
+    return d->mUid;
+}
+
+void ContactGroup::ContactGroupReference::insertCustom(const QString &key, const QString &value)
+{
+    d->mCustoms.insert(key, value);
+}
+
+void ContactGroup::ContactGroupReference::removeCustom(const QString &key)
+{
+    d->mCustoms.remove(key);
+}
+
+QString ContactGroup::ContactGroupReference::custom(const QString &key) const
+{
+    return d->mCustoms.value(key);
+}
+
+ContactGroup::ContactGroupReference &ContactGroup::ContactGroupReference::operator=(const ContactGroup::ContactGroupReference &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool ContactGroup::ContactGroupReference::operator==(const ContactGroupReference &other) const
+{
+    return d->mUid == other.d->mUid && d->mCustoms == other.d->mCustoms;
+}
+
+class Q_DECL_HIDDEN ContactGroup::Data::DataPrivate : public QSharedData
+{
+public:
+    DataPrivate()
+        : QSharedData()
+    {
+    }
+
+    DataPrivate(const DataPrivate &other)
+        : QSharedData(other)
+    {
+        mName = other.mName;
+        mEmail = other.mEmail;
+        mCustoms = other.mCustoms;
+    }
+
+    QString mName;
+    QString mEmail;
+    QMap<QString, QString> mCustoms;
+};
+
+ContactGroup::Data::Data()
+    : d(new DataPrivate)
+{
+}
+
+ContactGroup::Data::Data(const Data &other)
+    : d(other.d)
+{
+}
+
+ContactGroup::Data::Data(const QString &name, const QString &email)
+    : d(new DataPrivate)
+{
+    d->mName = name;
+    d->mEmail = email;
+}
+
+ContactGroup::Data::~Data()
+{
+}
+
+void ContactGroup::Data::setName(const QString &name)
+{
+    d->mName = name;
+}
+
+QString ContactGroup::Data::name() const
+{
+    return d->mName;
+}
+
+void ContactGroup::Data::setEmail(const QString &email)
+{
+    d->mEmail = email;
+}
+
+QString ContactGroup::Data::email() const
+{
+    return d->mEmail;
+}
+
+void ContactGroup::Data::insertCustom(const QString &key, const QString &value)
+{
+    d->mCustoms.insert(key, value);
+}
+
+void ContactGroup::Data::removeCustom(const QString &key)
+{
+    d->mCustoms.remove(key);
+}
+
+QString ContactGroup::Data::custom(const QString &key) const
+{
+    return d->mCustoms.value(key);
+}
+
+ContactGroup::Data &ContactGroup::Data::operator=(const ContactGroup::Data &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool ContactGroup::Data::operator==(const Data &other) const
+{
+    return d->mName == other.d->mName //
+        && d->mEmail == other.d->mEmail //
+        && d->mCustoms == other.d->mCustoms;
+}
+
+class Q_DECL_HIDDEN ContactGroup::Private : public QSharedData
+{
+public:
+    Private()
+        : QSharedData()
+        , mIdentifier(QUuid::createUuid().toString().mid(1, 36)) // We avoid the curly braces so the string is RFC4122 compliant and can be used as urn
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mIdentifier = other.mIdentifier;
+        mName = other.mName;
+        mContactReferences = other.mContactReferences;
+        mContactGroupReferences = other.mContactGroupReferences;
+        mDataObjects = other.mDataObjects;
+    }
+
+    QString mIdentifier;
+    QString mName;
+    ContactGroup::ContactReference::List mContactReferences;
+    ContactGroup::ContactGroupReference::List mContactGroupReferences;
+    ContactGroup::Data::List mDataObjects;
+};
+
+ContactGroup::ContactGroup()
+    : d(new Private)
+{
+}
+
+ContactGroup::ContactGroup(const ContactGroup &other)
+    : d(other.d)
+{
+}
+
+ContactGroup::ContactGroup(const QString &name)
+    : d(new Private)
+{
+    d->mName = name;
+}
+
+ContactGroup::~ContactGroup()
+{
+}
+
+void ContactGroup::setName(const QString &name)
+{
+    d->mName = name;
+}
+
+QString ContactGroup::name() const
+{
+    return d->mName;
+}
+
+void ContactGroup::setId(const QString &id)
+{
+    d->mIdentifier = id;
+}
+
+QString ContactGroup::id() const
+{
+    return d->mIdentifier;
+}
+
+int ContactGroup::count() const
+{
+    return d->mContactReferences.count() + d->mDataObjects.count();
+}
+
+int ContactGroup::contactReferenceCount() const
+{
+    return d->mContactReferences.count();
+}
+
+int ContactGroup::contactGroupReferenceCount() const
+{
+    return d->mContactGroupReferences.count();
+}
+
+int ContactGroup::dataCount() const
+{
+    return d->mDataObjects.count();
+}
+
+ContactGroup::ContactReference &ContactGroup::contactReference(int index)
+{
+    Q_ASSERT_X(index < d->mContactReferences.count(), "contactReference()", "index out of range");
+
+    return d->mContactReferences[index];
+}
+
+const ContactGroup::ContactReference &ContactGroup::contactReference(int index) const
+{
+    Q_ASSERT_X(index < d->mContactReferences.count(), "contactReference()", "index out of range");
+
+    return d->mContactReferences[index];
+}
+
+ContactGroup::ContactGroupReference &ContactGroup::contactGroupReference(int index)
+{
+    Q_ASSERT_X(index < d->mContactGroupReferences.count(), "contactGroupReference()", "index out of range");
+
+    return d->mContactGroupReferences[index];
+}
+
+const ContactGroup::ContactGroupReference &ContactGroup::contactGroupReference(int index) const
+{
+    Q_ASSERT_X(index < d->mContactGroupReferences.count(), "contactGroupReference()", "index out of range");
+
+    return d->mContactGroupReferences[index];
+}
+
+ContactGroup::Data &ContactGroup::data(int index)
+{
+    Q_ASSERT_X(index < d->mDataObjects.count(), "data()", "index out of range");
+
+    return d->mDataObjects[index];
+}
+
+const ContactGroup::Data &ContactGroup::data(int index) const
+{
+    Q_ASSERT_X(index < d->mDataObjects.count(), "data()", "index out of range");
+
+    return d->mDataObjects[index];
+}
+
+void ContactGroup::append(const ContactReference &reference)
+{
+    d->mContactReferences.append(reference);
+}
+
+void ContactGroup::append(const ContactGroupReference &reference)
+{
+    d->mContactGroupReferences.append(reference);
+}
+
+void ContactGroup::append(const Data &data)
+{
+    d->mDataObjects.append(data);
+}
+
+void ContactGroup::remove(const ContactReference &reference)
+{
+    d->mContactReferences.removeOne(reference);
+}
+
+void ContactGroup::remove(const ContactGroupReference &reference)
+{
+    d->mContactGroupReferences.removeOne(reference);
+}
+
+void ContactGroup::remove(const Data &data)
+{
+    d->mDataObjects.removeOne(data);
+}
+
+void ContactGroup::removeAllContactReferences()
+{
+    d->mContactReferences.clear();
+}
+
+void ContactGroup::removeAllContactGroupReferences()
+{
+    d->mContactGroupReferences.clear();
+}
+
+void ContactGroup::removeAllContactData()
+{
+    d->mDataObjects.clear();
+}
+
+ContactGroup &ContactGroup::operator=(const ContactGroup &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool ContactGroup::operator==(const ContactGroup &other) const
+{
+    return d->mIdentifier == other.d->mIdentifier //
+        && d->mName == other.d->mName //
+        && d->mContactReferences == other.d->mContactReferences //
+        && d->mContactGroupReferences == other.d->mContactGroupReferences //
+        && d->mDataObjects == other.d->mDataObjects;
+}
+
+QString ContactGroup::mimeType()
+{
+    return QStringLiteral("application/x-vnd.kde.contactgroup");
+}
diff --git a/src/contactgroup.h b/src/contactgroup.h
new file mode 100644 (file)
index 0000000..481135f
--- /dev/null
@@ -0,0 +1,474 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_CONTACTGROUP_H
+#define KCONTACTS_CONTACTGROUP_H
+
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QVector>
+
+#include "kcontacts_export.h"
+
+class QString;
+
+namespace KContacts
+{
+/**
+ * @short This class represents a group of contacts.
+ *
+ * It can contain two types of contacts, either a reference
+ * or data.
+ * The reference entry is just an unique identifier which
+ * identifies the real contact in the system.
+ * The data entry contains a name and an email address.
+ *
+ * @author Tobias Koenig <tokoe@kde.org>
+ * @since 4.3
+ */
+class KCONTACTS_EXPORT ContactGroup
+{
+public:
+    /**
+     * This class represents a contact reference
+     */
+    class KCONTACTS_EXPORT ContactReference
+    {
+    public:
+        /**
+         * A list of contact references.
+         */
+        typedef QVector<ContactReference> List;
+
+        /**
+         * Creates an empty contact reference.
+         */
+        ContactReference();
+
+        /**
+         * Creates a contact reference from an @p other reference.
+         */
+        ContactReference(const ContactReference &other);
+
+        /**
+         * Creates a contact reference for the given contact @p uid.
+         */
+        ContactReference(const QString &uid);
+
+        /**
+         * Destroys the contact reference.
+         */
+        ~ContactReference();
+
+        /**
+         * Sets the contact uid of the contact reference.
+         * @param uid identifier of the contact to reference
+         * @note That is the Akonadi Item ID of the contact that
+         *       is referenced here.
+         */
+        void setUid(const QString &uid);
+
+        /**
+         * Returns the contact uid of the contact reference.
+         *
+         * @note That is the Akonadi Item ID of the contact that
+         *       is referenced here.
+         */
+        Q_REQUIRED_RESULT QString uid() const;
+
+        /**
+         * Sets the contact gid of the contact reference.
+         * @param gid globally unique identifier of the contact to reference
+         * @since 4.12
+         */
+        void setGid(const QString &gid);
+
+        /**
+         * Returns the contact GID of the contact reference.
+         * @since 4.12
+         */
+        Q_REQUIRED_RESULT QString gid() const;
+
+        /**
+         * Sets the preferred email address.
+         */
+        void setPreferredEmail(const QString &email);
+
+        /**
+         * Returns the preferred email address, or an empty string
+         * if no preferred email address is set.
+         */
+        Q_REQUIRED_RESULT QString preferredEmail() const;
+
+        /**
+         * Inserts a custom entry.
+         * If an entry with the same @p key already exists, it is
+         * overwritten.
+         *
+         * @param key The unique key.
+         * @param value The value.
+         */
+        void insertCustom(const QString &key, const QString &value);
+
+        /**
+         * Removes the custom entry with the given @p key.
+         */
+        void removeCustom(const QString &key);
+
+        /**
+         * Returns the value for the given @p key, or an empty string
+         * if the entry for that key does not exists.
+         */
+        Q_REQUIRED_RESULT QString custom(const QString &key) const;
+
+        /**
+         * @internal
+         */
+        ContactReference &operator=(const ContactReference &other);
+
+        /**
+         * @internal
+         */
+        Q_REQUIRED_RESULT bool operator==(const ContactReference &other) const;
+
+    private:
+        class ContactReferencePrivate;
+        QSharedDataPointer<ContactReferencePrivate> d;
+    };
+
+    /**
+     * This class represents a contact group reference
+     */
+    class KCONTACTS_EXPORT ContactGroupReference
+    {
+    public:
+        /**
+         * A list of contact group references.
+         */
+        typedef QVector<ContactGroupReference> List;
+
+        /**
+         * Creates an empty contact group reference.
+         */
+        ContactGroupReference();
+
+        /**
+         * Creates a contact group reference from an @p other reference.
+         */
+        ContactGroupReference(const ContactGroupReference &other);
+
+        /**
+         * Creates a contact group reference for the given contact group @p uid.
+         */
+        ContactGroupReference(const QString &uid);
+
+        /**
+         * Destroys the contact group reference.
+         */
+        ~ContactGroupReference();
+
+        /**
+         * Sets the contact group uid of the contact group reference.
+         */
+        void setUid(const QString &uid);
+
+        /**
+         * Returns the contact group uid of the contact group reference.
+         */
+        QString uid() const;
+
+        /**
+         * Inserts a custom entry.
+         * If an entry with the same @p key already exists, it is
+         * overwritten.
+         *
+         * @param key The unique key.
+         * @param value The value.
+         */
+        void insertCustom(const QString &key, const QString &value);
+
+        /**
+         * Removes the custom entry with the given @p key.
+         */
+        void removeCustom(const QString &key);
+
+        /**
+         * Returns the value for the given @p key, or an empty string
+         * if the entry for that key does not exists.
+         */
+        QString custom(const QString &key) const;
+
+        /**
+         * @internal
+         */
+        ContactGroupReference &operator=(const ContactGroupReference &other);
+
+        /**
+         * @internal
+         */
+        bool operator==(const ContactGroupReference &other) const;
+
+    private:
+        class ContactGroupReferencePrivate;
+        QSharedDataPointer<ContactGroupReferencePrivate> d;
+    };
+
+    /**
+     * This class represents a contact data object
+     */
+    class KCONTACTS_EXPORT Data
+    {
+    public:
+        /**
+         * A list of contact data.
+         */
+        typedef QVector<Data> List;
+
+        /**
+         * Creates an empty contact data object.
+         */
+        Data();
+
+        /**
+         * Creates a contact data object from an @p other data object.
+         */
+        Data(const Data &other);
+
+        /**
+         * Creates a contact data object with the given @p name and @p email address.
+         */
+        Data(const QString &name, const QString &email);
+
+        /**
+         * Destroys the contact data object.
+         */
+        ~Data();
+
+        /**
+         * Sets the @p name of the contact data object.
+         */
+        void setName(const QString &name);
+
+        /**
+         * Returns the name of the contact data object.
+         */
+        Q_REQUIRED_RESULT QString name() const;
+
+        /**
+         * Sets the @p email address of the contact data object.
+         */
+        void setEmail(const QString &email);
+
+        /**
+         * Returns the email address of the contact data object.
+         */
+        Q_REQUIRED_RESULT QString email() const;
+
+        /**
+         * Inserts a custom entry.
+         * If an entry with the same @p key already exists, it is
+         * overwritten.
+         *
+         * @param key The unique key.
+         * @param value The value.
+         */
+        void insertCustom(const QString &key, const QString &value);
+
+        /**
+         * Removes the custom entry with the given @p key.
+         */
+        void removeCustom(const QString &key);
+
+        /**
+         * Returns the value for the given @p key, or an empty string
+         * if the entry for that key does not exists.
+         */
+        Q_REQUIRED_RESULT QString custom(const QString &key) const;
+
+        /**
+         * @internal
+         */
+        Data &operator=(const Data &other);
+
+        /**
+         * @internal
+         */
+        Q_REQUIRED_RESULT bool operator==(const Data &other) const;
+
+    private:
+        class DataPrivate;
+        QSharedDataPointer<DataPrivate> d;
+    };
+
+    /**
+     * A list of contact groups.
+     */
+    typedef QVector<ContactGroup> List;
+
+    /**
+     * Creates an empty contact group.
+     */
+    ContactGroup();
+
+    /**
+     * Creates a contact group from an @p other group.
+     */
+    ContactGroup(const ContactGroup &other);
+
+    /**
+     * Creates a contact group with the given name.
+     */
+    ContactGroup(const QString &name);
+
+    /**
+     * Destroys the contact group.
+     */
+    ~ContactGroup();
+
+    /**
+     * Sets the unique @p id of the contact group.
+     */
+    void setId(const QString &id);
+
+    /**
+     * Returns the unique id of the contact group.
+     */
+    Q_REQUIRED_RESULT QString id() const;
+
+    /**
+     * Sets the i18n'd @p name of the contact group.
+     */
+    void setName(const QString &name);
+
+    /**
+     * Returns the i18n'd name of the contact group.
+     */
+    Q_REQUIRED_RESULT QString name() const;
+
+    /**
+     * Returns the number of contacts in this group.
+     * That includes the contact references and contact data.
+     */
+    Q_REQUIRED_RESULT int count() const;
+
+    /**
+     * Returns the number of contact references in this group.
+     */
+    Q_REQUIRED_RESULT int contactReferenceCount() const;
+
+    /**
+     * Returns the number of group references in this group.
+     */
+    Q_REQUIRED_RESULT int contactGroupReferenceCount() const;
+
+    /**
+     * Returns the number of contact data objects in this group.
+     */
+    Q_REQUIRED_RESULT int dataCount() const;
+
+    /**
+     * Returns the contact reference at the given @p index.
+     */
+    Q_REQUIRED_RESULT ContactReference &contactReference(int index);
+
+    /**
+     * Returns the contact reference at the given @p index.
+     */
+    const ContactReference &contactReference(int index) const;
+
+    /**
+     * Returns the contact group reference at the given @p index.
+     */
+    ContactGroupReference &contactGroupReference(int index);
+
+    /**
+     * Returns the contact group reference at the given @p index.
+     */
+    const ContactGroupReference &contactGroupReference(int index) const;
+
+    /**
+     * Returns the contact data object at the given @p index.
+     */
+    Data &data(int index);
+
+    /**
+     * Returns the contact data object at the given @p index.
+     */
+    const Data &data(int index) const;
+
+    /**
+     * Appends a new contact @p reference to the contact group.
+     */
+    void append(const ContactReference &reference);
+
+    /**
+     * Appends a new contact group @p reference to the contact group.
+     */
+    void append(const ContactGroupReference &reference);
+
+    /**
+     * Appends a new contact @p data object to the contact group.
+     */
+    void append(const Data &data);
+
+    /**
+     * Removes the given contact @p reference from the contact group.
+     */
+    void remove(const ContactReference &reference);
+
+    /**
+     * Removes the given contact group @p reference from the contact group.
+     */
+    void remove(const ContactGroupReference &reference);
+
+    /**
+     * Removes the given contact @p data object from the contact group.
+     */
+    void remove(const Data &data);
+
+    /**
+     * Removes all contact references from the contact group.
+     */
+    void removeAllContactReferences();
+
+    /**
+     * Removes all contact group references from the contact group.
+     */
+    void removeAllContactGroupReferences();
+
+    /**
+     * Removes all contact data from the contact group.
+     */
+    void removeAllContactData();
+
+    /**
+     * @internal
+     */
+    ContactGroup &operator=(const ContactGroup &other);
+
+    /**
+     * @internal
+     */
+    Q_REQUIRED_RESULT bool operator==(const ContactGroup &other) const;
+
+    /**
+     * Returns the MIME type used for Contact Groups
+     */
+    static QString mimeType();
+
+private:
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+}
+Q_DECLARE_TYPEINFO(KContacts::ContactGroup::ContactGroupReference, Q_MOVABLE_TYPE);
+Q_DECLARE_TYPEINFO(KContacts::ContactGroup::ContactReference, Q_MOVABLE_TYPE);
+
+#define KCONTACTS_CONTACTGROUP_METATYPE_DEFINED
+Q_DECLARE_METATYPE(KContacts::ContactGroup)
+
+#endif
diff --git a/src/contactgroup.xsd b/src/contactgroup.xsd
new file mode 100644 (file)
index 0000000..03592b0
--- /dev/null
@@ -0,0 +1,63 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+<!--
+    SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+-->
+
+  <!-- The root element of every ContactGroup document -->
+  <xsd:element name="contactGroup">
+    <xsd:complexType>
+      <!-- A list of contacts or contact references -->
+      <xsd:choice minOccurs="0" maxOccurs="unbound">
+        <xsd:element name="contactData" type="contactDataType"/>
+        <xsd:element name="contactReference" type="contactReferenceType"/>
+      </xsd:choice>
+
+      <!-- The unique identifier of this contact group -->
+      <xsd:attribute name="uid" type="xsd:string" use="required" />
+
+      <!-- The i18n'ed name of this contact group -->
+      <xsd:attribute name="name" type="xsd:string" use="required" />
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- The type for inline contacts. -->
+  <xsd:complexType name="contactDataType">
+    <xsd:sequence>
+      <!-- The i18n'ed name of this contact -->
+      <xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+
+      <!-- The plain email address (without the name) of this contact -->
+      <xsd:element name="email" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+
+      <!-- A list of custom fields for this contact -->
+      <xsd:element name="custom" minOccurs="0" maxOccurs="unbound">
+        <xsd:complexType>
+          <xsd:attribute name="key" type="xsd:string" use="required" />
+          <xsd:attribute name="value" type="xsd:string" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="contactReferenceType">
+    <xsd:sequence>
+      <!-- The uid of the contact this entry references -->
+      <xsd:element name="uid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+
+      <!-- The preferred email address which shall be used for the contact -->
+      <xsd:element name="preferredEmail" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+
+      <!-- A list of custom fields for this contact -->
+      <xsd:element name="custom" minOccurs="0" maxOccurs="unbound">
+        <xsd:complexType>
+          <xsd:attribute name="key" type="xsd:string" use="required" />
+          <xsd:attribute name="value" type="xsd:string" use="required" />
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+
+</xsd:schema>
diff --git a/src/contactgrouptool.cpp b/src/contactgrouptool.cpp
new file mode 100644 (file)
index 0000000..1b5bab0
--- /dev/null
@@ -0,0 +1,352 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org>
+    SPDX-FileCopyrightText: 2008 Kevin Krammer <kevin.krammer@gmx.at>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "contactgrouptool.h"
+#include "contactgroup.h"
+
+#include <QIODevice>
+
+#include <QXmlStreamReader>
+#include <QXmlStreamWriter>
+
+using namespace KContacts;
+
+class XmlContactGroupWriter : public QXmlStreamWriter
+{
+public:
+    XmlContactGroupWriter();
+
+    void write(const ContactGroup &group, QIODevice *device);
+    void write(const QVector<ContactGroup> &groupLis, QIODevice *device);
+
+private:
+    void writeGroup(const ContactGroup &group);
+    void writeContactReference(const ContactGroup::ContactReference &reference);
+    void writeContactGroupReference(const ContactGroup::ContactGroupReference &reference);
+    void writeData(const ContactGroup::Data &data);
+};
+
+XmlContactGroupWriter::XmlContactGroupWriter()
+{
+    setAutoFormatting(true);
+}
+
+void XmlContactGroupWriter::write(const ContactGroup &group, QIODevice *device)
+{
+    setDevice(device);
+
+    writeStartDocument();
+
+    writeGroup(group);
+
+    writeEndDocument();
+}
+
+void XmlContactGroupWriter::write(const QVector<ContactGroup> &groupList, QIODevice *device)
+{
+    setDevice(device);
+
+    writeStartDocument();
+
+    writeStartElement(QStringLiteral("contactGroupList"));
+
+    for (const ContactGroup &group : groupList) {
+        writeGroup(group);
+    }
+
+    writeEndElement();
+
+    writeEndDocument();
+}
+
+void XmlContactGroupWriter::writeGroup(const ContactGroup &group)
+{
+    writeStartElement(QStringLiteral("contactGroup"));
+    writeAttribute(QStringLiteral("uid"), group.id());
+    writeAttribute(QStringLiteral("name"), group.name());
+
+    const uint contactCount(group.contactReferenceCount());
+    for (uint i = 0; i < contactCount; ++i) {
+        writeContactReference(group.contactReference(i));
+    }
+
+    const uint contactGroupReference(group.contactGroupReferenceCount());
+    for (uint i = 0; i < contactGroupReference; ++i) {
+        writeContactGroupReference(group.contactGroupReference(i));
+    }
+
+    const uint dataCount(group.dataCount());
+    for (uint i = 0; i < dataCount; ++i) {
+        writeData(group.data(i));
+    }
+
+    writeEndElement();
+}
+
+void XmlContactGroupWriter::writeContactReference(const ContactGroup::ContactReference &reference)
+{
+    writeStartElement(QStringLiteral("contactReference"));
+    writeAttribute(QStringLiteral("uid"), reference.uid());
+    writeAttribute(QStringLiteral("gid"), reference.gid());
+    if (!reference.preferredEmail().isEmpty()) {
+        writeAttribute(QStringLiteral("preferredEmail"), reference.preferredEmail());
+    }
+
+    // TODO: customs
+
+    writeEndElement();
+}
+
+void XmlContactGroupWriter::writeContactGroupReference(const ContactGroup::ContactGroupReference &reference)
+{
+    writeStartElement(QStringLiteral("contactGroupReference"));
+    writeAttribute(QStringLiteral("uid"), reference.uid());
+
+    // TODO: customs
+
+    writeEndElement();
+}
+
+void XmlContactGroupWriter::writeData(const ContactGroup::Data &data)
+{
+    writeStartElement(QStringLiteral("contactData"));
+    writeAttribute(QStringLiteral("name"), data.name());
+    writeAttribute(QStringLiteral("email"), data.email());
+
+    // TODO: customs
+
+    writeEndElement();
+}
+
+class XmlContactGroupReader : public QXmlStreamReader
+{
+public:
+    XmlContactGroupReader();
+
+    bool read(QIODevice *device, ContactGroup &group);
+    bool read(QIODevice *device, QVector<ContactGroup> &groupList);
+
+private:
+    bool readGroup(ContactGroup &group);
+    bool readContactReference(ContactGroup::ContactReference &reference);
+    bool readContactGroupReference(ContactGroup::ContactGroupReference &reference);
+    bool readData(ContactGroup::Data &data);
+};
+
+XmlContactGroupReader::XmlContactGroupReader()
+{
+}
+
+bool XmlContactGroupReader::read(QIODevice *device, ContactGroup &group)
+{
+    setDevice(device);
+
+    while (!atEnd()) {
+        readNext();
+        if (isStartElement()) {
+            if (name() == QLatin1String("contactGroup")) {
+                return readGroup(group);
+            } else {
+                raiseError(QStringLiteral("The document does not describe a ContactGroup"));
+            }
+        }
+    }
+
+    return error() == NoError;
+}
+
+bool XmlContactGroupReader::read(QIODevice *device, QVector<ContactGroup> &groupList)
+{
+    setDevice(device);
+
+    int depth = 0;
+
+    while (!atEnd()) {
+        readNext();
+        if (isStartElement()) {
+            ++depth;
+            if (depth == 1) {
+                if (name() == QLatin1String("contactGroupList")) {
+                    continue;
+                } else {
+                    raiseError(QStringLiteral("The document does not describe a list of ContactGroup"));
+                }
+            } else if (depth == 2) {
+                if (name() == QLatin1String("contactGroup")) {
+                    ContactGroup group;
+                    if (!readGroup(group)) {
+                        return false;
+                    }
+
+                    groupList.append(group);
+                } else {
+                    raiseError(QStringLiteral("The document does not describe a list of ContactGroup"));
+                }
+            }
+        }
+
+        if (isEndElement()) {
+            --depth;
+        }
+    }
+
+    return error() == NoError;
+}
+
+bool XmlContactGroupReader::readGroup(ContactGroup &group)
+{
+    const QXmlStreamAttributes elementAttributes = attributes();
+    const auto uid = elementAttributes.value(QLatin1String("uid"));
+    if (uid.isEmpty()) {
+        raiseError(QStringLiteral("ContactGroup is missing a uid"));
+        return false;
+    }
+
+    const auto groupName = elementAttributes.value(QLatin1String("name"));
+    if (groupName.isEmpty()) {
+        raiseError(QStringLiteral("ContactGroup is missing a name"));
+        return false;
+    }
+
+    group.setId(uid.toString());
+    group.setName(groupName.toString());
+
+    while (!atEnd()) {
+        readNext();
+        if (isStartElement()) {
+            if (name() == QLatin1String("contactData")) {
+                ContactGroup::Data data;
+                if (!readData(data)) {
+                    return false;
+                }
+                group.append(data);
+            } else if (name() == QLatin1String("contactReference")) {
+                ContactGroup::ContactReference reference;
+                if (!readContactReference(reference)) {
+                    return false;
+                }
+                group.append(reference);
+            } else if (name() == QLatin1String("contactGroupReference")) {
+                ContactGroup::ContactGroupReference reference;
+                if (!readContactGroupReference(reference)) {
+                    return false;
+                }
+                group.append(reference);
+            } else {
+                raiseError(QStringLiteral("The document does not describe a ContactGroup"));
+            }
+        }
+
+        if (isEndElement()) {
+            if (name() == QLatin1String("contactGroup")) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+bool XmlContactGroupReader::readData(ContactGroup::Data &data)
+{
+    const QXmlStreamAttributes elementAttributes = attributes();
+    const auto email = elementAttributes.value(QLatin1String("email"));
+    if (email.isEmpty()) {
+        raiseError(QStringLiteral("ContactData is missing an email address"));
+        return false;
+    }
+
+    const auto name = elementAttributes.value(QLatin1String("name"));
+
+    data.setName(name.toString());
+    data.setEmail(email.toString());
+
+    return true;
+}
+
+bool XmlContactGroupReader::readContactReference(ContactGroup::ContactReference &reference)
+{
+    const QXmlStreamAttributes elementAttributes = attributes();
+    const auto uid = elementAttributes.value(QLatin1String("uid"));
+    const auto gid = elementAttributes.value(QLatin1String("gid"));
+    if (uid.isEmpty() && gid.isEmpty()) {
+        raiseError(QStringLiteral("ContactReference is missing both uid and gid"));
+        return false;
+    }
+    const auto preferredEmail = elementAttributes.value(QLatin1String("preferredEmail"));
+
+    reference.setUid(uid.toString());
+    reference.setGid(gid.toString());
+    reference.setPreferredEmail(preferredEmail.toString());
+
+    return true;
+}
+
+bool XmlContactGroupReader::readContactGroupReference(ContactGroup::ContactGroupReference &reference)
+{
+    const QXmlStreamAttributes elementAttributes = attributes();
+    const auto uid = elementAttributes.value(QLatin1String("uid"));
+    if (uid.isEmpty()) {
+        raiseError(QStringLiteral("ContactGroupReference is missing a uid"));
+        return false;
+    }
+
+    reference.setUid(uid.toString());
+
+    return true;
+}
+
+bool ContactGroupTool::convertFromXml(QIODevice *device, ContactGroup &group, QString *errorMessage)
+{
+    Q_UNUSED(errorMessage);
+
+    XmlContactGroupReader reader;
+
+    bool ok = reader.read(device, group);
+
+    if (!ok && errorMessage != nullptr) {
+        *errorMessage = reader.errorString();
+    }
+
+    return ok;
+}
+
+bool ContactGroupTool::convertToXml(const ContactGroup &group, QIODevice *device, QString *errorMessage)
+{
+    Q_UNUSED(errorMessage);
+
+    XmlContactGroupWriter writer;
+    writer.write(group, device);
+
+    return true;
+}
+
+bool ContactGroupTool::convertFromXml(QIODevice *device, QVector<ContactGroup> &groupList, QString *errorMessage)
+{
+    Q_UNUSED(errorMessage);
+
+    XmlContactGroupReader reader;
+
+    bool ok = reader.read(device, groupList);
+
+    if (!ok && errorMessage != nullptr) {
+        *errorMessage = reader.errorString();
+    }
+
+    return ok;
+}
+
+bool ContactGroupTool::convertToXml(const QVector<ContactGroup> &groupList, QIODevice *device, QString *errorMessage)
+{
+    Q_UNUSED(errorMessage);
+
+    XmlContactGroupWriter writer;
+    writer.write(groupList, device);
+
+    return true;
+}
diff --git a/src/contactgrouptool.h b/src/contactgrouptool.h
new file mode 100644 (file)
index 0000000..cf9e0ac
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2008 Tobias Koenig <tokoe@kde.org>
+    SPDX-FileCopyrightText: 2008 Kevin Krammer <kevin.krammer@gmx.at>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_CONTACTGROUPTOOL_H
+#define KCONTACTS_CONTACTGROUPTOOL_H
+
+#include "kcontacts_export.h"
+#include <QString>
+class QIODevice;
+
+template<class T>
+class QList;
+
+namespace KContacts
+{
+class ContactGroup;
+
+/**
+ * Static methods for converting ContactGroup to XML format and vice versa.
+ *
+ * @author Kevin Krammer <kevin.krammer@gmx.at>
+ * @since 4.3
+ */
+namespace ContactGroupTool
+{
+/**
+ * Converts XML data coming from a @p device into a contact @p group.
+ * If an error occurs, @c false is returned and @p errorMessage is set.
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool convertFromXml(QIODevice *device, ContactGroup &group, QString *errorMessage = nullptr);
+
+/**
+ * Converts a contact @p group into XML data and writes them to a @p device.
+ * If an error occurs, @c false is returned and @p errorMessage is set.
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool convertToXml(const ContactGroup &group, QIODevice *device, QString *errorMessage = nullptr);
+
+/**
+ * Converts XML data coming from a @p device into a @p list of contact groups.
+ * If an error occurs, @c false is returned and @p errorMessage is set.
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool convertFromXml(QIODevice *device, QVector<ContactGroup> &list, QString *errorMessage = nullptr);
+
+/**
+ * Converts a @p list of contact groups into XML data and writes them to a @p device.
+ * If an error occurs, @c false is returned and @p errorMessage is set.
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool convertToXml(const QVector<ContactGroup> &list, QIODevice *device, QString *errorMessage = nullptr);
+}
+}
+
+#endif
diff --git a/src/converter/CMakeLists.txt b/src/converter/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f32bfff
--- /dev/null
@@ -0,0 +1,22 @@
+ecm_generate_headers(KContacts_CamelCase_Converter_HEADERS
+  HEADER_NAMES
+  LDIFConverter
+  VCardConverter
+  PREFIX KContacts
+  REQUIRED_HEADERS KContacts_Converter_HEADERS
+)
+
+install(FILES
+    ${KContacts_CamelCase_Converter_HEADERS}
+    DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/KContacts
+    COMPONENT Devel
+)
+
+
+install(FILES
+    ${KContacts_Converter_HEADERS}
+    DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/kcontacts
+    COMPONENT Devel
+)
+
+
diff --git a/src/converter/ldifconverter.cpp b/src/converter/ldifconverter.cpp
new file mode 100644 (file)
index 0000000..5de151e
--- /dev/null
@@ -0,0 +1,660 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Helge Deller <deller@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+/*
+    Useful links:
+        - http://tldp.org/HOWTO/LDAP-Implementation-HOWTO/schemas.html
+        - http://www.faqs.org/rfcs/rfc2849.html
+
+    Not yet handled items:
+        - objectclass microsoftaddressbook
+                - info,
+                - initials,
+                - otherfacsimiletelephonenumber,
+                - otherpager,
+                - physicaldeliveryofficename,
+*/
+
+#include "ldifconverter.h"
+#include "address.h"
+#include "kcontacts_debug.h"
+#include "vcardconverter.h"
+
+#include "ldif_p.h"
+
+#include <KCountry>
+#include <KLocalizedString>
+
+#include <QIODevice>
+#include <QStringList>
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+#include <QTextCodec>
+#endif
+#include <QTextStream>
+
+using namespace KContacts;
+
+/* internal functions - do not use !! */
+
+namespace KContacts
+{
+/**
+  @internal
+
+  Evaluates @p fieldname and sets the @p value at the addressee or the address
+  objects when appropriate.
+
+  @param a The addressee to store information into
+  @param homeAddr The home address to store respective information into
+  @param workAddr The work address to store respective information into
+  @param fieldname LDIF field name to evaluate
+  @param value The value of the field addressed by @p fieldname
+*/
+void evaluatePair(Addressee &a,
+                  Address &homeAddr,
+                  Address &workAddr,
+                  QString &fieldname,
+                  QString &value,
+                  int &birthday,
+                  int &birthmonth,
+                  int &birthyear,
+                  ContactGroup &contactGroup);
+}
+
+/* generate LDIF stream */
+
+static void ldif_out(QTextStream &t, const QString &formatStr, const QString &value)
+{
+    if (value.isEmpty()) {
+        return;
+    }
+
+    const QByteArray txt = Ldif::assembleLine(formatStr, value, 72);
+
+    // write the string
+    t << QString::fromUtf8(txt) << "\n";
+}
+
+bool LDIFConverter::addresseeAndContactGroupToLDIF(const AddresseeList &addrList, const ContactGroup::List &contactGroupList, QString &str)
+{
+    bool result = addresseeToLDIF(addrList, str);
+    if (!contactGroupList.isEmpty()) {
+        result = (contactGroupToLDIF(contactGroupList, str) || result); // order matters
+    }
+    return result;
+}
+
+bool LDIFConverter::contactGroupToLDIF(const ContactGroup &contactGroup, QString &str)
+{
+    if (contactGroup.dataCount() <= 0) {
+        return false;
+    }
+    QTextStream t(&str, QIODevice::WriteOnly | QIODevice::Append);
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+    t.setCodec(QTextCodec::codecForName("UTF-8"));
+#endif
+
+    t << "objectclass: top\n";
+    t << "objectclass: groupOfNames\n";
+
+    for (int i = 0; i < contactGroup.dataCount(); ++i) {
+        const ContactGroup::Data &data = contactGroup.data(i);
+        const QString value = QStringLiteral("cn=%1,mail=%2").arg(data.name(), data.email());
+        ldif_out(t, QStringLiteral("member"), value);
+    }
+
+    t << "\n";
+    return true;
+}
+
+bool LDIFConverter::contactGroupToLDIF(const ContactGroup::List &contactGroupList, QString &str)
+{
+    if (contactGroupList.isEmpty()) {
+        return false;
+    }
+
+    bool result = true;
+    for (const ContactGroup &group : contactGroupList) {
+        result = (contactGroupToLDIF(group, str) || result); // order matters
+    }
+    return result;
+}
+
+bool LDIFConverter::addresseeToLDIF(const AddresseeList &addrList, QString &str)
+{
+    if (addrList.isEmpty()) {
+        return false;
+    }
+
+    bool result = true;
+    for (const Addressee &addr : addrList) {
+        result = (addresseeToLDIF(addr, str) || result); // order matters
+    }
+    return result;
+}
+
+static QString countryName(const QString &isoCodeOrName)
+{
+    const auto c = KCountry::fromAlpha2(isoCodeOrName);
+    return c.isValid() ? c.name() : isoCodeOrName;
+}
+
+bool LDIFConverter::addresseeToLDIF(const Addressee &addr, QString &str)
+{
+    if (addr.isEmpty()) {
+        return false;
+    }
+
+    QTextStream t(&str, QIODevice::WriteOnly | QIODevice::Append);
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+    t.setCodec(QTextCodec::codecForName("UTF-8"));
+#endif
+
+    const Address homeAddr = addr.address(Address::Home);
+    const Address workAddr = addr.address(Address::Work);
+
+    ldif_out(t, QStringLiteral("dn"), QStringLiteral("cn=%1,mail=%2").arg(addr.formattedName().simplified(), addr.preferredEmail()));
+    t << "objectclass: top\n";
+    t << "objectclass: person\n";
+    t << "objectclass: organizationalPerson\n";
+
+    ldif_out(t, QStringLiteral("givenname"), addr.givenName());
+    ldif_out(t, QStringLiteral("sn"), addr.familyName());
+    ldif_out(t, QStringLiteral("cn"), addr.formattedName().simplified());
+    ldif_out(t, QStringLiteral("uid"), addr.uid());
+    ldif_out(t, QStringLiteral("nickname"), addr.nickName());
+    ldif_out(t, QStringLiteral("xmozillanickname"), addr.nickName());
+    ldif_out(t, QStringLiteral("mozillanickname"), addr.nickName());
+
+    ldif_out(t, QStringLiteral("mail"), addr.preferredEmail());
+    const QStringList emails = addr.emails();
+    const int numEmails = emails.count();
+    for (int i = 1; i < numEmails; ++i) {
+        if (i == 0) {
+            // nothing
+        } else if (i == 1) {
+            ldif_out(t, QStringLiteral("mozillasecondemail"), emails[1]);
+        } else {
+            ldif_out(t, QStringLiteral("othermailbox"), emails[i]);
+        }
+    }
+    // ldif_out( t, "mozilla_AIMScreenName: %1\n", "screen_name" );
+
+    ldif_out(t, QStringLiteral("telephonenumber"), addr.phoneNumber(PhoneNumber::Work).number());
+    ldif_out(t, QStringLiteral("facsimiletelephonenumber"), addr.phoneNumber(PhoneNumber::Fax).number());
+    ldif_out(t, QStringLiteral("homephone"), addr.phoneNumber(PhoneNumber::Home).number());
+    ldif_out(t, QStringLiteral("mobile"),
+             addr.phoneNumber(PhoneNumber::Cell).number()); // Netscape 7
+    ldif_out(t, QStringLiteral("cellphone"),
+             addr.phoneNumber(PhoneNumber::Cell).number()); // Netscape 4.x
+    ldif_out(t, QStringLiteral("pager"), addr.phoneNumber(PhoneNumber::Pager).number());
+    ldif_out(t, QStringLiteral("pagerphone"), addr.phoneNumber(PhoneNumber::Pager).number());
+
+    ldif_out(t, QStringLiteral("streethomeaddress"), homeAddr.street());
+    ldif_out(t, QStringLiteral("postalcode"), workAddr.postalCode());
+    ldif_out(t, QStringLiteral("postofficebox"), workAddr.postOfficeBox());
+
+    QStringList streets = homeAddr.street().split(QLatin1Char('\n'));
+    const int numberOfStreets(streets.count());
+    if (numberOfStreets > 0) {
+        ldif_out(t, QStringLiteral("homepostaladdress"), streets.at(0)); // Netscape 7
+    }
+    if (numberOfStreets > 1) {
+        ldif_out(t, QStringLiteral("mozillahomepostaladdress2"), streets.at(1)); // Netscape 7
+    }
+    ldif_out(t, QStringLiteral("mozillahomelocalityname"), homeAddr.locality()); // Netscape 7
+    ldif_out(t, QStringLiteral("mozillahomestate"), homeAddr.region());
+    ldif_out(t, QStringLiteral("mozillahomepostalcode"), homeAddr.postalCode());
+    ldif_out(t, QStringLiteral("mozillahomecountryname"), countryName(homeAddr.country()));
+    ldif_out(t, QStringLiteral("locality"), workAddr.locality());
+    ldif_out(t, QStringLiteral("streetaddress"), workAddr.street()); // Netscape 4.x
+
+    streets = workAddr.street().split(QLatin1Char('\n'));
+    const int streetsCount = streets.count();
+    if (streetsCount > 0) {
+        ldif_out(t, QStringLiteral("street"), streets.at(0));
+    }
+    if (streetsCount > 1) {
+        ldif_out(t, QStringLiteral("mozillaworkstreet2"), streets.at(1));
+    }
+    ldif_out(t, QStringLiteral("countryname"), countryName(workAddr.country()));
+    ldif_out(t, QStringLiteral("l"), workAddr.locality());
+    ldif_out(t, QStringLiteral("c"), countryName(workAddr.country()));
+    ldif_out(t, QStringLiteral("st"), workAddr.region());
+
+    ldif_out(t, QStringLiteral("title"), addr.title());
+    ldif_out(t, QStringLiteral("vocation"), addr.prefix());
+    ldif_out(t, QStringLiteral("ou"), addr.role());
+    ldif_out(t, QStringLiteral("o"), addr.organization());
+    ldif_out(t, QStringLiteral("organization"), addr.organization());
+    ldif_out(t, QStringLiteral("organizationname"), addr.organization());
+
+    // Compatibility with older kabc versions.
+    if (!addr.department().isEmpty()) {
+        ldif_out(t, QStringLiteral("department"), addr.department());
+    } else {
+        ldif_out(t, QStringLiteral("department"), addr.custom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-Department")));
+    }
+
+    ldif_out(t, QStringLiteral("workurl"), addr.url().url().toDisplayString());
+    ldif_out(t, QStringLiteral("homeurl"), addr.url().url().toDisplayString());
+    ldif_out(t, QStringLiteral("mozillahomeurl"), addr.url().url().toDisplayString());
+
+    ldif_out(t, QStringLiteral("description"), addr.note());
+    if (addr.revision().isValid()) {
+        ldif_out(t, QStringLiteral("modifytimestamp"), dateToVCardString(addr.revision()));
+    }
+
+    const QDate birthday = addr.birthday().date();
+    if (birthday.isValid()) {
+        const int year = birthday.year();
+        if (year > 0) {
+            ldif_out(t, QStringLiteral("birthyear"), QString::number(year));
+        }
+        ldif_out(t, QStringLiteral("birthmonth"), QString::number(birthday.month()));
+        ldif_out(t, QStringLiteral("birthday"), QString::number(birthday.day()));
+    }
+
+    t << "\n";
+
+    return true;
+}
+
+/* convert from LDIF stream */
+bool LDIFConverter::LDIFToAddressee(const QString &str, AddresseeList &addrList, ContactGroup::List &contactGroupList, const QDateTime &dt)
+{
+    if (str.isEmpty()) {
+        return true;
+    }
+
+    bool endldif = false;
+    bool end = false;
+    Ldif ldif;
+    Ldif::ParseValue ret;
+    Addressee a;
+    Address homeAddr;
+    Address workAddr;
+    int birthday = -1;
+    int birthmonth = -1;
+    int birthyear = -1;
+    ContactGroup contactGroup;
+    ldif.setLdif(str.toLatin1());
+    QDateTime qdt = dt;
+    if (!qdt.isValid()) {
+        qdt = QDateTime::currentDateTime();
+    }
+    a.setRevision(qdt);
+    homeAddr = Address(Address::Home);
+    workAddr = Address(Address::Work);
+
+    do {
+        ret = ldif.nextItem();
+        switch (ret) {
+        case Ldif::Item: {
+            QString fieldname = ldif.attr().toLower();
+            QString value = QString::fromUtf8(ldif.value());
+            evaluatePair(a, homeAddr, workAddr, fieldname, value, birthday, birthmonth, birthyear, contactGroup);
+            break;
+        }
+        case Ldif::EndEntry:
+            if (contactGroup.count() == 0) {
+                // if the new address is not empty, append it
+                QDate birthDate(birthyear, birthmonth, birthday);
+                if (birthDate.isValid()) {
+                    a.setBirthday(birthDate);
+                }
+
+                if (!a.formattedName().isEmpty() || !a.name().isEmpty() || !a.familyName().isEmpty()) {
+                    if (!homeAddr.isEmpty()) {
+                        a.insertAddress(homeAddr);
+                    }
+                    if (!workAddr.isEmpty()) {
+                        a.insertAddress(workAddr);
+                    }
+                    addrList.append(a);
+                }
+            } else {
+                contactGroupList.append(contactGroup);
+            }
+            a = Addressee();
+            contactGroup = ContactGroup();
+            a.setRevision(qdt);
+            homeAddr = Address(Address::Home);
+            workAddr = Address(Address::Work);
+            break;
+        case Ldif::MoreData:
+            if (endldif) {
+                end = true;
+            } else {
+                ldif.endLdif();
+                endldif = true;
+                break;
+            }
+        default:
+            break;
+        }
+    } while (!end);
+
+    return true;
+}
+
+void KContacts::evaluatePair(Addressee &a,
+                             Address &homeAddr,
+                             Address &workAddr,
+                             QString &fieldname,
+                             QString &value,
+                             int &birthday,
+                             int &birthmonth,
+                             int &birthyear,
+                             ContactGroup &contactGroup)
+{
+    if (fieldname == QLatin1String("dn")) { // ignore
+        return;
+    }
+
+    if (fieldname.startsWith(QLatin1Char('#'))) {
+        return;
+    }
+
+    if (fieldname.isEmpty() && !a.note().isEmpty()) {
+        // some LDIF export filters are broken and add additional
+        // comments on stand-alone lines. Just add them to the notes for now.
+        a.setNote(a.note() + QLatin1Char('\n') + value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("givenname")) {
+        a.setGivenName(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("xmozillanickname") //
+        || fieldname == QLatin1String("nickname") //
+        || fieldname == QLatin1String("mozillanickname")) {
+        a.setNickName(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("sn")) {
+        a.setFamilyName(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("uid")) {
+        a.setUid(value);
+        return;
+    }
+    if (fieldname == QLatin1String("mail") //
+        || fieldname == QLatin1String("mozillasecondemail") /* mozilla */
+        || fieldname == QLatin1String("othermailbox") /*TheBat!*/) {
+        if (a.emails().indexOf(value) == -1) {
+            a.addEmail(value);
+        }
+        return;
+    }
+
+    if (fieldname == QLatin1String("title")) {
+        a.setTitle(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("vocation")) {
+        a.setPrefix(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("cn")) {
+        a.setFormattedName(value);
+        return;
+    }
+
+    if (fieldname == QLatin1Char('o') || fieldname == QLatin1String("organization") // Exchange
+        || fieldname == QLatin1String("organizationname")) { // Exchange
+        a.setOrganization(value);
+        return;
+    }
+
+    // clang-format off
+    if (fieldname == QLatin1String("description")
+        || fieldname == QLatin1String("mozillacustom1")
+        || fieldname == QLatin1String("mozillacustom2")
+        || fieldname == QLatin1String("mozillacustom3")
+        || fieldname == QLatin1String("mozillacustom4")
+        || fieldname == QLatin1String("custom1")
+        || fieldname == QLatin1String("custom2")
+        || fieldname == QLatin1String("custom3")
+        || fieldname == QLatin1String("custom4")) {
+        if (!a.note().isEmpty()) {
+            a.setNote(a.note() + QLatin1Char('\n'));
+        }
+        a.setNote(a.note() + value);
+        return;
+    }
+    // clang-format on
+
+    if (fieldname == QLatin1String("homeurl") //
+        || fieldname == QLatin1String("workurl") //
+        || fieldname == QLatin1String("mozillahomeurl")) {
+        if (a.url().url().isEmpty()) {
+            ResourceLocatorUrl url;
+            url.setUrl(QUrl(value));
+            a.setUrl(url);
+            return;
+        }
+        if (a.url().url().toDisplayString() == QUrl(value).toDisplayString()) {
+            return;
+        }
+        // TODO: current version of kabc only supports one URL.
+        // TODO: change this with KDE 4
+    }
+
+    if (fieldname == QLatin1String("homephone")) {
+        a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Home));
+        return;
+    }
+
+    if (fieldname == QLatin1String("telephonenumber")) {
+        a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Work));
+        return;
+    }
+    if (fieldname == QLatin1String("mobile") /* mozilla/Netscape 7 */
+        || fieldname == QLatin1String("cellphone")) {
+        a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Cell));
+        return;
+    }
+
+    if (fieldname == QLatin1String("pager") // mozilla
+        || fieldname == QLatin1String("pagerphone")) { // mozilla
+        a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Pager));
+        return;
+    }
+
+    if (fieldname == QLatin1String("facsimiletelephonenumber")) {
+        a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Fax));
+        return;
+    }
+
+    if (fieldname == QLatin1String("xmozillaanyphone")) { // mozilla
+        a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Work));
+        return;
+    }
+
+    if (fieldname == QLatin1String("streethomeaddress") //
+        || fieldname == QLatin1String("mozillahomestreet")) { // thunderbird
+        homeAddr.setStreet(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("street") //
+        || fieldname == QLatin1String("postaladdress")) { // mozilla
+        workAddr.setStreet(value);
+        return;
+    }
+    if (fieldname == QLatin1String("mozillapostaladdress2") //
+        || fieldname == QLatin1String("mozillaworkstreet2")) { // mozilla
+        workAddr.setStreet(workAddr.street() + QLatin1Char('\n') + value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("postalcode")) {
+        workAddr.setPostalCode(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("postofficebox")) {
+        workAddr.setPostOfficeBox(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("homepostaladdress")) { // Netscape 7
+        homeAddr.setStreet(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("mozillahomepostaladdress2")) { // mozilla
+        homeAddr.setStreet(homeAddr.street() + QLatin1Char('\n') + value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("mozillahomelocalityname")) { // mozilla
+        homeAddr.setLocality(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("mozillahomestate")) { // mozilla
+        homeAddr.setRegion(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("mozillahomepostalcode")) { // mozilla
+        homeAddr.setPostalCode(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("mozillahomecountryname")) { // mozilla
+        if (value.length() <= 2) {
+            value = countryName(value);
+        }
+        homeAddr.setCountry(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("locality")) {
+        workAddr.setLocality(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("streetaddress")) { // Netscape 4.x
+        workAddr.setStreet(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("countryname") //
+        || fieldname == QLatin1Char('c')) { // mozilla
+        if (value.length() <= 2) {
+            value = countryName(value);
+        }
+        workAddr.setCountry(value);
+        return;
+    }
+
+    if (fieldname == QLatin1Char('l')) { // mozilla
+        workAddr.setLocality(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("st")) {
+        workAddr.setRegion(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("ou")) {
+        a.setRole(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("department")) {
+        a.setDepartment(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("member")) {
+        // this is a mozilla list member (cn=xxx, mail=yyy)
+        const QStringList list = value.split(QLatin1Char(','));
+        QString name;
+        QString email;
+
+        const QLatin1String cnTag("cn=");
+        const QLatin1String mailTag("mail=");
+        for (const auto &str : list) {
+            if (str.startsWith(cnTag)) {
+                name = QStringView(str).mid(cnTag.size()).trimmed().toString();
+            } else if (str.startsWith(mailTag)) {
+                email = QStringView(str).mid(mailTag.size()).trimmed().toString();
+            }
+        }
+
+        if (!name.isEmpty() && !email.isEmpty()) {
+            email = QLatin1String(" <") + email + QLatin1Char('>');
+        }
+        ContactGroup::Data data;
+        data.setEmail(email);
+        data.setName(name);
+        contactGroup.append(data);
+        return;
+    }
+
+    if (fieldname == QLatin1String("modifytimestamp")) {
+        if (value == QLatin1String("0Z")) { // ignore
+            return;
+        }
+        QDateTime dt = VCardStringToDate(value);
+        if (dt.isValid()) {
+            a.setRevision(dt);
+            return;
+        }
+    }
+
+    if (fieldname == QLatin1String("display-name")) {
+        contactGroup.setName(value);
+        return;
+    }
+
+    if (fieldname == QLatin1String("objectclass")) { // ignore
+        return;
+    }
+
+    if (fieldname == QLatin1String("birthyear")) {
+        bool ok;
+        birthyear = value.toInt(&ok);
+        if (!ok) {
+            birthyear = -1;
+        }
+        return;
+    }
+    if (fieldname == QLatin1String("birthmonth")) {
+        birthmonth = value.toInt();
+        return;
+    }
+    if (fieldname == QLatin1String("birthday")) {
+        birthday = value.toInt();
+        return;
+    }
+    if (fieldname == QLatin1String("xbatbirthday")) {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+        const QStringView str{value};
+#else
+        const QStringRef str{&value};
+#endif
+        QDate dt(str.mid(0, 4).toInt(), str.mid(4, 2).toInt(), str.mid(6, 2).toInt());
+        if (dt.isValid()) {
+            a.setBirthday(dt);
+        }
+        return;
+    }
+    qCWarning(KCONTACTS_LOG) << QStringLiteral("LDIFConverter: Unknown field for '%1': '%2=%3'\n").arg(a.formattedName(), fieldname, value);
+}
diff --git a/src/converter/ldifconverter.h b/src/converter/ldifconverter.h
new file mode 100644 (file)
index 0000000..5752c5f
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Helge Deller <deller@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_LDIFCONVERTER_H
+#define KCONTACTS_LDIFCONVERTER_H
+
+#include "addressee.h"
+#include "contactgroup.h"
+
+#include <QDateTime>
+#include <QString>
+
+namespace KContacts
+{
+/**
+  A set of functions to convert a string with LDIF information to addressees
+  and vice versa. It is useful for addressbook import- and exportfilters
+  and might be used to read and write Mozilla and Netscape addresssbooks.
+*/
+
+namespace LDIFConverter
+{
+/**
+  Converts a LDIF string to a list of addressees.
+
+  @param str         The vcard string.
+  @param addrList    The addresseelist.
+  @param contactGroupList the contactGroupList
+  @param dt          The date & time value of the last modification (e.g. file modification time).
+*/
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool LDIFToAddressee(const QString &str,
+                                                        AddresseeList &addrList,
+                                                        QVector<KContacts::ContactGroup> &contactGroupList,
+                                                        const QDateTime &dt = QDateTime::currentDateTime());
+
+/**
+  Converts a list of addressees to a LDIF string.
+
+  @param addrList    The addresseelist.
+  @param str         The LDIF string.
+*/
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool addresseeToLDIF(const AddresseeList &addrList, QString &str);
+
+/**
+  Converts a list of addressees and contactgrouplist to a LDIF string.
+
+  @param addrList    The addresseelist.
+  @param contactGroupList The contact group list
+  @param str         The LDIF string.
+
+*/
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool
+addresseeAndContactGroupToLDIF(const AddresseeList &addrList, const QVector<KContacts::ContactGroup> &contactGroupList, QString &str);
+/**
+  Converts an addressee to a LDIF string.
+
+  @param addr    The addressee.
+  @param str     The LDIF string.
+*/
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool addresseeToLDIF(const Addressee &addr, QString &str);
+
+/**
+  Converts a list of contact group to a LDIF string.
+
+  @param contactGroupList    The contact group list
+  @param str         The LDIF string.
+*/
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool contactGroupToLDIF(const ContactGroup::List &contactGroupList, QString &str);
+
+/**
+  Converts a contact group to a LDIF string.
+
+  @param contactGroup    The contact group
+  @param str         The LDIF string.
+*/
+Q_REQUIRED_RESULT KCONTACTS_EXPORT bool contactGroupToLDIF(const ContactGroup &contactGroup, QString &str);
+}
+}
+#endif
diff --git a/src/converter/vcardconverter.cpp b/src/converter/vcardconverter.cpp
new file mode 100644 (file)
index 0000000..121b1b1
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "vcardconverter.h"
+#include "vcardtool_p.h"
+
+using namespace KContacts;
+
+VCardConverter::VCardConverter()
+    : d(nullptr)
+{
+}
+
+VCardConverter::~VCardConverter()
+{
+}
+
+QByteArray VCardConverter::exportVCard(const Addressee &addr, Version version) const
+{
+    Addressee::List list;
+    list.append(addr);
+
+    return exportVCards(list, version);
+}
+
+QByteArray VCardConverter::exportVCards(const Addressee::List &list, Version version) const
+{
+    VCardTool tool;
+    QByteArray returnValue;
+    switch (version) {
+    case v2_1:
+        returnValue = tool.exportVCards(list, VCard::v2_1);
+        break;
+    case v3_0:
+        returnValue = tool.exportVCards(list, VCard::v3_0);
+        break;
+    case v4_0:
+        returnValue = tool.exportVCards(list, VCard::v4_0);
+        break;
+    }
+
+    return returnValue;
+}
+
+QByteArray VCardConverter::createVCard(const Addressee &addr, Version version) const
+{
+    Addressee::List list;
+    list.append(addr);
+
+    return createVCards(list, version);
+}
+
+QByteArray VCardConverter::createVCards(const Addressee::List &list, Version version) const
+{
+    VCardTool tool;
+    QByteArray returnValue;
+    switch (version) {
+    case v2_1:
+        returnValue = tool.createVCards(list, VCard::v2_1);
+        break;
+    case v3_0:
+        returnValue = tool.createVCards(list, VCard::v3_0);
+        break;
+    case v4_0:
+        returnValue = tool.createVCards(list, VCard::v4_0);
+        break;
+    }
+
+    return returnValue;
+}
+
+Addressee VCardConverter::parseVCard(const QByteArray &vcard) const
+{
+    Addressee::List list = parseVCards(vcard);
+
+    return list.isEmpty() ? Addressee() : list[0];
+}
+
+Addressee::List VCardConverter::parseVCards(const QByteArray &vcard) const
+{
+    VCardTool tool;
+
+    return tool.parseVCards(vcard);
+}
+
+/* Helper functions */
+
+QString KContacts::dateToVCardString(const QDateTime &dateTime)
+{
+    return dateTime.toString(QStringLiteral("yyyyMMddThhmmssZ"));
+}
+
+QString KContacts::dateToVCardString(QDate date)
+{
+    return date.toString(QStringLiteral("yyyyMMdd"));
+}
+
+QDateTime KContacts::VCardStringToDate(const QString &dateString)
+{
+    QDate date;
+    QTime time;
+    QString d(dateString);
+
+    d = d.remove(QLatin1Char('-')).remove(QLatin1Char(':'));
+
+    if (d.length() >= 8) {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+        const QStringView strView(d);
+        date = QDate(strView.mid(0, 4).toUInt(), strView.mid(4, 2).toUInt(), strView.mid(6, 2).toUInt());
+#else
+        date = QDate(d.midRef(0, 4).toUInt(), d.midRef(4, 2).toUInt(), d.midRef(6, 2).toUInt());
+#endif
+    }
+
+    if (d.length() > 9 && d[8].toUpper() == QLatin1Char('T')) {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+        const QStringView strView(d);
+        time = QTime(strView.mid(9, 2).toUInt(), strView.mid(11, 2).toUInt(), strView.mid(13, 2).toUInt());
+#else
+        time = QTime(d.midRef(9, 2).toUInt(), d.midRef(11, 2).toUInt(), d.midRef(13, 2).toUInt());
+#endif
+    }
+
+    return QDateTime(date, time);
+}
+
+void KContacts::adaptIMAttributes(QByteArray &data)
+{
+    data.replace("X-messaging/aim-All", ("X-AIM"));
+    data.replace("X-messaging/icq-All", ("X-ICQ"));
+    data.replace("X-messaging/xmpp-All", ("X-JABBER"));
+    data.replace("X-messaging/msn-All", ("X-MSN"));
+    data.replace("X-messaging/yahoo-All", ("X-YAHOO"));
+    data.replace("X-messaging/gadu-All", ("X-GADUGADU"));
+    data.replace("X-messaging/skype-All", ("X-SKYPE"));
+    data.replace("X-messaging/groupwise-All", ("X-GROUPWISE"));
+    data.replace("X-messaging/sms-All", ("X-SMS"));
+    data.replace("X-messaging/meanwhile-All", ("X-MEANWHILE"));
+    data.replace("X-messaging/irc-All", ("X-IRC"));
+    data.replace("X-messaging/googletalk-All", ("X-GTALK"));
+}
diff --git a/src/converter/vcardconverter.h b/src/converter/vcardconverter.h
new file mode 100644 (file)
index 0000000..8fffe05
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_VCARDCONVERTER_H
+#define KCONTACTS_VCARDCONVERTER_H
+
+#include "kcontacts/addressee.h"
+#include "kcontacts_export.h"
+#include <QString>
+
+namespace KContacts
+{
+/**
+  @short Class to converting contact objects into vCard format and vice versa.
+
+  This class implements reading and writing of contact using from/to the
+  vCard format. Currently vCard version 2.1 and 3.0 is supported.
+
+  Example:
+
+  \code
+
+  QFile file( "myfile.vcf" );
+  file.open( QIODevice::ReadOnly );
+
+  QByteArray data = file.readAll();
+
+  VCardConverter converter;
+  Addressee::List list = converter.parseVCards( data );
+
+  // print formatted name of first contact
+  qDebug( "name=%s", list[ 0 ].formattedName().toLatin1() );
+
+  \endcode
+*/
+class KCONTACTS_EXPORT VCardConverter
+{
+public:
+    /**
+      @li v2_1 - VCard format version 2.1
+      @li v3_0 - VCard format version 3.0
+      @li v4_0 - VCard format version 4.0
+     */
+    enum Version {
+        v2_1,
+        v3_0,
+        v4_0,
+    };
+
+    /**
+      Constructor.
+     */
+    VCardConverter();
+
+    /**
+      Destructor.
+     */
+    ~VCardConverter();
+
+    /**
+      Creates a string in vCard format which contains the given
+      contact.
+
+      @param addr The contact object
+      @param version The version of the generated vCard format
+     */
+    Q_REQUIRED_RESULT QByteArray createVCard(const Addressee &addr, Version version = v3_0) const;
+
+    /**
+      Creates a string in vCard format which contains the given
+      list of contact.
+
+      @param list The list of contact objects
+      @param version The version of the generated vCard format
+     */
+    // FIXME: Add error handling
+    Q_REQUIRED_RESULT QByteArray createVCards(const Addressee::List &list, Version version = v3_0) const;
+
+    /**
+     * @since 4.9.1
+     */
+    Q_REQUIRED_RESULT QByteArray exportVCard(const Addressee &addr, Version version) const;
+
+    /**
+     * @since 4.9.1
+     */
+    Q_REQUIRED_RESULT QByteArray exportVCards(const Addressee::List &list, Version version) const;
+
+    /**
+      Parses a string in vCard format and returns the first contact.
+     */
+    Q_REQUIRED_RESULT Addressee parseVCard(const QByteArray &vcard) const;
+
+    /**
+      Parses a string in vCard format and returns a list of contact objects.
+     */
+    // FIXME: Add error handling
+    Q_REQUIRED_RESULT Addressee::List parseVCards(const QByteArray &vcard) const;
+
+private:
+    Q_DISABLE_COPY(VCardConverter)
+    class VCardConverterPrivate;
+    VCardConverterPrivate *const d;
+};
+
+/**
+    Helper functions
+  */
+
+/**
+ * Converts a QDateTime to a date string as it is used in VCard and LDIF files.
+ * The return value is in the form "yyyyMMddThhmmssZ" (e.g. "20031201T120000Z")
+ * @param dateTime date and time to be converted
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT QString dateToVCardString(const QDateTime &dateTime);
+
+/**
+ * Converts a QDate to a short date string as it is used in VCard and LDIF files.
+ * The return value is in the form "yyyyMMdd" (e.g. "20031201")
+ * @param date date to be converted
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT QString dateToVCardString(QDate date);
+
+/**
+ * Converts a date string as it is used in VCard and LDIF files to a QDateTime value.
+ * If the date string does not contain a time value, it will be returned as 00:00:00.
+ * (e.g. "20031201T120000" will return a QDateTime for 2003-12-01 at 12:00)
+ * @param dateString string representing the date and time.
+ */
+Q_REQUIRED_RESULT KCONTACTS_EXPORT QDateTime VCardStringToDate(const QString &dateString);
+
+/**
+ * @brief adaptIMAttributes. Convert KAddressBook attribute to VCard IM Attribute
+ * @param data
+ */
+KCONTACTS_EXPORT void adaptIMAttributes(QByteArray &data);
+}
+#endif
diff --git a/src/email.cpp b/src/email.cpp
new file mode 100644 (file)
index 0000000..f61f772
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "email.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Email::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        mail = other.mail;
+    }
+
+    ParameterMap mParamMap;
+
+    QString mail;
+};
+
+Email::Email()
+    : d(new Private)
+{
+}
+
+Email::Email(const QString &mail)
+    : d(new Private)
+{
+    d->mail = mail;
+}
+
+Email::Email(const Email &other)
+    : d(other.d)
+{
+}
+
+Email::~Email()
+{
+}
+
+bool Email::operator==(const Email &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->mail == other.mail());
+}
+
+bool Email::operator!=(const Email &other) const
+{
+    return !(other == *this);
+}
+
+Email &Email::operator=(const Email &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Email::toString() const
+{
+    QString str = QLatin1String("Email {\n");
+    str += QStringLiteral("    mail: %1\n").arg(d->mail);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Email::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Email::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Email::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Email::params() const
+{
+    return d->mParamMap;
+}
+
+void Email::setEmail(const QString &mail)
+{
+    d->mail = mail;
+}
+
+QString Email::mail() const
+{
+    return d->mail;
+}
+
+bool Email::isValid() const
+{
+    return !d->mail.isEmpty();
+}
+
+struct email_type_name {
+    const char *name;
+    Email::Type type;
+};
+
+static const email_type_name email_type_names[] = {
+    {"HOME", Email::Home},
+    {"WORK", Email::Work},
+    {"OTHER", Email::Other},
+};
+
+Email::Type KContacts::Email::type() const
+{
+    const auto it = d->mParamMap.findParam(QLatin1String("type"));
+    if (it == d->mParamMap.end()) {
+        return Unknown;
+    }
+
+    Type type = Unknown;
+    for (const auto &s : it->paramValues) {
+        const auto it = std::find_if(std::begin(email_type_names), std::end(email_type_names), [&s](const email_type_name &t) {
+            return QLatin1String(t.name) == s;
+        });
+        if (it != std::end(email_type_names)) {
+            type |= (*it).type;
+        }
+    }
+    return type;
+}
+
+void Email::setType(Type type)
+{
+    const auto oldType = this->type();
+
+    const QString paramName(QStringLiteral("type"));
+
+    ParameterMap::iterator theIt;
+
+    auto it = d->mParamMap.findParam(paramName);
+    if (it != d->mParamMap.end()) {
+        theIt = it;
+    } else {
+        theIt = d->mParamMap.insertParam({paramName, {}});
+    }
+
+    for (const auto &t : email_type_names) {
+        if (((type ^ oldType) & t.type) == 0) {
+            continue; // no change
+        }
+
+        if (type & t.type) {
+            theIt->paramValues.push_back(QLatin1String(t.name));
+        } else {
+            theIt->paramValues.removeAll(QLatin1String(t.name));
+        }
+    }
+}
+
+bool Email::isPreferred() const
+{
+    auto it = d->mParamMap.findParam(QLatin1String("pref"));
+    if (it != d->mParamMap.end()) {
+        return !it->paramValues.isEmpty() && it->paramValues.at(0) == QLatin1Char('1');
+    }
+
+    it = d->mParamMap.findParam(QLatin1String("type"));
+    if (it != d->mParamMap.end()) {
+        return it->paramValues.contains(QLatin1String("PREF"), Qt::CaseInsensitive);
+    }
+
+    return false;
+}
+
+void Email::setPreferred(bool preferred)
+{
+    if (preferred == isPreferred()) {
+        return;
+    }
+
+    const QString paramName(QStringLiteral("type"));
+
+    auto typeIt = d->mParamMap.findParam(paramName);
+    QStringList types = typeIt != d->mParamMap.end() ? typeIt->paramValues : QStringList{};
+
+    if (!preferred) {
+        auto prefIt = d->mParamMap.findParam(QLatin1String("pref"));
+        if (prefIt != d->mParamMap.end()) {
+            d->mParamMap.erase(prefIt);
+        }
+
+        types.removeAll(QLatin1String("PREF"));
+    } else {
+        types.push_back(QStringLiteral("PREF"));
+    }
+
+    typeIt = d->mParamMap.findParam(paramName);
+    if (typeIt != d->mParamMap.end()) {
+        typeIt->paramValues = types;
+    } else {
+        d->mParamMap.insertParam({paramName, types});
+    }
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Email &email)
+{
+    return s << email.d->mParamMap << email.d->mail;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Email &email)
+{
+    s >> email.d->mParamMap >> email.d->mail;
+    return s;
+}
diff --git a/src/email.h b/src/email.h
new file mode 100644 (file)
index 0000000..bddb570
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef EMAIL_H
+#define EMAIL_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QString>
+
+class EmailTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Email for a contact.
+ *  @since 4.14.5
+ */
+class KCONTACTS_EXPORT Email
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Email &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Email &);
+    friend class VCardTool;
+    friend class ::EmailTest;
+
+    Q_GADGET
+    Q_PROPERTY(QString email READ mail WRITE setEmail)
+    Q_PROPERTY(bool isValid READ isValid)
+    Q_PROPERTY(Type type READ type WRITE setType)
+    Q_PROPERTY(bool isPreferred READ isPreferred WRITE setPreferred)
+
+public:
+    /**
+     * Creates an empty email object.
+     */
+    Email();
+    Email(const Email &other);
+    Email(const QString &mail);
+
+    ~Email();
+
+    typedef QVector<Email> List;
+
+    /**
+     * Email types.
+     * @see Type
+     */
+    enum TypeFlag {
+        Unknown = 0, /**< No or unknown email type is set. */
+        Home = 1, /**< Personal email. */
+        Work = 2, /**< Work email. */
+        Other = 4, /**< Other email. */
+    };
+
+    /**
+     * Stores a combination of #TypeFlag values.
+     */
+    Q_DECLARE_FLAGS(Type, TypeFlag)
+    Q_FLAG(Type)
+
+    void setEmail(const QString &mail);
+    Q_REQUIRED_RESULT QString mail() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    /**
+     * Returns the type of the email.
+     * @since 5.12
+     */
+    Type type() const;
+    /**
+     * Sets the email type.
+     * @since 5.12
+     */
+    void setType(Type type);
+
+    /**
+     * Returns whether this is the preferred email address.
+     * @since 5.12
+     */
+    bool isPreferred() const;
+    /**
+     * Sets that this is the preferred email address.
+     * @since 5.12
+     */
+    void setPreferred(bool preferred);
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Email &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Email &other) const;
+
+    Email &operator=(const Email &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(Email::Type)
+
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Email &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Email &object);
+}
+Q_DECLARE_METATYPE(KContacts::Email)
+Q_DECLARE_TYPEINFO(KContacts::Email, Q_MOVABLE_TYPE);
+#endif // EMAIL_H
diff --git a/src/field.cpp b/src/field.cpp
new file mode 100644 (file)
index 0000000..16c5d39
--- /dev/null
@@ -0,0 +1,639 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "field.h"
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+#include <KConfig>
+#include <KLocalizedString>
+#include <KConfigGroup>
+#include <KSharedConfig>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Field::Private
+{
+public:
+    Private(int fieldId, int category = 0, const QString &label = QString(), const QString &key = QString(), const QString &app = QString())
+        : mFieldId(fieldId)
+        , mCategory(category)
+        , mLabel(label)
+        , mKey(key)
+        , mApp(app)
+    {
+    }
+
+    enum FieldId {
+        CustomField,
+        FormattedName,
+        FamilyName,
+        GivenName,
+        AdditionalName,
+        Prefix,
+        Suffix,
+        NickName,
+        Birthday,
+        HomeAddressStreet,
+        HomeAddressPostOfficeBox,
+        HomeAddressLocality,
+        HomeAddressRegion,
+        HomeAddressPostalCode,
+        HomeAddressCountry,
+        HomeAddressLabel,
+        BusinessAddressStreet,
+        BusinessAddressPostOfficeBox,
+        BusinessAddressLocality,
+        BusinessAddressRegion,
+        BusinessAddressPostalCode,
+        BusinessAddressCountry,
+        BusinessAddressLabel,
+        HomePhone,
+        BusinessPhone,
+        MobilePhone,
+        HomeFax,
+        BusinessFax,
+        CarPhone,
+        Isdn,
+        Pager,
+        Email,
+        Mailer,
+        Title,
+        Role,
+        Organization,
+        Department,
+        Note,
+        Url,
+    };
+
+    int fieldId() const
+    {
+        return mFieldId;
+    }
+
+    int category() const
+    {
+        return mCategory;
+    }
+
+    QString label() const
+    {
+        return mLabel;
+    }
+
+    QString key() const
+    {
+        return mKey;
+    }
+
+    QString app() const
+    {
+        return mApp;
+    }
+
+    static Field::List mAllFields;
+    static Field::List mDefaultFields;
+    static Field::List mCustomFields;
+
+private:
+    int mFieldId;
+    int mCategory;
+
+    QString mLabel;
+    QString mKey;
+    QString mApp;
+};
+
+Field::List Field::Private::mAllFields;
+Field::List Field::Private::mDefaultFields;
+Field::List Field::Private::mCustomFields;
+
+Field::Field(Private *p)
+    : d(p)
+{
+}
+
+Field::~Field()
+{
+    delete d;
+}
+
+QString Field::label()
+{
+    switch (d->fieldId()) {
+    case Private::FormattedName:
+        return Addressee::formattedNameLabel();
+    case Private::FamilyName:
+        return Addressee::familyNameLabel();
+    case Private::GivenName:
+        return Addressee::givenNameLabel();
+    case Private::AdditionalName:
+        return Addressee::additionalNameLabel();
+    case Private::Prefix:
+        return Addressee::prefixLabel();
+    case Private::Suffix:
+        return Addressee::suffixLabel();
+    case Private::NickName:
+        return Addressee::nickNameLabel();
+    case Private::Birthday:
+        return Addressee::birthdayLabel();
+    case Private::HomeAddressStreet:
+        return Addressee::homeAddressStreetLabel();
+    case Private::HomeAddressPostOfficeBox:
+        return Addressee::homeAddressPostOfficeBoxLabel();
+    case Private::HomeAddressLocality:
+        return Addressee::homeAddressLocalityLabel();
+    case Private::HomeAddressRegion:
+        return Addressee::homeAddressRegionLabel();
+    case Private::HomeAddressPostalCode:
+        return Addressee::homeAddressPostalCodeLabel();
+    case Private::HomeAddressCountry:
+        return Addressee::homeAddressCountryLabel();
+    case Private::HomeAddressLabel:
+        return Addressee::homeAddressLabelLabel();
+    case Private::BusinessAddressStreet:
+        return Addressee::businessAddressStreetLabel();
+    case Private::BusinessAddressPostOfficeBox:
+        return Addressee::businessAddressPostOfficeBoxLabel();
+    case Private::BusinessAddressLocality:
+        return Addressee::businessAddressLocalityLabel();
+    case Private::BusinessAddressRegion:
+        return Addressee::businessAddressRegionLabel();
+    case Private::BusinessAddressPostalCode:
+        return Addressee::businessAddressPostalCodeLabel();
+    case Private::BusinessAddressCountry:
+        return Addressee::businessAddressCountryLabel();
+    case Private::BusinessAddressLabel:
+        return Addressee::businessAddressLabelLabel();
+    case Private::HomePhone:
+        return Addressee::homePhoneLabel();
+    case Private::BusinessPhone:
+        return Addressee::businessPhoneLabel();
+    case Private::MobilePhone:
+        return Addressee::mobilePhoneLabel();
+    case Private::HomeFax:
+        return Addressee::homeFaxLabel();
+    case Private::BusinessFax:
+        return Addressee::businessFaxLabel();
+    case Private::CarPhone:
+        return Addressee::carPhoneLabel();
+    case Private::Isdn:
+        return Addressee::isdnLabel();
+    case Private::Pager:
+        return Addressee::pagerLabel();
+    case Private::Email:
+        return Addressee::emailLabel();
+    case Private::Mailer:
+        return Addressee::mailerLabel();
+    case Private::Title:
+        return Addressee::titleLabel();
+    case Private::Role:
+        return Addressee::roleLabel();
+    case Private::Organization:
+        return Addressee::organizationLabel();
+    case Private::Department:
+        return Addressee::departmentLabel();
+    case Private::Note:
+        return Addressee::noteLabel();
+    case Private::Url:
+        return Addressee::urlLabel();
+    case Private::CustomField:
+        return d->label();
+    default:
+        return i18n("Unknown Field");
+    }
+}
+
+int Field::category()
+{
+    return d->category();
+}
+
+QString Field::categoryLabel(int category)
+{
+    switch (category) {
+    case All:
+        return i18n("All");
+    case Frequent:
+        return i18n("Frequent");
+    case Address:
+        return i18nc("street/postal", "Address");
+    case Email:
+        return i18n("Email");
+    case Personal:
+        return i18n("Personal");
+    case Organization:
+        return i18n("Organization");
+    case CustomCategory:
+        return i18n("Custom");
+    default:
+        return i18n("Undefined");
+    }
+}
+
+QString Field::value(const KContacts::Addressee &a)
+{
+
+    auto findPhone = [](const PhoneNumber::List &list, PhoneNumber::TypeFlag compareFlag) {
+        auto it = std::find_if(list.cbegin(), list.cend(), [=](const PhoneNumber &phone) {
+            return (phone.type() & ~(PhoneNumber::Pref)) == compareFlag;
+        });
+        return it;
+    };
+
+    switch (d->fieldId()) {
+    case Private::FormattedName:
+        return a.formattedName();
+    case Private::FamilyName:
+        return a.familyName();
+    case Private::GivenName:
+        return a.givenName();
+    case Private::AdditionalName:
+        return a.additionalName();
+    case Private::Prefix:
+        return a.prefix();
+    case Private::Suffix:
+        return a.suffix();
+    case Private::NickName:
+        return a.nickName();
+    case Private::Mailer:
+        return a.mailer();
+    case Private::Title:
+        return a.title();
+    case Private::Role:
+        return a.role();
+    case Private::Organization:
+        return a.organization();
+    case Private::Department:
+        return a.department();
+    case Private::Note:
+        return a.note();
+    case Private::Email:
+        return a.preferredEmail();
+    case Private::Birthday:
+        if (a.birthday().isValid()) {
+            return a.birthday().date().toString(Qt::ISODate);
+        } else {
+            return QString();
+        }
+    case Private::Url:
+        return a.url().url().toDisplayString();
+    case Private::HomePhone: {
+        PhoneNumber::List::ConstIterator it;
+
+        {
+            // check for preferred number
+            const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Home | PhoneNumber::Pref);
+            auto it = findPhone(list, PhoneNumber::Home);
+            if (it != list.cend()) {
+                return it->number();
+            }
+        }
+
+        {
+            // check for normal home number
+            const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Home);
+            auto it = findPhone(list, PhoneNumber::Home);
+            if (it != list.cend()) {
+                return it->number();
+            }
+        }
+
+        return QString();
+    }
+    case Private::BusinessPhone: {
+        PhoneNumber::List::ConstIterator it;
+
+        {
+            // check for preferred number
+            const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Work | PhoneNumber::Pref);
+            auto it = findPhone(list, PhoneNumber::Work);
+            if (it != list.cend()) {
+                return it->number();
+            }
+        }
+
+        {
+            // check for normal work number
+            const PhoneNumber::List list = a.phoneNumbers(PhoneNumber::Work);
+            auto it = findPhone(list, PhoneNumber::Work);
+            if (it != list.cend()) {
+                return it->number();
+            }
+        }
+
+        return QString();
+    }
+    case Private::MobilePhone:
+        return a.phoneNumber(PhoneNumber::Cell).number();
+    case Private::HomeFax:
+        return a.phoneNumber(PhoneNumber::Home | PhoneNumber::Fax).number();
+    case Private::BusinessFax:
+        return a.phoneNumber(PhoneNumber::Work | PhoneNumber::Fax).number();
+    case Private::CarPhone:
+        return a.phoneNumber(PhoneNumber::Car).number();
+    case Private::Isdn:
+        return a.phoneNumber(PhoneNumber::Isdn).number();
+    case Private::Pager:
+        return a.phoneNumber(PhoneNumber::Pager).number();
+    case Private::HomeAddressStreet:
+        return a.address(Address::Home).street();
+    case Private::HomeAddressPostOfficeBox:
+        return a.address(Address::Home).postOfficeBox();
+    case Private::HomeAddressLocality:
+        return a.address(Address::Home).locality();
+    case Private::HomeAddressRegion:
+        return a.address(Address::Home).region();
+    case Private::HomeAddressPostalCode:
+        return a.address(Address::Home).postalCode();
+    case Private::HomeAddressCountry:
+        return a.address(Address::Home).country();
+    case Private::BusinessAddressStreet:
+        return a.address(Address::Work).street();
+    case Private::BusinessAddressPostOfficeBox:
+        return a.address(Address::Work).postOfficeBox();
+    case Private::BusinessAddressLocality:
+        return a.address(Address::Work).locality();
+    case Private::BusinessAddressRegion:
+        return a.address(Address::Work).region();
+    case Private::BusinessAddressPostalCode:
+        return a.address(Address::Work).postalCode();
+    case Private::BusinessAddressCountry:
+        return a.address(Address::Work).country();
+    case Private::CustomField:
+        return a.custom(d->app(), d->key());
+    default:
+        return QString();
+    }
+}
+
+bool Field::setValue(KContacts::Addressee &a, const QString &value)
+{
+    switch (d->fieldId()) {
+    case Private::FormattedName:
+        a.setFormattedName(value);
+        return true;
+    case Private::FamilyName:
+        a.setFamilyName(value);
+        return true;
+    case Private::GivenName:
+        a.setGivenName(value);
+        return true;
+    case Private::AdditionalName:
+        a.setAdditionalName(value);
+        return true;
+    case Private::Prefix:
+        a.setPrefix(value);
+        return true;
+    case Private::Suffix:
+        a.setSuffix(value);
+        return true;
+    case Private::NickName:
+        a.setNickName(value);
+        return true;
+    case Private::Mailer:
+        a.setMailer(value);
+        return true;
+    case Private::Title:
+        a.setTitle(value);
+        return true;
+    case Private::Role:
+        a.setRole(value);
+        return true;
+    case Private::Organization:
+        a.setOrganization(value);
+        return true;
+    case Private::Department:
+        a.setDepartment(value);
+        return true;
+    case Private::Note:
+        a.setNote(value);
+        return true;
+    case Private::Birthday:
+        a.setBirthday(QDate::fromString(value, Qt::ISODate));
+        return true;
+    case Private::CustomField:
+        a.insertCustom(d->app(), d->key(), value);
+        return true;
+    default:
+        return false;
+    }
+}
+
+QString Field::sortKey(const KContacts::Addressee &a)
+{
+    switch (d->fieldId()) {
+    case Private::FormattedName:
+        return a.formattedName();
+    case Private::FamilyName:
+        return a.familyName();
+    case Private::GivenName:
+        return a.givenName();
+    case Private::AdditionalName:
+        return a.additionalName();
+    case Private::Prefix:
+        return a.prefix();
+    case Private::Suffix:
+        return a.suffix();
+    case Private::NickName:
+        return a.nickName();
+    case Private::Mailer:
+        return a.mailer();
+    case Private::Title:
+        return a.title();
+    case Private::Role:
+        return a.role();
+    case Private::Organization:
+        return a.organization();
+    case Private::Department:
+        return a.department();
+    case Private::Note:
+        return a.note();
+    case Private::Birthday:
+        if (a.birthday().isValid()) {
+            QDate date = a.birthday().date();
+            return QString::asprintf("%02d-%02d", date.month(), date.day());
+        } else {
+            return QStringLiteral("00-00");
+        }
+    default:
+        return value(a).toLower();
+    }
+}
+
+bool Field::isCustom()
+{
+    return d->fieldId() == Private::CustomField;
+}
+
+Field::List Field::allFields()
+{
+    if (Private::mAllFields.isEmpty()) {
+        createField(Private::FormattedName, Frequent);
+        createField(Private::FamilyName, Frequent);
+        createField(Private::GivenName, Frequent);
+        createField(Private::AdditionalName);
+        createField(Private::Prefix);
+        createField(Private::Suffix);
+        createField(Private::NickName, Personal);
+        createField(Private::Birthday, Personal);
+        createField(Private::HomeAddressStreet, Address | Personal);
+        createField(Private::HomeAddressPostOfficeBox, Address | Personal);
+        createField(Private::HomeAddressLocality, Address | Personal);
+        createField(Private::HomeAddressRegion, Address | Personal);
+        createField(Private::HomeAddressPostalCode, Address | Personal);
+        createField(Private::HomeAddressCountry, Address | Personal);
+        createField(Private::HomeAddressLabel, Address | Personal);
+        createField(Private::BusinessAddressStreet, Address | Organization);
+        createField(Private::BusinessAddressPostOfficeBox, Address | Organization);
+        createField(Private::BusinessAddressLocality, Address | Organization);
+        createField(Private::BusinessAddressRegion, Address | Organization);
+        createField(Private::BusinessAddressPostalCode, Address | Organization);
+        createField(Private::BusinessAddressCountry, Address | Organization);
+        createField(Private::BusinessAddressLabel, Address | Organization);
+        createField(Private::HomePhone, Personal | Frequent);
+        createField(Private::BusinessPhone, Organization | Frequent);
+        createField(Private::MobilePhone, Frequent);
+        createField(Private::HomeFax);
+        createField(Private::BusinessFax);
+        createField(Private::CarPhone);
+        createField(Private::Isdn);
+        createField(Private::Pager);
+        createField(Private::Email, Email | Frequent);
+        createField(Private::Mailer, Email);
+        createField(Private::Title, Organization);
+        createField(Private::Role, Organization);
+        createField(Private::Organization, Organization);
+        createField(Private::Department, Organization);
+        createField(Private::Note);
+        createField(Private::Url);
+    }
+
+    return Private::mAllFields;
+}
+
+Field::List Field::defaultFields()
+{
+    if (Private::mDefaultFields.isEmpty()) {
+        createDefaultField(Private::FormattedName);
+        createDefaultField(Private::Email);
+    }
+
+    return Private::mDefaultFields;
+}
+
+void Field::createField(int id, int category)
+{
+    Private::mAllFields.append(new Field(new Private(id, category)));
+}
+
+void Field::createDefaultField(int id, int category)
+{
+    Private::mDefaultFields.append(new Field(new Private(id, category)));
+}
+
+void Field::deleteFields()
+{
+    Field::List::ConstIterator it;
+
+    for (it = Private::mAllFields.constBegin(); it != Private::mAllFields.constEnd(); ++it) {
+        delete (*it);
+    }
+    Private::mAllFields.clear();
+
+    for (it = Private::mDefaultFields.constBegin(); it != Private::mDefaultFields.constEnd(); ++it) {
+        delete (*it);
+    }
+    Private::mDefaultFields.clear();
+
+    for (it = Private::mCustomFields.constBegin(); it != Private::mCustomFields.constEnd(); ++it) {
+        delete (*it);
+    }
+    Private::mCustomFields.clear();
+}
+
+void Field::saveFields(const QString &identifier, const Field::List &fields)
+{
+    KConfigGroup cg(KSharedConfig::openConfig(), "KABCFields");
+
+    saveFields(cg, identifier, fields);
+}
+
+void Field::saveFields(KConfigGroup &cfg, const QString &identifier, const Field::List &fields)
+{
+    QList<int> fieldIds;
+
+    int custom = 0;
+    Field::List::ConstIterator it;
+    fieldIds.reserve(fields.count());
+    for (it = fields.begin(); it != fields.end(); ++it) {
+        fieldIds.append((*it)->d->fieldId());
+        if ((*it)->isCustom()) {
+            QStringList customEntry;
+            customEntry << (*it)->d->label();
+            customEntry << (*it)->d->key();
+            customEntry << (*it)->d->app();
+            cfg.writeEntry(QLatin1String("KCONTACTS_CustomEntry_") + identifier + QLatin1Char('_') + QString::number(custom++), customEntry);
+        }
+    }
+
+    cfg.writeEntry(identifier, fieldIds);
+}
+
+Field::List Field::restoreFields(const QString &identifier)
+{
+    KConfigGroup cg(KSharedConfig::openConfig(), "KABCFields");
+
+    return restoreFields(cg, identifier);
+}
+
+Field::List Field::restoreFields(const KConfigGroup &cfg, const QString &identifier)
+{
+    const QList<int> fieldIds = cfg.readEntry(identifier, QList<int>());
+
+    Field::List fields;
+
+    int custom = 0;
+    QList<int>::ConstIterator it;
+    fields.reserve(fieldIds.count());
+    for (it = fieldIds.begin(); it != fieldIds.end(); ++it) {
+        Private *f = nullptr;
+        if ((*it) == Private::CustomField) {
+            QStringList customEntry =
+                cfg.readEntry(QLatin1String("KCONTACTS_CustomEntry_") + identifier + QLatin1Char('_') + QString::number(custom++), QStringList());
+            f = new Private(*it, CustomCategory, customEntry[0], customEntry[1], customEntry[2]);
+        } else {
+            f = new Private(*it);
+        }
+        fields.append(new Field(f));
+    }
+
+    return fields;
+}
+
+bool Field::equals(Field *field)
+{
+    bool sameId = (d->fieldId() == field->d->fieldId());
+
+    if (!sameId) {
+        return false;
+    }
+
+    if (d->fieldId() != Private::CustomField) {
+        return true;
+    }
+
+    return d->key() == field->d->key();
+}
+
+Field *Field::createCustomField(const QString &label, int category, const QString &key, const QString &app)
+{
+    Field *field = new Field(new Private(Private::CustomField, category | CustomCategory, label, key, app));
+    Private::mCustomFields.append(field);
+
+    return field;
+}
+#endif
diff --git a/src/field.h b/src/field.h
new file mode 100644 (file)
index 0000000..6890764
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_FIELD_H
+#define KCONTACTS_FIELD_H
+
+#include "kcontacts_export.h"
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+#include "addressee.h"
+#include <QString>
+
+class KConfigGroup;
+
+namespace KContacts
+{
+/**
+ * @short Represents a field in the Addressbook
+ *
+ * This class represents a field in the Addressbook database.
+ * It provides methods for accessing meta-information about
+ * the field (such as label() or category()) as well as
+ * getting or setting the field's value in an instance of
+ * Addressee (value(), setValue()).
+ *
+ * Furthermore, some static methods are provided for getting
+ * a list of all fields (allFields(), defaultFields()), for
+ * creating new fields (createCustomField()) and for saving
+ * or loading fields to/from a config file (saveFields(),
+ * restoreFields()).
+ *
+ * @deprecated since 5.88, class is unused
+ */
+class KCONTACTS_EXPORT KCONTACTS_DEPRECATED_VERSION(5, 88, "class is unused") Field
+{
+public:
+    /**
+     * This type is used for a list of fields.
+     */
+    typedef QList<Field *> List;
+
+    /**
+     * Represents the category a field belongs to.
+     */
+    enum FieldCategory {
+        /**
+         * All fields
+         */
+        All = 0x0,
+        /**
+         * Frequently used fields
+         */
+        Frequent = 0x01,
+        /**
+         * Fields which belong to the address, such as Street, City, Zip, etc.
+         */
+        Address = 0x02,
+        /**
+         * Fields which store information about the e-mail contact, such as
+         * e-mail address or mail client
+         */
+        Email = 0x04,
+        /**
+         * Personal fields, such as Birthday, Home Address fields, IM Address, etc.
+         */
+        Personal = 0x08,
+        /**
+         * Fields about the organization, such as Business Address fields, Department,
+         * Profession, etc.
+         */
+        Organization = 0x10,
+        /**
+         * Custom (user-defined) fields
+         */
+        CustomCategory = 0x20,
+    };
+
+    /**
+     * Returns the translated label for this field.
+     */
+    Q_REQUIRED_RESULT virtual QString label();
+
+    /**
+     * Returns the  ored categories the field belongs to.
+     */
+    Q_REQUIRED_RESULT virtual int category();
+
+    /**
+     * Returns the translated label for @p category.
+     *
+     * @param category the category of type FieldCategory
+     * @return the translated label
+     */
+    static QString categoryLabel(int category);
+
+    /**
+     * Returns a string representation of the value the field has in the given
+     * Addressee.
+     *
+     * @return the string representation of the value or QString(), if it
+     * is not possible to convert the value to a string.
+     */
+    Q_REQUIRED_RESULT virtual QString value(const KContacts::Addressee &addressee);
+
+    /**
+     * Sets the value of the field in the given Addressee.
+     *
+     * @return @c true on success or @c false, if the given string couldn't
+     * be converted to a valid value.
+     */
+    Q_REQUIRED_RESULT virtual bool setValue(KContacts::Addressee &addressee, const QString &value);
+
+    /**
+     * Returns a string, that can be used for sorting.
+     */
+    Q_REQUIRED_RESULT QString sortKey(const KContacts::Addressee &addressee);
+
+    /**
+     * Returns, if the field is a user-defined field.
+     *
+     * @return @c true if this is a custom field, @c false otherwise
+     */
+    Q_REQUIRED_RESULT virtual bool isCustom();
+
+    /**
+     * Returns, if the field is equal with @p field.
+     *
+     * @param field the field to compare this field to
+     * @return @c true if the fields are equal, @c false otherwise
+     */
+    Q_REQUIRED_RESULT virtual bool equals(Field *field);
+
+    /**
+     * Returns a list of all fields.
+     */
+    static Field::List allFields();
+
+    /**
+     * Returns a list of the default fields.
+     */
+    Q_REQUIRED_RESULT static Field::List defaultFields();
+
+    /**
+     * Creates a custom field.
+     *
+     * @param label    The label for this field
+     * @param category The category of this field
+     * @param key      Unique key for this field
+     * @param app      Unique app name for this field
+     */
+    static Field *createCustomField(const QString &label, int category, const QString &key, const QString &app);
+
+    /**
+     * Delete all fields from list.
+     */
+    static void deleteFields();
+
+    /**
+     * Save the field settings to a config file.
+     *
+     * @param cfg        The config file object
+     * @param identifier The unique identifier
+     * @param fields     The list of the fields
+     */
+    static void saveFields(KConfigGroup &cfg, const QString &identifier, const Field::List &fields);
+    /**
+     * @overload
+     *
+     * Here, the list is stored in KSharedConfig::openConfig() in group "KABCFields".
+     *
+     * @param identifier The unique identifier
+     * @param fields     The list of the fields
+     */
+    static void saveFields(const QString &identifier, const Field::List &fields);
+
+    /**
+     * Load the field settings from a config file.
+     *
+     * @param cfg        The config file object
+     * @param identifier The unique identifier
+     */
+    static Field::List restoreFields(const KConfigGroup &cfg, const QString &identifier);
+
+    /**
+     * @overload
+     *
+     * Here, the list is loaded from KSharedConfig::openConfig() from group "KABCFields".
+     *
+     * @param identifier The unique identifier
+     */
+    static Field::List restoreFields(const QString &identifier);
+
+protected:
+    /**
+     * @internal
+     *
+     * Creates a field and appends it to the general list of fields.
+     *
+     * @param id The identifier for the field
+     * @param category The optional category for the field
+     */
+    static void createField(int id, int category = 0);
+
+    /**
+     * @internal
+     *
+     * Creates a field and appends it to the list of default fields.
+     *
+     * @param id The identifier for the field
+     * @param category The optional category for the field
+     */
+    static void createDefaultField(int id, int category = 0);
+
+private:
+    class Private;
+
+    Field(Private *p);
+    virtual ~Field();
+
+    Private *const d;
+};
+}
+#endif
+#endif
diff --git a/src/fieldgroup.cpp b/src/fieldgroup.cpp
new file mode 100644 (file)
index 0000000..f538f52
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "fieldgroup.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN FieldGroup::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        fieldGroupName = other.fieldGroupName;
+        value = other.value;
+    }
+
+    ParameterMap mParamMap;
+    QString fieldGroupName;
+    QString value;
+};
+
+FieldGroup::FieldGroup()
+    : d(new Private)
+{
+}
+
+FieldGroup::FieldGroup(const FieldGroup &other)
+    : d(other.d)
+{
+}
+
+FieldGroup::FieldGroup(const QString &FieldGroupName)
+    : d(new Private)
+{
+    d->fieldGroupName = FieldGroupName;
+}
+
+FieldGroup::~FieldGroup()
+{
+}
+
+void FieldGroup::setFieldGroupName(const QString &fieldGroup)
+{
+    d->fieldGroupName = fieldGroup;
+}
+
+QString FieldGroup::fieldGroupName() const
+{
+    return d->fieldGroupName;
+}
+
+bool FieldGroup::isValid() const
+{
+    return !d->fieldGroupName.isEmpty();
+}
+
+void FieldGroup::setValue(const QString &value)
+{
+    d->value = value;
+}
+
+QString FieldGroup::value() const
+{
+    return d->value;
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void FieldGroup::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> FieldGroup::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void FieldGroup::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap FieldGroup::params() const
+{
+    return d->mParamMap;
+}
+
+bool FieldGroup::operator==(const FieldGroup &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->fieldGroupName == other.fieldGroupName()) && (d->value == other.value());
+}
+
+bool FieldGroup::operator!=(const FieldGroup &other) const
+{
+    return !(other == *this);
+}
+
+FieldGroup &FieldGroup::operator=(const FieldGroup &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString FieldGroup::toString() const
+{
+    QString str = QLatin1String("FieldGroup {\n");
+    str += QStringLiteral("    FieldGroupName: %1 Value %2\n").arg(d->fieldGroupName).arg(d->value);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const FieldGroup &fieldGroup)
+{
+    return s << fieldGroup.d->mParamMap << fieldGroup.d->fieldGroupName << fieldGroup.d->value;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, FieldGroup &fieldGroup)
+{
+    s >> fieldGroup.d->mParamMap >> fieldGroup.d->fieldGroupName >> fieldGroup.d->value;
+    return s;
+}
diff --git a/src/fieldgroup.h b/src/fieldgroup.h
new file mode 100644 (file)
index 0000000..888cfd4
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef FIELDGROUP_H
+#define FIELDGROUP_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class FieldGroupTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a FieldGroup for a contact.
+ *  @since 5.3
+ */
+class KCONTACTS_EXPORT FieldGroup
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const FieldGroup &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, FieldGroup &);
+    friend class VCardTool;
+    friend class ::FieldGroupTest;
+
+public:
+    FieldGroup();
+    FieldGroup(const FieldGroup &other);
+    FieldGroup(const QString &fieldGroupName);
+
+    ~FieldGroup();
+
+    typedef QVector<FieldGroup> List;
+
+    void setFieldGroupName(const QString &fieldGroup);
+    Q_REQUIRED_RESULT QString fieldGroupName() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    void setValue(const QString &value);
+    Q_REQUIRED_RESULT QString value() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const FieldGroup &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const FieldGroup &other) const;
+
+    FieldGroup &operator=(const FieldGroup &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const FieldGroup &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, FieldGroup &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::FieldGroup, Q_MOVABLE_TYPE);
+#endif // FIELDGROUP_H
diff --git a/src/gender.cpp b/src/gender.cpp
new file mode 100644 (file)
index 0000000..71566d5
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "gender.h"
+#include "parametermap_p.h"
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Gender::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        comment = other.comment;
+        gender = other.gender;
+    }
+
+    QString gender;
+    QString comment;
+};
+
+Gender::Gender()
+    : d(new Private)
+{
+}
+
+Gender::Gender(const QString &gender)
+    : d(new Private)
+{
+    d->gender = gender;
+}
+
+Gender::Gender(const Gender &other)
+    : d(other.d)
+{
+}
+
+Gender::~Gender()
+{
+}
+
+bool Gender::operator==(const Gender &other) const
+{
+    return (d->comment == other.comment()) && (d->gender == other.gender());
+}
+
+bool Gender::operator!=(const Gender &other) const
+{
+    return !(other == *this);
+}
+
+Gender &Gender::operator=(const Gender &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Gender::toString() const
+{
+    QString str = QLatin1String("Gender {\n");
+    str += QStringLiteral("    gender: %1\n").arg(d->gender);
+    str += QStringLiteral("    comment: %1\n").arg(d->comment);
+    str += QLatin1String("}\n");
+    return str;
+}
+
+void Gender::setGender(const QString &gender)
+{
+    d->gender = gender;
+}
+
+QString Gender::gender() const
+{
+    return d->gender;
+}
+
+void Gender::setComment(const QString &comment)
+{
+    d->comment = comment;
+}
+
+QString Gender::comment() const
+{
+    return d->comment;
+}
+
+bool Gender::isValid() const
+{
+    return !d->gender.isEmpty() || !d->comment.isEmpty();
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Gender &gender)
+{
+    return s << gender.d->comment << gender.d->gender;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Gender &gender)
+{
+    s >> gender.d->comment >> gender.d->gender;
+    return s;
+}
diff --git a/src/gender.h b/src/gender.h
new file mode 100644 (file)
index 0000000..11a1263
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef GENDER_H
+#define GENDER_H
+#include "kcontacts_export.h"
+#include <QSharedDataPointer>
+#include <QString>
+
+namespace KContacts
+{
+/** @short Class that holds a Gender for a contact.
+ *  @since 4.14.5
+ */
+class KCONTACTS_EXPORT Gender
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Gender &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Gender &);
+
+public:
+    /**
+     * Creates an empty Gender object.
+     */
+    Gender();
+    Gender(const Gender &other);
+    Gender(const QString &gender);
+
+    ~Gender();
+
+    void setGender(const QString &gender);
+    Q_REQUIRED_RESULT QString gender() const;
+
+    void setComment(const QString &comment);
+    Q_REQUIRED_RESULT QString comment() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    Q_REQUIRED_RESULT bool operator==(const Gender &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Gender &other) const;
+
+    Gender &operator=(const Gender &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Gender &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Gender &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Gender, Q_MOVABLE_TYPE);
+#endif // GENDER_H
diff --git a/src/geo.cpp b/src/geo.cpp
new file mode 100644 (file)
index 0000000..65fa093
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "geo.h"
+
+#include <QDataStream>
+#include <QSharedData>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Geo::Private : public QSharedData
+{
+public:
+    Private()
+        : mLatitude(91)
+        , mLongitude(181)
+        , mValidLatitude(false)
+        , mValidLongitude(false)
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mLatitude = other.mLatitude;
+        mLongitude = other.mLongitude;
+        mValidLatitude = other.mValidLatitude;
+        mValidLongitude = other.mValidLongitude;
+    }
+
+    float mLatitude;
+    float mLongitude;
+
+    bool mValidLatitude;
+    bool mValidLongitude;
+};
+
+Geo::Geo()
+    : d(new Private)
+{
+}
+
+Geo::Geo(float latitude, float longitude)
+    : d(new Private)
+{
+    setLatitude(latitude);
+    setLongitude(longitude);
+}
+
+Geo::Geo(const Geo &other)
+    : d(other.d)
+{
+}
+
+Geo::~Geo()
+{
+}
+
+void Geo::setLatitude(float latitude)
+{
+    if (latitude >= -90 && latitude <= 90) {
+        d->mLatitude = latitude;
+        d->mValidLatitude = true;
+    } else {
+        d->mLatitude = 91;
+        d->mValidLatitude = false;
+    }
+}
+
+float Geo::latitude() const
+{
+    return d->mLatitude;
+}
+
+void Geo::setLongitude(float longitude)
+{
+    if (longitude >= -180 && longitude <= 180) {
+        d->mLongitude = longitude;
+        d->mValidLongitude = true;
+    } else {
+        d->mLongitude = 181;
+        d->mValidLongitude = false;
+    }
+}
+
+float Geo::longitude() const
+{
+    return d->mLongitude;
+}
+
+bool Geo::isValid() const
+{
+    return d->mValidLatitude && d->mValidLongitude;
+}
+
+bool Geo::operator==(const Geo &other) const
+{
+    if (!other.isValid() && !isValid()) {
+        return true;
+    }
+
+    if (!other.isValid() || !isValid()) {
+        return false;
+    }
+
+    if (other.d->mLatitude == d->mLatitude && other.d->mLongitude == d->mLongitude) {
+        return true;
+    }
+
+    return false;
+}
+
+bool Geo::operator!=(const Geo &other) const
+{
+    return !(*this == other);
+}
+
+Geo &Geo::operator=(const Geo &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Geo::toString() const
+{
+    QString str = QLatin1String("Geo {\n");
+    str += QStringLiteral("  Valid: %1\n").arg(isValid() ? QStringLiteral("true") : QStringLiteral("false"));
+    str += QStringLiteral("  Latitude: %1\n").arg(d->mLatitude);
+    str += QStringLiteral("  Longitude: %1\n").arg(d->mLongitude);
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+void Geo::clear()
+{
+    d->mValidLatitude = false;
+    d->mValidLongitude = false;
+}
+
+// clang-format off
+QDataStream &KContacts::operator<<(QDataStream &s, const Geo &geo)
+{
+    return s << geo.d->mLatitude << geo.d->mValidLatitude
+             << geo.d->mLongitude << geo.d->mValidLongitude;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Geo &geo)
+{
+    s >> geo.d->mLatitude >> geo.d->mValidLatitude
+    >> geo.d->mLongitude >> geo.d->mValidLongitude;
+
+    return s;
+}
+// clang-format on
diff --git a/src/geo.h b/src/geo.h
new file mode 100644 (file)
index 0000000..c50bdd0
--- /dev/null
+++ b/src/geo.h
@@ -0,0 +1,135 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_GEO_H
+#define KCONTACTS_GEO_H
+
+#include "kcontacts_export.h"
+
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QString>
+
+namespace KContacts
+{
+/**
+ * @short Geographic position
+ *
+ * This class represents a geographic position.
+ */
+class KCONTACTS_EXPORT Geo
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Geo &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Geo &);
+
+    Q_GADGET
+    Q_PROPERTY(float latitude READ latitude WRITE setLatitude)
+    Q_PROPERTY(float longitude READ longitude WRITE setLongitude)
+    Q_PROPERTY(bool isValid READ isValid)
+
+public:
+    /**
+     * Creates an invalid geographics position object.
+     */
+    Geo();
+
+    /**
+     * Creates a geographics position object.
+     *
+     * @param latitude  Geographical latitude
+     * @param longitude Geographical longitude
+     */
+    Geo(float latitude, float longitude);
+
+    /**
+     * Copy constructor.
+     */
+    Geo(const Geo &other);
+
+    /**
+     * Destroys the geographics position object.
+     */
+    ~Geo();
+
+    /**
+     * Sets the @p latitude.
+     *
+     * @param latitude The location's latitude coordinate
+     */
+    void setLatitude(float latitude);
+
+    /**
+     * Returns the latitude.
+     */
+    Q_REQUIRED_RESULT float latitude() const;
+
+    /**
+     * Sets the @p longitude.
+     *
+     * @param longitude The location's longitude coordinate
+     */
+    void setLongitude(float longitude);
+
+    /**
+     * Returns the longitude.
+     */
+    Q_REQUIRED_RESULT float longitude() const;
+
+    /**
+     * Returns, whether this object contains a valid geographical position.
+     */
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    /**
+     * Equality operator.
+     *
+     * @note Two invalid Geo instance will return @c true
+     */
+    Q_REQUIRED_RESULT bool operator==(const Geo &other) const;
+
+    /**
+     * Not-Equal operator.
+     */
+    bool operator!=(const Geo &other) const;
+
+    /**
+     * Assignment operator.
+     *
+     * @param other The Geo instance to assign to @c this
+     */
+    Geo &operator=(const Geo &other);
+
+    /**
+     * Returns string representation of geographical position.
+     */
+    Q_REQUIRED_RESULT QString toString() const;
+
+    /**
+     * Clears the class, marking it as invalid.
+     *
+     * @since 5.6
+     */
+    void clear();
+
+private:
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+/**
+ * Serializes the geographical position @p object into the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Geo &object);
+
+/**
+ * Initializes the geographical position @p object from the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Geo &object);
+}
+Q_DECLARE_METATYPE(KContacts::Geo)
+Q_DECLARE_TYPEINFO(KContacts::Geo, Q_MOVABLE_TYPE);
+#endif
diff --git a/src/impp.cpp b/src/impp.cpp
new file mode 100644 (file)
index 0000000..3eef884
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+    This file is part of libkabc.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "impp.h"
+#include "kcontacts_debug.h"
+#include "parametermap_p.h"
+
+#include <KDesktopFile>
+
+#include <QDataStream>
+#include <QDirIterator>
+#include <QStandardPaths>
+#include <QStringList>
+#include <QUrl>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Impp::Private : public QSharedData
+{
+public:
+    Private() = default;
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+    }
+
+    ParameterMap mParamMap;
+    QUrl address;
+};
+
+Impp::Impp()
+    : d(new Private)
+{
+}
+
+Impp::Impp(const Impp &other)
+    : d(other.d)
+{
+}
+
+Impp::Impp(const QUrl &address)
+    : d(new Private)
+{
+    d->address = address;
+}
+
+Impp::~Impp()
+{
+}
+
+bool Impp::isValid() const
+{
+    return !d->address.isEmpty() && !d->address.scheme().isEmpty();
+}
+
+void Impp::setAddress(const QUrl &address)
+{
+    d->address = address;
+}
+
+QUrl Impp::address() const
+{
+    return d->address;
+}
+
+QString Impp::serviceType() const
+{
+    return d->address.scheme();
+}
+
+QString Impp::serviceLabel() const
+{
+    return serviceLabel(serviceType());
+}
+
+QString Impp::serviceIcon() const
+{
+    return serviceIcon(serviceType());
+}
+
+bool Impp::isPreferred() const
+{
+    const auto it = d->mParamMap.findParam(QLatin1String("pref"));
+    if (it != d->mParamMap.cend()) {
+        return !it->paramValues.isEmpty() && it->paramValues.at(0) == QLatin1Char('1');
+    }
+    return false;
+}
+
+void Impp::setPreferred(bool preferred)
+{
+    if (!preferred) {
+        auto paramIt = d->mParamMap.findParam(QStringLiteral("pref"));
+        if (paramIt != d->mParamMap.end()) {
+            d->mParamMap.erase(paramIt);
+        }
+    } else {
+        auto paramIt = d->mParamMap.findParam(QStringLiteral("pref"));
+        if (paramIt != d->mParamMap.end()) {
+            paramIt->paramValues = QStringList{QStringLiteral("1")};
+        } else {
+            d->mParamMap.insertParam({QStringLiteral("pref"), {QStringLiteral("1")}});
+        }
+    }
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Impp::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Impp::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Impp::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Impp::params() const
+{
+    return d->mParamMap;
+}
+
+bool Impp::operator==(const Impp &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->address == other.address());
+}
+
+bool Impp::operator!=(const Impp &other) const
+{
+    return !(other == *this);
+}
+
+Impp &Impp::operator=(const Impp &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Impp::toString() const
+{
+    QString str = QLatin1String("Impp {\n");
+    str += QStringLiteral("    type: %1\n").arg(serviceType());
+    str += QStringLiteral("    address: %1\n").arg(d->address.url());
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Impp &impp)
+{
+    return s << impp.d->mParamMap << impp.d->address << (uint32_t)(0);
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Impp &impp)
+{
+    int i;
+    s >> impp.d->mParamMap >> impp.d->address >> i;
+    return s;
+}
+
+static QString improtcolFile(const QString &serviceType)
+{
+    const auto path =
+        QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kf5/kcontacts/improtocols/") + serviceType + QStringLiteral(".desktop"));
+    if (!path.isEmpty()) {
+        return path;
+    }
+    return QStringLiteral(":/org.kde.kcontacts/improtocols/") + serviceType + QStringLiteral(".desktop");
+}
+
+QString Impp::serviceLabel(const QString &serviceType)
+{
+    const auto path = improtcolFile(serviceType);
+    KDesktopFile df(path);
+    return df.readName();
+}
+
+QString Impp::serviceIcon(const QString &serviceType)
+{
+    const auto path = improtcolFile(serviceType);
+    KDesktopFile df(path);
+    return df.readIcon();
+}
+
+QVector<QString> Impp::serviceTypes()
+{
+    QVector<QString> types;
+    auto paths = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kf5/kcontacts/improtocols"), QStandardPaths::LocateDirectory);
+    paths.push_back(QStringLiteral(":/org.kde.kcontacts/improtocols/"));
+    for (const auto &path : paths) {
+        QDirIterator it(path, QDir::Files);
+        while (it.hasNext()) {
+            it.next();
+            const auto fi = it.fileInfo();
+            if (fi.suffix() == QLatin1String("desktop")) {
+                types.push_back(fi.baseName());
+            }
+        }
+    }
+
+    std::sort(types.begin(), types.end());
+    types.erase(std::unique(types.begin(), types.end()), types.end());
+    return types;
+}
+
+#include "moc_impp.cpp"
diff --git a/src/impp.h b/src/impp.h
new file mode 100644 (file)
index 0000000..64c24a7
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+    This file is part of libkabc.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef IMPP_H
+#define IMPP_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QString>
+
+class ImppTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a IMPP for a contact.
+ *
+ *  IMPP stands for "Instant Messaging and Presence Protocol". This field is defined
+ *  in the vCard 3.0 extension RFC 4770 and is part of vCard 4.0 (RFC 6350).
+ *
+ *  @since 4.14.5
+ */
+class KCONTACTS_EXPORT Impp
+{
+    Q_GADGET
+    Q_PROPERTY(bool isValid READ isValid)
+    Q_PROPERTY(QUrl address READ address WRITE setAddress)
+    Q_PROPERTY(bool isPreferred READ isPreferred WRITE setPreferred)
+    Q_PROPERTY(QString serviceType READ serviceType)
+    Q_PROPERTY(QString serviceLabel READ serviceLabel)
+    Q_PROPERTY(QString serviceIcon READ serviceIcon)
+
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Impp &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Impp &);
+    friend class VCardTool;
+    friend class ::ImppTest;
+
+public:
+    Impp();
+    Impp(const Impp &other);
+    Impp(const QUrl &address);
+
+    ~Impp();
+
+    typedef QVector<Impp> List;
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    void setAddress(const QUrl &address);
+    Q_REQUIRED_RESULT QUrl address() const;
+
+    /**
+     * Returns the messaging service this address is for.
+     * This is equivalent to address().scheme().
+     * @since 5.12
+     */
+    QString serviceType() const;
+    /**
+     * Returns a translated label for the service type.
+     * @since 5.12
+     */
+    QString serviceLabel() const;
+    /**
+     * Returns the name of an icon representing the service type.
+     * @since 5.12
+     */
+    QString serviceIcon() const;
+
+    /**
+     * Returns whether this is the preferred messaging address.
+     * @since 5.12
+     */
+    bool isPreferred() const;
+    /**
+     * Sets that this is the preferred messaging address.
+     * @since 5.12
+     */
+    void setPreferred(bool preferred);
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Impp &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Impp &other) const;
+
+    Impp &operator=(const Impp &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+    /**
+     * Returns a translated name of the given IM service.
+     * @since 5.12
+     */
+    static QString serviceLabel(const QString &serviceType);
+    /**
+     * Returns an icon name representing the given IM service.
+     * @since 5.12
+     */
+    static QString serviceIcon(const QString &serviceType);
+    /**
+     * List all known service types.
+     * Don't use these strings directly for display, instead use serviceLabel and serviceIcon.
+     * @since 5.12
+     */
+    static QVector<QString> serviceTypes();
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Impp &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Impp &object);
+}
+
+Q_DECLARE_METATYPE(KContacts::Impp)
+Q_DECLARE_TYPEINFO(KContacts::Impp, Q_MOVABLE_TYPE);
+#endif // IMPP_H
diff --git a/src/improtocols/NOTE b/src/improtocols/NOTE
new file mode 100644 (file)
index 0000000..029b50d
--- /dev/null
@@ -0,0 +1 @@
+File names in here should match the corresponding URI scheme.
diff --git a/src/improtocols/aim.desktop b/src/improtocols/aim.desktop
new file mode 100644 (file)
index 0000000..a2b13fc
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-aim
+Comment=AIM Protocol
+Comment[ar]=ميفاق AIM
+Comment[az]=AIM Protokolu
+Comment[bg]=Протокол на AIM
+Comment[ca]=Protocol AIM
+Comment[ca@valencia]=Protocol AIM
+Comment[cs]=Protokol AIM
+Comment[da]=AIM-protokollen
+Comment[de]=AIM-Protokoll
+Comment[el]=AIM πρωτόκολλο
+Comment[en_GB]=AIM Protocol
+Comment[es]=Protocolo AIM
+Comment[et]=AIM protokoll
+Comment[eu]=AIM Protokoloa
+Comment[fi]=AIM-yhteyskäytäntö
+Comment[fr]=Protocole AIM
+Comment[gl]=Protocolo de AIM
+Comment[hu]=AIM protokoll
+Comment[ia]=Protocollo AIM
+Comment[id]=Protokol AIM
+Comment[it]=Protocollo AIM
+Comment[ja]=AIM プロトコル
+Comment[ka]=AIM პროტოკოლი
+Comment[ko]=AIM 프로토콜
+Comment[lt]=AIM protokolas
+Comment[nb]=AIM-protokoll
+Comment[nl]=AIM-protocol
+Comment[nn]=AIM-protokoll
+Comment[pl]=Protokół AIM
+Comment[pt]=Protocolo AIM
+Comment[pt_BR]=Protocolo do AIM
+Comment[ro]=Protocol AIM
+Comment[ru]=Протокол AIM
+Comment[sk]=AIM Protokol
+Comment[sl]=Protokol AIM
+Comment[sq]=AIM Protocol
+Comment[sv]=AIM-protokoll
+Comment[tg]=Протоколи AIM
+Comment[tr]=AIM Protokolü
+Comment[uk]=Протокол AIM
+Comment[x-test]=xxAIM Protocolxx
+Comment[zh_CN]=AIM 协议
+Comment[zh_TW]=AIM 通訊協定
+Name=AIM
+Name[ar]=AIM
+Name[az]=AIM
+Name[bg]=AIM
+Name[ca]=AIM
+Name[ca@valencia]=AIM
+Name[cs]=AIM
+Name[da]=AIM
+Name[de]=AIM
+Name[el]=AIM
+Name[en_GB]=AIM
+Name[es]=AIM
+Name[et]=AIM
+Name[eu]=AIM
+Name[fi]=AIM
+Name[fr]=AIM
+Name[gl]=AIM
+Name[hu]=AIM
+Name[ia]=AIM
+Name[id]=AIM
+Name[it]=AIM
+Name[ja]=AIM
+Name[ka]=AIM
+Name[ko]=AIM
+Name[lt]=AIM
+Name[nb]=AIM
+Name[nl]=AIM
+Name[nn]=AIM
+Name[pl]=AIM
+Name[pt]=AIM
+Name[pt_BR]=AIM
+Name[ro]=AIM
+Name[ru]=AIM
+Name[sk]=AIM
+Name[sl]=AIM
+Name[sq]=AIM
+Name[sv]=AIM
+Name[tg]=AIM
+Name[tr]=AIM
+Name[uk]=AIM
+Name[x-test]=xxAIMxx
+Name[zh_CN]=AIM
+Name[zh_TW]=AIM
diff --git a/src/improtocols/facebook.desktop b/src/improtocols/facebook.desktop
new file mode 100644 (file)
index 0000000..279c75f
--- /dev/null
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Icon=im-facebook
+Comment=Facebook Protocol
+Comment[ar]=ميفاق فيسبوك
+Comment[az]=Facebook Protokolu
+Comment[bg]=Протокол на Facebook
+Comment[ca]=Protocol Facebook
+Comment[ca@valencia]=Protocol Facebook
+Comment[cs]=Protokol Facebook
+Comment[da]=Facebook-protokollen
+Comment[de]=Facebook-Protokoll
+Comment[el]=Facebook πρωτόκολλο
+Comment[en_GB]=Facebook Protocol
+Comment[es]=Protocolo Facebook
+Comment[et]=Facebooki protokoll
+Comment[eu]=Facebook Protokoloa
+Comment[fi]=Facebook-yhteyskäytäntö
+Comment[fr]=Protocole Facebook
+Comment[gl]=Protocolo de Facebook
+Comment[hu]=Facebook protokoll
+Comment[ia]=Protocollo de Facebook
+Comment[id]=Protokol Facebook
+Comment[it]=Protocollo di Facebook
+Comment[ka]=Facebook პროტოკოლი
+Comment[ko]=Facebook 프로토콜
+Comment[lt]=Facebook protokolas
+Comment[nl]=Facebook-protocol
+Comment[nn]=Facebook-protokoll
+Comment[pl]=Protokół Facebooka
+Comment[pt]=Protocolo do Facebook
+Comment[pt_BR]=Protocolo do Facebook
+Comment[ro]=Protocol Facebook
+Comment[ru]=Протокол Facebook
+Comment[sk]=Facebook Protokol
+Comment[sl]=Protokol Facebook
+Comment[sq]=Protokoli Facebook
+Comment[sv]=Facebook-protokoll
+Comment[tg]=Протоколи Facebook
+Comment[tr]=Facebook Protokolü
+Comment[uk]=Протокол Facebook
+Comment[x-test]=xxFacebook Protocolxx
+Comment[zh_CN]=Facebook 协议
+Comment[zh_TW]=Facebook 通訊協定
+Name=Facebook
+Name[ar]=فيسبوك
+Name[az]=FAcebook
+Name[bg]=Facebook
+Name[ca]=Facebook
+Name[ca@valencia]=Facebook
+Name[cs]=Facebook
+Name[da]=Facebook
+Name[de]=Facebook
+Name[el]=Facebook
+Name[en_GB]=Facebook
+Name[es]=Facebook
+Name[et]=Facebook
+Name[eu]=Facebook
+Name[fi]=Facebook
+Name[fr]=Facebook
+Name[gl]=Facebook
+Name[hu]=Facebook
+Name[ia]=Facebook
+Name[id]=Facebook
+Name[it]=Facebook
+Name[ka]=Facebook
+Name[ko]=Facebook
+Name[lt]=Facebook
+Name[nl]=Facebook
+Name[nn]=Facebook
+Name[pl]=Facebook
+Name[pt]=Facebook
+Name[pt_BR]=Facebook
+Name[ro]=Facebook
+Name[ru]=Facebook
+Name[sk]=Facebook
+Name[sl]=Facebook
+Name[sq]=Facebook
+Name[sv]=Facebook
+Name[tg]=Facebook
+Name[tr]=Facebook
+Name[uk]=Facebook
+Name[x-test]=xxFacebookxx
+Name[zh_CN]=Facebook
+Name[zh_TW]=Facebook
diff --git a/src/improtocols/gg.desktop b/src/improtocols/gg.desktop
new file mode 100644 (file)
index 0000000..70a888b
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-gadugadu
+Comment=Gadu-Gadu Protocol
+Comment[ar]=ميفاق غادو-غادو
+Comment[az]=Gadu-Gadu Protokolu
+Comment[bg]=Протокол на Gadu-Gadu
+Comment[ca]=Protocol Gadu-Gadu
+Comment[ca@valencia]=Protocol Gadu-Gadu
+Comment[cs]=Protokol Gadu-Gadu
+Comment[da]=Gadu-Gadu-protokollen
+Comment[de]=Gadu-Gadu-Protokoll
+Comment[el]=Gadu-Gadu πρωτόκολλο
+Comment[en_GB]=Gadu-Gadu Protocol
+Comment[es]=Protocolo Gadu-Gadu
+Comment[et]=Gadu-Gadu protokoll
+Comment[eu]=Gadu-Gadu Protokoloa
+Comment[fi]=Gadu-Gadu-yhteyskäytäntö
+Comment[fr]=Protocole Gadu-Gadu
+Comment[gl]=Protocolo de Gadu-Gadu
+Comment[hu]=Gadu-Gadu protokoll
+Comment[ia]=Protocollo Gadu-Gadu
+Comment[id]=Protokol Gadu-Gadu
+Comment[it]=Protocollo Gadu-Gadu
+Comment[ja]=Gadu-Gadu プロトコル
+Comment[ka]=გადუ-გადუს პროტოკოლი
+Comment[ko]=Gadu-Gadu 프로토콜
+Comment[lt]=Gadu-Gadu protokolas
+Comment[nb]=Gadu-Gadu-protokoll
+Comment[nl]=Gadu-Gadu-protocol
+Comment[nn]=Gadu-Gadu-protokoll
+Comment[pl]=Protokół Gadu-Gadu
+Comment[pt]=Protocolo Gadu-Gadu
+Comment[pt_BR]=Protocolo do Gadu-Gadu
+Comment[ro]=Protocol Gadu-Gadu
+Comment[ru]=Протокол Gadu-Gadu
+Comment[sk]=Gadu-Gadu Protokol
+Comment[sl]=Protokol Gadu-Gadu
+Comment[sq]=Protokoli Gadu-Gadu
+Comment[sv]=Gadu-Gadu protokoll
+Comment[tg]=Протоколи Gadu-Gadu
+Comment[tr]=Gadu-Gadu Protokolü
+Comment[uk]=Протокол Gadu-Gadu
+Comment[x-test]=xxGadu-Gadu Protocolxx
+Comment[zh_CN]=Gadu-Gadu 协议
+Comment[zh_TW]=Gadu-Gadu 通訊協定
+Name=Gadu-Gadu
+Name[ar]=غادو-غادو
+Name[az]=Gadu-Gadu
+Name[bg]=Gadu-Gadu
+Name[ca]=Gadu-Gadu
+Name[ca@valencia]=Gadu-Gadu
+Name[cs]=Gadu-Gadu
+Name[da]=Gadu-Gadu
+Name[de]=Gadu-Gadu
+Name[el]=Gadu-Gadu
+Name[en_GB]=Gadu-Gadu
+Name[es]=Gadu-Gadu
+Name[et]=Gadu-Gadu
+Name[eu]=Gadu-Gadu
+Name[fi]=Gadu-Gadu
+Name[fr]=Gadu-Gadu
+Name[gl]=Gadu-Gadu
+Name[hu]=Gadu-Gadu
+Name[ia]=Gadu-Gadu
+Name[id]=Gadu-Gadu
+Name[it]=Gadu-Gadu
+Name[ja]=Gadu-Gadu
+Name[ka]=Gadu-Gadu
+Name[ko]=Gadu-Gadu
+Name[lt]=Gadu-Gadu
+Name[nb]=Gadu-Gadu
+Name[nl]=Gadu-Gadu
+Name[nn]=Gadu-Gadu
+Name[pl]=Gadu-Gadu
+Name[pt]=Gadu-Gadu
+Name[pt_BR]=Gadu-Gadu
+Name[ro]=Gadu-Gadu
+Name[ru]=Gadu-Gadu
+Name[sk]=Gadu-Gadu
+Name[sl]=Gadu-Gadu
+Name[sq]=Gadu-Gadu
+Name[sv]=Gadu-Gadu
+Name[tg]=Gadu-Gadu
+Name[tr]=Gadu-Gadu
+Name[uk]=Gadu-Gadu
+Name[x-test]=xxGadu-Gaduxx
+Name[zh_CN]=Gadu-Gadu
+Name[zh_TW]=Gadu-Gadu
diff --git a/src/improtocols/googletalk.desktop b/src/improtocols/googletalk.desktop
new file mode 100644 (file)
index 0000000..09950b3
--- /dev/null
@@ -0,0 +1,87 @@
+[Desktop Entry]
+Type=Service
+Icon=im-google
+Comment=Google Talk
+Comment[ar]=جوجل توك
+Comment[az]=Google Talk
+Comment[bg]=Google Talk
+Comment[ca]=Google Talk
+Comment[ca@valencia]=Google Talk
+Comment[cs]=Google Talk
+Comment[da]=Google Talk
+Comment[de]=Google Talk
+Comment[el]=Google Talk
+Comment[en_GB]=Google Talk
+Comment[es]=Google Talk
+Comment[et]=Google Talk
+Comment[eu]=Google Talk
+Comment[fi]=Google Talk
+Comment[fr]=Google Talk
+Comment[gl]=Google Talk
+Comment[hu]=Google Talk
+Comment[ia]=Google Talk
+Comment[id]=Google Talk
+Comment[it]=Google Talk
+Comment[ka]=Google Talk
+Comment[ko]=Google 토크
+Comment[lt]=Google Talk
+Comment[nb]=Google Talk
+Comment[nl]=Google Talk
+Comment[nn]=Google Talk
+Comment[pl]=Google Talk
+Comment[pt]=Google Talk
+Comment[pt_BR]=Google Talk
+Comment[ro]=Google Talk
+Comment[ru]=Google Talk
+Comment[sk]=Google Talk
+Comment[sl]=Google Talk
+Comment[sq]=Google Talk
+Comment[sv]=Google Talk
+Comment[tg]=Google Talk
+Comment[tr]=Google Talk
+Comment[uk]=Google Talk
+Comment[x-test]=xxGoogle Talkxx
+Comment[zh_CN]=Google Talk
+Comment[zh_TW]=Google Talk
+Name=Google Talk
+Name[ar]=جوجل توك
+Name[az]=Google Talk
+Name[bg]=Google Talk
+Name[ca]=Google Talk
+Name[ca@valencia]=Google Talk
+Name[cs]=Google Talk
+Name[da]=Google Talk
+Name[de]=Google Talk
+Name[el]=Google Talk
+Name[en_GB]=Google Talk
+Name[es]=Google Talk
+Name[et]=Google Talk
+Name[eu]=Google Talk
+Name[fi]=Google Talk
+Name[fr]=Google Talk
+Name[gl]=Google Talk
+Name[hu]=Google Talk
+Name[ia]=Google Talk
+Name[id]=Google Talk
+Name[it]=Google Talk
+Name[ka]=Google Talk
+Name[ko]=Google 토크
+Name[lt]=Google Talk
+Name[nb]=Google Talk
+Name[nl]=Google Talk
+Name[nn]=Google Talk
+Name[pl]=Google Talk
+Name[pt]=Google Talk
+Name[pt_BR]=Google Talk
+Name[ro]=Google Talk
+Name[ru]=Google Talk
+Name[sk]=Google Talk
+Name[sl]=Google Talk
+Name[sq]=Google Talk
+Name[sv]=Google Talk
+Name[tg]=Google Talk
+Name[tr]=Google Talk
+Name[uk]=Google Talk
+Name[x-test]=xxGoogle Talkxx
+Name[zh_CN]=Google Talk
+Name[zh_TW]=Google Talk
diff --git a/src/improtocols/groupwise.desktop b/src/improtocols/groupwise.desktop
new file mode 100644 (file)
index 0000000..71740cc
--- /dev/null
@@ -0,0 +1,88 @@
+[Desktop Entry]
+Type=Service
+Icon=im-groupwise
+Comment=Novell GroupWise Messenger
+Comment[ar]=نوفل مرسال GroupWise
+Comment[az]=Novell GroupWise Mesenceri
+Comment[bg]=Моментни съобщения GroupWise на Novell
+Comment[ca]=Novell GroupWise Messenger
+Comment[ca@valencia]=Novell GroupWise Messenger
+Comment[cs]=Novell GroupWise komunikátor
+Comment[da]=Novell GroupWise Messenger
+Comment[de]=Novell GroupWise Messenger
+Comment[el]=Novell GroupWise Messenger
+Comment[en_GB]=Novell GroupWise Messenger
+Comment[es]=Novell GroupWise Messenger
+Comment[et]=Novelli GroupWise sõnumirakendus
+Comment[eu]=Novell GroupWise Mezularia
+Comment[fi]=Novell Groupwise -pikaviestin
+Comment[fr]=Messagerie « GroupWise Novell »
+Comment[gl]=Mensaxeiro GroupWise de Novell
+Comment[hu]=Novell GroupWise Messenger
+Comment[ia]=Messagero de GroupWise de Novell
+Comment[id]=Perpesanan GroupWise Novell
+Comment[it]=Novell GroupWise Messenger
+Comment[ka]=Novell GroupWise Messenger
+Comment[ko]=Novell GroupWise 메신저
+Comment[lt]=Novell GroupWise pokalbių programa
+Comment[nb]=Novell GroupWise meldingsprogram
+Comment[nl]=Protocol voor Novell GroupWise Messenger
+Comment[nn]=Lynmeldingstenesta Novell GroupWise
+Comment[pl]=Komunikator Novell GroupWise
+Comment[pt]=Novell GroupWise Messenger
+Comment[pt_BR]=Mensageiro do GroupWise da Novell
+Comment[ro]=Mesager Novell GroupWise
+Comment[ru]=Программа обмена сообщениями Novell GroupWise
+Comment[sk]=Novell GroupWise Messenger
+Comment[sl]=Novell GroupWise Messenger
+Comment[sq]=Novell GroupWise Messenger
+Comment[sv]=Novell GroupWise-meddelandeklient
+Comment[tg]=Паёмнависи Novell GroupWise
+Comment[tr]=Novell GroupWise Messenger
+Comment[uk]=Програма обміну повідомленнями Novell GroupWise
+Comment[x-test]=xxNovell GroupWise Messengerxx
+Comment[zh_CN]=Novell GroupWise Messenger
+Comment[zh_TW]=Novell GroupWise Messenger
+Name=GroupWise
+Name[ar]=GroupWise
+Name[az]=GroupWise
+Name[bg]=GroupWise
+Name[ca]=GroupWise
+Name[ca@valencia]=GroupWise
+Name[cs]=GroupWise
+Name[da]=GroupWise
+Name[de]=GroupWise
+Name[el]=GroupWise
+Name[en_GB]=GroupWise
+Name[es]=GroupWise
+Name[et]=GroupWise
+Name[eu]=GroupWise
+Name[fi]=GroupWise
+Name[fr]=GroupWise
+Name[gl]=GroupWise
+Name[hu]=GroupWise
+Name[ia]=GroupWise
+Name[id]=GroupWise
+Name[it]=GroupWise
+Name[ja]=GroupWise
+Name[ka]=GroupWise
+Name[ko]=GroupWise
+Name[lt]=GroupWise
+Name[nb]=GroupWise
+Name[nl]=GroupWise
+Name[nn]=GroupWise
+Name[pl]=GroupWise
+Name[pt]=GroupWise
+Name[pt_BR]=GroupWise
+Name[ro]=GroupWise
+Name[ru]=GroupWise
+Name[sk]=GroupWise
+Name[sl]=GroupWise
+Name[sq]=GroupWise
+Name[sv]=GroupWise
+Name[tg]=GroupWise
+Name[tr]=GroupWise
+Name[uk]=GroupWise
+Name[x-test]=xxGroupWisexx
+Name[zh_CN]=GroupWise
+Name[zh_TW]=GroupWise
diff --git a/src/improtocols/icq.desktop b/src/improtocols/icq.desktop
new file mode 100644 (file)
index 0000000..387dfc8
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-icq
+Comment=ICQ Protocol
+Comment[ar]=ميفاق ICQ
+Comment[az]=ICQ Protokol
+Comment[bg]=Протокол на ICQ
+Comment[ca]=Protocol ICQ
+Comment[ca@valencia]=Protocol ICQ
+Comment[cs]=Protokol ICQ
+Comment[da]=ICQ-protokollen
+Comment[de]=ICQ-Protokoll
+Comment[el]=ICQ πρωτόκολλο
+Comment[en_GB]=ICQ Protocol
+Comment[es]=Protocolo ICQ
+Comment[et]=ICQ protokoll
+Comment[eu]=ICQ Protokoloa
+Comment[fi]=ICQ-yhteyskäytäntö
+Comment[fr]=Protocole ICQ
+Comment[gl]=Protocolo de ICQ
+Comment[hu]=ICQ protokoll
+Comment[ia]=Protocollo ICQ
+Comment[id]=Protokol ICQ
+Comment[it]=Protocollo ICQ
+Comment[ja]=ICQ プロトコル
+Comment[ka]=ICQ პროტოკოლი
+Comment[ko]=ICQ 프로토콜
+Comment[lt]=ICQ protokolas
+Comment[nb]=ICQ-protokoll
+Comment[nl]=ICQ-protocol
+Comment[nn]=ICQ-protokoll
+Comment[pl]=Protokół ICQ
+Comment[pt]=Protocolo ICQ
+Comment[pt_BR]=Protocolo do ICQ
+Comment[ro]=Protocol ICQ
+Comment[ru]=Протокол ICQ
+Comment[sk]=ICQ Protokol
+Comment[sl]=Protokol ICQ
+Comment[sq]=ICQ Protocol
+Comment[sv]=ICQ-protokoll
+Comment[tg]=Протоколи ICQ
+Comment[tr]=ICQ Protokolü
+Comment[uk]=Протокол ICQ
+Comment[x-test]=xxICQ Protocolxx
+Comment[zh_CN]=ICQ 协议
+Comment[zh_TW]=ICQ 通訊協定
+Name=ICQ
+Name[ar]=آي أر سي
+Name[az]=ICQ
+Name[bg]=ICQ
+Name[ca]=ICQ
+Name[ca@valencia]=ICQ
+Name[cs]=ICQ
+Name[da]=ICQ
+Name[de]=ICQ
+Name[el]=ICQ
+Name[en_GB]=ICQ
+Name[es]=ICQ
+Name[et]=ICQ
+Name[eu]=ICQ
+Name[fi]=ICQ
+Name[fr]=ICQ
+Name[gl]=ICQ
+Name[hu]=ICQ
+Name[ia]=ICQ
+Name[id]=ICQ
+Name[it]=ICQ
+Name[ja]=ICQ
+Name[ka]=ICQ
+Name[ko]=ICQ
+Name[lt]=ICQ
+Name[nb]=ICQ
+Name[nl]=ICQ
+Name[nn]=ICQ
+Name[pl]=ICQ
+Name[pt]=ICQ
+Name[pt_BR]=ICQ
+Name[ro]=ICQ
+Name[ru]=ICQ
+Name[sk]=ICQ
+Name[sl]=ICQ
+Name[sq]=ICQ
+Name[sv]=ICQ
+Name[tg]=ICQ
+Name[tr]=ICQ
+Name[uk]=ICQ
+Name[x-test]=xxICQxx
+Name[zh_CN]=ICQ
+Name[zh_TW]=ICQ
diff --git a/src/improtocols/improtocols.qrc b/src/improtocols/improtocols.qrc
new file mode 100644 (file)
index 0000000..9ea0213
--- /dev/null
@@ -0,0 +1,25 @@
+<RCC>
+    <qresource prefix="/org.kde.kcontacts/improtocols/">
+        <file>aim.desktop</file>
+        <file>facebook.desktop</file>
+        <file>gg.desktop</file>
+        <file>googletalk.desktop</file>
+        <file>groupwise.desktop</file>
+        <file>icq.desktop</file>
+        <file>irc.desktop</file>
+        <file>meanwhile.desktop</file>
+        <file>msn.desktop</file>
+        <file>qq.desktop</file>
+        <file>sip.desktop</file>
+        <file>skype.desktop</file>
+        <file>sms.desktop</file>
+        <file>twitter.desktop</file>
+        <file>xmpp.desktop</file>
+        <file>ymsgr.desktop</file>
+        <file>matrix.desktop</file>
+        <file>telegram.desktop</file>
+        <file>rocketchat.desktop</file>
+        <file>signal.desktop</file>
+        <file>threema.desktop</file>
+    </qresource>
+</RCC>
diff --git a/src/improtocols/irc.desktop b/src/improtocols/irc.desktop
new file mode 100644 (file)
index 0000000..abf00fa
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-irc
+Comment=Internet Relay Chat
+Comment[ar]=بروتوكول الدردشة عبر الإنترنت
+Comment[az]=Internet Relay Chat (IRC)
+Comment[bg]=Internet Relay Chat
+Comment[ca]=Internet Relay Chat
+Comment[ca@valencia]=Internet Relay Chat
+Comment[cs]=Internet Relay Chat
+Comment[da]=Internet Relay Chat
+Comment[de]=Internet Relay Chat
+Comment[el]=Internet Relay Chat
+Comment[en_GB]=Internet Relay Chat
+Comment[es]=Internet Relay Chat
+Comment[et]=IRC
+Comment[eu]=IRC (Internet Relay Chat)
+Comment[fi]=Internet Relay Chat
+Comment[fr]=Internet Relay Chat
+Comment[gl]=Internet Relay Chat
+Comment[hu]=Internet Relay Chat
+Comment[ia]=Internet Relay Chat (IRC)
+Comment[id]=Internet Relay Chat
+Comment[it]=Internet Relay Chat
+Comment[ja]=インターネットリレーチャット
+Comment[ka]=Internet Relay Chat
+Comment[ko]=인터넷 릴레이 채팅
+Comment[lt]=Tiesioginiai pokalbiai internete
+Comment[nb]=Internet Relay Chat
+Comment[nl]=Internet Relay Chat
+Comment[nn]=Internet Relay Chat
+Comment[pl]=Internet Relay Chat
+Comment[pt]=Internet Relay Chat
+Comment[pt_BR]=Bate-papo via Internet (IRC)
+Comment[ro]=Internet Relay Chat
+Comment[ru]=Internet Relay Chat (IRC)
+Comment[sk]=Internet Relay Chat
+Comment[sl]=Internet Relay Chat
+Comment[sq]=Internet Relay Chat
+Comment[sv]=Internet Relay Chat
+Comment[tg]=Суҳбати иттисоли интернетӣ
+Comment[tr]=IRC
+Comment[uk]=Internet Relay Chat
+Comment[x-test]=xxInternet Relay Chatxx
+Comment[zh_CN]=互联网中继聊天
+Comment[zh_TW]=網際網路中繼聊天 (IRC)
+Name=IRC
+Name[ar]=آي أر سي
+Name[az]=IRC
+Name[bg]=IRC
+Name[ca]=IRC
+Name[ca@valencia]=IRC
+Name[cs]=IRC
+Name[da]=IRC
+Name[de]=IRC
+Name[el]=IRC
+Name[en_GB]=IRC
+Name[es]=IRC
+Name[et]=IRC
+Name[eu]=IRC
+Name[fi]=IRC
+Name[fr]=IRC
+Name[gl]=IRC
+Name[hu]=IRC
+Name[ia]=IRC
+Name[id]=IRC
+Name[it]=IRC
+Name[ja]=IRC
+Name[ka]=IRC
+Name[ko]=IRC
+Name[lt]=IRC
+Name[nb]=IRC
+Name[nl]=IRC
+Name[nn]=IRC
+Name[pl]=IRC
+Name[pt]=IRC
+Name[pt_BR]=IRC
+Name[ro]=IRC
+Name[ru]=IRC
+Name[sk]=IRC
+Name[sl]=IRC
+Name[sq]=IRC
+Name[sv]=IRC
+Name[tg]=IRC
+Name[tr]=IRC
+Name[uk]=IRC
+Name[x-test]=xxIRCxx
+Name[zh_CN]=IRC
+Name[zh_TW]=IRC
diff --git a/src/improtocols/matrix.desktop b/src/improtocols/matrix.desktop
new file mode 100644 (file)
index 0000000..022b887
--- /dev/null
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Type=Service
+Comment=Matrix
+Comment[ar]=ماتريكس
+Comment[az]=Matrix
+Comment[bg]=Matrix
+Comment[ca]=Matrix
+Comment[ca@valencia]=Matrix
+Comment[cs]=Matrix
+Comment[de]=Matrix
+Comment[el]=Matrix
+Comment[en_GB]=Matrix
+Comment[es]=Matrix
+Comment[eu]=Matrix
+Comment[fi]=Matrix
+Comment[fr]=Matrix
+Comment[ia]=Matrix
+Comment[it]=Matrix
+Comment[ka]=Matrix
+Comment[ko]=Matrix
+Comment[nl]=Matrix
+Comment[nn]=Matrix
+Comment[pl]=Matrix
+Comment[pt]=Matrix
+Comment[pt_BR]=Matrix
+Comment[ro]=Matrix
+Comment[ru]=Matrix
+Comment[sk]=Matica
+Comment[sl]=Matrix
+Comment[sv]=Matrix
+Comment[tr]=Matrix
+Comment[uk]=Matrix
+Comment[x-test]=xxMatrixxx
+Comment[zh_CN]=Matrix
+Name=Matrix
+Name[ar]=ماتريكس
+Name[az]=Matrix
+Name[bg]=Matrix
+Name[ca]=Matrix
+Name[ca@valencia]=Matrix
+Name[cs]=Matrix
+Name[de]=Matrix
+Name[el]=Matrix
+Name[en_GB]=Matrix
+Name[es]=Matrix
+Name[eu]=Matrix
+Name[fi]=Matrix
+Name[fr]=Matrix
+Name[ia]=Matrix
+Name[it]=Matrix
+Name[ka]=Matrix
+Name[ko]=Matrix
+Name[nl]=Matrix
+Name[nn]=Matrix
+Name[pl]=Matrix
+Name[pt]=Matrix
+Name[pt_BR]=Matrix
+Name[ro]=Matrix
+Name[ru]=Matrix
+Name[sk]=Matica
+Name[sl]=Matrix
+Name[sv]=Matrix
+Name[tr]=Matrix
+Name[uk]=Matrix
+Name[x-test]=xxMatrixxx
+Name[zh_CN]=Matrix
diff --git a/src/improtocols/meanwhile.desktop b/src/improtocols/meanwhile.desktop
new file mode 100644 (file)
index 0000000..5f0d451
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-meanwhile
+Comment=Meanwhile Protocol
+Comment[ar]=ميفاق Meanwhile
+Comment[az]=Meanwhile Protokolu
+Comment[bg]=Протокол на Meanwhile
+Comment[ca]=Protocol Meanwhile
+Comment[ca@valencia]=Protocol Meanwhile
+Comment[cs]=Protokol Meanwhile
+Comment[da]=Meanwhile-protokollen
+Comment[de]=Meanwhile-Protokoll
+Comment[el]=Meanwhile πρωτόκολλο
+Comment[en_GB]=Meanwhile Protocol
+Comment[es]=Protocolo Meanwhile
+Comment[et]=Meanwhile protokoll
+Comment[eu]=Meanwhile Protokoloa
+Comment[fi]=Meanwhile-yhteyskäytäntö
+Comment[fr]=Protocole « Meanwhile »
+Comment[gl]=Protocolo de Meanwhile
+Comment[hu]=Meanwhile protokoll
+Comment[ia]=Protocollo Meanwhile
+Comment[id]=Protokol Meanwhile
+Comment[it]=Protocollo Meanwhile
+Comment[ja]=Meanwhile プロトコル
+Comment[ka]=Meanwhile პროტოკოლი
+Comment[ko]=Meanwhile 프로토콜
+Comment[lt]=Meanwhile protokolas
+Comment[nb]=Meanwhile-protokoll
+Comment[nl]=Meanwhile-protocol
+Comment[nn]=Meanwhile-protokoll
+Comment[pl]=Protokół Meanwhile
+Comment[pt]=Protocolo Meanwhile
+Comment[pt_BR]=Protocolo do Meanwhile
+Comment[ro]=Protocol Meanwhile
+Comment[ru]=Протокол Meanwhile
+Comment[sk]=Meanwhile Protokol
+Comment[sl]=Protokol Meanwhile
+Comment[sq]=Meanwhile Protocol
+Comment[sv]=Meanwhile-protokoll
+Comment[tg]=Протоколи Meanwhile
+Comment[tr]=Meanwhile Protokolü
+Comment[uk]=Протокол Meanwhile
+Comment[x-test]=xxMeanwhile Protocolxx
+Comment[zh_CN]=Meanwhile 协议
+Comment[zh_TW]=Meanwhile 通訊協定
+Name=Meanwhile
+Name[ar]=Meanwhile
+Name[az]=Meanwhile
+Name[bg]=Meanwhile
+Name[ca]=Meanwhile
+Name[ca@valencia]=Meanwhile
+Name[cs]=Meanwhile
+Name[da]=Meanwhile
+Name[de]=Meanwhile
+Name[el]=Meanwhile
+Name[en_GB]=Meanwhile
+Name[es]=Meanwhile
+Name[et]=Meanwhile
+Name[eu]=Meanwhile
+Name[fi]=Meanwhile
+Name[fr]=Meanwhile
+Name[gl]=Meanwhile
+Name[hu]=Meanwhile
+Name[ia]=Meanwhile
+Name[id]=Meanwhile
+Name[it]=Meanwhile
+Name[ja]=Meanwhile
+Name[ka]=Meanwhile
+Name[ko]=Meanwhile
+Name[lt]=Meanwhile
+Name[nb]=Meanwhile
+Name[nl]=Meanwhile
+Name[nn]=Meanwhile
+Name[pl]=Meanwhile
+Name[pt]=Meanwhile
+Name[pt_BR]=Meanwhile
+Name[ro]=Meanwhile
+Name[ru]=Meanwhile
+Name[sk]=Meanwhile
+Name[sl]=Meanwhile
+Name[sq]=Meanwhile
+Name[sv]=Meanwhile
+Name[tg]=Meanwhile
+Name[tr]=Meanwhile
+Name[uk]=Meanwhile
+Name[x-test]=xxMeanwhilexx
+Name[zh_CN]=Meanwhile
+Name[zh_TW]=Meanwhile
diff --git a/src/improtocols/msn.desktop b/src/improtocols/msn.desktop
new file mode 100644 (file)
index 0000000..7f0ef2c
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-msn
+Comment=MSN Messenger
+Comment[ar]=مرسال ام اس ان
+Comment[az]=MSN Mesencer
+Comment[bg]=MSN Messenger
+Comment[ca]=MSN Messenger
+Comment[ca@valencia]=MSN Messenger
+Comment[cs]=MSN Messenger
+Comment[da]=MSN Messenger
+Comment[de]=MSN Messenger
+Comment[el]=MSN Messenger
+Comment[en_GB]=MSN Messenger
+Comment[es]=MSN Messenger
+Comment[et]=MSN Messenger
+Comment[eu]=MSN Mezularia
+Comment[fi]=MSN Messenger
+Comment[fr]=Messagerie MSN
+Comment[gl]=MSN Messenger
+Comment[hu]=MSN Messenger
+Comment[ia]=Messaggero MSN
+Comment[id]=Perpesanan MSN
+Comment[it]=MSN Messenger
+Comment[ja]=MSN メッセンジャー
+Comment[ka]=MSN მესინჯერი
+Comment[ko]=MSN 메신저
+Comment[lt]=MSN pokalbių programa
+Comment[nb]=MSN Messenger
+Comment[nl]=MSN Messenger
+Comment[nn]=MSN Messenger
+Comment[pl]=MSN Messenger
+Comment[pt]=MSN Messenger
+Comment[pt_BR]=MSN Messenger
+Comment[ro]=Mesager MSN
+Comment[ru]=Обмен сообщениями MSN
+Comment[sk]=MSN Messenger
+Comment[sl]=MSN Messenger
+Comment[sq]=MSN Messenger
+Comment[sv]=MSN Messenger
+Comment[tg]=Паёмнависи MSN
+Comment[tr]=MSN Messenger
+Comment[uk]=MSN Messenger
+Comment[x-test]=xxMSN Messengerxx
+Comment[zh_CN]=MSN Messenger
+Comment[zh_TW]=MSN Messenger
+Name=MSN Messenger
+Name[ar]=مرسال ام اس ان
+Name[az]=MSN Mesencer
+Name[bg]=MSN Messenger
+Name[ca]=MSN Messenger
+Name[ca@valencia]=MSN Messenger
+Name[cs]=MSN Messenger
+Name[da]=MSN Messenger
+Name[de]=MSN Messenger
+Name[el]=MSN Messenger
+Name[en_GB]=MSN Messenger
+Name[es]=MSN Messenger
+Name[et]=MSN Messenger
+Name[eu]=MSN Mezularia
+Name[fi]=MSN Messenger
+Name[fr]=Messagerie MSN
+Name[gl]=MSN Messenger
+Name[hu]=MSN Messenger
+Name[ia]=Messaggero MSN
+Name[id]=MSN Messenger
+Name[it]=MSN Messenger
+Name[ja]=MSN メッセンジャー
+Name[ka]=MSN მესინჯერი
+Name[ko]=MSN 메신저
+Name[lt]=MSN pokalbių programa
+Name[nb]=MSN Messenger
+Name[nl]=MSN Messenger
+Name[nn]=MSN Messenger
+Name[pl]=MSN Messenger
+Name[pt]=MSN Messenger
+Name[pt_BR]=MSN Messenger
+Name[ro]=Mesager MSN
+Name[ru]=MSN Messenger
+Name[sk]=MSN Messenger
+Name[sl]=MSN Messenger
+Name[sq]=MSN Messenger
+Name[sv]=MSN Messenger
+Name[tg]=Паёмнависи MSN
+Name[tr]=MSN Messenger
+Name[uk]=MSN Messenger
+Name[x-test]=xxMSN Messengerxx
+Name[zh_CN]=MSN Messenger
+Name[zh_TW]=MSN Messenger
diff --git a/src/improtocols/qq.desktop b/src/improtocols/qq.desktop
new file mode 100644 (file)
index 0000000..97b5f9d
--- /dev/null
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Icon=im-qq
+Comment=Tencent QQ Messaging
+Comment[ar]=رسائل ترانسنت QQ
+Comment[az]=Tencent QQ Mesajlaşma
+Comment[bg]=Tencent QQ съобщения
+Comment[ca]=Missatgeria Tencent QQ
+Comment[ca@valencia]=Missatgeria Tencent QQ
+Comment[cs]=Zprávy Tencent QQ
+Comment[da]=Tencent QQ Messaging
+Comment[de]=Tencent QQ Messaging
+Comment[el]=Tencent QQ Messaging
+Comment[en_GB]=Tencent QQ Messaging
+Comment[es]=Mensajería Tencent QQ
+Comment[et]=Tencent QQ snumirakendus
+Comment[eu]=Tencent QQ Mezularitza
+Comment[fi]=Tencent QQ -pikaviestintä
+Comment[fr]=Messagerie « QQ » de Tencent
+Comment[gl]=Tencent QQ Messaging
+Comment[hu]=Tencent QQ üzenetküldés
+Comment[ia]=Tencent QQ Messaging
+Comment[id]=Perpesanan Tencent QQ
+Comment[it]=Messaggistica Tencent QQ
+Comment[ka]=Tencent QQ შეტყობინებები
+Comment[ko]=Tencent QQ 메시징
+Comment[lt]=Tencent QQ pranešimų perdavimas
+Comment[nl]=Tencent QQ Messaging
+Comment[nn]=Tencent QQ-lynmeldingar
+Comment[pl]=Wiadomości Tencent QQ
+Comment[pt]=Mensagens do Tencent QQ
+Comment[pt_BR]=Mensagens do Tencent QQ
+Comment[ro]=Mesagerie Tencent QQ
+Comment[ru]=Обмен сообщениями Tencent QQ
+Comment[sk]=Tencent QQ Messaging
+Comment[sl]=Sporočanje Tencent QQ
+Comment[sq]=Tencent QQ Messaging
+Comment[sv]=Tencent QQ-meddelandeklient
+Comment[tg]=Паёмнависи Tencent QQ
+Comment[tr]=Tencent QQ Messaging
+Comment[uk]=Обмін повідомленнями Tencent QQ
+Comment[x-test]=xxTencent QQ Messagingxx
+Comment[zh_CN]=腾讯 QQ 聊天
+Comment[zh_TW]=Tencent QQ 通訊
+Name=QQ
+Name[ar]=QQ
+Name[az]=QQ
+Name[bg]=QQ
+Name[ca]=QQ
+Name[ca@valencia]=QQ
+Name[cs]=QQ
+Name[da]=QQ
+Name[de]=QQ
+Name[el]=QQ
+Name[en_GB]=QQ
+Name[es]=QQ
+Name[et]=QQ
+Name[eu]=QQ
+Name[fi]=QQ
+Name[fr]=QQ
+Name[gl]=QQ
+Name[hu]=QQ
+Name[ia]=QQ
+Name[id]=QQ
+Name[it]=QQ
+Name[ka]=QQ
+Name[ko]=QQ
+Name[lt]=QQ
+Name[nl]=QQ
+Name[nn]=QQ
+Name[pl]=QQ
+Name[pt]=QQ
+Name[pt_BR]=QQ
+Name[ro]=QQ
+Name[ru]=QQ
+Name[sk]=QQ
+Name[sl]=QQ
+Name[sq]=QQ
+Name[sv]=QQ
+Name[tg]=QQ
+Name[tr]=QQ
+Name[uk]=QQ
+Name[x-test]=xxQQxx
+Name[zh_CN]=QQ
+Name[zh_TW]=QQ
diff --git a/src/improtocols/rocketchat.desktop b/src/improtocols/rocketchat.desktop
new file mode 100644 (file)
index 0000000..4430742
--- /dev/null
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Type=Service
+Comment=RocketChat
+Comment[ar]=روكيت تشات
+Comment[bg]=RocketChat
+Comment[ca]=RocketChat
+Comment[ca@valencia]=RocketChat
+Comment[cs]=RocketChat
+Comment[de]=RocketChat
+Comment[el]=RocketChat
+Comment[en_GB]=RocketChat
+Comment[es]=RocketChat
+Comment[eu]=RocketChat
+Comment[fr]=RocketChat
+Comment[ia]=RocketChat
+Comment[it]=RocketChat
+Comment[ka]=RocketChat
+Comment[nl]=RocketChat
+Comment[nn]=RocketChat
+Comment[pl]=RocketChat
+Comment[pt]=RocketChat
+Comment[pt_BR]=RocketChat
+Comment[sl]=RocketChat
+Comment[tr]=RocketChat
+Comment[uk]=RocketChat
+Comment[x-test]=xxRocketChatxx
+Name=RocketChat
+Name[ar]=روكيت تشات
+Name[bg]=RocketChat
+Name[ca]=RocketChat
+Name[ca@valencia]=RocketChat
+Name[cs]=RocketChat
+Name[de]=RocketChat
+Name[el]=RocketChat
+Name[en_GB]=RocketChat
+Name[es]=RocketChat
+Name[eu]=RocketChat
+Name[fr]=RocketChat
+Name[ia]=RocketChat
+Name[it]=RocketChat
+Name[ka]=RocketChat
+Name[nl]=RocketChat
+Name[nn]=RocketChat
+Name[pl]=RocketChat
+Name[pt]=RocketChat
+Name[pt_BR]=RocketChat
+Name[sl]=RocketChat
+Name[tr]=RocketChat
+Name[uk]=RocketChat
+Name[x-test]=xxRocketChatxx
diff --git a/src/improtocols/signal.desktop b/src/improtocols/signal.desktop
new file mode 100644 (file)
index 0000000..f0cf0ba
--- /dev/null
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Type=Service
+Comment=Signal
+Comment[ar]=سيجنال
+Comment[bg]=Signal
+Comment[ca]=Signal
+Comment[ca@valencia]=Signal
+Comment[cs]=Signal
+Comment[de]=Signal
+Comment[el]=Signal
+Comment[en_GB]=Signal
+Comment[es]=Signal
+Comment[eu]=Signal
+Comment[fr]=Signal
+Comment[ia]=Signal
+Comment[it]=Signal
+Comment[ka]=Signal
+Comment[nl]=Signaal
+Comment[nn]=Signal
+Comment[pl]=Signal
+Comment[pt]=Signal
+Comment[pt_BR]=Signal
+Comment[sl]=Signal
+Comment[tr]=Signal
+Comment[uk]=Сигнал
+Comment[x-test]=xxSignalxx
+Name=Signal
+Name[ar]=سيجنال
+Name[bg]=Signal
+Name[ca]=Signal
+Name[ca@valencia]=Signal
+Name[cs]=Signal
+Name[de]=Signal
+Name[el]=Signal
+Name[en_GB]=Signal
+Name[es]=Signal
+Name[eu]=Signal
+Name[fr]=Signal
+Name[ia]=Signal
+Name[it]=Signal
+Name[ka]=Signal
+Name[nl]=Signaal
+Name[nn]=Signal
+Name[pl]=Signal
+Name[pt]=Signal
+Name[pt_BR]=Signal
+Name[sl]=Signal
+Name[tr]=Signal
+Name[uk]=Сигнал
+Name[x-test]=xxSignalxx
diff --git a/src/improtocols/sip.desktop b/src/improtocols/sip.desktop
new file mode 100644 (file)
index 0000000..9606f03
--- /dev/null
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Type=Service
+Icon=internet-telephone
+Comment=Session Initiation Protocol
+Comment[ar]=بروتوكول بدء جلسة
+Comment[az]=Session İnitial Protocol (SİP)
+Comment[bg]=Session Initiation Protocol
+Comment[ca]=Protocol per a la iniciació de la sessió
+Comment[ca@valencia]=Protocol per a la iniciació de la sessió
+Comment[cs]=Session Initiation Protocol (SIP)
+Comment[da]=Sessionsinitiering-protokollen
+Comment[de]=Session Initiation Protocol
+Comment[el]=Session Initiation Protocol
+Comment[en_GB]=Session Initiation Protocol
+Comment[es]=Protocolo de inicio de sesión
+Comment[et]=SIP
+Comment[eu]=SIP (Saioa Hasieratzeko Protokoloa)
+Comment[fi]=Istunnonalustusyhteyskäytäntö
+Comment[fr]=Session Initiation Protocol
+Comment[gl]=Protocolo de inicio de sesión
+Comment[hu]=Session Initiation Protocol
+Comment[ia]=Session Initiation Protocol (Protocollo de initiation de session)
+Comment[id]=Protokol Permulaan Sesi
+Comment[it]=Session Initiation Protocol
+Comment[ka]=Session Initiation Protocol
+Comment[ko]=세션 연결 프로토콜(SIP)
+Comment[lt]=Session Initiation protokolas
+Comment[nl]=Session Initiation Protocol
+Comment[nn]=Session Initiation Protocol
+Comment[pl]=Session Initiation Protocol
+Comment[pt]=Protocolo de Início de Sessão
+Comment[pt_BR]=Protocolo de Iniciação de Sessão
+Comment[ro]=Protocol de Inițiere a Sesiunii
+Comment[ru]=Session Initiation Protocol (SIP)
+Comment[sk]=Session Initiation Protokol
+Comment[sl]=Session Initiation Protocol
+Comment[sq]=Session Initiation Protocol
+Comment[sv]=Sessionsinitieringsprotokoll
+Comment[tg]=Протоколи омодасозии ҷаласа
+Comment[tr]=Oturum İlklendirme Protokolü
+Comment[uk]=Session Initiation Protocol
+Comment[x-test]=xxSession Initiation Protocolxx
+Comment[zh_CN]=会话初始化协议
+Comment[zh_TW]=對話啟動協定 (SIP)
+Name=SIP
+Name[ar]=SIP
+Name[az]=SİP
+Name[bg]=SIP
+Name[ca]=SIP
+Name[ca@valencia]=SIP
+Name[cs]=SIP
+Name[da]=SIP
+Name[de]=SIP
+Name[el]=SIP
+Name[en_GB]=SIP
+Name[es]=SIP
+Name[et]=SIP
+Name[eu]=SIP
+Name[fi]=SIP
+Name[fr]=SIP
+Name[gl]=SIP
+Name[hu]=SIP
+Name[ia]=SIP
+Name[id]=SIP
+Name[it]=SIP
+Name[ka]=SIP
+Name[ko]=SIP
+Name[lt]=SIP
+Name[nl]=SIP
+Name[nn]=SIP
+Name[pl]=SIP
+Name[pt]=SIP
+Name[pt_BR]=SIP
+Name[ro]=SIP
+Name[ru]=SIP
+Name[sk]=SIP
+Name[sl]=SIP
+Name[sq]=SIP
+Name[sv]=SIP
+Name[tg]=SIP
+Name[tr]=SIP
+Name[uk]=SIP
+Name[x-test]=xxSIPxx
+Name[zh_CN]=SIP
+Name[zh_TW]=SIP
diff --git a/src/improtocols/skype.desktop b/src/improtocols/skype.desktop
new file mode 100644 (file)
index 0000000..5cb5256
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-skype
+Comment=Skype Internet Telephony
+Comment[ar]=الاتصال عبر الإنترنت سكايب
+Comment[az]=Skype
+Comment[bg]=Skype Internet Telephony
+Comment[ca]=Telefonia d'Internet Skype
+Comment[ca@valencia]=Telefonia d'Internet Skype
+Comment[cs]=Internetová telefonie Skype
+Comment[da]=Skype internettelefoni
+Comment[de]=Skype-Internet-Telefonie
+Comment[el]=Skype Internet Telephony
+Comment[en_GB]=Skype Internet Telephony
+Comment[es]=Telefonía por Internet de Skype
+Comment[et]=Internetitelefon Skype
+Comment[eu]=Skype Internet Telefonia
+Comment[fi]=Skype-internetpuhelin
+Comment[fr]=Téléphonie Internet Skype
+Comment[gl]=Skype Internet Telephony
+Comment[hu]=Skype internetes telefonálás
+Comment[ia]=Telephonia Internet de Skype
+Comment[id]=Telepon Internet Skype
+Comment[it]=Telefonia su Internet di Skype
+Comment[ja]=Skype インターネット電話
+Comment[ka]=Skype Internet Telephony
+Comment[ko]=Skype 인터넷 전화
+Comment[lt]=Skype interneto telefonija
+Comment[nb]=Skype IP-telefoni
+Comment[nl]=Skype internet-telefonie
+Comment[nn]=Skype Internett-telefoni
+Comment[pl]=Internetowa telefonia Skype
+Comment[pt]=Telefonia Internet Skype
+Comment[pt_BR]=Telefonia Internet Skype
+Comment[ro]=Telefonie pin internet Skype
+Comment[ru]=Skype
+Comment[sk]=Skype Internet Telephony
+Comment[sl]=Skype internetna telefonija
+Comment[sq]=Skype Internet Telephony
+Comment[sv]=Skype Internettelefoni
+Comment[tg]=Телефони интернетии Skype
+Comment[tr]=Skype İnternet Telefonu
+Comment[uk]=Інтернет-телефонія Skype
+Comment[x-test]=xxSkype Internet Telephonyxx
+Comment[zh_CN]=Skype 互联网电话
+Comment[zh_TW]=Skype 網路電話
+Name=Skype
+Name[ar]=سكايب
+Name[az]=Skype
+Name[bg]=Skype
+Name[ca]=Skype
+Name[ca@valencia]=Skype
+Name[cs]=Skype
+Name[da]=Skype
+Name[de]=Skype
+Name[el]=Skype
+Name[en_GB]=Skype
+Name[es]=Skype
+Name[et]=Skype
+Name[eu]=Skype
+Name[fi]=Skype
+Name[fr]=Skype
+Name[gl]=Skype
+Name[hu]=Skype
+Name[ia]=Skype
+Name[id]=Skype
+Name[it]=Skype
+Name[ja]=Skype
+Name[ka]=Skype
+Name[ko]=Skype
+Name[lt]=Skype
+Name[nb]=Skype
+Name[nl]=Skype
+Name[nn]=Skype
+Name[pl]=Skype
+Name[pt]=Skype
+Name[pt_BR]=Skype
+Name[ro]=Skype
+Name[ru]=Skype
+Name[sk]=Skype
+Name[sl]=Skype
+Name[sq]=Skype
+Name[sv]=Skype
+Name[tg]=Skype
+Name[tr]=Skype
+Name[uk]=Skype
+Name[x-test]=xxSkypexx
+Name[zh_CN]=Skype
+Name[zh_TW]=Skype
diff --git a/src/improtocols/sms.desktop b/src/improtocols/sms.desktop
new file mode 100644 (file)
index 0000000..48e6dd3
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-sms
+Comment=SMS Protocol
+Comment[ar]=ميفاق خدمة الرسائل القصيرة
+Comment[az]=SMS Protokolu
+Comment[bg]=Протокол SMS
+Comment[ca]=Protocol SMS
+Comment[ca@valencia]=Protocol SMS
+Comment[cs]=SMS protokol
+Comment[da]=SMS-protokollen
+Comment[de]=SMS-Protokoll
+Comment[el]=SMS πρωτόκολλο
+Comment[en_GB]=SMS Protocol
+Comment[es]=Protocolo SMS
+Comment[et]=SMS protokoll
+Comment[eu]=SMS Protokoloa
+Comment[fi]=Tekstiviestiyhteyskäytäntö
+Comment[fr]=Protocole SMS
+Comment[gl]=Protocolo de SMS
+Comment[hu]=SMS protokoll
+Comment[ia]=Protocollo SMS
+Comment[id]=Protokol SMS
+Comment[it]=Protocollo SMS
+Comment[ja]=SMS プロトコル
+Comment[ka]=SMS პროტოკოლი
+Comment[ko]=SMS 프로토콜
+Comment[lt]=SMS protokolas
+Comment[nb]=SMS Protokoll
+Comment[nl]=SMS-protocol
+Comment[nn]=SMS-protokoll
+Comment[pl]=Protokół SMS
+Comment[pt]=Protocolo SMS
+Comment[pt_BR]=Protocolo SMS
+Comment[ro]=Protocol SMS
+Comment[ru]=Протокол SMS
+Comment[sk]=SMS Protokol
+Comment[sl]=Protokol SMS
+Comment[sq]=SMS Protocol
+Comment[sv]=SMS-protokoll
+Comment[tg]=Протоколи СМС
+Comment[tr]=SMS Protokolü
+Comment[uk]=Протокол SMS
+Comment[x-test]=xxSMS Protocolxx
+Comment[zh_CN]=短信协议
+Comment[zh_TW]=SMS 通訊協定
+Name=SMS
+Name[ar]=اس ام اس
+Name[az]=SMS
+Name[bg]=SMS
+Name[ca]=SMS
+Name[ca@valencia]=SMS
+Name[cs]=SMS
+Name[da]=SMS
+Name[de]=SMS
+Name[el]=SMS
+Name[en_GB]=SMS
+Name[es]=SMS
+Name[et]=SMS
+Name[eu]=SMS
+Name[fi]=Tekstiviesti
+Name[fr]=SMS
+Name[gl]=SMS
+Name[hu]=SMS
+Name[ia]=SMS
+Name[id]=SMS
+Name[it]=SMS
+Name[ja]=SMS
+Name[ka]=SMS
+Name[ko]=SMS
+Name[lt]=SMS
+Name[nb]=SMS
+Name[nl]=SMS
+Name[nn]=SMS
+Name[pl]=SMS
+Name[pt]=SMS
+Name[pt_BR]=SMS
+Name[ro]=SMS
+Name[ru]=SMS
+Name[sk]=SMS
+Name[sl]=SMS
+Name[sq]=SMS
+Name[sv]=SMS
+Name[tg]=СМС
+Name[tr]=SMS
+Name[uk]=SMS
+Name[x-test]=xxSMSxx
+Name[zh_CN]=短信
+Name[zh_TW]=SMS
diff --git a/src/improtocols/telegram.desktop b/src/improtocols/telegram.desktop
new file mode 100644 (file)
index 0000000..2131026
--- /dev/null
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Type=Service
+Comment=Telegram
+Comment[ar]=تلغرام
+Comment[az]=Teleqram
+Comment[bg]=Telegram
+Comment[ca]=Telegram
+Comment[ca@valencia]=Telegram
+Comment[cs]=Telegram
+Comment[de]=Telegram
+Comment[el]=Telegram
+Comment[en_GB]=Telegram
+Comment[es]=Telegram
+Comment[eu]=Telegram
+Comment[fi]=Telegram
+Comment[fr]=Telegram
+Comment[ia]=Telegram
+Comment[it]=Telegram
+Comment[ka]=ტელეგრამი
+Comment[ko]=텔레그램
+Comment[nl]=Telegram
+Comment[nn]=Telegram
+Comment[pl]=Telegram
+Comment[pt]=Telegram
+Comment[pt_BR]=Telegram
+Comment[ro]=Telegram
+Comment[ru]=Telegram
+Comment[sk]=Telegram
+Comment[sl]=Telegram
+Comment[sv]=Telegram
+Comment[tr]=Telegram
+Comment[uk]=Telegram
+Comment[x-test]=xxTelegramxx
+Comment[zh_CN]=Telegram
+Name=Telegram
+Name[ar]=تلغرام
+Name[az]=Teleqram
+Name[bg]=Telegram
+Name[ca]=Telegram
+Name[ca@valencia]=Telegram
+Name[cs]=Telegram
+Name[de]=Telegram
+Name[el]=Telegram
+Name[en_GB]=Telegram
+Name[es]=Telegram
+Name[eu]=Telegram
+Name[fi]=Telegram
+Name[fr]=Telegram
+Name[ia]=Telegram
+Name[it]=Telegram
+Name[ka]=ტელეგრამი
+Name[ko]=텔레그램
+Name[nl]=Telegram
+Name[nn]=Telegram
+Name[pl]=Telegram
+Name[pt]=Telegram
+Name[pt_BR]=Telegram
+Name[ro]=Telegram
+Name[ru]=Telegram
+Name[sk]=Telegram
+Name[sl]=Telegram
+Name[sv]=Telegram
+Name[tr]=Telegram
+Name[uk]=Telegram
+Name[x-test]=xxTelegramxx
+Name[zh_CN]=Telegram
diff --git a/src/improtocols/threema.desktop b/src/improtocols/threema.desktop
new file mode 100644 (file)
index 0000000..cbcd6df
--- /dev/null
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Type=Service
+Comment=Threema
+Comment[ar]=ثریما
+Comment[bg]=Threema
+Comment[ca]=Threema
+Comment[ca@valencia]=Threema
+Comment[cs]=Threema
+Comment[de]=Threema
+Comment[el]=Threema
+Comment[en_GB]=Threema
+Comment[es]=Threema
+Comment[eu]=Threema
+Comment[fr]=Threema
+Comment[ia]=Threema
+Comment[it]=Threema
+Comment[ka]=Threema
+Comment[nl]=Threema
+Comment[nn]=Threema
+Comment[pl]=Threema
+Comment[pt]=Threema
+Comment[pt_BR]=Threema
+Comment[sl]=Threema
+Comment[tr]=Threema
+Comment[uk]=Threema
+Comment[x-test]=xxThreemaxx
+Name=Threema
+Name[ar]=ثریما
+Name[bg]=Threema
+Name[ca]=Threema
+Name[ca@valencia]=Threema
+Name[cs]=Threema
+Name[de]=Threema
+Name[el]=Threema
+Name[en_GB]=Threema
+Name[es]=Threema
+Name[eu]=Threema
+Name[fr]=Threema
+Name[ia]=Threema
+Name[it]=Threema
+Name[ka]=Threema
+Name[nl]=Threema
+Name[nn]=Threema
+Name[pl]=Threema
+Name[pt]=Threema
+Name[pt_BR]=Threema
+Name[sl]=Threema
+Name[tr]=Threema
+Name[uk]=Threema
+Name[x-test]=xxThreemaxx
diff --git a/src/improtocols/twitter.desktop b/src/improtocols/twitter.desktop
new file mode 100644 (file)
index 0000000..3fcbdd5
--- /dev/null
@@ -0,0 +1,86 @@
+[Desktop Entry]
+Type=Service
+Icon=im-twitter
+Comment=Twitter Protocol
+Comment[ar]=ميفاق تويتر
+Comment[az]=Twitter Protokolu
+Comment[bg]=Протокол на Twitter
+Comment[ca]=Protocol Twitter
+Comment[ca@valencia]=Protocol Twitter
+Comment[cs]=Protokol Twitter
+Comment[da]=Twitter-protokollen
+Comment[de]=Twitter-Protokoll
+Comment[el]=Twitter πρωτόκολλο
+Comment[en_GB]=Twitter Protocol
+Comment[es]=Protocolo Twitter
+Comment[et]=Twitteri protokoll
+Comment[eu]=Twitter Protokoloa
+Comment[fi]=Twitter-yhteyskäytäntö
+Comment[fr]=Protocole Twitter
+Comment[gl]=Protocolo de Twitter
+Comment[hu]=Twitter protokoll
+Comment[ia]=Protocollo de Twitter
+Comment[id]=Protokol Twitter
+Comment[it]=Protocollo di Twitter
+Comment[ka]=Twitter პროტოკოლი
+Comment[ko]=트위터 프로토콜
+Comment[lt]=Twitter protokolas
+Comment[nl]=Twitter-protocol
+Comment[nn]=Twitter-protokoll
+Comment[pl]=Protokół Twittera
+Comment[pt]=Protocolo do Twitter
+Comment[pt_BR]=Protocolo do Twitter
+Comment[ro]=Protocol Twitter
+Comment[ru]=Протокол Twitter
+Comment[sk]=Twitter Protokol
+Comment[sl]=Protokol Twitter
+Comment[sq]=Twitter Protocol
+Comment[sv]=Twitter-protokoll
+Comment[tg]=Протоколи Twitter
+Comment[tr]=Twitter Protokolü
+Comment[uk]=Протокол Twitter
+Comment[x-test]=xxTwitter Protocolxx
+Comment[zh_CN]=Twitter 协议
+Comment[zh_TW]=Twitter 通訊協定
+Name=Twitter
+Name[ar]=تويتر
+Name[az]=Twitter
+Name[bg]=Twitter
+Name[ca]=Twitter
+Name[ca@valencia]=Twitter
+Name[cs]=Twitter
+Name[da]=Twitter
+Name[de]=Twitter
+Name[el]=Twitter
+Name[en_GB]=Twitter
+Name[es]=Twitter
+Name[et]=Twitter
+Name[eu]=Twitter
+Name[fi]=Twitter
+Name[fr]=Twitter
+Name[gl]=Twitter
+Name[hu]=Twitter
+Name[ia]=Twitter
+Name[id]=Twitter
+Name[it]=Twitter
+Name[ka]=Twitter
+Name[ko]=트위터
+Name[lt]=Twitter
+Name[nb]=Twitter
+Name[nl]=Twitter
+Name[nn]=Twitter
+Name[pl]=Twitter
+Name[pt]=Twitter
+Name[pt_BR]=Twitter
+Name[ro]=Twitter
+Name[ru]=Twitter
+Name[sk]=Twitter
+Name[sl]=Twitter
+Name[sq]=Twitter
+Name[sv]=Twitter
+Name[tg]=Twitter
+Name[tr]=Twitter
+Name[uk]=Twitter
+Name[x-test]=xxTwitterxx
+Name[zh_CN]=Twitter
+Name[zh_TW]=Twitter
diff --git a/src/improtocols/xmpp.desktop b/src/improtocols/xmpp.desktop
new file mode 100644 (file)
index 0000000..894ab72
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-jabber
+Comment=Jabber Protocol
+Comment[ar]=ميفاق جابر
+Comment[az]=Jabber Protokolu
+Comment[bg]=Протокол на Jabber
+Comment[ca]=Protocol Jabber
+Comment[ca@valencia]=Protocol Jabber
+Comment[cs]=Protokol Jabber
+Comment[da]=Jabber-protokollen
+Comment[de]=Jabber-Protokoll
+Comment[el]=Jabber πρωτόκολλο
+Comment[en_GB]=Jabber Protocol
+Comment[es]=Protocolo Jabber
+Comment[et]=Jabberi protokoll
+Comment[eu]=Jabber Protokoloa
+Comment[fi]=Jabber-yhteyskäytäntö
+Comment[fr]=Protocole Jabber
+Comment[gl]=Protocolo de Jabber
+Comment[hu]=Jabber protokoll
+Comment[ia]=Protocollo Jabber
+Comment[id]=Protokol Jabber
+Comment[it]=Protocollo Jabber
+Comment[ja]=Jabber プロトコル
+Comment[ka]=ჯაბერის პროტოკოლი
+Comment[ko]=Jabber 프로토콜
+Comment[lt]=Jabber protokolas
+Comment[nb]=Jabber-protokoll
+Comment[nl]=Jabber-protocol
+Comment[nn]=Jabber-protokoll
+Comment[pl]=Protokół Jabber
+Comment[pt]=Protocolo Jabber
+Comment[pt_BR]=Protocolo do Jabber
+Comment[ro]=Protocol Jabber
+Comment[ru]=Протокол Jabber
+Comment[sk]=Jabber Protokol
+Comment[sl]=Protokol Jabber
+Comment[sq]=Jabber Protocol
+Comment[sv]=Jabber-protokoll
+Comment[tg]=Протоколи Jabber
+Comment[tr]=Jabber Protokolü
+Comment[uk]=Протокол Jabber
+Comment[x-test]=xxJabber Protocolxx
+Comment[zh_CN]=Jabber 协议
+Comment[zh_TW]=Jabber 通訊協定
+Name=Jabber
+Name[ar]=جابر
+Name[az]=Jabber
+Name[bg]=Jabber
+Name[ca]=Jabber
+Name[ca@valencia]=Jabber
+Name[cs]=Jabber
+Name[da]=Jabber
+Name[de]=Jabber
+Name[el]=Jabber
+Name[en_GB]=Jabber
+Name[es]=Jabber
+Name[et]=Jabber
+Name[eu]=Jabber
+Name[fi]=Jabber
+Name[fr]=Jabber
+Name[gl]=Jabber
+Name[hu]=Jabber
+Name[ia]=Jabber
+Name[id]=Jabber
+Name[it]=Jabber
+Name[ja]=Jabber
+Name[ka]=Jabber
+Name[ko]=Jabber
+Name[lt]=Jabber
+Name[nb]=Jabber
+Name[nl]=Jabber
+Name[nn]=Jabber
+Name[pl]=Jabber
+Name[pt]=Jabber
+Name[pt_BR]=Jabber
+Name[ro]=Jabber
+Name[ru]=Jabber
+Name[sk]=Jabber
+Name[sl]=Jabber
+Name[sq]=Jabber
+Name[sv]=Jabber
+Name[tg]=Jabber
+Name[tr]=Jabber
+Name[uk]=Jabber
+Name[x-test]=xxJabberxx
+Name[zh_CN]=Jabber
+Name[zh_TW]=Jabber
diff --git a/src/improtocols/ymsgr.desktop b/src/improtocols/ymsgr.desktop
new file mode 100644 (file)
index 0000000..cbd05aa
--- /dev/null
@@ -0,0 +1,89 @@
+[Desktop Entry]
+Type=Service
+Icon=im-yahoo
+Comment=Yahoo Protocol
+Comment[ar]=ميفاق ياهو
+Comment[az]=Yahoo Protokolu
+Comment[bg]=Протокол на Yahoo
+Comment[ca]=Protocol Yahoo
+Comment[ca@valencia]=Protocol Yahoo
+Comment[cs]=Protokol Yahoo
+Comment[da]=Yahoo-protokollen
+Comment[de]=Yahoo-Protokoll
+Comment[el]=Yahoo πρωτόκολλο
+Comment[en_GB]=Yahoo Protocol
+Comment[es]=Protocolo Yahoo
+Comment[et]=Yahoo protokoll
+Comment[eu]=Yahoo Protokoloa
+Comment[fi]=Yahoo-yhteyskäytäntö
+Comment[fr]=Protocole Yahoo
+Comment[gl]=Protocolo de Yahoo
+Comment[hu]=Yahoo protokoll
+Comment[ia]=Protocollo Yahoo
+Comment[id]=Protokol Yahoo
+Comment[it]=Protocollo di Yahoo
+Comment[ja]=Yahoo プロトコル
+Comment[ka]=Yahoo პროტოკოლი
+Comment[ko]=Yahoo 프로토콜
+Comment[lt]=Yahoo protokolas
+Comment[nb]=Yahoo-protokoll
+Comment[nl]=Yahoo-protocol
+Comment[nn]=Yahoo!-protokoll
+Comment[pl]=Protokół Yahoo
+Comment[pt]=Protocolo Yahoo
+Comment[pt_BR]=Protocolo do Yahoo
+Comment[ro]=Protocol Yahoo
+Comment[ru]=Протокол Yahoo
+Comment[sk]=Yahoo Protokol
+Comment[sl]=Protokol Yahoo
+Comment[sq]=Yahoo Protocol
+Comment[sv]=Yahoo-protokoll
+Comment[tg]=Протоколи Yahoo
+Comment[tr]=Yahoo Protokolü
+Comment[uk]=Протокол Yahoo
+Comment[x-test]=xxYahoo Protocolxx
+Comment[zh_CN]=雅虎协议
+Comment[zh_TW]=Yahoo 通訊協定
+Name=Yahoo
+Name[ar]=ياهو
+Name[az]=Yahoo
+Name[bg]=Yahoo
+Name[ca]=Yahoo
+Name[ca@valencia]=Yahoo
+Name[cs]=Yahoo
+Name[da]=Yahoo
+Name[de]=Yahoo
+Name[el]=Yahoo
+Name[en_GB]=Yahoo
+Name[es]=Yahoo
+Name[et]=Yahoo
+Name[eu]=Yahoo
+Name[fi]=Yahoo
+Name[fr]=Yahoo
+Name[gl]=Yahoo
+Name[hu]=Yahoo
+Name[ia]=Yahoo
+Name[id]=Yahoo
+Name[it]=Yahoo
+Name[ja]=Yahoo
+Name[ka]=Yahoo
+Name[ko]=Yahoo
+Name[lt]=Yahoo
+Name[nb]=Yahoo
+Name[nl]=Yahoo
+Name[nn]=Yahoo
+Name[pl]=Yahoo
+Name[pt]=Yahoo
+Name[pt_BR]=Yahoo
+Name[ro]=Yahoo
+Name[ru]=Yahoo
+Name[sk]=Yahoo
+Name[sl]=Yahoo
+Name[sq]=Yahoo
+Name[sv]=Yahoo
+Name[tg]=Yahoo
+Name[tr]=Yahoo
+Name[uk]=Yahoo
+Name[x-test]=xxYahooxx
+Name[zh_CN]=雅虎
+Name[zh_TW]=Yahoo
diff --git a/src/kcontacts.qrc b/src/kcontacts.qrc
new file mode 100644 (file)
index 0000000..bbc13d5
--- /dev/null
@@ -0,0 +1,5 @@
+<RCC>
+    <qresource prefix="/org.kde.kcontacts/">
+        <file>addressformatrc</file>
+    </qresource>
+</RCC>
diff --git a/src/key.cpp b/src/key.cpp
new file mode 100644 (file)
index 0000000..66ed984
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "key.h"
+
+#include <KLocalizedString>
+#include <krandom.h>
+
+#include <QSharedData>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Key::Private : public QSharedData
+{
+public:
+    Private()
+        : mId(KRandom::randomString(8))
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mId = other.mId;
+        mBinaryData = other.mBinaryData;
+        mTextData = other.mTextData;
+        mCustomTypeString = other.mCustomTypeString;
+        mIsBinary = other.mIsBinary;
+        mType = other.mType;
+    }
+
+    QString mId;
+    QByteArray mBinaryData;
+    QString mTextData;
+    QString mCustomTypeString;
+
+    Type mType;
+    bool mIsBinary;
+};
+
+Key::Key(const QString &text, Type type)
+    : d(new Private)
+{
+    d->mTextData = text;
+    d->mIsBinary = false;
+    d->mType = type;
+}
+
+Key::Key(const Key &other)
+    : d(other.d)
+{
+}
+
+Key::~Key()
+{
+}
+
+bool Key::operator==(const Key &other) const
+{
+    if (d->mId != other.d->mId) {
+        return false;
+    }
+
+    if (d->mType != other.d->mType) {
+        return false;
+    }
+
+    if (d->mIsBinary != other.d->mIsBinary) {
+        return false;
+    }
+
+    if (d->mIsBinary) {
+        if (d->mBinaryData != other.d->mBinaryData) {
+            return false;
+        }
+    } else {
+        if (d->mTextData != other.d->mTextData) {
+            return false;
+        }
+    }
+
+    if (d->mCustomTypeString != other.d->mCustomTypeString) {
+        return false;
+    }
+
+    return true;
+}
+
+bool Key::operator!=(const Key &other) const
+{
+    return !(*this == other);
+}
+
+Key &Key::operator=(const Key &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+void Key::setId(const QString &id)
+{
+    d->mId = id;
+}
+
+QString Key::id() const
+{
+    return d->mId;
+}
+
+void Key::setBinaryData(const QByteArray &binary)
+{
+    d->mBinaryData = binary;
+    d->mIsBinary = true;
+}
+
+QByteArray Key::binaryData() const
+{
+    return d->mBinaryData;
+}
+
+void Key::setTextData(const QString &text)
+{
+    d->mTextData = text;
+    d->mIsBinary = false;
+}
+
+QString Key::textData() const
+{
+    return d->mTextData;
+}
+
+bool Key::isBinary() const
+{
+    return d->mIsBinary;
+}
+
+void Key::setType(Type type)
+{
+    d->mType = type;
+}
+
+void Key::setCustomTypeString(const QString &custom)
+{
+    d->mCustomTypeString = custom;
+}
+
+Key::Type Key::type() const
+{
+    return d->mType;
+}
+
+QString Key::customTypeString() const
+{
+    return d->mCustomTypeString;
+}
+
+QString Key::toString() const
+{
+    QString str = QLatin1String("Key {\n");
+    str += QStringLiteral("  Id: %1\n").arg(d->mId);
+    str += QStringLiteral("  Type: %1\n").arg(typeLabel(d->mType));
+    if (d->mType == Custom) {
+        str += QStringLiteral("  CustomType: %1\n").arg(d->mCustomTypeString);
+    }
+    str += QStringLiteral("  IsBinary: %1\n").arg(d->mIsBinary ? QStringLiteral("true") : QStringLiteral("false"));
+    if (d->mIsBinary) {
+        str += QStringLiteral("  Binary: %1\n").arg(QString::fromLatin1(d->mBinaryData.toBase64()));
+    } else {
+        str += QStringLiteral("  Text: %1\n").arg(d->mTextData);
+    }
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+Key::TypeList Key::typeList()
+{
+    static TypeList list;
+
+    if (list.isEmpty()) {
+        list << X509 << PGP << Custom;
+    }
+
+    return list;
+}
+
+QString Key::typeLabel(Type type)
+{
+    switch (type) {
+    case X509:
+        return i18nc("X.509 public key", "X509");
+        break;
+    case PGP:
+        return i18nc("Pretty Good Privacy key", "PGP");
+        break;
+    case Custom:
+        return i18nc("A custom key", "Custom");
+        break;
+    default:
+        return i18nc("another type of encryption key", "Unknown type");
+        break;
+    }
+}
+
+// clang-format off
+QDataStream &KContacts::operator<<(QDataStream &s, const Key &key)
+{
+    return s << key.d->mId << key.d->mType << key.d->mIsBinary << key.d->mBinaryData
+             << key.d->mTextData << key.d->mCustomTypeString;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Key &key)
+{
+    uint type;
+    s >> key.d->mId >> type >> key.d->mIsBinary >> key.d->mBinaryData >> key.d->mTextData
+    >> key.d->mCustomTypeString;
+
+    key.d->mType = Key::Type(type);
+
+    return s;
+}
+// clang-format on
diff --git a/src/key.h b/src/key.h
new file mode 100644 (file)
index 0000000..b670326
--- /dev/null
+++ b/src/key.h
@@ -0,0 +1,171 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_KEY_H
+#define KCONTACTS_KEY_H
+
+#include "kcontacts_export.h"
+
+#include <QDataStream>
+#include <QSharedDataPointer>
+
+namespace KContacts
+{
+/**
+ * @short A class to store an encryption key.
+ */
+class KCONTACTS_EXPORT Key
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Key &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Key &);
+
+public:
+    /**
+      List of keys.
+    */
+    typedef QVector<Key> List;
+
+    /**
+      Key types
+    */
+    enum Type {
+        X509, /**< X509 key */
+        PGP, /**< Pretty Good Privacy key */
+        Custom, /**< Custom or IANA conform key */
+    };
+
+    /**
+      List of key types.
+    */
+    typedef QList<Type> TypeList;
+
+    /**
+      Creates a new key.
+
+      @param text  The text data.
+      @param type  The key type, see Types.
+    */
+    explicit Key(const QString &text = QString(), Type type = PGP);
+
+    /**
+      Copy constructor.
+    */
+    Key(const Key &other);
+
+    /**
+      Destroys the key.
+    */
+    ~Key();
+
+    /**
+      Equality operator.
+    */
+    Q_REQUIRED_RESULT bool operator==(const Key &other) const;
+
+    /**
+      Not-equal operator.
+    */
+    Q_REQUIRED_RESULT bool operator!=(const Key &other) const;
+
+    /**
+      Assignment operator.
+
+      @param other The Key instance to assign to @c this
+    */
+    Key &operator=(const Key &other);
+
+    /**
+      Sets the unique @p identifier.
+    */
+    void setId(const QString &identifier);
+
+    /**
+      Returns the unique identifier.
+    */
+    Q_REQUIRED_RESULT QString id() const;
+
+    /**
+      Sets binary @p data.
+    */
+    void setBinaryData(const QByteArray &data);
+
+    /**
+      Returns the binary data.
+    */
+    Q_REQUIRED_RESULT QByteArray binaryData() const;
+
+    /**
+      Sets text @p data.
+    */
+    void setTextData(const QString &data);
+
+    /**
+      Returns the text data.
+    */
+    Q_REQUIRED_RESULT QString textData() const;
+
+    /**
+      Returns whether the key contains binary or text data.
+    */
+    Q_REQUIRED_RESULT bool isBinary() const;
+
+    /**
+      Sets the @p type.
+
+      @param type The type of the key
+
+      @see Type
+    */
+    void setType(Type type);
+
+    /**
+      Sets custom @p type string.
+    */
+    void setCustomTypeString(const QString &type);
+
+    /**
+      Returns the type, see Type.
+    */
+    Q_REQUIRED_RESULT Type type() const;
+
+    /**
+      Returns the custom type string.
+    */
+    Q_REQUIRED_RESULT QString customTypeString() const;
+
+    /**
+      Returns a string representation of the key.
+    */
+    Q_REQUIRED_RESULT QString toString() const;
+
+    /**
+      Returns a list of all available key types.
+    */
+    Q_REQUIRED_RESULT static TypeList typeList();
+
+    /**
+      Returns a translated label for a given key @p type.
+    */
+    Q_REQUIRED_RESULT static QString typeLabel(Type type);
+
+private:
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+/**
+  Serializes the @p key object into the @p stream.
+*/
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Key &key);
+
+/**
+  Initializes the @p key object from the @p stream.
+*/
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Key &key);
+}
+Q_DECLARE_TYPEINFO(KContacts::Key, Q_MOVABLE_TYPE);
+#endif
diff --git a/src/lang.cpp b/src/lang.cpp
new file mode 100644 (file)
index 0000000..beba4f0
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "lang.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Lang::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        language = other.language;
+    }
+
+    ParameterMap mParamMap;
+    QString language;
+};
+
+Lang::Lang()
+    : d(new Private)
+{
+}
+
+Lang::Lang(const Lang &other)
+    : d(other.d)
+{
+}
+
+Lang::Lang(const QString &language)
+    : d(new Private)
+{
+    d->language = language;
+}
+
+Lang::~Lang()
+{
+}
+
+void Lang::setLanguage(const QString &lang)
+{
+    d->language = lang;
+}
+
+QString Lang::language() const
+{
+    return d->language;
+}
+
+bool Lang::isValid() const
+{
+    return !d->language.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Lang::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Lang::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Lang::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Lang::params() const
+{
+    return d->mParamMap;
+}
+
+bool Lang::operator==(const Lang &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->language == other.language());
+}
+
+bool Lang::operator!=(const Lang &other) const
+{
+    return !(other == *this);
+}
+
+Lang &Lang::operator=(const Lang &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Lang::toString() const
+{
+    QString str = QLatin1String("Lang {\n");
+    str += QStringLiteral("    language: %1\n").arg(d->language);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Lang &lang)
+{
+    return s << lang.d->mParamMap << lang.d->language;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Lang &lang)
+{
+    s >> lang.d->mParamMap >> lang.d->language;
+    return s;
+}
diff --git a/src/lang.h b/src/lang.h
new file mode 100644 (file)
index 0000000..2e92067
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef LANG_H
+#define LANG_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class LangTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Language for a contact.
+ *  @since 4.14.5
+ */
+class KCONTACTS_EXPORT Lang
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Lang &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Lang &);
+    friend class Addressee;
+    friend class VCardTool;
+    friend class ::LangTest;
+
+public:
+    Lang();
+    Lang(const Lang &other);
+    Lang(const QString &language);
+
+    ~Lang();
+
+    typedef QVector<Lang> List;
+
+    void setLanguage(const QString &lang);
+    Q_REQUIRED_RESULT QString language() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Lang &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Lang &other) const;
+
+    Lang &operator=(const Lang &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Lang &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Lang &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Lang, Q_MOVABLE_TYPE);
+#endif // LANG_H
diff --git a/src/ldif.cpp b/src/ldif.cpp
new file mode 100644 (file)
index 0000000..cc3e722
--- /dev/null
@@ -0,0 +1,429 @@
+/*
+    A temporary copy to break dependency to KLDAP
+
+    This file is part of libkldap.
+    SPDX-FileCopyrightText: 2004-2006 Szombathelyi György <gyurco@freemail.hu>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "ldif_p.h"
+
+#include "kcontacts_debug.h"
+
+class Q_DECL_HIDDEN Ldif::LdifPrivate
+{
+public:
+    int mModType;
+    bool mDelOldRdn, mUrl;
+    QByteArray mDn;
+    QString mAttr, mNewRdn, mNewSuperior, mOid;
+    QByteArray mLdif, mValue;
+    EntryType mEntryType;
+
+    bool mIsNewLine, mIsComment, mCritical;
+    ParseValue mLastParseValue;
+    uint mPos, mLineNumber;
+    QByteArray mLine;
+};
+
+Ldif::Ldif()
+    : d(new LdifPrivate)
+{
+    startParsing();
+}
+
+Ldif::Ldif(const Ldif &that)
+    : d(new LdifPrivate)
+{
+    *d = *that.d;
+
+    startParsing();
+}
+
+Ldif &Ldif::operator=(const Ldif &that)
+{
+    if (this == &that) {
+        return *this;
+    }
+
+    *d = *that.d;
+
+    return *this;
+}
+
+Ldif::~Ldif()
+{
+    delete d;
+}
+
+QByteArray Ldif::assembleLine(const QString &fieldname, const QByteArray &value, uint linelen, bool url)
+{
+    QByteArray result;
+
+    if (url) {
+        result = fieldname.toUtf8() + ":< " + value;
+    } else {
+        bool safe = false;
+        bool isDn = fieldname.toLower() == QLatin1String("dn");
+        // SAFE-INIT-CHAR
+        if (value.size() > 0 && value[0] > 0 && value[0] != '\n' //
+            && value[0] != '\r' && value[0] != ':' && value[0] != '<') {
+            safe = true;
+        }
+
+        // SAFE-CHAR
+        if (safe) {
+            for (int i = 1; i < value.size(); ++i) {
+                // allow utf-8 in Distinguished Names
+                if ((isDn && value[i] == 0) //
+                    || (!isDn && value[i] <= 0) //
+                    || value[i] == '\r' || value[i] == '\n') {
+                    safe = false;
+                    break;
+                }
+            }
+        }
+
+        if (value.isEmpty()) {
+            safe = true;
+        }
+
+        if (safe) {
+            result = fieldname.toUtf8() + ": " + value;
+        } else {
+            result = fieldname.toUtf8() + ":: " + value.toBase64();
+        }
+
+        if (linelen > 0) {
+            int i = (uint)(fieldname.length() + 2) > linelen ? fieldname.length() + 2 : linelen;
+            while (i < result.length()) {
+                result.insert(i, "\n ");
+                i += linelen + 2;
+            }
+        }
+    }
+    return result;
+}
+
+QByteArray Ldif::assembleLine(const QString &fieldname, const QString &value, uint linelen, bool url)
+{
+    return assembleLine(fieldname, value.toUtf8(), linelen, url);
+}
+
+bool Ldif::splitLine(const QByteArray &line, QString &fieldname, QByteArray &value)
+{
+    int position;
+    int linelen;
+
+    //  qCDebug(KCONTACTS_LOG) << "line:" << QString::fromUtf8(line);
+
+    position = line.indexOf(":");
+    if (position == -1) {
+        // strange: we did not find a fieldname
+        fieldname = QLatin1String("");
+        value = line.trimmed();
+        //    qCDebug(KCONTACTS_LOG) << "value :" << value[0];
+        return false;
+    }
+
+    linelen = line.size();
+    fieldname = QString::fromUtf8(line.left(position).trimmed());
+
+    if (linelen > (position + 1) && line[position + 1] == ':') {
+        // String is BASE64 encoded -> decode it now.
+        if (linelen <= (position + 3)) {
+            value.resize(0);
+            return false;
+        }
+        value = QByteArray::fromBase64(line.mid(position + 3));
+        return false;
+    }
+
+    if (linelen > (position + 1) && line[position + 1] == '<') {
+        // String is an URL.
+        if (linelen <= (position + 3)) {
+            value.resize(0);
+            return false;
+        }
+        value = QByteArray::fromBase64(line.mid(position + 3));
+        return true;
+    }
+
+    if (linelen <= (position + 2)) {
+        value.resize(0);
+        return false;
+    }
+    value = line.mid(position + 2);
+    return false;
+}
+
+bool Ldif::splitControl(const QByteArray &line, QString &oid, bool &critical, QByteArray &value)
+{
+    QString tmp;
+    critical = false;
+    bool url = splitLine(line, tmp, value);
+
+    qCDebug(KCONTACTS_LOG) << "value:" << QString::fromUtf8(value);
+    if (tmp.isEmpty()) {
+        tmp = QString::fromUtf8(value);
+        value.resize(0);
+    }
+    if (tmp.endsWith(QLatin1String("true"))) {
+        critical = true;
+        tmp.chop(5);
+    } else if (tmp.endsWith(QLatin1String("false"))) {
+        critical = false;
+        tmp.chop(6);
+    }
+    oid = tmp;
+    return url;
+}
+
+Ldif::ParseValue Ldif::processLine()
+{
+    if (d->mIsComment) {
+        return None;
+    }
+
+    ParseValue retval = None;
+    if (d->mLastParseValue == EndEntry) {
+        d->mEntryType = Entry_None;
+    }
+
+    d->mUrl = splitLine(d->mLine, d->mAttr, d->mValue);
+
+    QString attrLower = d->mAttr.toLower();
+
+    switch (d->mEntryType) {
+    case Entry_None:
+        if (attrLower == QLatin1String("version")) {
+            if (!d->mDn.isEmpty()) {
+                retval = Err;
+            }
+        } else if (attrLower == QLatin1String("dn")) {
+            qCDebug(KCONTACTS_LOG) << "ldapentry dn:" << QString::fromUtf8(d->mValue);
+            d->mDn = d->mValue;
+            d->mModType = Mod_None;
+            retval = NewEntry;
+        } else if (attrLower == QLatin1String("changetype")) {
+            if (d->mDn.isEmpty()) {
+                retval = Err;
+            } else {
+                QString tmpval = QString::fromUtf8(d->mValue);
+                qCDebug(KCONTACTS_LOG) << "changetype:" << tmpval;
+                if (tmpval == QLatin1String("add")) {
+                    d->mEntryType = Entry_Add;
+                } else if (tmpval == QLatin1String("delete")) {
+                    d->mEntryType = Entry_Del;
+                } else if (tmpval == QLatin1String("modrdn") || tmpval == QLatin1String("moddn")) {
+                    d->mNewRdn = QLatin1String("");
+                    d->mNewSuperior = QLatin1String("");
+                    d->mDelOldRdn = true;
+                    d->mEntryType = Entry_Modrdn;
+                } else if (tmpval == QLatin1String("modify")) {
+                    d->mEntryType = Entry_Mod;
+                } else {
+                    retval = Err;
+                }
+            }
+        } else if (attrLower == QLatin1String("control")) {
+            d->mUrl = splitControl(d->mValue, d->mOid, d->mCritical, d->mValue);
+            retval = Control;
+        } else if (!d->mAttr.isEmpty() && !d->mValue.isEmpty()) {
+            d->mEntryType = Entry_Add;
+            retval = Item;
+        }
+        break;
+    case Entry_Add:
+        if (d->mAttr.isEmpty() && d->mValue.isEmpty()) {
+            retval = EndEntry;
+        } else {
+            retval = Item;
+        }
+        break;
+    case Entry_Del:
+        if (d->mAttr.isEmpty() && d->mValue.isEmpty()) {
+            retval = EndEntry;
+        } else {
+            retval = Err;
+        }
+        break;
+    case Entry_Mod:
+        if (d->mModType == Mod_None) {
+            qCDebug(KCONTACTS_LOG) << "new modtype" << d->mAttr;
+            if (d->mAttr.isEmpty() && d->mValue.isEmpty()) {
+                retval = EndEntry;
+            } else if (attrLower == QLatin1String("add")) {
+                d->mModType = Mod_Add;
+            } else if (attrLower == QLatin1String("replace")) {
+                d->mModType = Mod_Replace;
+                d->mAttr = QString::fromUtf8(d->mValue);
+                d->mValue = QByteArray();
+                retval = Item;
+            } else if (attrLower == QLatin1String("delete")) {
+                d->mModType = Mod_Del;
+                d->mAttr = QString::fromUtf8(d->mValue);
+                d->mValue = QByteArray();
+                retval = Item;
+            } else {
+                retval = Err;
+            }
+        } else {
+            if (d->mAttr.isEmpty()) {
+                if (QString::fromUtf8(d->mValue) == QLatin1String("-")) {
+                    d->mModType = Mod_None;
+                } else if (d->mValue.isEmpty()) {
+                    retval = EndEntry;
+                } else {
+                    retval = Err;
+                }
+            } else {
+                retval = Item;
+            }
+        }
+        break;
+    case Entry_Modrdn:
+        if (d->mAttr.isEmpty() && d->mValue.isEmpty()) {
+            retval = EndEntry;
+        } else if (attrLower == QLatin1String("newrdn")) {
+            d->mNewRdn = QString::fromUtf8(d->mValue);
+        } else if (attrLower == QLatin1String("newsuperior")) {
+            d->mNewSuperior = QString::fromUtf8(d->mValue);
+        } else if (attrLower == QLatin1String("deleteoldrdn")) {
+            if (d->mValue.size() > 0 && d->mValue[0] == '0') {
+                d->mDelOldRdn = false;
+            } else if (d->mValue.size() > 0 && d->mValue[0] == '1') {
+                d->mDelOldRdn = true;
+            } else {
+                retval = Err;
+            }
+        } else {
+            retval = Err;
+        }
+        break;
+    }
+    return retval;
+}
+
+Ldif::ParseValue Ldif::nextItem()
+{
+    ParseValue retval = None;
+    char c = 0;
+
+    while (retval == None) {
+        if (d->mPos < (uint)d->mLdif.size()) {
+            c = d->mLdif[d->mPos];
+            d->mPos++;
+            if (d->mIsNewLine && c == '\r') {
+                continue; // handle \n\r line end
+            }
+            if (d->mIsNewLine && (c == ' ' || c == '\t')) { // line folding
+                d->mIsNewLine = false;
+                continue;
+            }
+            if (d->mIsNewLine) {
+                d->mIsNewLine = false;
+                retval = processLine();
+                d->mLastParseValue = retval;
+                d->mLine.resize(0);
+                d->mIsComment = (c == '#');
+            }
+            if (c == '\n' || c == '\r') {
+                d->mLineNumber++;
+                d->mIsNewLine = true;
+                continue;
+            }
+        } else {
+            retval = MoreData;
+            break;
+        }
+
+        if (!d->mIsComment) {
+            d->mLine += c;
+        }
+    }
+    return retval;
+}
+
+void Ldif::endLdif()
+{
+    QByteArray tmp(3, '\n');
+    d->mLdif = tmp;
+    d->mPos = 0;
+}
+
+void Ldif::startParsing()
+{
+    d->mPos = d->mLineNumber = 0;
+    d->mDelOldRdn = false;
+    d->mEntryType = Entry_None;
+    d->mModType = Mod_None;
+    d->mNewRdn.clear();
+    d->mNewSuperior.clear();
+    d->mLine = QByteArray();
+    d->mIsNewLine = false;
+    d->mIsComment = false;
+    d->mLastParseValue = None;
+}
+
+void Ldif::setLdif(const QByteArray &ldif)
+{
+    d->mLdif = ldif;
+    d->mPos = 0;
+}
+
+Ldif::EntryType Ldif::entryType() const
+{
+    return d->mEntryType;
+}
+
+int Ldif::modType() const
+{
+    return d->mModType;
+}
+
+QString Ldif::newRdn() const
+{
+    return d->mNewRdn;
+}
+
+QString Ldif::newSuperior() const
+{
+    return d->mNewSuperior;
+}
+
+bool Ldif::delOldRdn() const
+{
+    return d->mDelOldRdn;
+}
+
+QString Ldif::attr() const
+{
+    return d->mAttr;
+}
+
+QByteArray Ldif::value() const
+{
+    return d->mValue;
+}
+
+bool Ldif::isUrl() const
+{
+    return d->mUrl;
+}
+
+bool Ldif::isCritical() const
+{
+    return d->mCritical;
+}
+
+QString Ldif::oid() const
+{
+    return d->mOid;
+}
+
+uint Ldif::lineNumber() const
+{
+    return d->mLineNumber;
+}
diff --git a/src/ldif_p.h b/src/ldif_p.h
new file mode 100644 (file)
index 0000000..5b5e25b
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+    A temporary copy to break dependency to KLDAP
+
+    This file is part of libkldap.
+    SPDX-FileCopyrightText: 2004-2006 Szombathelyi György <gyurco@freemail.hu>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef LDIF_P_H
+#define LDIF_P_H
+
+#include <QByteArray>
+#include <QString>
+
+/**
+ * Ldif
+ *
+ * Ldif implements an RFC 2849 compliant Ldif parser. Ldif files are used to
+ * represent directory information on LDAP-based servers, or to describe a set
+ * of changes which are to be applied to a directory.
+ */
+class Ldif
+{
+public:
+    typedef enum { None, NewEntry, EndEntry, Item, Control, Err, MoreData } ParseValue;
+
+    typedef enum { Entry_None, Entry_Add, Entry_Del, Entry_Mod, Entry_Modrdn } EntryType;
+
+    typedef enum { Mod_None, Mod_Add, Mod_Replace, Mod_Del } ModType;
+
+    Ldif();
+
+    Ldif(const Ldif &that);
+    Ldif &operator=(const Ldif &that);
+
+    virtual ~Ldif();
+
+    /**
+     * Assembles fieldname and value into a valid Ldif line, BASE64 encodes the
+     * value if necessary and optionally splits into more lines.
+     * @param fieldname The name of the entry.
+     * @param value The value of the entry.
+     * @param linelen Maximum length of the lines in the result.
+     * @param url If true, encode value as url ( use :< ).
+     */
+    static QByteArray assembleLine(const QString &fieldname, const QByteArray &value, uint linelen = 0, bool url = false);
+    /**
+     * This is the same as the above function, the only difference that
+     * this accepts QString as the value.
+     */
+    static QByteArray assembleLine(const QString &fieldname, const QString &value, uint linelen = 0, bool url = false);
+
+    /**
+     * Splits one line from an Ldif file to attribute and value components.
+     * @return true if value is an URL, false otherwise
+     */
+    static bool splitLine(const QByteArray &line, QString &fieldname, QByteArray &value);
+
+    /**
+     * Splits a control specification (without the "control:" directive)
+     * @param line is the control directive
+     * @param oid will contain the OID
+     * @param critical will contain the criticality of control
+     * @param value is the control value
+     */
+    static bool splitControl(const QByteArray &line, QString &oid, bool &critical, QByteArray &value);
+
+    /**
+     * Starts the parsing of a new Ldif
+     */
+    void startParsing();
+
+    /**
+     * Process one Ldif line
+     */
+    ParseValue processLine();
+
+    /**
+     * Process the Ldif until a complete item can be returned
+     * @return NewEntry if a new DN encountered, Item if a new item returned,
+     * Err if the Ldif contains error, EndEntry if the parser reached the end
+     * of the current entry and MoreData if the parser encountered the end of
+     * the current chunk of the Ldif.
+     *
+     * If you want to finish the parsing after receiving MoreData, then call
+     * endLdif(), so the parser can safely flush the current entry.
+     */
+    ParseValue nextItem();
+
+    /**
+     * Sets a chunk of Ldif. Call before startParsing(), or if nextItem()
+     * returned MoreData.
+     */
+    void setLdif(const QByteArray &ldif);
+
+    /**
+     * Indicates the end of the Ldif file/stream. Call if nextItem() returned
+     * MoreData, but actually you don't have more data.
+     */
+    void endLdif();
+
+    /**
+     * Returns the requested LDAP operation extracted from the current entry.
+     */
+    EntryType entryType() const;
+
+    /**
+     * Returns the LDAP modify request type if entryType() returned Entry_Mod.
+     */
+    int modType() const;
+
+    /**
+     * Returns the new Relative Distinguished Name if modType() returned
+     * Entry_Modrdn.
+     */
+    QString newRdn() const;
+
+    /**
+     * Returns the new parent of the entry if modType() returned Entry_Modrdn.
+     */
+    QString newSuperior() const;
+
+    /**
+     * Returns if the delete of the old RDN is required.
+     */
+    bool delOldRdn() const;
+
+    /**
+     * Returns the attribute name.
+     */
+    QString attr() const;
+
+    /**
+     * Returns the attribute value.
+     */
+    QByteArray value() const;
+
+    /**
+     * Returns if val() is an url
+     */
+    bool isUrl() const;
+
+    /**
+     * Returns the criticality level when modType() returned Control.
+     */
+    bool isCritical() const;
+
+    /**
+     * Returns the OID when modType() returned Control.
+     */
+    QString oid() const;
+
+    /**
+     * Returns the line number which the parser processes.
+     */
+    uint lineNumber() const;
+
+private:
+    class LdifPrivate;
+    LdifPrivate *const d;
+};
+
+#endif
diff --git a/src/namespace.cpp b/src/namespace.cpp
new file mode 100644 (file)
index 0000000..54b6ee1
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "namespace.h"
+#include "moc_namespace.cpp"
diff --git a/src/namespace.h b/src/namespace.h
new file mode 100644 (file)
index 0000000..5207357
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_NAMESPACE_H
+#define KCONTACTS_NAMESPACE_H
+
+#include "kcontacts_export.h"
+
+#include <QMetaType>
+
+/** @file namespace.h
+ *  Everything that needs to go in to the KContacts Q_NAMESPACE meta object.
+ */
+
+namespace KContacts
+{
+KCONTACTS_EXPORT Q_NAMESPACE
+
+    /** Address formatting styles.
+     *  @see KContacts::Address::formatted
+     *  @since 5.92
+     */
+    enum class AddressFormatStyle {
+        Postal, ///< Format used for addressing postal mail
+        MultiLineDomestic, ///< Multi-line format without country, for displaying
+        MultiLineInternational, ///< Multi-line format including the country, for displaying
+        SingleLineDomestic, ///< Single-line format without country, for displaying
+        SingleLineInternational, ///< Single-line format including the country, for displaying
+        GeoUriQuery, ///< Format used in geo: URI query expressions
+    };
+
+Q_ENUM_NS(AddressFormatStyle)
+
+/** Address field types.
+ *  These are the field types that can be referenced in address format rules.
+ *  @note Not all of those are represented by vCard and thus KContacts, but exist
+ *  only for compatibility with libaddressinput, so format rules from that can be
+ *  consumed directly.
+ *  @see KContacts::AddressFormat
+ *  @since 5.92
+ */
+enum class AddressFormatField {
+    NoField = 0,
+    // from libaddressinput
+    Country = 1,
+    Region = 2,
+    Locality = 4,
+    DependentLocality = 8, // not used by us
+    SortingCode = 16, // not used by us
+    PostalCode = 32,
+    StreetAddress = 64,
+    Organization = 128,
+    Name = 256,
+    // added by us for vCard compat
+    PostOfficeBox = 512,
+};
+Q_ENUM_NS(AddressFormatField)
+
+/** A set of address fields.
+ *  @see KContacts::AddressFormat
+ *  @since 5.92
+ */
+Q_DECLARE_FLAGS(AddressFormatFields, AddressFormatField)
+Q_FLAG_NS(AddressFormatFields)
+
+/** Indicate whether to use a address format in the local script or a Latin transliteration.
+ *  @see KContacts::AddressFormatRepository
+ *  @since 5.92
+ */
+enum class AddressFormatScriptPreference {
+    Local,
+    Latin,
+};
+Q_ENUM_NS(AddressFormatScriptPreference)
+
+/** Indicate whether to prefer an address format for (postal) business address or a generic one.
+ *  @see KContacts::AddressFormatRepository
+ *  @since 5.92
+ */
+enum class AddressFormatPreference { Generic, Business };
+Q_ENUM_NS(AddressFormatPreference)
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(KContacts::AddressFormatFields)
+
+#endif // KCONTACTS_NAMESPACE_H
diff --git a/src/nickname.cpp b/src/nickname.cpp
new file mode 100644 (file)
index 0000000..be17325
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "nickname.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN NickName::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        nickname = other.nickname;
+    }
+
+    ParameterMap mParamMap;
+    QString nickname;
+};
+
+NickName::NickName()
+    : d(new Private)
+{
+}
+
+NickName::NickName(const NickName &other)
+    : d(other.d)
+{
+}
+
+NickName::NickName(const QString &nickname)
+    : d(new Private)
+{
+    d->nickname = nickname;
+}
+
+NickName::~NickName()
+{
+}
+
+void NickName::setNickName(const QString &nickname)
+{
+    d->nickname = nickname;
+}
+
+QString NickName::nickname() const
+{
+    return d->nickname;
+}
+
+bool NickName::isValid() const
+{
+    return !d->nickname.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void NickName::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> NickName::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void NickName::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap NickName::params() const
+{
+    return d->mParamMap;
+}
+
+bool NickName::operator==(const NickName &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->nickname == other.nickname());
+}
+
+bool NickName::operator!=(const NickName &other) const
+{
+    return !(other == *this);
+}
+
+NickName &NickName::operator=(const NickName &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString NickName::toString() const
+{
+    QString str = QLatin1String("NickName {\n");
+    str += QStringLiteral("    nickname: %1\n").arg(d->nickname);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const NickName &nickname)
+{
+    return s << nickname.d->mParamMap << nickname.d->nickname;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, NickName &nickname)
+{
+    s >> nickname.d->mParamMap >> nickname.d->nickname;
+    return s;
+}
diff --git a/src/nickname.h b/src/nickname.h
new file mode 100644 (file)
index 0000000..ac47512
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef NICKNAME_H
+#define NICKNAME_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class NickNameTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a NickName for a contact.
+ *  @since 5.3
+ */
+class KCONTACTS_EXPORT NickName
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const NickName &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, NickName &);
+    friend class VCardTool;
+    friend class ::NickNameTest;
+
+public:
+    NickName();
+    NickName(const NickName &other);
+    NickName(const QString &nickname);
+
+    ~NickName();
+
+    typedef QVector<NickName> List;
+
+    void setNickName(const QString &nickname);
+    Q_REQUIRED_RESULT QString nickname() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const NickName &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const NickName &other) const;
+
+    NickName &operator=(const NickName &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const NickName &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, NickName &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::NickName, Q_MOVABLE_TYPE);
+#endif // NICKNAME_H
diff --git a/src/note.cpp b/src/note.cpp
new file mode 100644 (file)
index 0000000..3d26317
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "note.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Note::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        note = other.note;
+    }
+
+    ParameterMap mParamMap;
+    QString note;
+};
+
+Note::Note()
+    : d(new Private)
+{
+}
+
+Note::Note(const Note &other)
+    : d(other.d)
+{
+}
+
+Note::Note(const QString &note)
+    : d(new Private)
+{
+    d->note = note;
+}
+
+Note::~Note()
+{
+}
+
+void Note::setNote(const QString &note)
+{
+    d->note = note;
+}
+
+QString Note::note() const
+{
+    return d->note;
+}
+
+bool Note::isValid() const
+{
+    return !d->note.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Note::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Note::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Note::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Note::params() const
+{
+    return d->mParamMap;
+}
+
+bool Note::operator==(const Note &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->note == other.note());
+}
+
+bool Note::operator!=(const Note &other) const
+{
+    return !(other == *this);
+}
+
+Note &Note::operator=(const Note &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Note::toString() const
+{
+    QString str = QLatin1String("Note {\n");
+    str += QStringLiteral("    note: %1\n").arg(d->note);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Note &note)
+{
+    return s << note.d->mParamMap << note.d->note;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Note &note)
+{
+    s >> note.d->mParamMap >> note.d->note;
+    return s;
+}
diff --git a/src/note.h b/src/note.h
new file mode 100644 (file)
index 0000000..cd1bd3b
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef NOTE_H
+#define NOTE_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Note for a contact.
+ *  @since 5.3
+ */
+class KCONTACTS_EXPORT Note
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Note &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Note &);
+    friend class VCardTool;
+
+public:
+    Note();
+    Note(const Note &other);
+    Note(const QString &note);
+
+    ~Note();
+
+    typedef QVector<Note> List;
+
+    void setNote(const QString &note);
+    Q_REQUIRED_RESULT QString note() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Note &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Note &other) const;
+
+    Note &operator=(const Note &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Note &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Note &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Note, Q_MOVABLE_TYPE);
+#endif // NOTE_H
diff --git a/src/org.cpp b/src/org.cpp
new file mode 100644 (file)
index 0000000..0b457df
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "org.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Org::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        organization = other.organization;
+    }
+
+    ParameterMap mParamMap;
+    QString organization;
+};
+
+Org::Org()
+    : d(new Private)
+{
+}
+
+Org::Org(const Org &other)
+    : d(other.d)
+{
+}
+
+Org::Org(const QString &org)
+    : d(new Private)
+{
+    d->organization = org;
+}
+
+Org::~Org()
+{
+}
+
+void Org::setOrganization(const QString &org)
+{
+    d->organization = org;
+}
+
+QString Org::organization() const
+{
+    return d->organization;
+}
+
+bool Org::isValid() const
+{
+    return !d->organization.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Org::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Org::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Org::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Org::params() const
+{
+    return d->mParamMap;
+}
+
+bool Org::operator==(const Org &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->organization == other.organization());
+}
+
+bool Org::operator!=(const Org &other) const
+{
+    return !(other == *this);
+}
+
+Org &Org::operator=(const Org &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Org::toString() const
+{
+    QString str = QLatin1String("Org {\n");
+    str += QStringLiteral("    organization: %1\n").arg(d->organization);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Org &org)
+{
+    return s << org.d->mParamMap << org.d->organization;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Org &org)
+{
+    s >> org.d->mParamMap >> org.d->organization;
+    return s;
+}
diff --git a/src/org.h b/src/org.h
new file mode 100644 (file)
index 0000000..c1dfbef
--- /dev/null
+++ b/src/org.h
@@ -0,0 +1,83 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ORG_H
+#define ORG_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class OrgTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Organization for a contact.
+ *  @since 5.3
+ */
+class KCONTACTS_EXPORT Org
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Org &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Org &);
+    friend class VCardTool;
+    friend class ::OrgTest;
+
+public:
+    Org();
+    Org(const Org &other);
+    Org(const QString &org);
+
+    ~Org();
+
+    typedef QVector<Org> List;
+
+    void setOrganization(const QString &org);
+    Q_REQUIRED_RESULT QString organization() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Org &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Org &other) const;
+
+    Org &operator=(const Org &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Org &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Org &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Org, Q_MOVABLE_TYPE);
+#endif // ORG_H
diff --git a/src/parametermap_p.h b/src/parametermap_p.h
new file mode 100644 (file)
index 0000000..034f0bb
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2021 Ahmad Samir <a.samirh78@gmail.com>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef PARAMETERMAP_P_H
+#define PARAMETERMAP_P_H
+
+#include <QDataStream>
+#include <QMap>
+#include <QStringList>
+
+#include <algorithm>
+#include <vector>
+
+namespace KContacts
+{
+struct ParameterData {
+    QString param;
+    QStringList paramValues;
+};
+
+class ParameterMap : public std::vector<ParameterData>
+{
+public:
+    inline const_iterator findParam(const QString &param) const
+    {
+        return std::find_if(cbegin(), cend(), [&param](const ParameterData &info) {
+            return info.param == param;
+        });
+    }
+
+    inline iterator findParam(const QString &param)
+    {
+        return std::find_if(begin(), end(), [&param](const ParameterData &info) {
+            return info.param == param;
+        });
+    }
+
+    /**
+     * Inserts @p newdata and keeps the vector sorted, the latter needs to
+     * be sorted for comparisons.
+     */
+    inline iterator insertParam(ParameterData &&newdata)
+    {
+        auto dIt = std::lower_bound(begin(), end(), newdata);
+        return insert(dIt, newdata);
+    }
+
+    inline QString toString() const
+    {
+        if (empty()) {
+            return {};
+        }
+
+        QString str;
+        for (const auto &[p, list] : *this) {
+            str += QStringLiteral("%1 %2").arg(p, list.join(QLatin1Char(',')));
+        }
+
+        return QLatin1String("    parameters: ") + str + QLatin1Char('\n');
+    }
+
+    static ParameterMap fromQMap(const QMap<QString, QStringList> &params)
+    {
+        ParameterMap vec;
+        vec.reserve(params.size());
+        for (auto it = params.begin(), endIt = params.cend(); it != endIt; ++it) {
+            vec.push_back({it.key(), it.value()});
+        }
+        return vec;
+    }
+
+    inline QMap<QString, QStringList> toQMap() const
+    {
+        QMap<QString, QStringList> map;
+        for (const auto &[name, list] : *this) {
+            map.insert(name, list);
+        }
+        return map;
+    }
+};
+
+inline bool operator<(const ParameterData &a, const ParameterData &b)
+{
+    return a.param < b.param;
+}
+
+inline bool operator==(const ParameterData &a, const ParameterData &b)
+{
+    return std::tie(a.param, a.paramValues) == std::tie(b.param, b.paramValues);
+}
+
+inline QDataStream &operator<<(QDataStream &s, const ParameterMap &map)
+{
+    s << static_cast<quint32>(map.size());
+    for (const auto &[p, list] : map) {
+        s << p << list;
+    }
+    return s;
+}
+
+inline QDataStream &operator>>(QDataStream &s, ParameterMap &map)
+{
+    map.clear();
+    quint32 n;
+    s >> n;
+    for (quint32 i = 0; i < n; ++i) {
+        QString p;
+        QStringList lst;
+        s >> p >> lst;
+        if (s.status() != QDataStream::Ok) {
+            map.clear();
+            break;
+        }
+        map.push_back({p, lst});
+    }
+
+    return s;
+}
+}
+
+#endif
diff --git a/src/phonenumber.cpp b/src/phonenumber.cpp
new file mode 100644 (file)
index 0000000..a287b1e
--- /dev/null
@@ -0,0 +1,308 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "phonenumber.h"
+#include "parametermap_p.h"
+
+#include <KLocalizedString>
+#include <krandom.h>
+
+#include <QDataStream>
+#include <QSharedData>
+
+using namespace KContacts;
+
+static QString cleanupNumber(const QString &input)
+{
+    return input.simplified();
+}
+
+class Q_DECL_HIDDEN PhoneNumber::Private : public QSharedData
+{
+public:
+    Private(Type type)
+        : mId(KRandom::randomString(8))
+        , mType(type)
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mId = other.mId;
+        mType = other.mType;
+        mNumber = other.mNumber;
+    }
+
+    QString mId;
+    QString mNumber;
+    Type mType;
+    ParameterMap mParamMap;
+};
+
+PhoneNumber::PhoneNumber()
+    : d(new Private(Home))
+{
+}
+
+PhoneNumber::PhoneNumber(const QString &number, Type type)
+    : d(new Private(type))
+{
+    d->mNumber = cleanupNumber(number);
+}
+
+PhoneNumber::PhoneNumber(const PhoneNumber &other)
+    : d(other.d)
+{
+}
+
+PhoneNumber::~PhoneNumber()
+{
+}
+
+bool PhoneNumber::operator==(const PhoneNumber &other) const
+{
+    if (d->mId != other.d->mId) {
+        return false;
+    }
+
+    if (d->mNumber != other.d->mNumber) {
+        return false;
+    }
+
+    if (d->mType != other.d->mType) {
+        return false;
+    }
+
+    if (d->mParamMap != other.d->mParamMap) {
+        return false;
+    }
+
+    return true;
+}
+
+bool PhoneNumber::operator!=(const PhoneNumber &other) const
+{
+    return !(other == *this);
+}
+
+PhoneNumber &PhoneNumber::operator=(const PhoneNumber &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool PhoneNumber::isEmpty() const
+{
+    return d->mNumber.isEmpty();
+}
+
+void PhoneNumber::setId(const QString &id)
+{
+    d->mId = id;
+}
+
+QString PhoneNumber::id() const
+{
+    return d->mId;
+}
+
+void PhoneNumber::setNumber(const QString &number)
+{
+    d->mNumber = cleanupNumber(number);
+}
+
+QString PhoneNumber::number() const
+{
+    return d->mNumber;
+}
+
+QString PhoneNumber::normalizedNumber() const
+{
+    QString result;
+    result.reserve(d->mNumber.size());
+    for (const auto &c : d->mNumber) {
+        if (c.isDigit() || (c == QLatin1Char('+') && result.isEmpty())) {
+            result.push_back(c);
+        }
+    }
+    return result;
+}
+
+void PhoneNumber::setType(Type type)
+{
+    d->mType = type;
+}
+
+PhoneNumber::Type PhoneNumber::type() const
+{
+    return d->mType;
+}
+
+QString PhoneNumber::typeLabel() const
+{
+    return typeLabel(type());
+}
+
+PhoneNumber::TypeList PhoneNumber::typeList()
+{
+    static TypeList list;
+
+    if (list.isEmpty()) {
+        list << Home << Work << Msg << Pref << Voice << Fax << Cell << Video //
+             << Bbs << Modem << Car << Isdn << Pcs << Pager << Undefined;
+    }
+
+    return list;
+}
+
+QString PhoneNumber::typeFlagLabel(TypeFlag type)
+{
+    switch (type) {
+    case Undefined:
+        return i18nc("Undefined phone type", "Telephone number");
+    case Home:
+        return i18nc("Home phone", "Home");
+    case Work:
+        return i18nc("Work phone", "Work");
+    case Msg:
+        return i18n("Messenger");
+    case Pref:
+        return i18nc("Preferred phone", "Preferred");
+    case Voice:
+        return i18n("Voice");
+    case Fax:
+        return i18n("Fax");
+    case Cell:
+        return i18nc("Mobile Phone", "Mobile");
+    case Video:
+        return i18nc("Video phone", "Video");
+    case Bbs:
+        return i18n("Mailbox");
+    case Modem:
+        return i18n("Modem");
+    case Car:
+        return i18nc("Car Phone", "Car");
+    case Isdn:
+        return i18n("ISDN");
+    case Pcs:
+        return i18n("PCS");
+    case Pager:
+        return i18n("Pager");
+    default:
+        return i18nc("another type of phone", "Other");
+    }
+}
+
+QString PhoneNumber::typeLabel(Type type)
+{
+    QString label;
+    bool first = true;
+
+    // special cases
+    // Pref stand alone -> Preferred Number
+    // Home+Fax or Work+Fax -> combine as initial string
+    if (type == Pref) {
+        return i18n("Preferred Number");
+    }
+
+    if (type & Fax) {
+        if (type & Home) {
+            label = i18n("Home Fax");
+            first = false;
+            type &= ~Fax;
+            type &= ~Home;
+        } else if (type & Work) {
+            label = i18n("Work Fax");
+            first = false;
+            type &= ~Fax;
+            type &= ~Work;
+        }
+    }
+
+    const TypeList list = typeList();
+    for (const auto f : list) {
+        // these are actually flags
+        const TypeFlag flag = static_cast<TypeFlag>(static_cast<int>(f));
+        if (type & flag) {
+            if (!first) {
+                label.append(QLatin1Char('/'));
+            }
+
+            label.append(typeFlagLabel(flag));
+
+            if (first) {
+                first = false;
+            }
+        }
+    }
+
+    return label;
+}
+
+bool PhoneNumber::isPreferred() const
+{
+    return type() & Pref;
+}
+
+bool PhoneNumber::supportsSms() const
+{
+    return type() & Cell;
+}
+
+QString PhoneNumber::toString() const
+{
+    QString str = QLatin1String("PhoneNumber {\n");
+    str += QStringLiteral("    Id: %1\n").arg(d->mId);
+    str += QStringLiteral("    Type: %1\n").arg(typeLabel(d->mType));
+    str = d->mParamMap.toString();
+    str += QStringLiteral("    Number: %1\n").arg(d->mNumber);
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void PhoneNumber::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> PhoneNumber::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void PhoneNumber::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap PhoneNumber::params() const
+{
+    return d->mParamMap;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const PhoneNumber &phone)
+{
+    return s << phone.d->mId << static_cast<uint>(phone.d->mType) << phone.d->mNumber << phone.d->mParamMap;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, PhoneNumber &phone)
+{
+    uint type;
+    s >> phone.d->mId >> type >> phone.d->mNumber >> phone.d->mParamMap;
+    phone.d->mType = PhoneNumber::Type(type);
+
+    return s;
+}
diff --git a/src/phonenumber.h b/src/phonenumber.h
new file mode 100644 (file)
index 0000000..b3b4bce
--- /dev/null
@@ -0,0 +1,280 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_PHONENUMBER_H
+#define KCONTACTS_PHONENUMBER_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QString>
+#include <QVector>
+
+namespace KContacts
+{
+class ParameterMap;
+
+/**
+ * @short Phonenumber information.
+ *
+ * This class provides phone number information. A phone number is classified by
+ * a type. The following types are available, it's possible to use multiple types
+ * Types for a number by combining them through a logical or.
+ */
+class KCONTACTS_EXPORT PhoneNumber
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const PhoneNumber &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, PhoneNumber &);
+    friend class VCardTool;
+
+    Q_GADGET
+    Q_PROPERTY(QString id READ id WRITE setId)
+    Q_PROPERTY(QString number READ number WRITE setNumber)
+    Q_PROPERTY(QString normalizedNumber READ normalizedNumber)
+    Q_PROPERTY(Type type READ type WRITE setType)
+    Q_PROPERTY(QString typeLabel READ typeLabel)
+    Q_PROPERTY(bool isEmpty READ isEmpty)
+    Q_PROPERTY(bool isPreferred READ isPreferred)
+    Q_PROPERTY(bool supportsSms READ supportsSms)
+
+public:
+    /**
+      Phone number types.
+      @see Type
+    */
+    enum TypeFlag {
+        Home = 1, /**< Home number */
+        Work = 2, /**< Office number */
+        Msg = 4, /**< Messaging */
+        Pref = 8, /**< Preferred number */
+        Voice = 16, /**< Voice */
+        Fax = 32, /**< Fax machine */
+        Cell = 64, /**< Cell phone */
+        Video = 128, /**< Video phone */
+        Bbs = 256, /**< Mailbox */
+        Modem = 512, /**< Modem */
+        Car = 1024, /**< Car phone */
+        Isdn = 2048, /**< ISDN connection */
+        Pcs = 4096, /**< Personal Communication Service*/
+        Pager = 8192, /**< Pager */
+        // TODO add Text and textphone support vcard4
+        Undefined = 16384, /** Undefined number type */
+    };
+
+    /**
+     * Stores a combination of #TypeFlag values.
+     */
+    Q_DECLARE_FLAGS(Type, TypeFlag)
+    Q_FLAG(Type)
+
+    /**
+     * List of phone number types.
+     */
+    typedef QVector<TypeFlag> TypeList;
+
+    /**
+     * List of phone numbers.
+     */
+    typedef QVector<PhoneNumber> List;
+
+    /**
+     * Creates an empty phone number object.
+     */
+    PhoneNumber();
+
+    /**
+     * Creates a phone number object.
+     *
+     * @param number Number
+     * @param type   Type as defined in enum. Multiple types can be
+     *               specified by combining them by a logical or.
+     */
+    PhoneNumber(const QString &number, Type type = Home); // krazy:exclude=explicit
+
+    /**
+     * Copy constructor.
+     *
+     * Fast operation, PhoneNumber's data is implicitly shared.
+     *
+     * @param other The PhoneNumber object to copy from
+     */
+    PhoneNumber(const PhoneNumber &other);
+
+    /**
+     * Destroys the phone number.
+     */
+    ~PhoneNumber();
+
+    /**
+     * Equality operator.
+     *
+     * @return @c true if number, type and identifier are equal,
+     *         otherwise @c false
+     */
+    Q_REQUIRED_RESULT bool operator==(const PhoneNumber &other) const;
+
+    /**
+     * Not-Equal operator.
+     */
+    Q_REQUIRED_RESULT bool operator!=(const PhoneNumber &other) const;
+
+    /**
+     * Assignment operator.
+     *
+     * Fast operation, PhoneNumber's data is implicitly shared.
+     *
+     * @param other The PhoneNumber object to asssign to @c this
+     */
+    PhoneNumber &operator=(const PhoneNumber &other);
+
+    /**
+     * Returns true, if the phone number is empty.
+     */
+    Q_REQUIRED_RESULT bool isEmpty() const;
+
+    /**
+     * Sets the unique @p identifier.
+     */
+    void setId(const QString &identifier);
+
+    /**
+     * Returns the unique identifier.
+     */
+    Q_REQUIRED_RESULT QString id() const;
+
+    /**
+     * Sets the phone @p number.
+     */
+    void setNumber(const QString &number);
+
+    /**
+     * Returns the phone number.
+     * This is the number as entered/stored with all formatting preserved. Preferred for display.
+     * @see normalizedNumber()
+     */
+    Q_REQUIRED_RESULT QString number() const;
+
+    /**
+     * Returns the phone number normalized for dialing.
+     * This has all formatting stripped for passing to dialers or tel: URLs.
+     * @see number()
+     * @since 5.12
+     */
+    Q_REQUIRED_RESULT QString normalizedNumber() const;
+
+    /**
+     * Sets the @p type.
+     * Multiple types can be specified by combining them by a logical or.
+     *
+     * @param type The #Type of the phone number
+     */
+    void setType(Type type);
+
+    /**
+     * Returns the type. Can be a multiple types combined by a logical or.
+     *
+     * @see #TypeFlag
+     * @see typeLabel()
+     */
+    Q_REQUIRED_RESULT Type type() const;
+
+    /**
+     * Returns a translated string of the address' type.
+     */
+    Q_REQUIRED_RESULT QString typeLabel() const;
+
+    /**
+     * Returns a list of all available types
+     */
+    Q_REQUIRED_RESULT static TypeList typeList();
+
+    /**
+     * Returns whether this phone number is marked as preferred.
+     * @since 5.12
+     */
+    Q_REQUIRED_RESULT bool isPreferred() const;
+    /**
+     * Returns whether this phone number is expected to support receiving SMS messages.
+     * @since 5.12
+     */
+    Q_REQUIRED_RESULT bool supportsSms() const;
+
+    /**
+     * Returns the translated label for phone number @p type.
+     *
+     * In opposite to typeFlagLabel( TypeFlag type ), it returns all types
+     * of the phone number concatenated by '/'.
+     *
+     * @param type An OR'ed combination of #TypeFlag
+     *
+     * @see type()
+     */
+    static QString typeLabel(Type type);
+
+    /**
+     * Returns the translated label for phone number @p type.
+     *
+     * @param type An OR'ed combination of #TypeFlag
+     *
+     * @see typeLabel()
+     * @since 4.5
+     */
+    Q_REQUIRED_RESULT static QString typeFlagLabel(TypeFlag type);
+
+    /**
+     * Returns a string representation of the phone number.
+     */
+    QString toString() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(PhoneNumber::Type)
+
+/**
+ * Serializes the phone @p number object into the @p stream.
+ *
+ * @param stream The stream to write into
+ * @param number The phone number object to serialize
+ */
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const PhoneNumber &number);
+
+/**
+ * Initializes the phone @p number object from the @p stream.
+ *
+ * @param stream The stream to read from
+ * @param number The phone number object to deserialize into
+ */
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, PhoneNumber &number);
+}
+Q_DECLARE_METATYPE(KContacts::PhoneNumber)
+Q_DECLARE_TYPEINFO(KContacts::PhoneNumber, Q_MOVABLE_TYPE);
+#endif
diff --git a/src/picture.cpp b/src/picture.cpp
new file mode 100644 (file)
index 0000000..bfa5bc6
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "picture.h"
+
+#include <QBuffer>
+#include <QSharedData>
+
+
+namespace KContacts
+{
+class PicturePrivate : public QSharedData
+{
+public:
+    PicturePrivate()
+        : mIntern(false)
+    {
+    }
+
+    PicturePrivate(const PicturePrivate &other)
+        : QSharedData(other)
+        , mUrl(other.mUrl)
+        , mType(other.mType)
+        , mData(other.mData)
+        , mIntern(other.mIntern)
+    {
+    }
+
+    QString mUrl;
+    QString mType;
+    mutable QImage mData;
+    mutable QByteArray mRawData;
+
+    bool mIntern;
+};
+}
+
+Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<KContacts::PicturePrivate>, s_sharedEmpty, (new KContacts::PicturePrivate))
+
+using namespace KContacts;
+
+Picture::Picture()
+    : d(*s_sharedEmpty())
+{
+}
+
+Picture::Picture(const QString &url)
+    : d(new PicturePrivate)
+{
+    d->mUrl = url;
+}
+
+Picture::Picture(const QImage &data)
+    : d(new PicturePrivate)
+{
+    setData(data);
+}
+
+Picture::Picture(const Picture &other)
+    : d(other.d)
+{
+}
+
+Picture::~Picture()
+{
+}
+
+Picture &Picture::operator=(const Picture &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool Picture::operator==(const Picture &p) const
+{
+    if (d->mIntern != p.d->mIntern) {
+        return false;
+    }
+
+    if (d->mType != p.d->mType) {
+        return false;
+    }
+
+    if (d->mIntern) {
+        if (!d->mData.isNull() && !p.d->mData.isNull()) {
+            if (d->mData != p.d->mData) {
+                return false;
+            }
+        } else if (!d->mRawData.isEmpty() && !p.d->mRawData.isEmpty()) {
+            if (d->mRawData != p.d->mRawData) {
+                return false;
+            }
+        } else if ((!d->mData.isNull() || !d->mRawData.isEmpty()) //
+                   && (!p.d->mData.isNull() || !p.d->mRawData.isEmpty())) {
+            if (data() != p.data()) {
+                return false;
+            }
+        } else {
+            // if one picture is empty and the other is not
+            return false;
+        }
+    } else {
+        if (d->mUrl != p.d->mUrl) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool Picture::operator!=(const Picture &p) const
+{
+    return !(p == *this);
+}
+
+bool Picture::isEmpty() const
+{
+    return (!d->mIntern && d->mUrl.isEmpty()) //
+        || (d->mIntern && d->mData.isNull() && d->mRawData.isEmpty());
+}
+
+void Picture::setUrl(const QString &url)
+{
+    d->mUrl = url;
+    d->mType.clear();
+    d->mIntern = false;
+}
+
+void Picture::setUrl(const QString &url, const QString &type)
+{
+    d->mUrl = url;
+    d->mType = type;
+    d->mIntern = false;
+}
+
+void Picture::setData(const QImage &data)
+{
+    d->mRawData.clear();
+    d->mData = data;
+    d->mIntern = true;
+
+    // set the type, the raw data will have when accessed through Picture::rawData()
+    if (!d->mData.hasAlphaChannel()) {
+        d->mType = QStringLiteral("jpeg");
+    } else {
+        d->mType = QStringLiteral("png");
+    }
+}
+
+void Picture::setRawData(const QByteArray &rawData, const QString &type)
+{
+    d->mRawData = rawData;
+    d->mType = type;
+    d->mData = QImage();
+    d->mIntern = true;
+}
+
+bool Picture::isIntern() const
+{
+    return d->mIntern;
+}
+
+QString Picture::url() const
+{
+    return d->mUrl;
+}
+
+QImage Picture::data() const
+{
+    if (d->mData.isNull() && !d->mRawData.isEmpty()) {
+        d->mData.loadFromData(d->mRawData);
+    }
+
+    return d->mData;
+}
+
+QByteArray Picture::rawData() const
+{
+    if (d->mRawData.isEmpty() && !d->mData.isNull()) {
+        QBuffer buffer(&d->mRawData);
+        buffer.open(QIODevice::WriteOnly);
+
+        // d->mType was already set accordingly by Picture::setData()
+        d->mData.save(&buffer, d->mType.toUpper().toLatin1().data());
+    }
+
+    return d->mRawData;
+}
+
+QString Picture::type() const
+{
+    return d->mType;
+}
+
+QString Picture::toString() const
+{
+    QString str = QLatin1String("Picture {\n");
+    str += QStringLiteral("  Type: %1\n").arg(d->mType);
+    str += QStringLiteral("  IsIntern: %1\n").arg(d->mIntern ? QStringLiteral("true") : QStringLiteral("false"));
+    if (d->mIntern) {
+        str += QStringLiteral("  Data: %1\n").arg(QString::fromLatin1(rawData().toBase64()));
+    } else {
+        str += QStringLiteral("  Url: %1\n").arg(d->mUrl);
+    }
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Picture &picture)
+{
+    return s << picture.d->mIntern << picture.d->mUrl << picture.d->mType << picture.data();
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Picture &picture)
+{
+    s >> picture.d->mIntern >> picture.d->mUrl >> picture.d->mType >> picture.d->mData;
+
+    return s;
+}
diff --git a/src/picture.h b/src/picture.h
new file mode 100644 (file)
index 0000000..3f02f56
--- /dev/null
@@ -0,0 +1,188 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_PICTURE_H
+#define KCONTACTS_PICTURE_H
+
+#include "kcontacts_export.h"
+
+#include <QDataStream>
+#include <QImage>
+#include <QSharedDataPointer>
+#include <QString>
+
+namespace KContacts
+{
+class PicturePrivate;
+
+/**
+  A class to store a picture of an addressee. It can store the data directly or
+  an url reference to a picture.
+*/
+class KCONTACTS_EXPORT Picture
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Picture &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Picture &);
+
+    Q_GADGET
+    Q_PROPERTY(QImage data READ data WRITE setData)
+    Q_PROPERTY(QString url READ url WRITE setUrl)
+    Q_PROPERTY(bool isIntern READ isIntern)
+    Q_PROPERTY(bool isEmpty READ isEmpty)
+
+public:
+    /**
+     * Creates an empty picture.
+     */
+    Picture();
+
+    /**
+     * Creates a picture which points to the given url.
+     *
+     * @param url A URL that describes the location of the picture file.
+     */
+    Picture(const QString &url);
+
+    /**
+     * Creates a picture with the given data.
+     *
+     * @param data The raw data of the picture.
+     */
+    Picture(const QImage &data);
+
+    /**
+     * Copy constructor.
+     *
+     * Fast operation, Picture's data is implicitly shared.
+     *
+     * @param picture The Picture instance to copy from
+     */
+    Picture(const Picture &picture);
+
+    /**
+     * Destructor.
+     */
+    ~Picture();
+
+    typedef QVector<Picture> List;
+    /**
+     * Assignment operator
+     *
+     * Fast operation, Picture's data is implicitly shared.
+     *
+     * @param other The Picture instance to assign to @c this
+     */
+    Picture &operator=(const Picture &other);
+
+    /**
+     * Equality operator.
+     */
+    Q_REQUIRED_RESULT bool operator==(const Picture &other) const;
+
+    /**
+     * Not-Equal operator.
+     */
+    Q_REQUIRED_RESULT bool operator!=(const Picture &other) const;
+
+    /**
+     * Returns true, if the picture is empty.
+     */
+    Q_REQUIRED_RESULT bool isEmpty() const;
+
+    /**
+     * Sets a URL for the location of the picture file. When using this
+     * function, isIntern() will return 'false' until you use
+     * setData().
+     * This also clears the type, as it is unknown.
+     *
+     * @param url  The location URL of the picture file.
+     */
+    void setUrl(const QString &url);
+
+    /**
+     * Sets a URL for the location of the picture file. When using this
+     * function, isIntern() will return 'false' until you use
+     * setData().
+     *
+     * @param url  The location URL of the picture file.
+     * @param type  The encoding format of the image, e.g. jpeg or png
+     * @since 4.10
+     */
+    void setUrl(const QString &url, const QString &type);
+
+    /**
+     * Sets the image data of the picture. When using this function,
+     * isIntern() will return 'true' until you use setUrl().
+     * This also sets type to "png" or "jpeg" depending
+     * on whether the image has an alpha channel or not.
+     *
+     * @param data  The image data of the picture.
+     */
+    void setData(const QImage &data);
+
+    /**
+     * Sets the raw data of the picture. When using this function,
+     * isIntern() will return 'true' until you use setUrl().
+     *
+     * @param rawData  The raw data of the picture.
+     * @param type  The encoding format of the image, e.g. jpeg or png
+     * @since 4.10
+     */
+    void setRawData(const QByteArray &rawData, const QString &type);
+
+    /**
+     * Returns whether the picture is described by a URL (extern) or
+     * by the raw data (intern).
+     * When this method returns 'true' you can use data() to
+     * get the raw data. Otherwise you can request the URL of this
+     * picture by url() and load the raw data from that location.
+     */
+    Q_REQUIRED_RESULT bool isIntern() const;
+
+    /**
+     * Returns the location URL of this picture.
+     */
+    Q_REQUIRED_RESULT QString url() const;
+
+    /**
+     * Returns the image data of this picture.
+     */
+    Q_REQUIRED_RESULT QImage data() const;
+
+    /**
+     * Returns the raw data of this picture.
+     *
+     * @since 4.10
+     */
+    Q_REQUIRED_RESULT QByteArray rawData() const;
+
+    /**
+     * Returns the type of this picture.
+     */
+    Q_REQUIRED_RESULT QString type() const;
+
+    /**
+     * Returns string representation of the picture.
+     */
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    QSharedDataPointer<PicturePrivate> d;
+};
+
+/**
+ * Serializes the @p picture object into the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Picture &picture);
+
+/**
+ * Initializes the @p picture object from the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Picture &picture);
+}
+Q_DECLARE_TYPEINFO(KContacts::Picture, Q_MOVABLE_TYPE);
+#endif
diff --git a/src/related.cpp b/src/related.cpp
new file mode 100644 (file)
index 0000000..319d52f
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "related.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Related::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        relatedTo = other.relatedTo;
+    }
+
+    ParameterMap mParamMap;
+    QString relatedTo;
+};
+
+Related::Related()
+    : d(new Private)
+{
+}
+
+Related::Related(const Related &other)
+    : d(other.d)
+{
+}
+
+Related::Related(const QString &relatedTo)
+    : d(new Private)
+{
+    d->relatedTo = relatedTo;
+}
+
+Related::~Related()
+{
+}
+
+void Related::setRelated(const QString &relatedTo)
+{
+    d->relatedTo = relatedTo;
+}
+
+QString Related::related() const
+{
+    return d->relatedTo;
+}
+
+bool Related::isValid() const
+{
+    return !d->relatedTo.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Related::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Related::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Related::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Related::params() const
+{
+    return d->mParamMap;
+}
+
+bool Related::operator==(const Related &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->relatedTo == other.related());
+}
+
+bool Related::operator!=(const Related &other) const
+{
+    return !(other == *this);
+}
+
+Related &Related::operator=(const Related &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Related::toString() const
+{
+    QString str = QLatin1String("Related {\n");
+    str += QStringLiteral("    relatedTo: %1\n").arg(d->relatedTo);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Related &related)
+{
+    return s << related.d->mParamMap << related.d->relatedTo;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Related &related)
+{
+    s >> related.d->mParamMap >> related.d->relatedTo;
+    return s;
+}
diff --git a/src/related.h b/src/related.h
new file mode 100644 (file)
index 0000000..a95d1c3
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef RELATED_H
+#define RELATED_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class RelatedTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** Describes a relationship of an Addressee. */
+class KCONTACTS_EXPORT Related
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Related &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Related &);
+    friend class VCardTool;
+    friend class ::RelatedTest;
+
+public:
+    Related();
+    Related(const Related &other);
+    Related(const QString &related);
+
+    ~Related();
+
+    typedef QVector<Related> List;
+
+    void setRelated(const QString &relatedTo);
+    Q_REQUIRED_RESULT QString related() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Related &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Related &other) const;
+
+    Related &operator=(const Related &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Related &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Related &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Related, Q_MOVABLE_TYPE);
+#endif // LANG_H
diff --git a/src/resourcelocatorurl.cpp b/src/resourcelocatorurl.cpp
new file mode 100644 (file)
index 0000000..93aee6c
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "resourcelocatorurl.h"
+
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN ResourceLocatorUrl::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        url = other.url;
+    }
+
+    ParameterMap mParamMap;
+    QUrl url;
+};
+
+ResourceLocatorUrl::ResourceLocatorUrl()
+    : d(new Private)
+{
+}
+
+ResourceLocatorUrl::ResourceLocatorUrl(const ResourceLocatorUrl &other)
+    : d(other.d)
+{
+}
+
+ResourceLocatorUrl::~ResourceLocatorUrl()
+{
+}
+
+struct url_type_name {
+    const char *name;
+    ResourceLocatorUrl::Type type;
+};
+
+static const url_type_name url_type_names[] = {
+    {"HOME", ResourceLocatorUrl::Home},
+    {"WORK", ResourceLocatorUrl::Work},
+    {"OTHER", ResourceLocatorUrl::Other},
+    {"PROFILE", ResourceLocatorUrl::Profile},
+};
+
+ResourceLocatorUrl::Type ResourceLocatorUrl::type() const
+{
+    const auto it = d->mParamMap.findParam(QLatin1String("type"));
+    if (it == d->mParamMap.cend()) {
+        return Unknown;
+    }
+
+    Type type = Unknown;
+    for (const QString &s : it->paramValues) {
+        const auto typeIt = std::find_if(std::begin(url_type_names), std::end(url_type_names), [&s](const url_type_name &t) {
+            return QLatin1String(t.name) == s;
+        });
+        if (typeIt != std::end(url_type_names)) {
+            type |= (*typeIt).type;
+        }
+    }
+    return type;
+}
+
+void ResourceLocatorUrl::setType(ResourceLocatorUrl::Type type)
+{
+    const auto oldType = this->type();
+
+    const QString paramName(QStringLiteral("type"));
+
+    auto it = d->mParamMap.findParam(paramName);
+    if (it == d->mParamMap.end()) {
+        it = d->mParamMap.insertParam({QLatin1String("type"), {}});
+    }
+
+    for (const auto &t : url_type_names) {
+        if (((type ^ oldType) & t.type) == 0) {
+            continue; // no change
+        }
+
+        const QLatin1String str(t.name);
+        if (type & t.type) {
+            it->paramValues.push_back(str);
+        } else {
+            it->paramValues.removeAll(str);
+        }
+    }
+}
+
+bool ResourceLocatorUrl::isPreferred() const
+{
+    auto it = d->mParamMap.findParam(QLatin1String("pref"));
+    if (it != d->mParamMap.cend()) {
+        return !it->paramValues.isEmpty() && it->paramValues.at(0) == QLatin1Char('1');
+    }
+
+    it = d->mParamMap.findParam(QLatin1String("type"));
+    if (it != d->mParamMap.cend()) {
+        return it->paramValues.contains(QLatin1String("PREF"), Qt::CaseInsensitive);
+    }
+
+    return false;
+}
+
+void ResourceLocatorUrl::setPreferred(bool preferred)
+{
+    if (preferred == isPreferred()) {
+        return;
+    }
+
+    const QString paramName(QStringLiteral("type"));
+
+    auto it = d->mParamMap.findParam(paramName);
+    QStringList types = it != d->mParamMap.end() ? it->paramValues : QStringList{};
+
+    const QLatin1String PREF_Str("PREF");
+    if (!preferred) {
+        auto prefIt = d->mParamMap.findParam(QLatin1String("pref"));
+        if (prefIt != d->mParamMap.end()) {
+            d->mParamMap.erase(prefIt);
+        }
+
+        types.removeAll(PREF_Str);
+    } else {
+        types.push_back(PREF_Str);
+    }
+
+    // The above erase() call could have invalidated "it"
+    it = d->mParamMap.findParam(paramName);
+    if (it != d->mParamMap.end()) {
+        it->paramValues = types;
+    } else {
+        d->mParamMap.insertParam({QLatin1String("type"), types});
+    }
+}
+
+bool ResourceLocatorUrl::operator==(const ResourceLocatorUrl &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->url == other.url());
+}
+
+bool ResourceLocatorUrl::operator!=(const ResourceLocatorUrl &other) const
+{
+    return !(other == *this);
+}
+
+ResourceLocatorUrl &ResourceLocatorUrl::operator=(const ResourceLocatorUrl &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString ResourceLocatorUrl::toString() const
+{
+    QString str = QLatin1String("ResourceLocatorUrl {\n");
+    str += QStringLiteral("    url: %1\n").arg(d->url.toString());
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void ResourceLocatorUrl::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> ResourceLocatorUrl::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void ResourceLocatorUrl::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap ResourceLocatorUrl::params() const
+{
+    return d->mParamMap;
+}
+
+bool ResourceLocatorUrl::isValid() const
+{
+    return d->url.isValid();
+}
+
+void ResourceLocatorUrl::setUrl(const QUrl &url)
+{
+    d->url = url;
+}
+
+QUrl ResourceLocatorUrl::url() const
+{
+    return d->url;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const ResourceLocatorUrl &calUrl)
+{
+    return s << calUrl.d->mParamMap << calUrl.d->url;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, ResourceLocatorUrl &calUrl)
+{
+    s >> calUrl.d->mParamMap >> calUrl.d->url;
+    return s;
+}
diff --git a/src/resourcelocatorurl.h b/src/resourcelocatorurl.h
new file mode 100644 (file)
index 0000000..088e29e
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef RESOURCELOCATORURL_H
+#define RESOURCELOCATORURL_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QMetaType>
+#include <QSharedDataPointer>
+#include <QString>
+#include <QUrl>
+
+class ResourceLocatorUrlTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Resource Locator
+ *  @since 5.0
+ */
+class KCONTACTS_EXPORT ResourceLocatorUrl
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const ResourceLocatorUrl &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, ResourceLocatorUrl &);
+    friend class VCardTool;
+    friend class ::ResourceLocatorUrlTest;
+
+    Q_GADGET
+    Q_PROPERTY(QUrl url READ url WRITE setUrl)
+    Q_PROPERTY(bool isValid READ isValid)
+    Q_PROPERTY(Type type READ type WRITE setType)
+    Q_PROPERTY(bool isPreferred READ isPreferred WRITE setPreferred)
+
+public:
+    ResourceLocatorUrl();
+    ResourceLocatorUrl(const ResourceLocatorUrl &other);
+
+    ~ResourceLocatorUrl();
+
+    typedef QVector<ResourceLocatorUrl> List;
+
+    /** URL types.
+     *  @since 5.12
+     *  @see Type
+     */
+    enum TypeFlag {
+        Unknown = 0, /**< No or unknown URL type is set. */
+        Home = 1, /**< Personal website. */
+        Work = 2, /**< Work website. */
+        Profile = 4, /**< Profile website. */
+        Other = 8, /**< Other websie. */
+    };
+
+    /**
+     * Stores a combination of #TypeFlag values.
+     */
+    Q_DECLARE_FLAGS(Type, TypeFlag)
+    Q_FLAG(Type)
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    void setUrl(const QUrl &url);
+    Q_REQUIRED_RESULT QUrl url() const;
+
+    /**
+     * Returns the type of the URL.
+     * @since 5.12
+     */
+    Type type() const;
+    /**
+     * Sets the URL type.
+     * @since 5.12
+     */
+    void setType(Type type);
+
+    /**
+     * Returns whether this is the preferred website.
+     * @since 5.12
+     */
+    bool isPreferred() const;
+    /**
+     * Sets that this is the preferred website.
+     * @since 5.12
+     */
+    void setPreferred(bool preferred);
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const ResourceLocatorUrl &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const ResourceLocatorUrl &other) const;
+
+    ResourceLocatorUrl &operator=(const ResourceLocatorUrl &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(ResourceLocatorUrl::Type)
+
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const ResourceLocatorUrl &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, ResourceLocatorUrl &object);
+}
+Q_DECLARE_METATYPE(KContacts::ResourceLocatorUrl)
+Q_DECLARE_TYPEINFO(KContacts::ResourceLocatorUrl, Q_MOVABLE_TYPE);
+
+#endif // RESOURCELOCATORURL_H
diff --git a/src/role.cpp b/src/role.cpp
new file mode 100644 (file)
index 0000000..29420da
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "role.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Role::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        role = other.role;
+    }
+
+    ParameterMap mParamMap;
+    QString role;
+};
+
+Role::Role()
+    : d(new Private)
+{
+}
+
+Role::Role(const Role &other)
+    : d(other.d)
+{
+}
+
+Role::Role(const QString &role)
+    : d(new Private)
+{
+    d->role = role;
+}
+
+Role::~Role()
+{
+}
+
+void Role::setRole(const QString &role)
+{
+    d->role = role;
+}
+
+QString Role::role() const
+{
+    return d->role;
+}
+
+bool Role::isValid() const
+{
+    return !d->role.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Role::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Role::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Role::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Role::params() const
+{
+    return d->mParamMap;
+}
+
+bool Role::operator==(const Role &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->role == other.role());
+}
+
+bool Role::operator!=(const Role &other) const
+{
+    return !(other == *this);
+}
+
+Role &Role::operator=(const Role &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Role::toString() const
+{
+    QString str = QLatin1String("Role {\n");
+    str += QStringLiteral("    role: %1\n").arg(d->role);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Role &role)
+{
+    return s << role.d->mParamMap << role.d->role;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Role &role)
+{
+    s >> role.d->mParamMap >> role.d->role;
+    return s;
+}
diff --git a/src/role.h b/src/role.h
new file mode 100644 (file)
index 0000000..feb9f20
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef ROLE_H
+#define ROLE_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class RoleTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Role for a contact.
+ *  @since 5.3
+ */
+class KCONTACTS_EXPORT Role
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Role &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Role &);
+    friend class VCardTool;
+    friend class ::RoleTest;
+
+public:
+    Role();
+    Role(const Role &other);
+    Role(const QString &role);
+
+    ~Role();
+
+    typedef QVector<Role> List;
+
+    void setRole(const QString &role);
+    Q_REQUIRED_RESULT QString role() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Role &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Role &other) const;
+
+    Role &operator=(const Role &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Role &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Role &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Role, Q_MOVABLE_TYPE);
+#endif // ROLE_H
diff --git a/src/secrecy.cpp b/src/secrecy.cpp
new file mode 100644 (file)
index 0000000..6f40685
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "secrecy.h"
+
+#include <KLocalizedString>
+
+#include <QDataStream>
+#include <QSharedData>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Secrecy::PrivateData : public QSharedData
+{
+public:
+    PrivateData()
+        : mType(Secrecy::Invalid)
+    {
+    }
+
+    PrivateData(const PrivateData &other)
+        : QSharedData(other)
+    {
+        mType = other.mType;
+    }
+
+    Type mType;
+};
+
+Secrecy::Secrecy(Type type)
+    : d(new PrivateData)
+{
+    d->mType = type;
+}
+
+Secrecy::Secrecy(const Secrecy &other)
+    : d(other.d)
+{
+}
+
+Secrecy::~Secrecy()
+{
+}
+
+Secrecy &Secrecy::operator=(const Secrecy &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool Secrecy::operator==(const Secrecy &other) const
+{
+    return d->mType == other.d->mType;
+}
+
+bool Secrecy::operator!=(const Secrecy &other) const
+{
+    return !(*this == other);
+}
+
+bool Secrecy::isValid() const
+{
+    return d->mType != Invalid;
+}
+
+void Secrecy::setType(Type type)
+{
+    d->mType = type;
+}
+
+Secrecy::Type Secrecy::type() const
+{
+    return d->mType;
+}
+
+Secrecy::TypeList Secrecy::typeList()
+{
+    static TypeList list;
+
+    if (list.isEmpty()) {
+        list << Public << Private << Confidential;
+    }
+
+    return list;
+}
+
+QString Secrecy::typeLabel(Type type)
+{
+    switch (type) {
+    case Public:
+        return i18nc("access is for everyone", "Public");
+        break;
+    case Private:
+        return i18nc("access is by owner only", "Private");
+        break;
+    case Confidential:
+        return i18nc("access is by owner and a controlled group", "Confidential");
+        break;
+    default:
+        return i18nc("unknown secrecy type", "Unknown type");
+        break;
+    }
+}
+
+QString Secrecy::toString() const
+{
+    QString str = QLatin1String("Secrecy {\n");
+    str += QStringLiteral("  Type: %1\n").arg(typeLabel(d->mType));
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Secrecy &secrecy)
+{
+    return s << (uint)secrecy.d->mType;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Secrecy &secrecy)
+{
+    uint type;
+    s >> type;
+
+    switch (type) {
+    case 0:
+        secrecy.d->mType = Secrecy::Public;
+        break;
+    case 1:
+        secrecy.d->mType = Secrecy::Private;
+        break;
+    case 2:
+        secrecy.d->mType = Secrecy::Confidential;
+        break;
+    default:
+        secrecy.d->mType = Secrecy::Invalid;
+        break;
+    }
+
+    return s;
+}
diff --git a/src/secrecy.h b/src/secrecy.h
new file mode 100644 (file)
index 0000000..cfa3e39
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_SECRECY_H
+#define KCONTACTS_SECRECY_H
+
+#include "kcontacts_export.h"
+#include <QSharedDataPointer>
+#include <QVector>
+
+namespace KContacts
+{
+/** Describes the confidentiality of an addressee. */
+class KCONTACTS_EXPORT Secrecy
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Secrecy &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Secrecy &);
+
+public:
+    /**
+     * Secrecy types
+     *
+     * @li Public       - for public access
+     * @li Private      - only private access
+     * @li Confidential - access for confidential persons
+     */
+    enum Type {
+        Public,
+        Private,
+        Confidential,
+        Invalid,
+    };
+
+    /**
+     * List of secrecy types.
+     */
+    typedef QVector<Type> TypeList;
+
+    /**
+     * Creates a new secrecy of the given type.
+     *
+     * @param type  The secrecy type. @see Type
+     */
+    Secrecy(Type type = Invalid);
+
+    /**
+     * Copy constructor.
+     */
+    Secrecy(const Secrecy &other);
+
+    /**
+     * Destroys the secrecy.
+     */
+    ~Secrecy();
+
+    Secrecy &operator=(const Secrecy &other);
+
+    Q_REQUIRED_RESULT bool operator==(const Secrecy &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Secrecy &other) const;
+
+    /**
+     * Returns if the Secrecy object has a valid value.
+     */
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    /**
+     * Sets the @p type.
+     *
+     * @param type The #Type of secrecy
+     */
+    void setType(Type type);
+
+    /**
+     * Returns the type.
+     */
+    Q_REQUIRED_RESULT Type type() const;
+
+    /**
+     * Returns a list of all available secrecy types.
+     */
+    Q_REQUIRED_RESULT static TypeList typeList();
+
+    /**
+     * Returns a translated label for a given secrecy @p type.
+     */
+    Q_REQUIRED_RESULT static QString typeLabel(Type type);
+
+    /**
+     * Returns a string representation of the secrecy.
+     */
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    class PrivateData;
+    QSharedDataPointer<PrivateData> d;
+};
+
+/**
+ * Serializes the @p secrecy object into the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Secrecy &secrecy);
+
+/**
+ * Initializes the @p secrecy object from the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Secrecy &secrecy);
+}
+Q_DECLARE_TYPEINFO(KContacts::Secrecy, Q_MOVABLE_TYPE);
+#endif
diff --git a/src/sound.cpp b/src/sound.cpp
new file mode 100644 (file)
index 0000000..2b5991e
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "sound.h"
+
+#include <QDataStream>
+#include <QSharedData>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Sound::Private : public QSharedData
+{
+public:
+    Private()
+        : mIntern(false)
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mUrl = other.mUrl;
+        mData = other.mData;
+        mIntern = other.mIntern;
+    }
+
+    QString mUrl;
+    QByteArray mData;
+
+    bool mIntern;
+};
+
+Sound::Sound()
+    : d(new Private)
+{
+}
+
+Sound::Sound(const QString &url)
+    : d(new Private)
+{
+    d->mUrl = url;
+}
+
+Sound::Sound(const QByteArray &data)
+    : d(new Private)
+{
+    d->mIntern = true;
+    d->mData = data;
+}
+
+Sound::Sound(const Sound &other)
+    : d(other.d)
+{
+}
+
+Sound::~Sound()
+{
+}
+
+Sound &Sound::operator=(const Sound &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+bool Sound::operator==(const Sound &other) const
+{
+    if (d->mIntern != other.d->mIntern) {
+        return false;
+    }
+
+    if (d->mIntern) {
+        if (d->mData != other.d->mData) {
+            return false;
+        }
+    } else {
+        if (d->mUrl != other.d->mUrl) {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool Sound::operator!=(const Sound &other) const
+{
+    return !(other == *this);
+}
+
+void Sound::setUrl(const QString &url)
+{
+    d->mIntern = false;
+    d->mUrl = url;
+}
+
+void Sound::setData(const QByteArray &data)
+{
+    d->mIntern = true;
+    d->mData = data;
+}
+
+bool Sound::isIntern() const
+{
+    return d->mIntern;
+}
+
+bool Sound::isEmpty() const
+{
+    return (d->mIntern && d->mData.isEmpty()) || (!d->mIntern && d->mUrl.isEmpty());
+}
+
+QString Sound::url() const
+{
+    return d->mUrl;
+}
+
+QByteArray Sound::data() const
+{
+    return d->mData;
+}
+
+QString Sound::toString() const
+{
+    QString str = QLatin1String("Sound {\n");
+    str += QStringLiteral("  IsIntern: %1\n").arg(d->mIntern ? QStringLiteral("true") : QStringLiteral("false"));
+    if (d->mIntern) {
+        str += QStringLiteral("  Data: %1\n").arg(QString::fromLatin1(d->mData.toBase64()));
+    } else {
+        str += QStringLiteral("  Url: %1\n").arg(d->mUrl);
+    }
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Sound &sound)
+{
+    return s << sound.d->mIntern << sound.d->mUrl << sound.d->mData;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Sound &sound)
+{
+    s >> sound.d->mIntern >> sound.d->mUrl >> sound.d->mData;
+
+    return s;
+}
diff --git a/src/sound.h b/src/sound.h
new file mode 100644 (file)
index 0000000..8b7d532
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_SOUND_H
+#define KCONTACTS_SOUND_H
+
+#include "kcontacts_export.h"
+#include <QSharedDataPointer>
+#include <QString>
+
+namespace KContacts
+{
+/** @short Class that holds a Sound clip for a contact.
+ *
+ *  The sound can be played doing something like this:
+ *
+ *  \code
+ *    KTempFile tmp;
+ *    if ( sound.isIntern() ) {
+ *      tmp.file()->write( sound.data() );
+ *      tmp.close();
+ *      KAudioPlayer::play( tmp.name() );
+ *    } else if( !sound.url().isEmpty() ) {
+ *      QString tmpFile;
+ *      if ( !KIO::NetAccess::download( QUrl( themeURL.url() ), tmpFile, 0 ) ) {
+ *        KMessageBox::error( 0,
+ *                            KIO::NetAccess::lastErrorString(),
+ *                            i18n( "Failed to download sound file" ),
+ *                            KMessageBox::Notify
+ *                          );
+ *        return;
+ *      }
+ *      KAudioPlayer::play( tmpFile );
+ *    }
+ *  \endcode
+ *
+ *  Unfortunately, KAudioPlayer::play is ASync, so to delete the temporary file
+ *  the best you can really do is set a timer.
+ *
+ */
+class KCONTACTS_EXPORT Sound
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Sound &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Sound &);
+
+public:
+    /**
+     * Creates an empty sound object.
+     */
+    Sound();
+
+    /**
+     * Creates a sound object for the given url.
+     *
+     * @param url A url that describes the position of the sound file.
+     */
+    Sound(const QString &url);
+
+    /**
+     * Creates a sound object for the given data.
+     *
+     * @param data The raw data of the sound.
+     */
+    Sound(const QByteArray &data);
+
+    /**
+     * Copy constructor.
+     */
+    Sound(const Sound &other);
+
+    /**
+     * Destroys the sound object.
+     */
+    ~Sound();
+
+    typedef QVector<Sound> List;
+    /**
+     * Assignment operator.
+     *
+     * @param other The sound object to assign to @c this
+     */
+    Sound &operator=(const Sound &other);
+
+    /**
+     * Equality operator.
+     *
+     * @param other The object to compare with
+     *
+     * @return @c true if the two objects are equal, otherwise @c false
+     */
+    Q_REQUIRED_RESULT bool operator==(const Sound &other) const;
+
+    /**
+     * Not-Equal operator.
+     *
+     * @param other The object to compare with
+     *
+     * @return @c true if the two objects are not equal, otherwise @c false
+     */
+    Q_REQUIRED_RESULT bool operator!=(const Sound &other) const;
+
+    /**
+     * Sets a URL for the location of the sound file. When using this
+     * function, isIntern() will return 'false' until you use
+     * setData().
+     *
+     * @param url  The location URL of the sound file.
+     */
+    void setUrl(const QString &url);
+
+    /**
+     * Returns true, if the sound object is empty.
+     */
+    Q_REQUIRED_RESULT bool isEmpty() const;
+
+    /**
+     * Sets the raw data of the sound. When using this function,
+     * isIntern() will return 'true' until you use setUrl().
+     *
+     * @param data  The raw data of the sound.
+     */
+    void setData(const QByteArray &data);
+
+    /**
+     * Returns whether the sound is described by a URL (extern) or
+     * by the raw data (intern).
+     * When this method returns 'true' you can use data() to
+     * get the raw data. Otherwise you can request the URL of this
+     * sound by url() and load the raw data from that location.
+     */
+    Q_REQUIRED_RESULT bool isIntern() const;
+
+    /**
+     * Returns the location URL of this sound.
+     */
+    Q_REQUIRED_RESULT QString url() const;
+
+    /**
+     * Returns the raw data of this sound.
+     */
+    Q_REQUIRED_RESULT QByteArray data() const;
+
+    /**
+     * Returns string representation of the sound.
+     */
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+/**
+ * Serializes the @p sound object into the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Sound &sound);
+
+/**
+ * Initializes the @p sound object from the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Sound &sound);
+}
+Q_DECLARE_TYPEINFO(KContacts::Sound, Q_MOVABLE_TYPE);
+#endif
diff --git a/src/timezone.cpp b/src/timezone.cpp
new file mode 100644 (file)
index 0000000..1796e5a
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "timezone.h"
+
+#include <QDataStream>
+#include <QSharedData>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN TimeZone::Private : public QSharedData
+{
+public:
+    Private(int offset = 0, bool valid = false)
+        : mOffset(offset)
+        , mValid(valid)
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mOffset = other.mOffset;
+        mValid = other.mValid;
+    }
+
+    int mOffset;
+    bool mValid;
+};
+
+TimeZone::TimeZone()
+    : d(new Private)
+{
+}
+
+TimeZone::TimeZone(int offset)
+    : d(new Private(offset, true))
+{
+}
+
+TimeZone::TimeZone(const TimeZone &other)
+    : d(other.d)
+{
+}
+
+TimeZone::~TimeZone()
+{
+}
+
+void TimeZone::setOffset(int offset)
+{
+    d->mOffset = offset;
+    d->mValid = true;
+}
+
+int TimeZone::offset() const
+{
+    return d->mOffset;
+}
+
+bool TimeZone::isValid() const
+{
+    return d->mValid;
+}
+
+bool TimeZone::operator==(const TimeZone &t) const
+{
+    if (!t.isValid() && !isValid()) {
+        return true;
+    }
+
+    if (!t.isValid() || !isValid()) {
+        return false;
+    }
+
+    if (t.d->mOffset == d->mOffset) {
+        return true;
+    }
+
+    return false;
+}
+
+bool TimeZone::operator!=(const TimeZone &t) const
+{
+    return !(*this == t);
+}
+
+TimeZone &TimeZone::operator=(const TimeZone &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString TimeZone::toString() const
+{
+    QString str = QLatin1String("TimeZone {\n");
+    str += QStringLiteral("  Offset: %1\n").arg(d->mOffset);
+    str += QLatin1String("}\n");
+
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const TimeZone &zone)
+{
+    return s << zone.d->mOffset << zone.d->mValid;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, TimeZone &zone)
+{
+    s >> zone.d->mOffset >> zone.d->mValid;
+
+    return s;
+}
diff --git a/src/timezone.h b/src/timezone.h
new file mode 100644 (file)
index 0000000..d3f1f07
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_TIMEZONE_H
+#define KCONTACTS_TIMEZONE_H
+
+#include "kcontacts_export.h"
+#include <QSharedDataPointer>
+#include <QString>
+
+namespace KContacts
+{
+/**
+ * @short Time zone information.
+ *
+ * This class stores information about a time zone.
+ */
+class KCONTACTS_EXPORT TimeZone
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const TimeZone &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, TimeZone &);
+
+public:
+    /**
+     * Construct invalid time zone.
+     */
+    TimeZone();
+
+    /**
+     * Construct time zone.
+     *
+     * @param offset Offset in minutes relative to UTC.
+     */
+    TimeZone(int offset);
+
+    /**
+     * Copy constructor.
+     */
+    TimeZone(const TimeZone &other);
+
+    /**
+     * Destroys the time zone.
+     */
+    ~TimeZone();
+
+    /**
+     * Set time zone offset relative to UTC.
+     *
+     * @param offset Offset in minutes.
+     */
+    void setOffset(int offset);
+
+    /**
+     * Return offset in minutes relative to UTC.
+     */
+    Q_REQUIRED_RESULT int offset() const;
+
+    /**
+     * Return, if this time zone object is valid.
+     */
+    Q_REQUIRED_RESULT bool isValid() const;
+
+    Q_REQUIRED_RESULT bool operator==(const TimeZone &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const TimeZone &other) const;
+    TimeZone &operator=(const TimeZone &other);
+
+    /**
+     * Return string representation of time zone offset.
+     */
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+
+/**
+ * Serializes the @p timezone object into the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const TimeZone &timeZone);
+
+/**
+ * Initializes the @p timezone object from the @p stream.
+ */
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, TimeZone &timeZone);
+}
+Q_DECLARE_TYPEINFO(KContacts::TimeZone, Q_MOVABLE_TYPE);
+
+#endif
diff --git a/src/title.cpp b/src/title.cpp
new file mode 100644 (file)
index 0000000..04b608e
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "title.h"
+#include "parametermap_p.h"
+
+#include <QDataStream>
+#include <QStringList>
+
+using namespace KContacts;
+
+class Q_DECL_HIDDEN Title::Private : public QSharedData
+{
+public:
+    Private()
+    {
+    }
+
+    Private(const Private &other)
+        : QSharedData(other)
+    {
+        mParamMap = other.mParamMap;
+        title = other.title;
+    }
+
+    ParameterMap mParamMap;
+    QString title;
+};
+
+Title::Title()
+    : d(new Private)
+{
+}
+
+Title::Title(const Title &other)
+    : d(other.d)
+{
+}
+
+Title::Title(const QString &title)
+    : d(new Private)
+{
+    d->title = title;
+}
+
+Title::~Title()
+{
+}
+
+void Title::setTitle(const QString &title)
+{
+    d->title = title;
+}
+
+QString Title::title() const
+{
+    return d->title;
+}
+
+bool Title::isValid() const
+{
+    return !d->title.isEmpty();
+}
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+void Title::setParameters(const QMap<QString, QStringList> &params)
+{
+    d->mParamMap = ParameterMap::fromQMap(params);
+}
+#endif
+
+#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88)
+QMap<QString, QStringList> Title::parameters() const
+{
+    return d->mParamMap.toQMap();
+}
+#endif
+
+void Title::setParams(const ParameterMap &params)
+{
+    d->mParamMap = params;
+}
+
+ParameterMap Title::params() const
+{
+    return d->mParamMap;
+}
+
+bool Title::operator==(const Title &other) const
+{
+    return (d->mParamMap == other.d->mParamMap) && (d->title == other.title());
+}
+
+bool Title::operator!=(const Title &other) const
+{
+    return !(other == *this);
+}
+
+Title &Title::operator=(const Title &other)
+{
+    if (this != &other) {
+        d = other.d;
+    }
+
+    return *this;
+}
+
+QString Title::toString() const
+{
+    QString str = QLatin1String("Title {\n");
+    str += QStringLiteral("    title: %1\n").arg(d->title);
+    str += d->mParamMap.toString();
+    str += QLatin1String("}\n");
+    return str;
+}
+
+QDataStream &KContacts::operator<<(QDataStream &s, const Title &title)
+{
+    return s << title.d->mParamMap << title.d->title;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Title &title)
+{
+    s >> title.d->mParamMap >> title.d->title;
+    return s;
+}
diff --git a/src/title.h b/src/title.h
new file mode 100644 (file)
index 0000000..7a31299
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2016-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef TITLE_H
+#define TITLE_H
+
+#include "kcontacts_export.h"
+
+#include <QMap>
+#include <QSharedDataPointer>
+#include <QString>
+
+class TitleTest;
+
+namespace KContacts
+{
+class ParameterMap;
+
+/** @short Class that holds a Title for a contact.
+ *  @since 5.3
+ */
+class KCONTACTS_EXPORT Title
+{
+    friend KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Title &);
+    friend KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Title &);
+    friend class VCardTool;
+    friend class ::TitleTest;
+
+public:
+    Title();
+    Title(const Title &other);
+    Title(const QString &title);
+
+    ~Title();
+
+    typedef QVector<Title> List;
+
+    void setTitle(const QString &title);
+    Q_REQUIRED_RESULT QString title() const;
+
+    Q_REQUIRED_RESULT bool isValid() const;
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    void setParameters(const QMap<QString, QStringList> &params);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+    /**
+     * @deprecated Since 5.88 for lack of usage
+     */
+    Q_REQUIRED_RESULT
+    KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+    QMap<QString, QStringList> parameters() const;
+#endif
+
+    Q_REQUIRED_RESULT bool operator==(const Title &other) const;
+    Q_REQUIRED_RESULT bool operator!=(const Title &other) const;
+
+    Title &operator=(const Title &other);
+
+    Q_REQUIRED_RESULT QString toString() const;
+
+private:
+    void setParams(const ParameterMap &params);
+    Q_REQUIRED_RESULT ParameterMap params() const;
+
+    class Private;
+    QSharedDataPointer<Private> d;
+};
+KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Title &object);
+
+KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Title &object);
+}
+Q_DECLARE_TYPEINFO(KContacts::Title, Q_MOVABLE_TYPE);
+#endif // TITLE_H
diff --git a/src/vcarddrag.cpp b/src/vcarddrag.cpp
new file mode 100644 (file)
index 0000000..b9efe27
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+    This file is part of the KContacts framework.
+
+    SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "vcarddrag.h"
+
+#include "converter/vcardconverter.h"
+
+#include <QMimeDatabase>
+
+using namespace KContacts;
+
+static QString findCompatibleMimeType(const QMimeData *md)
+{
+    if (!md) {
+        return {};
+    }
+    // check the canonical MIME type first
+    if (md->hasFormat(KContacts::Addressee::mimeType())) {
+        return KContacts::Addressee::mimeType();
+    }
+
+    const QStringList mimeTypeOffers = md->formats();
+    const QMimeDatabase db;
+    for (const QString &mimeType : mimeTypeOffers) {
+        const QMimeType mimeTypePtr = db.mimeTypeForName(mimeType);
+        if (mimeTypePtr.isValid() && mimeTypePtr.inherits(KContacts::Addressee::mimeType())) {
+            return mimeType;
+        }
+    }
+
+    return QString();
+}
+
+bool VCardDrag::populateMimeData(QMimeData *md, const QByteArray &content)
+{
+    md->setData(KContacts::Addressee::mimeType(), content);
+    return true;
+}
+
+bool VCardDrag::populateMimeData(QMimeData *md, const KContacts::Addressee::List &addressees)
+{
+    KContacts::VCardConverter converter;
+    const QByteArray vcards = converter.createVCards(addressees);
+    if (!vcards.isEmpty()) {
+        return populateMimeData(md, vcards);
+    } else {
+        return false;
+    }
+}
+
+bool VCardDrag::canDecode(const QMimeData *md)
+{
+    return !findCompatibleMimeType(md).isEmpty();
+}
+
+bool VCardDrag::fromMimeData(const QMimeData *md, QByteArray &content)
+{
+    const QString mimeOffer = findCompatibleMimeType(md);
+    if (mimeOffer.isEmpty()) {
+        return false;
+    }
+    content = md->data(mimeOffer);
+    return !content.isEmpty();
+}
+
+bool VCardDrag::fromMimeData(const QMimeData *md, KContacts::Addressee::List &addressees)
+{
+    const QString mimeOffer = findCompatibleMimeType(md);
+    if (mimeOffer.isEmpty()) {
+        return false;
+    }
+    addressees = KContacts::VCardConverter().parseVCards(md->data(mimeOffer));
+    return !addressees.isEmpty();
+}
diff --git a/src/vcarddrag.h b/src/vcarddrag.h
new file mode 100644 (file)
index 0000000..4b20dbb
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+    This file is part of the KContacts framework.
+
+    SPDX-FileCopyrightText: 2002-2010 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_VCARDDRAG_H
+#define KCONTACTS_VCARDDRAG_H
+
+#include "kcontacts_export.h"
+
+#include <QMimeData>
+#include <kcontacts/addressee.h>
+
+namespace KContacts
+{
+/**
+  @brief Utility function for implementing drag&drop for vCards
+
+  See the Qt drag'n'drop documentation.
+
+  @since 4.5
+*/
+namespace VCardDrag
+{
+/**
+  Adds the vCard representation as data of the drag object.
+
+  @param md the object to set the data on
+  @param content the vCard data to set
+
+  @return Always @c true
+*/
+KCONTACTS_EXPORT bool populateMimeData(QMimeData *md, const QByteArray &content);
+
+/**
+  Adds the vCard representation as data of the drag object.
+
+  @param md the object to set the data on
+  @param contacts list of Addressee objects to serialize to vCard
+
+  @return @c true if serializing of the given list worked, otherwise @c false
+
+  @see VCardConverter::createVCards()
+*/
+KCONTACTS_EXPORT bool populateMimeData(QMimeData *md, const KContacts::Addressee::List &contacts);
+
+/**
+  Returns if drag&drop object can be decoded to vCard.
+
+  @param md the object to check for vCard data
+
+  @return @c true if the given data object contains a vCard MIME type, otherwise @c false
+*/
+KCONTACTS_EXPORT bool canDecode(const QMimeData *md);
+
+/**
+  Decodes the drag&drop object to vCard component @p content.
+
+  @param md the object to check for vCard data
+  @param content where to put the vCard data from @p md
+
+  @return @c true if there was data for the vCard MIME type, otherwise @c false
+
+  @see canDecode()
+*/
+KCONTACTS_EXPORT bool fromMimeData(const QMimeData *md, QByteArray &content);
+
+/**
+  Decodes the MIME data @p md and puts the resulting vCard into @p contacts.
+
+  @param md the object to check for vCard data
+  @param contacts where to put the parsed vCards from @p md
+
+  @return @c true if there was data for the vCard MIME type and it could be parsed successfully,
+          otherwise @c false
+
+  @see canDecode()
+*/
+KCONTACTS_EXPORT bool fromMimeData(const QMimeData *md, KContacts::Addressee::List &contacts);
+}
+}
+
+#endif // VCARDDRAG_H
diff --git a/src/vcardparser/vcard.cpp b/src/vcardparser/vcard.cpp
new file mode 100644 (file)
index 0000000..101083f
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "vcard_p.h"
+
+using namespace KContacts;
+
+VCard::VCard()
+{
+}
+
+VCard::VCard(const VCard &vcard)
+    : mLineMap(vcard.mLineMap)
+{
+}
+
+VCard::~VCard()
+{
+}
+
+VCard &VCard::operator=(const VCard &vcard)
+{
+    if (&vcard == this) {
+        return *this;
+    }
+
+    mLineMap = vcard.mLineMap;
+
+    return *this;
+}
+
+void VCard::clear()
+{
+    mLineMap.clear();
+}
+
+QStringList VCard::identifiers() const
+{
+    QStringList list;
+    list.reserve(mLineMap.size());
+    for (const auto &[lineId, l] : mLineMap) {
+        list.append(lineId);
+    }
+    return list;
+}
+
+void VCard::addLine(const VCardLine &line)
+{
+    auto it = findByLineId(line.identifier());
+    if (it != mLineMap.end()) {
+        it->list.append(line);
+    } else {
+        const LineData newdata{line.identifier(), {line}};
+        auto beforeIt = std::lower_bound(mLineMap.begin(), mLineMap.end(), newdata);
+        mLineMap.insert(beforeIt, newdata);
+    }
+}
+
+VCardLine::List VCard::lines(const QString &identifier) const
+{
+    auto it = findByLineId(identifier);
+    return it != mLineMap.cend() ? it->list : VCardLine::List{};
+}
+
+VCardLine VCard::line(const QString &identifier) const
+{
+    auto it = findByLineId(identifier);
+    return it != mLineMap.cend() && !it->list.isEmpty() ? it->list.at(0) : VCardLine{};
+}
+
+static const char s_verStr[] = "VERSION";
+
+void VCard::setVersion(Version version)
+{
+
+    VCardLine line;
+    line.setIdentifier(QLatin1String(s_verStr));
+    if (version == v2_1) {
+        line.setIdentifier(QStringLiteral("2.1"));
+    } else if (version == v3_0) {
+        line.setIdentifier(QStringLiteral("3.0"));
+    } else if (version == v4_0) {
+        line.setIdentifier(QStringLiteral("4.0"));
+    }
+
+    auto it = findByLineId(QLatin1String(s_verStr));
+    if (it != mLineMap.end()) {
+        it->list.append(line);
+    } else {
+        const LineData newData{QLatin1String(s_verStr), {line}};
+        auto beforeIt = std::lower_bound(mLineMap.begin(), mLineMap.end(), newData);
+        mLineMap.insert(beforeIt, newData);
+    }
+}
+
+VCard::Version VCard::version() const
+{
+    auto versionEntryIt = findByLineId(QLatin1String(s_verStr));
+    if (versionEntryIt == mLineMap.cend()) {
+        return v3_0;
+    }
+
+    const VCardLine line = versionEntryIt->list.at(0);
+    if (line.value() == QLatin1String("2.1")) {
+        return v2_1;
+    }
+    if (line.value() == QLatin1String("3.0")) {
+        return v3_0;
+    }
+
+    return v4_0;
+}
diff --git a/src/vcardparser/vcard_p.h b/src/vcardparser/vcard_p.h
new file mode 100644 (file)
index 0000000..0da712b
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef VCARDPARSER_VCARD_H
+#define VCARDPARSER_VCARD_H
+
+#include "vcardline_p.h"
+#include <QMap>
+#include <QStringList>
+#include <QVector>
+
+#include <vector>
+
+namespace KContacts
+{
+class VCard
+{
+public:
+    typedef QVector<VCard> List;
+
+    struct LineData {
+        QString identifier;
+        VCardLine::List list;
+    };
+    using LineMap = std::vector<LineData>;
+
+    inline LineMap::iterator findByLineId(const QString &identifier)
+    {
+        return std::find_if(mLineMap.begin(), mLineMap.end(), [&identifier](const LineData &data) {
+            return data.identifier == identifier;
+        });
+    }
+
+    inline LineMap::const_iterator findByLineId(const QString &identifier) const
+    {
+        return std::find_if(mLineMap.cbegin(), mLineMap.cend(), [&identifier](const LineData &data) {
+            return data.identifier == identifier;
+        });
+    }
+
+    enum Version {
+        v2_1,
+        v3_0,
+        v4_0,
+    };
+
+    VCard();
+    VCard(const VCard &card);
+
+    ~VCard();
+
+    VCard &operator=(const VCard &card);
+
+    /**
+     * Removes all lines from the vCard.
+     */
+    void clear();
+
+    /**
+     * Returns a list of all identifiers that exists in the vCard.
+     */
+    Q_REQUIRED_RESULT QStringList identifiers() const;
+
+    /**
+     * Adds a VCardLine to the VCard
+     */
+    void addLine(const VCardLine &line);
+
+    /**
+     * Returns all lines of the vcard with a special identifier.
+     */
+    Q_REQUIRED_RESULT VCardLine::List lines(const QString &identifier) const;
+
+    /**
+     * Returns only the first line of the vcard with a special identifier.
+     */
+    Q_REQUIRED_RESULT VCardLine line(const QString &identifier) const;
+
+    /**
+     * Set the version of the vCard.
+     */
+    void setVersion(Version version);
+
+    /**
+     * Returns the version of this vCard.
+     */
+    Q_REQUIRED_RESULT Version version() const;
+
+private:
+    /**
+     * A container of LineData, sorted by identifier.
+     */
+    LineMap mLineMap;
+};
+
+inline bool operator<(const VCard::LineData &a, const VCard::LineData &b)
+{
+    return a.identifier < b.identifier;
+}
+}
+
+#endif
diff --git a/src/vcardparser/vcardline.cpp b/src/vcardparser/vcardline.cpp
new file mode 100644 (file)
index 0000000..dedf3a1
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "vcardline_p.h"
+
+#include "parametermap_p.h"
+
+using namespace KContacts;
+
+VCardLine::VCardLine()
+{
+}
+
+VCardLine::VCardLine(const QString &identifier)
+    : VCardLine(identifier, {})
+{
+}
+
+VCardLine::VCardLine(const QString &identifier, const QVariant &value)
+    : mIdentifier(identifier)
+    , mValue(value)
+{
+}
+
+VCardLine::VCardLine(const VCardLine &line)
+    : mParamMap(line.mParamMap)
+    , mIdentifier(line.mIdentifier)
+    , mGroup(line.mGroup)
+    , mValue(line.mValue)
+{
+}
+
+VCardLine::~VCardLine()
+{
+}
+
+VCardLine &VCardLine::operator=(const VCardLine &line)
+{
+    if (&line == this) {
+        return *this;
+    }
+
+    mParamMap = line.mParamMap;
+    mValue = line.mValue;
+    mIdentifier = line.mIdentifier;
+    mGroup = line.mGroup;
+
+    return *this;
+}
+
+bool VCardLine::operator==(const VCardLine &other) const
+{
+    // clang-format off
+    return (mParamMap == other.parameterMap())
+           && (mValue == other.value())
+           && (mIdentifier == other.identifier())
+           && (mGroup == other.group());
+    // clang-format on
+}
+
+void VCardLine::setIdentifier(const QString &identifier)
+{
+    mIdentifier = identifier;
+}
+
+QString VCardLine::identifier() const
+{
+    return mIdentifier;
+}
+
+void VCardLine::setValue(const QVariant &value)
+{
+    mValue = value;
+}
+
+QVariant VCardLine::value() const
+{
+    return mValue;
+}
+
+void VCardLine::setGroup(const QString &group)
+{
+    mGroup = group;
+}
+
+QString VCardLine::group() const
+{
+    return mGroup;
+}
+
+bool VCardLine::hasGroup() const
+{
+    return !mGroup.isEmpty();
+}
+
+QStringList VCardLine::parameterList() const
+{
+    QStringList list;
+    list.reserve(mParamMap.size());
+    for (const auto &[param, values] : mParamMap) {
+        list.append(param);
+    }
+
+    return list;
+}
+
+void VCardLine::addParameters(const ParameterMap &params)
+{
+    for (const auto &[param, list] : params) {
+        addParameter(param, list.join(QLatin1Char(',')));
+    }
+}
+
+void VCardLine::addParameter(const QString &param, const QString &value)
+{
+    auto it = mParamMap.findParam(param);
+    if (it != mParamMap.end()) {
+        if (!it->paramValues.contains(value)) { // not included yet
+            it->paramValues.push_back(value);
+        }
+    } else {
+        mParamMap.insertParam({param, QStringList{value}});
+    }
+}
+
+QStringList VCardLine::parameters(const QString &param) const
+{
+    auto it = mParamMap.findParam(param);
+    return it != mParamMap.cend() ? it->paramValues : QStringList{};
+}
+
+QString VCardLine::parameter(const QString &param) const
+{
+    auto it = mParamMap.findParam(param);
+    return it != mParamMap.cend() && !it->paramValues.isEmpty() ? it->paramValues.at(0) : QString{};
+}
+
+ParameterMap VCardLine::parameterMap() const
+{
+    return mParamMap;
+}
diff --git a/src/vcardparser/vcardline_p.h b/src/vcardparser/vcardline_p.h
new file mode 100644 (file)
index 0000000..521588c
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef VCARDLINE_H
+#define VCARDLINE_H
+
+#include <QString>
+#include <QStringList>
+#include <QVariant>
+
+#include "kcontacts_export.h"
+
+#include "../parametermap_p.h"
+
+namespace KContacts
+{
+class KCONTACTS_EXPORT VCardLine
+{
+public:
+    typedef QVector<VCardLine> List;
+
+    VCardLine();
+    VCardLine(const QString &identifier);
+    VCardLine(const QString &identifier, const QVariant &value);
+    VCardLine(const VCardLine &line);
+
+    ~VCardLine();
+
+    VCardLine &operator=(const VCardLine &line);
+
+    /**
+     * Equality operator.
+     *
+     */
+    Q_REQUIRED_RESULT bool operator==(const VCardLine &other) const;
+
+    /**
+     * Sets the identifier of this line e.g. UID, FN, CLASS
+     *
+     * @param identifier The VCard identifier of this line
+     */
+    void setIdentifier(const QString &identifier);
+
+    /**
+     * Returns the identifier of this line.
+     */
+    Q_REQUIRED_RESULT QString identifier() const;
+
+    /**
+     * Sets the value of this line.
+     */
+    void setValue(const QVariant &value);
+
+    /**
+     * Returns the value of this line.
+     */
+    Q_REQUIRED_RESULT QVariant value() const;
+
+    /**
+     * Sets the group the line belongs to.
+     */
+    void setGroup(const QString &group);
+
+    /**
+     * Returns the group the line belongs to.
+     */
+    Q_REQUIRED_RESULT QString group() const;
+
+    /**
+     * Returns whether the line belongs to a group.
+     */
+    Q_REQUIRED_RESULT bool hasGroup() const;
+
+    /**
+     * Returns all parameters.
+     */
+    Q_REQUIRED_RESULT QStringList parameterList() const;
+
+    /**
+     * Add a new parameter to the line.
+     *
+     * @param param Name of the parameter to insert
+     * @param value Value of the parameter to insert
+     */
+    void addParameter(const QString &param, const QString &value);
+
+    void addParameters(const ParameterMap &params);
+
+    /**
+     * Returns the values of a special parameter.
+     * You can get a list of all parameters with paramList().
+     *
+     * @param param Name of the parameter to look for
+     */
+    Q_REQUIRED_RESULT QStringList parameters(const QString &param) const;
+
+    /**
+     * Returns only the first value of a special parameter.
+     * You can get a list of all parameters with paramList().
+     *
+     * @param param Name of the parameter to look for
+     */
+    Q_REQUIRED_RESULT QString parameter(const QString &param) const;
+
+    /**
+     * Returns all parameters
+     */
+    Q_REQUIRED_RESULT ParameterMap parameterMap() const;
+
+private:
+    ParameterMap mParamMap;
+    QString mIdentifier;
+    QString mGroup;
+    QVariant mValue;
+};
+}
+
+#endif
diff --git a/src/vcardparser/vcardparser.cpp b/src/vcardparser/vcardparser.cpp
new file mode 100644 (file)
index 0000000..6994a57
--- /dev/null
@@ -0,0 +1,485 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "kcontacts_debug.h"
+#include "vcardparser_p.h"
+#include <KCodecs>
+#include <QTextCodec>
+#include <functional>
+
+// This cache for QString::fromLatin1() isn't about improving speed, but about reducing memory usage by sharing common strings
+class StringCache
+{
+public:
+    QString fromLatin1(const QByteArray &value)
+    {
+        if (value.isEmpty()) {
+            return QString();
+        }
+
+        auto it = m_values.constFind(value);
+        if (it != m_values.constEnd()) {
+            return it.value();
+        }
+
+        QString string = QString::fromLatin1(value);
+        m_values.insert(value, string);
+        return string;
+    }
+
+private:
+    QHash<QByteArray, QString> m_values;
+};
+
+using namespace KContacts;
+
+static void addEscapes(QByteArray &str, bool excludeEscapedComma)
+{
+    str.replace('\\', "\\\\");
+    if (!excludeEscapedComma) {
+        str.replace(',', "\\,");
+    }
+    str.replace('\r', "\\r");
+    str.replace('\n', "\\n");
+}
+
+static void removeEscapes(QByteArray &str)
+{
+    // It's more likely that no escape is present, so add fast path
+    if (!str.contains('\\')) {
+        return;
+    }
+    str.replace("\\n", "\n");
+    str.replace("\\N", "\n");
+    str.replace("\\r", "\r");
+    str.replace("\\,", ",");
+    str.replace("\\\\", "\\");
+}
+
+class VCardLineParser
+{
+public:
+    VCardLineParser(StringCache &cache, std::function<QByteArray()> fetchAnotherLine)
+        : m_cache(cache)
+        , m_fetchAnotherLine(fetchAnotherLine)
+    {
+    }
+
+    void parseLine(const QByteArray &currentLine, VCardLine *vCardLine);
+
+private:
+    void addParameter(const QByteArray &paramKey, const QByteArray &paramValue);
+
+private:
+    StringCache &m_cache;
+    std::function<QByteArray()> m_fetchAnotherLine;
+
+    VCardLine *m_vCardLine = nullptr;
+    QByteArray m_encoding;
+    QByteArray m_charset;
+};
+
+void VCardLineParser::addParameter(const QByteArray &paramKey, const QByteArray &paramValue)
+{
+    if (paramKey == "encoding") {
+        m_encoding = paramValue.toLower();
+    } else if (paramKey == "charset") {
+        m_charset = paramValue.toLower();
+    }
+    // qDebug() << "  add parameter" << paramKey << "    =    " << paramValue;
+    m_vCardLine->addParameter(m_cache.fromLatin1(paramKey), m_cache.fromLatin1(paramValue));
+}
+
+void VCardLineParser::parseLine(const QByteArray &currentLine, KContacts::VCardLine *vCardLine)
+{
+    // qDebug() << currentLine;
+    m_vCardLine = vCardLine;
+    // The syntax is key:value, but the key can contain semicolon-separated parameters, which can contain a ':', so indexOf(':') is wrong.
+    // EXAMPLE: ADR;GEO="geo:22.500000,45.099998";LABEL="My Label";TYPE=home:P.O. Box 101;;;Any Town;CA;91921-1234;
+    // Therefore we need a small state machine, just the way I like it.
+    enum State {
+        StateInitial,
+        StateParamKey,
+        StateParamValue,
+        StateQuotedValue,
+        StateAfterParamValue,
+        StateValue,
+    };
+    State state = StateInitial;
+    const int lineLength = currentLine.length();
+    const char *lineData = currentLine.constData(); // to skip length checks from at() in debug mode
+    QByteArray paramKey;
+    QByteArray paramValue;
+    int start = 0;
+    int pos = 0;
+    for (; pos < lineLength; ++pos) {
+        const char ch = lineData[pos];
+        const bool colonOrSemicolon = (ch == ';' || ch == ':');
+        switch (state) {
+        case StateInitial:
+            if (colonOrSemicolon) {
+                const QByteArray identifier = currentLine.mid(start, pos - start);
+                // qDebug() << " identifier" << identifier;
+                vCardLine->setIdentifier(m_cache.fromLatin1(identifier));
+                start = pos + 1;
+            }
+            if (ch == ';') {
+                state = StateParamKey;
+            } else if (ch == ':') {
+                state = StateValue;
+            } else if (ch == '.') {
+                vCardLine->setGroup(m_cache.fromLatin1(currentLine.mid(start, pos - start)));
+                start = pos + 1;
+            }
+            break;
+        case StateParamKey:
+            if (colonOrSemicolon || ch == '=') {
+                paramKey = currentLine.mid(start, pos - start);
+                start = pos + 1;
+            }
+            if (colonOrSemicolon) {
+                // correct the so-called 2.1 'standard'
+                paramValue = paramKey;
+                const QByteArray lowerKey = paramKey.toLower();
+                if (lowerKey == "quoted-printable" || lowerKey == "base64") {
+                    paramKey = "encoding";
+                } else {
+                    paramKey = "type";
+                }
+                addParameter(paramKey, paramValue);
+            }
+            if (ch == ';') {
+                state = StateParamKey;
+            } else if (ch == ':') {
+                state = StateValue;
+            } else if (ch == '=') {
+                state = StateParamValue;
+            }
+            break;
+        case StateQuotedValue:
+            if (ch == '"' || (ch == ',' && paramKey.toLower() == "type")) {
+                // TODO the hack above is for TEL;TYPE=\"voice,home\":... without breaking GEO.... TODO: check spec
+                paramValue = currentLine.mid(start, pos - start);
+                addParameter(paramKey.toLower(), paramValue);
+                start = pos + 1;
+                if (ch == '"') {
+                    state = StateAfterParamValue; // to avoid duplicating code with StateParamValue, we use this intermediate state for one char
+                }
+            }
+            break;
+        case StateParamValue:
+            if (colonOrSemicolon || ch == ',') {
+                paramValue = currentLine.mid(start, pos - start);
+                addParameter(paramKey.toLower(), paramValue);
+                start = pos + 1;
+            }
+            // fall-through intended
+            Q_FALLTHROUGH();
+        case StateAfterParamValue:
+            if (ch == ';') {
+                state = StateParamKey;
+                start = pos + 1;
+            } else if (ch == ':') {
+                state = StateValue;
+            } else if (pos == start && ch == '"') { // don't treat foo"bar" as quoted - TODO check the vCard 3.0 spec.
+                state = StateQuotedValue;
+                start = pos + 1;
+            }
+            break;
+        case StateValue:
+            Q_UNREACHABLE();
+            break;
+        }
+
+        if (state == StateValue) {
+            break;
+        }
+    }
+
+    if (state != StateValue) { // invalid line, no ':'
+        return;
+    }
+
+    QByteArray value = currentLine.mid(pos + 1);
+    removeEscapes(value);
+
+    QByteArray output;
+    bool wasBase64Encoded = false;
+
+    if (!m_encoding.isEmpty()) {
+        // have to decode the data
+        if (m_encoding == "b" || m_encoding == "base64") {
+            output = QByteArray::fromBase64(value);
+            wasBase64Encoded = true;
+        } else if (m_encoding == "quoted-printable") {
+            // join any qp-folded lines
+            while (value.endsWith('=')) {
+                value.chop(1); // remove the '='
+                value.append(m_fetchAnotherLine());
+            }
+            KCodecs::quotedPrintableDecode(value, output);
+        } else if (m_encoding == "8bit") {
+            output = value;
+        } else {
+            qDebug("Unknown vcard encoding type!");
+        }
+    } else {
+        output = value;
+    }
+
+    if (!m_charset.isEmpty()) {
+        // have to convert the data
+        QTextCodec *codec = QTextCodec::codecForName(m_charset);
+        if (codec) {
+            vCardLine->setValue(codec->toUnicode(output));
+        } else {
+            vCardLine->setValue(QString::fromUtf8(output));
+        }
+    } else if (wasBase64Encoded) {
+        vCardLine->setValue(output);
+    } else {
+        vCardLine->setValue(QString::fromUtf8(output));
+    }
+}
+
+////
+
+VCardParser::VCardParser()
+{
+}
+
+VCardParser::~VCardParser()
+{
+}
+
+VCard::List VCardParser::parseVCards(const QByteArray &text)
+{
+    VCard currentVCard;
+    VCard::List vCardList;
+    QByteArray currentLine;
+
+    int lineStart = 0;
+    int lineEnd = text.indexOf('\n');
+
+    bool inVCard = false;
+
+    StringCache cache;
+    for (; lineStart != text.size() + 1;
+         lineStart = lineEnd + 1, lineEnd = (text.indexOf('\n', lineStart) == -1) ? text.size() : text.indexOf('\n', lineStart)) {
+        QByteArray cur = text.mid(lineStart, lineEnd - lineStart);
+        // remove the trailing \r, left from \r\n
+        if (cur.endsWith('\r')) {
+            cur.chop(1);
+        }
+
+        if (cur.startsWith(' ') //
+            || cur.startsWith('\t')) { // folded line => append to previous
+            currentLine.append(cur.mid(1));
+            continue;
+        } else {
+            if (cur.trimmed().isEmpty()) { // empty line
+                continue;
+            }
+            if (inVCard && !currentLine.isEmpty()) { // now parse the line
+                VCardLine vCardLine;
+
+                // Provide a way for the parseVCardLine function to read more lines (for quoted-printable support)
+                auto fetchAnotherLine = [&text, &lineStart, &lineEnd, &cur]() -> QByteArray {
+                    const QByteArray ret = cur;
+                    lineStart = lineEnd + 1;
+                    lineEnd = text.indexOf('\n', lineStart);
+                    if (lineEnd != -1) {
+                        cur = text.mid(lineStart, lineEnd - lineStart);
+                        // remove the trailing \r, left from \r\n
+                        if (cur.endsWith('\r')) {
+                            cur.chop(1);
+                        }
+                    }
+                    return ret;
+                };
+
+                VCardLineParser lineParser(cache, fetchAnotherLine);
+
+                lineParser.parseLine(currentLine, &vCardLine);
+
+                currentVCard.addLine(vCardLine);
+            }
+
+            // we do not save the start and end tag as vcardline
+            if (qstrnicmp(cur.constData(), "begin:vcard", 11) == 0) {
+                inVCard = true;
+                currentLine.clear();
+                currentVCard.clear(); // flush vcard
+                continue;
+            }
+
+            if (qstrnicmp(cur.constData(), "end:vcard", 9) == 0) {
+                inVCard = false;
+                vCardList.append(currentVCard);
+                currentLine.clear();
+                currentVCard.clear(); // flush vcard
+                continue;
+            }
+
+            currentLine = cur;
+        }
+    }
+
+    return vCardList;
+}
+
+static const int FOLD_WIDTH = 75;
+
+QByteArray VCardParser::createVCards(const VCard::List &list)
+{
+    QByteArray text;
+    QByteArray textLine;
+    QString encodingType;
+    QStringList params;
+    QStringList values;
+
+    VCardLine::List lines;
+
+    bool hasEncoding;
+
+    text.reserve(list.size() * 300); // reserve memory to be more efficient
+
+    // iterate over the cards
+    for (const VCard &card : list) {
+        text.append("BEGIN:VCARD\r\n");
+
+        QStringList idents = card.identifiers();
+        // VERSION must be first
+        if (idents.contains(QLatin1String("VERSION"))) {
+            const QString str = idents.takeAt(idents.indexOf(QLatin1String("VERSION")));
+            idents.prepend(str);
+        }
+
+        for (const auto &id : std::as_const(idents)) {
+            lines = card.lines(id);
+
+            // iterate over the lines
+            for (const VCardLine &vline : std::as_const(lines)) {
+                QVariant val = vline.value();
+                if (val.isValid()) {
+                    if (vline.hasGroup()) {
+                        textLine = vline.group().toLatin1() + '.' + vline.identifier().toLatin1();
+                    } else {
+                        textLine = vline.identifier().toLatin1();
+                    }
+
+                    params = vline.parameterList();
+                    hasEncoding = false;
+                    if (!params.isEmpty()) { // we have parameters
+                        for (const QString &param : std::as_const(params)) {
+                            if (param == QLatin1String("encoding")) {
+                                hasEncoding = true;
+                                encodingType = vline.parameter(QStringLiteral("encoding")).toLower();
+                            }
+
+                            values = vline.parameters(param);
+                            for (const QString &str : std::as_const(values)) {
+                                textLine.append(';' + param.toLatin1().toUpper());
+                                if (!str.isEmpty()) {
+                                    textLine.append('=' + str.toLatin1());
+                                }
+                            }
+                        }
+                    }
+
+                    QByteArray input;
+                    QByteArray output;
+                    bool checkMultibyte = false; // avoid splitting a multibyte character
+
+                    // handle charset
+                    const QString charset = vline.parameter(QStringLiteral("charset"));
+                    if (!charset.isEmpty()) {
+                        // have to convert the data
+                        const QString value = vline.value().toString();
+                        QTextCodec *codec = QTextCodec::codecForName(charset.toLatin1());
+                        if (codec) {
+                            input = codec->fromUnicode(value);
+                        } else {
+                            checkMultibyte = true;
+                            input = value.toUtf8();
+                        }
+                    } else if (vline.value().type() == QVariant::ByteArray) {
+                        input = vline.value().toByteArray();
+                    } else {
+                        checkMultibyte = true;
+                        input = vline.value().toString().toUtf8();
+                    }
+
+                    // handle encoding
+                    if (hasEncoding) { // have to encode the data
+                        if (encodingType == QLatin1Char('b')) {
+                            checkMultibyte = false;
+                            output = input.toBase64();
+                        } else if (encodingType == QLatin1String("quoted-printable")) {
+                            checkMultibyte = false;
+                            KCodecs::quotedPrintableEncode(input, output, false);
+                        }
+                    } else {
+                        output = input;
+                    }
+                    addEscapes(output, (vline.identifier() == QLatin1String("CATEGORIES") || vline.identifier() == QLatin1String("GEO")));
+
+                    if (!output.isEmpty()) {
+                        textLine.append(':' + output);
+
+                        if (textLine.length() > FOLD_WIDTH) { // we have to fold the line
+                            if (checkMultibyte) {
+                                // RFC 6350: Multi-octet characters MUST remain contiguous.
+                                // we know that textLine contains UTF-8 encoded characters
+                                int lineLength = 0;
+                                for (int i = 0; i < textLine.length(); ++i) {
+                                    if ((textLine[i] & 0xC0) == 0xC0) { // a multibyte sequence follows
+                                        int sequenceLength = 2;
+                                        if ((textLine[i] & 0xE0) == 0xE0) {
+                                            sequenceLength = 3;
+                                        } else if ((textLine[i] & 0xF0) == 0xF0) {
+                                            sequenceLength = 4;
+                                        }
+                                        if ((lineLength + sequenceLength) > FOLD_WIDTH) {
+                                            // the current line would be too long. fold it
+                                            text += "\r\n " + textLine.mid(i, sequenceLength);
+                                            lineLength = 1 + sequenceLength; // incl. leading space
+                                        } else {
+                                            text += textLine.mid(i, sequenceLength);
+                                            lineLength += sequenceLength;
+                                        }
+                                        i += sequenceLength - 1;
+                                    } else {
+                                        text += textLine[i];
+                                        ++lineLength;
+                                    }
+                                    if ((lineLength == FOLD_WIDTH) && (i < (textLine.length() - 1))) {
+                                        text += "\r\n ";
+                                        lineLength = 1; // leading space
+                                    }
+                                }
+                                text += "\r\n";
+                            } else {
+                                for (int i = 0; i <= (textLine.length() / FOLD_WIDTH); ++i) {
+                                    text.append((i == 0 ? "" : " ") + textLine.mid(i * FOLD_WIDTH, FOLD_WIDTH) + "\r\n");
+                                }
+                            }
+                        } else {
+                            text.append(textLine);
+                            text.append("\r\n");
+                        }
+                    }
+                }
+            }
+        }
+
+        text.append("END:VCARD\r\n");
+        text.append("\r\n");
+    }
+
+    return text;
+}
diff --git a/src/vcardparser/vcardparser_p.h b/src/vcardparser/vcardparser_p.h
new file mode 100644 (file)
index 0000000..69ff8d2
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef VCARDPARSER_H
+#define VCARDPARSER_H
+
+#include "vcard_p.h"
+#include <QByteArray>
+
+namespace KContacts
+{
+class VCardParser
+{
+public:
+    VCardParser();
+    ~VCardParser();
+
+    static VCard::List parseVCards(const QByteArray &text);
+    static QByteArray createVCards(const VCard::List &list);
+
+private:
+    Q_DISABLE_COPY(VCardParser)
+    class VCardParserPrivate;
+    VCardParserPrivate *d = nullptr;
+};
+}
+
+#endif
diff --git a/src/vcardtool.cpp b/src/vcardtool.cpp
new file mode 100644 (file)
index 0000000..001a05c
--- /dev/null
@@ -0,0 +1,1583 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+    SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "fieldgroup.h"
+#include "gender.h"
+#include "kcontacts_debug.h"
+#include "key.h"
+#include "lang.h"
+#include "picture.h"
+#include "related.h"
+#include "secrecy.h"
+#include "sound.h"
+#include "vcardtool_p.h"
+
+#include <QString>
+
+using namespace KContacts;
+
+static bool needsEncoding(const QString &value)
+{
+    int length = value.length();
+    for (int i = 0; i < length; ++i) {
+        char c = value.at(i).toLatin1();
+        if ((c < 33 || c > 126) && c != ' ' && c != '=') {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+struct AddressTypeInfo {
+    const char *addressType;
+    Address::TypeFlag flag;
+};
+
+static const AddressTypeInfo s_addressTypes[] = {
+    {"dom", Address::Dom},
+    {"home", Address::Home},
+    {"intl", Address::Intl},
+    {"parcel", Address::Parcel},
+    {"postal", Address::Postal},
+    {"pref", Address::Pref},
+    {"work", Address::Work},
+};
+
+static Address::TypeFlag stringToAddressType(const QString &str)
+{
+    auto it = std::find_if(std::begin(s_addressTypes), std::end(s_addressTypes), [&str](const AddressTypeInfo &info) {
+        return str == QLatin1String(info.addressType);
+    });
+    return it != std::end(s_addressTypes) ? it->flag : Address::TypeFlag{};
+}
+
+struct PhoneTypeInfo {
+    const char *phoneType;
+    PhoneNumber::TypeFlag flag;
+};
+
+static const PhoneTypeInfo s_phoneTypes[] = {
+    {"BBS", PhoneNumber::Bbs},
+    {"CAR", PhoneNumber::Car},
+    {"CELL", PhoneNumber::Cell},
+    {"FAX", PhoneNumber::Fax},
+    {"HOME", PhoneNumber::Home},
+    {"ISDN", PhoneNumber::Isdn},
+    {"MODEM", PhoneNumber::Modem},
+    {"MSG", PhoneNumber::Msg},
+    {"PAGER", PhoneNumber::Pager},
+    {"PCS", PhoneNumber::Pcs},
+    {"PREF", PhoneNumber::Pref},
+    {"VIDEO", PhoneNumber::Video},
+    {"VOICE", PhoneNumber::Voice},
+    {"WORK", PhoneNumber::Work},
+};
+
+static PhoneNumber::TypeFlag stringToPhoneType(const QString &str)
+{
+    auto it = std::find_if(std::begin(s_phoneTypes), std::end(s_phoneTypes), [&str](const PhoneTypeInfo &info) {
+        return str == QLatin1String(info.phoneType);
+    });
+    return it != std::end(s_phoneTypes) ? it->flag : PhoneNumber::TypeFlag{};
+}
+
+VCardTool::VCardTool()
+{
+}
+
+VCardTool::~VCardTool()
+{
+}
+
+QByteArray VCardTool::exportVCards(const Addressee::List &list, VCard::Version version) const
+{
+    return createVCards(list, version, true /*export vcard*/);
+}
+
+QByteArray VCardTool::createVCards(const Addressee::List &list, VCard::Version version) const
+{
+    return createVCards(list, version, false /*don't export*/);
+}
+
+void VCardTool::addParameter(VCardLine *line, VCard::Version version, const QString &key, const QStringList &valueStringList) const
+{
+    if (version == VCard::v2_1) {
+        for (const QString &valueStr : valueStringList) {
+            line->addParameter(valueStr, QString());
+        }
+    } else if (version == VCard::v3_0) {
+        line->addParameter(key, valueStringList.join(QLatin1Char(',')));
+    } else {
+        if (valueStringList.count() < 2) {
+            line->addParameter(key, valueStringList.join(QLatin1Char(',')));
+        } else {
+            line->addParameter(key, QLatin1Char('"') + valueStringList.join(QLatin1Char(',')) + QLatin1Char('"'));
+        }
+    }
+}
+
+void VCardTool::processAddresses(const Address::List &addresses, VCard::Version version, VCard *card) const
+{
+    for (const auto &addr : addresses) {
+        QStringList address;
+
+        // clang-format off
+        const bool isEmpty = addr.postOfficeBox().isEmpty()
+                             && addr.extended().isEmpty()
+                             && addr.street().isEmpty()
+                             && addr.locality().isEmpty()
+                             && addr.region().isEmpty()
+                             && addr.postalCode().isEmpty()
+                             && addr.country().isEmpty();
+        // clang-format on
+
+        address.append(addr.postOfficeBox().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        address.append(addr.extended().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        address.append(addr.street().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        address.append(addr.locality().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        address.append(addr.region().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        address.append(addr.postalCode().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        address.append(addr.country().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+
+        const QString addressJoined(address.join(QLatin1Char(';')));
+        VCardLine adrLine(QStringLiteral("ADR"), addressJoined);
+        if (version == VCard::v2_1 && needsEncoding(addressJoined)) {
+            adrLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+            adrLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+        }
+
+        const bool hasLabel = !addr.label().isEmpty();
+        QStringList addreLineType;
+        QStringList labelLineType;
+
+        for (const auto &info : s_addressTypes) {
+            if (info.flag & addr.type()) {
+                const QString str = QString::fromLatin1(info.addressType);
+                addreLineType << str;
+                if (hasLabel) {
+                    labelLineType << str;
+                }
+            }
+        }
+
+        if (hasLabel) {
+            if (version == VCard::v4_0) {
+                if (!addr.label().isEmpty()) {
+                    adrLine.addParameter(QStringLiteral("LABEL"), QStringLiteral("\"%1\"").arg(addr.label()));
+                }
+            } else {
+                VCardLine labelLine(QStringLiteral("LABEL"), addr.label());
+                if (version == VCard::v2_1 && needsEncoding(addr.label())) {
+                    labelLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+                    labelLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+                }
+                addParameter(&labelLine, version, QStringLiteral("TYPE"), labelLineType);
+                card->addLine(labelLine);
+            }
+        }
+        if (version == VCard::v4_0) {
+            Geo geo = addr.geo();
+            if (geo.isValid()) {
+                QString str = QString::asprintf("\"geo:%.6f,%.6f\"", geo.latitude(), geo.longitude());
+                adrLine.addParameter(QStringLiteral("GEO"), str);
+            }
+        }
+        if (!isEmpty) {
+            addParameter(&adrLine, version, QStringLiteral("TYPE"), addreLineType);
+            card->addLine(adrLine);
+        }
+    }
+}
+
+void VCardTool::processEmailList(const Email::List &emailList, VCard::Version version, VCard *card) const
+{
+    for (const auto &email : emailList) {
+        VCardLine line(QStringLiteral("EMAIL"), email.mail());
+        const ParameterMap pMap = email.params();
+        for (const auto &[param, l] : pMap) {
+            QStringList list = l;
+            if (version == VCard::v2_1) {
+                if (param.toLower() == QLatin1String("type")) {
+                    bool hasPreferred = false;
+                    const int removeItems = list.removeAll(QStringLiteral("PREF"));
+                    if (removeItems > 0) {
+                        hasPreferred = true;
+                    }
+                    if (!list.isEmpty()) {
+                        addParameter(&line, version, param, list);
+                    }
+                    if (hasPreferred) {
+                        line.addParameter(QStringLiteral("PREF"), QString());
+                    }
+                } else {
+                    line.addParameter(param, list.join(QLatin1Char(',')));
+                }
+            } else {
+                line.addParameter(param, list.join(QLatin1Char(',')));
+            }
+        }
+        card->addLine(line);
+    }
+}
+
+void VCardTool::processOrganizations(const Addressee &addressee, VCard::Version version, VCard *card) const
+{
+    const QVector<Org> lstOrg = addressee.extraOrganizationList();
+    for (const Org &org : lstOrg) {
+        QStringList organization{org.organization().replace(QLatin1Char(';'), QLatin1String("\\;"))};
+        if (!addressee.department().isEmpty()) {
+            organization.append(addressee.department().replace(QLatin1Char(';'), QLatin1String("\\;")));
+        }
+        const QString orgStr = organization.join(QLatin1Char(';'));
+        VCardLine orgLine(QStringLiteral("ORG"), orgStr);
+        if (version == VCard::v2_1 && needsEncoding(orgStr)) {
+            orgLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+            orgLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+        }
+        orgLine.addParameters(org.params());
+        card->addLine(orgLine);
+    }
+}
+
+void VCardTool::processPhoneNumbers(const PhoneNumber::List &phoneNumbers, VCard::Version version, VCard *card) const
+{
+    for (const auto &phone : phoneNumbers) {
+        VCardLine line(QStringLiteral("TEL"), phone.number());
+        const ParameterMap paramsMap = phone.params();
+        for (const auto &[param, list] : paramsMap) {
+            if (param.toUpper() != QLatin1String("TYPE")) {
+                line.addParameter(param, list.join(QLatin1Char(',')));
+            }
+        }
+
+        const PhoneNumber::Type type = phone.type();
+        QStringList lst;
+        for (const auto &pType : s_phoneTypes) {
+            if (pType.flag & type) {
+                const QString str = QString::fromLatin1(pType.phoneType);
+                if (version == VCard::v4_0) {
+                    lst << str.toLower();
+                } else {
+                    lst << str;
+                }
+            }
+        }
+        if (!lst.isEmpty()) {
+            addParameter(&line, version, QStringLiteral("TYPE"), lst);
+        }
+        card->addLine(line);
+    }
+}
+
+void VCardTool::processCustoms(const QStringList &customs, VCard::Version version, VCard *card, bool exportVcard) const
+{
+    for (const auto &str : customs) {
+        QString identifier = QLatin1String("X-") + QStringView(str).left(str.indexOf(QLatin1Char(':')));
+        const QString value = str.mid(str.indexOf(QLatin1Char(':')) + 1);
+        if (value.isEmpty()) {
+            continue;
+        }
+        // Convert to standard identifier
+        if (exportVcard) {
+            if (identifier == QLatin1String("X-messaging/aim-All")) {
+                identifier = QStringLiteral("X-AIM");
+            } else if (identifier == QLatin1String("X-messaging/icq-All")) {
+                identifier = QStringLiteral("X-ICQ");
+            } else if (identifier == QLatin1String("X-messaging/xmpp-All")) {
+                identifier = QStringLiteral("X-JABBER");
+            } else if (identifier == QLatin1String("X-messaging/msn-All")) {
+                identifier = QStringLiteral("X-MSN");
+            } else if (identifier == QLatin1String("X-messaging/yahoo-All")) {
+                identifier = QStringLiteral("X-YAHOO");
+            } else if (identifier == QLatin1String("X-messaging/gadu-All")) {
+                identifier = QStringLiteral("X-GADUGADU");
+            } else if (identifier == QLatin1String("X-messaging/skype-All")) {
+                identifier = QStringLiteral("X-SKYPE");
+            } else if (identifier == QLatin1String("X-messaging/groupwise-All")) {
+                identifier = QStringLiteral("X-GROUPWISE");
+            } else if (identifier == QLatin1String("X-messaging/sms-All")) {
+                identifier = QStringLiteral("X-SMS");
+            } else if (identifier == QLatin1String("X-messaging/meanwhile-All")) {
+                identifier = QStringLiteral("X-MEANWHILE");
+            } else if (identifier == QLatin1String("X-messaging/irc-All")) {
+                identifier = QStringLiteral("X-IRC"); // Not defined by rfc but need for fixing #300869
+            } else if (identifier == QLatin1String("X-messaging/googletalk-All")) {
+                // Not defined by rfc but need for fixing #300869
+                identifier = QStringLiteral("X-GTALK");
+            } else if (identifier == QLatin1String("X-messaging/twitter-All")) {
+                identifier = QStringLiteral("X-TWITTER");
+            }
+        }
+
+        if (identifier.toLower() == QLatin1String("x-kaddressbook-x-anniversary") && version == VCard::v4_0) {
+            // ANNIVERSARY
+            if (!value.isEmpty()) {
+                const QDate date = QDate::fromString(value, Qt::ISODate);
+                QDateTime dt = QDateTime(date.startOfDay());
+                dt.setTime(QTime());
+                VCardLine line(QStringLiteral("ANNIVERSARY"), createDateTime(dt, version, false));
+                card->addLine(line);
+            }
+        } else if (identifier.toLower() == QLatin1String("x-kaddressbook-x-spousesname") && version == VCard::v4_0) {
+            if (!value.isEmpty()) {
+                VCardLine line(QStringLiteral("RELATED"), QStringLiteral(";"));
+                line.addParameter(QStringLiteral("TYPE"), QStringLiteral("spouse"));
+                line.addParameter(QStringLiteral("VALUE"), value);
+                card->addLine(line);
+            }
+        } else {
+            VCardLine line(identifier, value);
+            if (version == VCard::v2_1 && needsEncoding(value)) {
+                line.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+                line.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+            }
+            card->addLine(line);
+        }
+    }
+}
+
+QByteArray VCardTool::createVCards(const Addressee::List &list, VCard::Version version, bool exportVcard) const
+{
+    VCard::List vCardList;
+
+    for (const auto &addressee : list) {
+        VCard card;
+        // VERSION
+        if (version == VCard::v2_1) {
+            card.addLine(VCardLine(QStringLiteral("VERSION"), QStringLiteral("2.1")));
+        } else if (version == VCard::v3_0) {
+            card.addLine(VCardLine(QStringLiteral("VERSION"), QStringLiteral("3.0")));
+        } else if (version == VCard::v4_0) {
+            card.addLine(VCardLine(QStringLiteral("VERSION"), QStringLiteral("4.0")));
+        }
+
+        // ADR + LABEL
+        const Address::List addresses = addressee.addresses();
+        processAddresses(addresses, version, &card);
+
+        // BDAY
+        const bool withTime = addressee.birthdayHasTime();
+        const QString birthdayString = createDateTime(addressee.birthday(), version, withTime);
+        card.addLine(VCardLine(QStringLiteral("BDAY"), birthdayString));
+
+        // CATEGORIES only > 2.1
+        if (version != VCard::v2_1) {
+            QStringList categories = addressee.categories();
+            for (auto &cat : categories) {
+                cat.replace(QLatin1Char(','), QLatin1String("\\,"));
+            }
+
+            VCardLine catLine(QStringLiteral("CATEGORIES"), categories.join(QLatin1Char(',')));
+            card.addLine(catLine);
+        }
+        // MEMBER (only in 4.0)
+        if (version == VCard::v4_0) {
+            // The KIND property must be set to "group" in order to use this property.
+            if (addressee.kind().toLower() == QLatin1String("group")) {
+                const QStringList lst = addressee.members();
+                for (const QString &member : lst) {
+                    card.addLine(VCardLine(QStringLiteral("MEMBER"), member));
+                }
+            }
+        }
+        // SOURCE
+        const QVector<QUrl> lstUrl = addressee.sourcesUrlList();
+        for (const QUrl &url : lstUrl) {
+            VCardLine line = VCardLine(QStringLiteral("SOURCE"), url.url());
+            card.addLine(line);
+        }
+
+        const Related::List relatedList = addressee.relationships();
+        for (const auto &rel : relatedList) {
+            VCardLine line(QStringLiteral("RELATED"), rel.related());
+            line.addParameters(rel.params());
+            card.addLine(line);
+        }
+        // CLASS only for version == 3.0
+        if (version == VCard::v3_0) {
+            card.addLine(createSecrecy(addressee.secrecy()));
+        }
+        // LANG only for version == 4.0
+        if (version == VCard::v4_0) {
+            const Lang::List langList = addressee.langs();
+            for (const auto &lang : langList) {
+                VCardLine line(QStringLiteral("LANG"), lang.language());
+                line.addParameters(lang.params());
+                card.addLine(line);
+            }
+        }
+        // CLIENTPIDMAP
+        if (version == VCard::v4_0) {
+            const ClientPidMap::List clientpidmapList = addressee.clientPidMapList();
+            for (const auto &pMap : clientpidmapList) {
+                VCardLine line(QStringLiteral("CLIENTPIDMAP"), pMap.clientPidMap());
+                line.addParameters(pMap.params());
+                card.addLine(line);
+            }
+        }
+        // EMAIL
+        const Email::List emailList = addressee.emailList();
+        processEmailList(emailList, version, &card);
+
+        // FN required for only version > 2.1
+        VCardLine fnLine(QStringLiteral("FN"), addressee.formattedName());
+        if (version == VCard::v2_1 && needsEncoding(addressee.formattedName())) {
+            fnLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+            fnLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+        }
+        card.addLine(fnLine);
+
+        // GEO
+        const Geo geo = addressee.geo();
+        if (geo.isValid()) {
+            QString str;
+            if (version == VCard::v4_0) {
+                str = QString::asprintf("geo:%.6f,%.6f", geo.latitude(), geo.longitude());
+            } else {
+                str = QString::asprintf("%.6f;%.6f", geo.latitude(), geo.longitude());
+            }
+            card.addLine(VCardLine(QStringLiteral("GEO"), str));
+        }
+
+        // KEY
+        const Key::List keys = addressee.keys();
+        for (const auto &k : keys) {
+            card.addLine(createKey(k, version));
+        }
+
+        // LOGO
+        card.addLine(createPicture(QStringLiteral("LOGO"), addressee.logo(), version));
+        const QVector<Picture> lstLogo = addressee.extraLogoList();
+        for (const Picture &logo : lstLogo) {
+            card.addLine(createPicture(QStringLiteral("LOGO"), logo, version));
+        }
+
+        // MAILER only for version < 4.0
+        if (version != VCard::v4_0) {
+            VCardLine mailerLine(QStringLiteral("MAILER"), addressee.mailer());
+            if (version == VCard::v2_1 && needsEncoding(addressee.mailer())) {
+                mailerLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+                mailerLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+            }
+            card.addLine(mailerLine);
+        }
+
+        // N required for only version < 4.0
+        QStringList name;
+        name.append(addressee.familyName().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        name.append(addressee.givenName().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        name.append(addressee.additionalName().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        name.append(addressee.prefix().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+        name.append(addressee.suffix().replace(QLatin1Char(';'), QStringLiteral("\\;")));
+
+        VCardLine nLine(QStringLiteral("N"), name.join(QLatin1Char(';')));
+        if (version == VCard::v2_1 && needsEncoding(name.join(QLatin1Char(';')))) {
+            nLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+            nLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+        }
+        if (version == VCard::v4_0 && !addressee.sortString().isEmpty()) {
+            nLine.addParameter(QStringLiteral("SORT-AS"), addressee.sortString());
+        }
+
+        card.addLine(nLine);
+
+        // NAME only for version < 4.0
+        if (version != VCard::v4_0) {
+            VCardLine nameLine(QStringLiteral("NAME"), addressee.name());
+            if (version == VCard::v2_1 && needsEncoding(addressee.name())) {
+                nameLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+                nameLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+            }
+            card.addLine(nameLine);
+        }
+
+        // NICKNAME only for version > 2.1
+        if (version != VCard::v2_1) {
+            const QVector<NickName> lstNickName = addressee.extraNickNameList();
+            for (const NickName &nickName : lstNickName) {
+                VCardLine nickNameLine(QStringLiteral("NICKNAME"), nickName.nickname());
+                nickNameLine.addParameters(nickName.params());
+
+                card.addLine(nickNameLine);
+            }
+        }
+
+        // NOTE
+        VCardLine noteLine(QStringLiteral("NOTE"), addressee.note());
+        if (version == VCard::v2_1 && needsEncoding(addressee.note())) {
+            noteLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+            noteLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+        }
+        card.addLine(noteLine);
+
+        // ORG
+        processOrganizations(addressee, version, &card);
+
+        // PHOTO
+        card.addLine(createPicture(QStringLiteral("PHOTO"), addressee.photo(), version));
+        const QVector<Picture> lstExtraPhoto = addressee.extraPhotoList();
+        for (const Picture &photo : lstExtraPhoto) {
+            card.addLine(createPicture(QStringLiteral("PHOTO"), photo, version));
+        }
+
+        // PROID only for version > 2.1
+        if (version != VCard::v2_1) {
+            card.addLine(VCardLine(QStringLiteral("PRODID"), addressee.productId()));
+        }
+
+        // REV
+        card.addLine(VCardLine(QStringLiteral("REV"), createDateTime(addressee.revision(), version)));
+
+        // ROLE
+        const QVector<Role> lstExtraRole = addressee.extraRoleList();
+        for (const Role &role : lstExtraRole) {
+            VCardLine roleLine(QStringLiteral("ROLE"), role.role());
+            if (version == VCard::v2_1 && needsEncoding(role.role())) {
+                roleLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+                roleLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+            }
+            roleLine.addParameters(role.params());
+            card.addLine(roleLine);
+        }
+
+        // SORT-STRING
+        if (version == VCard::v3_0) {
+            card.addLine(VCardLine(QStringLiteral("SORT-STRING"), addressee.sortString()));
+        }
+
+        // SOUND
+        card.addLine(createSound(addressee.sound(), version));
+        const QVector<Sound> lstSound = addressee.extraSoundList();
+        for (const Sound &sound : lstSound) {
+            card.addLine(createSound(sound, version));
+        }
+
+        // TEL
+        const PhoneNumber::List phoneNumbers = addressee.phoneNumbers();
+        processPhoneNumbers(phoneNumbers, version, &card);
+
+        // TITLE
+        const QVector<Title> lstTitle = addressee.extraTitleList();
+        for (const Title &title : lstTitle) {
+            VCardLine titleLine(QStringLiteral("TITLE"), title.title());
+            if (version == VCard::v2_1 && needsEncoding(title.title())) {
+                titleLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8"));
+                titleLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE"));
+            }
+            titleLine.addParameters(title.params());
+
+            card.addLine(titleLine);
+        }
+
+        // TZ
+        // TODO Add vcard4.0 support
+        const TimeZone timeZone = addressee.timeZone();
+        if (timeZone.isValid()) {
+            int neg = 1;
+            if (timeZone.offset() < 0) {
+                neg = -1;
+            }
+
+            QString str =
+                QString::asprintf("%c%02d:%02d", (timeZone.offset() >= 0 ? '+' : '-'), (timeZone.offset() / 60) * neg, (timeZone.offset() % 60) * neg);
+
+            card.addLine(VCardLine(QStringLiteral("TZ"), str));
+        }
+
+        // UID
+        card.addLine(VCardLine(QStringLiteral("UID"), addressee.uid()));
+
+        // URL
+        const QVector<ResourceLocatorUrl> lstExtraUrl = addressee.extraUrlList();
+        for (const ResourceLocatorUrl &url : lstExtraUrl) {
+            VCardLine line(QStringLiteral("URL"), url.url());
+            line.addParameters(url.params());
+            card.addLine(line);
+        }
+        if (version == VCard::v4_0) {
+            // GENDER
+            const Gender gender = addressee.gender();
+            if (gender.isValid()) {
+                QString genderStr;
+                if (!gender.gender().isEmpty()) {
+                    genderStr = gender.gender();
+                }
+                if (!gender.comment().isEmpty()) {
+                    genderStr += QLatin1Char(';') + gender.comment();
+                }
+                VCardLine line(QStringLiteral("GENDER"), genderStr);
+                card.addLine(line);
+            }
+            // KIND
+            if (!addressee.kind().isEmpty()) {
+                VCardLine line(QStringLiteral("KIND"), addressee.kind());
+                card.addLine(line);
+            }
+        }
+        // From vcard4.
+        if (version == VCard::v4_0) {
+            const QVector<CalendarUrl> lstCalendarUrl = addressee.calendarUrlList();
+            for (const CalendarUrl &url : lstCalendarUrl) {
+                if (url.isValid()) {
+                    QString type;
+                    switch (url.type()) {
+                    case CalendarUrl::Unknown:
+                    case CalendarUrl::EndCalendarType:
+                        break;
+                    case CalendarUrl::FBUrl:
+                        type = QStringLiteral("FBURL");
+                        break;
+                    case CalendarUrl::CALUri:
+                        type = QStringLiteral("CALURI");
+                        break;
+                    case CalendarUrl::CALADRUri:
+                        type = QStringLiteral("CALADRURI");
+                        break;
+                    }
+                    if (!type.isEmpty()) {
+                        VCardLine line(type, url.url().toDisplayString());
+                        line.addParameters(url.params());
+                        card.addLine(line);
+                    }
+                }
+            }
+        }
+
+        // FieldGroup
+        const QVector<FieldGroup> lstGroup = addressee.fieldGroupList();
+        for (const FieldGroup &group : lstGroup) {
+            VCardLine line(group.fieldGroupName(), group.value());
+            line.addParameters(group.params());
+            card.addLine(line);
+        }
+
+        // IMPP (supported in vcard 3 too)
+        const QVector<Impp> lstImpp = addressee.imppList();
+        for (const Impp &impp : lstImpp) {
+            VCardLine line(QStringLiteral("IMPP"), impp.address().url());
+            const ParameterMap pMap = impp.params();
+            for (const auto &[param, list] : pMap) {
+                if (param.toLower() != QLatin1String("x-service-type")) {
+                    line.addParameter(param, list.join(QLatin1Char(',')));
+                }
+            }
+            card.addLine(line);
+        }
+
+        // X-
+        const QStringList customs = addressee.customs();
+        processCustoms(customs, version, &card, exportVcard);
+
+        vCardList.append(card);
+    }
+
+    return VCardParser::createVCards(vCardList);
+}
+
+Addressee::List VCardTool::parseVCards(const QByteArray &vcard) const
+{
+    static const QLatin1Char semicolonSep(';');
+    static const QLatin1Char commaSep(',');
+    QString identifier;
+    QString group;
+    Addressee::List addrList;
+    const VCard::List vCardList = VCardParser::parseVCards(vcard);
+
+    VCard::List::ConstIterator cardIt;
+    VCard::List::ConstIterator listEnd(vCardList.end());
+    for (cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt) {
+        Addressee addr;
+
+        const QStringList idents = (*cardIt).identifiers();
+        QStringList::ConstIterator identIt;
+        QStringList::ConstIterator identEnd(idents.end());
+        for (identIt = idents.begin(); identIt != identEnd; ++identIt) {
+            const VCardLine::List lines = (*cardIt).lines((*identIt));
+            VCardLine::List::ConstIterator lineIt;
+
+            // iterate over the lines
+            for (lineIt = lines.begin(); lineIt != lines.end(); ++lineIt) {
+                identifier = (*lineIt).identifier().toLower();
+                group = (*lineIt).group();
+                if (!group.isEmpty() && identifier != QLatin1String("adr")) {
+                    KContacts::FieldGroup groupField(group + QLatin1Char('.') + (*lineIt).identifier());
+                    groupField.setParams((*lineIt).parameterMap());
+                    groupField.setValue((*lineIt).value().toString());
+                    addr.insertFieldGroup(groupField);
+                }
+                // ADR
+                else if (identifier == QLatin1String("adr")) {
+                    Address address;
+                    const QStringList addrParts = splitString(semicolonSep, (*lineIt).value().toString());
+                    const int addrPartsCount(addrParts.count());
+                    if (addrPartsCount > 0) {
+                        address.setPostOfficeBox(addrParts.at(0));
+                    }
+                    if (addrPartsCount > 1) {
+                        address.setExtended(addrParts.at(1));
+                    }
+                    if (addrPartsCount > 2) {
+                        address.setStreet(addrParts.at(2));
+                    }
+                    if (addrPartsCount > 3) {
+                        address.setLocality(addrParts.at(3));
+                    }
+                    if (addrPartsCount > 4) {
+                        address.setRegion(addrParts.at(4));
+                    }
+                    if (addrPartsCount > 5) {
+                        address.setPostalCode(addrParts.at(5));
+                    }
+                    if (addrPartsCount > 6) {
+                        address.setCountry(addrParts.at(6));
+                    }
+
+                    Address::Type type;
+
+                    const QStringList types = (*lineIt).parameters(QStringLiteral("type"));
+                    QStringList::ConstIterator end(types.end());
+                    for (QStringList::ConstIterator it = types.begin(); it != end; ++it) {
+                        type |= stringToAddressType((*it).toLower());
+                    }
+
+                    address.setType(type);
+                    QString label = (*lineIt).parameter(QStringLiteral("label"));
+                    if (!label.isEmpty()) {
+                        if (label.length() > 1) {
+                            if (label.at(0) == QLatin1Char('"') && label.at(label.length() - 1) == QLatin1Char('"')) {
+                                label = label.mid(1, label.length() - 2);
+                            }
+                        }
+                        address.setLabel(label);
+                    }
+                    QString geoStr = (*lineIt).parameter(QStringLiteral("geo"));
+                    if (!geoStr.isEmpty()) {
+                        geoStr.remove(QLatin1Char('\"'));
+                        geoStr.remove(QStringLiteral("geo:"));
+                        if (geoStr.contains(QLatin1Char(','))) {
+                            QStringList arguments = geoStr.split(QLatin1Char(','));
+                            KContacts::Geo geo;
+                            geo.setLatitude(arguments.at(0).toDouble());
+                            geo.setLongitude(arguments.at(1).toDouble());
+                            address.setGeo(geo);
+                        }
+                    }
+                    addr.insertAddress(address);
+                }
+                // ANNIVERSARY
+                else if (identifier == QLatin1String("anniversary")) {
+                    const QString t = (*lineIt).value().toString();
+                    const QDateTime dt(parseDateTime(t));
+                    addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-Anniversary"), dt.date().toString(Qt::ISODate));
+                }
+                // BDAY
+                else if (identifier == QLatin1String("bday")) {
+                    bool withTime;
+                    const QDateTime bday = parseDateTime((*lineIt).value().toString(), &withTime);
+                    addr.setBirthday(bday, withTime);
+                }
+                // CATEGORIES
+                else if (identifier == QLatin1String("categories")) {
+                    const QStringList categories = splitString(commaSep, (*lineIt).value().toString());
+                    addr.setCategories(categories);
+                }
+                // FBURL
+                else if (identifier == QLatin1String("fburl")) {
+                    CalendarUrl calurl;
+                    calurl.setType(CalendarUrl::FBUrl);
+                    const QUrl url = QUrl((*lineIt).value().toString());
+                    calurl.setUrl(url);
+                    calurl.setParams((*lineIt).parameterMap());
+                    addr.insertCalendarUrl(calurl);
+                }
+                // CALADRURI
+                else if (identifier == QLatin1String("caladruri")) {
+                    CalendarUrl calurl;
+                    calurl.setType(CalendarUrl::CALADRUri);
+                    const QUrl url = QUrl((*lineIt).value().toString());
+                    calurl.setUrl(url);
+                    calurl.setParams((*lineIt).parameterMap());
+                    addr.insertCalendarUrl(calurl);
+                }
+                // CALURI
+                else if (identifier == QLatin1String("caluri")) {
+                    CalendarUrl calurl;
+                    calurl.setType(CalendarUrl::CALUri);
+                    const QUrl url = QUrl((*lineIt).value().toString());
+                    calurl.setUrl(url);
+                    calurl.setParams((*lineIt).parameterMap());
+                    addr.insertCalendarUrl(calurl);
+                }
+                // IMPP
+                else if (identifier == QLatin1String("impp")) {
+                    QUrl imppUrl((*lineIt).value().toString());
+                    Impp impp;
+                    impp.setParams((*lineIt).parameterMap());
+                    if (!(*lineIt).parameter(QStringLiteral("x-service-type")).isEmpty() && imppUrl.scheme().isEmpty()) {
+                        imppUrl.setScheme(normalizeImppServiceType((*lineIt).parameter(QStringLiteral("x-service-type")).toLower()));
+                    }
+                    impp.setAddress(imppUrl);
+                    addr.insertImpp(impp);
+                }
+                // CLASS
+                else if (identifier == QLatin1String("class")) {
+                    addr.setSecrecy(parseSecrecy(*lineIt));
+                }
+                // GENDER
+                else if (identifier == QLatin1String("gender")) {
+                    QString genderStr = (*lineIt).value().toString();
+                    if (!genderStr.isEmpty()) {
+                        Gender gender;
+                        if (genderStr.at(0) != QLatin1Char(';')) {
+                            gender.setGender(genderStr.at(0));
+                            if (genderStr.length() > 2 && (genderStr.at(1) == QLatin1Char(';'))) {
+                                gender.setComment(genderStr.right(genderStr.length() - 2));
+                            }
+                        } else {
+                            gender.setComment(genderStr.right(genderStr.length() - 1));
+                        }
+                        addr.setGender(gender);
+                    }
+                }
+                // LANG
+                else if (identifier == QLatin1String("lang")) {
+                    Lang lang;
+                    lang.setLanguage((*lineIt).value().toString());
+                    lang.setParams((*lineIt).parameterMap());
+                    addr.insertLang(lang);
+                }
+                // EMAIL
+                else if (identifier == QLatin1String("email")) {
+                    const QStringList types = (*lineIt).parameters(QStringLiteral("type"));
+                    Email mail((*lineIt).value().toString());
+                    mail.setParams((*lineIt).parameterMap());
+                    addr.addEmail(mail);
+                }
+                // KIND
+                else if (identifier == QLatin1String("kind")) {
+                    addr.setKind((*lineIt).value().toString());
+                }
+                // FN
+                else if (identifier == QLatin1String("fn")) {
+                    addr.setFormattedName((*lineIt).value().toString());
+                }
+                // GEO
+                else if (identifier == QLatin1String("geo")) {
+                    Geo geo;
+                    QString lineStr = (*lineIt).value().toString();
+                    if (lineStr.startsWith(QLatin1String("geo:"))) { // VCard 4.0
+                        lineStr.remove(QStringLiteral("geo:"));
+                        const QStringList geoParts = lineStr.split(QLatin1Char(','), Qt::KeepEmptyParts);
+                        if (geoParts.size() >= 2) {
+                            geo.setLatitude(geoParts.at(0).toFloat());
+                            geo.setLongitude(geoParts.at(1).toFloat());
+                            addr.setGeo(geo);
+                        }
+                    } else {
+                        const QStringList geoParts = lineStr.split(QLatin1Char(';'), Qt::KeepEmptyParts);
+                        if (geoParts.size() >= 2) {
+                            geo.setLatitude(geoParts.at(0).toFloat());
+                            geo.setLongitude(geoParts.at(1).toFloat());
+                            addr.setGeo(geo);
+                        }
+                    }
+                }
+                // KEY
+                else if (identifier == QLatin1String("key")) {
+                    addr.insertKey(parseKey(*lineIt));
+                }
+                // LABEL
+                else if (identifier == QLatin1String("label")) {
+                    Address::Type type;
+
+                    const QStringList types = (*lineIt).parameters(QStringLiteral("type"));
+                    QStringList::ConstIterator end(types.end());
+                    for (QStringList::ConstIterator it = types.begin(); it != end; ++it) {
+                        type |= stringToAddressType((*it).toLower());
+                    }
+
+                    bool available = false;
+                    KContacts::Address::List addressList = addr.addresses();
+                    for (KContacts::Address::List::Iterator it = addressList.begin(); it != addressList.end(); ++it) {
+                        if ((*it).type() == type) {
+                            (*it).setLabel((*lineIt).value().toString());
+                            addr.insertAddress(*it);
+                            available = true;
+                            break;
+                        }
+                    }
+
+                    if (!available) { // a standalone LABEL tag
+                        KContacts::Address address(type);
+                        address.setLabel((*lineIt).value().toString());
+                        addr.insertAddress(address);
+                    }
+                }
+                // LOGO
+                else if (identifier == QLatin1String("logo")) {
+                    Picture picture = parsePicture(*lineIt);
+                    if (addr.logo().isEmpty()) {
+                        addr.setLogo(picture);
+                    } else {
+                        addr.insertExtraLogo(picture);
+                    }
+                }
+                // MAILER
+                else if (identifier == QLatin1String("mailer")) {
+                    addr.setMailer((*lineIt).value().toString());
+                }
+                // N
+                else if (identifier == QLatin1Char('n')) {
+                    const QStringList nameParts = splitString(semicolonSep, (*lineIt).value().toString());
+                    const int numberOfParts(nameParts.count());
+                    if (numberOfParts > 0) {
+                        addr.setFamilyName(nameParts.at(0));
+                    }
+                    if (numberOfParts > 1) {
+                        addr.setGivenName(nameParts.at(1));
+                    }
+                    if (numberOfParts > 2) {
+                        addr.setAdditionalName(nameParts.at(2));
+                    }
+                    if (numberOfParts > 3) {
+                        addr.setPrefix(nameParts.at(3));
+                    }
+                    if (numberOfParts > 4) {
+                        addr.setSuffix(nameParts.at(4));
+                    }
+                    if (!(*lineIt).parameter(QStringLiteral("sort-as")).isEmpty()) {
+                        addr.setSortString((*lineIt).parameter(QStringLiteral("sort-as")));
+                    }
+                }
+                // NAME
+                else if (identifier == QLatin1String("name")) {
+                    addr.setName((*lineIt).value().toString());
+                }
+                // NICKNAME
+                else if (identifier == QLatin1String("nickname")) {
+                    NickName nickName((*lineIt).value().toString());
+                    nickName.setParams((*lineIt).parameterMap());
+                    addr.insertExtraNickName(nickName);
+                }
+                // NOTE
+                else if (identifier == QLatin1String("note")) {
+                    addr.setNote((*lineIt).value().toString());
+                }
+                // ORGANIZATION
+                else if (identifier == QLatin1String("org")) {
+                    const QStringList orgParts = splitString(semicolonSep, (*lineIt).value().toString());
+                    const int orgPartsCount(orgParts.count());
+                    if (orgPartsCount > 0) {
+                        Org organization(orgParts.at(0));
+                        organization.setParams((*lineIt).parameterMap());
+                        addr.insertExtraOrganization(organization);
+                    }
+                    if (orgPartsCount > 1) {
+                        addr.setDepartment(orgParts.at(1));
+                    }
+                    if (!(*lineIt).parameter(QStringLiteral("sort-as")).isEmpty()) {
+                        addr.setSortString((*lineIt).parameter(QStringLiteral("sort-as")));
+                    }
+                }
+                // PHOTO
+                else if (identifier == QLatin1String("photo")) {
+                    Picture picture = parsePicture(*lineIt);
+                    if (addr.photo().isEmpty()) {
+                        addr.setPhoto(picture);
+                    } else {
+                        addr.insertExtraPhoto(picture);
+                    }
+                }
+                // PROID
+                else if (identifier == QLatin1String("prodid")) {
+                    addr.setProductId((*lineIt).value().toString());
+                }
+                // REV
+                else if (identifier == QLatin1String("rev")) {
+                    addr.setRevision(parseDateTime((*lineIt).value().toString()));
+                }
+                // ROLE
+                else if (identifier == QLatin1String("role")) {
+                    Role role((*lineIt).value().toString());
+                    role.setParams((*lineIt).parameterMap());
+                    addr.insertExtraRole(role);
+                }
+                // SORT-STRING
+                else if (identifier == QLatin1String("sort-string")) {
+                    addr.setSortString((*lineIt).value().toString());
+                }
+                // SOUND
+                else if (identifier == QLatin1String("sound")) {
+                    Sound sound = parseSound(*lineIt);
+                    if (addr.sound().isEmpty()) {
+                        addr.setSound(sound);
+                    } else {
+                        addr.insertExtraSound(sound);
+                    }
+                }
+                // TEL
+                else if (identifier == QLatin1String("tel")) {
+                    PhoneNumber phone;
+                    phone.setNumber((*lineIt).value().toString());
+
+                    PhoneNumber::Type type;
+                    bool foundType = false;
+                    const QStringList types = (*lineIt).parameters(QStringLiteral("type"));
+                    QStringList::ConstIterator typeEnd(types.constEnd());
+                    for (QStringList::ConstIterator it = types.constBegin(); it != typeEnd; ++it) {
+                        type |= stringToPhoneType((*it).toUpper());
+                        foundType = true;
+                    }
+                    phone.setType(foundType ? type : PhoneNumber::Undefined);
+                    phone.setParams((*lineIt).parameterMap());
+
+                    addr.insertPhoneNumber(phone);
+                }
+                // TITLE
+                else if (identifier == QLatin1String("title")) {
+                    Title title((*lineIt).value().toString());
+                    title.setParams((*lineIt).parameterMap());
+                    addr.insertExtraTitle(title);
+                }
+                // TZ
+                else if (identifier == QLatin1String("tz")) {
+                    // TODO add vcard4 support
+                    TimeZone tz;
+                    const QString date = (*lineIt).value().toString();
+
+                    if (!date.isEmpty()) {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+                        const QStringView dateView(date);
+                        int hours = dateView.mid(1, 2).toInt();
+                        int minutes = dateView.mid(4, 2).toInt();
+#else
+                        int hours = date.midRef(1, 2).toInt();
+                        int minutes = date.midRef(4, 2).toInt();
+#endif
+                        int offset = (hours * 60) + minutes;
+                        offset = offset * (date[0] == QLatin1Char('+') ? 1 : -1);
+
+                        tz.setOffset(offset);
+                        addr.setTimeZone(tz);
+                    }
+                }
+                // UID
+                else if (identifier == QLatin1String("uid")) {
+                    addr.setUid((*lineIt).value().toString());
+                }
+                // URL
+                else if (identifier == QLatin1String("url")) {
+                    const QUrl url = QUrl((*lineIt).value().toString());
+                    ResourceLocatorUrl resourceLocatorUrl;
+                    resourceLocatorUrl.setUrl(url);
+                    resourceLocatorUrl.setParams((*lineIt).parameterMap());
+                    addr.insertExtraUrl(resourceLocatorUrl);
+                }
+                // SOURCE
+                else if (identifier == QLatin1String("source")) {
+                    const QUrl url = QUrl((*lineIt).value().toString());
+                    addr.insertSourceUrl(url);
+                }
+                // MEMBER (vcard 4.0)
+                else if (identifier == QLatin1String("member")) {
+                    addr.insertMember((*lineIt).value().toString());
+                }
+                // RELATED (vcard 4.0)
+                else if (identifier == QLatin1String("related")) {
+                    Related related;
+                    related.setRelated((*lineIt).value().toString());
+                    related.setParams((*lineIt).parameterMap());
+                    addr.insertRelationship(related);
+                }
+                // CLIENTPIDMAP (vcard 4.0)
+                else if (identifier == QLatin1String("clientpidmap")) {
+                    ClientPidMap clientpidmap;
+                    clientpidmap.setClientPidMap((*lineIt).value().toString());
+                    clientpidmap.setParams((*lineIt).parameterMap());
+                    addr.insertClientPidMap(clientpidmap);
+                }
+                // X-
+                // TODO import X-GENDER
+                else if (identifier.startsWith(QLatin1String("x-"))) {
+                    QString ident = (*lineIt).identifier();
+                    // clang-format off
+                    //X-Evolution
+                    // also normalize case of our own extensions, some backends "adjust" that
+                    if (identifier == QLatin1String("x-evolution-spouse")
+                        || identifier == QLatin1String("x-spouse")) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-SpousesName");
+                    } else if (identifier == QLatin1String("x-evolution-blog-url") || identifier.compare(QLatin1String("X-KADDRESSBOOK-BLOGFEED"), Qt::CaseInsensitive) == 0) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-BlogFeed");
+                    } else if (identifier == QLatin1String("x-evolution-assistant")
+                               || identifier == QLatin1String("x-assistant")
+                               || identifier.compare(QLatin1String("X-KADDRESSBOOK-X-ASSISTANTSNAME"), Qt::CaseInsensitive) == 0) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-AssistantsName");
+                    } else if (identifier == QLatin1String("x-evolution-anniversary")
+                               || identifier == QLatin1String("x-anniversary")
+                               || identifier.compare(QLatin1String("X-KADDRESSBOOK-X-ANNIVERSARY"), Qt::CaseInsensitive) == 0) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-Anniversary");
+                    } else if (identifier == QLatin1String("x-evolution-manager")
+                               || identifier == QLatin1String("x-manager")
+                               || identifier.compare(QLatin1String("X-KADDRESSBOOK-X-MANAGERSNAME"), Qt::CaseInsensitive) == 0) {
+                        // clang-format on
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-ManagersName");
+                    } else if (identifier.compare(QLatin1String("X-KADDRESSBOOK-X-PROFESSION"), Qt::CaseInsensitive) == 0) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-Profession");
+                    } else if (identifier.compare(QLatin1String("X-KADDRESSBOOK-X-OFFICE"), Qt::CaseInsensitive) == 0) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-Office");
+                    } else if (identifier.compare(QLatin1String("X-KADDRESSBOOK-X-SPOUSESNAME"), Qt::CaseInsensitive) == 0) {
+                        ident = QStringLiteral("X-KADDRESSBOOK-X-SpousesName");
+                    } else if (identifier == QLatin1String("x-aim")) {
+                        ident = QStringLiteral("X-messaging/aim-All");
+                    } else if (identifier == QLatin1String("x-icq")) {
+                        ident = QStringLiteral("X-messaging/icq-All");
+                    } else if (identifier == QLatin1String("x-jabber")) {
+                        ident = QStringLiteral("X-messaging/xmpp-All");
+                    } else if (identifier == QLatin1String("x-jabber")) {
+                        ident = QStringLiteral("X-messaging/xmpp-All");
+                    } else if (identifier == QLatin1String("x-msn")) {
+                        ident = QStringLiteral("X-messaging/msn-All");
+                    } else if (identifier == QLatin1String("x-yahoo")) {
+                        ident = QStringLiteral("X-messaging/yahoo-All");
+                    } else if (identifier == QLatin1String("x-gadugadu")) {
+                        ident = QStringLiteral("X-messaging/gadu-All");
+                    } else if (identifier == QLatin1String("x-skype")) {
+                        ident = QStringLiteral("X-messaging/skype-All");
+                    } else if (identifier == QLatin1String("x-groupwise")) {
+                        ident = QStringLiteral("X-messaging/groupwise-All");
+                    } else if (identifier == QLatin1String("x-sms")) {
+                        ident = QStringLiteral("X-messaging/sms-All");
+                    } else if (identifier == QLatin1String("x-meanwhile")) {
+                        ident = QStringLiteral("X-messaging/meanwhile-All");
+                    } else if (identifier == QLatin1String("x-irc")) {
+                        ident = QStringLiteral("X-messaging/irc-All");
+                    } else if (identifier == QLatin1String("x-gtalk")) {
+                        ident = QStringLiteral("X-messaging/googletalk-All");
+                    } else if (identifier == QLatin1String("x-twitter")) {
+                        ident = QStringLiteral("X-messaging/twitter-All");
+                    }
+
+                    const QString key = ident.mid(2);
+                    const int dash = key.indexOf(QLatin1Char('-'));
+
+                    // convert legacy messaging fields into IMPP ones
+                    if (key.startsWith(QLatin1String("messaging/"))) {
+                        QUrl url;
+                        url.setScheme(normalizeImppServiceType(key.mid(10, dash - 10)));
+                        const auto values = (*lineIt).value().toString().split(QChar(0xE000), Qt::SkipEmptyParts);
+                        for (const auto &value : values) {
+                            url.setPath(value);
+                            Impp impp;
+                            impp.setParams((*lineIt).parameterMap());
+                            impp.setAddress(url);
+                            addr.insertImpp(impp);
+                        }
+                    } else {
+                        addr.insertCustom(key.left(dash), key.mid(dash + 1), (*lineIt).value().toString());
+                    }
+                }
+            }
+        }
+
+        addrList.append(addr);
+    }
+
+    return addrList;
+}
+
+QDateTime VCardTool::parseDateTime(const QString &str, bool *timeValid)
+{
+    static const QLatin1Char sep('-');
+
+    const int posT = str.indexOf(QLatin1Char('T'));
+    QString dateString = posT >= 0 ? str.left(posT) : str;
+    const bool noYear = dateString.startsWith(QLatin1String("--"));
+    dateString.remove(QLatin1Char('-'));
+    QDate date;
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+    const QStringView dstr{dateString};
+#else
+    const QStringRef dstr(&dateString);
+#endif
+    if (noYear) {
+        date.setDate(-1, dstr.mid(0, 2).toInt(), dstr.mid(2, 2).toInt());
+    } else {
+        // E.g. 20160120
+        date.setDate(dstr.mid(0, 4).toInt(), dstr.mid(4, 2).toInt(), dstr.mid(6, 2).toInt());
+    }
+
+    QTime time;
+    Qt::TimeSpec spec = Qt::LocalTime;
+    int offsetSecs = 0;
+    if (posT >= 0) {
+        QString timeString = str.mid(posT + 1);
+        timeString.remove(QLatin1Char(':'));
+        const int zPos = timeString.indexOf(QLatin1Char('Z'));
+        const int plusPos = timeString.indexOf(QLatin1Char('+'));
+        const int minusPos = timeString.indexOf(sep);
+        const int tzPos = qMax(qMax(zPos, plusPos), minusPos);
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+        const QStringView hhmmssString = tzPos >= 0 ? QStringView(timeString).left(tzPos) : QStringView(timeString);
+#else
+        const QStringRef hhmmssString = tzPos >= 0 ? timeString.leftRef(tzPos) : QStringRef(&timeString);
+#endif
+        int hour = 0;
+        int minutes = 0;
+        int seconds = 0;
+        switch (hhmmssString.size()) {
+        case 2:
+            hour = hhmmssString.toInt();
+            break;
+        case 4:
+            hour = hhmmssString.mid(0, 2).toInt();
+            minutes = hhmmssString.mid(2, 2).toInt();
+            break;
+        case 6:
+            hour = hhmmssString.mid(0, 2).toInt();
+            minutes = hhmmssString.mid(2, 2).toInt();
+            seconds = hhmmssString.mid(4, 2).toInt();
+            break;
+        }
+        time.setHMS(hour, minutes, seconds);
+
+        if (tzPos >= 0) {
+            if (zPos >= 0) {
+                spec = Qt::UTC;
+            } else {
+                spec = Qt::OffsetFromUTC;
+
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+                const auto offsetString = QStringView(timeString).mid(tzPos + 1);
+#else
+                const QStringRef offsetString = timeString.midRef(tzPos + 1);
+#endif
+                switch (offsetString.size()) {
+                case 2: // format: "hh"
+                    offsetSecs = offsetString.left(2).toInt() * 3600;
+                    break;
+                case 4: // format: "hhmm"
+                    offsetSecs = offsetString.left(2).toInt() * 3600 + offsetString.mid(2, 2).toInt() * 60;
+                    break;
+                }
+            }
+            if (minusPos >= 0) {
+                offsetSecs *= -1;
+            }
+        }
+    }
+    if (timeValid) {
+        *timeValid = time.isValid();
+    }
+
+    return QDateTime(date, time, spec, offsetSecs);
+}
+
+QString VCardTool::createDateTime(const QDateTime &dateTime, VCard::Version version, bool withTime)
+{
+    if (!dateTime.date().isValid()) {
+        return QString();
+    }
+    QString str = createDate(dateTime.date(), version);
+    if (!withTime) {
+        return str;
+    }
+    str += createTime(dateTime.time(), version);
+    if (dateTime.timeSpec() == Qt::UTC) {
+        str += QLatin1Char('Z');
+    } else if (dateTime.timeSpec() == Qt::OffsetFromUTC) {
+        const int offsetSecs = dateTime.offsetFromUtc();
+        if (offsetSecs >= 0) {
+            str += QLatin1Char('+');
+        } else {
+            str += QLatin1Char('-');
+        }
+        QTime offsetTime = QTime(0, 0).addSecs(abs(offsetSecs));
+        if (version == VCard::v4_0) {
+            str += offsetTime.toString(QStringLiteral("HHmm"));
+        } else {
+            str += offsetTime.toString(QStringLiteral("HH:mm"));
+        }
+    }
+    return str;
+}
+
+QString VCardTool::createDate(const QDate &date, VCard::Version version)
+{
+    QString format;
+    if (date.year() > 0) {
+        format = QStringLiteral("yyyyMMdd");
+    } else {
+        format = QStringLiteral("--MMdd");
+    }
+    if (version != VCard::v4_0) {
+        format.replace(QStringLiteral("yyyy"), QStringLiteral("yyyy-"));
+        format.replace(QStringLiteral("MM"), QStringLiteral("MM-"));
+    }
+    return date.toString(format);
+}
+
+QString VCardTool::createTime(const QTime &time, VCard::Version version)
+{
+    QString format;
+    if (version == VCard::v4_0) {
+        format = QStringLiteral("HHmmss");
+    } else {
+        format = QStringLiteral("HH:mm:ss");
+    }
+    return QLatin1Char('T') + time.toString(format);
+}
+
+Picture VCardTool::parsePicture(const VCardLine &line) const
+{
+    Picture pic;
+
+    const QStringList params = line.parameterList();
+    QString type;
+    if (params.contains(QLatin1String("type"))) {
+        type = line.parameter(QStringLiteral("type"));
+    }
+    if (params.contains(QLatin1String("encoding"))) {
+        pic.setRawData(line.value().toByteArray(), type);
+    } else if (params.contains(QLatin1String("value"))) {
+        if (line.parameter(QStringLiteral("value")).toLower() == QLatin1String("uri")) {
+            pic.setUrl(line.value().toString());
+        }
+    }
+
+    return pic;
+}
+
+VCardLine VCardTool::createPicture(const QString &identifier, const Picture &pic, VCard::Version version) const
+{
+    VCardLine line(identifier);
+
+    if (pic.isEmpty()) {
+        return line;
+    }
+
+    if (pic.isIntern()) {
+        line.setValue(pic.rawData());
+        if (version == VCard::v2_1) {
+            line.addParameter(QStringLiteral("ENCODING"), QStringLiteral("BASE64"));
+            line.addParameter(pic.type(), QString());
+        } else { /*if (version == VCard::v3_0) */
+            line.addParameter(QStringLiteral("encoding"), QStringLiteral("b"));
+            line.addParameter(QStringLiteral("type"), pic.type());
+#if 0
+        } else { //version 4.0
+            line.addParameter(QStringLiteral("data") + QStringLiteral(":image/") + pic.type(), QStringLiteral("base64"));
+#endif
+        }
+    } else {
+        line.setValue(pic.url());
+        line.addParameter(QStringLiteral("value"), QStringLiteral("URI"));
+    }
+
+    return line;
+}
+
+Sound VCardTool::parseSound(const VCardLine &line) const
+{
+    Sound snd;
+
+    const QStringList params = line.parameterList();
+    if (params.contains(QLatin1String("encoding"))) {
+        snd.setData(line.value().toByteArray());
+    } else if (params.contains(QLatin1String("value"))) {
+        if (line.parameter(QStringLiteral("value")).toLower() == QLatin1String("uri")) {
+            snd.setUrl(line.value().toString());
+        }
+    }
+
+    /* TODO: support sound types
+      if ( params.contains( "type" ) )
+        snd.setType( line.parameter( "type" ) );
+    */
+
+    return snd;
+}
+
+VCardLine VCardTool::createSound(const Sound &snd, VCard::Version version) const
+{
+    Q_UNUSED(version);
+    VCardLine line(QStringLiteral("SOUND"));
+
+    if (snd.isIntern()) {
+        if (!snd.data().isEmpty()) {
+            line.setValue(snd.data());
+            if (version == VCard::v2_1) {
+                line.addParameter(QStringLiteral("ENCODING"), QStringLiteral("BASE64"));
+            } else {
+                line.addParameter(QStringLiteral("encoding"), QStringLiteral("b"));
+            }
+            // TODO: need to store sound type!!!
+        }
+    } else if (!snd.url().isEmpty()) {
+        line.setValue(snd.url());
+        line.addParameter(QStringLiteral("value"), QStringLiteral("URI"));
+    }
+
+    return line;
+}
+
+Key VCardTool::parseKey(const VCardLine &line) const
+{
+    Key key;
+
+    const QStringList params = line.parameterList();
+    if (params.contains(QLatin1String("encoding"))) {
+        key.setBinaryData(line.value().toByteArray());
+    } else {
+        key.setTextData(line.value().toString());
+    }
+
+    if (params.contains(QLatin1String("type"))) {
+        if (line.parameter(QStringLiteral("type")).toLower() == QLatin1String("x509")) {
+            key.setType(Key::X509);
+        } else if (line.parameter(QStringLiteral("type")).toLower() == QLatin1String("pgp")) {
+            key.setType(Key::PGP);
+        } else {
+            key.setType(Key::Custom);
+            key.setCustomTypeString(line.parameter(QStringLiteral("type")));
+        }
+    } else if (params.contains(QLatin1String("mediatype"))) {
+        const QString param = line.parameter(QStringLiteral("mediatype")).toLower();
+        if (param == QLatin1String("application/x-x509-ca-cert")) {
+            key.setType(Key::X509);
+        } else if (param == QLatin1String("application/pgp-keys")) {
+            key.setType(Key::PGP);
+        } else {
+            key.setType(Key::Custom);
+            key.setCustomTypeString(line.parameter(QStringLiteral("type")));
+        }
+    }
+
+    return key;
+}
+
+VCardLine VCardTool::createKey(const Key &key, VCard::Version version) const
+{
+    VCardLine line(QStringLiteral("KEY"));
+
+    if (key.isBinary()) {
+        if (!key.binaryData().isEmpty()) {
+            line.setValue(key.binaryData());
+            if (version == VCard::v2_1) {
+                line.addParameter(QStringLiteral("ENCODING"), QStringLiteral("BASE64"));
+            } else {
+                line.addParameter(QStringLiteral("encoding"), QStringLiteral("b"));
+            }
+        }
+    } else if (!key.textData().isEmpty()) {
+        line.setValue(key.textData());
+    }
+
+    if (version == VCard::v4_0) {
+        if (key.type() == Key::X509) {
+            line.addParameter(QStringLiteral("MEDIATYPE"), QStringLiteral("application/x-x509-ca-cert"));
+        } else if (key.type() == Key::PGP) {
+            line.addParameter(QStringLiteral("MEDIATYPE"), QStringLiteral("application/pgp-keys"));
+        } else if (key.type() == Key::Custom) {
+            line.addParameter(QStringLiteral("MEDIATYPE"), key.customTypeString());
+        }
+    } else {
+        if (key.type() == Key::X509) {
+            line.addParameter(QStringLiteral("type"), QStringLiteral("X509"));
+        } else if (key.type() == Key::PGP) {
+            line.addParameter(QStringLiteral("type"), QStringLiteral("PGP"));
+        } else if (key.type() == Key::Custom) {
+            line.addParameter(QStringLiteral("type"), key.customTypeString());
+        }
+    }
+
+    return line;
+}
+
+Secrecy VCardTool::parseSecrecy(const VCardLine &line) const
+{
+    Secrecy secrecy;
+
+    const QString value = line.value().toString().toLower();
+    if (value == QLatin1String("public")) {
+        secrecy.setType(Secrecy::Public);
+    } else if (value == QLatin1String("private")) {
+        secrecy.setType(Secrecy::Private);
+    } else if (value == QLatin1String("confidential")) {
+        secrecy.setType(Secrecy::Confidential);
+    }
+
+    return secrecy;
+}
+
+VCardLine VCardTool::createSecrecy(const Secrecy &secrecy) const
+{
+    VCardLine line(QStringLiteral("CLASS"));
+
+    int type = secrecy.type();
+
+    if (type == Secrecy::Public) {
+        line.setValue(QStringLiteral("PUBLIC"));
+    } else if (type == Secrecy::Private) {
+        line.setValue(QStringLiteral("PRIVATE"));
+    } else if (type == Secrecy::Confidential) {
+        line.setValue(QStringLiteral("CONFIDENTIAL"));
+    }
+
+    return line;
+}
+
+QStringList VCardTool::splitString(QChar sep, const QString &str) const
+{
+    QStringList list;
+    QString value(str);
+
+    int start = 0;
+    int pos = value.indexOf(sep, start);
+
+    while (pos != -1) {
+        if (pos == 0 || value[pos - 1] != QLatin1Char('\\')) {
+            if (pos > start && pos <= value.length()) {
+                list << value.mid(start, pos - start);
+            } else {
+                list << QString();
+            }
+
+            start = pos + 1;
+            pos = value.indexOf(sep, start);
+        } else {
+            value.replace(pos - 1, 2, sep);
+            pos = value.indexOf(sep, pos);
+        }
+    }
+
+    int l = value.length() - 1;
+    const QString mid = value.mid(start, l - start + 1);
+    if (!mid.isEmpty()) {
+        list << mid;
+    } else {
+        list << QString();
+    }
+
+    return list;
+}
+
+QString VCardTool::normalizeImppServiceType(const QString &serviceType) const
+{
+    if (serviceType == QLatin1String("jabber")) {
+        return QStringLiteral("xmpp");
+    }
+    if (serviceType == QLatin1String("yahoo")) {
+        return QStringLiteral("ymsgr");
+    }
+    if (serviceType == QLatin1String("gadugadu")) {
+        return QStringLiteral("gg");
+    }
+    return serviceType;
+}
diff --git a/src/vcardtool_p.h b/src/vcardtool_p.h
new file mode 100644 (file)
index 0000000..f41bf28
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef KCONTACTS_VCARDTOOL_H
+#define KCONTACTS_VCARDTOOL_H
+
+#include "addressee.h"
+#include "kcontacts_export.h"
+#include "vcardparser/vcardparser_p.h"
+
+class QDateTime;
+
+namespace KContacts
+{
+class Key;
+class Picture;
+class Secrecy;
+class Sound;
+
+class KCONTACTS_EXPORT VCardTool
+{
+public:
+    VCardTool();
+    ~VCardTool();
+
+    /**
+      Creates a string that contains the addressees from the list in
+      the vCard format.
+     */
+    Q_REQUIRED_RESULT QByteArray createVCards(const Addressee::List &list, VCard::Version version = VCard::v3_0) const;
+
+    /**
+     * @since 4.9.1
+     */
+    Q_REQUIRED_RESULT QByteArray exportVCards(const Addressee::List &list, VCard::Version version = VCard::v3_0) const;
+    /**
+      Parses the string and returns a list of addressee objects.
+     */
+    Q_REQUIRED_RESULT Addressee::List parseVCards(const QByteArray &vcard) const;
+
+    static QDateTime parseDateTime(const QString &str, bool *timeValid = nullptr);
+    static QString createDateTime(const QDateTime &dateTime, VCard::Version version, bool withTime = true);
+    static QString createDate(const QDate &date, VCard::Version version);
+    static QString createTime(const QTime &time, VCard::Version version);
+
+private:
+    QByteArray createVCards(const Addressee::List &list, VCard::Version version, bool exportVcard) const;
+
+    /**
+      Split a string and replaces escaped separators on the fly with
+      unescaped ones.
+     */
+    QStringList splitString(QChar sep, const QString &value) const;
+
+    Picture parsePicture(const VCardLine &line) const;
+    VCardLine createPicture(const QString &identifier, const Picture &pic, VCard::Version version) const;
+
+    Sound parseSound(const VCardLine &line) const;
+    VCardLine createSound(const Sound &snd, VCard::Version version) const;
+
+    Key parseKey(const VCardLine &line) const;
+    VCardLine createKey(const Key &key, VCard::Version version) const;
+
+    Secrecy parseSecrecy(const VCardLine &line) const;
+    VCardLine createSecrecy(const Secrecy &secrecy) const;
+
+    void addParameter(VCardLine *line, VCard::Version version, const QString &key, const QStringList &valueStringList) const;
+
+    /** Translate alternative or legacy IMPP service types. */
+    QString normalizeImppServiceType(const QString &serviceType) const;
+
+    void processAddresses(const Address::List &addresses, VCard::Version version, VCard *card) const;
+    void processEmailList(const Email::List &emailList, VCard::Version version, VCard *card) const;
+    void processOrganizations(const Addressee &addressee, VCard::Version version, VCard *card) const;
+    void processPhoneNumbers(const PhoneNumber::List &phoneNumbers, VCard::Version version, VCard *card) const;
+    void processCustoms(const QStringList &customs, VCard::Version version, VCard *card, bool exportVcard) const;
+
+    Q_DISABLE_COPY(VCardTool)
+};
+}
+
+#endif
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e9c4c31
--- /dev/null
@@ -0,0 +1,27 @@
+
+include(ECMMarkAsTest)
+
+########### next target ###############
+
+# FIXME: Build fails
+add_executable(testread testread.cpp)
+target_link_libraries(testread KF5Contacts KF5::I18n Qt${QT_MAJOR_VERSION}::Gui)
+
+########### next target ###############
+
+# FIXME: Build fails
+add_executable(testwrite testwrite.cpp)
+target_link_libraries(testwrite KF5Contacts Qt${QT_MAJOR_VERSION}::Gui KF5::I18n)
+
+########### next target ###############
+
+add_executable(testread2 testread2.cpp testutils.cpp)
+target_link_libraries(testread2 KF5Contacts Qt${QT_MAJOR_VERSION}::Gui)
+
+if (TARGET Qt${QT_MAJOR_VERSION}::Quick)
+    add_executable(qmlintegrationtest
+        qmlintegrationtest.cpp
+        qmlintegrationtest.qrc
+    )
+    target_link_libraries(qmlintegrationtest PRIVATE KF5::Contacts Qt${QT_MAJOR_VERSION}::Quick)
+endif()
diff --git a/tests/README.testing b/tests/README.testing
new file mode 100644 (file)
index 0000000..1a70685
--- /dev/null
@@ -0,0 +1,12 @@
+For testing the vcardparser there are some test files and a small testsuite
+automatically checking for regressions. The tests directory contains some vCard
+files and correpsonding reference output files (with an additional ".ref"
+suffix). For running the geression test do "./testroundtrip" or simply run "ctest".
+
+For creating a new test put a vCard file to be parsed into the tests directory.
+Create a reference file by running "testread" on the test file. It will put out
+the parsed data as vCard again on stdout. Carefully check the output, manually
+correct any errors and save the result as reference file in the tests directory.
+Now add the filename to the testroundtrip.qrc resource file and run
+"make && ./roundtriptest" If the check fails adapt the reference file or fix the bugs
+in the parser, whatever is appropriate.
diff --git a/tests/checkvcard.pl b/tests/checkvcard.pl
new file mode 100755 (executable)
index 0000000..5965c89
--- /dev/null
@@ -0,0 +1,79 @@
+#!/usr/bin/perl
+
+if ( @ARGV != 1 ) {
+  print STDERR "Missing arg: filename\n";
+  system "touch FAILED";
+  exit 1;
+}
+
+$file = $ARGV[0];
+
+if ( !open( IN, "$file" ) ) {
+  print STDERR "Unable to open '$file'\n";
+  system "touch FAILED";
+  exit 1;
+}
+
+while( <IN> ) {
+  if (/^VERSION:(.*)$/ ) {
+    $version = $1;
+    if ( $version eq "2.1" ) { $options = "--vcard21"; }
+  }
+}
+
+close IN;
+
+$ref = "$file.ref";
+
+if ( !open( REF, "$ref" ) ) {
+  print STDERR "Unable to open $ref\n";
+  system "touch FAILED";
+  exit 1;
+}
+
+while( <REF> ) {
+  push @ref, $_;
+}
+
+close REF;
+
+if ( !open( READ, "./testread $file $options 2> /dev/null |" ) ) {
+  print STDERR "Unable to open testread\n";
+  system "touch FAILED";
+  exit 1;
+}
+
+print "Checking '$file':\n";
+
+$gotsomething = 0;
+$error = 0;
+$i = 0;
+while( <READ> ) {
+  $gotsomething = 1;
+  $out = $_;
+  $ref = @ref[$i++];
+
+  if ( $out ne $ref ) {
+    if ( $ref =~ /^UID/ && $out =~ /^UID/ ) { next; }
+    $error++;
+    print "  Expected      : $ref";
+    print "  Parser output : $out";
+  }
+}
+
+close READ;
+
+if ( $gotsomething == 0 ) {
+  print "\n  FAILED: testread didn't output anything\n";
+  system "touch FAILED";
+  exit 1;
+}
+if ( $error > 0 ) {
+  print "\n  FAILED: $error errors found.\n";
+  system "touch FAILED";
+  exit 1;
+} else {
+  print "  OK\n";
+}
+
+exit 0;
diff --git a/tests/qmlintegrationtest.cpp b/tests/qmlintegrationtest.cpp
new file mode 100644 (file)
index 0000000..8534d59
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+
+#include "../src/addressformat.h"
+#include <KContacts/Address>
+
+using namespace KContacts;
+
+int main(int argc, char **argv)
+{
+    QCoreApplication::setApplicationName(QStringLiteral("kcontacts-qmlintegrationtest"));
+    QCoreApplication::setOrganizationName(QStringLiteral("KDE"));
+    QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
+
+    QGuiApplication app(argc, argv);
+
+    // ### this should probably eventually move into a real QML plugin for KContacts
+    qmlRegisterUncreatableMetaObject(KContacts::staticMetaObject, "org.kde.contacts", 1, 0, "KContacts", {});
+    qmlRegisterSingletonType("org.kde.contacts", 1, 0, "AddressFormatRepository", [](QQmlEngine *, QJSEngine *jsEngine) -> QJSValue {
+        return jsEngine->toScriptValue(AddressFormatRepository());
+    });
+    qRegisterMetaType<AddressFormat>();
+    qRegisterMetaType<AddressFormatElement>();
+    qRegisterMetaType<AddressFormatRepository>();
+    qRegisterMetaType<AddressFormatPreference>();
+    qRegisterMetaType<AddressFormatScriptPreference>();
+
+    // test data
+    qmlRegisterSingletonType("org.kde.contacts.test", 1, 0, "TestData", [](QQmlEngine *, QJSEngine *jsEngine) -> QJSValue {
+        Address address;
+        address.setCountry(QStringLiteral("DE"));
+        address.setRegion(QStringLiteral("BE"));
+        address.setLocality(QStringLiteral("Berlin"));
+        address.setPostalCode(QStringLiteral("10969"));
+        address.setStreet(QStringLiteral("Prinzenstraße 85 F"));
+
+        auto obj = jsEngine->newObject();
+        obj.setProperty(QStringLiteral("address"), jsEngine->toScriptValue(address));
+        return obj;
+    });
+
+    QQmlApplicationEngine engine;
+    engine.load(QStringLiteral("qrc:/qmlintegrationtest.qml"));
+    return app.exec();
+}
diff --git a/tests/qmlintegrationtest.qml b/tests/qmlintegrationtest.qml
new file mode 100644 (file)
index 0000000..fc52b94
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+import org.kde.i18n.localeData 1.0
+import org.kde.contacts 1.0
+import org.kde.contacts.test 1.0
+
+ApplicationWindow {
+    visible: true
+    width: 480
+    height: 720
+
+    ColumnLayout {
+        ComboBox {
+            id: styleCombo
+            textRole: "text"
+            valueRole: "style"
+            model: [
+                { text: "Postal address", style: KContacts.AddressFormatStyle.Postal },
+                { text: "Multiple lines, domestic", style: KContacts.AddressFormatStyle.MultiLineDomestic },
+                { text: "Multiple lines, international", style: KContacts.AddressFormatStyle.MultiLineInternational },
+                { text: "Single line, domestic", style: KContacts.AddressFormatStyle.SingleLineDomestic },
+                { text: "Single line, international", style: KContacts.AddressFormatStyle.SingleLineInternational }
+            ]
+        }
+
+        Label {
+            text: TestData.address.formatted(styleCombo.currentValue, "Dr. Konqi", "KDE e.V.")
+        }
+
+        ComboBox {
+            id: countryCombo
+            model: Country.allCountries.map(c => c.alpha2)
+        }
+
+        Label {
+            id: zipFormat
+            text: AddressFormatRepository.formatForCountry(countryCombo.currentValue, KContacts.AddressFormatScriptPreference.Local).postalCodeRegularExpression
+        }
+        TextField {
+            id: zipField
+            text: "12345"
+        }
+        Label {
+            text: zipField.text.match("^" + zipFormat.text + "$") ? "is a valid zip code" : "is not a valid zip code"
+        }
+
+        Label {
+            text: "Formatting rule:"
+        }
+        Repeater {
+            model: AddressFormatRepository.formatForCountry(countryCombo.currentValue, KContacts.AddressFormatScriptPreference.Local, KContacts.AddressFormatPreference.Business).elements
+            Label {
+                text: {
+                    const field_map = new Map([
+                        [ KContacts.AddressFormatField.Name, "Name" ],
+                        [ KContacts.AddressFormatField.Organization, "Organization" ],
+                        [ KContacts.AddressFormatField.StreetAddress, "Street" ],
+                        [ KContacts.AddressFormatField.Locality, "City" ],
+                        [ KContacts.AddressFormatField.DependentLocality, "Dependent Locality" ],
+                        [ KContacts.AddressFormatField.PostOfficeBox, "PO Box" ],
+                        [ KContacts.AddressFormatField.Country, "Country" ],
+                        [ KContacts.AddressFormatField.Region, "State" ],
+                        [ KContacts.AddressFormatField.SortingCode, "Sorting Code" ],
+                        [ KContacts.AddressFormatField.PostalCode, "Zip Code" ],
+                    ]);
+                    if (modelData.isField) { return "Field: " + field_map.get(modelData.field); }
+                    if (modelData.isLiteral) { return "Literal: \"" + modelData.literal + "\""; }
+                    if (modelData.isSeparator) { return "Separator"; }
+                }
+                font.bold: AddressFormatRepository.formatForCountry(countryCombo.currentValue, KContacts.AddressFormatScriptPreference.LatinScript).requiredFields & modelData.field
+            }
+        }
+    }
+}
diff --git a/tests/qmlintegrationtest.qrc b/tests/qmlintegrationtest.qrc
new file mode 100644 (file)
index 0000000..92a1153
--- /dev/null
@@ -0,0 +1,9 @@
+<!--
+    SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+    SPDX-License-Identifier: CC0-1.0
+-->
+<RCC>
+    <qresource prefix="/">
+        <file>qmlintegrationtest.qml</file>
+    </qresource>
+</RCC>
diff --git a/tests/testread.cpp b/tests/testread.cpp
new file mode 100644 (file)
index 0000000..43b5dec
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <iostream>
+
+#include <QFile>
+
+#include <QCommandLineOption>
+#include <QCommandLineParser>
+#include <QCoreApplication>
+#include <QDebug>
+
+#include "converter/kcontacts/vcardconverter.h"
+#include "vcard_p.h"
+
+int main(int argc, char **argv)
+{
+    QCoreApplication app(argc, argv);
+    QCommandLineParser parser;
+    parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("vcard21"), QStringLiteral("vCard 2.1")));
+    parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("+inputfile"), QStringLiteral("Input file")));
+
+    parser.addVersionOption();
+    parser.addHelpOption();
+    parser.process(app);
+
+    if (parser.positionalArguments().count() != 1) {
+        std::cerr << "Missing argument" << std::endl;
+        return 1;
+    }
+
+    QString inputFile(parser.positionalArguments().at(0));
+
+    QFile file(inputFile);
+    if (!file.open(QIODevice::ReadOnly)) {
+        qDebug("Unable to open file '%s' for reading!", qPrintable(file.fileName()));
+        return 1;
+    }
+
+    QByteArray text = file.readAll();
+    file.close();
+
+    KContacts::VCardConverter converter;
+    KContacts::Addressee::List list = converter.parseVCards(text);
+
+    if (parser.isSet(QStringLiteral("vcard21"))) {
+        text = converter.createVCards(list, KContacts::VCardConverter::v2_1); // uses version 2.1
+    } else {
+        text = converter.createVCards(list); // uses version 3.0
+    }
+
+    std::cout << text.data();
+
+    return 0;
+}
diff --git a/tests/testread2.cpp b/tests/testread2.cpp
new file mode 100644 (file)
index 0000000..2b1cde1
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "testutils.h"
+#include <QDebug>
+#include <converter/kcontacts/vcardconverter.h>
+#include <kcontacts/addressee.h>
+
+using namespace KContacts;
+
+int main()
+{
+    Addressee::List l = vCardsAsAddresseeList();
+    QByteArray vcards = vCardsAsText();
+
+    VCardConverter vct;
+
+    Addressee::List parsed = vct.parseVCards(vcards);
+
+    if (l.size() != parsed.size()) {
+        qDebug() << "\tSize - FAILED :" << l.size() << "vs. parsed" << parsed.size();
+    } else {
+        qDebug() << "\tSize - PASSED";
+    }
+
+    Addressee::List::iterator itr1;
+    Addressee::List::iterator itr2;
+    // clang-format off
+    for (itr1 = l.begin(), itr2 = parsed.begin();
+         itr1 != l.end() && itr2 != parsed.end(); ++itr1, ++itr2) {
+        if ((*itr1).fullEmail() == (*itr2).fullEmail()
+            && (*itr1).organization() == (*itr2).organization()
+            && (*itr1).phoneNumbers() == (*itr2).phoneNumbers()
+            && (*itr1).emails() == (*itr2).emails()
+            && (*itr1).role() == (*itr2).role()) {
+            qDebug() << "\tAddressee  - PASSED";
+            qDebug() << "\t\t" << (*itr1).fullEmail() << "VS." << (*itr2).fullEmail();
+            // clang-format on
+        } else {
+            qDebug() << "\tAddressee  - FAILED";
+            qDebug() << (*itr1).toString();
+            qDebug() << (*itr2).toString();
+            // qDebug()<<"\t\t"<< (*itr1).fullEmail() << "VS." << (*itr2).fullEmail();
+        }
+    }
+}
diff --git a/tests/testutils.cpp b/tests/testutils.cpp
new file mode 100644 (file)
index 0000000..bdf6974
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "testutils.h"
+#include <QFile>
+
+#include "vcardparser_p.h"
+
+using namespace KContacts;
+
+Addressee vcard1()
+{
+    Addressee addr;
+
+    addr.setName(QStringLiteral("Frank Dawson"));
+    addr.setOrganization(QStringLiteral("Lotus Development Corporation"));
+    KContacts::ResourceLocatorUrl url;
+    url.setUrl(QUrl(QStringLiteral("http://home.earthlink.net/~fdawson")));
+    addr.setUrl(url);
+    addr.addEmail(Email(QStringLiteral("fdawson@earthlink.net")));
+
+    Email mail(QStringLiteral("Frank_Dawson@Lotus.com"));
+    mail.setPreferred(true);
+    addr.addEmail(mail);
+    addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-919-676-9515"), PhoneNumber::Voice | PhoneNumber::Msg | PhoneNumber::Work));
+    addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-919-676-9564"), PhoneNumber::Fax | PhoneNumber::Work));
+    Address a(Address::Work | Address::Postal | Address::Parcel);
+    a.setStreet(QStringLiteral("6544 Battleford Drive"));
+    a.setLocality(QStringLiteral("Raleigh"));
+    a.setRegion(QStringLiteral("NC"));
+    a.setPostalCode(QStringLiteral("27613-3502"));
+    a.setCountry(QStringLiteral("U.S.A."));
+    addr.insertAddress(a);
+    return addr;
+}
+
+Addressee vcard2()
+{
+    Addressee addr;
+
+    addr.setName(QStringLiteral("Tim Howes"));
+    addr.setOrganization(QStringLiteral("Netscape Communications Corp."));
+    addr.addEmail(Email(QStringLiteral("howes@netscape.com")));
+    addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-415-937-3419"), //
+                                       PhoneNumber::Voice | PhoneNumber::Msg | PhoneNumber::Work));
+    addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-415-528-4164"), //
+                                       PhoneNumber::Fax | PhoneNumber::Work));
+    Address a(Address::Work);
+    a.setStreet(QStringLiteral("501 E. Middlefield Rd."));
+    a.setLocality(QStringLiteral("Mountain View"));
+    a.setRegion(QStringLiteral("CA"));
+    a.setPostalCode(QStringLiteral("94043"));
+    a.setCountry(QStringLiteral("U.S.A."));
+    addr.insertAddress(a);
+    return addr;
+}
+
+Addressee vcard3()
+{
+    Addressee addr;
+
+    addr.setName(QStringLiteral("ian geiser"));
+    addr.setOrganization(QStringLiteral("Source eXtreme"));
+    addr.addEmail(QStringLiteral("geiseri@yahoo.com"));
+    addr.setTitle(QStringLiteral("VP of Engineering"));
+    return addr;
+}
+
+QByteArray vcardAsText(const QString &location)
+{
+    QByteArray text;
+
+    QFile file(location);
+    if (file.open(QIODevice::ReadOnly)) {
+        text = file.readAll();
+        file.close();
+    }
+
+    return text;
+}
+
+Addressee::List vCardsAsAddresseeList()
+{
+    Addressee::List l;
+
+    l.append(vcard1());
+    l.append(vcard2());
+    l.append(vcard3());
+
+    return l;
+}
+
+QByteArray vCardsAsText()
+{
+    QByteArray vcards = vcardAsText(QStringLiteral("tests/vcard1.vcf"));
+    vcards += vcardAsText(QStringLiteral("tests/vcard2.vcf"));
+    vcards += vcardAsText(QStringLiteral("tests/vcard3.vcf"));
+
+    return vcards;
+}
diff --git a/tests/testutils.h b/tests/testutils.h
new file mode 100644 (file)
index 0000000..f629cca
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#ifndef TESTUTILS_H
+#define TESTUTILS_H
+
+#include <QByteArray>
+#include <QString>
+
+#include <kcontacts/addressee.h>
+
+KContacts::Addressee vcard1();
+KContacts::Addressee vcard2();
+KContacts::Addressee vcard3();
+KContacts::Addressee::List vCardsAsAddresseeList();
+QByteArray vCardsAsText();
+
+#endif
diff --git a/tests/testwrite.cpp b/tests/testwrite.cpp
new file mode 100644 (file)
index 0000000..b3f8582
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+    This file is part of the KContacts framework.
+    SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org>
+
+    SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include <QFile>
+
+#include <KLocalizedString>
+
+#include <QCommandLineParser>
+#include <QCoreApplication>
+
+#include "converter/kcontacts/vcardconverter.h"
+#include "kcontacts/address.h"
+#include "kcontacts/addressee.h"
+#include "kcontacts/key.h"
+#include "kcontacts/phonenumber.h"
+#include "kcontacts/picture.h"
+#include "kcontacts/secrecy.h"
+#include "kcontacts/sound.h"
+
+int main(int argc, char **argv)
+{
+    QCoreApplication app(argc, argv);
+    QCommandLineParser parser;
+    parser.addVersionOption();
+    parser.addHelpOption();
+    parser.process(app);
+
+    KContacts::Addressee addressee;
+
+    addressee.setNameFromString(QLatin1String("Mr. Tobias Koenig Jr."));
+    addressee.setNickName(QLatin1String("tokoe"));
+    addressee.setBirthday(QDateTime(QDate(1982, 7, 19).startOfDay()));
+    addressee.setMailer(QLatin1String("mutt1.2"));
+    addressee.setTimeZone(KContacts::TimeZone(+2));
+
+    KContacts::Geo geo;
+    geo.setLatitude(30);
+    geo.setLongitude(51);
+    addressee.setGeo(geo);
+
+    addressee.setTitle(QLatin1String("nerd"));
+    addressee.setRole(QLatin1String("Maintainer"));
+    addressee.setOrganization(QLatin1String("KDE"));
+    addressee.setNote(QLatin1String("never\ntouch a running system"));
+    addressee.setProductId(QLatin1String("testId"));
+    addressee.setRevision(QDateTime::currentDateTime());
+    addressee.setSortString(QLatin1String("koenig"));
+    KContacts::ResourceLocatorUrl url;
+    url.setUrl(QUrl(QLatin1String("http://wgess16.dyndns.org")));
+    addressee.setUrl(url);
+    addressee.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Confidential));
+
+    KContacts::Email kdemail(QLatin1String("tokoe@kde.org"));
+    kdemail.setPreferred(true);
+    addressee.addEmail(kdemail);
+
+    KContacts::Email yahoomail(QLatin1String("tokoe82@yahoo.de"));
+    yahoomail.setPreferred(true);
+    addressee.addEmail(yahoomail);
+
+    KContacts::PhoneNumber phone1(QLatin1String("3541523475"), KContacts::PhoneNumber::Pref | KContacts::PhoneNumber::Home);
+    KContacts::PhoneNumber phone2(QLatin1String("+46745673475"), KContacts::PhoneNumber::Work);
+    addressee.insertPhoneNumber(phone1);
+    addressee.insertPhoneNumber(phone2);
+
+    KContacts::Key key(QLatin1String("secret key"), KContacts::Key::X509);
+    addressee.insertKey(key);
+
+    QStringList categories;
+    categories << QLatin1String("Friends") << QLatin1String("School") << QLatin1String("KDE");
+    addressee.setCategories(categories);
+
+    KContacts::Address a(KContacts::Address::Work | KContacts::Address::Postal | KContacts::Address::Parcel);
+    a.setStreet(QLatin1String("6544 Battleford Drive"));
+    a.setLocality(QLatin1String("Raleigh"));
+    a.setRegion(QLatin1String("NC"));
+    a.setPostalCode(QLatin1String("27613-3502"));
+    a.setCountry(QLatin1String("U.S.A."));
+    addressee.insertAddress(a);
+
+    addressee.insertCustom(QLatin1String("1hsdf"), QLatin1String("ertuer"), QLatin1String("iurt"));
+    addressee.insertCustom(QLatin1String("2hsdf"), QLatin1String("ertuer"), QLatin1String("iurt"));
+    addressee.insertCustom(QLatin1String("3hsdf"), QLatin1String("ertuer"), QLatin1String("iurt"));
+
+    KContacts::Addressee::List list;
+    for (int i = 0; i < 1000; ++i) {
+        KContacts::Addressee addr = addressee;
+        addr.setUid(QString::number(i));
+        list.append(addr);
+    }
+
+    KContacts::VCardConverter converter;
+    QByteArray txt = converter.createVCards(list);
+
+    QFile file(QLatin1String("out.vcf"));
+    if (!file.open(QIODevice::WriteOnly)) {
+        qDebug("Can't open file '%s' for writing", qPrintable(file.fileName()));
+        return 1;
+    }
+
+    file.write(txt);
+    file.close();
+
+    return 0;
+}
diff --git a/tools/convert-libaddressinput-data.py b/tools/convert-libaddressinput-data.py
new file mode 100755 (executable)
index 0000000..dbc3768
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+# SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+# SPDX-License-Identifier: LGPL-2.0-or-later
+
+import json
+import os
+import requests
+
+# converts libaddressinput data to our addressbookformatrc format
+# Note: This is not meant to just blindly overwrite our data, we have a number
+# of additions and fixes that libaddressinput doesn't have. It is merely meant
+# as an easier way to diff our data to that of libaddressinput.
+
+# get a list of all 3166-1 alpha 2 ISO codes
+isoCodesFile = open('/usr/share/iso-codes/json/iso_3166-1.json')
+isoCodesJson = json.loads(isoCodesFile.read())
+isoCodes = []
+for isoCode in isoCodesJson['3166-1']:
+    isoCodes.append(isoCode['alpha_2'])
+isoCodes.sort()
+
+outFile = open('addressformatrc', 'w')
+
+# for each ISO code, see if libaddressinput has data
+for isoCode in isoCodes:
+    req = requests.get(f"https://www.gstatic.com/chrome/autofill/libaddressinput/chromium-i18n/ssl-address/data/{isoCode}")
+    if req.status_code == 404:
+        print (f"{isoCode} has no format information")
+        continue
+    data = json.loads(req.text)
+    if not 'fmt' in data:
+        print(f"{isoCode} has no format")
+        continue
+
+    outFile.write(f"[{isoCode}]\n")
+    outFile.write(f"AddressFormat={data['fmt']}\n")
+    if 'lfmt' in data:
+        outFile.write(f"LatinAddressFormat={data['lfmt']}\n")
+    if 'upper' in data:
+        outFile.write(f"Upper={data['upper']}\n")
+    if 'require' in data:
+        outFile.write(f"Required={data['require']}\n")
+    if 'zip' in data:
+        outFile.write(f"PostalCodeFormat={data['zip']}\n")
+    outFile.write('\n')