--- /dev/null
+#clang-format
+9d9459b41478808a17df1f9d1dd1d8075c32ed74
+
+#clang-tidy
+05b61828068dbc7c0d0e7a9e6d640bea7a9c6eca
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+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
--- /dev/null
+SKIP /scripts/|/tests/|/testroundtrip
--- /dev/null
+cmake_minimum_required(VERSION 3.16)
+
+set(KF_VERSION "5.98.0") # handled by release scripts
+set(KF_DEP_VERSION "5.98.0") # handled by release scripts
+
+project(KContacts VERSION ${KF_VERSION})
+
+# ECM setup
+include(FeatureSummary)
+find_package(ECM 5.98.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} REQUIRED COMPONENTS Gui OPTIONAL_COMPONENTS Quick)
+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)
--- /dev/null
+@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@
--- /dev/null
+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.
--- /dev/null
+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.
--- /dev/null
+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!
--- /dev/null
+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.
--- /dev/null
+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.
--- /dev/null
+# 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).
--- /dev/null
+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)
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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"
--- /dev/null
+/*
+ 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
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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"
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+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
+
--- /dev/null
+BEGIN:VCARD
+VERSION:4.0
+FN:test
+N:test;;;;
+NOTE:line one\nline two\nline three\n
+UID:8OD165Pope
+END:VCARD
+
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+BEGIN:VCARD
+N:
+LABEL;QUOTED-PRINTABLE;WORK:401 Park Drive 3 West=0ABoston, MA 02215=0AUSA=0A=
+Herecomesyetanotherline
+UID:pas-id-3E136F9B00000000
+END:VCARD
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+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
--- /dev/null
+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.orgtwo@test.org
+END:VCARD
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
+
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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"));
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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"
--- /dev/null
+<!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>
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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"
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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)
--- /dev/null
+/*
+ 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
--- /dev/null
+# 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.
--- /dev/null
+### 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)="
--- /dev/null
+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
--- /dev/null
+# 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 "نوع مجهول"
--- /dev/null
+# Copyright (C) YEAR This file is copyright:
+# This file is distributed under the same license as the kcontacts package.
+#
+# enolp <enolp@softastur.org>, 2019, 2020.
+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: 2020-11-08 12:44+0100\n"
+"Last-Translator: enolp <enolp@softastur.org>\n"
+"Language-Team: Asturian <alministradores@softastur.org>\n"
+"Language: ast\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.08.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 "Cai"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr "Llugar"
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Rexón"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr "Códigu postal"
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "País"
+
+#: 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 "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 ""
+
+#: address.cpp:361
+#, kde-format
+msgctxt "Home Address"
+msgid "Home"
+msgstr "Casa"
+
+#: address.cpp:363
+#, kde-format
+msgctxt "Work Address"
+msgid "Work"
+msgstr "Trabayu"
+
+#: 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 "Identificador únicu"
+
+#: addressee.cpp:476
+#, kde-format
+msgid "Name"
+msgstr "Nome"
+
+#: 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 "Nomes adicionales"
+
+#: 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 "Nomatu"
+
+#: addressee.cpp:863
+#, kde-format
+msgid "Birthday"
+msgstr "Aniversariu"
+
+#: 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 "Teléfonu de casa"
+
+#: addressee.cpp:943
+#, kde-format
+msgid "Business Phone"
+msgstr "Teléfonu d'empresa"
+
+#: addressee.cpp:948
+#, kde-format
+msgid "Mobile Phone"
+msgstr "Teléfonu móvil"
+
+#: 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 d'empresa"
+
+#: addressee.cpp:963
+#, kde-format
+msgid "Car Phone"
+msgstr "Teléfonu del coche"
+
+#: addressee.cpp:968 phonenumber.cpp:194
+#, kde-format
+msgid "ISDN"
+msgstr "ISDN"
+
+#: addressee.cpp:973 phonenumber.cpp:198
+#, kde-format
+msgid "Pager"
+msgstr "Paxinador"
+
+#: addressee.cpp:978
+#, kde-format
+msgid "Email Address"
+msgstr "Direición de corréu"
+
+#: addressee.cpp:998
+#, kde-format
+msgid "Mail Client"
+msgstr "Veceru de corréu"
+
+#: addressee.cpp:1018
+#, kde-format
+msgid "Time Zone"
+msgstr "Fusu horariu"
+
+#: 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ítulu"
+
+#: 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 "Organización"
+
+#: addressee.cpp:1211
+#, kde-format
+msgid "Department"
+msgstr "Departamentu"
+
+#: addressee.cpp:1231
+#, kde-format
+msgid "Note"
+msgstr "Nota"
+
+#: 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 "Semeya"
+
+#: addressee.cpp:1397
+#, kde-format
+msgid "Sound"
+msgstr "Soníu"
+
+#: 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 "Direición"
+
+#: field.cpp:225
+#, kde-format
+msgid "Email"
+msgstr ""
+
+#: field.cpp:227
+#, kde-format
+msgid "Personal"
+msgstr "Personal"
+
+#: 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 "Númberu telefónicu"
+
+#: phonenumber.cpp:172
+#, kde-format
+msgctxt "Home phone"
+msgid "Home"
+msgstr "Casa"
+
+#: phonenumber.cpp:174
+#, kde-format
+msgctxt "Work phone"
+msgid "Work"
+msgstr "Trabayu"
+
+#: phonenumber.cpp:176
+#, kde-format
+msgid "Messenger"
+msgstr "Mensaxeru"
+
+#: phonenumber.cpp:178
+#, kde-format
+msgctxt "Preferred phone"
+msgid "Preferred"
+msgstr ""
+
+#: 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 "Videu"
+
+#: phonenumber.cpp:188
+#, kde-format
+msgid "Mailbox"
+msgstr ""
+
+#: 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 ""
+
+#: phonenumber.cpp:200
+#, kde-format
+msgctxt "another type of phone"
+msgid "Other"
+msgstr "Otru"
+
+#: phonenumber.cpp:213
+#, kde-format
+msgid "Preferred Number"
+msgstr ""
+
+#: phonenumber.cpp:223
+#, kde-format
+msgid "Work Fax"
+msgstr "Fax del trabayu"
+
+#: 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 "Confidential"
+
+#: secrecy.cpp:107
+#, kde-format
+msgctxt "unknown secrecy type"
+msgid "Unknown type"
+msgstr ""
--- /dev/null
+# 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"
--- /dev/null
+# 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 "Невядомы тып"
--- /dev/null
+# 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 "Неизвестен тип"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "Άγνωστος τύπος"
--- /dev/null
+# 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"
--- /dev/null
+# Translation of kabc into esperanto.
+# Axel Rousseau <axel@esperanto-jeunes.org>, 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-15 12:06+0100\n"
+"Last-Translator: Axel Rousseau <axel@esperanto-jeunes.org>\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 ""
+
+#: address.cpp:239
+#, kde-format
+msgid "Extended Address Information"
+msgstr ""
+
+#: address.cpp:255
+#, kde-format
+msgid "Street"
+msgstr "Strato"
+
+#: address.cpp:271
+#, kde-format
+msgid "Locality"
+msgstr ""
+
+#: address.cpp:287
+#, kde-format
+msgid "Region"
+msgstr "Regiono"
+
+#: address.cpp:303
+#, kde-format
+msgid "Postal Code"
+msgstr ""
+
+#: address.cpp:319
+#, kde-format
+msgid "Country"
+msgstr "Lando"
+
+#: 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 "Preferata adreso"
+
+#: 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 "Nomo"
+
+#: 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 "Naskiĝdato"
+
+#: 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 "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 ""
+
+#: addressee.cpp:1357
+#, kde-format
+msgid "Logo"
+msgstr ""
+
+#: addressee.cpp:1377
+#, kde-format
+msgid "Photo"
+msgstr "Foto"
+
+#: addressee.cpp:1397
+#, fuzzy, kde-format
+#| msgctxt "Describing the sound of the character"
+#| msgid "Sound: "
+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 ""
+
+#: field.cpp:223
+#, kde-format
+msgctxt "street/postal"
+msgid "Address"
+msgstr ""
+
+#: 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 ""
+
+#: 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 "Fax"
+
+#: 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 "Poŝtkesto"
+
+#: 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 ""
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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.
+#
+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-06-07 23:52+0100\n"
+"Last-Translator: Vincent Pinon <vpinon@kde.org>\n"
+"Language-Team: French <kde-francophone@kde.org>\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 2.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 "Bipeur"
+
+#: 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "अज्ञात क़िस्म"
--- /dev/null
+# 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 "अग्यात किसिम"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "未知のタイプ"
--- /dev/null
+# 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 "Беймәлім түрі"
--- /dev/null
+# 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 "ប្រភេទមិនស្គាល់"
--- /dev/null
+# 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 "알 수 없는 형식"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "अज्ञात प्रकार"
--- /dev/null
+# 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 ""
--- /dev/null
+# 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 ""
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "ਅਣਜਾਣ ਕਿਸਮ"
--- /dev/null
+# 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"
--- /dev/null
+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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "Неизвестный доступ"
--- /dev/null
+# 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 ""
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "непознато"
--- /dev/null
+# 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 "непознато"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "Навъи номаълум"
--- /dev/null
+# 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 "ไม่ทราบประเภท"
--- /dev/null
+# 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"
--- /dev/null
+# 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 "نامەلۇم تىپ"
--- /dev/null
+# 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 "Невідомий тип"
--- /dev/null
+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: 2022-08-20 14:17\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 "未知类型"
--- /dev/null
+# 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 "未知的型態"
--- /dev/null
+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 ${KF5_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()
--- /dev/null
+#! /usr/bin/env bash
+$XGETTEXT *.cpp -o $podir/kcontacts5.pot
--- /dev/null
+/*
+ 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 ®ion)
+{
+ 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
--- /dev/null
+/*
+ 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 ®ion);
+
+ /**
+ 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.
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 92, "Use KContacts::Address::formatted() instead")
+ Q_REQUIRED_RESULT 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
--- /dev/null
+/*
+ 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 ¬e)
+{
+ 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> ¶m)
+{
+ 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);
+ }
+}
+
+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"
--- /dev/null
+/*
+ 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 ¬e);
+
+ /**
+ 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> ¶m = 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);
+
+ /**
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+[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}
--- /dev/null
+/*
+ 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()));
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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]));
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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");
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<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>
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+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
+)
+
+
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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"));
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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"
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+File names in here should match the corresponding URI scheme.
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-aim
+Comment=AIM Protocol
+Comment[ar]=ميفاق AIM
+Comment[ast]=Protocolu d'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[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[ast]=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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-facebook
+Comment=Facebook Protocol
+Comment[ar]=ميفاق فيسبوك
+Comment[ast]=Protocolu de Facebook
+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[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[ast]=Facebook
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-gadugadu
+Comment=Gadu-Gadu Protocol
+Comment[ar]=ميفاق غادو-غادو
+Comment[ast]=Protocolu de Gadu-Gadu
+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[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[ast]=Gadu-Gadu
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-google
+Comment=Google Talk
+Comment[ar]=جوجل توك
+Comment[ast]=Google Talk
+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[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[ast]=Google Talk
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-groupwise
+Comment=Novell GroupWise Messenger
+Comment[ar]=نوفل مرسال GroupWise
+Comment[ast]=Mensaxeru GroupWise de Novel
+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[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[ast]=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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-icq
+Comment=ICQ Protocol
+Comment[ar]=ميفاق ICQ
+Comment[ast]=Protocolu d'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[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[ast]=ICQ
+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[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
--- /dev/null
+<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>
+ </qresource>
+</RCC>
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-irc
+Comment=Internet Relay Chat
+Comment[ar]=بروتوكول الدردشة عبر الإنترنت
+Comment[ast]=Charra que s'enconta n'internet
+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[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[ast]=IRC
+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[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
--- /dev/null
+[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[en_GB]=Matrix
+Comment[es]=Matrix
+Comment[eu]=Matrix
+Comment[fi]=Matrix
+Comment[fr]=Matrix
+Comment[ia]=Matrix
+Comment[it]=Matrix
+Comment[ko]=Matrix
+Comment[nl]=Matrix
+Comment[nn]=Matrix
+Comment[pl]=Matrix
+Comment[pt]=Matrix
+Comment[pt_BR]=Matrix
+Comment[ro]=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[en_GB]=Matrix
+Name[es]=Matrix
+Name[eu]=Matrix
+Name[fi]=Matrix
+Name[fr]=Matrix
+Name[ia]=Matrix
+Name[it]=Matrix
+Name[ko]=Matrix
+Name[nl]=Matrix
+Name[nn]=Matrix
+Name[pl]=Matrix
+Name[pt]=Matrix
+Name[pt_BR]=Matrix
+Name[ro]=Matrix
+Name[sk]=Matica
+Name[sl]=Matrix
+Name[sv]=Matrix
+Name[tr]=Matrix
+Name[uk]=Matrix
+Name[x-test]=xxMatrixxx
+Name[zh_CN]=Matrix
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-meanwhile
+Comment=Meanwhile Protocol
+Comment[ar]=ميفاق Meanwhile
+Comment[ast]=Protocolu 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[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[ast]=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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-msn
+Comment=MSN Messenger
+Comment[ar]=مرسال ام اس ان
+Comment[ast]=Mensaxeru de MSN
+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[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[ast]=MSN Messenger
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-qq
+Comment=Tencent QQ Messaging
+Comment[ar]=رسائل ترانسنت QQ
+Comment[ast]=Mensaxería QQ de Tencent
+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[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[ast]=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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=internet-telephone
+Comment=Session Initiation Protocol
+Comment[ar]=بروتوكول بدء جلسة
+Comment[ast]=Protocolu d'aniciu de sesiones
+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[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[ast]=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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-skype
+Comment=Skype Internet Telephony
+Comment[ar]=الاتصال عبر الإنترنت سكايب
+Comment[ast]=Telefonía per internet de Skype
+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[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[ast]=Skype
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-sms
+Comment=SMS Protocol
+Comment[ar]=ميفاق خدمة الرسائل القصيرة
+Comment[ast]=Protocolu SMS
+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[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[ast]=SMS
+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[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
--- /dev/null
+[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[en_GB]=Telegram
+Comment[es]=Telegram
+Comment[eu]=Telegram
+Comment[fi]=Telegram
+Comment[fr]=Telegram
+Comment[ia]=Telegram
+Comment[it]=Telegram
+Comment[ko]=텔레그램
+Comment[nl]=Telegram
+Comment[nn]=Telegram
+Comment[pl]=Telegram
+Comment[pt]=Telegram
+Comment[pt_BR]=Telegram
+Comment[ro]=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[en_GB]=Telegram
+Name[es]=Telegram
+Name[eu]=Telegram
+Name[fi]=Telegram
+Name[fr]=Telegram
+Name[ia]=Telegram
+Name[it]=Telegram
+Name[ko]=텔레그램
+Name[nl]=Telegram
+Name[nn]=Telegram
+Name[pl]=Telegram
+Name[pt]=Telegram
+Name[pt_BR]=Telegram
+Name[ro]=Telegram
+Name[sk]=Telegram
+Name[sl]=Telegram
+Name[sv]=Telegram
+Name[tr]=Telegram
+Name[uk]=Telegram
+Name[x-test]=xxTelegramxx
+Name[zh_CN]=Telegram
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-twitter
+Comment=Twitter Protocol
+Comment[ar]=ميفاق تويتر
+Comment[ast]=Protoclu de Twitter
+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[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[ast]=Twitter
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-jabber
+Comment=Jabber Protocol
+Comment[ar]=ميفاق جابر
+Comment[ast]=Protocolu Jabber
+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[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[ast]=Jabber
+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[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
--- /dev/null
+[Desktop Entry]
+Type=Service
+Icon=im-yahoo
+Comment=Yahoo Protocol
+Comment[ar]=ميفاق ياهو
+Comment[ast]=Protocolu de Yahoo
+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[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[ast]=Yahoo
+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[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
--- /dev/null
+<RCC>
+ <qresource prefix="/org.kde.kcontacts/">
+ <file>addressformatrc</file>
+ </qresource>
+</RCC>
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+ SPDX-License-Identifier: LGPL-2.0-or-later
+*/
+
+#include "namespace.h"
+#include "moc_namespace.cpp"
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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 ¬e)
+ : d(new Private)
+{
+ d->note = note;
+}
+
+Note::~Note()
+{
+}
+
+void Note::setNote(const QString ¬e)
+{
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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 ¬e)
+{
+ return s << note.d->mParamMap << note.d->note;
+}
+
+QDataStream &KContacts::operator>>(QDataStream &s, Note ¬e)
+{
+ s >> note.d->mParamMap >> note.d->note;
+ return s;
+}
--- /dev/null
+/*
+ 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 ¬e);
+
+ ~Note();
+
+ typedef QVector<Note> List;
+
+ void setNote(const QString ¬e);
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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 ¶m) const
+ {
+ return std::find_if(cbegin(), cend(), [¶m](const ParameterData &info) {
+ return info.param == param;
+ });
+ }
+
+ inline iterator findParam(const QString ¶m)
+ {
+ return std::find_if(begin(), end(), [¶m](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> ¶ms)
+ {
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT QMap<QString, QStringList> parameters() const;
+#endif
+
+private:
+ void setParams(const ParameterMap ¶ms);
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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> ¶ms)
+{
+ 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 ¶ms)
+{
+ 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;
+}
--- /dev/null
+/*
+ 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> ¶ms);
+#endif
+
+#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88)
+ /**
+ * @deprecated Since 5.88 for lack of usage
+ */
+ KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.")
+ Q_REQUIRED_RESULT 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 ¶ms);
+ 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
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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 ¶ms)
+{
+ for (const auto &[param, list] : params) {
+ addParameter(param, list.join(QLatin1Char(',')));
+ }
+}
+
+void VCardLine::addParameter(const QString ¶m, 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 ¶m) const
+{
+ auto it = mParamMap.findParam(param);
+ return it != mParamMap.cend() ? it->paramValues : QStringList{};
+}
+
+QString VCardLine::parameter(const QString ¶m) const
+{
+ auto it = mParamMap.findParam(param);
+ return it != mParamMap.cend() && !it->paramValues.isEmpty() ? it->paramValues.at(0) : QString{};
+}
+
+ParameterMap VCardLine::parameterMap() const
+{
+ return mParamMap;
+}
--- /dev/null
+/*
+ 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 ¶m, const QString &value);
+
+ void addParameters(const ParameterMap ¶ms);
+
+ /**
+ * 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 ¶m) 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 ¶m) const;
+
+ /**
+ * Returns all parameters
+ */
+ Q_REQUIRED_RESULT ParameterMap parameterMap() const;
+
+private:
+ ParameterMap mParamMap;
+ QString mIdentifier;
+ QString mGroup;
+ QVariant mValue;
+};
+}
+
+#endif
--- /dev/null
+/*
+ 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 ¤tLine, VCardLine *vCardLine);
+
+private:
+ void addParameter(const QByteArray ¶mKey, const QByteArray ¶mValue);
+
+private:
+ StringCache &m_cache;
+ std::function<QByteArray()> m_fetchAnotherLine;
+
+ VCardLine *m_vCardLine = nullptr;
+ QByteArray m_encoding;
+ QByteArray m_charset;
+};
+
+void VCardLineParser::addParameter(const QByteArray ¶mKey, const QByteArray ¶mValue)
+{
+ 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 ¤tLine, 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 ¶m : 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+
+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()
--- /dev/null
+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.
--- /dev/null
+#!/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;
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
+ }
+ }
+ }
+}
--- /dev/null
+<!--
+ SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
+ SPDX-License-Identifier: CC0-1.0
+-->
+<RCC>
+ <qresource prefix="/">
+ <file>qmlintegrationtest.qml</file>
+ </qresource>
+</RCC>
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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();
+ }
+ }
+}
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+#!/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')