From: Aurélien COUDERC Date: Sun, 12 Feb 2023 20:44:26 +0000 (+0000) Subject: Import kcontacts_5.103.0.orig.tar.xz X-Git-Tag: archive/raspbian/5%5.103.0-1+rpi1^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=41ec436b13d2b57c462d227a1113587e085ec7d8;p=kcontacts.git Import kcontacts_5.103.0.orig.tar.xz [dgit import orig kcontacts_5.103.0.orig.tar.xz] --- 41ec436b13d2b57c462d227a1113587e085ec7d8 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000..db7b2af --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,5 @@ +#clang-format +9d9459b41478808a17df1f9d1dd1d8075c32ed74 + +#clang-tidy +05b61828068dbc7c0d0e7a9e6d640bea7a9c6eca diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d84c817 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Ignore the following files +*~ +*.[oa] +*.diff +*.kate-swp +*.kdev4 +.kdev_include_paths +*.kdevelop.pcs +*.moc +*.moc.cpp +*.orig +*.user +.*.swp +.swp.* +Doxyfile +Makefile +avail +random_seed +/build*/ +CMakeLists.txt.user* +*.unc-backup* +.cmake/ +/.clang-format +/compile_commands.json +.clangd +.idea +/cmake-build* +.cache diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..1d58b44 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2020 Volker Krause +# SPDX-License-Identifier: CC0-1.0 + +include: + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux-qt6.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/android-qt6.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd-qt6.yml + - https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/windows-qt6.yml diff --git a/.kde-ci.yml b/.kde-ci.yml new file mode 100644 index 0000000..38f1df9 --- /dev/null +++ b/.kde-ci.yml @@ -0,0 +1,12 @@ +Dependencies: +- 'on': ['@all'] + 'require': + 'frameworks/extra-cmake-modules': '@same' + 'frameworks/kcoreaddons' : '@same' + 'frameworks/ki18n' : '@same' + 'frameworks/kconfig' : '@same' + 'frameworks/kcodecs' : '@same' + +Options: + test-before-installing: True + require-passing-tests-on: [ 'Linux', "FreeBSD" ] diff --git a/.krazy b/.krazy new file mode 100644 index 0000000..80b3c47 --- /dev/null +++ b/.krazy @@ -0,0 +1 @@ +SKIP /scripts/|/tests/|/testroundtrip diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..69f4a4f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,114 @@ +cmake_minimum_required(VERSION 3.16) + +set(KF_VERSION "5.103.0") # handled by release scripts +set(KF_DEP_VERSION "5.103.0") # handled by release scripts + +project(KContacts VERSION ${KF_VERSION}) + +# ECM setup +include(FeatureSummary) +find_package(ECM 5.103.0 NO_MODULE) +set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") +feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) + +set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) +set(CMAKE_AUTORCC ON) + +set(REQUIRED_QT_VERSION 5.15.2) + +include(KDEInstallDirs) +include(KDECMakeSettings) +include(KDEGitCommitHooks) +include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) + +include(ECMGenerateExportHeader) +include(ECMGenerateHeaders) +include(ECMGeneratePriFile) +include(ECMGenerateExportHeader) +include(ECMDeprecationSettings) + +include(ECMSetupVersion) +include(ECMQtDeclareLoggingCategory) +include(ECMAddQch) + +set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].") + +option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF) +add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)") + +set(KCONTACTS_LIB_VERSION ${KF_VERSION}) + +ecm_setup_version(PROJECT VARIABLE_PREFIX KContacts + VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/kcontacts_version.h" + PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfigVersion.cmake" + SOVERSION 5 +) + +########### Find packages ########### +find_package(Qt${QT_MAJOR_VERSION} ${REQUIRED_QT_VERSION} NO_MODULE COMPONENTS Gui Quick) +set_package_properties(Qt${QT_MAJOR_VERSION}Gui PROPERTIES + TYPE REQUIRED + PURPOSE "Basic library component" +) +set_package_properties(Qt${QT_MAJOR_VERSION}Quick PROPERTIES + TYPE OPTIONAL + PURPOSE "QtQuick plugin" +) +find_package(KF5 ${KF_DEP_VERSION} REQUIRED COMPONENTS CoreAddons I18n Config Codecs) +if (QT_MAJOR_VERSION STREQUAL "6") + find_package(Qt6Core5Compat) +endif() + +########### Targets ########### + +add_definitions(-DTRANSLATION_DOMAIN=\"kcontacts5\") +ki18n_install(po) + +ecm_set_disabled_deprecation_versions( + QT 5.15.2 + KF 5.95.0 +) + +add_subdirectory(src) + +if(BUILD_TESTING) + add_subdirectory(autotests) + add_subdirectory(tests) +endif() + +########### CMake Config Files ########### +set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5Contacts") + +if (BUILD_QCH) + ecm_install_qch_export( + TARGETS KF5Contacts_QCH + FILE KF5ContactsQchTargets.cmake + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + COMPONENT Devel + ) + set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF5ContactsQchTargets.cmake\")") +endif() + +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/KF5ContactsConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfig.cmake" + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} +) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/KF5ContactsConfigVersion.cmake" + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + COMPONENT Devel +) + +install(EXPORT KF5ContactsTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5ContactsTargets.cmake NAMESPACE KF5::) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/kcontacts_version.h + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts COMPONENT Devel +) + +feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) + +kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) diff --git a/KF5ContactsConfig.cmake.in b/KF5ContactsConfig.cmake.in new file mode 100644 index 0000000..e8796f7 --- /dev/null +++ b/KF5ContactsConfig.cmake.in @@ -0,0 +1,10 @@ +@PACKAGE_INIT@ +include(CMakeFindDependencyMacro) +find_dependency(KF5CoreAddons "@KF_DEP_VERSION@") +find_dependency(KF5Config "@KF_DEP_VERSION@") +find_dependency(KF5I18n "@KF_DEP_VERSION@") +find_dependency(KF5Codecs "@KF_DEP_VERSION@") + +include("${CMAKE_CURRENT_LIST_DIR}/KF5ContactsTargets.cmake") + +@PACKAGE_INCLUDE_QCHTARGETS@ diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt new file mode 100644 index 0000000..0741db7 --- /dev/null +++ b/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,26 @@ +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/LICENSES/LGPL-2.0-or-later.txt b/LICENSES/LGPL-2.0-or-later.txt new file mode 100644 index 0000000..5c96471 --- /dev/null +++ b/LICENSES/LGPL-2.0-or-later.txt @@ -0,0 +1,446 @@ +GNU LIBRARY GENERAL PUBLIC LICENSE + +Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. + +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is numbered 2 because +it goes with version 2 of the ordinary GPL.] + +Preamble + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public Licenses are intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. + +This license, the Library General Public License, applies to some specially +designated Free Software Foundation software, and to any other libraries whose +authors decide to use it. You can use it for your libraries, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for this service if you +wish), that you receive source code or can get it if you want it, that you +can change the software or use pieces of it in new free programs; and that +you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of +the library, or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for +a fee, you must give the recipients all the rights that we gave you. You must +make sure that they, too, receive or can get the source code. If you link +a program with the library, you must provide complete object files to the +recipients so that they can relink them with the library, after making changes +to the library and recompiling it. And you must show them these terms so they +know their rights. + +Our method of protecting your rights has two steps: (1) copyright the library, +and (2) offer you this license which gives you legal permission to copy, distribute +and/or modify the library. + +Also, for each distributor's protection, we want to make certain that everyone +understands that there is no warranty for this free library. If the library +is modified by someone else and passed on, we want its recipients to know +that what they have is not the original version, so that any problems introduced +by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that companies distributing free software will individually +obtain patent licenses, thus in effect transforming the program into proprietary +software. To prevent this, we have made it clear that any patent must be licensed +for everyone's free use or not licensed at all. + +Most GNU software, including some libraries, is covered by the ordinary GNU +General Public License, which was designed for utility programs. This license, +the GNU Library General Public License, applies to certain designated libraries. +This license is quite different from the ordinary one; be sure to read it +in full, and don't assume that anything in it is the same as in the ordinary +license. + +The reason we have a separate public license for some libraries is that they +blur the distinction we usually make between modifying or adding to a program +and simply using it. Linking a program with a library, without changing the +library, is in some sense simply using the library, and is analogous to running +a utility program or application program. However, in a textual and legal +sense, the linked executable is a combined work, a derivative of the original +library, and the ordinary General Public License treats it as such. + +Because of this blurred distinction, using the ordinary General Public License +for libraries did not effectively promote software sharing, because most developers +did not use the libraries. We concluded that weaker conditions might promote +sharing better. + +However, unrestricted linking of non-free programs would deprive the users +of those programs of all benefit from the free status of the libraries themselves. +This Library General Public License is intended to permit developers of non-free +programs to use free libraries, while preserving your freedom as a user of +such programs to change the free libraries that are incorporated in them. +(We have not seen how to achieve this as regards changes in header files, +but we have achieved it as regards changes in the actual functions of the +Library.) The hope is that this will lead to faster development of free libraries. + +The precise terms and conditions for copying, distribution and modification +follow. Pay close attention to the difference between a "work based on the +library" and a "work that uses the library". The former contains code derived +from the library, while the latter only works together with the library. + +Note that it is possible for a library to be covered by the ordinary General +Public License rather than by this special one. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library which contains a +notice placed by the copyright holder or other authorized party saying it +may be distributed under the terms of this Library General Public License +(also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared +so as to be conveniently linked with application programs (which use some +of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has +been distributed under these terms. A "work based on the Library" means either +the Library or any derivative work under copyright law: that is to say, a +work containing the Library or a portion of it, either verbatim or with modifications +and/or translated straightforwardly into another language. (Hereinafter, translation +is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications +to it. For a library, complete source code means all the source code for all +modules it contains, plus any associated interface definition files, plus +the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running a program +using the Library is not restricted, and output from such a program is covered +only if its contents constitute a work based on the Library (independent of +the use of the Library in a tool for writing it). Whether that is true depends +on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and disclaimer +of warranty; keep intact all the notices that refer to this License and to +the absence of any warranty; and distribute a copy of this License along with +the Library. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, +thus forming a work based on the Library, and copy and distribute such modifications +or work under the terms of Section 1 above, provided that you also meet all +of these conditions: + + a) The modified work must itself be a software library. + +b) You must cause the files modified to carry prominent notices stating that +you changed the files and the date of any change. + +c) You must cause the whole of the work to be licensed at no charge to all +third parties under the terms of this License. + +d) If a facility in the modified Library refers to a function or a table of +data to be supplied by an application program that uses the facility, other +than as an argument passed when the facility is invoked, then you must make +a good faith effort to ensure that, in the event an application does not supply +such function or table, the facility still operates, and performs whatever +part of its purpose remains meaningful. + +(For example, a function in a library to compute square roots has a purpose +that is entirely well-defined independent of the application. Therefore, Subsection +2d requires that any application-supplied function or table used by this function +must be optional: if the application does not supply it, the square root function +must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Library, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Library, the distribution of the whole must be +on the terms of this License, whose permissions for other licensees extend +to the entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise +the right to control the distribution of derivative or collective works based +on the Library. + +In addition, mere aggregation of another work not based on the Library with +the Library (or with a work based on the Library) on a volume of a storage +or distribution medium does not bring the other work under the scope of this +License. + +3. You may opt to apply the terms of the ordinary GNU General Public License +instead of this License to a given copy of the Library. To do this, you must +alter all the notices that refer to this License, so that they refer to the +ordinary GNU General Public License, version 2, instead of to this License. +(If a newer version than version 2 of the ordinary GNU General Public License +has appeared, then you can specify that version instead if you wish.) Do not +make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, +so the ordinary GNU General Public License applies to all subsequent copies +and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library +into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of +it, under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you accompany it with the complete corresponding +machine-readable source code, which must be distributed under the terms of +Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated +place, then offering equivalent access to copy the source code from the same +place satisfies the requirement to distribute the source code, even though +third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but +is designed to work with the Library by being compiled or linked with it, +is called a "work that uses the Library". Such a work, in isolation, is not +a derivative work of the Library, and therefore falls outside the scope of +this License. + +However, linking a "work that uses the Library" with the Library creates an +executable that is a derivative of the Library (because it contains portions +of the Library), rather than a "work that uses the library". The executable +is therefore covered by this License. Section 6 states terms for distribution +of such executables. + +When a "work that uses the Library" uses material from a header file that +is part of the Library, the object code for the work may be a derivative work +of the Library even though the source code is not. Whether this is true is +especially significant if the work can be linked without the Library, or if +the work is itself a library. The threshold for this to be true is not precisely +defined by law. + +If such an object file uses only numerical parameters, data structure layouts +and accessors, and small macros and small inline functions (ten lines or less +in length), then the use of the object file is unrestricted, regardless of +whether it is legally a derivative work. (Executables containing this object +code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute +the object code for the work under the terms of Section 6. Any executables +containing that work also fall under Section 6, whether or not they are linked +directly with the Library itself. + +6. As an exception to the Sections above, you may also compile or link a "work +that uses the Library" with the Library to produce a work containing portions +of the Library, and distribute that work under terms of your choice, provided +that the terms permit modification of the work for the customer's own use +and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library +is used in it and that the Library and its use are covered by this License. +You must supply a copy of this License. If the work during execution displays +copyright notices, you must include the copyright notice for the Library among +them, as well as a reference directing the user to the copy of this License. +Also, you must do one of these things: + +a) Accompany the work with the complete corresponding machine-readable source +code for the Library including whatever changes were used in the work (which +must be distributed under Sections 1 and 2 above); and, if the work is an +executable linked with the Library, with the complete machine-readable "work +that uses the Library", as object code and/or source code, so that the user +can modify the Library and then relink to produce a modified executable containing +the modified Library. (It is understood that the user who changes the contents +of definitions files in the Library will not necessarily be able to recompile +the application to use the modified definitions.) + +b) Accompany the work with a written offer, valid for at least three years, +to give the same user the materials specified in Subsection 6a, above, for +a charge no more than the cost of performing this distribution. + +c) If distribution of the work is made by offering access to copy from a designated +place, offer equivalent access to copy the above specified materials from +the same place. + +d) Verify that the user has already received a copy of these materials or +that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the Library" must +include any data and utility programs needed for reproducing the executable +from it. However, as a special exception, the source code distributed need +not include anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the operating +system on which the executable runs, unless that component itself accompanies +the executable. + +It may happen that this requirement contradicts the license restrictions of +other proprietary libraries that do not normally accompany the operating system. +Such a contradiction means you cannot use both them and the Library together +in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side +in a single library together with other library facilities not covered by +this License, and distribute such a combined library, provided that the separate +distribution of the work based on the Library and of the other library facilities +is otherwise permitted, and provided that you do these two things: + +a) Accompany the combined library with a copy of the same work based on the +Library, uncombined with any other library facilities. This must be distributed +under the terms of the Sections above. + +b) Give prominent notice with the combined library of the fact that part of +it is a work based on the Library, and explaining where to find the accompanying +uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library +except as expressly provided under this License. Any attempt otherwise to +copy, modify, sublicense, link with, or distribute the Library is void, and +will automatically terminate your rights under this License. However, parties +who have received copies, or rights, from you under this License will not +have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Library or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the Library +(or any work based on the Library), you indicate your acceptance of this License +to do so, and all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), +the recipient automatically receives a license from the original licensor +to copy, distribute, link with or modify the Library subject to these terms +and conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement +or for any other reason (not limited to patent issues), conditions are imposed +on you (whether by court order, agreement or otherwise) that contradict the +conditions of this License, they do not excuse you from the conditions of +this License. If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, then as +a consequence you may not distribute the Library at all. For example, if a +patent license would not permit royalty-free redistribution of the Library +by all those who receive copies directly or indirectly through you, then the +only way you could satisfy both it and this License would be to refrain entirely +from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents +or other property right claims or to contest validity of any such claims; +this section has the sole purpose of protecting the integrity of the free +software distribution system which is implemented by public license practices. +Many people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose +that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Library under this License may add an explicit geographical +distribution limitation excluding those countries, so that distribution is +permitted only in or among countries not thus excluded. In such case, this +License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of +the Library General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to address +new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Library does not specify a license version number, you may choose any version +ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs +whose distribution conditions are incompatible with these, write to the author +to ask for permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make exceptions +for this. Our decision will be guided by the two goals of preserving the free +status of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE +OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE +OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA +OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES +OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH +HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible +use to the public, we recommend making it free software that everyone can +redistribute and change. You can do so by permitting redistribution under +these terms (or, alternatively, under the terms of the ordinary General Public +License). + +To apply these terms, attach the following notices to the library. It is safest +to attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the "copyright" +line and a pointer to where the full notice is found. + +one line to give the library's name and an idea of what it does. + +Copyright (C) year name of author + +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Library General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your option) +any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more +details. + +You should have received a copy of the GNU Library General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your school, +if any, to sign a "copyright disclaimer" for the library, if necessary. Here +is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in + +the library `Frob' (a library for tweaking knobs) written + +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 + +Ty Coon, President of Vice + +That's all there is to it! diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 0000000..204b93d --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,19 @@ +MIT License Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/LICENSES/Unicode-DFS-2016.txt b/LICENSES/Unicode-DFS-2016.txt new file mode 100644 index 0000000..80bd8b3 --- /dev/null +++ b/LICENSES/Unicode-DFS-2016.txt @@ -0,0 +1,49 @@ +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories http://www.unicode.org/Public/, +http://www.unicode.org/reports/, http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, +http://www.unicode.org/ivd/data/, and http://www.unicode.org/utility/trac/browser/. + +Unicode Data Files do not include PDF online code charts under the directory +http://www.unicode.org/Public/. + +Software includes any source code published in the Unicode Standard or under +the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, +http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, +and http://www.unicode.org/utility/trac/browser/. + +NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, +INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), +AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND +BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, +DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE Copyright © 1991-2016 Unicode, Inc. All rights +reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the Unicode data files and any associated documentation (the "Data Files") +or Unicode software and any associated documentation (the "Software") to deal +in the Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell copies +of the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either + +(a) this copyright and permission notice appear with all copies of the Data +Files or Software, or + + (b) this copyright and permission notice appear in associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not +be used in advertising or otherwise to promote the sale, use or other dealings +in these Data Files or Software without prior written authorization of the +copyright holder. diff --git a/README.md b/README.md new file mode 100644 index 0000000..85c2262 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# KContacts + +Support for vCard contacts + +## Introduction + +KContact provides an API for contacts/address book data following the +vCard standard (RFC 2425 / RFC 2426). + +## Features +- vCard data model (see KContacts::Addressee). +- vCard input/output (see KContacts::VCardConverter). +- Contact group management (see KContacts::ContactGroup). +- Locale-aware address formatting (see KContacts::Address). +- Localized country name to ISO 3166-1 alpha 2 code mapping and vice verca (see KContacts::Address). diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt new file mode 100644 index 0000000..f33b444 --- /dev/null +++ b/autotests/CMakeLists.txt @@ -0,0 +1,51 @@ +include(ECMAddTests) + +find_package(Qt${QT_MAJOR_VERSION}Test ${REQUIRED_QT_VERSION} CONFIG REQUIRED) + +########### next target ############### + +add_executable(testroundtrip) +target_sources(testroundtrip PRIVATE testroundtrip.cpp testroundtrip.qrc) +add_test(NAME kcontacts-testroundtrip COMMAND testroundtrip) +target_link_libraries(testroundtrip KF5Contacts Qt${QT_MAJOR_VERSION}::Test) + +ecm_add_tests(birthdaytest.cpp + addresseetest.cpp + impptest.cpp + emailtest.cpp + addresstest.cpp + geotest.cpp + keytest.cpp + phonenumbertest.cpp + secrecytest.cpp + soundtest.cpp + timezonetest.cpp + contactgrouptest.cpp + vcarddragtest.cpp + langtest.cpp gendertest.cpp + calendarurltest.cpp + ldifconvertertest.cpp + relatedtest.cpp + resourcelocatorurltest.cpp + customidentifiertest.cpp + vcardlinetest.cpp + fieldgrouptest.cpp + importexportvcardtest.cpp + titletest.cpp + nicknametest.cpp + roletest.cpp + orgtest.cpp + datetimetest.cpp + clientpidmaptest.cpp + NAME_PREFIX "kcontacts-" LINK_LIBRARIES KF5Contacts Qt${QT_MAJOR_VERSION}::Test KF5::ConfigCore) + +ecm_add_test(addressformattest.cpp ../src/kcontacts.qrc + TEST_NAME addressformattest + NAME_PREFIX "kcontacts-" LINK_LIBRARIES KF5Contacts KF5::I18nLocaleData KF5::ConfigCore Qt${QT_MAJOR_VERSION}::Test) + +ecm_add_tests(picturetest.cpp + NAME_PREFIX "kcontacts-" LINK_LIBRARIES KF5Contacts Qt${QT_MAJOR_VERSION}::Test KF5::ConfigCore Qt${QT_MAJOR_VERSION}::Gui) + +# Benchmark, compiled, but not run automatically with ctest +add_executable(vcardtool_benchmark vcardtool_benchmark.cpp) +target_link_libraries(vcardtool_benchmark KF5Contacts Qt${QT_MAJOR_VERSION}::Test KF5::ConfigCore) diff --git a/autotests/addresseetest.cpp b/autotests/addresseetest.cpp new file mode 100644 index 0000000..0159ca8 --- /dev/null +++ b/autotests/addresseetest.cpp @@ -0,0 +1,468 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ +// krazy:excludeall=contractions + +#include "addresseetest.h" +#include "kcontacts/addressee.h" +#include + +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\" ")); +} + +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("inputEmail"); + QTest::addColumn("email"); + QTest::addColumn("name"); + QTest::newRow("simpleemail") << QStringLiteral("foo@kde.org") << QStringLiteral("foo@kde.org") << QString(); + QTest::newRow("email") << QStringLiteral("foo ") << QStringLiteral("foo@kde.org") << QStringLiteral("foo"); + QTest::newRow("namewithdoublequote") << QStringLiteral("\"foo\" ") << QStringLiteral("foo@kde.org") << QStringLiteral("foo"); +} + +void AddresseeTest::parseEmailAddress() +{ + QFETCH(QString, inputEmail); + QFETCH(QString, email); + QFETCH(QString, name); + + QString parsedName; + QString parsedEmail; + KContacts::Addressee::parseEmailAddress(inputEmail, parsedName, parsedEmail); + QCOMPARE(parsedEmail, email); + QCOMPARE(parsedName, name); +} diff --git a/autotests/addresseetest.h b/autotests/addresseetest.h new file mode 100644 index 0000000..4532d23 --- /dev/null +++ b/autotests/addresseetest.h @@ -0,0 +1,31 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ADDRESSEE_TEST_H +#define ADDRESSEE_TEST_H + +#include + +class AddresseeTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void emptyTest(); + void storeTest(); + void equalsTest(); + void differsTest(); + void assignmentTest(); + void serializeTest(); + void fullEmailTest(); + void nameFromStringTest(); + void customFieldsTest(); + void parseEmailAddress_data(); + void parseEmailAddress(); +}; + +#endif diff --git a/autotests/addressformattest.cpp b/autotests/addressformattest.cpp new file mode 100644 index 0000000..c40f322 --- /dev/null +++ b/autotests/addressformattest.cpp @@ -0,0 +1,235 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "addressformat.h" +#include "addressformatparser.cpp" +#include "addressformatscript.cpp" +#include "addressformatter.cpp" + +#include +#include +#include + +#include +#include + +using namespace KContacts; + +void initLocale() +{ + qputenv("LANGUAGE", "en_US"); + QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates)); +} + +Q_CONSTRUCTOR_FUNCTION(initLocale) + +class AddressFormatTest : public QObject +{ + Q_OBJECT +private: + AddressFormat parseFormat(QStringView f, QStringView u, QStringView country) + { + AddressFormat format; + auto fmt = AddressFormatPrivate::get(format); + fmt->upper = AddressFormatParser::parseFields(u); + fmt->elements = AddressFormatParser::parseElements(f); + fmt->country = country.toString(); + return format; + } + +private Q_SLOTS: + void testRepostory() + { + auto fmt = AddressFormatRepository::formatForCountry(QStringLiteral("CA"), AddressFormatScriptPreference::Local); + QCOMPARE(fmt.requiredFields(), + AddressFormatField::StreetAddress | AddressFormatField::Locality | AddressFormatField::PostalCode | AddressFormatField::Region); + QCOMPARE(fmt.upperCaseFields(), + AddressFormatField::StreetAddress | AddressFormatField::Locality | AddressFormatField::PostalCode | AddressFormatField::Region + | AddressFormatField::Name | AddressFormatField::Organization | AddressFormatField::Country); + QCOMPARE(fmt.usedFields(), + AddressFormatField::StreetAddress | AddressFormatField::Locality | AddressFormatField::PostalCode | AddressFormatField::Region + | AddressFormatField::Name | AddressFormatField::Organization | AddressFormatField::PostOfficeBox); + const auto &elems = fmt.elements(); + QCOMPARE(elems.size(), 14); + + QCOMPARE(elems[0].isField(), true); + QCOMPARE(elems[0].field(), AddressFormatField::Name); + QCOMPARE(elems[1].isSeparator(), true); + QCOMPARE(elems[2].isField(), true); + QCOMPARE(elems[2].field(), AddressFormatField::Organization); + QCOMPARE(elems[3].isSeparator(), true); + QCOMPARE(elems[6].isLiteral(), true); + QCOMPARE(elems[6].literal(), QLatin1String("PO BOX ")); + QCOMPARE(elems[9].isField(), true); + QCOMPARE(elems[9].field(), AddressFormatField::Locality); + QCOMPARE(elems[10].isLiteral(), true); + QCOMPARE(elems[10].literal(), QLatin1String(" ")); + QCOMPARE(elems[11].isField(), true); + QCOMPARE(elems[11].field(), AddressFormatField::Region); + QCOMPARE(elems[12].isLiteral(), true); + QCOMPARE(elems[12].literal(), QLatin1String(" ")); + QCOMPARE(elems[13].isField(), true); + QCOMPARE(elems[13].field(), AddressFormatField::PostalCode); + + QVERIFY(!fmt.postalCodeRegularExpression().isEmpty()); + QCOMPARE(fmt.country(), QLatin1String("CA")); + } + + void testFormatStyles() + { + Address addr; + addr.setCountry(QStringLiteral("DE")); + addr.setRegion(QStringLiteral("BE")); + addr.setLocality(QStringLiteral("Berlin")); + addr.setPostalCode(QStringLiteral("10969")); + addr.setStreet(QStringLiteral("Prinzenstraße 85 F")); + addr.setExtended(QStringLiteral("East wing")); + + auto fmt = parseFormat(u"%O%n%N%nPostfach %P%n%A%n%Z %C", u"R", u"DE"); + auto s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::Postal); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nEast wing\nPrinzenstraße 85 F\n10969 Berlin\n\nGERMANY")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineInternational); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nEast wing\nPrinzenstraße 85 F\n10969 Berlin\nGermany")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineDomestic); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nEast wing\nPrinzenstraße 85 F\n10969 Berlin")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineInternational); + QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, East wing, Prinzenstraße 85 F, 10969 Berlin, Germany")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, East wing, Prinzenstraße 85 F, 10969 Berlin")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::GeoUriQuery); + QCOMPARE(s, QStringLiteral("Prinzenstraße 85 F,10969 Berlin,DE")); + + addr.setExtended(QString()); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::Postal); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\n\nGERMANY")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineInternational); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\nGermany")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineDomestic); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPrinzenstraße 85 F\n10969 Berlin")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineInternational); + QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Prinzenstraße 85 F, 10969 Berlin, Germany")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Prinzenstraße 85 F, 10969 Berlin")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::GeoUriQuery); + QCOMPARE(s, QStringLiteral("Prinzenstraße 85 F,10969 Berlin,DE")); + + addr.setPostOfficeBox(QStringLiteral("42")); + addr.setStreet(QString()); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::Postal); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPostfach 42\n10969 Berlin\n\nGERMANY")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineInternational); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPostfach 42\n10969 Berlin\nGermany")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::MultiLineDomestic); + QCOMPARE(s, QStringLiteral("KDE e.V.\nDr. Konqi\nPostfach 42\n10969 Berlin")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineInternational); + QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Postfach 42, 10969 Berlin, Germany")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("KDE e.V., Dr. Konqi, Postfach 42, 10969 Berlin")); + s = AddressFormatter::format(addr, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V."), fmt, AddressFormatStyle::GeoUriQuery); + QCOMPARE(s, QStringLiteral("10969 Berlin,DE")); + } + + void testFormatScript() + { + KContacts::Address address; + address.setCountry(QStringLiteral("JP")); + address.setRegion(QStringLiteral("東京")); + address.setLocality(QStringLiteral("都港区")); + address.setPostalCode(QStringLiteral("106-0047")); + address.setStreet(QStringLiteral("南麻布 4-6-28")); + auto fmt = parseFormat(u"〒%Z%n%S%C%A%n%O%n%N", u"SR", u"JP"); + auto s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("〒106-0047東京都港区南麻布 4-6-28")); + + address = {}; + address.setCountry(QStringLiteral("EG")); + address.setLocality(QStringLiteral("القاهرة")); + address.setStreet(QStringLiteral("2005ج كورنيش النيل، رملة بولاق")); + fmt = parseFormat(u"%N%n%O%n%A%n%C%n%S%n%Z", u"", u"EG"); + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("2005ج كورنيش النيل، رملة بولاق، القاهرة")); + + address = {}; + address.setCountry(QStringLiteral("KR")); + address.setRegion(QStringLiteral("서울특별시")); + address.setLocality(QStringLiteral("중구")); + address.setPostalCode(QStringLiteral("04637")); + address.setStreet(QStringLiteral("한강대로 416")); + fmt = parseFormat(u"%R%n%S %C%D%n%A%n%O%n%N%n%Z", u"Z", u"KR"); + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("서울특별시 중구 한강대로 416 04637")); + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineDomestic); + QCOMPARE(s, QStringLiteral("서울특별시 중구\n한강대로 416\n04637")); + // the weird language mix is because we are in the wrong locale for KR here, + // the important part is that the country is in the front when using Hangul + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineInternational); + QCOMPARE(s, QStringLiteral("Korea, Republic of 서울특별시 중구 한강대로 416 04637")); + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineInternational); + QCOMPARE(s, QStringLiteral("Korea, Republic of\n서울특별시 중구\n한강대로 416\n04637")); + + // reverse order address lines + address.setExtended(QStringLiteral("서울스퀘어 11층")); + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::SingleLineDomestic); + QCOMPARE(s, QStringLiteral("서울특별시 중구 한강대로 416 서울스퀘어 11층 04637")); + s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineDomestic); + QCOMPARE(s, QStringLiteral("서울특별시 중구\n한강대로 416\n서울스퀘어 11층\n04637")); + } + + void testIncompleteAddress() + { + KContacts::Address address; + address.setLocality(QStringLiteral("City")); + address.setPostalCode(QStringLiteral("XX 12345")); // region wrongly part of postal code field + + auto fmt = parseFormat(u"%C, %S %Z", u"", u"US"); + auto s = AddressFormatter::format(address, QString(), QString(), fmt, AddressFormatStyle::MultiLineDomestic); + QCOMPARE(s, QLatin1String("City XX 12345")); + } + + void validateRepository() + { + KConfig config(QStringLiteral(":/org.kde.kcontacts/addressformatrc"), KConfig::SimpleConfig); + const auto groups = config.groupList(); + + for (const auto &countryCode : groups) { + // qDebug() << countryCode; + QVERIFY(KCountry::fromAlpha2(countryCode).isValid()); + const auto group = config.group(countryCode); + + QVERIFY(group.hasKey("AddressFormat")); + const auto upper = AddressFormatParser::parseFields(group.readEntry("Upper")); + const auto required = AddressFormatParser::parseFields(group.readEntry("Required")); + + // TODO can we check all language variants as well? + for (const auto &key : {"AddressFormat", "BusinessAddressFormat", "LatinAddressFormat", "LatinBusinessAddressFormat"}) { + if (!group.hasKey(key)) { + continue; + } + const auto elems = AddressFormatParser::parseElements(group.readEntry(key, QString())); + + AddressFormatFields seen = AddressFormatField::NoField; + for (const auto &elem : elems) { + if (!elem.isField()) { + continue; + } + QCOMPARE(seen & elem.field() & ~(int)AddressFormatField::SortingCode, 0); + seen |= elem.field(); + } + + QCOMPARE(seen & required, required); + QCOMPARE(seen & upper & ~(int)AddressFormatField::Country, upper & ~(int)AddressFormatField::Country); + } + + const auto zipRegEx = group.readEntry("PostalCodeFormat", QString()); + if (!zipRegEx.isEmpty()) { + QVERIFY(QRegularExpression(zipRegEx).isValid()); + } + } + } +}; + +QTEST_GUILESS_MAIN(AddressFormatTest) + +#include "addressformattest.moc" diff --git a/autotests/addresstest.cpp b/autotests/addresstest.cpp new file mode 100644 index 0000000..fc6a9bc --- /dev/null +++ b/autotests/addresstest.cpp @@ -0,0 +1,507 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "addresstest.h" +#include "addresseelist.h" +#include "kcontacts/address.h" +#include "vcardtool_p.h" +#include +#include +#include +#include + +QTEST_MAIN(AddressTest) +void initLocale() +{ + qputenv("LANG", "it_CH"); + QLocale::setDefault(QLocale(QLocale::Italian, QLocale::Switzerland)); +} + +Q_CONSTRUCTOR_FUNCTION(initLocale) + +void AddressTest::initTestCase() +{ +} + +void AddressTest::emptyTest() +{ + KContacts::Address address; + + QVERIFY(address.isEmpty()); +} + +void AddressTest::storeTest() +{ + KContacts::Address address; + + address.setId(QStringLiteral("My Id")); + address.setType(KContacts::Address::Home); + address.setPostOfficeBox(QStringLiteral("1234")); + address.setExtended(QStringLiteral("My Extended Label")); + address.setStreet(QStringLiteral("My Street")); + address.setLocality(QStringLiteral("My Locality")); + address.setRegion(QStringLiteral("My Region")); + address.setPostalCode(QStringLiteral("My PostalCode")); + address.setCountry(QStringLiteral("My Country")); + address.setLabel(QStringLiteral("My Label")); + + QCOMPARE(address.id(), QStringLiteral("My Id")); + QCOMPARE(address.type(), KContacts::Address::Home); + QCOMPARE(address.postOfficeBox(), QStringLiteral("1234")); + QCOMPARE(address.extended(), QStringLiteral("My Extended Label")); + QCOMPARE(address.street(), QStringLiteral("My Street")); + QCOMPARE(address.locality(), QStringLiteral("My Locality")); + QCOMPARE(address.region(), QStringLiteral("My Region")); + QCOMPARE(address.postalCode(), QStringLiteral("My PostalCode")); + QCOMPARE(address.country(), QStringLiteral("My Country")); + QCOMPARE(address.label(), QStringLiteral("My Label")); + QVERIFY(!address.geo().isValid()); +} + +void AddressTest::equalsTest() +{ + KContacts::Address address1; + KContacts::Address address2; + + address1.setId(QStringLiteral("My Id")); + address1.setType(KContacts::Address::Home); + address1.setPostOfficeBox(QStringLiteral("1234")); + address1.setExtended(QStringLiteral("My Extended Label")); + address1.setStreet(QStringLiteral("My Street")); + address1.setLocality(QStringLiteral("My Locality")); + address1.setRegion(QStringLiteral("My Region")); + address1.setPostalCode(QStringLiteral("My Postalcode")); + address1.setCountry(QStringLiteral("My country")); + address1.setLabel(QStringLiteral("My Label")); + + address2.setId(QStringLiteral("My Id")); + address2.setType(KContacts::Address::Home); + address2.setPostOfficeBox(QStringLiteral("1234")); + address2.setExtended(QStringLiteral("My Extended Label")); + address2.setStreet(QStringLiteral("My Street")); + address2.setLocality(QStringLiteral("My Locality")); + address2.setRegion(QStringLiteral("My Region")); + address2.setPostalCode(QStringLiteral("My Postalcode")); + address2.setCountry(QStringLiteral("My country")); + address2.setLabel(QStringLiteral("My Label")); + + QVERIFY(address1 == address2); +} + +void AddressTest::differsTest() +{ + KContacts::Address address1(KContacts::Address::Home); + KContacts::Address address2(KContacts::Address::Work); + + QVERIFY(address1 != address2); +} + +void AddressTest::assignmentTest() +{ + KContacts::Address address1; + KContacts::Address address2; + + address1.setId(QStringLiteral("My Id")); + address1.setType(KContacts::Address::Home); + address1.setPostOfficeBox(QStringLiteral("1234")); + address1.setExtended(QStringLiteral("My Extended Label")); + address1.setStreet(QStringLiteral("My Street")); + address1.setLocality(QStringLiteral("My Locality")); + address1.setRegion(QStringLiteral("My Region")); + address1.setPostalCode(QStringLiteral("My Postalcode")); + address1.setCountry(QStringLiteral("My country")); + address1.setLabel(QStringLiteral("My Label")); + + address2 = address1; + + QVERIFY(address1 == address2); +} + +void AddressTest::serializeTest() +{ + KContacts::Address address1; + KContacts::Address address2; + + address1.setType(KContacts::Address::Work); + address1.setPostOfficeBox(QStringLiteral("1234")); + address1.setExtended(QStringLiteral("My Extended Label")); + address1.setStreet(QStringLiteral("My Street")); + address1.setLocality(QStringLiteral("My Locality")); + address1.setRegion(QStringLiteral("My Region")); + address1.setPostalCode(QStringLiteral("My Postalcode")); + address1.setCountry(QStringLiteral("My country")); + address1.setLabel(QStringLiteral("My Label")); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << address1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> address2; + + QVERIFY(address1 == address2); +} + +void AddressTest::formatTest() +{ + { + KContacts::Address address; + address.setStreet(QStringLiteral("Lummerlandstr. 1")); + address.setPostalCode(QStringLiteral("12345")); + address.setLocality(QStringLiteral("Lummerstadt")); + address.setCountry(QStringLiteral("Germany")); + + const QString result( + QStringLiteral("Jim Knopf\nLummerlandstr. 1\n" + "12345 Lummerstadt\n\nGERMANIA")); + + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result); +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 92) + QCOMPARE(address.formattedAddress(QStringLiteral("Jim Knopf")), result); +#endif + } + + { + KContacts::Address address; + address.setStreet(QStringLiteral("457 Foobar Ave")); + address.setPostalCode(QStringLiteral("1A2B3C")); + address.setLocality(QStringLiteral("Nervousbreaktown")); + address.setRegion(QStringLiteral("DC")); + address.setCountry(QStringLiteral("United States of America")); + + const QString result( + QStringLiteral("Huck Finn\n457 Foobar Ave\nNERVOUSBREAKTOWN," + " DC 1A2B3C\n\nSTATI UNITI")); + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Huck Finn")), result); + } + + { + KContacts::Address address; + address.setStreet(QStringLiteral("Lummerlandstr. 1")); + address.setPostalCode(QStringLiteral("12345")); + address.setLocality(QStringLiteral("Lummerstadt")); + address.setCountry(QStringLiteral("Deutschland")); + + const QString result( + QStringLiteral("Jim Knopf\nLummerlandstr. 1\n" + "12345 Lummerstadt\n\nGERMANIA")); + + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result); + } + + { + KContacts::Address address; + address.setStreet(QStringLiteral("Lummerlandstr. 1")); + address.setPostalCode(QStringLiteral("12345")); + address.setLocality(QStringLiteral("Lummerstadt")); + address.setCountry(QString()); + + const QString result(QStringLiteral("Jim Knopf\nLummerlandstr. 1\n12345 Lummerstadt")); + + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result); + } + + { + KContacts::Address address; + address.setStreet(QStringLiteral("Haus Randa")); + address.setPostalCode(QStringLiteral("1234")); + address.setLocality(QStringLiteral("Randa")); + address.setPostOfficeBox(QStringLiteral("5678")); + address.setCountry(QStringLiteral("Schweiz")); + + // we want the Italian variant of the Swiss format for it_CH + const QString result(QStringLiteral("Dr. Konqui\nCasella postale 5678\nHaus Randa\n1234 Randa\n\nSVIZZERA")); + + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqui")), result); + } + + { + KContacts::Address address; + address.setStreet(QStringLiteral("Haus Randa")); + address.setPostalCode(QStringLiteral("1234")); + address.setLocality(QStringLiteral("Randa")); + address.setPostOfficeBox(QStringLiteral("5678")); + address.setCountry(QStringLiteral("CH")); + + // we want the Italian variant of the Swiss format for it_CH + const QString result(QStringLiteral("Dr. Konqui\nCasella postale 5678\nHaus Randa\n1234 Randa\n\nSVIZZERA")); + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqui")), result); + } + + { + KContacts::Address address; + address.setCountry(QStringLiteral("CH")); + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QString()), QLatin1String("SVIZZERA")); + } + + { + // business format for postal style + KContacts::Address address; + address.setCountry(QStringLiteral("AT")); + address.setLocality(QStringLiteral("Berlin")); + address.setPostalCode(QStringLiteral("10969")); + address.setStreet(QStringLiteral("Prinzenstraße 85 F")); + const auto result = QString::fromUtf8("KDE e.V.\nz.Hd. Dr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\n\nAUSTRIA"); + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V.")), result); + } + + { + // local vs latin script formats + KContacts::Address address; + address.setCountry(QStringLiteral("JP")); + address.setRegion(QStringLiteral("Tokyo")); + address.setLocality(QStringLiteral("Minato-ku")); + address.setPostalCode(QStringLiteral("106-0047")); + address.setStreet(QStringLiteral("4-6-28 Minami-Azabu")); + auto result = QString::fromUtf8("4-6-28 Minami-Azabu, Minato-ku\nTOKYO 106-0047\n\nGIAPPONE"); + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal), result); + + address.setRegion(QStringLiteral("東京")); + address.setLocality(QStringLiteral("都港区")); + address.setPostalCode(QStringLiteral("106-0047")); + address.setStreet(QStringLiteral("南麻布 4-6-28")); + result = QString::fromUtf8("〒106-0047\n東京都港区南麻布 4-6-28\n\nGIAPPONE"); + QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal), result); + } +} + +void AddressTest::shouldExportVcard3() +{ + KContacts::Address address; + + address.setId(QStringLiteral("My Id")); + address.setType(KContacts::Address::Home); + address.setPostOfficeBox(QStringLiteral("1234")); + address.setExtended(QStringLiteral("My Extended Label")); + address.setStreet(QStringLiteral("My Street")); + address.setLocality(QStringLiteral("My Locality")); + address.setRegion(QStringLiteral("My Region")); + address.setPostalCode(QStringLiteral("My Postalcode")); + address.setCountry(QStringLiteral("My country")); + address.setLabel(QStringLiteral("My Label")); + + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + addr.insertAddress(address); + lst << addr; + + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "ADR;TYPE=home:1234;My Extended Label;My Street;My Locality;My Region;My Pos\r\n" + " talcode;My country\r\n" + "EMAIL:foo@kde.org\r\n" + "LABEL;TYPE=home:My Label\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void AddressTest::shouldParseAddressVCard3() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "ADR;TYPE=home:1234;My Extended Label;My Street;My Locality;My Region;My Pos\r\n" + " talcode;My country\r\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "LABEL;TYPE=home:My Label\r\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).addresses().count(), 1); + KContacts::Address address = lst.at(0).addresses().at(0); + QCOMPARE(address.type(), KContacts::Address::Home); + QCOMPARE(address.postOfficeBox(), QStringLiteral("1234")); + QCOMPARE(address.extended(), QStringLiteral("My Extended Label")); + QCOMPARE(address.region(), QStringLiteral("My Region")); + QCOMPARE(address.street(), QStringLiteral("My Street")); + QCOMPARE(address.country(), QStringLiteral("My country")); + QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode")); + QCOMPARE(address.label(), QStringLiteral("My Label")); +} + +void AddressTest::shouldParseAddressVCard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "ADR;LABEL=\"My Label\";TYPE=home:1234;My Extended Label;My Street;My Locality\r\n" + " ;My Region;My Postalcode;My country\r\nEMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).addresses().count(), 1); + KContacts::Address address = lst.at(0).addresses().at(0); + QCOMPARE(address.type(), KContacts::Address::Home); + QCOMPARE(address.postOfficeBox(), QStringLiteral("1234")); + QCOMPARE(address.extended(), QStringLiteral("My Extended Label")); + QCOMPARE(address.region(), QStringLiteral("My Region")); + QCOMPARE(address.street(), QStringLiteral("My Street")); + QCOMPARE(address.country(), QStringLiteral("My country")); + QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode")); + QCOMPARE(address.label(), QStringLiteral("My Label")); +} + +void AddressTest::shouldParseAddressVCard4WithGeoPosition() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "ADR;GEO=\"geo:22.500000,45.099998\";LABEL=\"My Label\";TYPE=home:1234;My Extend\r\n" + " ed Label;My Street;My Locality;My Region;My Postalcode;My country\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).addresses().count(), 1); + KContacts::Address address = lst.at(0).addresses().at(0); + QCOMPARE(address.type(), KContacts::Address::Home); + QCOMPARE(address.postOfficeBox(), QStringLiteral("1234")); + QCOMPARE(address.extended(), QStringLiteral("My Extended Label")); + QCOMPARE(address.region(), QStringLiteral("My Region")); + QCOMPARE(address.street(), QStringLiteral("My Street")); + QCOMPARE(address.country(), QStringLiteral("My country")); + QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode")); + QCOMPARE(address.label(), QStringLiteral("My Label")); + KContacts::Geo geo = address.geo(); + QVERIFY(geo.isValid()); + QCOMPARE(geo.latitude(), 22.5f); + QCOMPARE(geo.longitude(), 45.1f); +} + +void AddressTest::shouldExportVCard4WithGeoPosition() +{ + KContacts::Address address; + + address.setId(QStringLiteral("My Id")); + address.setType(KContacts::Address::Home); + address.setPostOfficeBox(QStringLiteral("1234")); + address.setExtended(QStringLiteral("My Extended Label")); + address.setStreet(QStringLiteral("My Street")); + address.setLocality(QStringLiteral("My Locality")); + address.setRegion(QStringLiteral("My Region")); + address.setPostalCode(QStringLiteral("My Postalcode")); + address.setCountry(QStringLiteral("My country")); + address.setLabel(QStringLiteral("My Label")); + + KContacts::Geo geo; + + geo.setLatitude(22.5f); + geo.setLongitude(45.1f); + address.setGeo(geo); + + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + addr.insertAddress(address); + lst << addr; + + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "ADR;GEO=\"geo:22.500000,45.099998\";LABEL=\"My Label\";TYPE=home:1234;My Extend\r\n" + " ed Label;My Street;My Locality;My Region;My Postalcode;My country\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void AddressTest::shouldExportVcard4() +{ + KContacts::Address address; + + address.setId(QStringLiteral("My Id")); + address.setType(KContacts::Address::Home); + address.setPostOfficeBox(QStringLiteral("1234")); + address.setExtended(QStringLiteral("My Extended Label")); + address.setStreet(QStringLiteral("My Street")); + address.setLocality(QStringLiteral("My Locality")); + address.setRegion(QStringLiteral("My Region")); + address.setPostalCode(QStringLiteral("My Postalcode")); + address.setCountry(QStringLiteral("My country")); + address.setLabel(QStringLiteral("My Label")); + + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + addr.insertAddress(address); + lst << addr; + + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "ADR;LABEL=\"My Label\";TYPE=home:1234;My Extended Label;My Street;My Locality\r\n" + " ;My Region;My Postalcode;My country\r\nEMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void AddressTest::countryToISOTest() +{ + using namespace KContacts; +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 89) + QCOMPARE(Address::countryToISO(QStringLiteral("France")), QLatin1String("fr")); + QCOMPARE(Address::countryToISO(QStringLiteral("Frankreich")), QLatin1String("fr")); + QCOMPARE(Address::countryToISO(QStringLiteral("Germany")), QLatin1String("de")); + QCOMPARE(Address::countryToISO(QStringLiteral("Österreich")), QLatin1String("at")); + QCOMPARE(Address::countryToISO(QStringLiteral("Disneyland")), QString()); + QCOMPARE(Address::countryToISO(QStringLiteral("Østrig")), QLatin1String("at")); + QCOMPARE(Address::countryToISO(QStringLiteral("Den Demokratiske Republik Congo")), QLatin1String("cd")); + QCOMPARE(Address::countryToISO(QStringLiteral("South Sudan")), QLatin1String("ss")); + QCOMPARE(Address::countryToISO(QStringLiteral("United States")), QLatin1String("us")); + QCOMPARE(Address::countryToISO(QStringLiteral("United States Of America")), QLatin1String("us")); + QCOMPARE(Address::countryToISO(QStringLiteral("United")), QString()); + QCOMPARE(Address::countryToISO(QStringLiteral("대한민국")), QLatin1String("kr")); + + QCOMPARE(Address::countryToISO(QStringLiteral("Osterreich")), QLatin1String("at")); + QCOMPARE(Address::countryToISO(QStringLiteral("Ünited States\nOf America")), QLatin1String("us")); +#endif +} + +void AddressTest::isoToCountryTest() +{ + qunsetenv("LC_ALL"); + qputenv("LANGUAGE", "en"); + + using namespace KContacts; +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 89) + QCOMPARE(Address::ISOtoCountry(QStringLiteral("FR")), QLatin1String("France")); + QCOMPARE(Address::ISOtoCountry(QStringLiteral("de")), QLatin1String("Germany")); + + // invalid + QCOMPARE(Address::ISOtoCountry(QStringLiteral("EU")), QLatin1String("EU")); + QCOMPARE(Address::ISOtoCountry(QStringLiteral("zz")), QLatin1String("zz")); + QCOMPARE(Address::ISOtoCountry(QStringLiteral("0")), QLatin1String("0")); +#endif +} diff --git a/autotests/addresstest.h b/autotests/addresstest.h new file mode 100644 index 0000000..e55a12d --- /dev/null +++ b/autotests/addresstest.h @@ -0,0 +1,36 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ADDRESS_TEST_H +#define ADDRESS_TEST_H + +#include + +class AddressTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void initTestCase(); + void emptyTest(); + void storeTest(); + void equalsTest(); + void differsTest(); + void assignmentTest(); + void serializeTest(); + void formatTest(); + void shouldExportVcard4(); + void shouldExportVcard3(); + void shouldParseAddressVCard3(); + void shouldParseAddressVCard4(); + void shouldExportVCard4WithGeoPosition(); + void shouldParseAddressVCard4WithGeoPosition(); + void countryToISOTest(); + void isoToCountryTest(); +}; + +#endif diff --git a/autotests/birthdaytest.cpp b/autotests/birthdaytest.cpp new file mode 100644 index 0000000..40065e4 --- /dev/null +++ b/autotests/birthdaytest.cpp @@ -0,0 +1,228 @@ +/* + This file is part of kcontacts. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "birthdaytest.h" +#include "addressee.h" +#include "vcard_p.h" +#include +#include + +BirthDayTest::BirthDayTest(QObject *parent) + : QObject(parent) +{ +} + +BirthDayTest::~BirthDayTest() +{ +} + +void BirthDayTest::shouldParseBirthDay() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "BDAY:19760505T120505\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QDateTime dt(QDate(1976, 5, 5), QTime(12, 5, 5)); + QCOMPARE(lst.at(0).birthday(), dt); + QCOMPARE(lst.at(0).birthdayHasTime(), true); +} + +void BirthDayTest::shouldParseBirthDayWithoutTime() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "BDAY:19760505\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QDateTime dt(QDate(1976, 5, 5).startOfDay()); + + QCOMPARE(lst.at(0).birthday(), dt); + QCOMPARE(lst.at(0).birthdayHasTime(), false); +} + +void BirthDayTest::shouldParseBirthDayWithoutTimeAndYear() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "BDAY:--0505\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QDateTime dt(QDate(-1, 5, 5).startOfDay()); + QCOMPARE(lst.at(0).birthday(), dt); + QCOMPARE(lst.at(0).birthdayHasTime(), false); +} + +void BirthDayTest::shouldExportVcard4() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QDateTime dt(QDate(1976, 5, 5), QTime(12, 5, 5)); + addr.setBirthday(dt); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "BDAY:19760505T120505\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void BirthDayTest::shouldExportVcard4WithoutTime() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QDate d(1976, 5, 5); + addr.setBirthday(d); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "BDAY:19760505\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void BirthDayTest::shouldExportVcard4WithoutTimeAndWithoutYear() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QDate d(-1, 5, 5); + addr.setBirthday(d); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "BDAY:--0505\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void BirthDayTest::shouldExportVcard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QDateTime dt(QDate(1976, 5, 5), QTime(12, 5, 5)); + addr.setBirthday(dt); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "BDAY:1976-05-05T12:05:05\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void BirthDayTest::shouldExportVcard3WithoutTimeAndWithoutYear() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QDate d(-1, 5, 5); + addr.setBirthday(d); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "BDAY:--05-05\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void BirthDayTest::shouldExportVcard3WithoutTime() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QDate d(1976, 5, 5); + addr.setBirthday(d); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "BDAY:1976-05-05\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +QTEST_MAIN(BirthDayTest) diff --git a/autotests/birthdaytest.h b/autotests/birthdaytest.h new file mode 100644 index 0000000..438543d --- /dev/null +++ b/autotests/birthdaytest.h @@ -0,0 +1,32 @@ +/* + This file is part of kcontacts. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef BIRTHDAYTEST_H +#define BIRTHDAYTEST_H + +#include + +class BirthDayTest : public QObject +{ + Q_OBJECT +public: + explicit BirthDayTest(QObject *parent = nullptr); + ~BirthDayTest() override; + +private Q_SLOTS: + void shouldExportVcard4(); + void shouldExportVcard4WithoutTime(); + void shouldExportVcard3(); + void shouldExportVcard3WithoutTime(); + void shouldParseBirthDay(); + void shouldParseBirthDayWithoutTime(); + void shouldParseBirthDayWithoutTimeAndYear(); + void shouldExportVcard4WithoutTimeAndWithoutYear(); + void shouldExportVcard3WithoutTimeAndWithoutYear(); +}; + +#endif // BIRTHDAYTEST_H diff --git a/autotests/calendarurltest.cpp b/autotests/calendarurltest.cpp new file mode 100644 index 0000000..78281bf --- /dev/null +++ b/autotests/calendarurltest.cpp @@ -0,0 +1,302 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "calendarurltest.h" +#include "parametermap_p.h" + +#include "calendarurl.h" +#include "vcardtool_p.h" +#include + +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(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(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(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("type"); + QTest::addColumn("value"); + for (int i = CalendarUrl::Unknown + 1; i < CalendarUrl::EndCalendarType; ++i) { + KContacts::CalendarUrl::CalendarType type = static_cast(i); + QByteArray baType; + switch (type) { + case CalendarUrl::Unknown: + case CalendarUrl::EndCalendarType: + break; + case CalendarUrl::FBUrl: + baType = QByteArray("FBURL"); + break; + case CalendarUrl::CALUri: + baType = QByteArray("CALURI"); + break; + case CalendarUrl::CALADRUri: + baType = QByteArray("CALADRURI"); + break; + } + QTest::newRow(baType.constData()) << type << baType; + } +} + +void CalendarUrlTest::shouldGenerateVCard() +{ + QFETCH(KContacts::CalendarUrl::CalendarType, type); + QFETCH(QByteArray, value); + + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + CalendarUrl url; + url.setType(type); + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + addr.insertCalendarUrl(url); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected; + // Different order + if (type == KContacts::CalendarUrl::FBUrl) { + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n"); + expected += value + + QByteArray( + ":https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + } else { + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n"); + expected += value + + QByteArray( + ":https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + } + + QCOMPARE(ba, expected); +} + +void CalendarUrlTest::shouldGenerateVCardWithParameter() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + CalendarUrl url; + url.setType(CalendarUrl::CALUri); + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + url.setParams(params); + addr.insertCalendarUrl(url); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "CALURI;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void CalendarUrlTest::shouldNotGeneratedAttributeForVcard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + CalendarUrl url; + url.setType(CalendarUrl::CALUri); + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + url.setParams(params); + addr.insertCalendarUrl(url); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void CalendarUrlTest::shouldGenerateMultiCalendarUrl() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + CalendarUrl url; + url.setType(CalendarUrl::CALUri); + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + url.setParams(params); + addr.insertCalendarUrl(url); + + url.setType(CalendarUrl::FBUrl); + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes2"))); + params.clear(); + + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + url.setParams(params); + addr.insertCalendarUrl(url); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "CALURI;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "EMAIL:foo@kde.org\r\n" + "FBURL;FOO1=bla1,blo1:https://sherlockholmes.com/calendar/sherlockholmes2\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(CalendarUrlTest) diff --git a/autotests/calendarurltest.h b/autotests/calendarurltest.h new file mode 100644 index 0000000..2edb94d --- /dev/null +++ b/autotests/calendarurltest.h @@ -0,0 +1,34 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CALENDARURLTEST_H +#define CALENDARURLTEST_H + +#include + +class CalendarUrlTest : public QObject +{ + Q_OBJECT +public: + explicit CalendarUrlTest(QObject *parent = nullptr); + ~CalendarUrlTest() override; + +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualCalendarUrl(); + void shouldParseCalendarUrl(); + void shouldGenerateVCard_data(); + void shouldGenerateVCard(); + void shouldGenerateVCardWithParameter(); + void shouldNotGeneratedAttributeForVcard3(); + void shouldGenerateMultiCalendarUrl(); +}; + +#endif // CALENDARURLTEST_H diff --git a/autotests/clientpidmaptest.cpp b/autotests/clientpidmaptest.cpp new file mode 100644 index 0000000..191fa03 --- /dev/null +++ b/autotests/clientpidmaptest.cpp @@ -0,0 +1,234 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "clientpidmaptest.h" +#include "clientpidmap.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +ClientPidMapTest::ClientPidMapTest(QObject *parent) + : QObject(parent) +{ +} + +ClientPidMapTest::~ClientPidMapTest() +{ +} + +void ClientPidMapTest::shouldHaveDefaultValue() +{ + KContacts::ClientPidMap role; + QVERIFY(!role.isValid()); + QVERIFY(role.clientPidMap().isEmpty()); + QVERIFY(role.params().empty()); +} + +void ClientPidMapTest::shouldAssignValue() +{ + const QString lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::ClientPidMap role(lang); + role.setParams(params); + QVERIFY(role.isValid()); + QVERIFY(!role.clientPidMap().isEmpty()); + QCOMPARE(role.clientPidMap(), lang); + QVERIFY(!role.params().empty()); + QCOMPARE(role.params(), params); +} + +void ClientPidMapTest::shouldAssignExternal() +{ + KContacts::ClientPidMap role; + const QString lang(QStringLiteral("fr")); + role.setClientPidMap(lang); + QVERIFY(role.isValid()); + QCOMPARE(role.clientPidMap(), lang); +} + +void ClientPidMapTest::shouldSerialized() +{ + KContacts::ClientPidMap role; + KContacts::ClientPidMap result; + const QString lang(QStringLiteral("fr")); + role.setClientPidMap(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + role.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << role; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(role == result); +} + +void ClientPidMapTest::shouldEqualClientPidMap() +{ + KContacts::ClientPidMap role; + KContacts::ClientPidMap result; + const QString lang(QStringLiteral("fr")); + role.setClientPidMap(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + role.setParams(params); + + result = role; + QVERIFY(role == result); +} + +void ClientPidMapTest::shouldParseClientPidMap() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "CLIENTPIDMAP:boo\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).clientPidMapList().count(), 1); + QCOMPARE(lst.at(0).clientPidMapList().at(0).clientPidMap(), QStringLiteral("boo")); +} + +void ClientPidMapTest::shouldParseWithoutClientPidMap() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).clientPidMapList().count(), 0); +} + +void ClientPidMapTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ClientPidMap::List lstClientPidMap; + KContacts::ClientPidMap clientpidmap(QStringLiteral("fr")); + lstClientPidMap << clientpidmap; + addr.setClientPidMapList(lstClientPidMap); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "CLIENTPIDMAP:fr\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void ClientPidMapTest::shouldCreateVCardWithTwoClientPidMap() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ClientPidMap::List lstClientPidMap; + KContacts::ClientPidMap clientpidmap(QStringLiteral("fr")); + KContacts::ClientPidMap clientpidmap2(QStringLiteral("fr2")); + lstClientPidMap << clientpidmap << clientpidmap2; + addr.setClientPidMapList(lstClientPidMap); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "CLIENTPIDMAP:fr\r\n" + "CLIENTPIDMAP:fr2\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void ClientPidMapTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ClientPidMap::List lstClientPidMap; + KContacts::ClientPidMap clientpidmap(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + clientpidmap.setParams(params); + lstClientPidMap << clientpidmap; + addr.setClientPidMapList(lstClientPidMap); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "CLIENTPIDMAP;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void ClientPidMapTest::shouldGenerateClientPidMapForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ClientPidMap::List lstClientPidMap; + KContacts::ClientPidMap clientpidmap(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + clientpidmap.setParams(params); + lstClientPidMap << clientpidmap; + addr.setClientPidMapList(lstClientPidMap); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(ClientPidMapTest) diff --git a/autotests/clientpidmaptest.h b/autotests/clientpidmaptest.h new file mode 100644 index 0000000..1170218 --- /dev/null +++ b/autotests/clientpidmaptest.h @@ -0,0 +1,33 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CLIENTPIDMAPTEST_H +#define CLIENTPIDMAPTEST_H + +#include + +class ClientPidMapTest : public QObject +{ + Q_OBJECT +public: + explicit ClientPidMapTest(QObject *parent = nullptr); + ~ClientPidMapTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualClientPidMap(); + void shouldParseClientPidMap(); + void shouldParseWithoutClientPidMap(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoClientPidMap(); + void shouldCreateVCardWithParameters(); + void shouldGenerateClientPidMapForVCard3(); +}; + +#endif // CLIENTPIDMAPTEST_H diff --git a/autotests/contactgrouptest.cpp b/autotests/contactgrouptest.cpp new file mode 100644 index 0000000..ea77bef --- /dev/null +++ b/autotests/contactgrouptest.cpp @@ -0,0 +1,366 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2008 Kevin Krammer + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include + +#include "kcontacts/contactgroup.h" +#include "kcontacts/contactgrouptool.h" + +#include + +using namespace KContacts; + +class ContactGroupTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void contactGroupContactReference(); + void contactGroupContactGroupReference(); + void contactGroupData(); + void contactGroup(); + void testGroupRoundTrip(); + void testGroupListRoundTrip(); +}; + +QTEST_MAIN(ContactGroupTest) + +void ContactGroupTest::contactGroupContactReference() +{ + const QLatin1String uid("MyReferenceId"); + const QLatin1String gid("GID"); + const QLatin1String preferredEMail("tokoe@kde.org"); + const QLatin1String customKey("MyCustomKey"); + const QLatin1String customValue("MyCustomValue"); + + // uid test + { + ContactGroup::ContactReference ref(uid); + QCOMPARE(ref.uid(), uid); + } + + // uid test + { + ContactGroup::ContactReference ref; + ref.setUid(uid); + QCOMPARE(ref.uid(), uid); + } + + // preferredEmail test + { + ContactGroup::ContactReference ref(uid); + ref.setPreferredEmail(preferredEMail); + QCOMPARE(ref.preferredEmail(), preferredEMail); + } + + // custom test + { + ContactGroup::ContactReference ref(uid); + ref.insertCustom(customKey, customValue); + QCOMPARE(ref.custom(customKey), customValue); + ref.removeCustom(customKey); + QCOMPARE(ref.custom(customKey), QString()); + } + + // assignment test + { + ContactGroup::ContactReference ref(uid); + ref.setGid(gid); + ref.setPreferredEmail(preferredEMail); + ref.insertCustom(customKey, customValue); + + ContactGroup::ContactReference ref2(ref); + QCOMPARE(ref.uid(), ref2.uid()); + QCOMPARE(ref.gid(), ref2.gid()); + QCOMPARE(ref.preferredEmail(), ref2.preferredEmail()); + QCOMPARE(ref.custom(customKey), ref2.custom(customKey)); + + QVERIFY(ref == ref2); + } + + // const test + { + ContactGroup::ContactReference ref(uid); + ref.setPreferredEmail(preferredEMail); + ref.insertCustom(customKey, customValue); + + const ContactGroup::ContactReference constRef(ref); + QCOMPARE(constRef.uid(), uid); + QCOMPARE(constRef.preferredEmail(), preferredEMail); + QCOMPARE(constRef.custom(customKey), customValue); + QVERIFY(constRef.gid().isEmpty()); + } +} + +void ContactGroupTest::contactGroupContactGroupReference() +{ + const QLatin1String uid("MyReferenceId"); + const QLatin1String customKey("MyCustomKey"); + const QLatin1String customValue("MyCustomValue"); + + // uid test + { + ContactGroup::ContactGroupReference ref(uid); + QCOMPARE(ref.uid(), uid); + } + + // uid test + { + ContactGroup::ContactGroupReference ref; + ref.setUid(uid); + QCOMPARE(ref.uid(), uid); + } + + // custom test + { + ContactGroup::ContactGroupReference ref(uid); + ref.insertCustom(customKey, customValue); + QCOMPARE(ref.custom(customKey), customValue); + ref.removeCustom(customKey); + QCOMPARE(ref.custom(customKey), QString()); + } + + // assignment test + { + ContactGroup::ContactGroupReference ref(uid); + ref.insertCustom(customKey, customValue); + + ContactGroup::ContactGroupReference ref2(ref); + QCOMPARE(ref.uid(), ref2.uid()); + QCOMPARE(ref.custom(customKey), ref2.custom(customKey)); + + QVERIFY(ref == ref2); + } + + // const test + { + ContactGroup::ContactGroupReference ref(uid); + ref.insertCustom(customKey, customValue); + + const ContactGroup::ContactGroupReference constRef(ref); + constRef.uid(); + constRef.custom(customKey); + } +} + +void ContactGroupTest::contactGroupData() +{ + const QLatin1String name("Tobias Koenig"); + const QLatin1String email("tokoe@kde.org"); + const QLatin1String customKey("MyCustomKey"); + const QLatin1String customValue("MyCustomValue"); + + // name/email test + { + ContactGroup::Data data(name, email); + QCOMPARE(data.name(), name); + QCOMPARE(data.email(), email); + } + + // name test + { + ContactGroup::Data data; + data.setName(name); + QCOMPARE(data.name(), name); + } + + // email test + { + ContactGroup::Data data; + data.setEmail(email); + QCOMPARE(data.email(), email); + } + + // custom test + { + ContactGroup::Data data(name, email); + data.insertCustom(customKey, customValue); + QCOMPARE(data.custom(customKey), customValue); + data.removeCustom(customKey); + QCOMPARE(data.custom(customKey), QString()); + } + + // assignment test + { + ContactGroup::Data data(name, email); + data.insertCustom(customKey, customValue); + + ContactGroup::Data data2(data); + QCOMPARE(data.name(), data2.name()); + QCOMPARE(data.email(), data2.email()); + QCOMPARE(data.custom(customKey), data2.custom(customKey)); + + QVERIFY(data == data2); + } + + // const test + { + ContactGroup::Data data(name, email); + data.insertCustom(customKey, customValue); + + const ContactGroup::Data constData(data); + QCOMPARE(constData.name(), name); + QCOMPARE(constData.email(), email); + QCOMPARE(constData.custom(customKey), customValue); + } +} + +void ContactGroupTest::contactGroup() +{ + const QLatin1String groupName("MyGroupName"); + const QLatin1String groupId("MyGroupID"); + const QLatin1String name("Tobias Koenig"); + const QLatin1String email("tokoe@kde.org"); + const QLatin1String uid("MyUid"); + + // name test + { + ContactGroup group(groupName); + QCOMPARE(group.name(), groupName); + } + + // id test + { + ContactGroup group(groupName); + group.setId(groupId); + QCOMPARE(group.id(), groupId); + } + + // contact reference test + { + ContactGroup group(groupName); + QCOMPARE(group.contactReferenceCount(), (unsigned int)0); + + ContactGroup::ContactReference ref(uid); + ref.setPreferredEmail(email); + + group.append(ref); + QCOMPARE(group.contactReferenceCount(), (unsigned int)1); + + const ContactGroup::ContactReference ref2 = group.contactReference(0); + QCOMPARE(ref, ref2); + + group.remove(ref); + QCOMPARE(group.contactReferenceCount(), (unsigned int)0); + } + + // contact group reference test + { + ContactGroup group(groupName); + QCOMPARE(group.contactGroupReferenceCount(), (unsigned int)0); + + ContactGroup::ContactGroupReference ref(uid); + + group.append(ref); + QCOMPARE(group.contactGroupReferenceCount(), (unsigned int)1); + + const ContactGroup::ContactGroupReference ref2 = group.contactGroupReference(0); + QCOMPARE(ref, ref2); + + group.remove(ref); + QCOMPARE(group.contactGroupReferenceCount(), (unsigned int)0); + } + + // data test + { + ContactGroup group(groupName); + QCOMPARE(group.dataCount(), (unsigned int)0); + + ContactGroup::Data data(name, email); + + group.append(data); + QCOMPARE(group.dataCount(), (unsigned int)1); + + const ContactGroup::Data data2 = group.data(0); + QCOMPARE(data, data2); + + group.remove(data); + QCOMPARE(group.dataCount(), (unsigned int)0); + } + + // mimetype test + { + ContactGroup group(groupName); + QCOMPARE(group.mimeType(), QLatin1String("application/x-vnd.kde.contactgroup")); + } +} + +void ContactGroupTest::testGroupRoundTrip() +{ + // TODO should also test empty group + + ContactGroup group(QLatin1String("TestGroup")); + group.append(ContactGroup::ContactReference(QLatin1String("Xggdjetw"))); + ContactGroup::ContactReference gidReference; + gidReference.setGid(QLatin1String("gid")); + group.append(gidReference); + group.append(ContactGroup::ContactGroupReference(QLatin1String("aaXggdjetw"))); + group.append(ContactGroup::Data(QLatin1String("Tobias Koenig"), QLatin1String("tokoe@kde.org"))); + group.append(ContactGroup::Data(QLatin1String("Kevin Krammer"), QLatin1String("kevin.krammer@gmx.at"))); + + QBuffer buffer; + buffer.open(QIODevice::WriteOnly); + + QString errorMessage; + bool result = ContactGroupTool::convertToXml(group, &buffer, &errorMessage); + + QVERIFY(result); + QVERIFY(errorMessage.isEmpty()); + buffer.close(); + QVERIFY(buffer.size() > 0); + buffer.open(QIODevice::ReadOnly); + + ContactGroup group2; + result = ContactGroupTool::convertFromXml(&buffer, group2, &errorMessage); + QVERIFY(result); + QVERIFY(errorMessage.isEmpty()); + QCOMPARE(group, group2); +} + +void ContactGroupTest::testGroupListRoundTrip() +{ + // TODO should also test empty list + + ContactGroup::List list; + + ContactGroup group1(QLatin1String("TestGroup1")); + group1.append(ContactGroup::ContactReference(QLatin1String("Xggdjetw"))); + group1.append(ContactGroup::Data(QLatin1String("Tobias Koenig"), QLatin1String("tokoe@kde.org"))); + group1.append(ContactGroup::Data(QLatin1String("Kevin Krammer"), QLatin1String("kevin.krammer@gmx.at"))); + + list.append(group1); + + ContactGroup group2(QLatin1String("TestGroup2")); + group2.append(ContactGroup::ContactReference(QLatin1String("Xggdjetw"))); + group2.append(ContactGroup::Data(QLatin1String("Tobias Koenig"), QLatin1String("tokoe@kde.org"))); + group2.append(ContactGroup::Data(QLatin1String("Kevin Krammer"), QLatin1String("kevin.krammer@gmx.at"))); + + list.append(group2); + + QBuffer buffer; + buffer.open(QIODevice::WriteOnly); + + QString errorMessage; + bool result = ContactGroupTool::convertToXml(list, &buffer, &errorMessage); + + QVERIFY(result); + QVERIFY(errorMessage.isEmpty()); + buffer.close(); + QVERIFY(buffer.size() > 0); + + buffer.open(QIODevice::ReadOnly); + + ContactGroup::List list2; + result = ContactGroupTool::convertFromXml(&buffer, list2, &errorMessage); + QVERIFY(result); + QVERIFY(errorMessage.isEmpty()); + QVERIFY(list2.size() == 2); + QCOMPARE(list2[0], group1); + QCOMPARE(list2[1], group2); +} + +#include "contactgrouptest.moc" diff --git a/autotests/customidentifiertest.cpp b/autotests/customidentifiertest.cpp new file mode 100644 index 0000000..f4b4412 --- /dev/null +++ b/autotests/customidentifiertest.cpp @@ -0,0 +1,112 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "customidentifiertest.h" +#include "addressee.h" +#include "vcardtool_p.h" +#include + +CustomIdentifierTest::CustomIdentifierTest(QObject *parent) + : QObject(parent) +{ +} + +CustomIdentifierTest::~CustomIdentifierTest() +{ +} + +void CustomIdentifierTest::shouldHaveEmptyCustoms() +{ + KContacts::Addressee addresseeWithMail; + addresseeWithMail.addEmail(QStringLiteral("foo@bar.org")); + QVERIFY(!addresseeWithMail.isEmpty()); + QVERIFY(addresseeWithMail.customs().isEmpty()); +} + +void CustomIdentifierTest::shouldExportVcard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-SpousesName"), QStringLiteral("foo")); + lst << addr; + KContacts::VCardTool vcard; + QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "X-KADDRESSBOOK-X-SpousesName:foo\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); + + addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-ANNIVERSARY"), QStringLiteral("19960415")); + lst.clear(); + lst << addr; + ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "X-KADDRESSBOOK-X-ANNIVERSARY:19960415\r\n" + "X-KADDRESSBOOK-X-SpousesName:foo\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void CustomIdentifierTest::shouldExportVcard4() +{ + // TODO don't work to export custom! + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-SpousesName"), QStringLiteral("foo")); + lst << addr; + KContacts::VCardTool vcard; + QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "RELATED;TYPE=spouse;VALUE=foo:;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); + + QDate dt(12, 9, 3); + addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-ANNIVERSARY"), dt.toString(Qt::ISODate)); + lst.clear(); + lst << addr; + ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "ANNIVERSARY:00120903\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "RELATED;TYPE=spouse;VALUE=foo:;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +QTEST_MAIN(CustomIdentifierTest) diff --git a/autotests/customidentifiertest.h b/autotests/customidentifiertest.h new file mode 100644 index 0000000..3822d79 --- /dev/null +++ b/autotests/customidentifiertest.h @@ -0,0 +1,26 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CUSTOMIDENTIFIERTEST_H +#define CUSTOMIDENTIFIERTEST_H + +#include + +class CustomIdentifierTest : public QObject +{ + Q_OBJECT +public: + explicit CustomIdentifierTest(QObject *parent = nullptr); + ~CustomIdentifierTest() override; + +private Q_SLOTS: + void shouldExportVcard4(); + void shouldHaveEmptyCustoms(); + void shouldExportVcard3(); +}; + +#endif // CUSTOMIDENTIFIERTEST_H diff --git a/autotests/data/testfullvcard.vcf b/autotests/data/testfullvcard.vcf new file mode 100644 index 0000000..466d7e6 --- /dev/null +++ b/autotests/data/testfullvcard.vcf @@ -0,0 +1,33 @@ +BEGIN:VCARD +VERSION:4.0 +FN:Sherlock Holmes +TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+44-555-555-5555;ext=5555 +TEL;VALUE=uri;TYPE="voice,cell,text":tel:+44-555-555-6666 +TEL;VALUE=uri;TYPE="voice,work":tel:+44-555-555-7777 +N:Holmes;Sherlock;;Mr;; +KIND:individual +NICKNAME:Shirley +PHOTO: +BDAY:19531015T231000Z +ANNIVERSARY:19960415 +GENDER:M +ADR;GEO="geo:51.5237,0.1585";LABEL="Mr Sherlock Holmes, 221B Baker Street, London NW1, England, United Kingdom":;;221B Baker Street;London;;NW1;United Kingdom +EMAIL;TYPE=home:sherlock.holmes@gmail.com +EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com +IMPP;PREF=1:xmpp:detective@sherlockholmes.com +LANG;TYPE=work;PREF=1:en +LANG;TYPE=work;PREF=2:fr +TZ:London/Europe +GEO:geo:51.5237,0.1585 +TITLE:Detective +ROLE:Detective +UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519 +CATEGORIES:FICTION,LITERATURE +PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN +REV:2014722T222710Z +URL:https://sherlockholmes.com +KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holmes.pub.asc +CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes +FBURL;PREF=1:https://sherlockholmes.com/busy/detective +CALADRURI;PREF=1:mailto:detective@sherlockholmes.com +END:VCARD diff --git a/autotests/data/testfullvcard.vcf.ref b/autotests/data/testfullvcard.vcf.ref new file mode 100644 index 0000000..466d7e6 --- /dev/null +++ b/autotests/data/testfullvcard.vcf.ref @@ -0,0 +1,33 @@ +BEGIN:VCARD +VERSION:4.0 +FN:Sherlock Holmes +TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+44-555-555-5555;ext=5555 +TEL;VALUE=uri;TYPE="voice,cell,text":tel:+44-555-555-6666 +TEL;VALUE=uri;TYPE="voice,work":tel:+44-555-555-7777 +N:Holmes;Sherlock;;Mr;; +KIND:individual +NICKNAME:Shirley +PHOTO: +BDAY:19531015T231000Z +ANNIVERSARY:19960415 +GENDER:M +ADR;GEO="geo:51.5237,0.1585";LABEL="Mr Sherlock Holmes, 221B Baker Street, London NW1, England, United Kingdom":;;221B Baker Street;London;;NW1;United Kingdom +EMAIL;TYPE=home:sherlock.holmes@gmail.com +EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com +IMPP;PREF=1:xmpp:detective@sherlockholmes.com +LANG;TYPE=work;PREF=1:en +LANG;TYPE=work;PREF=2:fr +TZ:London/Europe +GEO:geo:51.5237,0.1585 +TITLE:Detective +ROLE:Detective +UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519 +CATEGORIES:FICTION,LITERATURE +PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN +REV:2014722T222710Z +URL:https://sherlockholmes.com +KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holmes.pub.asc +CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes +FBURL;PREF=1:https://sherlockholmes.com/busy/detective +CALADRURI;PREF=1:mailto:detective@sherlockholmes.com +END:VCARD diff --git a/autotests/data/v4_0.vcard1.vcf.ref b/autotests/data/v4_0.vcard1.vcf.ref new file mode 100644 index 0000000..41030ef --- /dev/null +++ b/autotests/data/v4_0.vcard1.vcf.ref @@ -0,0 +1,15 @@ +BEGIN:VCARD +VERSION:4.0 +ADR;TYPE=parcel;TYPE=postal;TYPE=work:;;6544 Battleford Drive;Raleigh;NC;27 + 613-3502;U.S.A. +EMAIL;TYPE=PREF:Frank_Dawson@Lotus.com +EMAIL:fdawson@earthlink.net +FN:Frank Dawson +N:;;;; +ORG:Lotus Development Corporation +TEL;TYPE=MSG;TYPE=VOICE;TYPE=WORK:+1-919-676-9515 +TEL;TYPE=FAX;TYPE=WORK:+1-919-676-9564 +UID:gDVbA6LY3t +URL:http://home.earthlink.net/~fdawson +END:VCARD + diff --git a/autotests/data/v4_0.vcard2.vcf.ref b/autotests/data/v4_0.vcard2.vcf.ref new file mode 100644 index 0000000..446da45 --- /dev/null +++ b/autotests/data/v4_0.vcard2.vcf.ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:4.0 +ADR;TYPE=work:;;501 E. Middlefield Rd.;Mountain View;CA; 94043;U.S.A. +EMAIL:howes@netscape.com +FN:Tim Howes +N:;;;; +ORG:Netscape Communications Corp. +TEL;TYPE=MSG;TYPE=VOICE;TYPE=WORK:+1-415-937-3419 +TEL;TYPE=FAX;TYPE=WORK:+1-415-528-4164 +UID:1UgvYejJMs +END:VCARD + diff --git a/autotests/data/v4_0.vcard3.vcf.ref b/autotests/data/v4_0.vcard3.vcf.ref new file mode 100644 index 0000000..b91a5d7 --- /dev/null +++ b/autotests/data/v4_0.vcard3.vcf.ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:4.0 +EMAIL:geiseri@yahoo.com +FN:ian geiser +N:geiser;ian;;; +ORG:Source eXtreme +TITLE:VP of Engineering +UID:ebvq9Wo9rO +X-mozilla-cpt:;0 +X-mozilla-html:FALSE +END:VCARD + diff --git a/autotests/data/v4_0.vcard4.vcf.ref b/autotests/data/v4_0.vcard4.vcf.ref new file mode 100644 index 0000000..5e628d3 --- /dev/null +++ b/autotests/data/v4_0.vcard4.vcf.ref @@ -0,0 +1,14 @@ +BEGIN:VCARD +VERSION:4.0 +EMAIL:hello@ximian.com +FN: +LABEL;TYPE=work:401 Park Drive 3 West\nBoston\, MA 02215\nUSA +NOTE:Welcome to the Ximian Addressbook. +ORG:Ximian\, Inc. +TEL;TYPE=VOICE;TYPE=WORK:(617) 236-0442 +TEL;TYPE=FAX;TYPE=WORK:(617) 236-8630 +UID:pas-id-3E136F9B00000000 +URL:www.ximian.com/ +X-EVOLUTION-FILE-AS:Ximian\, Inc. +END:VCARD + diff --git a/autotests/data/v4_0.vcard5.vcf.ref b/autotests/data/v4_0.vcard5.vcf.ref new file mode 100644 index 0000000..10f6749 --- /dev/null +++ b/autotests/data/v4_0.vcard5.vcf.ref @@ -0,0 +1,313 @@ +BEGIN:VCARD +VERSION:4.0 +ADR;TYPE=home;TYPE=pref:;;Buehlauer Strasse 45;Dresden;Sachsen;01327;German + y +ADR;TYPE=work:;;Prager Strasse 55;Dresden;Sachsen;01066;Germany +BDAY:1955-07-19T00:00:00Z +CATEGORIES:Friend +CLASS:CONFIDENTIAL +EMAIL;TYPE=PREF:heiko.mustermann@freenet.org +EMAIL:heiko8@tst.inf.tu-dresden.de +FN:Mustermann\, Heiko +GEO:19.283333;166.616669 +LOGO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVU + AAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7aC + YMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k27 + EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7DT + 7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACpV + sZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSgA + A15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlRL + vEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrLc + 9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgBM + vSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMPs + P7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gvq + NSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL5 + 4WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kvy + d0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jyb + kfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq7 + aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0omA + ACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy3 + w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw0 + 9IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQO + crOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6z + E+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO+ + OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuDa + ANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbij + o19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGtV + X2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB6 + 79OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaPm + 8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqici + biYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2aT + JtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYIl + x36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30u + OQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAUL + hYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6Y + nf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVOH + QzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44M + d3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhRi + Il23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGGY + UmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK6 + YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXsv + GGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS5 + 8CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN8 + IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430w + D2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiXj + oGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxojd + ympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxpB + KXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3EmuF + VcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dtQ + 3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDgU + Ohz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe+ + a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOms + tFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5efV + 1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4U + VCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo+ + swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR0 + 0bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6X + bktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLUJ + wH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5K + 1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQxG + MSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCmo + HLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYjG + VIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9GphG + WIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJuH + NGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZW + BOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHFc + WWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFFq + xh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMWV + 8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGWJ + xczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC +N:Mustermann;Heiko;;; +NICKNAME:clown +NOTE:I'm a friendly note text\,\nplease copy me to your address book... +ORG:KDE +PHOTO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pV + UAAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7a + CYMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k2 + 7EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7D + T7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACp + VsZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSg + AA15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlR + LvEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrL + c9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgB + MvSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMP + sP7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gv + qNSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL + 54WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kv + yd0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jy + bkfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq + 7aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0om + AACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy + 3w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw + 09IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQ + OcrOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6 + zE+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO + +OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuD + aANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbi + jo19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGt + VX2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB + 679OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaP + m8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqic + ibiYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2a + TJtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYI + lx36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30 + uOQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAU + LhYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6 + Ynf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVO + HQzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44 + Md3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhR + iIl23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGG + YUmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK + 6YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXs + vGGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS + 58CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN + 8IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430 + wD2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiX + joGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxoj + dympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxp + BKXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3Emu + FVcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dt + Q3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDg + UOhz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe + +a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOm + stFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5ef + V1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4 + UVCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo + +swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR + 00bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6 + XbktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLU + JwH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5 + K1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQx + GMSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCm + oHLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYj + GVIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9Gph + GWIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJu + HNGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZ + WBOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHF + cWWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFF + qxh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMW + V8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGW + JxczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC +ROLE:Developer +SOUND;ENCODING=b:UklGRiQgAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAgAA + B/f39/f39/f39/f39/f4B/gH+Af4CAgIGBgYGBgYGBgYGBgYGBgYGBgIGAgICBgYGBgYGBgYCAg + YGAgICAgICAgIGBgICAgYCAgICBgICAgICAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAf4CAgICAgICAgICAgICAgIB/f4CAgICAgICAgIB/f4B/f39/f39/f3+AgICAf4CAf3 + 9/gIB/f4CAgH9/gICAgH+AgICAgICAgICAf4CAgIB/gICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgIB/gICAf39/f39/f3+Af4CAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgH9/f39/f39/f39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYCAgICB + gICAgYGBgICAgICAgICAgIGAgICBgICBgYGBgYGBgYGAgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYG + BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgYGBgIGBgYGAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgH+AgICAgICAgICAgICAgICAgICAf4CAgIB/gH+Af4B/f39/f39/f + 39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYG + BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY + GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAgIGBgYCAgICBgYCAgYGBgYCAgICBg + YCAgICAgICAgICAgICAgIGAgICAgICAgICAgICAgYGBgYGAgICAgIGBgYCAgICBgYGAgICAgIGA + gICAgICAgIGBgYCBgYGAgYGBgYGBgoGBgYGCgoGAgICBgYGBgYCBgYKCgYGBgYGBgYGAgYGBgH9 + /gIB/f3+AgIB/gH9/gICAf4CBgYB/f35+gIB/f4CBgX9/gYCAgYKCgYCAgYOBgICAgoGAf4GCgn + 9/gIB/gICBgH5/f4GAfX+BgYB+fn9/fn+Afn6Af39+f35+fn9+fn6AgH9/f4CAgYCAgYKCgH9/g + IKBf3+AgYJ/f4GCg4F/gIGCgoOBfoCDgYF/fH+BgYGAfn6Af4CCgn58gIN/fX+AgICBgYGAgYCB + goOCgICBgYB/fXyBhIGAgH5+f4GBgX9/f35+gIKCgXt9goN/f318f4GAf4B/fHt9fn5+fXx+fn5 + /gH9+fHx/gHx9f4CAfn18gIB9e4GBfn5+foCBfHyAgoGAfX6CgYCBgH+DgHt9gYN/fX2BhYB7en + 6AgH98foKCgH18foCAfoCAf4CAf31+fn+AgH1+goJ/fX5/gIKAgIGAfH6CgX17foCBf3+BgoB/g + YOBgIB/f4KDgoJ+e3+ChIOBfn1/gX+BfX2BgH59foCCfn1/gX99fICAgoB/f39/gISCf36AgoSB + foCBgYGAf4CCf4CCgX5/gYKDgYB/gH+BhIOBgYB/gIOEhIF9foGCg4OBgICBgoOCgICChIOBg4O + CgoSDgoKAgYKBgoODhISBf4CCg4SEgoGCg4SEgH6BhIWEgX+EhYKAgoKFhIB+gIKChYKAgYOCgo + B+gYWFhIKAg4WEg4ODhIWFhYaGhIWGhYWGh4eHhYOCgoSFg4B/gIB+fX1+fn57e3t7fHt6fH5/f + 4GDhYiMkJGQj5GVmZycmZiXlZGIfXRwcnZ4d3Nva2hoamppaWxvc3R0dXl+iJCPjZShqrCzvNHi + rFYxOmKSrJ6UmJOAbV1ZboSMjI6JfnNjW2JweYGFg4B/e3Z0c3Btc3p9fHp4fIGBf3+Dh4qLjJG + YnZuWkY6MhnpwbnN6fHlya2hlZmdmaW9ycXFzd3t/g42cpquzvMzd/sRADiBZkL6xpLa1jFpANV + iHoJ2ioJWGbEQ2VHaOm5aHhIFuYmZzgoVxZFxfdJCSgnt/kKewr7bDsopcSV6JopyRjpOQfmNXZ + HmGhYB8fXtvXExKXnyKgnJsc3t8fZC0ysfK0+vHTxEeXY6yr6rAxJRSNTdbh5+fp7KjglQ6PVx3 + ho6Ph3dmW15oa2x0hIuNkK3R18jJ0Ys8LUlxkqais8WtdlBFT2yDjpywro9mS0VVaXaBiIdyX2J + rcG5udYKKjaXT4dfV2Y82JkBpiaKkvdO2eE9GTGZ4hZu6u51yTUNOX2l9kZWKdl5PXG93dHeAip + KZut7j2tacRjJIYHCOo77XvoRdVlFYZniVuL+kfl9ST1Rcb4mTjoNxW1pqdXd5fH6CiKHN4d7k2 + 4E4N05Yaoqo1eO0emVbTU5ZdKDCuZV9b1tMSVlyiYp8dHl7cmpqdYCCgIqixNTR2OqnRTlPXFt3 + ksbnw4lzcFdKS2KMtLWZiIZwV0lPZXZ1b3uNinZqbXJ3dX2XxOPg4/zDUDRCTUhmiMXx1p+If1g + +O1J7pK+yspN3W0pGVGdugYmCen54b21rb3V9i6vZ7vD92WpAS0gzSny04tq3qp5qPDhHX3uVrs + KukXVhT0hRYnF/gnuCh31ubG9zdHeMs+Dr8P7KalFVOylJeq7QzMPIqmtIRUZOY4KovqicknhZS + 1BWXWh6gIeLiH91b21vc4GcyuXt/umTZGhGIjJfh6y+yt7LkGlfTD1GYYOipKKwnXhkXldVUFhs + dYOMjYWBem9ucoCWvNTm9+2weHdZMSpQboujvtnUrY6BZEdDUmV4jZypppeFd2dcWVFWWWh8hYS + Ii393c3Z7iJ3A1ePp3aGDfVYyOVZkfJe5zsavpJNsU1BTVmR9kpmcn5uGdGxoWU5VVGZ0fIKLh4 + F/d3Z6g4ufuc3e3depjoViPz9VWm2FqLu8tLGifmphWlJZbH+Lj5+elod+c19WU0xUZW11gISEg + nx6e3h6g4qWp7zM3NrSpZGIYkRFVVVlfZ6vsbW3qIl7b2BUWGVwe4ybn52TkIRuX2BVRVFjZmp7 + hIF9fX12cnZ6eX6LlZyousfP0c++jot6X0ZRXF9sgaCnqa6yn4eAdGZZYGlvd4mcnqCWnY91aWN + cSUtYYmJxf399f351cXFzcHF4foOIlZ+hp7CytLm8uLKNg4RtYF5oanN8j5qZnqGaioV9dGpqb3 + J1f42Rk5iZjIKAcmFcW1RXYGhwdXt+e3Z2c25tcXJxd3yChY2Tl5udn6Gho6ioq6uonoaHbWNzZ + GdxgoGPlZqdj5CJgHFzcWxwdH1/hYqOioSFfnFpaWBdX2Jqb3N5fHh4eHNxcXFxc3d7foOJjI6Q + lZOSlZOTl5eYnJucnpyZkYiEfnd1dnZ5fYKHio6QkIyHg394dHRzc3Z5fHt2enJrcG5obG9sbW9 + ucHJzdnh3eXp5eXt9foCDhoeJjI6OkJGSk5aYmZudn6Gjn5qLh4J3cnJ0dHR5g4GEi42Ih4aBfH + h4dXR1eHl4dXhuaW5rZ2ltaWttbW5vcnR1dHZ2dXV2d3d7fn+BhIeIiYuOjpCTlJWZnJueoKarr + ZuJhntvaW1ucnh+hIWJi4qFg4F7d3V1c3R3fH1/gHlvbXJnXmdpYmdtamtxcW9vbm9tamxtbG5z + dXZ5fHx7fX9+fH6AgoWHioyNj5CRlZeYmp2TiYyGenp9eXh9fX19foB/fH1/e3p8e3l5e3x7e3x + 6d3FxcnBwcG9vb29vb29wb25tbWxsbW5vb3Fyc3N1dXV1dnd4ent9fn+BgoGAgoWEhoqJiYyLi4 + yPioaLiYSEh4WDhIOCgoKAgX58fXx5eXp4eHl4dXZ1cnN0dHR1cnJycXBxcnJycW9ubGxsbW1ub + m5ub29vcXNzdHZ2dXh6enp+fn5/gYCBhIKFiYeGiomJi4qKjIuLjIyLiomKh4aKioeIiIWDgYB9 + fHx7e3l4eHh2dnd3d3l7enp6enp5ent7e3x7enl6e3t7fHx7e3p8fX5/gIKDg4GCg4KCg4OEhoe + Hh4iJiomLjIqLi4uLi46Pjo2OjouJiomHh4aDgH9/fXp5eXh3d3h4eHh4d3V2d3Z0dnd0dXd3d3 + p7fH59fX19fH5+fn+Af4CAf3+Af359f4KDgoSIiIeJjI6PkJOUk5SYmZiYmZqZmJqamJiZmJaWl + ZSTkZCQj46Ni4qHh4iFgoKBfn9+fn+AgYCAgYOCgoSEg4SFhIODg4OCgICBf35/gICAgYKCgYGD + hIOBgYOCgYGAgIGBgIGCgoKBgoSEg4KCgH9/f318fHt6e3t7enl5eHh5fH18foCAf4GDg4OFhoa + GhoeJh4aJioiIiYiIhoWGh4aGh4eHiImHh4mIiIeHh4iIiIqJioqJh4mKh4eJiYiHh4eHhoWGhY + OEhYWEhYWDg4SFhYWEg4SDgYKCgH+AgICBgoOCgYGBgYKEhoaGhoiIh4eJiYmKioqKiomKioiJi + oqJiYmJiIiIiYiHh4eHh4eGhYWFhISDgoKCgoKCgYGAf31+fXx9fn58e3x8fHx9fX19fX19fX19 + fHx9fn5/gICBgYGCgoKCg4OCgoODgoKDg4OCgoKCgoGBgYGBgYGCgYCBgIGCgoKDg4KCg4OEhIS + FhYWFhYWFhYWFhoWGhoWEhISDg4ODg4ODg4ODg4SDgoKDg4OCg4SDgoKDgoGBgoGAgIB/f35+fn + 9+fn9/f35+fn5/gICAgIGBgYKCg4ODg4SEg4OEhIODhIODhIODg4ODg4OCgoKBgoKCg4OCgoODg + 4ODg4OEhISEhIWEhIWFhISEhISEhIWEhISEhIODhISEg4ODg4ODg4ODg4ODgoKCgoKCg4KCgoKC + goKCgoKCgoOCgoKCgoKBgYKCgoKCgoGBgYGAgICAgYGBgYCAf39/f39/f3+Af39/f39/f39/gIC + AgIB/f39/f39/gICAgIB/f39/gIB/f39/gH9/f39/f39/fn5+f39/f39/fn5+fn5/f39/f39/fn + 5+fn9/f39/f35+fn5+fn9/f35/f39+fn5+fn9/fn5+fn5+fn5+f39+fn5+fn19fX5+fn5+fn5+f + X5+fn5+fn5+fn19fn5+fn5+fX19fX59fn5+fn19fX19fX1+fX19fX19fX19fX19fX19fX19fX19 + fX19fX19fX19fX19fX19fX19fX19fX19fXx9fX18fH19fXx8fXx9fXx8fHx8fHx8fH19fX19fXx + 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX + 19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f + X19fX19fX19fX19fX19fX19fX19fX19fX1+fX5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ + fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f3 + 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f + 39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ + f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/f39/f39/f39/f35+fn5+f35/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+f + 39+fn5/fn5+f39/fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ + f39/f39/f39/f39/f39+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f4CAf39/f39/f39/gIB/f39/f39/f4B/f4CAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgIB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgIC + AgICAgICAgICAgICAgICAgICAgICAgIGBgYGAgYGBgICAgIGAgICBgYGAgYGBgYGBgYGBgYGBgY + GBgYGBgYGBgYGBgYGBgYGAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf39/gH9/f + 3+Af39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4CAgH9/gIB/f39/f4B/f3+AgICAf4CA + gICAgICAgICAgICAgH9/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgIB/f39/f39/f39/f4CAf39/f39/f39/f39/f39/f39+fn + 9/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fn5+fn5+fn9/f39/f4CAgICAgICBgYGBg + YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgYGAgICA + gICAgICAgICAgICBgYGAgICAgICAgICAgICAgICAgICAgICAgIB/gICAgH9/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgICAf39/f39/gH+AgI + CAgICAgIB/f39/f39/f4B/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn9/f39/f39/f39+f + 39/f39/f39/f39/f39/f39/f39/f4B/f4CAgICAf39/f39/gICAf39/gICAgICAgICAgICAgICA + gICAgIGAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICBgYGBgYGBgYCBgYGBgYCAgIG + BgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAf3+AgIB/f4CAf39/f39/f3+AgICAgH+AgICAf3+AgICAgICAgH9/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/gH9/gICAgICAgICAgIB/gICAgH+AgIB/f39/f39/gICAgICAgH9/f3+AgH9/f4B/f + 39/f39/f39/f39/f3+AgICAgICAf3+AgIB/f4CAgIB/f4CAgICAgICAgICAf39/f3+AgIB/f4CA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf39/f39 + /f4CAgH9/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/gIB/f39/f39/f39/gH9/f3 + 9/f4CAgICAgIB/gICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf4CAgICAgICAgIB/gICAf + 4CAgICAgH+Af4CAgH9/f39/f39/f39/gICAgICAgICAgICAf39/f39/f4CAgH9/gICAf3+AgICA + gICAgICAgICAgICAgICAgICAgIB/f39/gIB/f4CAgIB/f4CAgH9/gICAf39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAf39/gH9/f3+AgH9/f39/f39/f39/f39/f + 39/f39/f39/f39/f39/f39/f39/gICAf3+AgH9/f3+AgH9/f4CAgH9/gICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICBgYGBgIGBgYCAgYGAgICAgYCAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAf39/f39/f4CAgIB/f4CAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAf39/f3+Af39/f39/f39/f4B/f39/f4CAgICAgICAgICAgA== +TEL;TYPE=HOME:0351 223344 +TEL;TYPE=WORK:0351 443322 +TEL;TYPE=CELL:0173 223344 +UID:P9HXg34Oav +URL:http://www.mustermann.de/~heiko/ +X-KADDRESSBOOK-X-Anniversary:1982-07-07 +X-KADDRESSBOOK-X-AssistantsName:Mr. Smithers +X-KADDRESSBOOK-X-Department:Edutainment +X-KADDRESSBOOK-X-IMAddress:122334455 +X-KADDRESSBOOK-X-ManagersName:Mr. Burnes +X-KADDRESSBOOK-X-Office:223 2nd stage +X-KADDRESSBOOK-X-Profession:Clown +X-KADDRESSBOOK-X-SpousesName:femal clown +END:VCARD + diff --git a/autotests/data/v4_0.vcard6.vcf.ref b/autotests/data/v4_0.vcard6.vcf.ref new file mode 100644 index 0000000..80622a6 --- /dev/null +++ b/autotests/data/v4_0.vcard6.vcf.ref @@ -0,0 +1,10 @@ +BEGIN:VCARD +VERSION:4.0 +CLASS:PUBLIC +EMAIL;TYPE=PREF:email1@abc.de +EMAIL:email2@abc.de +FN:Test User +N:User;Test;;; +UID:uJTkVqH5Qt +END:VCARD + diff --git a/autotests/data/v4_0.vcard7.vcf.ref b/autotests/data/v4_0.vcard7.vcf.ref new file mode 100644 index 0000000..64ff743 --- /dev/null +++ b/autotests/data/v4_0.vcard7.vcf.ref @@ -0,0 +1,8 @@ +BEGIN:VCARD +VERSION:4.0 +FN: +LABEL;TYPE=work:401 Park Drive 3 West\nBoston\, MA 02215\nUSA\nHerecomesye + tanotherline +UID:pas-id-3E136F9B00000000 +END:VCARD + diff --git a/autotests/data/v4_0.vcard8.vcf.ref b/autotests/data/v4_0.vcard8.vcf.ref new file mode 100644 index 0000000..55bf303 --- /dev/null +++ b/autotests/data/v4_0.vcard8.vcf.ref @@ -0,0 +1,8 @@ +BEGIN:VCARD +VERSION:4.0 +FN:test +N:test;;;; +NOTE:line one\nline two\nline three\n +UID:8OD165Pope +END:VCARD + diff --git a/autotests/data/vcard1.vcf b/autotests/data/vcard1.vcf new file mode 100644 index 0000000..da4613e --- /dev/null +++ b/autotests/data/vcard1.vcf @@ -0,0 +1,14 @@ +BEGIN:vCard +VERSION:3.0 +UID:gDVbA6LY3t +FN:Frank Dawson +ORG:Lotus Development Corporation +ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive + ;Raleigh;NC;27613-3502;U.S.A. +TEL;TYPE=VOICE,MSG,WORK:+1-919-676-9515 +TEL;TYPE=FAX,WORK:+1-919-676-9564 +EMAIL;TYPE=INTERNET,PREF:Frank_Dawson@Lotus.com +EMAIL;TYPE=INTERNET:fdawson@earthlink.net +URL:http://home.earthlink.net/~fdawson +END:vCard + diff --git a/autotests/data/vcard1.vcf.2_1ref b/autotests/data/vcard1.vcf.2_1ref new file mode 100644 index 0000000..08ede3e --- /dev/null +++ b/autotests/data/vcard1.vcf.2_1ref @@ -0,0 +1,14 @@ +BEGIN:VCARD +VERSION:2.1 +ADR;PARCEL;POSTAL;WORK:;;6544 Battleford Drive;Raleigh;NC;27613-3502;U.S.A. +EMAIL;INTERNET;PREF:Frank_Dawson@Lotus.com +EMAIL;INTERNET:fdawson@earthlink.net +FN:Frank Dawson +N:;;;; +ORG:Lotus Development Corporation +TEL;MSG;VOICE;WORK:+1-919-676-9515 +TEL;FAX;WORK:+1-919-676-9564 +UID:gDVbA6LY3t +URL:http://home.earthlink.net/~fdawson +END:VCARD + diff --git a/autotests/data/vcard1.vcf.ref b/autotests/data/vcard1.vcf.ref new file mode 100644 index 0000000..038cb5f --- /dev/null +++ b/autotests/data/vcard1.vcf.ref @@ -0,0 +1,15 @@ +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=parcel,postal,work:;;6544 Battleford Drive;Raleigh;NC;27613-3502;U + .S.A. +EMAIL;TYPE=INTERNET,PREF:Frank_Dawson@Lotus.com +EMAIL;TYPE=INTERNET:fdawson@earthlink.net +FN:Frank Dawson +N:;;;; +ORG:Lotus Development Corporation +TEL;TYPE=MSG,VOICE,WORK:+1-919-676-9515 +TEL;TYPE=FAX,WORK:+1-919-676-9564 +UID:gDVbA6LY3t +URL:http://home.earthlink.net/~fdawson +END:VCARD + diff --git a/autotests/data/vcard10.vcf b/autotests/data/vcard10.vcf new file mode 100644 index 0000000..821aea6 --- /dev/null +++ b/autotests/data/vcard10.vcf @@ -0,0 +1,56 @@ +BEGIN:VCARD +VERSION:2.1 +UID:bfa5fdc5-fbfc-4ce2-8196-29ca0deb3bd3 +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= +=32=0A=30=30=30=30=30=20=44=44=44=44=44=44=44=44=44=44;;;; +ORG:Bike Shop +Note:This one has a funny character at the end in the contact list +END:VCARD +BEGIN:VCARD +VERSION:2.1 +UID:f8361311-b25c-4237-a94e-3015d8fe19de +N:;Broken;;; +FN:Field after Address broken +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= +=31=31;=55=72=74;;=30=30=30=30=30; +URL:http://some-webseite.com +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. +END:VCARD +BEGIN:VCARD +VERSION:2.1 +UID:462269fd-607c-4284-998b-6771143b63a7 +N:;Broken;;; +FN:Field after Address not broken +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= +=31=31;=55=72=74;;=30=30=30=30=30; +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. +URL:http://some-webseite.com +END:VCARD +BEGIN:VCARD +VERSION:2.1 +UID:b4fc4930-043f-446a-9a76-cf0b548368d8 +N:Name;Surname;;Dr. med.; +FN:Dr. med. Surname Name +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= +=6D=65=64=69=7A=69=6E +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= +=31=32=2C=20=31=35=E2=80=93=31=38=0A=44=69=20=20=20=20=20=38=E2=80=93= +=31=32=0A=4D=69=20=20=20=20=38=E2=80=93=31=32=2C=20=31=34=E2=80=93=31= +=35=0A=44=6F=20=31=34=E2=80=93=31=39=0A=46=72=20=20=20=20=20=38=E2=80= +=93=31=32 +END:VCARD +BEGIN:VCARD +VERSION:2.1 +UID:941b057d-e959-4644-b41f-e122b26c3807 +N:Doctor;Second;;; +FN:Second Doctor +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= +=30=30=30=30=20=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44=44;;;; +ORG: +TITLE:Dentist +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= +=31=33=0A=44=69=20=20=20=31=30=E2=80=93=31=32=2C=20=31=33=E2=80=93=31= +=38=0A=4D=69=20=20=31=30=E2=80=93=31=32=2C=20=31=33=E2=80=93=31=38=0A= +=44=6F=20=20=31=33=E2=80=93=31=38=0A=46=72=20=20=20=20=20=20=38=E2=80= +=93=31=32 +END:VCARD diff --git a/autotests/data/vcard10.vcf.ref b/autotests/data/vcard10.vcf.ref new file mode 100644 index 0000000..149a7ed --- /dev/null +++ b/autotests/data/vcard10.vcf.ref @@ -0,0 +1,53 @@ +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=work:;;DDDDDDDDDDDDDDD-Staße 2\n00000 DDDDDDDDDD;;;; +N:;;;; +NOTE:This one has a funny character at the end in the contact list +ORG:Bike Shop +UID:bfa5fdc5-fbfc-4ce2-8196-29ca0deb3bd3 +END:VCARD + +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=home:;;AAAAAAA-AäAAAAA 11;Urt;;00000; +FN:Field after Address broken +N:;Broken;;; +NOTE:This one's URL field is truncated (see contact's edit form). Remove th + e linebreak in the VCF's address field and the URL will will be correct. +UID:f8361311-b25c-4237-a94e-3015d8fe19de +URL:http://some-webseite.com +END:VCARD + +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=home:;;AAAAAAA-AäAAAAA 11;Urt;;00000; +FN:Field after Address not broken +N:;Broken;;; +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. +UID:462269fd-607c-4284-998b-6771143b63a7 +URL:http://some-webseite.com +END:VCARD + +BEGIN:VCARD +VERSION:3.0 +FN:Dr. med. Surname Name +N:Name;Surname;;Dr. med.; +NOTE:Sprechzeiten:\nMo 8–12\, 15–18\nDi 8–12\nMi 8–12\, 14 + –15\nDo 14–19\nFr 8–12 +TITLE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=46acharzt f=C3=BCr Allgemein + medizin +UID:b4fc4930-043f-446a-9a76-cf0b548368d8 +END:VCARD + +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=work:;;DDDDDDDDDDDstraße 26\n00000 DDDDDDDDDDDDDDDDD;;;; +FN:Second Doctor +N:Doctor;Second;;; +NOTE:Sprechzeiten:\nMo 8–13\nDi 10–12\, 13–18\nMi 10–12\, 13 + –18\nDo 13–18\nFr 8–12 +TITLE:Dentist +UID:941b057d-e959-4644-b41f-e122b26c3807 +END:VCARD + diff --git a/autotests/data/vcard11.vcf b/autotests/data/vcard11.vcf new file mode 100644 index 0000000..904e083 --- /dev/null +++ b/autotests/data/vcard11.vcf @@ -0,0 +1,10 @@ +BEGIN:VCARD +CLASS:PUBLIC +EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com +EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com +FN:Test User +N:User;Test;;; +UID:uJTkVqH5Qt +VERSION:3.0 +END:VCARD + diff --git a/autotests/data/vcard11.vcf.ref b/autotests/data/vcard11.vcf.ref new file mode 100644 index 0000000..2b8709a --- /dev/null +++ b/autotests/data/vcard11.vcf.ref @@ -0,0 +1,10 @@ +BEGIN:VCARD +VERSION:3.0 +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 +END:VCARD + diff --git a/autotests/data/vcard12.vcf b/autotests/data/vcard12.vcf new file mode 100644 index 0000000..ecb2d6c --- /dev/null +++ b/autotests/data/vcard12.vcf @@ -0,0 +1,15 @@ +BEGIN:VCARD +VERSION:3.0 +UID:pas-id-54B2522600000001 +FN:Good Looking +N:Looking;Good;;; +PHOTO;TYPE=WORK;ENCODING=b:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA + CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiUrjAUGmgAAABl0RVh0Q29tbWVudABDcm + VhdGVkIHdpdGggR0lNUFeBDhcAAAAZSURBVAjXY/zPAAVMDAwMDP//MzAwMMLFAEMrBAHo3Yr/ + AAAAAElFTkSuQmCC +PHOTO;TYPE=HOME;ENCODING=b:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA + CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiQG0MFrrgAAABl0RVh0Q29tbWVudABDcm + VhdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY/j//z8DAwOEhAG4GACzagv1unIx3wAAAABJ + RU5ErkJggg== +EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:goodlooking@example.com +END:VCARD diff --git a/autotests/data/vcard12.vcf.2_1ref b/autotests/data/vcard12.vcf.2_1ref new file mode 100644 index 0000000..6560135 Binary files /dev/null and b/autotests/data/vcard12.vcf.2_1ref differ diff --git a/autotests/data/vcard12.vcf.ref b/autotests/data/vcard12.vcf.ref new file mode 100644 index 0000000..980372e --- /dev/null +++ b/autotests/data/vcard12.vcf.ref @@ -0,0 +1,16 @@ +BEGIN:VCARD +VERSION:3.0 +EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:goodlooking@example.com +FN:Good Looking +N:Looking;Good;;; +PHOTO;ENCODING=b;TYPE=WORK:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA + CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiUrjAUGmgAAABl0RVh0Q29tbWVudABDcmV + hdGVkIHdpdGggR0lNUFeBDhcAAAAZSURBVAjXY/zPAAVMDAwMDP//MzAwMMLFAEMrBAHo3Yr/AA + AAAElFTkSuQmCC +PHOTO;ENCODING=b;TYPE=HOME:iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAA + CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wELCiQG0MFrrgAAABl0RVh0Q29tbWVudABDcmV + hdGVkIHdpdGggR0lNUFeBDhcAAAAUSURBVAjXY/j//z8DAwOEhAG4GACzagv1unIx3wAAAABJRU + 5ErkJggg== +UID:pas-id-54B2522600000001 +END:VCARD + diff --git a/autotests/data/vcard13.vcf b/autotests/data/vcard13.vcf new file mode 100644 index 0000000..5e31757 --- /dev/null +++ b/autotests/data/vcard13.vcf @@ -0,0 +1,12 @@ +BEGIN:VCARD +CLASS:PUBLIC +EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com +EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com +FN:Test User +N:User;Test;;; +UID:uJTkVqH5Qt +URL:test1.url +URL:test2.url +VERSION:3.0 +END:VCARD + diff --git a/autotests/data/vcard13.vcf.ref b/autotests/data/vcard13.vcf.ref new file mode 100644 index 0000000..ce0cba0 --- /dev/null +++ b/autotests/data/vcard13.vcf.ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:3.0 +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 +END:VCARD + diff --git a/autotests/data/vcard14.vcf b/autotests/data/vcard14.vcf new file mode 100644 index 0000000..8fe5db3 --- /dev/null +++ b/autotests/data/vcard14.vcf @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:3.0 +CLASS:PUBLIC +EMAIL;TYPE=HOME,PREF;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 +SOURCE:http://www.kde.org +SOURCE:http://www.kde1.org +END:VCARD + diff --git a/autotests/data/vcard14.vcf.2_1ref b/autotests/data/vcard14.vcf.2_1ref new file mode 100644 index 0000000..367e523 --- /dev/null +++ b/autotests/data/vcard14.vcf.2_1ref @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:2.1 +EMAIL;HOME;PREF;X-EVOLUTION-UI-SLOT=2:thejoe@abc.com +EMAIL;WORK;X-EVOLUTION-UI-SLOT=1:johndoe@abc.com +FN:Test User +N:User;Test;;; +SOURCE:http://www.kde.org +SOURCE:http://www.kde1.org +UID:uJTkVqH5Qt +END:VCARD + diff --git a/autotests/data/vcard14.vcf.ref b/autotests/data/vcard14.vcf.ref new file mode 100644 index 0000000..2488a73 --- /dev/null +++ b/autotests/data/vcard14.vcf.ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:3.0 +CLASS:PUBLIC +EMAIL;TYPE=HOME,PREF;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;;; +SOURCE:http://www.kde.org +SOURCE:http://www.kde1.org +UID:uJTkVqH5Qt +END:VCARD + diff --git a/autotests/data/vcard15.vcf b/autotests/data/vcard15.vcf new file mode 100644 index 0000000..7fa66c1 --- /dev/null +++ b/autotests/data/vcard15.vcf @@ -0,0 +1,10 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Test Tester +N:Tester;Test;;; +RELATED;TYPE=child;VALUE=text:Child Tester +item1.URL:http://www.example.com +item1.X-ABLABEL:random_label +TEL;TYPE=home:+1-800-123456 +UID:40f8971c-1d3a-466f-8cf5-55aad2021e1a +END:VCARD diff --git a/autotests/data/vcard15.vcf.ref b/autotests/data/vcard15.vcf.ref new file mode 100644 index 0000000..576e330 --- /dev/null +++ b/autotests/data/vcard15.vcf.ref @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Test Tester +N:Tester;Test;;; +RELATED;TYPE=child;VALUE=text:Child Tester +TEL;TYPE=HOME:+1-800-123456 +UID:40f8971c-1d3a-466f-8cf5-55aad2021e1a +item1.URL:http://www.example.com +item1.X-ABLABEL:random_label +END:VCARD + diff --git a/autotests/data/vcard2.vcf b/autotests/data/vcard2.vcf new file mode 100644 index 0000000..13cd72e --- /dev/null +++ b/autotests/data/vcard2.vcf @@ -0,0 +1,12 @@ +BEGIN:vCard +VERSION:3.0 +UID:1UgvYejJMs +FN:Tim Howes +ORG:Netscape Communications Corp. +ADR;TYPE=WORK:;;501 E. Middlefield Rd.;Mountain View; + CA; 94043;U.S.A. +TEL;TYPE=VOICE,MSG,WORK:+1-415-937-3419 +TEL;TYPE=FAX,WORK:+1-415-528-4164 +EMAIL;TYPE=INTERNET:howes@netscape.com +END:vCard + diff --git a/autotests/data/vcard2.vcf.2_1ref b/autotests/data/vcard2.vcf.2_1ref new file mode 100644 index 0000000..0af201c --- /dev/null +++ b/autotests/data/vcard2.vcf.2_1ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:2.1 +ADR;WORK:;;501 E. Middlefield Rd.;Mountain View;CA; 94043;U.S.A. +EMAIL;INTERNET:howes@netscape.com +FN:Tim Howes +N:;;;; +ORG:Netscape Communications Corp. +TEL;MSG;VOICE;WORK:+1-415-937-3419 +TEL;FAX;WORK:+1-415-528-4164 +UID:1UgvYejJMs +END:VCARD + diff --git a/autotests/data/vcard2.vcf.ref b/autotests/data/vcard2.vcf.ref new file mode 100644 index 0000000..0cf6003 --- /dev/null +++ b/autotests/data/vcard2.vcf.ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=work:;;501 E. Middlefield Rd.;Mountain View;CA; 94043;U.S.A. +EMAIL;TYPE=INTERNET:howes@netscape.com +FN:Tim Howes +N:;;;; +ORG:Netscape Communications Corp. +TEL;TYPE=MSG,VOICE,WORK:+1-415-937-3419 +TEL;TYPE=FAX,WORK:+1-415-528-4164 +UID:1UgvYejJMs +END:VCARD + diff --git a/autotests/data/vcard3.vcf b/autotests/data/vcard3.vcf new file mode 100644 index 0000000..579e2da --- /dev/null +++ b/autotests/data/vcard3.vcf @@ -0,0 +1,12 @@ +begin:vcard +uid:ebvq9Wo9rO +n:geiser;ian +x-mozilla-html:FALSE +org:Source eXtreme +version:2.1 +email;internet:geiseri@yahoo.com +title:VP of Engineering +x-mozilla-cpt:;0 +fn:ian geiser +end:vcard + diff --git a/autotests/data/vcard3.vcf.2_1ref b/autotests/data/vcard3.vcf.2_1ref new file mode 100644 index 0000000..0a81e62 --- /dev/null +++ b/autotests/data/vcard3.vcf.2_1ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:2.1 +EMAIL;INTERNET:geiseri@yahoo.com +FN:ian geiser +N:geiser;ian;;; +ORG:Source eXtreme +TITLE:VP of Engineering +UID:ebvq9Wo9rO +X-mozilla-cpt:;0 +X-mozilla-html:FALSE +END:VCARD + diff --git a/autotests/data/vcard3.vcf.ref b/autotests/data/vcard3.vcf.ref new file mode 100644 index 0000000..0eeeec2 --- /dev/null +++ b/autotests/data/vcard3.vcf.ref @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:3.0 +EMAIL;TYPE=internet:geiseri@yahoo.com +FN:ian geiser +N:geiser;ian;;; +ORG:Source eXtreme +TITLE:VP of Engineering +UID:ebvq9Wo9rO +X-mozilla-cpt:;0 +X-mozilla-html:FALSE +END:VCARD + diff --git a/autotests/data/vcard4.vcf b/autotests/data/vcard4.vcf new file mode 100644 index 0000000..7152ceb --- /dev/null +++ b/autotests/data/vcard4.vcf @@ -0,0 +1,14 @@ +BEGIN:VCARD +X-EVOLUTION-FILE-AS:Ximian, Inc. +FN +N: +LABEL;QUOTED-PRINTABLE;WORK:401 Park Drive 3 West=0ABoston, MA 02215=0AUSA +TEL;WORK;VOICE:(617) 236-0442 +TEL;WORK;FAX:(617) 236-8630 +EMAIL;INTERNET:hello@ximian.com +URL:www.ximian.com/ +ORG:Ximian, Inc. +NOTE:Welcome to the Ximian Addressbook. +UID:pas-id-3E136F9B00000000 +END:VCARD + diff --git a/autotests/data/vcard4.vcf.ref b/autotests/data/vcard4.vcf.ref new file mode 100644 index 0000000..28e0b58 --- /dev/null +++ b/autotests/data/vcard4.vcf.ref @@ -0,0 +1,14 @@ +BEGIN:VCARD +VERSION:3.0 +EMAIL;TYPE=INTERNET:hello@ximian.com +LABEL;TYPE=work:401 Park Drive 3 West\nBoston\, MA 02215\nUSA +N:;;;; +NOTE:Welcome to the Ximian Addressbook. +ORG:Ximian\, Inc. +TEL;TYPE=VOICE,WORK:(617) 236-0442 +TEL;TYPE=FAX,WORK:(617) 236-8630 +UID:pas-id-3E136F9B00000000 +URL:www.ximian.com/ +X-EVOLUTION-FILE-AS:Ximian\, Inc. +END:VCARD + diff --git a/autotests/data/vcard5.vcf b/autotests/data/vcard5.vcf new file mode 100644 index 0000000..957a1e5 --- /dev/null +++ b/autotests/data/vcard5.vcf @@ -0,0 +1,313 @@ +BEGIN:VCARD +ADR;TYPE=home;TYPE=pref:;;Buehlauer Strasse 45;Dresden;Sachsen;01327;German + y +ADR;TYPE=work:;;Prager Strasse 55;Dresden;Sachsen;01066;Germany +BDAY:1955-07-19T00:00:00Z +CATEGORIES:Friend +CLASS:CONFIDENTIAL +EMAIL;TYPE=PREF:heiko.mustermann@freenet.org +EMAIL:heiko8@tst.inf.tu-dresden.de +FN:Mustermann, Heiko +GEO:19.283333;166.616669 +LOGO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVU + AAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7aC + YMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k27 + EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7DT + 7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACpV + sZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSgA + A15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlRL + vEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrLc + 9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgBM + vSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMPs + P7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gvq + NSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL5 + 4WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kvy + d0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jyb + kfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq7 + aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0omA + ACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy3 + w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw0 + 9IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQO + crOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6z + E+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO+ + OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuDa + ANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbij + o19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGtV + X2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB6 + 79OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaPm + 8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqici + biYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2aT + JtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYIl + x36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30u + OQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAUL + hYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6Y + nf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVOH + QzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44M + d3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhRi + Il23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGGY + UmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK6 + YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXsv + GGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS5 + 8CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN8 + IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430w + D2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiXj + oGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxojd + ympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxpB + KXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3EmuF + VcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dtQ + 3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDgU + Ohz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe+ + a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOms + tFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5efV + 1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4U + VCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo+ + swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR0 + 0bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6X + bktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLUJ + wH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5K + 1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQxG + MSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCmo + HLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYjG + VIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9GphG + WIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJuH + NGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZW + BOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHFc + WWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFFq + xh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMWV + 8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGWJ + xczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC +N:Mustermann;Heiko;;; +NICKNAME:clown +NOTE:I'm a friendly note text,\nplease copy me to your address book... +ORG:KDE +PHOTO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pV + UAAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7a + CYMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k2 + 7EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7D + T7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACp + VsZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSg + AA15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlR + LvEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrL + c9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgB + MvSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMP + sP7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gv + qNSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL + 54WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kv + yd0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jy + bkfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq + 7aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0om + AACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy + 3w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw + 09IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQ + OcrOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6 + zE+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO + +OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuD + aANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbi + jo19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGt + VX2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB + 679OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaP + m8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqic + ibiYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2a + TJtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYI + lx36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30 + uOQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAU + LhYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6 + Ynf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVO + HQzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44 + Md3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhR + iIl23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGG + YUmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK + 6YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXs + vGGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS + 58CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN + 8IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430 + wD2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiX + joGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxoj + dympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxp + BKXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3Emu + FVcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dt + Q3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDg + UOhz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe + +a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOm + stFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5ef + V1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4 + UVCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo + +swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR + 00bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6 + XbktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLU + JwH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5 + K1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQx + GMSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCm + oHLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYj + GVIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9Gph + GWIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJu + HNGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZ + WBOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHF + cWWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFF + qxh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMW + V8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGW + JxczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC +ROLE:Developer +SOUND;ENCODING=b:UklGRiQgAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAgAA + B/f39/f39/f39/f39/f4B/gH+Af4CAgIGBgYGBgYGBgYGBgYGBgYGBgIGAgICBgYGBgYGBgYCAg + YGAgICAgICAgIGBgICAgYCAgICBgICAgICAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAf4CAgICAgICAgICAgICAgIB/f4CAgICAgICAgIB/f4B/f39/f39/f3+AgICAf4CAf3 + 9/gIB/f4CAgH9/gICAgH+AgICAgICAgICAf4CAgIB/gICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgIB/gICAf39/f39/f3+Af4CAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgH9/f39/f39/f39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYCAgICB + gICAgYGBgICAgICAgICAgIGAgICBgICBgYGBgYGBgYGAgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYG + BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgYGBgIGBgYGAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgH+AgICAgICAgICAgICAgICAgICAf4CAgIB/gH+Af4B/f39/f39/f + 39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYG + BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY + GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAgIGBgYCAgICBgYCAgYGBgYCAgICBg + YCAgICAgICAgICAgICAgIGAgICAgICAgICAgICAgYGBgYGAgICAgIGBgYCAgICBgYGAgICAgIGA + gICAgICAgIGBgYCBgYGAgYGBgYGBgoGBgYGCgoGAgICBgYGBgYCBgYKCgYGBgYGBgYGAgYGBgH9 + /gIB/f3+AgIB/gH9/gICAf4CBgYB/f35+gIB/f4CBgX9/gYCAgYKCgYCAgYOBgICAgoGAf4GCgn + 9/gIB/gICBgH5/f4GAfX+BgYB+fn9/fn+Afn6Af39+f35+fn9+fn6AgH9/f4CAgYCAgYKCgH9/g + IKBf3+AgYJ/f4GCg4F/gIGCgoOBfoCDgYF/fH+BgYGAfn6Af4CCgn58gIN/fX+AgICBgYGAgYCB + goOCgICBgYB/fXyBhIGAgH5+f4GBgX9/f35+gIKCgXt9goN/f318f4GAf4B/fHt9fn5+fXx+fn5 + /gH9+fHx/gHx9f4CAfn18gIB9e4GBfn5+foCBfHyAgoGAfX6CgYCBgH+DgHt9gYN/fX2BhYB7en + 6AgH98foKCgH18foCAfoCAf4CAf31+fn+AgH1+goJ/fX5/gIKAgIGAfH6CgX17foCBf3+BgoB/g + YOBgIB/f4KDgoJ+e3+ChIOBfn1/gX+BfX2BgH59foCCfn1/gX99fICAgoB/f39/gISCf36AgoSB + foCBgYGAf4CCf4CCgX5/gYKDgYB/gH+BhIOBgYB/gIOEhIF9foGCg4OBgICBgoOCgICChIOBg4O + CgoSDgoKAgYKBgoODhISBf4CCg4SEgoGCg4SEgH6BhIWEgX+EhYKAgoKFhIB+gIKChYKAgYOCgo + B+gYWFhIKAg4WEg4ODhIWFhYaGhIWGhYWGh4eHhYOCgoSFg4B/gIB+fX1+fn57e3t7fHt6fH5/f + 4GDhYiMkJGQj5GVmZycmZiXlZGIfXRwcnZ4d3Nva2hoamppaWxvc3R0dXl+iJCPjZShqrCzvNHi + rFYxOmKSrJ6UmJOAbV1ZboSMjI6JfnNjW2JweYGFg4B/e3Z0c3Btc3p9fHp4fIGBf3+Dh4qLjJG + YnZuWkY6MhnpwbnN6fHlya2hlZmdmaW9ycXFzd3t/g42cpquzvMzd/sRADiBZkL6xpLa1jFpANV + iHoJ2ioJWGbEQ2VHaOm5aHhIFuYmZzgoVxZFxfdJCSgnt/kKewr7bDsopcSV6JopyRjpOQfmNXZ + HmGhYB8fXtvXExKXnyKgnJsc3t8fZC0ysfK0+vHTxEeXY6yr6rAxJRSNTdbh5+fp7KjglQ6PVx3 + ho6Ph3dmW15oa2x0hIuNkK3R18jJ0Ys8LUlxkqais8WtdlBFT2yDjpywro9mS0VVaXaBiIdyX2J + rcG5udYKKjaXT4dfV2Y82JkBpiaKkvdO2eE9GTGZ4hZu6u51yTUNOX2l9kZWKdl5PXG93dHeAip + KZut7j2tacRjJIYHCOo77XvoRdVlFYZniVuL+kfl9ST1Rcb4mTjoNxW1pqdXd5fH6CiKHN4d7k2 + 4E4N05Yaoqo1eO0emVbTU5ZdKDCuZV9b1tMSVlyiYp8dHl7cmpqdYCCgIqixNTR2OqnRTlPXFt3 + ksbnw4lzcFdKS2KMtLWZiIZwV0lPZXZ1b3uNinZqbXJ3dX2XxOPg4/zDUDRCTUhmiMXx1p+If1g + +O1J7pK+yspN3W0pGVGdugYmCen54b21rb3V9i6vZ7vD92WpAS0gzSny04tq3qp5qPDhHX3uVrs + KukXVhT0hRYnF/gnuCh31ubG9zdHeMs+Dr8P7KalFVOylJeq7QzMPIqmtIRUZOY4KovqicknhZS + 1BWXWh6gIeLiH91b21vc4GcyuXt/umTZGhGIjJfh6y+yt7LkGlfTD1GYYOipKKwnXhkXldVUFhs + dYOMjYWBem9ucoCWvNTm9+2weHdZMSpQboujvtnUrY6BZEdDUmV4jZypppeFd2dcWVFWWWh8hYS + Ii393c3Z7iJ3A1ePp3aGDfVYyOVZkfJe5zsavpJNsU1BTVmR9kpmcn5uGdGxoWU5VVGZ0fIKLh4 + F/d3Z6g4ufuc3e3depjoViPz9VWm2FqLu8tLGifmphWlJZbH+Lj5+elod+c19WU0xUZW11gISEg + nx6e3h6g4qWp7zM3NrSpZGIYkRFVVVlfZ6vsbW3qIl7b2BUWGVwe4ybn52TkIRuX2BVRVFjZmp7 + hIF9fX12cnZ6eX6LlZyousfP0c++jot6X0ZRXF9sgaCnqa6yn4eAdGZZYGlvd4mcnqCWnY91aWN + cSUtYYmJxf399f351cXFzcHF4foOIlZ+hp7CytLm8uLKNg4RtYF5oanN8j5qZnqGaioV9dGpqb3 + J1f42Rk5iZjIKAcmFcW1RXYGhwdXt+e3Z2c25tcXJxd3yChY2Tl5udn6Gho6ioq6uonoaHbWNzZ + GdxgoGPlZqdj5CJgHFzcWxwdH1/hYqOioSFfnFpaWBdX2Jqb3N5fHh4eHNxcXFxc3d7foOJjI6Q + lZOSlZOTl5eYnJucnpyZkYiEfnd1dnZ5fYKHio6QkIyHg394dHRzc3Z5fHt2enJrcG5obG9sbW9 + ucHJzdnh3eXp5eXt9foCDhoeJjI6OkJGSk5aYmZudn6Gjn5qLh4J3cnJ0dHR5g4GEi42Ih4aBfH + h4dXR1eHl4dXhuaW5rZ2ltaWttbW5vcnR1dHZ2dXV2d3d7fn+BhIeIiYuOjpCTlJWZnJueoKarr + ZuJhntvaW1ucnh+hIWJi4qFg4F7d3V1c3R3fH1/gHlvbXJnXmdpYmdtamtxcW9vbm9tamxtbG5z + dXZ5fHx7fX9+fH6AgoWHioyNj5CRlZeYmp2TiYyGenp9eXh9fX19foB/fH1/e3p8e3l5e3x7e3x + 6d3FxcnBwcG9vb29vb29wb25tbWxsbW5vb3Fyc3N1dXV1dnd4ent9fn+BgoGAgoWEhoqJiYyLi4 + yPioaLiYSEh4WDhIOCgoKAgX58fXx5eXp4eHl4dXZ1cnN0dHR1cnJycXBxcnJycW9ubGxsbW1ub + m5ub29vcXNzdHZ2dXh6enp+fn5/gYCBhIKFiYeGiomJi4qKjIuLjIyLiomKh4aKioeIiIWDgYB9 + fHx7e3l4eHh2dnd3d3l7enp6enp5ent7e3x7enl6e3t7fHx7e3p8fX5/gIKDg4GCg4KCg4OEhoe + Hh4iJiomLjIqLi4uLi46Pjo2OjouJiomHh4aDgH9/fXp5eXh3d3h4eHh4d3V2d3Z0dnd0dXd3d3 + p7fH59fX19fH5+fn+Af4CAf3+Af359f4KDgoSIiIeJjI6PkJOUk5SYmZiYmZqZmJqamJiZmJaWl + ZSTkZCQj46Ni4qHh4iFgoKBfn9+fn+AgYCAgYOCgoSEg4SFhIODg4OCgICBf35/gICAgYKCgYGD + hIOBgYOCgYGAgIGBgIGCgoKBgoSEg4KCgH9/f318fHt6e3t7enl5eHh5fH18foCAf4GDg4OFhoa + GhoeJh4aJioiIiYiIhoWGh4aGh4eHiImHh4mIiIeHh4iIiIqJioqJh4mKh4eJiYiHh4eHhoWGhY + OEhYWEhYWDg4SFhYWEg4SDgYKCgH+AgICBgoOCgYGBgYKEhoaGhoiIh4eJiYmKioqKiomKioiJi + oqJiYmJiIiIiYiHh4eHh4eGhYWFhISDgoKCgoKCgYGAf31+fXx9fn58e3x8fHx9fX19fX19fX19 + fHx9fn5/gICBgYGCgoKCg4OCgoODgoKDg4OCgoKCgoGBgYGBgYGCgYCBgIGCgoKDg4KCg4OEhIS + FhYWFhYWFhYWFhoWGhoWEhISDg4ODg4ODg4ODg4SDgoKDg4OCg4SDgoKDgoGBgoGAgIB/f35+fn + 9+fn9/f35+fn5/gICAgIGBgYKCg4ODg4SEg4OEhIODhIODhIODg4ODg4OCgoKBgoKCg4OCgoODg + 4ODg4OEhISEhIWEhIWFhISEhISEhIWEhISEhIODhISEg4ODg4ODg4ODg4ODgoKCgoKCg4KCgoKC + goKCgoKCgoOCgoKCgoKBgYKCgoKCgoGBgYGAgICAgYGBgYCAf39/f39/f3+Af39/f39/f39/gIC + AgIB/f39/f39/gICAgIB/f39/gIB/f39/gH9/f39/f39/fn5+f39/f39/fn5+fn5/f39/f39/fn + 5+fn9/f39/f35+fn5+fn9/f35/f39+fn5+fn9/fn5+fn5+fn5+f39+fn5+fn19fX5+fn5+fn5+f + X5+fn5+fn5+fn19fn5+fn5+fX19fX59fn5+fn19fX19fX1+fX19fX19fX19fX19fX19fX19fX19 + fX19fX19fX19fX19fX19fX19fX19fX19fXx9fX18fH19fXx8fXx9fXx8fHx8fHx8fH19fX19fXx + 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX + 19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f + X19fX19fX19fX19fX19fX19fX19fX19fX1+fX5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ + fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f3 + 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f + 39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ + f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/f39/f39/f39/f35+fn5+f35/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+f + 39+fn5/fn5+f39/fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ + f39/f39/f39/f39/f39+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f4CAf39/f39/f39/gIB/f39/f39/f4B/f4CAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgIB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgIC + AgICAgICAgICAgICAgICAgICAgICAgIGBgYGAgYGBgICAgIGAgICBgYGAgYGBgYGBgYGBgYGBgY + GBgYGBgYGBgYGBgYGBgYGAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf39/gH9/f + 3+Af39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4CAgH9/gIB/f39/f4B/f3+AgICAf4CA + gICAgICAgICAgICAgH9/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgIB/f39/f39/f39/f4CAf39/f39/f39/f39/f39/f39+fn + 9/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fn5+fn5+fn9/f39/f4CAgICAgICBgYGBg + YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgYGAgICA + gICAgICAgICAgICBgYGAgICAgICAgICAgICAgICAgICAgICAgIB/gICAgH9/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgICAf39/f39/gH+AgI + CAgICAgIB/f39/f39/f4B/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn9/f39/f39/f39+f + 39/f39/f39/f39/f39/f39/f39/f4B/f4CAgICAf39/f39/gICAf39/gICAgICAgICAgICAgICA + gICAgIGAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICBgYGBgYGBgYCBgYGBgYCAgIG + BgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAf3+AgIB/f4CAf39/f39/f3+AgICAgH+AgICAf3+AgICAgICAgH9/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/gH9/gICAgICAgICAgIB/gICAgH+AgIB/f39/f39/gICAgICAgH9/f3+AgH9/f4B/f + 39/f39/f39/f39/f3+AgICAgICAf3+AgIB/f4CAgIB/f4CAgICAgICAgICAf39/f3+AgIB/f4CA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf39/f39 + /f4CAgH9/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/gIB/f39/f39/f39/gH9/f3 + 9/f4CAgICAgIB/gICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf4CAgICAgICAgIB/gICAf + 4CAgICAgH+Af4CAgH9/f39/f39/f39/gICAgICAgICAgICAf39/f39/f4CAgH9/gICAf3+AgICA + gICAgICAgICAgICAgICAgICAgIB/f39/gIB/f4CAgIB/f4CAgH9/gICAf39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAf39/gH9/f3+AgH9/f39/f39/f39/f39/f + 39/f39/f39/f39/f39/f39/f39/gICAf3+AgH9/f3+AgH9/f4CAgH9/gICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICBgYGBgIGBgYCAgYGAgICAgYCAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAf39/f39/f4CAgIB/f4CAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAf39/f3+Af39/f39/f39/f4B/f39/f4CAgICAgICAgICAgA== +TEL;TYPE=HOME:0351 223344 +TEL;TYPE=WORK:0351 443322 +TEL;TYPE=CELL:0173 223344 +UID:P9HXg34Oav +URL:http://www.mustermann.de/~heiko/ +VERSION:3.0 +X-KADDRESSBOOK-X-Anniversary:1982-07-07 +X-KADDRESSBOOK-X-AssistantsName:Mr. Smithers +X-KADDRESSBOOK-X-Department:Edutainment +X-KADDRESSBOOK-X-IMAddress:122334455 +X-KADDRESSBOOK-X-ManagersName:Mr. Burnes +X-KADDRESSBOOK-X-Office:223 2nd stage +X-KADDRESSBOOK-X-Profession:Clown +X-KADDRESSBOOK-X-SpousesName:femal clown +END:VCARD + diff --git a/autotests/data/vcard5.vcf.ref b/autotests/data/vcard5.vcf.ref new file mode 100644 index 0000000..531271f --- /dev/null +++ b/autotests/data/vcard5.vcf.ref @@ -0,0 +1,312 @@ +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=home,pref:;;Buehlauer Strasse 45;Dresden;Sachsen;01327;Germany +ADR;TYPE=work:;;Prager Strasse 55;Dresden;Sachsen;01066;Germany +BDAY:1955-07-19T00:00:00Z +CATEGORIES:Friend +CLASS:CONFIDENTIAL +EMAIL;TYPE=PREF:heiko.mustermann@freenet.org +EMAIL:heiko8@tst.inf.tu-dresden.de +FN:Mustermann\, Heiko +GEO:19.283333;166.616669 +LOGO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVU + AAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7aC + YMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k27 + EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7DT + 7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACpV + sZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSgA + A15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlRL + vEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrLc + 9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgBM + vSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMPs + P7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gvq + NSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL5 + 4WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kvy + d0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jyb + kfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq7 + aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0omA + ACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy3 + w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw0 + 9IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQO + crOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6z + E+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO+ + OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuDa + ANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbij + o19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGtV + X2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB6 + 79OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaPm + 8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqici + biYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2aT + JtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYIl + x36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30u + OQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAUL + hYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6Y + nf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVOH + QzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44M + d3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhRi + Il23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGGY + UmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK6 + YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXsv + GGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS5 + 8CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN8 + IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430w + D2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiXj + oGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxojd + ympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxpB + KXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3EmuF + VcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dtQ + 3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDgU + Ohz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe+ + a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOms + tFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5efV + 1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4U + VCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo+ + swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR0 + 0bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6X + bktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLUJ + wH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5K + 1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQxG + MSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCmo + HLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYjG + VIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9GphG + WIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJuH + NGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZW + BOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHFc + WWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFFq + xh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMWV + 8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGWJ + xczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC +N:Mustermann;Heiko;;; +NICKNAME:clown +NOTE:I'm a friendly note text\,\nplease copy me to your address book... +ORG:KDE +PHOTO;ENCODING=b;TYPE=image/png:iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pV + UAAAOW0lEQVR4nO1df2hb1xX+OlyQwQEJXJAgBQlaiEwDsdqO2l1H47RjMe2gbjOoszG2dozG7a + CYMIqTjS7NYKSmbE1StsQpWxMXmsSF1WhlTeSwJlZY06gsSVXWUAkakKAGPajBDxrQ/jjnez8k2 + 7EjJdyU+/0jPz29X9L57jnnO+deAxYWFhYWFhYWFu3Hbe082XT2ZF3+WgAAdHZ0AgBqTg0A4H7D + T7oAgNSdKQDAg99/sK33caPB53RqFQBA5PYIAMBdkOf6yc9+ct3P852W786irWjJMs/8+0wdACp + VsZTS50V5vSLb1UoVQMCCvnFDx0c65f3BHw4CABJ3RL19mwYfM4Y1e/+0V5h/VbbPXzwPACiVSg + AA15XnikVjAIB44Dli3TIKjL+2e0XPYxliGFZshSdzZ+r8OyKGjdl8AQCQfe84AKBaFUaUrojlR + LvEUpx5h0eGjo9EZH+kQ7Yz9/d71+vdkAYApO+W16d+/NQNZ8ye8T11ACiV5TkcR5jufCX3XyrL + c9XmxUe6bvi5XH3OaNRnSKRL9vWsywAAstNTyz6HZYhhsD+IYbjmMPDxfz6uA0BMqQcAR96eAgB + MvSevtTkJa6tzQnVSNn2XOLSZ03ljHHQ7MLxlSIa2kg5pOrTVHHHu/hANRDrke4t2y3cy+KgEMP + sP7F/0O7EMMQzXtNxLn16qA8DUu1nvvcm3DgEAFlxxbo4jFpFYK4woXix8qxhxLYxuH6sDQG5Gv + qNSueLtcxwdNTTASemoUTi3+HdkGWIYlrTkj2clzC1ckGRv3xv7vH2VK7QAlUDuktA0f/bG+YpL + 54WpDDXv7TdPbjm472AdACbe9L+r4mdMHuW+42uTAIByuWwZciugY6kdER3zzn8iMkFt3pc93Kv + yd0QzvHYxI5h8Qq/BiK1YLur78nJw4mBIznj2V88ueg+HjxyrA0BEdE7EumLePp773u/e25b7jy + bkfAObh7z3SleELS40SVZ/u+2F0ToA7H99PHRtyxDD0GQZZ9RKKxUZ+/YdmAAAFD4peJ9hbF2dq + 7aHGSpn12p+dJI7PQsAcDS3YcxfmZPXnrt65F40P+pd3wsgwF69x/xHedlWNkfX+PlUep0ck0om + AACxO+R10w82tfRch8leAJOas82ek+cho/sfkGtnT8xYhpiMJh9CiytVZayjYIgO37KCmWgrOPy + 3w3UAKKpsf/zd496+wkVhpOu5Lje0XS6X9X5lbJ49KxZIJqSSEu+Xrsj9V1Xw5OcBIPJBDoCfPw + 09IVn0sanpOgA8NXR9JYBILO7/rd8n/RV9SM1tPg6wDDEOTQxhFEKLYjbuBljBX9tjzyox/Q+xQ + OcrOf7I20cAAIVz+cCnVNJu8Alo3Nb43nEjoSfa8dIOAMDs6Zy+3wcAyM3kvCtUyZ6qXLd0WZj6 + zE+fAeAX4FZbYo5Fmt9zXfeanwEsQ4xDE0Nqbi203ZhztANVZUb2PdF+imqZLgLX0OvSd7lLbPO + +OFan1B8wGotEE3pCYfpWtX4A2L1rZ+gcHN+Pa8EtEpX3mR9tGlieKSf/dVJ9Ysl7j/fhMYTfuD + aANMIyxDA0Z+r6Qy7MC1Mi3lge1PijTYetBNNTkjUfOjQJAMi+LzE6S7nJtX50krknE74hZQZbi + jo19U7eKcfQAKuaP7lam+hRdZXl19kZX7Xe+PBG2acM7YzE9Bpi1UfeFN9G7Y6+77EfLR59UdGt + VX2G8D7IEPrf7PtZq2XdCmhiCBsUYnGxLJfxP5rzkI0Pb6wDwMypmWXHVupOk0eFEfQZIy+MAQB + 679OGhnSvd0yk4c5o4c7Xamlrwj7Nqck9uVf5eblGVnONqIY1W38+4h3DyJH1i6j6jFi3+B1GaP + m8RGFsa9qrqu7zI6KfHXtHmM8KKq8ZfNZg/rMcLEMMQ5NlH/zLwVDz28SbomVRUxI0RDZJZrqic + ibiYmHFz8Q6cmox6bR8bsfOVwD44ylzH47dgK9lTf5dqpOzZ0V1Hnh0AIDfXMdmO7Zx0h8MaO2a + TJtQf7D16Se9a9CS0+uEofQVmV7ZjqhPmXhrIvQcnV2doeemv6UfIysAeNoVg9TMfdLqZH3ILYI + lx36Oi/v+Knp+/mwhsFfHcR0X2W3Su0Gy4ZrG3tU5GaOHtwhzXv3jqwB8ZgFiaezamFVWAMDO30 + uOQAsjfvFL8QHpdFLOoPE8FQXG99UvxecMbhameOrCnB8tbh0WtjA3IZuYl6TXC1PoY/b9eRwAU + LhYDH3emXdD20EwX4p3SzS4VKWQsAwxDPYHMQxLlnDpJNlbSyEO8BvjvDKrJnZFlcxJ+biGkRT6 + Ynf45VMAqHypXfMa0uY+8JM2Fpycr+QzfQ+JM0+nhPoMBHit3FFxuHT6FB8rGsYnusWZVsoBAVO + HQzrlkoqlcW1qSyQkOMmsE+c9sk2Gy+d//Xzo+Ago40RD3wsARKMrG6oIyxDDsCRDOAtodLsU44 + Md3QtXKcnzLGELoXN7cos4y3jcl0QAYOFrOZ4ySLGooWqgOYBs4XVp+Qw9i2XZX1GyZtIJvQdhR + iIl23S4ntgYSNB67xcWTs2ouDmn97FRrlX6MlzUSt8jo8XQlq0AgMm3J8Ln1OfmnBBg9U2DliGG + YUmGEON7pE1lVNtWAGD2IwlPK1fF6jhziGMxE8eR54QhnWtUatY5hpS5ixfCPmexsDHRLedOeDK + 6YOARsdLxabHqVJIiozbvqQzvsZnvJ33r7dkgfuXQBWHC6NMSIrvqZ+grOTOsX+evPLlZRMlCXs + vGGsZn1osgOt7Q2rMaWIYYhmsyhAj+6tue2ybNZ59ruVfl5k614igL+90NvoNz9LT5jkJgKiVWS + 58CAOVSGYAv9FU0eezXaItsHHkkCQBI360RnDKBzODx7iKNGcPa1FCZk3JArZzT53FC5yB4DxGN + 8IY04d3+m+23AcDMqZmma6wWliGGYcUMCWL/G+HJJsNbhkPtPBxrGwv5pcufAgDcrzlPXayX430 + wD2GMTx/CQlkqqUzokGO8MpZGUwtagqbASTAScuZ8ATOVlGa7wT6Jnnb/QacTaO4CFR0JFsXiiX + joGrte3lUHgJ2/29ly46BliGG4LoY0YvLoZMgyjr9zXCKyTrEozuemsEfRjtEZfUq+4MvWjFxoj + dympTNqamq+iKjP8LJlln6VGQGxkj4hpS2lbJYeXC++xZuQpOxjO2hCi3f0lSxVtAOWIYahLQxp + BKXmijJjQed1R9nbptbNAhbbgRBoQYomxAobW0M5jvuWrpGQRj7MyFlsYg6RSDCS863ZnZf3Emu + FVcNPDMv9/FNKsfsPHAoxf/RFmbpWLLBtVa5JNvY90FcHWpueYRliGNrKkC/+90Ud8EucLjR7dt + Q3qALLaCz7vsT9nO6V7vVXcqBi6jYUqHB7wyvCDWccz6kGpFU1ZqNCENWaKAWOMjZzn8RsbOTDg + UOhz690vZJWYBliGNr6i1/6r0zM9LQqVXGZI3yqeQjfZ4ae2SCWyaY3QbhldOB7kqHHEuGaSiNe + +a3UXlh2zeiaKYOPS7nW19uA8dekPB3TXGf0xVEAgXKv1oCok+VOCcs2DbY2oWc5WIYYhrb4kOm + stFgWL0tUlf9QNB0ygcwoXw5XzQY3D9YBIK7M4MQZwM87HM1dSmzP1KgrFgv7joUFNjlwqSF5ef + V1YUHurFj32PYx75gdL+uUhbyuf6UZeq9WFznJv6KqL33fjYRliGFoiSGc0FLUxQW8VsolmsAa4 + UVCSRnng1PlqBPFNO/gKnVs76RP6WRuo35q6HHJsqkKsPZOto7v2e1dY+QF8RkDfaqIdZCVmsOo + +swIjbX/GwnLEMPQEkPatZoomdE47QsAoHX6aDRcm+B4X/K6YbT+oYxg/ZttopzKxsmhgF8zrzR + 00bDjhp/l8iL508s3lbcDliGGwf4ghsGIFXWONaxHAvgrDMVUhmGLEfuA4xoiT70rgQQdrteBr6 + XbktcoF94G/GY6hrO5U9pipAEAz1mttmfFipXAMsQw3BD5fbVwuJbUGl868UJMXdNEa0eIdocLU + JwH8souSfI8eV7DYcr2lPqDgUNlPtzKSqawIMXQ+3rn418PLEMMgxE+hNirCxkDQK82SrgqBqY5 + K1eZUanK+94ahrpaUfGCyCCDm0VMpDBImb4SaHKgD/FWFVVmMGFl6Tl3Qgpok0eXXwS5HbAMMQx + GMSSIsZekXNp7v8zKymzo0T26WpHO42MjNxsmGHWx6a6/rz/0uWDBi+coFJRdnDHLiI4rTqxQCm + oHLEMMgxFR1mJgMOQ1YHO7S14b1zQhQ5iHsLXoiM6g9SbTICDPdIRbiLw5kyqpNK72djNgGWIYj + GVIPB5e+cBrauvSdh5tGWKbEHMJFrn6HxDf0bNOfE+Na7cEWaFPT+m+oNMjip9J/pE90Xrz9Gph + GWIYjGUIW/zZyMysOcrGuTjXVAwXjbgST0WjKbZ70nXkC77VFy9r/jEXZteC077W0NXCMsQwGJu + HNGJsp+QlfZqXsHWHKi4n1xS0YZvToWc+lPLr+U+k2BSqgV31MnNjvgfLEMNgjGWsFFytiM3WcZ + WBOUWgoj6kqv/Ii00RXBm7GljViBFXwaD/d2IZYhiMjbKWgreUhlb3OAFz4CHZz6aGWHd4hTnHF + cWWjeBAeJKpKbAMMQy3HEO45Mfecfl3qNSyuB5iRtt/XP43hK5w3nK+4rcBNa7FZQIsQwyDMdFF + qxh9UZb+6HtIlr1wF8SHFM6JPsVGueDiMzej8W21sAwxDPYHMQy3nFNfCmltrKuWRDrhv0HlUMW + V8Rrn1JsGyxDDYLS1XA927ZZWooL+MzC29sycuHmNCq3AMsQwfGt8CFHISwEqskbDWwPlkeVgGW + JxczH20lidTXe3AixDLCwsLCwsviX4P68/8cprSSqmAAAAAElFTkSuQmCC +ROLE:Developer +SOUND;ENCODING=b:UklGRiQgAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAgAA + B/f39/f39/f39/f39/f4B/gH+Af4CAgIGBgYGBgYGBgYGBgYGBgYGBgIGAgICBgYGBgYGBgYCAg + YGAgICAgICAgIGBgICAgYCAgICBgICAgICAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAf4CAgICAgICAgICAgICAgIB/f4CAgICAgICAgIB/f4B/f39/f39/f3+AgICAf4CAf3 + 9/gIB/f4CAgH9/gICAgH+AgICAgICAgICAf4CAgIB/gICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgIB/gICAf39/f39/f3+Af4CAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgH9/f39/f39/f39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgIGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYCAgICB + gICAgYGBgICAgICAgICAgIGAgICBgICBgYGBgYGBgYGAgYGBgYCBgYGBgYGBgYGBgYGBgYGBgYG + BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgICAgYGBgIGBgYGAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgH+AgICAgICAgICAgICAgICAgICAf4CAgIB/gH+Af4B/f39/f39/f + 39/f39/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYG + BgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgY + GBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAgIGBgYCAgICBgYCAgYGBgYCAgICBg + YCAgICAgICAgICAgICAgIGAgICAgICAgICAgICAgYGBgYGAgICAgIGBgYCAgICBgYGAgICAgIGA + gICAgICAgIGBgYCBgYGAgYGBgYGBgoGBgYGCgoGAgICBgYGBgYCBgYKCgYGBgYGBgYGAgYGBgH9 + /gIB/f3+AgIB/gH9/gICAf4CBgYB/f35+gIB/f4CBgX9/gYCAgYKCgYCAgYOBgICAgoGAf4GCgn + 9/gIB/gICBgH5/f4GAfX+BgYB+fn9/fn+Afn6Af39+f35+fn9+fn6AgH9/f4CAgYCAgYKCgH9/g + IKBf3+AgYJ/f4GCg4F/gIGCgoOBfoCDgYF/fH+BgYGAfn6Af4CCgn58gIN/fX+AgICBgYGAgYCB + goOCgICBgYB/fXyBhIGAgH5+f4GBgX9/f35+gIKCgXt9goN/f318f4GAf4B/fHt9fn5+fXx+fn5 + /gH9+fHx/gHx9f4CAfn18gIB9e4GBfn5+foCBfHyAgoGAfX6CgYCBgH+DgHt9gYN/fX2BhYB7en + 6AgH98foKCgH18foCAfoCAf4CAf31+fn+AgH1+goJ/fX5/gIKAgIGAfH6CgX17foCBf3+BgoB/g + YOBgIB/f4KDgoJ+e3+ChIOBfn1/gX+BfX2BgH59foCCfn1/gX99fICAgoB/f39/gISCf36AgoSB + foCBgYGAf4CCf4CCgX5/gYKDgYB/gH+BhIOBgYB/gIOEhIF9foGCg4OBgICBgoOCgICChIOBg4O + CgoSDgoKAgYKBgoODhISBf4CCg4SEgoGCg4SEgH6BhIWEgX+EhYKAgoKFhIB+gIKChYKAgYOCgo + B+gYWFhIKAg4WEg4ODhIWFhYaGhIWGhYWGh4eHhYOCgoSFg4B/gIB+fX1+fn57e3t7fHt6fH5/f + 4GDhYiMkJGQj5GVmZycmZiXlZGIfXRwcnZ4d3Nva2hoamppaWxvc3R0dXl+iJCPjZShqrCzvNHi + rFYxOmKSrJ6UmJOAbV1ZboSMjI6JfnNjW2JweYGFg4B/e3Z0c3Btc3p9fHp4fIGBf3+Dh4qLjJG + YnZuWkY6MhnpwbnN6fHlya2hlZmdmaW9ycXFzd3t/g42cpquzvMzd/sRADiBZkL6xpLa1jFpANV + iHoJ2ioJWGbEQ2VHaOm5aHhIFuYmZzgoVxZFxfdJCSgnt/kKewr7bDsopcSV6JopyRjpOQfmNXZ + HmGhYB8fXtvXExKXnyKgnJsc3t8fZC0ysfK0+vHTxEeXY6yr6rAxJRSNTdbh5+fp7KjglQ6PVx3 + ho6Ph3dmW15oa2x0hIuNkK3R18jJ0Ys8LUlxkqais8WtdlBFT2yDjpywro9mS0VVaXaBiIdyX2J + rcG5udYKKjaXT4dfV2Y82JkBpiaKkvdO2eE9GTGZ4hZu6u51yTUNOX2l9kZWKdl5PXG93dHeAip + KZut7j2tacRjJIYHCOo77XvoRdVlFYZniVuL+kfl9ST1Rcb4mTjoNxW1pqdXd5fH6CiKHN4d7k2 + 4E4N05Yaoqo1eO0emVbTU5ZdKDCuZV9b1tMSVlyiYp8dHl7cmpqdYCCgIqixNTR2OqnRTlPXFt3 + ksbnw4lzcFdKS2KMtLWZiIZwV0lPZXZ1b3uNinZqbXJ3dX2XxOPg4/zDUDRCTUhmiMXx1p+If1g + +O1J7pK+yspN3W0pGVGdugYmCen54b21rb3V9i6vZ7vD92WpAS0gzSny04tq3qp5qPDhHX3uVrs + KukXVhT0hRYnF/gnuCh31ubG9zdHeMs+Dr8P7KalFVOylJeq7QzMPIqmtIRUZOY4KovqicknhZS + 1BWXWh6gIeLiH91b21vc4GcyuXt/umTZGhGIjJfh6y+yt7LkGlfTD1GYYOipKKwnXhkXldVUFhs + dYOMjYWBem9ucoCWvNTm9+2weHdZMSpQboujvtnUrY6BZEdDUmV4jZypppeFd2dcWVFWWWh8hYS + Ii393c3Z7iJ3A1ePp3aGDfVYyOVZkfJe5zsavpJNsU1BTVmR9kpmcn5uGdGxoWU5VVGZ0fIKLh4 + F/d3Z6g4ufuc3e3depjoViPz9VWm2FqLu8tLGifmphWlJZbH+Lj5+elod+c19WU0xUZW11gISEg + nx6e3h6g4qWp7zM3NrSpZGIYkRFVVVlfZ6vsbW3qIl7b2BUWGVwe4ybn52TkIRuX2BVRVFjZmp7 + hIF9fX12cnZ6eX6LlZyousfP0c++jot6X0ZRXF9sgaCnqa6yn4eAdGZZYGlvd4mcnqCWnY91aWN + cSUtYYmJxf399f351cXFzcHF4foOIlZ+hp7CytLm8uLKNg4RtYF5oanN8j5qZnqGaioV9dGpqb3 + J1f42Rk5iZjIKAcmFcW1RXYGhwdXt+e3Z2c25tcXJxd3yChY2Tl5udn6Gho6ioq6uonoaHbWNzZ + GdxgoGPlZqdj5CJgHFzcWxwdH1/hYqOioSFfnFpaWBdX2Jqb3N5fHh4eHNxcXFxc3d7foOJjI6Q + lZOSlZOTl5eYnJucnpyZkYiEfnd1dnZ5fYKHio6QkIyHg394dHRzc3Z5fHt2enJrcG5obG9sbW9 + ucHJzdnh3eXp5eXt9foCDhoeJjI6OkJGSk5aYmZudn6Gjn5qLh4J3cnJ0dHR5g4GEi42Ih4aBfH + h4dXR1eHl4dXhuaW5rZ2ltaWttbW5vcnR1dHZ2dXV2d3d7fn+BhIeIiYuOjpCTlJWZnJueoKarr + ZuJhntvaW1ucnh+hIWJi4qFg4F7d3V1c3R3fH1/gHlvbXJnXmdpYmdtamtxcW9vbm9tamxtbG5z + dXZ5fHx7fX9+fH6AgoWHioyNj5CRlZeYmp2TiYyGenp9eXh9fX19foB/fH1/e3p8e3l5e3x7e3x + 6d3FxcnBwcG9vb29vb29wb25tbWxsbW5vb3Fyc3N1dXV1dnd4ent9fn+BgoGAgoWEhoqJiYyLi4 + yPioaLiYSEh4WDhIOCgoKAgX58fXx5eXp4eHl4dXZ1cnN0dHR1cnJycXBxcnJycW9ubGxsbW1ub + m5ub29vcXNzdHZ2dXh6enp+fn5/gYCBhIKFiYeGiomJi4qKjIuLjIyLiomKh4aKioeIiIWDgYB9 + fHx7e3l4eHh2dnd3d3l7enp6enp5ent7e3x7enl6e3t7fHx7e3p8fX5/gIKDg4GCg4KCg4OEhoe + Hh4iJiomLjIqLi4uLi46Pjo2OjouJiomHh4aDgH9/fXp5eXh3d3h4eHh4d3V2d3Z0dnd0dXd3d3 + p7fH59fX19fH5+fn+Af4CAf3+Af359f4KDgoSIiIeJjI6PkJOUk5SYmZiYmZqZmJqamJiZmJaWl + ZSTkZCQj46Ni4qHh4iFgoKBfn9+fn+AgYCAgYOCgoSEg4SFhIODg4OCgICBf35/gICAgYKCgYGD + hIOBgYOCgYGAgIGBgIGCgoKBgoSEg4KCgH9/f318fHt6e3t7enl5eHh5fH18foCAf4GDg4OFhoa + GhoeJh4aJioiIiYiIhoWGh4aGh4eHiImHh4mIiIeHh4iIiIqJioqJh4mKh4eJiYiHh4eHhoWGhY + OEhYWEhYWDg4SFhYWEg4SDgYKCgH+AgICBgoOCgYGBgYKEhoaGhoiIh4eJiYmKioqKiomKioiJi + oqJiYmJiIiIiYiHh4eHh4eGhYWFhISDgoKCgoKCgYGAf31+fXx9fn58e3x8fHx9fX19fX19fX19 + fHx9fn5/gICBgYGCgoKCg4OCgoODgoKDg4OCgoKCgoGBgYGBgYGCgYCBgIGCgoKDg4KCg4OEhIS + FhYWFhYWFhYWFhoWGhoWEhISDg4ODg4ODg4ODg4SDgoKDg4OCg4SDgoKDgoGBgoGAgIB/f35+fn + 9+fn9/f35+fn5/gICAgIGBgYKCg4ODg4SEg4OEhIODhIODhIODg4ODg4OCgoKBgoKCg4OCgoODg + 4ODg4OEhISEhIWEhIWFhISEhISEhIWEhISEhIODhISEg4ODg4ODg4ODg4ODgoKCgoKCg4KCgoKC + goKCgoKCgoOCgoKCgoKBgYKCgoKCgoGBgYGAgICAgYGBgYCAf39/f39/f3+Af39/f39/f39/gIC + AgIB/f39/f39/gICAgIB/f39/gIB/f39/gH9/f39/f39/fn5+f39/f39/fn5+fn5/f39/f39/fn + 5+fn9/f39/f35+fn5+fn9/f35/f39+fn5+fn9/fn5+fn5+fn5+f39+fn5+fn19fX5+fn5+fn5+f + X5+fn5+fn5+fn19fn5+fn5+fX19fX59fn5+fn19fX19fX1+fX19fX19fX19fX19fX19fX19fX19 + fX19fX19fX19fX19fX19fX19fX19fX19fXx9fX18fH19fXx8fXx9fXx8fHx8fHx8fH19fX19fXx + 9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX + 19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f + X19fX19fX19fX19fX19fX19fX19fX19fX1+fX5+fn19fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ + fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f3 + 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f + 39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ + f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/f39/f39/f39/f35+fn5+f35/f39/f39/f39/f39/f39/f39/f39/f39/f39/f35+f + 39+fn5/fn5+f39/fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/ + f39/f39/f39/f39/f39+fn9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f4CAf39/f39/f39/gIB/f39/f39/f4B/f4CAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgIB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgIC + AgICAgICAgICAgICAgICAgICAgICAgIGBgYGAgYGBgICAgIGAgICBgYGAgYGBgYGBgYGBgYGBgY + GBgYGBgYGBgYGBgYGBgYGAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf39/gH9/f + 3+Af39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4CAgH9/gIB/f39/f4B/f3+AgICAf4CA + gICAgICAgICAgICAgH9/f4CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgIB/f39/f39/f39/f4CAf39/f39/f39/f39/f39/f39+fn + 9/fn5+fn5+fn5+fn5+fX19fX19fX19fX19fX19fX19fn5+fn5+fn9/f39/f4CAgICAgICBgYGBg + YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICAgICAgICAgICAgICAgYGAgICA + gICAgICAgICAgICBgYGAgICAgICAgICAgICAgICAgICAgICAgIB/gICAgH9/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAgICAf39/f39/gH+AgI + CAgICAgIB/f39/f39/f4B/f39/f39/f39/f39/f39/f39/f39/f39/f39/fn9/f39/f39/f39+f + 39/f39/f39/f39/f39/f39/f39/f4B/f4CAgICAf39/f39/gICAf39/gICAgICAgICAgICAgICA + gICAgIGAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCAgICBgYGBgYGBgYCBgYGBgYCAgIG + BgICAgICAgICAgICAgICAgICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAf3+AgIB/f4CAf39/f39/f3+AgICAgH+AgICAf3+AgICAgICAgH9/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/gH9/gICAgICAgICAgIB/gICAgH+AgIB/f39/f39/gICAgICAgH9/f3+AgH9/f4B/f + 39/f39/f39/f39/f3+AgICAgICAf3+AgIB/f4CAgIB/f4CAgICAgICAgICAf39/f3+AgIB/f4CA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAf39/f39 + /f4CAgH9/f39/f39/f39/f39/f39/f39/f39/f39/f4B/f39/f39/gIB/f39/f39/f39/gH9/f3 + 9/f4CAgICAgIB/gICAgICAgICAgICAgICAgICAgICAgICAgH+AgICAf4CAgICAgICAgIB/gICAf + 4CAgICAgH+Af4CAgH9/f39/f39/f39/gICAgICAgICAgICAf39/f39/f4CAgH9/gICAf3+AgICA + gICAgICAgICAgICAgICAgICAgIB/f39/gIB/f4CAgIB/f4CAgH9/gICAf39/f39/f39/f39/f39 + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 + 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/gICAf39/gH9/f3+AgH9/f39/f39/f39/f39/f + 39/f39/f39/f39/f39/f39/f39/gICAf3+AgH9/f3+AgH9/f4CAgH9/gICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAgICAgICBgYGBgIGBgYCAgYGAgICAgYCAgICAgICAgICAgICAgICAg + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA + gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC + AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI + CAgICAgICAgICAgICAgICAf39/f39/f4CAgIB/f4CAgICAgICAgICAgICAgICAgICAgICAgICAg + ICAf39/f3+Af39/f39/f39/f4B/f39/f4CAgICAgICAgICAgA== +TEL;TYPE=HOME:0351 223344 +TEL;TYPE=WORK:0351 443322 +TEL;TYPE=CELL:0173 223344 +UID:P9HXg34Oav +URL:http://www.mustermann.de/~heiko/ +X-KADDRESSBOOK-X-Anniversary:1982-07-07 +X-KADDRESSBOOK-X-AssistantsName:Mr. Smithers +X-KADDRESSBOOK-X-Department:Edutainment +X-KADDRESSBOOK-X-IMAddress:122334455 +X-KADDRESSBOOK-X-ManagersName:Mr. Burnes +X-KADDRESSBOOK-X-Office:223 2nd stage +X-KADDRESSBOOK-X-Profession:Clown +X-KADDRESSBOOK-X-SpousesName:femal clown +END:VCARD + diff --git a/autotests/data/vcard6.vcf b/autotests/data/vcard6.vcf new file mode 100644 index 0000000..92339c7 --- /dev/null +++ b/autotests/data/vcard6.vcf @@ -0,0 +1,10 @@ +BEGIN:VCARD +CLASS:PUBLIC +EMAIL;TYPE=PREF:email1@abc.de +EMAIL:email2@abc.de +FN:Test User +N:User;Test;;; +UID:uJTkVqH5Qt +VERSION:3.0 +END:VCARD + diff --git a/autotests/data/vcard6.vcf.2_1ref b/autotests/data/vcard6.vcf.2_1ref new file mode 100644 index 0000000..d5a5a9b --- /dev/null +++ b/autotests/data/vcard6.vcf.2_1ref @@ -0,0 +1,9 @@ +BEGIN:VCARD +VERSION:2.1 +EMAIL;PREF:email1@abc.de +EMAIL:email2@abc.de +FN:Test User +N:User;Test;;; +UID:uJTkVqH5Qt +END:VCARD + diff --git a/autotests/data/vcard6.vcf.ref b/autotests/data/vcard6.vcf.ref new file mode 100644 index 0000000..712afe7 --- /dev/null +++ b/autotests/data/vcard6.vcf.ref @@ -0,0 +1,10 @@ +BEGIN:VCARD +VERSION:3.0 +CLASS:PUBLIC +EMAIL;TYPE=PREF:email1@abc.de +EMAIL:email2@abc.de +FN:Test User +N:User;Test;;; +UID:uJTkVqH5Qt +END:VCARD + diff --git a/autotests/data/vcard7.vcf b/autotests/data/vcard7.vcf new file mode 100644 index 0000000..8b5be8e --- /dev/null +++ b/autotests/data/vcard7.vcf @@ -0,0 +1,7 @@ +BEGIN:VCARD +N: +LABEL;QUOTED-PRINTABLE;WORK:401 Park Drive 3 West=0ABoston, MA 02215=0AUSA=0A= +Herecomesyetanotherline +UID:pas-id-3E136F9B00000000 +END:VCARD + diff --git a/autotests/data/vcard7.vcf.2_1ref b/autotests/data/vcard7.vcf.2_1ref new file mode 100644 index 0000000..5d4e702 --- /dev/null +++ b/autotests/data/vcard7.vcf.2_1ref @@ -0,0 +1,8 @@ +BEGIN:VCARD +VERSION:2.1 +LABEL;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE;WORK:401 Park Drive 3 West\n + Boston\, MA 02215\nUSA\nHerecomesyetanotherline +N:;;;; +UID:pas-id-3E136F9B00000000 +END:VCARD + diff --git a/autotests/data/vcard7.vcf.ref b/autotests/data/vcard7.vcf.ref new file mode 100644 index 0000000..b099b98 --- /dev/null +++ b/autotests/data/vcard7.vcf.ref @@ -0,0 +1,8 @@ +BEGIN:VCARD +VERSION:3.0 +LABEL;TYPE=work:401 Park Drive 3 West\nBoston\, MA 02215\nUSA\nHerecomesye + tanotherline +N:;;;; +UID:pas-id-3E136F9B00000000 +END:VCARD + diff --git a/autotests/data/vcard8.vcf b/autotests/data/vcard8.vcf new file mode 100644 index 0000000..eff34b8 --- /dev/null +++ b/autotests/data/vcard8.vcf @@ -0,0 +1,8 @@ +BEGIN:VCARD +FN:test +N:test;;;; +NOTE:line one\Nline two\Nline three\N +UID:8OD165Pope +VERSION:3.0 +END:VCARD + diff --git a/autotests/data/vcard8.vcf.ref b/autotests/data/vcard8.vcf.ref new file mode 100644 index 0000000..54f7dbc --- /dev/null +++ b/autotests/data/vcard8.vcf.ref @@ -0,0 +1,8 @@ +BEGIN:VCARD +VERSION:3.0 +FN:test +N:test;;;; +NOTE:line one\nline two\nline three\n +UID:8OD165Pope +END:VCARD + diff --git a/autotests/data/vcard9.vcf b/autotests/data/vcard9.vcf new file mode 100644 index 0000000..c38153b --- /dev/null +++ b/autotests/data/vcard9.vcf @@ -0,0 +1,14 @@ +BEGIN:VCARD +FN:βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγ + δεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεα + βγδ1βγδεαβγδ1βγδεαβγδ1 +N:123ㄓㄕㄖbcdeαβγδαβγδαβγδαβγδαβγδαβγδαβㄤ + ㄓㄕㄖ;;;; +NOTE:Длинный комментарий на русском языке\, + чтобы в результате получилась строка боР+ »ÐµÐµ 70 символов. +PRODID:-//ownCloud//NONSGML Contacts 0.3//EN +UID:20140316T155019.877e370c11@martin +VERSION:3.0 +END:VCARD + diff --git a/autotests/data/vcard9.vcf.ref b/autotests/data/vcard9.vcf.ref new file mode 100644 index 0000000..cbb9ed8 --- /dev/null +++ b/autotests/data/vcard9.vcf.ref @@ -0,0 +1,14 @@ +BEGIN:VCARD +VERSION:3.0 +FN:βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγ + δεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεαβγδ1βγδεα + βγδ1βγδεαβγδ1βγδεαβγδ1 +N:123ㄓㄕㄖbcdeαβγδαβγδαβγδαβγδαβγδαβγδαβㄤ + ㄓㄕㄖ;;;; +NOTE:Длинный комментарий на русском языке\, + чтобы в результате получилась строка бо + лее 70 символов. +PRODID:-//ownCloud//NONSGML Contacts 0.3//EN +UID:20140316T155019.877e370c11@martin +END:VCARD + diff --git a/autotests/data/vcard_extension_case_normalization.vcf b/autotests/data/vcard_extension_case_normalization.vcf new file mode 100644 index 0000000..7262727 --- /dev/null +++ b/autotests/data/vcard_extension_case_normalization.vcf @@ -0,0 +1,18 @@ +BEGIN:VCARD +VERSION:3.0 +FN:My Name +N:Name;My;;; +UID:628d6072-5385-41d3-ad45-cb79a3afa987 +X-KADDRESSBOOK-BLOGFEED:https://my.blog/ +X-KADDRESSBOOK-CRYPTOENCRYPTPREF:askAlways +X-KADDRESSBOOK-CRYPTOPROTOPREF:inline openpgp\,openpgp/mime\,s/mime\,s/mime + opaque\,any s/mime\,any openpgp +X-KADDRESSBOOK-CRYPTOSIGNPREF:always +X-KADDRESSBOOK-X-ANNIVERSARY:1970-01-01 +X-KADDRESSBOOK-X-ASSISTANTSNAME:Mycroft +X-KADDRESSBOOK-X-MANAGERSNAME:My Boss +X-KADDRESSBOOK-X-OFFICE:My Office +X-KADDRESSBOOK-X-PROFESSION:My Job +X-KADDRESSBOOK-X-SPOUSESNAME:My Spouse +END:VCARD + diff --git a/autotests/data/vcard_extension_case_normalization.vcf.ref b/autotests/data/vcard_extension_case_normalization.vcf.ref new file mode 100644 index 0000000..a173526 --- /dev/null +++ b/autotests/data/vcard_extension_case_normalization.vcf.ref @@ -0,0 +1,18 @@ +BEGIN:VCARD +VERSION:3.0 +FN:My Name +N:Name;My;;; +UID:628d6072-5385-41d3-ad45-cb79a3afa987 +X-KADDRESSBOOK-BlogFeed:https://my.blog/ +X-KADDRESSBOOK-CRYPTOENCRYPTPREF:askAlways +X-KADDRESSBOOK-CRYPTOPROTOPREF:inline openpgp\,openpgp/mime\,s/mime\,s/mime + opaque\,any s/mime\,any openpgp +X-KADDRESSBOOK-CRYPTOSIGNPREF:always +X-KADDRESSBOOK-X-Anniversary:1970-01-01 +X-KADDRESSBOOK-X-AssistantsName:Mycroft +X-KADDRESSBOOK-X-ManagersName:My Boss +X-KADDRESSBOOK-X-Office:My Office +X-KADDRESSBOOK-X-Profession:My Job +X-KADDRESSBOOK-X-SpousesName:My Spouse +END:VCARD + diff --git a/autotests/data/vcard_legacy_messaging_fields.vcf b/autotests/data/vcard_legacy_messaging_fields.vcf new file mode 100644 index 0000000..c983129 --- /dev/null +++ b/autotests/data/vcard_legacy_messaging_fields.vcf @@ -0,0 +1,9 @@ +BEGIN:VCARD +VERSION:3.0 +FN:My Name +N:Name;My;;; +UID:12345 +X-messaging/twitter-All:kdecommunity +X-messaging/irc-All:konqui +X-messaging/xmpp-All:one@test.orgtwo@test.org +END:VCARD diff --git a/autotests/data/vcard_legacy_messaging_fields.vcf.ref b/autotests/data/vcard_legacy_messaging_fields.vcf.ref new file mode 100644 index 0000000..d10b9d7 --- /dev/null +++ b/autotests/data/vcard_legacy_messaging_fields.vcf.ref @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +FN:My Name +IMPP:irc:konqui +IMPP:twitter:kdecommunity +IMPP:xmpp:one@test.org +IMPP:xmpp:two@test.org +N:Name;My;;; +UID:12345 +END:VCARD + diff --git a/autotests/data/vcardwithitemasapplesupport.vcf b/autotests/data/vcardwithitemasapplesupport.vcf new file mode 100644 index 0000000..8d3b51b --- /dev/null +++ b/autotests/data/vcardwithitemasapplesupport.vcf @@ -0,0 +1,13 @@ +BEGIN:VCARD +VERSION:3.0 +FN:Name of Broken Card +N:;SOMENAME;;; +NOTE:SOME NOTES +ORG:SOME COMPANY +PRODID:-//Apple Inc.//Mac OS X 10.11.6//EN +REV:2018-01-25T21:50:41Z +TEL;TYPE=PREF,VOICE,WORK:(111) 111-1111 +UID:fe395f83-d5a6-49e3-ae22-ae0799a5aa99 +X-ABShowAs-ABShowAs:COMPANY +item1.ADR;TYPE=WORK,pref:;;STREET;CITY;STATE;ZIP;COUNTRY +END:VCARD diff --git a/autotests/data/vcardwithitemasapplesupport.vcf.ref b/autotests/data/vcardwithitemasapplesupport.vcf.ref new file mode 100644 index 0000000..8541896 --- /dev/null +++ b/autotests/data/vcardwithitemasapplesupport.vcf.ref @@ -0,0 +1,14 @@ +BEGIN:VCARD +VERSION:3.0 +ADR;TYPE=pref,work:;;STREET;CITY;STATE;ZIP;COUNTRY +FN:Name of Broken Card +N:;SOMENAME;;; +NOTE:SOME NOTES +ORG:SOME COMPANY +PRODID:-//Apple Inc.//Mac OS X 10.11.6//EN +REV:2018-01-25T21:50:41Z +TEL;TYPE=PREF,VOICE,WORK:(111) 111-1111 +UID:fe395f83-d5a6-49e3-ae22-ae0799a5aa99 +X-ABShowAs-ABShowAs:COMPANY +END:VCARD + diff --git a/autotests/datetimetest.cpp b/autotests/datetimetest.cpp new file mode 100644 index 0000000..51846d4 --- /dev/null +++ b/autotests/datetimetest.cpp @@ -0,0 +1,164 @@ +/* + This file is part of kcontacts. + SPDX-FileCopyrightText: 2016 Benjamin Löwe + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "datetimetest.h" +#include +#include + +DateTimeTest::DateTimeTest(QObject *parent) + : QObject(parent) +{ +} + +DateTimeTest::~DateTimeTest() +{ +} + +void DateTimeTest::shouldParseDateTime() +{ + using namespace KContacts; + + QDateTime expected; + QDateTime dt; + bool timeIsValid; + + dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33:30+0200")); + expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, 2 * 3600); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33:30+02")); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("20160120T123330+0200")); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33Z")); + expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 0), Qt::UTC); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33-0300")); + expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 0), Qt::OffsetFromUTC, -3 * 3600); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20T12:33"), &timeIsValid); + expected = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 0), Qt::LocalTime); + QCOMPARE(dt, expected); + QVERIFY(timeIsValid); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("2016-01-20"), &timeIsValid); + expected = QDateTime(QDate(2016, 1, 20), QTime(), Qt::LocalTime); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + QVERIFY(!timeIsValid); + QCOMPARE(dt.time(), QTime(0, 0)); + + dt = VCardTool::parseDateTime(QStringLiteral("T1233Z"), &timeIsValid); + QVERIFY(!dt.isValid()); + QVERIFY(timeIsValid); + QCOMPARE(dt.time(), QTime(12, 33)); + + dt = VCardTool::parseDateTime(QStringLiteral("--0120")); + expected = QDateTime(QDate(-1, 1, 20).startOfDay()); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); + + dt = VCardTool::parseDateTime(QStringLiteral("--01-20")); + expected = QDateTime(QDate(-1, 1, 20).startOfDay()); + QCOMPARE(dt, expected); + QVERIFY(dt.isValid()); +} + +void DateTimeTest::shouldCreateDateTime() +{ + using namespace KContacts; + + QDateTime dt; + QString str; + QString expected; + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::UTC); + str = VCardTool::createDateTime(dt, VCard::v4_0); + expected = QStringLiteral("20160120T123330Z"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(), Qt::UTC); + str = VCardTool::createDateTime(dt, VCard::v4_0); + expected = QStringLiteral("20160120T000000Z"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::LocalTime); + str = VCardTool::createDateTime(dt, VCard::v4_0); + expected = QStringLiteral("20160120T123330"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, -2 * 3600); + str = VCardTool::createDateTime(dt, VCard::v4_0); + expected = QStringLiteral("20160120T123330-0200"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, +2.5 * 3600); + str = VCardTool::createDateTime(dt, VCard::v4_0); + expected = QStringLiteral("20160120T123330+0230"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30), Qt::OffsetFromUTC, -2 * 3600); + str = VCardTool::createDateTime(dt, VCard::v3_0); + expected = QStringLiteral("2016-01-20T12:33:30-02:00"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(), QTime(12, 33, 30), Qt::OffsetFromUTC, -2 * 3600); + str = VCardTool::createDateTime(dt, VCard::v3_0); + expected = QString(); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30)); + str = VCardTool::createDateTime(dt, VCard::v3_0, false); + expected = QStringLiteral("2016-01-20"); + QCOMPARE(str, expected); + + dt = QDateTime(QDate(2016, 1, 20), QTime(12, 33, 30)); + str = VCardTool::createDateTime(dt, VCard::v4_0, false); + expected = QStringLiteral("20160120"); + QCOMPARE(str, expected); +} + +void DateTimeTest::shouldCreateDate() +{ + using namespace KContacts; + + QDate d; + QString str; + QString expected; + + d = QDate(2016, 1, 20); + str = VCardTool::createDate(d, VCard::v3_0); + expected = QStringLiteral("2016-01-20"); + QCOMPARE(str, expected); + + d = QDate(2016, 1, 20); + str = VCardTool::createDate(d, VCard::v4_0); + expected = QStringLiteral("20160120"); + QCOMPARE(str, expected); + + d = QDate(-1, 1, 20); + str = VCardTool::createDate(d, VCard::v3_0); + expected = QStringLiteral("--01-20"); + QCOMPARE(str, expected); + + d = QDate(-1, 1, 20); + str = VCardTool::createDate(d, VCard::v4_0); + expected = QStringLiteral("--0120"); + QCOMPARE(str, expected); +} + +QTEST_MAIN(DateTimeTest) diff --git a/autotests/datetimetest.h b/autotests/datetimetest.h new file mode 100644 index 0000000..e1e3a30 --- /dev/null +++ b/autotests/datetimetest.h @@ -0,0 +1,26 @@ +/* + This file is part of kcontacts. + SPDX-FileCopyrightText: 2016 Benjamin Löwe + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef DATETIMETEST_H +#define DATETIMETEST_H + +#include + +class DateTimeTest : public QObject +{ + Q_OBJECT +public: + explicit DateTimeTest(QObject *parent = nullptr); + ~DateTimeTest() override; + +private Q_SLOTS: + void shouldParseDateTime(); + void shouldCreateDateTime(); + void shouldCreateDate(); +}; + +#endif // DATETIMETEST_H diff --git a/autotests/emailtest.cpp b/autotests/emailtest.cpp new file mode 100644 index 0000000..697667a --- /dev/null +++ b/autotests/emailtest.cpp @@ -0,0 +1,203 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ +#include "emailtest.h" +#include "email.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +EmailTest::EmailTest(QObject *parent) + : QObject(parent) +{ +} + +EmailTest::~EmailTest() +{ +} + +void EmailTest::shouldHaveDefaultValue() +{ + KContacts::Email email; + QVERIFY(!email.isValid()); + QVERIFY(email.mail().isEmpty()); + QVERIFY(email.params().empty()); +} + +void EmailTest::shouldAssignValue() +{ + const QString mail(QStringLiteral("foo@kde.org")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Email email(mail); + email.setParams(params); + QVERIFY(email.isValid()); + QVERIFY(!email.mail().isEmpty()); + QCOMPARE(email.mail(), mail); + QVERIFY(!email.params().empty()); + QCOMPARE(email.params(), params); +} + +void EmailTest::shouldAssignExternal() +{ + KContacts::Email email; + const QString mail(QStringLiteral("foo@kde.org")); + email.setEmail(mail); + QVERIFY(email.isValid()); + QVERIFY(!email.mail().isEmpty()); + QCOMPARE(email.mail(), mail); +} + +void EmailTest::shouldSerialized() +{ + KContacts::Email email; + KContacts::Email result; + const QString mail(QStringLiteral("foo@kde.org")); + email.setEmail(mail); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + email.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << email; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(email == result); +} + +void EmailTest::shouldEqualEmail() +{ + KContacts::Email email; + KContacts::Email result; + const QString mail(QStringLiteral("foo@kde.org")); + email.setEmail(mail); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + email.setParams(params); + + result = email; + QVERIFY(email == result); +} + +void EmailTest::shouldParseEmailVCard() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:foo@foo.com\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(!lst.at(0).emailList().isEmpty()); + QCOMPARE(lst.at(0).emailList().count(), 1); + KContacts::Email email = lst.at(0).emailList().at(0); + QCOMPARE(email.mail(), QStringLiteral("foo@foo.com")); + QCOMPARE(email.params().size(), 2); +} + +void EmailTest::shouldParseEmailVCardWithMultiEmails() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=2:foo@foo.com\n" + "EMAIL;TYPE=HOME,PREF;X-EVOLUTION-UI-SLOT=2:bla@bla.com\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(!lst.at(0).emailList().isEmpty()); + QCOMPARE(lst.at(0).emailList().count(), 2); + KContacts::Email email = lst.at(0).emailList().at(0); + QCOMPARE(email.mail(), QStringLiteral("bla@bla.com")); + QCOMPARE(email.type(), KContacts::Email::Home); + QVERIFY(email.isPreferred()); + email = lst.at(0).emailList().at(1); + QCOMPARE(email.mail(), QStringLiteral("foo@foo.com")); + QCOMPARE(email.type(), KContacts::Email::Work); + QVERIFY(!email.isPreferred()); + + QCOMPARE(email.params().size(), 2); +} + +void EmailTest::shouldParseEmailVCardWithoutEmail() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(lst.at(0).emailList().isEmpty()); +} + +void EmailTest::shouldExportVcard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("bla@kde.org")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + KContacts::VCardTool vcard; + QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "EMAIL:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); + + KContacts::Addressee addr2; + addr2.setUid(QStringLiteral("testuid")); + KContacts::Email email1; + KContacts::Email email2; + email1.setEmail(QStringLiteral("foo@kde.org")); + email1.setType(KContacts::Email::Work); + email1.setPreferred(true); + email2.setEmail(QStringLiteral("bla@kde.org")); + email2.setType(KContacts::Email::Home); + addr2.setEmailList({email1, email2}); + ba = vcard.exportVCards({addr2}, KContacts::VCard::v4_0); + QByteArray expected2( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL;TYPE=WORK,PREF:foo@kde.org\r\n" + "EMAIL;TYPE=HOME:bla@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected2); +} + +QTEST_MAIN(EmailTest) diff --git a/autotests/emailtest.h b/autotests/emailtest.h new file mode 100644 index 0000000..daa9ea1 --- /dev/null +++ b/autotests/emailtest.h @@ -0,0 +1,32 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef EMAILTEST_H +#define EMAILTEST_H + +#include + +class EmailTest : public QObject +{ + Q_OBJECT +public: + explicit EmailTest(QObject *parent = nullptr); + ~EmailTest() override; + +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualEmail(); + void shouldParseEmailVCard(); + void shouldParseEmailVCardWithoutEmail(); + void shouldParseEmailVCardWithMultiEmails(); + void shouldExportVcard(); +}; + +#endif // EMAILTEST_H diff --git a/autotests/fieldgrouptest.cpp b/autotests/fieldgrouptest.cpp new file mode 100644 index 0000000..cd93f3d --- /dev/null +++ b/autotests/fieldgrouptest.cpp @@ -0,0 +1,257 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "fieldgrouptest.h" +#include "fieldgroup.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +FieldGroupTest::FieldGroupTest(QObject *parent) + : QObject(parent) +{ +} + +FieldGroupTest::~FieldGroupTest() +{ +} + +void FieldGroupTest::shouldHaveDefaultValue() +{ + KContacts::FieldGroup fieldgroup; + QVERIFY(!fieldgroup.isValid()); + QVERIFY(fieldgroup.fieldGroupName().isEmpty()); + QVERIFY(fieldgroup.params().empty()); + QVERIFY(fieldgroup.value().isEmpty()); +} + +void FieldGroupTest::shouldAssignValue() +{ + const QString fielgroundname(QStringLiteral("fr")); + const QString value(QStringLiteral("bla")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::FieldGroup fieldGroup(fielgroundname); + fieldGroup.setParams(params); + fieldGroup.setValue(value); + QVERIFY(fieldGroup.isValid()); + QVERIFY(!fieldGroup.fieldGroupName().isEmpty()); + QCOMPARE(fieldGroup.fieldGroupName(), fielgroundname); + QVERIFY(!fieldGroup.params().empty()); + QCOMPARE(fieldGroup.params(), params); + QCOMPARE(fieldGroup.value(), value); +} + +void FieldGroupTest::shouldAssignExternal() +{ + KContacts::FieldGroup fieldgroup; + const QString fieldgroundname(QStringLiteral("fr")); + const QString value(QStringLiteral("bla")); + fieldgroup.setValue(value); + fieldgroup.setFieldGroupName(fieldgroundname); + QVERIFY(fieldgroup.isValid()); + QCOMPARE(fieldgroup.fieldGroupName(), fieldgroundname); + QCOMPARE(fieldgroup.value(), value); +} + +void FieldGroupTest::shouldSerialized() +{ + KContacts::FieldGroup fieldGroup; + KContacts::FieldGroup result; + const QString lang(QStringLiteral("fr")); + fieldGroup.setFieldGroupName(lang); + const QString value(QStringLiteral("bla")); + fieldGroup.setValue(value); + + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + fieldGroup.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << fieldGroup; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(fieldGroup == result); +} + +void FieldGroupTest::shouldEqualFieldGroup() +{ + KContacts::FieldGroup fieldGroup; + KContacts::FieldGroup result; + const QString lang(QStringLiteral("fr")); + const QString value(QStringLiteral("bla")); + fieldGroup.setValue(value); + fieldGroup.setFieldGroupName(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + fieldGroup.setParams(params); + + result = fieldGroup; + QVERIFY(fieldGroup == result); +} + +void FieldGroupTest::shouldParseFieldGroup() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "fr.foo:bla\n" + "fr2.foo:bla\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).fieldGroupList().count(), 2); +} + +void FieldGroupTest::shouldParseWithoutFieldGroup() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).fieldGroupList().count(), 0); +} + +void FieldGroupTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::FieldGroup::List lstFieldGroup; + KContacts::FieldGroup fieldGroup(QStringLiteral("fr")); + const QString value(QStringLiteral("bla")); + fieldGroup.setValue(value); + lstFieldGroup << fieldGroup; + addr.setFieldGroupList(lstFieldGroup); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "fr:bla\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void FieldGroupTest::shouldCreateVCardWithTwoLang() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::FieldGroup::List lstFieldGroup; + KContacts::FieldGroup fieldGroup1(QStringLiteral("fr")); + const QString value(QStringLiteral("bla")); + fieldGroup1.setValue(value); + + KContacts::FieldGroup fieldGroup2(QStringLiteral("fr2")); + fieldGroup2.setValue(value); + lstFieldGroup << fieldGroup1 << fieldGroup2; + addr.setFieldGroupList(lstFieldGroup); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "fr:bla\r\n" + "fr2:bla\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void FieldGroupTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + const QString value(QStringLiteral("bla")); + KContacts::FieldGroup::List lstFieldGroup; + KContacts::FieldGroup fieldGroup(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + fieldGroup.setParams(params); + fieldGroup.setValue(value); + lstFieldGroup << fieldGroup; + addr.setFieldGroupList(lstFieldGroup); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "fr;FOO1=bla1,blo1;FOO2=bla2,blo2:bla\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void FieldGroupTest::shouldNotGenerateFieldGroupForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::FieldGroup::List lstFieldGroup; + KContacts::FieldGroup fieldGroup(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + fieldGroup.setParams(params); + const QString value(QStringLiteral("bla")); + fieldGroup.setValue(value); + lstFieldGroup << fieldGroup; + addr.setFieldGroupList(lstFieldGroup); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "fr;FOO1=bla1,blo1;FOO2=bla2,blo2:bla\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(FieldGroupTest) diff --git a/autotests/fieldgrouptest.h b/autotests/fieldgrouptest.h new file mode 100644 index 0000000..819475e --- /dev/null +++ b/autotests/fieldgrouptest.h @@ -0,0 +1,33 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef FieldGroupTest_H +#define FieldGroupTest_H + +#include + +class FieldGroupTest : public QObject +{ + Q_OBJECT +public: + explicit FieldGroupTest(QObject *parent = nullptr); + ~FieldGroupTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualFieldGroup(); + void shouldParseFieldGroup(); + void shouldParseWithoutFieldGroup(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoLang(); + void shouldCreateVCardWithParameters(); + void shouldNotGenerateFieldGroupForVCard3(); +}; + +#endif // FieldGroupTest_H diff --git a/autotests/gendertest.cpp b/autotests/gendertest.cpp new file mode 100644 index 0000000..d5d1360 --- /dev/null +++ b/autotests/gendertest.cpp @@ -0,0 +1,249 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "gendertest.h" +#include "gender.h" +#include "vcardtool_p.h" +#include + +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("vcarddata"); + QTest::addColumn("genre"); + QTest::addColumn("comment"); + QTest::addColumn("hasGender"); + + QByteArray str( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + QTest::newRow("nogender") << str << QString() << QString() << false; + + str = QByteArray( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "GENDER:H\n" + "END:VCARD\n"); + QTest::newRow("hasgenderbutnocomment") << str << QStringLiteral("H") << QString() << true; + + str = QByteArray( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "GENDER:;foo\n" + "END:VCARD\n"); + QTest::newRow("hasgenderbutnotypebutcomment") << str << QString() << QStringLiteral("foo") << true; + + str = QByteArray( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "GENDER:H;foo\n" + "END:VCARD\n"); + QTest::newRow("hasgendertypeandcomment") << str << QStringLiteral("H") << QStringLiteral("foo") << true; +} + +void GenderTest::shouldParseGender() +{ + QFETCH(QByteArray, vcarddata); + QFETCH(QString, genre); + QFETCH(QString, comment); + QFETCH(bool, hasGender); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).gender().isValid(), hasGender); + QCOMPARE(lst.at(0).gender().comment(), comment); + QCOMPARE(lst.at(0).gender().gender(), genre); +} + +QByteArray GenderTest::createCard(const QByteArray &gender) +{ + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n"); + if (!gender.isEmpty()) { + expected += gender + "\r\n"; + } + expected += QByteArray( + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + return expected; +} + +void GenderTest::shouldExportEmptyGender() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected = createCard(QByteArray()); + QCOMPARE(ba, expected); +} + +void GenderTest::shouldExportOnlyGenderWithoutCommentGender() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Gender gender; + gender.setGender(QStringLiteral("H")); + addr.setGender(gender); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected = createCard(QByteArray("GENDER:H")); + QCOMPARE(ba, expected); +} + +void GenderTest::shouldExportOnlyGenderWithCommentGender() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Gender gender; + gender.setGender(QStringLiteral("H")); + gender.setComment(QStringLiteral("comment")); + addr.setGender(gender); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected = createCard(QByteArray("GENDER:H;comment")); + QCOMPARE(ba, expected); +} + +void GenderTest::shouldExportOnlyGenderWithoutTypeCommentGender() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Gender gender; + gender.setComment(QStringLiteral("comment")); + addr.setGender(gender); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected = createCard(QByteArray("GENDER:;comment")); + QCOMPARE(ba, expected); +} + +void GenderTest::shouldNotExportInVcard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Gender gender; + gender.setComment(QStringLiteral("comment")); + addr.setGender(gender); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(GenderTest) diff --git a/autotests/gendertest.h b/autotests/gendertest.h new file mode 100644 index 0000000..e49ad0c --- /dev/null +++ b/autotests/gendertest.h @@ -0,0 +1,38 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef GENDERTEST_H +#define GENDERTEST_H + +#include + +class GenderTest : public QObject +{ + Q_OBJECT +public: + explicit GenderTest(QObject *parent = nullptr); + ~GenderTest() override; + +private: + QByteArray createCard(const QByteArray &gender); + +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualGender(); + void shouldParseGender(); + void shouldParseGender_data(); + void shouldExportOnlyGenderWithoutCommentGender(); + void shouldExportEmptyGender(); + void shouldExportOnlyGenderWithCommentGender(); + void shouldExportOnlyGenderWithoutTypeCommentGender(); + void shouldNotExportInVcard3(); +}; + +#endif // GENDERTEST_H diff --git a/autotests/geotest.cpp b/autotests/geotest.cpp new file mode 100644 index 0000000..1d9be6d --- /dev/null +++ b/autotests/geotest.cpp @@ -0,0 +1,197 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "geotest.h" +#include "kcontacts/geo.h" +#include "vcardtool_p.h" +#include + +QTEST_MAIN(GeoTest) + +void GeoTest::constructor() +{ + KContacts::Geo geo(1.2f, 3.4f); + + QVERIFY((float)geo.latitude() == (float)1.2); + QVERIFY((float)geo.longitude() == (float)3.4); +} + +void GeoTest::isValid() +{ + KContacts::Geo geo; + + QVERIFY(!geo.isValid()); + + geo.setLatitude(23); + + QVERIFY(!geo.isValid()); + + geo.setLongitude(45); + + QVERIFY(geo.isValid()); + + geo.clear(); + + QVERIFY(!geo.isValid()); + QVERIFY(geo == KContacts::Geo()); +} + +void GeoTest::setData() +{ + KContacts::Geo geo; + + geo.setLatitude(22.5f); + geo.setLongitude(45.1f); + + QVERIFY((float)geo.latitude() == (float)22.5); + QVERIFY((float)geo.longitude() == (float)45.1); +} + +void GeoTest::equals() +{ + KContacts::Geo geo1(22.5f, 33.7f); + KContacts::Geo geo2(22.5f, 33.7f); + + QVERIFY(geo1 == geo2); +} + +void GeoTest::differs() +{ + KContacts::Geo geo1(22.5f, 33.7f); + KContacts::Geo geo2(22.5f, 33.6f); + + QVERIFY(geo1 != geo2); +} + +void GeoTest::serialization() +{ + KContacts::Geo geo1(22.5f, 33.7f); + QByteArray data; + + QDataStream s(&data, QIODevice::WriteOnly); + s << geo1; + + KContacts::Geo geo2; + QDataStream t(&data, QIODevice::ReadOnly); + t >> geo2; + + QVERIFY(geo1 == geo2); +} + +void GeoTest::shouldParseGeoVCard3() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "GEO:22.5;180.0\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(lst.at(0).geo().isValid()); + KContacts::Geo geo = lst.at(0).geo(); + QCOMPARE(geo.latitude(), 22.5); + QCOMPARE(geo.longitude(), 180.0); +} + +void GeoTest::shouldParseGeoVCard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:4.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "GEO:geo:22.5,180.0\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(lst.at(0).geo().isValid()); + KContacts::Geo geo = lst.at(0).geo(); + QCOMPARE(geo.latitude(), 22.5); + QCOMPARE(geo.longitude(), 180.0); +} + +void GeoTest::shouldGenerateVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + + KContacts::Geo geo; + geo.setLongitude(180.0); + geo.setLatitude(22.5); + addr.setGeo(geo); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "GEO:22.500000;180.000000\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void GeoTest::shouldGenerateVCard4() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + + KContacts::Geo geo; + geo.setLongitude(180.0); + geo.setLatitude(22.5); + addr.setGeo(geo); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "GEO:geo:22.500000,180.000000\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void GeoTest::shouldGenerateWithoutGeo() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} diff --git a/autotests/geotest.h b/autotests/geotest.h new file mode 100644 index 0000000..d8c784c --- /dev/null +++ b/autotests/geotest.h @@ -0,0 +1,31 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef GEOTEST_H +#define GEOTEST_H + +#include + +class GeoTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void constructor(); + void isValid(); + void setData(); + void equals(); + void differs(); + void serialization(); + void shouldParseGeoVCard3(); + void shouldParseGeoVCard4(); + void shouldGenerateVCard3(); + void shouldGenerateVCard4(); + void shouldGenerateWithoutGeo(); +}; + +#endif diff --git a/autotests/importexportvcardtest.cpp b/autotests/importexportvcardtest.cpp new file mode 100644 index 0000000..7cc9890 --- /dev/null +++ b/autotests/importexportvcardtest.cpp @@ -0,0 +1,221 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "importexportvcardtest.h" +#include "vcardtool_p.h" +#include +#include + +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 outputLines = outputData.split('\n'); + const QList outputRefLines = expected.split('\n'); + for (int i = 0; i < qMin(outputLines.count(), outputRefLines.count()); ++i) { + const QByteArray &actual = outputLines.at(i); + const QByteArray &expect = outputRefLines.at(i); + if (actual != expect) { + qCritical() << "Mismatch at output line" << (i + 1); + QCOMPARE(actual, expect); + QCOMPARE(actual.count(), expect.count()); + } + } + QCOMPARE(outputLines.count(), outputRefLines.count()); + QCOMPARE(outputData.size(), expected.size()); +} + +void ImportExportVCardTest::shouldExportFullTestVcard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "FN:Sherlock Holmes\r\n" + "TEL;VALUE=uri;PREF=1;TYPE=\"voice,home\":tel:+44-555-555-5555;ext=5555\r\n" + "TEL;VALUE=uri;TYPE=\"voice,cell,text\":tel:+44-555-555-6666\r\n" + "TEL;VALUE=uri;TYPE=\"voice,work\":tel:+44-555-555-7777\r\n" + "N:Holmes;Sherlock;;Mr;;\r\n" + "KIND:individual\r\n" + "NICKNAME:Shirley\r\n" + "PHOTO:\r\n" + "BDAY:19531015T231000Z\r\n" + "ANNIVERSARY:19960415\r\n" + "GENDER:M\r\n" + "ADR;GEO=\"geo:51.5237,0.1585\";LABEL=\"Mr Sherlock Holmes, 221B Baker Street, London NW1, England, United Kingdom\":;;221B Baker " + "Street;London;;NW1;United Kingdom\r\n" + "EMAIL;TYPE=home:sherlock.holmes@gmail.com\r\n" + "EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com\r\n" + "IMPP;PREF=1:xmpp:detective@sherlockholmes.com\r\n" + "LANG;TYPE=work;PREF=1:en\r\n" + "LANG;TYPE=work;PREF=2:fr\r\n" + "TZ:London/Europe\r\n" + "GEO:geo:51.5237,0.1585\r\n" + "TITLE;ALTID=1;LANGUAGE=fr:Patron\r\n" + "TITLE;ALTID=2;LANGUAGE=en:Boss\r\n" + "ROLE:Detective\r\n" + "UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519\r\n" + "CATEGORIES:FICTION,LITERATURE\r\n" + "PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN\r\n" + "REV:20140722T222710Z\r\n" + "URL;TYPE=home:https://sherlockholmes.com\r\n" + "KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holmes.pub.asc\r\n" + "CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "FBURL;PREF=1:https://sherlockholmes.com/busy/detective\r\n" + "CALADRURI;PREF=1:mailto:detective@sherlockholmes.com\r\n" + "END:VCARD\r\n\r\n"); + QByteArray vcardexpected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "ADR;GEO=\"geo:51.523701,0.158500\";LABEL=\"Mr Sherlock Holmes, 221B Baker Stre\r\n" + " et, London NW1, England, United Kingdom\";TYPE:;;221B Baker Street;London;;\r\n" + " NW1;United Kingdom\r\n" + "ANNIVERSARY:19960415\r\n" + "BDAY:19531015T231000Z\r\n" + "CALADRURI;PREF=1:mailto:detective@sherlockholmes.com\r\n" + "CALURI;PREF=1:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "CATEGORIES:FICTION,LITERATURE\r\n" + "EMAIL;PREF=1;TYPE=work:detective@sherlockholmes.com\r\n" + "EMAIL;TYPE=home:sherlock.holmes@gmail.com\r\n" + "FBURL;PREF=1:https://sherlockholmes.com/busy/detective\r\n" + "FN:Sherlock Holmes\r\n" + "GENDER:M\r\n" + "GEO:geo:51.523701,0.158500\r\n" + "IMPP;PREF=1:xmpp:detective@sherlockholmes.com\r\n" + "KEY;MEDIATYPE=application/pgp-keys:https://sherlockholmes.com/sherlock-holm\r\n" + " es.pub.asc\r\nKIND:individual\r\n" + "LANG;PREF=1;TYPE=work:en\r\n" + "LANG;PREF=2;TYPE=work:fr\r\n" + "N:Holmes;Sherlock;;Mr;\r\n" + "NICKNAME:Shirley\r\n" + "PRODID:-//KADDRESSBOOK//NONSGML Version 1//EN\r\n" + "REV:20140722T222710Z\r\n" + "ROLE:Detective\r\n" + "TEL;TYPE=\"home,voice\";PREF=1;VALUE=uri:tel:+44-555-555-5555;ext=5555\r\n" + "TEL;TYPE=\"cell,voice\";VALUE=uri:tel:+44-555-555-6666\r\n" + "TEL;TYPE=\"voice,work\";VALUE=uri:tel:+44-555-555-7777\r\n" + "TITLE;ALTID=1;LANGUAGE=fr:Patron\r\n" + "TITLE;ALTID=2;LANGUAGE=en:Boss\r\n" + "TZ:+00:00\r\n" + "UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519\r\n" + "URL;TYPE=home:https://sherlockholmes.com\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + + const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0); + compareBuffers(result, vcardexpected); +} + +void ImportExportVCardTest::shouldExportMiscElementVcard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1\r\n" + "FN;PID=1.1:J. Doe\r\n" + "N:Doe;J.;;;\r\n" + "EMAIL;PID=1.1:jdoe@example.com\r\n" + "EMAIL;PID=2.1:boss@example.com\r\n" + "TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555\r\n" + "TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666\r\n" + "CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556\r\n" + "END:VCARD\r\n\r\n"); + QByteArray vcardexpected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556\r\n" + "EMAIL;PID=1.1:jdoe@example.com\r\n" + "EMAIL;PID=2.1:boss@example.com\r\n" + "FN:J. Doe\r\n" + "N:Doe;J.;;;\r\n" + "TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555\r\n" + "TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666\r\n" + "UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + + const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0); + compareBuffers(result, vcardexpected); +} + +void ImportExportVCardTest::shouldExportMemberElementVcard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD" + "VERSION:4.0\r\n" + "KIND:group\r\n" + "FN:Funky distribution list\r\n" + "MEMBER:mailto:subscriber1@example.com\r\n" + "MEMBER:xmpp:subscriber2@example.com\r\n" + "MEMBER:sip:subscriber3@example.com\r\n" + "MEMBER:tel:+1-418-555-5555\r\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n" + "END:VCARD\r\n"); + + QByteArray vcardexpected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "FN:Funky distribution list\r\n" + "KIND:group\r\n" + "MEMBER:mailto:subscriber1@example.com\r\n" + "MEMBER:xmpp:subscriber2@example.com\r\n" + "MEMBER:sip:subscriber3@example.com\r\n" + "MEMBER:tel:+1-418-555-5555\r\n" + "N:;;;;\r\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + + const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0); + compareBuffers(result, vcardexpected); +} + +void ImportExportVCardTest::shouldExportMissingNewlineVcard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD" + "VERSION:4.0\r\n" + "KIND:group\r\n" + "FN:Funky distribution list\r\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n" + "END:VCARD"); + + QByteArray vcardexpected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "FN:Funky distribution list\r\n" + "KIND:group\r\n" + "N:;;;;\r\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + + const QByteArray result = vcard.exportVCards(lst, KContacts::VCard::v4_0); + compareBuffers(result, vcardexpected); +} + +// TODO please make this data driven before copy/pasting more methods here... + +QTEST_MAIN(ImportExportVCardTest) diff --git a/autotests/importexportvcardtest.h b/autotests/importexportvcardtest.h new file mode 100644 index 0000000..3723d6c --- /dev/null +++ b/autotests/importexportvcardtest.h @@ -0,0 +1,26 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef IMPORTEXPORTVCARDTEST_H +#define IMPORTEXPORTVCARDTEST_H + +#include + +class ImportExportVCardTest : public QObject +{ + Q_OBJECT +public: + explicit ImportExportVCardTest(QObject *parent = nullptr); + ~ImportExportVCardTest() override; +private Q_SLOTS: + void shouldExportFullTestVcard4(); + void shouldExportMiscElementVcard4(); + void shouldExportMemberElementVcard4(); + void shouldExportMissingNewlineVcard4(); +}; + +#endif // IMPORTEXPORTVCARDTEST_H diff --git a/autotests/impptest.cpp b/autotests/impptest.cpp new file mode 100644 index 0000000..8133ae5 --- /dev/null +++ b/autotests/impptest.cpp @@ -0,0 +1,330 @@ +/* + This file is part of libkabc. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "impptest.h" +#include "impp.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +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("type"); + QTest::addColumn("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("type"); + for (const auto &type : KContacts::Impp::serviceTypes()) { + QTest::newRow(type.toLatin1().constData()) << type; + } +} + +void ImppTest::shouldExportType() +{ + QFETCH(QString, type); + + QByteArray expected = expectedVcard(type); + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Impp impp; + impp.setAddress(QUrl(type + QStringLiteral(":address"))); + addr.insertImpp(impp); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QCOMPARE(ba, expected); +} + +void ImppTest::shouldExportWithParameters() +{ + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "IMPP;FOO1=bla1,blo1;FOO2=bla2,blo2:skype:address\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Impp impp; + impp.setAddress(QUrl(QStringLiteral("skype:address"))); + impp.setParams(params); + impp.setPreferred(false); + addr.insertImpp(impp); + lst << addr; + + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QCOMPARE(ba, expected); +} + +void ImppTest::shouldShouldNotExportTwiceServiceType() +{ + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "IMPP;FOO1=bla1,blo1;FOO2=bla2,blo2;PREF=1:skype:address\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + params.push_back({QStringLiteral("X-SERVICE-TYPE"), QStringList() << QStringLiteral("aim")}); + KContacts::Impp impp; + impp.setAddress(QUrl(QStringLiteral("skype:address"))); + impp.setParams(params); + impp.setPreferred(true); + addr.insertImpp(impp); + lst << addr; + + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QCOMPARE(ba, expected); +} + +void ImppTest::testProtocolInformation() +{ + const auto types = KContacts::Impp::serviceTypes(); + QVERIFY(types.size() > 10); + QVERIFY(types.contains(QLatin1String("xmpp"))); + + for (const auto &type : types) { + QVERIFY(!KContacts::Impp::serviceLabel(type).isEmpty()); + } + + QCOMPARE(KContacts::Impp::serviceIcon(QStringLiteral("xmpp")), QLatin1String("im-jabber")); +} + +QTEST_MAIN(ImppTest) diff --git a/autotests/impptest.h b/autotests/impptest.h new file mode 100644 index 0000000..429be49 --- /dev/null +++ b/autotests/impptest.h @@ -0,0 +1,41 @@ +/* + This file is part of libkabc. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef IMPPTEST_H +#define IMPPTEST_H + +#include + +class ImppTest : public QObject +{ + Q_OBJECT +public: + explicit ImppTest(QObject *parent = nullptr); + ~ImppTest() override; + +private Q_SLOTS: + void shouldParseImppVcard4(); + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldSerialized(); + void shouldEqualImpp(); + void shouldParseWithoutImpp(); + void shouldParseImpp(); + void shouldParseServiceType_data(); + void shouldParseServiceType(); + void shouldExportEmptyType(); + + void shouldExportType_data(); + void shouldExportType(); + + void shouldExportWithParameters(); + void shouldShouldNotExportTwiceServiceType(); + + void testProtocolInformation(); +}; + +#endif // IMPPTEST_H diff --git a/autotests/keytest.cpp b/autotests/keytest.cpp new file mode 100644 index 0000000..113ee47 --- /dev/null +++ b/autotests/keytest.cpp @@ -0,0 +1,180 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "keytest.h" +#include "kcontacts/key.h" +#include "vcardtool_p.h" +#include + +QTEST_MAIN(KeyTest) + +void KeyTest::storeTest() +{ + KContacts::Key key; + + key.setId(QStringLiteral("My Id")); + key.setType(KContacts::Key::Custom); + key.setCustomTypeString(QStringLiteral("GnuPG")); + key.setTextData(QStringLiteral("That's my super secret key")); + + QVERIFY(key.id() == QLatin1String("My Id")); + QVERIFY(key.type() == KContacts::Key::Custom); + QVERIFY(key.customTypeString() == QLatin1String("GnuPG")); + QVERIFY(key.textData() == QLatin1String("That's my super secret key")); + QVERIFY(key.isBinary() == false); +} + +void KeyTest::equalsTest() +{ + KContacts::Key key1; + KContacts::Key key2; + + key1.setId(QStringLiteral("My Id")); + key1.setType(KContacts::Key::Custom); + key1.setCustomTypeString(QStringLiteral("GnuPG")); + key1.setTextData(QStringLiteral("That's my super secret key")); + + key2.setId(QStringLiteral("My Id")); + key2.setType(KContacts::Key::Custom); + key2.setCustomTypeString(QStringLiteral("GnuPG")); + key2.setTextData(QStringLiteral("That's my super secret key")); + + QVERIFY(key1 == key2); +} + +void KeyTest::differsTest() +{ + KContacts::Key key1(QStringLiteral("TextKey"), KContacts::Key::PGP); + KContacts::Key key2(QStringLiteral("TextKey"), KContacts::Key::Custom); + + QVERIFY(key1 != key2); +} + +void KeyTest::assignmentTest() +{ + KContacts::Key key1; + KContacts::Key key2; + + key1.setId(QStringLiteral("My Id")); + key1.setType(KContacts::Key::Custom); + key1.setCustomTypeString(QStringLiteral("GnuPG")); + key1.setTextData(QStringLiteral("That's my super secret key")); + + key2 = key1; + + QVERIFY(key1 == key2); +} + +void KeyTest::serializeTest() +{ + KContacts::Key key1; + KContacts::Key key2; + + key1.setId(QStringLiteral("My Id")); + key1.setType(KContacts::Key::Custom); + key1.setCustomTypeString(QStringLiteral("GnuPG")); + key1.setTextData(QStringLiteral("That's my super secret key")); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << key1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> key2; + + QVERIFY(key1 == key2); +} + +void KeyTest::shouldExportVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Key key1(QStringLiteral("https://foo.org/sherlock-holmes.pub.asc"), KContacts::Key::PGP); + addr.setKeys(KContacts::Key::List{key1}); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "KEY;TYPE=PGP:https://foo.org/sherlock-holmes.pub.asc\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void KeyTest::shouldExportVCard4() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Key key1(QStringLiteral("https://foo.org/sherlock-holmes.pub.asc"), KContacts::Key::PGP); + addr.setKeys(KContacts::Key::List{key1}); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "KEY;MEDIATYPE=application/pgp-keys:https://foo.org/sherlock-holmes.pub.asc\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void KeyTest::shouldParseVcard3() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "KEY;TYPE=PGP:https://foo.org/sherlock-holmes.pub.asc\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(!lst.at(0).keys().isEmpty()); + QCOMPARE(lst.at(0).keys().count(), 1); + + KContacts::Key key = lst.at(0).keys().at(0); + QCOMPARE(key.type(), KContacts::Key::PGP); + QCOMPARE(key.textData(), QStringLiteral("https://foo.org/sherlock-holmes.pub.asc")); +} + +void KeyTest::shouldParseVcard4() +{ + QByteArray vcarddata( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "KEY;MEDIATYPE=application/pgp-keys:https://foo.org/sherlock-holmes.pub.asc\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(!lst.at(0).keys().isEmpty()); + QCOMPARE(lst.at(0).keys().count(), 1); + + KContacts::Key key = lst.at(0).keys().at(0); + QCOMPARE(key.type(), KContacts::Key::PGP); + QCOMPARE(key.textData(), QStringLiteral("https://foo.org/sherlock-holmes.pub.asc")); +} diff --git a/autotests/keytest.h b/autotests/keytest.h new file mode 100644 index 0000000..556dd8f --- /dev/null +++ b/autotests/keytest.h @@ -0,0 +1,30 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KEY_TEST_H +#define KEY_TEST_H + +#include + +class KeyTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void storeTest(); + void equalsTest(); + void differsTest(); + void assignmentTest(); + void serializeTest(); + void shouldExportVCard3(); + void shouldExportVCard4(); + void shouldParseVcard3(); + void shouldParseVcard4(); +}; + +#endif diff --git a/autotests/langtest.cpp b/autotests/langtest.cpp new file mode 100644 index 0000000..7eda69c --- /dev/null +++ b/autotests/langtest.cpp @@ -0,0 +1,234 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "langtest.h" +#include "lang.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +LangTest::LangTest(QObject *parent) + : QObject(parent) +{ +} + +LangTest::~LangTest() +{ +} + +void LangTest::shouldHaveDefaultValue() +{ + KContacts::Lang language; + QVERIFY(!language.isValid()); + QVERIFY(language.language().isEmpty()); + QVERIFY(language.params().empty()); +} + +void LangTest::shouldAssignValue() +{ + const QString lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Lang language(lang); + language.setParams(params); + QVERIFY(language.isValid()); + QVERIFY(!language.language().isEmpty()); + QCOMPARE(language.language(), lang); + QVERIFY(!language.params().empty()); + QCOMPARE(language.params(), params); +} + +void LangTest::shouldAssignExternal() +{ + KContacts::Lang language; + const QString lang(QStringLiteral("fr")); + language.setLanguage(lang); + QVERIFY(language.isValid()); + QCOMPARE(language.language(), lang); +} + +void LangTest::shouldSerialized() +{ + KContacts::Lang language; + KContacts::Lang result; + const QString lang(QStringLiteral("fr")); + language.setLanguage(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + language.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << language; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(language == result); +} + +void LangTest::shouldEqualLanguage() +{ + KContacts::Lang language; + KContacts::Lang result; + const QString lang(QStringLiteral("fr")); + language.setLanguage(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + language.setParams(params); + + result = language; + QVERIFY(language == result); +} + +void LangTest::shouldParseLanguage() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "LANG:fr\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).langs().count(), 1); + QCOMPARE(lst.at(0).langs().at(0).language(), QStringLiteral("fr")); +} + +void LangTest::shouldParseWithoutLanguage() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).langs().count(), 0); +} + +void LangTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Lang::List lstLang; + KContacts::Lang lang(QStringLiteral("fr")); + lstLang << lang; + addr.setLangs(lstLang); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "LANG:fr\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void LangTest::shouldCreateVCardWithTwoLang() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Lang::List lstLang; + KContacts::Lang lang(QStringLiteral("fr")); + KContacts::Lang lang2(QStringLiteral("fr2")); + lstLang << lang << lang2; + addr.setLangs(lstLang); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "LANG:fr\r\n" + "LANG:fr2\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void LangTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Lang::List lstLang; + KContacts::Lang lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + lang.setParams(params); + lstLang << lang; + addr.setLangs(lstLang); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "LANG;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void LangTest::shouldNotGenerateLangForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Lang::List lstLang; + KContacts::Lang lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + lang.setParams(params); + lstLang << lang; + addr.setLangs(lstLang); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(LangTest) diff --git a/autotests/langtest.h b/autotests/langtest.h new file mode 100644 index 0000000..51cb50d --- /dev/null +++ b/autotests/langtest.h @@ -0,0 +1,33 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef LANGTEST_H +#define LANGTEST_H + +#include + +class LangTest : public QObject +{ + Q_OBJECT +public: + explicit LangTest(QObject *parent = nullptr); + ~LangTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualLanguage(); + void shouldParseLanguage(); + void shouldParseWithoutLanguage(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoLang(); + void shouldCreateVCardWithParameters(); + void shouldNotGenerateLangForVCard3(); +}; + +#endif // LANGTEST_H diff --git a/autotests/ldifconvertertest.cpp b/autotests/ldifconvertertest.cpp new file mode 100644 index 0000000..132c87b --- /dev/null +++ b/autotests/ldifconvertertest.cpp @@ -0,0 +1,574 @@ +/* + This file is part of libkabc. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "ldifconvertertest.h" +#include "converter/ldifconverter.h" +#include +using namespace KContacts; + +LDifConverterTest::LDifConverterTest(QObject *parent) + : QObject(parent) +{ +} + +LDifConverterTest::~LDifConverterTest() +{ +} + +void LDifConverterTest::shouldImportEmail() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "mail: foo@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).emails().count(), 1); + QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("foo@kde.org")); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportMultiEmails() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "mail: foo@kde.org\n" + "mail: foo2@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).emails().count(), 2); + QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("foo@kde.org")); + QCOMPARE(lst.at(0).emails().at(1), QStringLiteral("foo2@kde.org")); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportStandardBirthday() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "birthyear: 2015\n" + "birthmonth: 3\n" + "birthday: 19\n" + "mail: foo@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QVERIFY(lst.at(0).birthday().date().isValid()); + QCOMPARE(lst.at(0).birthday().date(), QDate(2015, 3, 19)); + QVERIFY(!lst.at(0).birthdayHasTime()); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportStandardBirthdayWithoutYear() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "birthmonth: 3\n" + "birthday: 19\n" + "mail: foo@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QVERIFY(lst.at(0).birthday().date().isValid()); + QCOMPARE(lst.at(0).birthday().date(), QDate(-1, 3, 19)); + QVERIFY(!lst.at(0).birthdayHasTime()); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportTheBatsBirthday() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "xbatBirthday: 20150319\n" + "mail: foo@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QVERIFY(lst.at(0).birthday().date().isValid()); + QCOMPARE(lst.at(0).birthday().date(), QDate(2015, 3, 19)); + QVERIFY(!lst.at(0).birthdayHasTime()); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportTheBatsEmails() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "mail: foo@kde.org\n" + "othermailbox: foo2@kde.org\n" + "othermailbox: foo3@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).emails().count(), 3); + QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("foo@kde.org")); + QCOMPARE(lst.at(0).emails().at(1), QStringLiteral("foo2@kde.org")); + QCOMPARE(lst.at(0).emails().at(2), QStringLiteral("foo3@kde.org")); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportTitle() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "title: foo\n" + "mail: foo@kde.org\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).title(), QStringLiteral("foo")); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportWorkStreet() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "title: foo\n" + "mail: foo@kde.org\n" + "street: work address\n" + "mozillaWorkStreet2: work address next\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).address(Address::Work).street(), QStringLiteral("work address\nwork address next")); + QCOMPARE(contactGroup.count(), 0); +} + +void LDifConverterTest::shouldImportContactGroup() +{ + QString str = QStringLiteral( + "dn: cn=test,mail=\n" + "cn: test\n" + "modifyTimeStamp: 20080526T234914Z\n" + "display-name: Test\n" + "objectclass: top\n" + "objectclass: groupOfNames\n" + "member: cn=Jim Doe,mail=jim.doe@foobar.com\n" + "member: cn=Jane Doe,mail=jane.doe@foobar.com\n" + "member: cn=John Doe,mail=john.doe@foobar.com\n"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 0); + QCOMPARE(contactGroup.count(), 1); + ContactGroup first = contactGroup.first(); + QCOMPARE(first.name(), QStringLiteral("Test")); + QCOMPARE((int)first.count(), 3); +} + +void LDifConverterTest::shouldImportMultiEntries() +{ + QString str = QStringLiteral( + "dn: cn=test1,mail=test1@test.test\n" + "sn: test1\n" + "cn: test1\n" + "uid: jpgdf2NrLQ\n" + "mail: test1@test.test\n" + "modifytimestamp: 20121219T140848Z\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "\n" + "dn: cn=test2,mail=test2@test.test\n" + "sn: test2\n" + "cn: test2\n" + "uid: ow2mwdUb6A\n" + "mail: test2@test.test\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n"); + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 2); + QCOMPARE(contactGroup.count(), 0); + QCOMPARE(lst.at(0).emails().at(0), QStringLiteral("test1@test.test")); + QCOMPARE(lst.at(1).emails().at(0), QStringLiteral("test2@test.test")); +} + +void LDifConverterTest::shouldImportGroupAndAddress() +{ + QString str = QStringLiteral( + "dn: cn=laurent,mail=foo@kde.org\n" + "sn: laurent\n" + "cn: laurent\n" + "uid: d1d5cdd4-7d5d-484b-828d-58864d8efe74\n" + "title: foo\n" + "mail: foo@kde.org\n" + "street: work address\n" + "mozillaWorkStreet2: work address next\n" + "objectclass: top_n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "\n" + "dn: cn=test,mail=\n" + "cn: test\n" + "modifyTimeStamp: 20080526T234914Z\n" + "display-name: Test\n" + "objectclass: top\n" + "objectclass: groupOfNames\n" + "member: cn=Jim Doe,mail=jim.doe@foobar.com\n" + "member: cn=Jane Doe,mail=jane.doe@foobar.com\n" + "member: cn=John Doe,mail=john.doe@foobar.com\n"); + + AddresseeList lst; + ContactGroup::List contactGroup; + bool result = LDIFConverter::LDIFToAddressee(str, lst, contactGroup); + QVERIFY(result); + QCOMPARE(lst.count(), 1); + QCOMPARE(contactGroup.count(), 1); +} + +void LDifConverterTest::shouldExportEmail() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n\n"); + + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportMultiEmails() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org") << QStringLiteral("foo2@kde.org") << QStringLiteral("foo3@kde.org")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "mozillasecondemail: foo2@kde.org\n" + "othermailbox: foo3@kde.org\n" + "\n"); + + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportBirthday() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + Addressee addr; + QDate date(2015, 3, 3); + addr.setBirthday(date); + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "birthyear: 2015\n" + "birthmonth: 3\n" + "birthday: 3\n" + "\n"); + + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportBirthdayWithoutYear() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + Addressee addr; + QDate date(-1, 3, 3); + addr.setBirthday(date); + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "birthmonth: 3\n" + "birthday: 3\n" + "\n"); + + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportTitle() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setTitle(QStringLiteral("foo")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "title: foo\n" + "\n"); + + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportMultiEntries() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setTitle(QStringLiteral("foo")); + addr.setUid(QStringLiteral("testuid")); + lst << addr; + + Addressee addr2; + QDate date(2015, 3, 3); + addr2.setBirthday(date); + addr2.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr2.setUid(QStringLiteral("testuid")); + lst << addr2; + + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + + const QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "title: foo\n" + "\n" + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "birthyear: 2015\n" + "birthmonth: 3\n" + "birthday: 3\n" + "\n"); + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportGroup() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + ContactGroup grp; + ContactGroup::Data data; + data.setEmail(QStringLiteral("foo@kde.org")); + data.setName(QStringLiteral("foo")); + grp.append(data); + ContactGroup::Data data2; + data2.setEmail(QStringLiteral("foo2@kde.org")); + data2.setName(QStringLiteral("foo2")); + grp.append(data2); + contactGroup.append(grp); + + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + + const QString expected = QStringLiteral( + "objectclass: top\n" + "objectclass: groupOfNames\n" + "member: cn=foo,mail=foo@kde.org\n" + "member: cn=foo2,mail=foo2@kde.org\n" + "\n"); + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportWorkStreet() +{ + AddresseeList lst; + Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + Address address(Address::Work); + address.setStreet(QStringLiteral("work address")); + address.setPostalCode(QStringLiteral("postal")); + addr.insertAddress(address); + lst << addr; + ContactGroup::List contactGroup; + + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + + const QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "uid: testuid\n" + "mail: foo@kde.org\n" + "postalcode: postal\n" + "streetaddress: work address\n" + "street: work address\n" + "\n"); + QCOMPARE(str, expected); +} + +void LDifConverterTest::shouldExportFullName() +{ + AddresseeList lst; + Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + addr.setName(QStringLiteral("name")); + addr.setNickName(QStringLiteral("nickname")); + addr.setFamilyName(QStringLiteral("familyname")); + lst << addr; + ContactGroup::List contactGroup; + + QString str; + bool result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(result); + + const QString expected = QStringLiteral( + "dn: cn=,mail=foo@kde.org\n" + "objectclass: top\n" + "objectclass: person\n" + "objectclass: organizationalPerson\n" + "sn: familyname\n" + "uid: testuid\n" + "nickname: nickname\n" + "xmozillanickname: nickname\n" + "mozillanickname: nickname\n" + "mail: foo@kde.org\n" + "\n"); + + QCOMPARE(str, expected); +} + +void LDifConverterTest::testGarbage() +{ + AddresseeList lst; + ContactGroup::List contactGroup; + QString str; + bool result; + + result = LDIFConverter::addresseeAndContactGroupToLDIF(lst, contactGroup, str); + QVERIFY(!result); + result = LDIFConverter::contactGroupToLDIF(contactGroup, str); + QVERIFY(!result); + result = LDIFConverter::addresseeToLDIF(lst, str); + QVERIFY(!result); + + Addressee addr; + result = LDIFConverter::addresseeToLDIF(addr, str); + QVERIFY(!result); +} + +QTEST_MAIN(LDifConverterTest) diff --git a/autotests/ldifconvertertest.h b/autotests/ldifconvertertest.h new file mode 100644 index 0000000..96f43c3 --- /dev/null +++ b/autotests/ldifconvertertest.h @@ -0,0 +1,49 @@ +/* + This file is part of libkabc. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef LDIFCONVERTERTEST_H +#define LDIFCONVERTERTEST_H + +#include + +class LDifConverterTest : public QObject +{ + Q_OBJECT +public: + explicit LDifConverterTest(QObject *parent = nullptr); + ~LDifConverterTest() override; + +private Q_SLOTS: + // Import + void shouldImportEmail(); + void shouldImportMultiEmails(); + void shouldImportStandardBirthday(); + void shouldImportStandardBirthdayWithoutYear(); + void shouldImportTheBatsBirthday(); + void shouldImportTheBatsEmails(); + void shouldImportTitle(); + void shouldImportWorkStreet(); + void shouldImportContactGroup(); + void shouldImportMultiEntries(); + void shouldImportGroupAndAddress(); + + // Export + void shouldExportEmail(); + void shouldExportBirthday(); + void shouldExportBirthdayWithoutYear(); + void shouldExportTitle(); + void shouldExportMultiEntries(); + void shouldExportGroup(); + void shouldExportWorkStreet(); + void shouldExportMultiEmails(); + void shouldExportFullName(); + + // Garbage tests + void testGarbage(); +}; + +#endif // LDIFCONVERTERTEST_H diff --git a/autotests/nicknametest.cpp b/autotests/nicknametest.cpp new file mode 100644 index 0000000..7341036 --- /dev/null +++ b/autotests/nicknametest.cpp @@ -0,0 +1,237 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "nicknametest.h" +#include "nickname.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +NickNameTest::NickNameTest(QObject *parent) + : QObject(parent) +{ +} + +NickNameTest::~NickNameTest() +{ +} + +void NickNameTest::shouldHaveDefaultValue() +{ + KContacts::NickName nickname; + QVERIFY(!nickname.isValid()); + QVERIFY(nickname.nickname().isEmpty()); + QVERIFY(nickname.params().empty()); +} + +void NickNameTest::shouldAssignValue() +{ + const QString lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::NickName nickname(lang); + nickname.setParams(params); + QVERIFY(nickname.isValid()); + QVERIFY(!nickname.nickname().isEmpty()); + QCOMPARE(nickname.nickname(), lang); + QVERIFY(!nickname.params().empty()); + QCOMPARE(nickname.params(), params); +} + +void NickNameTest::shouldAssignExternal() +{ + KContacts::NickName nickname; + const QString lang(QStringLiteral("fr")); + nickname.setNickName(lang); + QVERIFY(nickname.isValid()); + QCOMPARE(nickname.nickname(), lang); +} + +void NickNameTest::shouldSerialized() +{ + KContacts::NickName nickname; + KContacts::NickName result; + const QString lang(QStringLiteral("fr")); + nickname.setNickName(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + nickname.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << nickname; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(nickname == result); +} + +void NickNameTest::shouldEqualNickName() +{ + KContacts::NickName nickname; + KContacts::NickName result; + const QString lang(QStringLiteral("fr")); + nickname.setNickName(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + nickname.setParams(params); + + result = nickname; + QVERIFY(nickname == result); +} + +void NickNameTest::shouldParseNickName() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "NickName:boo\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraNickNameList().count(), 1); + QCOMPARE(lst.at(0).extraNickNameList().at(0).nickname(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).nickName(), QStringLiteral("boo")); +} + +void NickNameTest::shouldParseWithoutNickName() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraNickNameList().count(), 0); + QCOMPARE(lst.at(0).nickName(), QString()); +} + +void NickNameTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::NickName::List lstNickName; + KContacts::NickName title(QStringLiteral("blo")); + lstNickName << title; + addr.setExtraNickNameList(lstNickName); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "NICKNAME:blo\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void NickNameTest::shouldCreateVCardWithTwoNickName() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::NickName::List lstNickName; + KContacts::NickName title(QStringLiteral("fr")); + KContacts::NickName title2(QStringLiteral("fr2")); + lstNickName << title << title2; + addr.setExtraNickNameList(lstNickName); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "NICKNAME:fr\r\n" + "NICKNAME:fr2\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void NickNameTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::NickName::List lstNickName; + KContacts::NickName title(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + title.setParams(params); + lstNickName << title; + addr.setExtraNickNameList(lstNickName); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "NICKNAME;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void NickNameTest::shouldGenerateNickNameForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::NickName::List lstNickName; + KContacts::NickName title(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + title.setParams(params); + lstNickName << title; + addr.setExtraNickNameList(lstNickName); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "NICKNAME;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(NickNameTest) diff --git a/autotests/nicknametest.h b/autotests/nicknametest.h new file mode 100644 index 0000000..0f0a452 --- /dev/null +++ b/autotests/nicknametest.h @@ -0,0 +1,33 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef NICKNAMETEST_H +#define NICKNAMETEST_H + +#include + +class NickNameTest : public QObject +{ + Q_OBJECT +public: + explicit NickNameTest(QObject *parent = nullptr); + ~NickNameTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualNickName(); + void shouldParseNickName(); + void shouldParseWithoutNickName(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoNickName(); + void shouldCreateVCardWithParameters(); + void shouldGenerateNickNameForVCard3(); +}; + +#endif // NICKNAMETEST_H diff --git a/autotests/orgtest.cpp b/autotests/orgtest.cpp new file mode 100644 index 0000000..0e5402b --- /dev/null +++ b/autotests/orgtest.cpp @@ -0,0 +1,282 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "orgtest.h" +#include "org.h" +#include "parametermap_p.h" +#include "vcardtool_p.h" +#include + +OrgTest::OrgTest(QObject *parent) + : QObject(parent) +{ +} + +OrgTest::~OrgTest() +{ +} + +void OrgTest::shouldHaveDefaultValue() +{ + KContacts::Org org; + QVERIFY(!org.isValid()); + QVERIFY(org.organization().isEmpty()); + QVERIFY(org.params().empty()); +} + +void OrgTest::shouldAssignValue() +{ + const QString organization(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Org org(organization); + org.setParams(params); + QVERIFY(org.isValid()); + QVERIFY(!org.organization().isEmpty()); + QCOMPARE(org.organization(), organization); + QVERIFY(!org.params().empty()); + QCOMPARE(org.params(), params); +} + +void OrgTest::shouldAssignExternal() +{ + KContacts::Org org; + const QString organization(QStringLiteral("fr")); + org.setOrganization(organization); + QVERIFY(org.isValid()); + QCOMPARE(org.organization(), organization); +} + +void OrgTest::shouldSerialized() +{ + KContacts::Org org; + KContacts::Org result; + const QString organization(QStringLiteral("fr")); + org.setOrganization(organization); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + org.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << org; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(org == result); +} + +void OrgTest::shouldEqualOrg() +{ + KContacts::Org org; + KContacts::Org result; + const QString organization(QStringLiteral("fr")); + org.setOrganization(organization); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + org.setParams(params); + + result = org; + QVERIFY(org == result); +} + +void OrgTest::shouldParseOrg() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "Org:boo\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraOrganizationList().count(), 1); + QCOMPARE(lst.at(0).organization(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).extraOrganizationList().at(0).organization(), QStringLiteral("boo")); +} + +void OrgTest::shouldParseVcardWithTwoOrg() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "Org:boo\n" + "Org:bla\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraOrganizationList().count(), 2); + QCOMPARE(lst.at(0).extraOrganizationList().at(0).organization(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).extraOrganizationList().at(1).organization(), QStringLiteral("bla")); +} + +void OrgTest::shouldCreateVCardWithSemiColon() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Org::List lstOrg; + KContacts::Org org(QStringLiteral("fr;bla")); + lstOrg << org; + addr.setExtraOrganizationList(lstOrg); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ORG:fr\\\\;bla\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void OrgTest::shouldParseWithoutOrg() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraOrganizationList().count(), 0); +} + +void OrgTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Org::List lstOrg; + KContacts::Org org(QStringLiteral("fr")); + lstOrg << org; + addr.setExtraOrganizationList(lstOrg); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ORG:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void OrgTest::shouldCreateVCardWithTwoOrg() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Org::List lstOrg; + KContacts::Org org(QStringLiteral("fr")); + KContacts::Org org2(QStringLiteral("fr2")); + lstOrg << org << org2; + addr.setExtraOrganizationList(lstOrg); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ORG:fr\r\n" + "ORG:fr2\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void OrgTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Org::List lstOrg; + KContacts::Org org(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + org.setParams(params); + lstOrg << org; + addr.setExtraOrganizationList(lstOrg); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ORG;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void OrgTest::shouldGenerateOrgForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Org::List lstOrg; + KContacts::Org org(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + org.setParams(params); + lstOrg << org; + addr.setExtraOrganizationList(lstOrg); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ORG;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(OrgTest) diff --git a/autotests/orgtest.h b/autotests/orgtest.h new file mode 100644 index 0000000..eb8c7e9 --- /dev/null +++ b/autotests/orgtest.h @@ -0,0 +1,35 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ORGTEST_H +#define ORGTEST_H + +#include + +class OrgTest : public QObject +{ + Q_OBJECT +public: + explicit OrgTest(QObject *parent = nullptr); + ~OrgTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualOrg(); + void shouldParseOrg(); + void shouldParseWithoutOrg(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoOrg(); + void shouldCreateVCardWithParameters(); + void shouldGenerateOrgForVCard3(); + void shouldParseVcardWithTwoOrg(); + void shouldCreateVCardWithSemiColon(); +}; + +#endif // ORGTEST_H diff --git a/autotests/phonenumbertest.cpp b/autotests/phonenumbertest.cpp new file mode 100644 index 0000000..54b748d --- /dev/null +++ b/autotests/phonenumbertest.cpp @@ -0,0 +1,345 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "phonenumbertest.h" +#include "kcontacts/phonenumber.h" +#include +#include +#include +#include + +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 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("input"); + QTest::addColumn("expected"); + + QTest::newRow("empty") << QString() << QString(); + QTest::newRow("normalized") << QStringLiteral("+49123456789") << QStringLiteral("+49123456789"); + QTest::newRow("formatted") << QStringLiteral("+49(123) 456 - 789") << QStringLiteral("+49123456789"); +} + +void PhoneNumberTest::testNormalizeNumber() +{ + QFETCH(QString, input); + QFETCH(QString, expected); + + KContacts::PhoneNumber num; + num.setNumber(input); + QCOMPARE(num.normalizedNumber(), expected); +} diff --git a/autotests/phonenumbertest.h b/autotests/phonenumbertest.h new file mode 100644 index 0000000..8340f9d --- /dev/null +++ b/autotests/phonenumbertest.h @@ -0,0 +1,38 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef PHONENUMBER_TEST_H +#define PHONENUMBER_TEST_H + +#include + +class PhoneNumberTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void emptyTest(); + void storeTest(); + void equalsTest(); + void differsTest(); + void assignmentTest(); + void serializeTest(); + void labelTest(); + + void shouldExportVCard3(); + void shouldExportVCard4(); + void shouldParseVcard3(); + void shouldParseVcard4(); + + void shouldExportVCard21(); + void shouldParseVCard21(); + + void testNormalizeNumber_data(); + void testNormalizeNumber(); +}; + +#endif diff --git a/autotests/picturetest.cpp b/autotests/picturetest.cpp new file mode 100644 index 0000000..6658418 --- /dev/null +++ b/autotests/picturetest.cpp @@ -0,0 +1,266 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "picturetest.h" +#include "kcontacts/picture.h" +#include +#include +#include + +QTEST_MAIN(PictureTest) + +static QImage testImage() +{ + static QImage image; + + if (image.isNull()) { + image = QImage(200, 200, QImage::Format_RGB32); + QPainter p(&image); + p.drawRect(10, 10, 50, 50); + } + + return image; +} + +static QByteArray testImageRawPNG() +{ + static QByteArray raw; + + if (raw.isNull()) { + QBuffer buffer(&raw); + buffer.open(QIODevice::WriteOnly); + testImage().save(&buffer, "PNG"); + } + + return raw; +} + +static QByteArray testImageRawJPEG() +{ + static QByteArray raw; + + if (raw.isNull()) { + QBuffer buffer(&raw); + buffer.open(QIODevice::WriteOnly); + testImage().save(&buffer, "JPEG"); + } + + return raw; +} + +void PictureTest::emptyTest() +{ + KContacts::Picture picture; + + QVERIFY(picture.isEmpty()); +} + +void PictureTest::storeTestInternImage() +{ + KContacts::Picture picture; + + picture.setData(testImage()); + + QVERIFY(picture.isEmpty() == false); + QVERIFY(picture.isIntern() == true); + QVERIFY(picture.type() == QLatin1String("jpeg")); + QVERIFY(picture.data() == testImage()); + QVERIFY(picture.rawData() == testImageRawJPEG()); +} + +void PictureTest::storeTestInternRawData() +{ + KContacts::Picture picture; + + picture.setRawData(testImageRawPNG(), QStringLiteral("png")); + + QVERIFY(picture.isEmpty() == false); + QVERIFY(picture.isIntern() == true); + QVERIFY(picture.type() == QLatin1String("png")); + QVERIFY(picture.rawData() == testImageRawPNG()); + QVERIFY(picture.data() == testImage()); +} + +void PictureTest::storeTestExtern() +{ + KContacts::Picture picture; + + picture.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + QVERIFY(picture.isEmpty() == false); + QVERIFY(picture.isIntern() == false); + QVERIFY(picture.type() == QLatin1String("png")); + QVERIFY(picture.url() == QLatin1String("http://myhomepage.com/foto.png")); +} + +void PictureTest::equalsTestInternImage() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setData(testImage()); + + picture2.setData(testImage()); + + QVERIFY(picture1 == picture2); + + // access rawData() so a QByteArray is created + QVERIFY(!picture1.rawData().isNull()); + QVERIFY(picture1 == picture2); +} + +void PictureTest::equalsTestInternRawData() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setRawData(testImageRawPNG(), QStringLiteral("png")); + + picture2.setRawData(testImageRawPNG(), QStringLiteral("png")); + + QVERIFY(picture1 == picture2); + + // access data() so a QImage is created + QVERIFY(!picture1.data().isNull()); + QVERIFY(picture1 == picture2); +} + +void PictureTest::equalsTestInternImageAndRawData() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setData(testImage()); + + picture2.setRawData(testImageRawJPEG(), QStringLiteral("jpeg")); + + QVERIFY(picture1.rawData() == picture2.rawData()); +} + +void PictureTest::equalsTestExtern() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + picture2.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + QVERIFY(picture1 == picture2); +} + +void PictureTest::differsTest() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + picture2.setData(testImage()); + + QVERIFY(picture1 != picture2); +} + +void PictureTest::differsTestInternRawData() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setRawData(testImageRawJPEG(), QStringLiteral("jpeg")); + + picture2.setRawData(testImageRawPNG(), QStringLiteral("png")); + + QVERIFY(picture1 != picture2); + QVERIFY(picture1.rawData() != picture2.rawData()); +} + +void PictureTest::differsTestExtern() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + picture1.setUrl(QStringLiteral("http://myhomepage.com/foto2.png"), QStringLiteral("png")); + + QVERIFY(picture1 != picture2); +} + +void PictureTest::assignmentTestIntern() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setData(testImage()); + + picture2 = picture1; + + QVERIFY(picture1 == picture2); +} + +void PictureTest::assignmentTestExtern() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + picture2 = picture1; + + QVERIFY(picture1 == picture2); +} + +void PictureTest::serializeTestInternImage() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setData(testImage()); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << picture1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> picture2; + + QVERIFY(picture1 == picture2); +} + +void PictureTest::serializeTestInternRawData() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setRawData(testImageRawPNG(), QStringLiteral("png")); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << picture1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> picture2; + + QVERIFY(picture1 == picture2); +} + +void PictureTest::serializeTestExtern() +{ + KContacts::Picture picture1; + KContacts::Picture picture2; + + picture1.setUrl(QStringLiteral("http://myhomepage.com/foto.png"), QStringLiteral("png")); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << picture1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> picture2; + + QVERIFY(picture1 == picture2); +} diff --git a/autotests/picturetest.h b/autotests/picturetest.h new file mode 100644 index 0000000..b525a00 --- /dev/null +++ b/autotests/picturetest.h @@ -0,0 +1,36 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef PICTURE_TEST_H +#define PICTURE_TEST_H + +#include + +class PictureTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void emptyTest(); + void storeTestInternImage(); + void storeTestInternRawData(); + void storeTestExtern(); + void equalsTestInternImage(); + void equalsTestInternRawData(); + void equalsTestInternImageAndRawData(); + void equalsTestExtern(); + void differsTest(); + void differsTestInternRawData(); + void differsTestExtern(); + void assignmentTestIntern(); + void assignmentTestExtern(); + void serializeTestInternImage(); + void serializeTestInternRawData(); + void serializeTestExtern(); +}; + +#endif diff --git a/autotests/relatedtest.cpp b/autotests/relatedtest.cpp new file mode 100644 index 0000000..04755f5 --- /dev/null +++ b/autotests/relatedtest.cpp @@ -0,0 +1,259 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "relatedtest.h" + +#include "parametermap_p.h" +#include "related.h" +#include "vcardtool_p.h" + +#include + +RelatedTest::RelatedTest(QObject *parent) + : QObject(parent) +{ +} + +RelatedTest::~RelatedTest() +{ +} + +void RelatedTest::shouldHaveDefaultValue() +{ + KContacts::Related related; + QVERIFY(!related.isValid()); + QVERIFY(related.related().isEmpty()); + QVERIFY(related.params().empty()); +} + +void RelatedTest::shouldAssignValue() +{ + const QString relatedTo(QStringLiteral("friend")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Related related(relatedTo); + related.setParams(params); + QVERIFY(related.isValid()); + QVERIFY(!related.related().isEmpty()); + QCOMPARE(related.related(), relatedTo); + QVERIFY(!related.params().empty()); + QCOMPARE(related.params(), params); +} + +void RelatedTest::shouldAssignExternal() +{ + KContacts::Related related; + const QString relatedTo(QStringLiteral("friend")); + related.setRelated(relatedTo); + QVERIFY(related.isValid()); + QCOMPARE(related.related(), relatedTo); +} + +void RelatedTest::shouldSerialized() +{ + KContacts::Related related; + KContacts::Related result; + const QString relatedTo(QStringLiteral("friend")); + related.setRelated(relatedTo); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + related.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << related; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(related == result); +} + +void RelatedTest::shouldEqualRelated() +{ + KContacts::Related related; + KContacts::Related result; + const QString relatedTo(QStringLiteral("friend")); + related.setRelated(relatedTo); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + related.setParams(params); + + result = related; + QVERIFY(related == result); +} + +void RelatedTest::shouldParseRelated() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:4.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "RELATED:friend\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).relationships().count(), 1); + const KContacts::Related related = lst.at(0).relationships().at(0); + QCOMPARE(related.related(), QStringLiteral("friend")); +} + +void RelatedTest::shouldParseRelatedWithArgument() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:4.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "RELATED;FOO1=bla1,blo1;FOO2=bla2,blo2:friend\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).relationships().count(), 1); + const KContacts::Related related = lst.at(0).relationships().at(0); + QCOMPARE(related.related(), QStringLiteral("friend")); + QCOMPARE(related.params().size(), 2); +} + +void RelatedTest::shouldParseWithoutRelated() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).relationships().count(), 0); +} + +void RelatedTest::shouldCreateVCard4() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Related::List lstRelated; + KContacts::Related related(QStringLiteral("friend")); + lstRelated << related; + addr.setRelationships(lstRelated); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "RELATED:friend\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void RelatedTest::shouldCreateVCardWithTwoRelated() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Related::List lstRelated; + KContacts::Related related(QStringLiteral("friend")); + KContacts::Related related2(QStringLiteral("kde")); + lstRelated << related << related2; + addr.setRelationships(lstRelated); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "RELATED:friend\r\n" + "RELATED:kde\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void RelatedTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Related::List lstRelated; + KContacts::Related related(QStringLiteral("friend")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + related.setParams(params); + lstRelated << related; + addr.setRelationships(lstRelated); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "RELATED;FOO1=bla1,blo1;FOO2=bla2,blo2:friend\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void RelatedTest::shouldNotExportInVcard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Related::List lstRelated; + KContacts::Related related(QStringLiteral("friend")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + related.setParams(params); + lstRelated << related; + addr.setRelationships(lstRelated); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "RELATED;FOO1=bla1,blo1;FOO2=bla2,blo2:friend\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(RelatedTest) diff --git a/autotests/relatedtest.h b/autotests/relatedtest.h new file mode 100644 index 0000000..73b18b2 --- /dev/null +++ b/autotests/relatedtest.h @@ -0,0 +1,34 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef RELATEDTEST_H +#define RELATEDTEST_H + +#include + +class RelatedTest : public QObject +{ + Q_OBJECT +public: + explicit RelatedTest(QObject *parent = nullptr); + ~RelatedTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualRelated(); + void shouldParseRelated(); + void shouldParseWithoutRelated(); + void shouldCreateVCard4(); + void shouldCreateVCardWithTwoRelated(); + void shouldCreateVCardWithParameters(); + void shouldNotExportInVcard3(); + void shouldParseRelatedWithArgument(); +}; + +#endif // RELATEDTEST_H diff --git a/autotests/resourcelocatorurltest.cpp b/autotests/resourcelocatorurltest.cpp new file mode 100644 index 0000000..0af7145 --- /dev/null +++ b/autotests/resourcelocatorurltest.cpp @@ -0,0 +1,226 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "resourcelocatorurltest.h" + +#include "parametermap_p.h" +#include "resourcelocatorurl.h" +#include "vcardtool_p.h" +#include + +using namespace KContacts; +ResourceLocatorUrlTest::ResourceLocatorUrlTest(QObject *parent) + : QObject(parent) +{ +} + +ResourceLocatorUrlTest::~ResourceLocatorUrlTest() +{ +} + +void ResourceLocatorUrlTest::shouldHaveDefaultValue() +{ + ResourceLocatorUrl ResourceLocatorUrl; + QVERIFY(!ResourceLocatorUrl.isValid()); + QVERIFY(ResourceLocatorUrl.url().isEmpty()); + QVERIFY(ResourceLocatorUrl.params().empty()); +} + +void ResourceLocatorUrlTest::shouldAssignValue() +{ + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + ResourceLocatorUrl ResourceLocatorUrl; + ResourceLocatorUrl.setParams(params); + QVERIFY(!ResourceLocatorUrl.isValid()); + QVERIFY(ResourceLocatorUrl.url().isEmpty()); + QVERIFY(!ResourceLocatorUrl.params().empty()); + QCOMPARE(ResourceLocatorUrl.params(), params); +} + +void ResourceLocatorUrlTest::shouldAssignExternal() +{ + ResourceLocatorUrl resourcelocatorurl; + QUrl url = QUrl(QStringLiteral("https://www.kde.org")); + resourcelocatorurl.setUrl(url); + QVERIFY(!resourcelocatorurl.url().isEmpty()); + QCOMPARE(resourcelocatorurl.url(), url); +} + +void ResourceLocatorUrlTest::shouldSerialized() +{ + ResourceLocatorUrl resourcelocatorurl; + ResourceLocatorUrl result; + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + resourcelocatorurl.setParams(params); + resourcelocatorurl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org"))); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << resourcelocatorurl; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(resourcelocatorurl == result); +} + +void ResourceLocatorUrlTest::shouldEqualResourceLocatorUrl() +{ + ResourceLocatorUrl resourcelocatorurl; + ResourceLocatorUrl result; + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + resourcelocatorurl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org"))); + resourcelocatorurl.setParams(params); + + result = resourcelocatorurl; + QVERIFY(resourcelocatorurl == result); +} + +void ResourceLocatorUrlTest::shouldParseResourceLocatorUrl() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "URL;PREF=1;TYPE=HOME:https://firsturl\n" + "URL;TYPE=WORK,PREF:https://sherlockholmes.com/calendar/sherlockholmes\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraUrlList().count(), 2); + auto calurl = lst.at(0).extraUrlList().at(0); + QCOMPARE(calurl.url(), QUrl(QStringLiteral("https://firsturl"))); + QVERIFY(calurl.isPreferred()); + QCOMPARE(calurl.type(), KContacts::ResourceLocatorUrl::Home); + QVERIFY(!calurl.params().empty()); + calurl = lst.at(0).extraUrlList().at(1); + QCOMPARE(calurl.url(), QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + QVERIFY(calurl.isPreferred()); + QCOMPARE(calurl.type(), KContacts::ResourceLocatorUrl::Work); + QVERIFY(!calurl.params().empty()); +} + +void ResourceLocatorUrlTest::shouldGenerateVCard4() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ResourceLocatorUrl webpage; + webpage.setUrl(QUrl(QStringLiteral("https://www.kde.org"))); + addr.setUrl(webpage); + ResourceLocatorUrl url; + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + addr.insertExtraUrl(url); + url.setUrl(QUrl(QStringLiteral("https://foo.kde.org"))); + addr.insertExtraUrl(url); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "URL:https://www.kde.org\r\n" + "URL:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "URL:https://foo.kde.org\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void ResourceLocatorUrlTest::shouldGenerateVCardWithParameter() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ResourceLocatorUrl webpage; + webpage.setUrl(QUrl(QStringLiteral("https://www.kde.org"))); + addr.setUrl(webpage); + ResourceLocatorUrl url; + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + url.setParams(params); + addr.insertExtraUrl(url); + url.setUrl(QUrl(QStringLiteral("https://foo.kde.org"))); + ParameterMap params2; + url.setParams(params2); + addr.insertExtraUrl(url); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "URL:https://www.kde.org\r\n" + "URL;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "URL:https://foo.kde.org\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void ResourceLocatorUrlTest::shouldGenerateVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::ResourceLocatorUrl webpage; + webpage.setUrl(QUrl(QStringLiteral("https://www.kde.org"))); + addr.setUrl(webpage); + ResourceLocatorUrl url; + url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes"))); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + url.setParams(params); + addr.insertExtraUrl(url); + url.setUrl(QUrl(QStringLiteral("https://foo.kde.org"))); + ParameterMap params2; + url.setParams(params2); + url.setType(ResourceLocatorUrl::Work); + url.setPreferred(true); + addr.insertExtraUrl(url); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "UID:testuid\r\n" + "URL:https://www.kde.org\r\n" + "URL;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n" + "URL;TYPE=WORK,PREF:https://foo.kde.org\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +QTEST_MAIN(ResourceLocatorUrlTest) diff --git a/autotests/resourcelocatorurltest.h b/autotests/resourcelocatorurltest.h new file mode 100644 index 0000000..10c5dd7 --- /dev/null +++ b/autotests/resourcelocatorurltest.h @@ -0,0 +1,32 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ResourceLocatorUrlTest_H +#define ResourceLocatorUrlTest_H + +#include + +class ResourceLocatorUrlTest : public QObject +{ + Q_OBJECT +public: + explicit ResourceLocatorUrlTest(QObject *parent = nullptr); + ~ResourceLocatorUrlTest() override; + +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualResourceLocatorUrl(); + void shouldParseResourceLocatorUrl(); + void shouldGenerateVCard4(); + void shouldGenerateVCardWithParameter(); + void shouldGenerateVCard3(); +}; + +#endif // ResourceLocatorUrlTest_H diff --git a/autotests/roletest.cpp b/autotests/roletest.cpp new file mode 100644 index 0000000..6db11fb --- /dev/null +++ b/autotests/roletest.cpp @@ -0,0 +1,237 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "roletest.h" +#include "parametermap_p.h" +#include "role.h" +#include "vcardtool_p.h" +#include + +RoleTest::RoleTest(QObject *parent) + : QObject(parent) +{ +} + +RoleTest::~RoleTest() +{ +} + +void RoleTest::shouldHaveDefaultValue() +{ + KContacts::Role role; + QVERIFY(!role.isValid()); + QVERIFY(role.role().isEmpty()); + QVERIFY(role.params().empty()); +} + +void RoleTest::shouldAssignValue() +{ + const QString lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Role role(lang); + role.setParams(params); + QVERIFY(role.isValid()); + QVERIFY(!role.role().isEmpty()); + QCOMPARE(role.role(), lang); + QVERIFY(!role.params().empty()); + QCOMPARE(role.params(), params); +} + +void RoleTest::shouldAssignExternal() +{ + KContacts::Role role; + const QString lang(QStringLiteral("fr")); + role.setRole(lang); + QVERIFY(role.isValid()); + QCOMPARE(role.role(), lang); +} + +void RoleTest::shouldSerialized() +{ + KContacts::Role role; + KContacts::Role result; + const QString lang(QStringLiteral("fr")); + role.setRole(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + role.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << role; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(role == result); +} + +void RoleTest::shouldEqualRole() +{ + KContacts::Role role; + KContacts::Role result; + const QString lang(QStringLiteral("fr")); + role.setRole(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + role.setParams(params); + + result = role; + QVERIFY(role == result); +} + +void RoleTest::shouldParseRole() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "Role:boo\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraRoleList().count(), 1); + QCOMPARE(lst.at(0).role(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).extraRoleList().at(0).role(), QStringLiteral("boo")); +} + +void RoleTest::shouldParseWithoutRole() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraRoleList().count(), 0); + QCOMPARE(lst.at(0).role(), QString()); +} + +void RoleTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Role::List lstRole; + KContacts::Role role(QStringLiteral("fr")); + lstRole << role; + addr.setExtraRoleList(lstRole); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ROLE:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void RoleTest::shouldCreateVCardWithTwoRole() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Role::List lstRole; + KContacts::Role role(QStringLiteral("fr")); + KContacts::Role role2(QStringLiteral("fr2")); + lstRole << role << role2; + addr.setExtraRoleList(lstRole); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ROLE:fr\r\n" + "ROLE:fr2\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void RoleTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Role::List lstRole; + KContacts::Role role(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + role.setParams(params); + lstRole << role; + addr.setExtraRoleList(lstRole); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ROLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void RoleTest::shouldGenerateRoleForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Role::List lstRole; + KContacts::Role role(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + role.setParams(params); + lstRole << role; + addr.setExtraRoleList(lstRole); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "ROLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(RoleTest) diff --git a/autotests/roletest.h b/autotests/roletest.h new file mode 100644 index 0000000..c35ff6e --- /dev/null +++ b/autotests/roletest.h @@ -0,0 +1,33 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ROLETEST_H +#define ROLETEST_H + +#include + +class RoleTest : public QObject +{ + Q_OBJECT +public: + explicit RoleTest(QObject *parent = nullptr); + ~RoleTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualRole(); + void shouldParseRole(); + void shouldParseWithoutRole(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoRole(); + void shouldCreateVCardWithParameters(); + void shouldGenerateRoleForVCard3(); +}; + +#endif // ROLETEST_H diff --git a/autotests/secrecytest.cpp b/autotests/secrecytest.cpp new file mode 100644 index 0000000..4d32aef --- /dev/null +++ b/autotests/secrecytest.cpp @@ -0,0 +1,76 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "secrecytest.h" +#include "kcontacts/secrecy.h" +#include "vcardtool_p.h" +#include + +QTEST_MAIN(SecrecyTest) + +void SecrecyTest::emptyTest() +{ + KContacts::Secrecy secrecy; + + QVERIFY(secrecy.type() == KContacts::Secrecy::Invalid); +} + +void SecrecyTest::storeTest() +{ + KContacts::Secrecy secrecy; + + secrecy.setType(KContacts::Secrecy::Private); + + QVERIFY(secrecy.type() == KContacts::Secrecy::Private); +} + +void SecrecyTest::equalsTest() +{ + KContacts::Secrecy secrecy1; + KContacts::Secrecy secrecy2; + + secrecy1.setType(KContacts::Secrecy::Confidential); + secrecy2.setType(KContacts::Secrecy::Confidential); + + QVERIFY(secrecy1 == secrecy2); +} + +void SecrecyTest::differsTest() +{ + KContacts::Secrecy secrecy1(KContacts::Secrecy::Private); + KContacts::Secrecy secrecy2(KContacts::Secrecy::Confidential); + + QVERIFY(secrecy1 != secrecy2); +} + +void SecrecyTest::assignmentTest() +{ + KContacts::Secrecy secrecy1; + KContacts::Secrecy secrecy2; + + secrecy1.setType(KContacts::Secrecy::Confidential); + secrecy1 = secrecy2; + + QVERIFY(secrecy1 == secrecy2); +} + +void SecrecyTest::serializeTest() +{ + KContacts::Secrecy secrecy1; + KContacts::Secrecy secrecy2; + + secrecy1.setType(KContacts::Secrecy::Confidential); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << secrecy1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> secrecy2; + + QVERIFY(secrecy1 == secrecy2); +} diff --git a/autotests/secrecytest.h b/autotests/secrecytest.h new file mode 100644 index 0000000..dc38edb --- /dev/null +++ b/autotests/secrecytest.h @@ -0,0 +1,26 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef SECRECY_TEST_H +#define SECRECY_TEST_H + +#include + +class SecrecyTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void emptyTest(); + void storeTest(); + void equalsTest(); + void differsTest(); + void assignmentTest(); + void serializeTest(); +}; + +#endif diff --git a/autotests/soundtest.cpp b/autotests/soundtest.cpp new file mode 100644 index 0000000..0ef0bba --- /dev/null +++ b/autotests/soundtest.cpp @@ -0,0 +1,260 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "soundtest.h" +#include "addressee.h" +#include "kcontacts/sound.h" +#include "vcardtool_p.h" +#include + +QTEST_MAIN(SoundTest) + +static QByteArray testData() +{ + static QByteArray data; + + if (data.isNull()) { + for (int i = 0; i < 20; ++i) { + data.append(char(i)); + } + } + + return data; +} + +void SoundTest::emptyTest() +{ + KContacts::Sound sound; + + QVERIFY(sound.isEmpty()); +} + +void SoundTest::storeTestIntern() +{ + KContacts::Sound sound; + + sound.setData(testData()); + + QVERIFY(sound.isIntern() == true); + QVERIFY(sound.data() == testData()); +} + +void SoundTest::storeTestExtern() +{ + KContacts::Sound sound; + + sound.setUrl(QLatin1String("http://myhomepage.com/sound.wav")); + + QVERIFY(sound.isIntern() == false); + QVERIFY(sound.url() == QLatin1String("http://myhomepage.com/sound.wav")); +} + +void SoundTest::equalsTestIntern() +{ + KContacts::Sound sound1; + KContacts::Sound sound2; + + sound1.setData(testData()); + sound2.setData(testData()); + + QVERIFY(sound1 == sound2); +} + +void SoundTest::equalsTestExtern() +{ + KContacts::Sound sound1; + KContacts::Sound sound2; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + sound2.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + + QVERIFY(sound1 == sound2); +} + +void SoundTest::differsTest() +{ + KContacts::Sound sound1; + KContacts::Sound sound2; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + sound2.setData(testData()); + + QVERIFY(sound1 != sound2); +} + +void SoundTest::assignmentTestIntern() +{ + KContacts::Sound sound1; + KContacts::Sound sound2; + + sound1.setData(testData()); + + sound2 = sound1; + + QVERIFY(sound1 == sound2); +} + +void SoundTest::assignmentTestExtern() +{ + KContacts::Sound sound1; + KContacts::Sound sound2; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + + sound2 = sound1; + + QVERIFY(sound1 == sound2); +} + +void SoundTest::serializeTest() +{ + KContacts::Sound sound1; + KContacts::Sound sound2; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + sound1.setData(testData()); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << sound1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> sound2; + + QVERIFY(sound1 == sound2); +} + +void SoundTest::shouldParseSource() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "SOUND;VALUE=URI:http://myhomepage.com/sound.wav\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QVERIFY(!lst.at(0).sound().isEmpty()); + KContacts::Sound sound = lst.at(0).sound(); + QVERIFY(!sound.isIntern()); + QCOMPARE(sound.url(), QStringLiteral("http://myhomepage.com/sound.wav")); +} + +void SoundTest::shouldGenerateVCard4WithData() +{ + KContacts::Addressee::List lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Sound sound1; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + sound1.setData(testData()); + addr.setSound(sound1); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "SOUND;ENCODING=b:AAECAwQFBgcICQoLDA0ODxAREhM=\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void SoundTest::shouldGenerateVCard4WithUrl() +{ + KContacts::Addressee::List lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Sound sound1; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + addr.setSound(sound1); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "SOUND;VALUE=URI:http://myhomepage.com/sound.wav\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void SoundTest::shouldGenerateVCard3WithData() +{ + KContacts::Addressee::List lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Sound sound1; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + sound1.setData(testData()); + addr.setSound(sound1); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "SOUND;ENCODING=b:AAECAwQFBgcICQoLDA0ODxAREhM=\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void SoundTest::shouldGenerateVCard3WithUrl() +{ + KContacts::Addressee::List lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Sound sound1; + + sound1.setUrl(QStringLiteral("http://myhomepage.com/sound.wav")); + addr.setSound(sound1); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "SOUND;VALUE=URI:http://myhomepage.com/sound.wav\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} diff --git a/autotests/soundtest.h b/autotests/soundtest.h new file mode 100644 index 0000000..785ec28 --- /dev/null +++ b/autotests/soundtest.h @@ -0,0 +1,34 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef SOUND_TEST_H +#define SOUND_TEST_H + +#include + +class SoundTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void emptyTest(); + void storeTestIntern(); + void storeTestExtern(); + void equalsTestIntern(); + void equalsTestExtern(); + void differsTest(); + void assignmentTestIntern(); + void assignmentTestExtern(); + void serializeTest(); + void shouldParseSource(); + void shouldGenerateVCard4WithData(); + void shouldGenerateVCard4WithUrl(); + void shouldGenerateVCard3WithData(); + void shouldGenerateVCard3WithUrl(); +}; + +#endif diff --git a/autotests/testlock.h b/autotests/testlock.h new file mode 100644 index 0000000..9282823 --- /dev/null +++ b/autotests/testlock.h @@ -0,0 +1,39 @@ +/* + This file is part of the KContacts framework. + + SPDX-FileCopyrightText: 2003 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ +#ifndef KCONTACTS_TESTLOCK_H +#define KCONTACTS_TESTLOCK_H + +#include +#include + +#include "kcontacts/lock.h" + +class QLabel; +class QTreeWidget; + +class LockWidget : public QWidget +{ + Q_OBJECT +public: + LockWidget(const QString &identifier); + ~LockWidget(); + +protected Q_SLOTS: + void lock(); + void unlock(); + + void updateLockView(); + +private: + KContacts::Lock *mLock = nullptr; + + QLabel *mStatus = nullptr; + QTreeWidget *mLockView = nullptr; +}; + +#endif diff --git a/autotests/testroundtrip.cpp b/autotests/testroundtrip.cpp new file mode 100644 index 0000000..0d709ad --- /dev/null +++ b/autotests/testroundtrip.cpp @@ -0,0 +1,159 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2012 Kevin Krammer + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "addressee.h" + +#include "converter/vcardconverter.h" + +#include +#include +#include +#include + +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("inputFile"); + QTest::addColumn("output2_1File"); + QTest::addColumn("output3_0File"); + QTest::addColumn("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 outputLines = outputData.split('\n'); + const QList outputRefLines = outputRefData.split('\n'); + for (int i = 0; i < qMin(outputLines.count(), outputRefLines.count()); ++i) { + const QByteArray &actual = outputLines.at(i); + const QByteArray &expect = outputRefLines.at(i); + if (actual != expect) { + qCritical() << "Mismatch in" << version << "output line" << (i + 1); + QCOMPARE(actual, expect); + QCOMPARE(actual.count(), expect.count()); + } + } + QCOMPARE(outputLines.count(), outputRefLines.count()); + QCOMPARE(outputData.size(), outputRefData.size()); +} + +void RoundtripTest::testVCardRoundtrip() +{ + QFETCH(QString, inputFile); + QFETCH(QString, output2_1File); + QFETCH(QString, output3_0File); + QFETCH(QString, output4_0File); + + QVERIFY2(!output2_1File.isEmpty() || !output3_0File.isEmpty() || !output4_0File.isEmpty(), "No reference output file for either format version"); + + QFile input(QFileInfo(mInputDir, inputFile).absoluteFilePath()); + QVERIFY(input.open(QIODevice::ReadOnly)); + + const QByteArray inputData = input.readAll(); + QVERIFY(!inputData.isEmpty()); + + VCardConverter converter; + const Addressee::List list = converter.parseVCards(inputData); + QVERIFY(!list.isEmpty()); + + if (!output2_1File.isEmpty()) { + const QByteArray outputData = converter.createVCards(list, VCardConverter::v2_1); + + QFile outputFile(QFileInfo(mOutput2_1Dir, output2_1File).absoluteFilePath()); + QVERIFY(outputFile.open(QIODevice::ReadOnly)); + + const QByteArray outputRefData = outputFile.readAll(); + compareBuffers("v2.1", outputData, outputRefData); + } + + if (!output3_0File.isEmpty()) { + const QByteArray outputData = converter.createVCards(list, VCardConverter::v3_0); + + QFile outputFile(QFileInfo(mOutput3_0Dir, output3_0File).absoluteFilePath()); + QVERIFY(outputFile.open(QIODevice::ReadOnly)); + + const QByteArray outputRefData = outputFile.readAll(); + compareBuffers("v3.0", outputData, outputRefData); + } +#if 0 + if (!output4_0File.isEmpty()) { + const QByteArray outputData = converter.createVCards(list, VCardConverter::v4_0); + + QFile outputFile(QFileInfo(mOutput4_0Dir, output4_0File).absoluteFilePath()); + QVERIFY(outputFile.open(QIODevice::ReadOnly)); + + const QByteArray outputRefData = outputFile.readAll(); + compareBuffers("v4.0", outputData, outputRefData); + } +#endif +} + +QTEST_MAIN(RoundtripTest) + +#include "testroundtrip.moc" diff --git a/autotests/testroundtrip.qrc b/autotests/testroundtrip.qrc new file mode 100644 index 0000000..af1c2d3 --- /dev/null +++ b/autotests/testroundtrip.qrc @@ -0,0 +1,71 @@ + + + + data/vcard1.vcf + data/vcard2.vcf + data/vcard3.vcf + data/vcard4.vcf + data/vcard5.vcf + data/vcard6.vcf + data/vcard7.vcf + data/vcard8.vcf + data/vcard9.vcf + data/vcard10.vcf + data/vcard11.vcf + data/vcard12.vcf + data/vcard13.vcf + data/vcard14.vcf + data/vcard15.vcf + data/vcard_extension_case_normalization.vcf + data/vcard_legacy_messaging_fields.vcf + + + + + + + data/vcard1.vcf.2_1ref + data/vcard2.vcf.2_1ref + data/vcard3.vcf.2_1ref + data/vcard6.vcf.2_1ref + data/vcard7.vcf.2_1ref + data/vcard12.vcf.2_1ref + data/vcard14.vcf.2_1ref + + + + + data/vcard1.vcf.ref + data/vcard2.vcf.ref + data/vcard3.vcf.ref + data/vcard4.vcf.ref + data/vcard5.vcf.ref + data/vcard6.vcf.ref + data/vcard7.vcf.ref + data/vcard8.vcf.ref + data/vcard9.vcf.ref + data/vcard10.vcf.ref + data/vcard11.vcf.ref + data/vcard12.vcf.ref + data/vcard13.vcf.ref + data/vcard14.vcf.ref + data/vcard15.vcf.ref + data/vcard_extension_case_normalization.vcf.ref + data/vcard_legacy_messaging_fields.vcf.ref + + + + + + + data/v4_0.vcard1.vcf.ref + data/v4_0.vcard2.vcf.ref + data/v4_0.vcard3.vcf.ref + data/v4_0.vcard4.vcf.ref + data/v4_0.vcard5.vcf.ref + data/v4_0.vcard6.vcf.ref + data/v4_0.vcard7.vcf.ref + data/v4_0.vcard8.vcf.ref + + + diff --git a/autotests/timezonetest.cpp b/autotests/timezonetest.cpp new file mode 100644 index 0000000..02acc9e --- /dev/null +++ b/autotests/timezonetest.cpp @@ -0,0 +1,129 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "timezonetest.h" +#include "kcontacts/timezone.h" +#include "vcardtool_p.h" +#include + +QTEST_MAIN(TimeZoneTest) + +void TimeZoneTest::emptyTest() +{ + KContacts::TimeZone timezone; + + QVERIFY(timezone.isValid() == false); +} + +void TimeZoneTest::storeTest() +{ + KContacts::TimeZone timezone; + + timezone.setOffset(2); + + QVERIFY(timezone.offset() == 2); +} + +void TimeZoneTest::equalsTest() +{ + KContacts::TimeZone timezone1; + KContacts::TimeZone timezone2; + + timezone1.setOffset(2); + timezone2.setOffset(2); + + QVERIFY(timezone1 == timezone2); +} + +void TimeZoneTest::differsTest() +{ + KContacts::TimeZone timezone1(2); + KContacts::TimeZone timezone2(3); + + QVERIFY(timezone1 != timezone2); + QVERIFY(timezone1 != KContacts::TimeZone()); +} + +void TimeZoneTest::assignmentTest() +{ + KContacts::TimeZone timezone1; + KContacts::TimeZone timezone2; + + timezone1.setOffset(2); + timezone1 = timezone2; + + QVERIFY(timezone1 == timezone2); +} + +void TimeZoneTest::serializeTest() +{ + KContacts::TimeZone timezone1; + KContacts::TimeZone timezone2; + + timezone1.setOffset(2); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << timezone1; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> timezone2; + + QVERIFY(timezone1 == timezone2); +} + +void TimeZoneTest::shouldGenerateVCard3() +{ + KContacts::Addressee::List lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::TimeZone timezone; + + timezone.setOffset(2); + addr.setTimeZone(timezone); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected; + expected = QByteArray( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TZ:+00:02\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void TimeZoneTest::shouldGenerateVCard4() +{ + // TODO fixme. + KContacts::Addressee::List lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::TimeZone timezone; + + timezone.setOffset(2); + addr.setTimeZone(timezone); + + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + const QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TZ:+00:02\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} diff --git a/autotests/timezonetest.h b/autotests/timezonetest.h new file mode 100644 index 0000000..2ecd513 --- /dev/null +++ b/autotests/timezonetest.h @@ -0,0 +1,28 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef TIMEZONE_TEST_H +#define TIMEZONE_TEST_H + +#include + +class TimeZoneTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void emptyTest(); + void storeTest(); + void equalsTest(); + void differsTest(); + void assignmentTest(); + void serializeTest(); + void shouldGenerateVCard3(); + void shouldGenerateVCard4(); +}; + +#endif diff --git a/autotests/titletest.cpp b/autotests/titletest.cpp new file mode 100644 index 0000000..8b2aaea --- /dev/null +++ b/autotests/titletest.cpp @@ -0,0 +1,259 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "titletest.h" +#include "parametermap_p.h" +#include "title.h" +#include "vcardtool_p.h" +#include + +TitleTest::TitleTest(QObject *parent) + : QObject(parent) +{ +} + +TitleTest::~TitleTest() +{ +} + +void TitleTest::shouldHaveDefaultValue() +{ + KContacts::Title title; + QVERIFY(!title.isValid()); + QVERIFY(title.title().isEmpty()); + QVERIFY(title.params().empty()); +} + +void TitleTest::shouldAssignValue() +{ + const QString lang(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + KContacts::Title title(lang); + title.setParams(params); + QVERIFY(title.isValid()); + QVERIFY(!title.title().isEmpty()); + QCOMPARE(title.title(), lang); + QVERIFY(!title.params().empty()); + QCOMPARE(title.params(), params); +} + +void TitleTest::shouldAssignExternal() +{ + KContacts::Title title; + const QString lang(QStringLiteral("fr")); + title.setTitle(lang); + QVERIFY(title.isValid()); + QCOMPARE(title.title(), lang); +} + +void TitleTest::shouldSerialized() +{ + KContacts::Title title; + KContacts::Title result; + const QString lang(QStringLiteral("fr")); + title.setTitle(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + title.setParams(params); + + QByteArray data; + QDataStream s(&data, QIODevice::WriteOnly); + s << title; + + QDataStream t(&data, QIODevice::ReadOnly); + t >> result; + + QVERIFY(title == result); +} + +void TitleTest::shouldEqualTitle() +{ + KContacts::Title title; + KContacts::Title result; + const QString lang(QStringLiteral("fr")); + title.setTitle(lang); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + title.setParams(params); + + result = title; + QVERIFY(title == result); +} + +void TitleTest::shouldParseTwoTitles() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "Title:boo\n" + "Title:bla\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraTitleList().count(), 2); + QCOMPARE(lst.at(0).title(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).extraTitleList().at(0).title(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).extraTitleList().at(1).title(), QStringLiteral("bla")); +} + +void TitleTest::shouldParseTitle() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "Title:boo\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraTitleList().count(), 1); + QCOMPARE(lst.at(0).title(), QStringLiteral("boo")); + QCOMPARE(lst.at(0).extraTitleList().at(0).title(), QStringLiteral("boo")); +} + +void TitleTest::shouldParseWithoutTitle() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + QCOMPARE(lst.at(0).extraTitleList().count(), 0); + QCOMPARE(lst.at(0).title(), QString()); +} + +void TitleTest::shouldCreateVCard() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Title::List lstTitle; + KContacts::Title title(QStringLiteral("fr")); + lstTitle << title; + addr.setExtraTitleList(lstTitle); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TITLE:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void TitleTest::shouldCreateVCardWithTwoTitle() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Title::List lstTitle; + KContacts::Title title(QStringLiteral("fr")); + KContacts::Title title2(QStringLiteral("fr2")); + lstTitle << title << title2; + addr.setExtraTitleList(lstTitle); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TITLE:fr\r\n" + "TITLE:fr2\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + + QCOMPARE(ba, expected); +} + +void TitleTest::shouldCreateVCardWithParameters() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Title::List lstTitle; + KContacts::Title title(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + title.setParams(params); + lstTitle << title; + addr.setExtraTitleList(lstTitle); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TITLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +void TitleTest::shouldGenerateTitleForVCard3() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Title::List lstTitle; + KContacts::Title title(QStringLiteral("fr")); + KContacts::ParameterMap params; + params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}}); + params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}}); + title.setParams(params); + lstTitle << title; + addr.setExtraTitleList(lstTitle); + lst << addr; + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0); + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:3.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TITLE;FOO1=bla1,blo1;FOO2=bla2,blo2:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QCOMPARE(ba, expected); +} + +QTEST_MAIN(TitleTest) diff --git a/autotests/titletest.h b/autotests/titletest.h new file mode 100644 index 0000000..6ed9e14 --- /dev/null +++ b/autotests/titletest.h @@ -0,0 +1,34 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef TITLETEST_H +#define TITLETEST_H + +#include + +class TitleTest : public QObject +{ + Q_OBJECT +public: + explicit TitleTest(QObject *parent = nullptr); + ~TitleTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValue(); + void shouldAssignExternal(); + void shouldSerialized(); + void shouldEqualTitle(); + void shouldParseTwoTitles(); + void shouldParseTitle(); + void shouldParseWithoutTitle(); + void shouldCreateVCard(); + void shouldCreateVCardWithTwoTitle(); + void shouldCreateVCardWithParameters(); + void shouldGenerateTitleForVCard3(); +}; + +#endif // TITLETEST_H diff --git a/autotests/vcarddragtest.cpp b/autotests/vcarddragtest.cpp new file mode 100644 index 0000000..c21c35e --- /dev/null +++ b/autotests/vcarddragtest.cpp @@ -0,0 +1,169 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB a KDAB Group company + SPDX-FileContributor: Kevin Krammer + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include + +#include "converter/kcontacts/vcardconverter.h" +#include "kcontacts/vcarddrag.h" + +#include +using namespace KContacts; + +class VCardDragTest : public QObject +{ + Q_OBJECT + +public: + VCardDragTest(); + +private: + Addressee mAddressee1; + Addressee mAddressee2; + +private Q_SLOTS: + void testPopulate(); + void testCanDecode(); + void testFromMimeData(); +}; + +QTEST_MAIN(VCardDragTest) + +VCardDragTest::VCardDragTest() + : QObject() +{ + mAddressee1.setGivenName(QStringLiteral("Kevin")); + mAddressee1.setFamilyName(QStringLiteral("Krammer")); + mAddressee1.addEmail(QStringLiteral("kevin.krammer@gmx.at")); + + mAddressee2.setGivenName(QStringLiteral("Tobias")); + mAddressee2.setFamilyName(QStringLiteral("König")); + mAddressee2.addEmail(QStringLiteral("tokoe@kde.org")); +} + +void VCardDragTest::testPopulate() +{ + VCardConverter converter; + const QByteArray vcard = converter.createVCard(mAddressee1); + QVERIFY(!vcard.isEmpty()); + + QMimeData *data = new QMimeData(); + bool result = VCardDrag::populateMimeData(data, vcard); + QVERIFY(result); + QVERIFY(data->hasFormat(KContacts::Addressee::mimeType())); + QCOMPARE(data->data(KContacts::Addressee::mimeType()), vcard); + delete data; + + data = new QMimeData(); + result = VCardDrag::populateMimeData(data, Addressee::List() << mAddressee1); + QVERIFY(result); + QVERIFY(data->hasFormat(KContacts::Addressee::mimeType())); + QCOMPARE(data->data(KContacts::Addressee::mimeType()), vcard); + delete data; + + const QByteArray vcards = converter.createVCards(Addressee::List() << mAddressee1 << mAddressee2); + data = new QMimeData(); + result = VCardDrag::populateMimeData(data, Addressee::List() << mAddressee1 << mAddressee2); + QVERIFY(result); + QVERIFY(data->hasFormat(KContacts::Addressee::mimeType())); + QCOMPARE(data->data(KContacts::Addressee::mimeType()), vcards); + delete data; + + data = new QMimeData(); + result = VCardDrag::populateMimeData(data, Addressee::List()); + QVERIFY(!result); + QVERIFY(!data->hasFormat(KContacts::Addressee::mimeType())); + delete data; +} + +void VCardDragTest::testCanDecode() +{ + VCardConverter converter; + const QByteArray vcard = converter.createVCard(mAddressee1); + QVERIFY(!vcard.isEmpty()); + + QMimeData *data = new QMimeData(); + data->setData(Addressee::mimeType(), vcard); + QVERIFY(VCardDrag::canDecode(data)); + delete data; + + data = new QMimeData(); + data->setData(QStringLiteral("text/x-vcard"), vcard); + QVERIFY(VCardDrag::canDecode(data)); + delete data; + + data = new QMimeData(); + data->setData(QStringLiteral("application/octetstream"), vcard); + QVERIFY(!VCardDrag::canDecode(data)); + delete data; +} + +void VCardDragTest::testFromMimeData() +{ + VCardConverter converter; + const QByteArray vcard = converter.createVCard(mAddressee1); + QVERIFY(!vcard.isEmpty()); + + QByteArray content; + + QMimeData *data = new QMimeData(); + data->setData(Addressee::mimeType(), vcard); + bool result = VCardDrag::fromMimeData(data, content); + QVERIFY(result); + QCOMPARE(content, vcard); + delete data; + + data = new QMimeData(); + data->setData(QStringLiteral("text/x-vcard"), vcard); + result = VCardDrag::fromMimeData(data, content); + QVERIFY(result); + QCOMPARE(content, vcard); + delete data; + + data = new QMimeData(); + data->setData(QStringLiteral("application/octetstream"), vcard); + result = VCardDrag::fromMimeData(data, content); + QVERIFY(!result); + delete data; + + const QByteArray vcards = converter.createVCards(Addressee::List() << mAddressee1 << mAddressee2); + QVERIFY(!vcards.isEmpty()); + + Addressee::List addresseeList; + + data = new QMimeData(); + data->setData(Addressee::mimeType(), vcards); + result = VCardDrag::fromMimeData(data, addresseeList); + QVERIFY(result); + QCOMPARE(addresseeList.count(), 2); + QCOMPARE(addresseeList[0], mAddressee1); + QCOMPARE(addresseeList[1], mAddressee2); + delete data; + + data = new QMimeData(); + data->setData(QStringLiteral("text/x-vcard"), vcards); + result = VCardDrag::fromMimeData(data, addresseeList); + QVERIFY(result); + QCOMPARE(addresseeList.count(), 2); + QCOMPARE(addresseeList[0], mAddressee1); + QCOMPARE(addresseeList[1], mAddressee2); + delete data; + + data = new QMimeData(); + data->setData(QStringLiteral("application/octetstream"), vcards); + result = VCardDrag::fromMimeData(data, addresseeList); + QVERIFY(!result); + delete data; + + data = new QMimeData(); + data->setData(Addressee::mimeType(), QByteArray()); + result = VCardDrag::fromMimeData(data, addresseeList); + QVERIFY(!result); + delete data; +} + +#include "vcarddragtest.moc" diff --git a/autotests/vcardlinetest.cpp b/autotests/vcardlinetest.cpp new file mode 100644 index 0000000..55f078d --- /dev/null +++ b/autotests/vcardlinetest.cpp @@ -0,0 +1,114 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "vcardlinetest.h" +#include "vcardline_p.h" +#include + +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 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 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 map; + for (int i = 0; i < 5; ++i) { + map.insert(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i)); + line.addParameter(QStringLiteral("foo%1").arg(i), QStringLiteral("bla%1").arg(i)); + } + const QVariant valueVariant = QVariant(QStringLiteral("a")); + line.setValue(valueVariant); + + QVERIFY(!line.parameterList().isEmpty()); + QCOMPARE(line.parameterList(), QStringList() << map.keys()); + + QCOMPARE(line.identifier(), identifier); + + QCOMPARE(line.group(), group); + QCOMPARE(line.value(), valueVariant); + + KContacts::VCardLine copyLine(line); + QVERIFY(line == copyLine); +} + +QTEST_MAIN(VCardLineTest) diff --git a/autotests/vcardlinetest.h b/autotests/vcardlinetest.h new file mode 100644 index 0000000..9992884 --- /dev/null +++ b/autotests/vcardlinetest.h @@ -0,0 +1,26 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef VCARDLINETEST_H +#define VCARDLINETEST_H + +#include + +class VCardLineTest : public QObject +{ + Q_OBJECT +public: + explicit VCardLineTest(QObject *parent = nullptr); + ~VCardLineTest() override; +private Q_SLOTS: + void shouldHaveDefaultValue(); + void shouldAssignValues(); + void shouldCopyValue(); + void shouldEqualValue(); +}; + +#endif // VCARDLINETEST_H diff --git a/autotests/vcardtool_benchmark.cpp b/autotests/vcardtool_benchmark.cpp new file mode 100644 index 0000000..602d45b --- /dev/null +++ b/autotests/vcardtool_benchmark.cpp @@ -0,0 +1,67 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016 David Faure + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "vcardtool_benchmark.h" +#include "title.h" +#include "vcardtool_p.h" +#include + +PerformanceTest::PerformanceTest(QObject *parent) + : QObject(parent) +{ +} + +PerformanceTest::~PerformanceTest() +{ +} + +void PerformanceTest::testParserPerformance() +{ + QByteArray vcarddata( + "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:LastName;FirstName;;;\n" + "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n" + "Title:boo\n" + "REV:2015-03-14T09:24:45+00:00\n" + "FN:FirstName LastName\n" + "END:VCARD\n"); + + QBENCHMARK { + KContacts::VCardTool vcard; + const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata); + QCOMPARE(lst.count(), 1); + } +} + +void PerformanceTest::testExportPerformance() +{ + KContacts::AddresseeList lst; + KContacts::Addressee addr; + addr.setEmails(QStringList() << QStringLiteral("foo@kde.org")); + addr.setUid(QStringLiteral("testuid")); + KContacts::Title::List lstTitle; + KContacts::Title title(QStringLiteral("fr")); + lstTitle << title; + addr.setExtraTitleList(lstTitle); + lst << addr; + QByteArray expected( + "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "EMAIL:foo@kde.org\r\n" + "N:;;;;\r\n" + "TITLE:fr\r\n" + "UID:testuid\r\n" + "END:VCARD\r\n\r\n"); + QBENCHMARK { + KContacts::VCardTool vcard; + const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0); + QCOMPARE(ba, expected); + } +} + +QTEST_GUILESS_MAIN(PerformanceTest) diff --git a/autotests/vcardtool_benchmark.h b/autotests/vcardtool_benchmark.h new file mode 100644 index 0000000..96442b6 --- /dev/null +++ b/autotests/vcardtool_benchmark.h @@ -0,0 +1,24 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016 David Faure + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef VCARDTOOL_BENCHMARK_H +#define VCARDTOOL_BENCHMARK_H + +#include + +class PerformanceTest : public QObject +{ + Q_OBJECT +public: + explicit PerformanceTest(QObject *parent = nullptr); + ~PerformanceTest() override; +private Q_SLOTS: + void testParserPerformance(); + void testExportPerformance(); +}; + +#endif diff --git a/docs/AddressFormat.md b/docs/AddressFormat.md new file mode 100644 index 0000000..bd89f83 --- /dev/null +++ b/docs/AddressFormat.md @@ -0,0 +1,64 @@ +# Localized Address Formats + +KContact's address formatting largely follows the approach taken by +[libaddressinput](https://github.com/google/libaddressinput), with adding +a few additional fields and formatting styles. + +Address formatting rules are specified in the `addressformatrc` file in the `src` +directory, grouped by country. The formatting rules format is compatible +with [that of libaddressinput](https://github.com/google/libaddressinput/wiki/AddressValidationMetadata). + +## Address Format Information + +* AddressFormat: the default address format using native script, using the placeholders + specified below (mandatory). +* LatinAddressFormat: for countries using a non-latin script this can provide + an alternative format for addresses transliterated to a latin script (optional). +* BusinessAddressFormat: used for formatting postal addresses of an organization. + This only needs to be specified if the format differs from the generic case. +* LatinBusinessAddressFormat: see LatinAddressFormat. + +All of the above values may be specified in multiple variants for multi-lingual countries. +This is typically only needed when the format rule contains literal strings, e.g. +for specifying a post office box. + +* Required: The address fields that are minimally required to form a valid address + in this country. +* Upper: The address fields to be formatted in upper case regardless of the input + for postal addresses. + +The above values are specified as a string containing the single letter address field +identifiers listed below. E.g. "AZC" would indicate that a street address, postal code +and locality (city) are required. + +* PostalCodeFormat: A regular expression matching all valid postal codes in + this country. + +## Address Field Identifiers + +The following identifiers are used in the formatting rules to refer to specific +parts of an address: + +* N - Name of a person/Recipient of a letter +* O - Organization +* A – Street address +* C – Locality (city) +* S – Region (country subdivision/administrative area/state/etc) +* Z – Postal code/zip code +* R - Country + +Identifiers used by libaddressinput but not by KContacts: + +* D – Dependent locality (may be an inner-city district or a suburb) +* X – Sorting code + +## Address Formatting Rules + +Address formatting rules consist of a sequence of elements of the following +three types: +* Fields - Insert the value of the corresponding address field, specified as a `%` sign + followed by a field identifier (see above). +* Separators - Represented as `%n`. Depending on the formatting style those are replaced + e.g. a line break or a script-dependent separator string. +* Literals - Any other string. Inserted as-is in the output, given it is neither preceded nor + followed by an empty field. diff --git a/docs/Doxyfile.local b/docs/Doxyfile.local new file mode 100644 index 0000000..de04a8b --- /dev/null +++ b/docs/Doxyfile.local @@ -0,0 +1,10 @@ +### KApiDox Project-specific Overrides File + +# define so that deprecated API is not skipped +PREDEFINED += \ + "KCONTACTS_ENABLE_DEPRECATED_SINCE(x, y)=1" \ + "KCONTACTS_BUILD_DEPRECATED_SINCE(x, y)=1" \ + "KCONTACTS_DEPRECATED_VERSION(x, y, t)=" \ + "KCONTACTS_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)=" \ + "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION(x, y, t)=" \ + "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)=" diff --git a/metainfo.yaml b/metainfo.yaml new file mode 100644 index 0000000..d66fcfa --- /dev/null +++ b/metainfo.yaml @@ -0,0 +1,17 @@ +maintainer: mlaurent +description: Support for vCard contacts +tier: 2 +type: functional +public_lib: true +platforms: + - name: All +portingAid: false +deprecated: false +libraries: + - qmake: KContacts + cmake: "KF5::Contacts" +cmakename: KF5Contacts + +group: Frameworks +subgroup: Tier 2 +release: true diff --git a/po/ar/kcontacts5.po b/po/ar/kcontacts5.po new file mode 100644 index 0000000..500d65f --- /dev/null +++ b/po/ar/kcontacts5.po @@ -0,0 +1,745 @@ +# translation of kabc.po to Arabic +# translation of kabc.po to +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# Youssef Chahibi , 2007. +# zayed , 2009, 2021. +# Safa Alfulaij , 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 \n" +"Language-Team: ar\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"X-Generator: Lokalize 21.07.70\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "صندوق البريد" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "معلومات العنوان الموسّعة" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "الشّارع" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "المحلّة" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "المنطقة" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "الرّمز البريديّ" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "الدّولة" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "ملصق التّسليم" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "محليّ" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "عالميّ" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "بريديّ" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "للطّرود" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "المنزل" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "العمل" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "العنوان المفضّل" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "آخر" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "المعرّف الفريد" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "الاسم" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "الاسم المنسّق" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "اسم العائلة" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "الاسم المُعطى" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "أسماء إضافيّة" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "السّوابق التّشريفيّة" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "اللواحق التّشريفيّة" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "الاسم المستعار" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "عيد الميلاد" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "عنوان المنزل، الشّارع" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "عنوان المنزل، صندوق البريد" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "عنوان المنزل، المدينة" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "عنوان المنزل، المقاطعة" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "عنوان المنزل، الرّمز البريديّ" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "عنوان المنزل، الدّولة" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "ملصق عنوان المنزل" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "عنوان العمل، الشّارع" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "عنوان العمل، صندوق البريد" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "عنوان العمل، المدينة" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "عنوان العمل، المقاطعة" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "عنوان العمل، الرّمز البريديّ" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "عنوان العمل، الدّولة" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "ملصق عنوان العمل" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "هاتف المنزل" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "هاتف العمل" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "الهاتف المحمول" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "فاكس المنزل" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "فاكس العمل" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "هاتف السّيارة" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "المنادي" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "عنوان البريد الإلكترونيّ" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "عميل البريد" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "المنطقة الزمنيّة" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "الموقع الجغرافيّ" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "اللقب" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "الدّور" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "المنظّمة" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "القِسم" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "الملاحظة" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "معرف المنتج" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "تاريخ المراجعة" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "سلسلة الفرز" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "الصّفحة الرّئيسيّة" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "التصنيف الأمني" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "الشّعار" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "الصّورة" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "الصّوت" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "د." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "الآنسة" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "السّيّد" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "السّيّدة" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "الفاضلة" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "البروفيسور" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "الأوّل" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "الثّاني" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "الثّالث" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "الابن" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "الأبّ" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "حقل مجهول" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "الكلّ" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "متكرّر" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "العنوان" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "البريد الإلكترونيّ" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "شخصيّ" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "مخصّص" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "غير معرّف" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "مخصّص" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "نوع مجهول" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "رقم الهاتف" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "المنزل" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "العمل" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "المرسال" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "المفضّل" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "الصّوت" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "الفاكس" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "المحمول" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "الڤديو" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "صندوق البريد" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "المودم" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "السّيارة" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "آخر" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "الرّقم المفضّل" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "فاكس العمل" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "عامّ" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "خاصّ" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "سرّيّ" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "نوع مجهول" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "مفضلة" + +#~ msgid "List of Emails" +#~ msgstr "قائمة بالبريد إلكتروني" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Mohamed SAAD محمد سعد, Majed Ali" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "metehyi@free.fr, GMajedli@gmail.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "غير قادر على تحميل المورد '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "انتقِ المرسل إليه" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "الاسم" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "البريد الإلكتروني" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "مُنتقى" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "ألغ الانتقاء" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "اضبط قوائم التوزيع" + +#~ msgid "Select Email Address" +#~ msgstr "اختر عنوان البريد الإلكتروني" + +#~ msgid "Email Addresses" +#~ msgstr "عناوين البريد الإلكتروني" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "نعم" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "لا" + +#~ msgid "New List..." +#~ msgstr "قائمة جديدة..." + +#~ msgid "Rename List..." +#~ msgstr "أعد تسمية قائمة..." + +#~ msgid "Remove List" +#~ msgstr "إحذف القائمة" + +#~ msgid "Available addresses:" +#~ msgstr "العناوين المتوفرة:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "البريد الإلكتروني المفضل" + +#~ msgid "Add Entry" +#~ msgstr "اضف خانة" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "البريد الإلكتروني" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "استخدم المفضل" + +#~ msgid "Change Email..." +#~ msgstr "غيّر البريد الإلكتروني..." + +#~ msgid "Remove Entry" +#~ msgstr "إزالة خانة" + +#~ msgid "New Distribution List" +#~ msgstr "قائمة توزيع جديدة" + +#~ msgid "Please enter &name:" +#~ msgstr "فضلا أدخل الإ&سم:" + +#~ msgid "Distribution List" +#~ msgstr "قائمة التوزيع" + +#~ msgid "Please change &name:" +#~ msgstr "فضلا غيِّر الا&سم:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "حذف قائمة التوزيع '%1' ؟" + +#~ msgid "Selected addressees:" +#~ msgstr "العناوين المنتقاة:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "العناوين المنتقاة في '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "لا" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "تنسيق vCard" + +#~ msgid "No description available." +#~ msgstr "لا يوجد وصف." + +#~ msgid "Unable to open lock file." +#~ msgstr "غير قادر على فتح ملف القفل." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "المورد '%1' مقفل بواسطة التطبيق '%2'." + +#~ msgid "Error" +#~ msgstr "خطأ" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "فشل إلغاء القفل. ملف القفل مملوك لعملية أخرى: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: نجحت جميع عمليات القفل لكن لم يحدث أي قفل حقيقي." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: فشلت جميع عمليات القفل." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "فشل في حفظ المورد '%1'." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "فشل في حفظ المورد '%1'." + +#, fuzzy +#~ msgid "Unable to open resource '%1'." +#~ msgstr "غير قادر على تحميل المورد '%1'" + +#, fuzzy +#~ msgid "Default Address Book" +#~ msgstr "دفتر العناوين الإفتراضي" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "غير قادر على حفظ المورد '%1' . لأنها مقفلة." diff --git a/po/az/kcontacts5.po b/po/az/kcontacts5.po new file mode 100644 index 0000000..f906531 --- /dev/null +++ b/po/az/kcontacts5.po @@ -0,0 +1,585 @@ +# Copyright (C) YEAR This file is copyright: +# This file is distributed under the same license as the kcontacts package. +# +# Xəyyam , 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 \n" +"Language-Team: Azerbaijani \n" +"Language: az\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 22.04.3\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Poçt Abunəçi Qutusu" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Ünvan haqqında ətraflı məlumat" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Küçə" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Yaşayış Məskəni" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Bölgə" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Poçt Kodu" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Ölkə" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Çatdırılma Etiketi" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Ölkə Daxili Ünvan" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Beynəlxalq" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Məktubların çatdırılma ünvanı" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Göndərişlər üçün ünvan" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Ev Ünvanı" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "İş Ünvanı" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Əsas ünvan" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Başqa ünvanlar" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unikal İdentifikator" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ad" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Tam Adı" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Soyadı" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Adı" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Əlavə Adlar" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Fəxri Müraciətlər (adın əvvəlində)" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Fəxri Müraciətlər (adın sonunda)" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Ləqəb" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Ad günü" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Ev Ünvanı: küçə" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Ev Ünvanı: Poçt qutusu" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Ev Ünvanı: şəhər" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Ev Ünvanı: Rayon/Bölgə" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Ev Ünvanı İndeksi" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Ev Ünvanı: Olkə" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Ev Ünvanı: yarlıq" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Xidməti Ünvan: küçə" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Xidməti Ünvan: Abunəçi Qutusu" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Xidməti Ünvan: Şəhər" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Xidməti Ünvan: Rayon/Bölgə" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Xidməti Ünvan: indeks" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Xidməti Ünvan: Ölkə" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Xidməti Ünvan: yarlıq" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Ev Telefonu" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Xidməti Telefon" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobil Telefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Ev Faksı" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Xidməti Faks" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Avtomobil Telefonu" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "İSDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Peycer" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-poçt ünvanı" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-poçt müştərisi" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Saat Qurşağı" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Coğrafi Məkan" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Müraciət forması" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Vəzifəsi" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Təşkilat" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Şöbə" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Qeyd" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Məhsulun identifikatoru" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Düzəliş Tarixi" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Çeşidləmə" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Veb Sayt" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Təlükəsizlik Səviyyəsi" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Loqo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Səs" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Xanım" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Cənab" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Xanım" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Xanım" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Kiçik" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Böyük" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Naməlum Sahə" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Bütün" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Tez-tez təkrar olunan" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Ünvan" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-poçt" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Şəxsi" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Fərdi" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Qeyri-müəyyən" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +# "Ən Yaxşı Məxfilik Açarı" +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP (məxfilik açarı)(" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Fərdi açar" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Naməlum növ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefon nömrəsi" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Ev Telefonu" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "İş Telefonu" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mesencer" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Əsas Telefon" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Səs" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "E-poçt qutusu" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Avtomobil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Digər Telefon Növü" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Əsas Nömrə" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Xidməti Faks" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publik" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Gizli" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Məxfi" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Naməlum Növ" diff --git a/po/be/kcontacts5.po b/po/be/kcontacts5.po new file mode 100644 index 0000000..78e44fe --- /dev/null +++ b/po/be/kcontacts5.po @@ -0,0 +1,773 @@ +# translation of kabc.po to Belarusian +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Darafei Praliaskouski , 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 \n" +"Language-Team: Belarusian \n" +"Language: be\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || n%10>=5 && n%10<=9 || n" +"%100>=11 && n%100<=14 ? 2 : 3);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Абанентавая скрыня" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Пашыраная інфармацыя аб адрасе" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Вуліца" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Раён" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Рэгіён" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Паштовы індэкс" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Краіна" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "" + +#: address.cpp:353 +#, fuzzy, kde-format +#| msgid "Domestic" +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Унутраны" + +#: address.cpp:355 +#, fuzzy, kde-format +#| msgid "International" +msgctxt "Address is not in home country" +msgid "International" +msgstr "Міжнародны" + +#: address.cpp:357 +#, fuzzy, kde-format +#| msgid "Postal" +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Паштовы" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Хатні" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Асноўны адрас" + +#: address.cpp:367 +#, fuzzy, kde-format +#| msgid "Other" +msgctxt "another type of address" +msgid "Other" +msgstr "Іншы" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, fuzzy, kde-format +#| msgid "Name" +msgid "Name" +msgstr "Назва" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, fuzzy, kde-format +#| msgid "Name" +msgid "Nick Name" +msgstr "Назва" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "" + +#: addressee.cpp:868 +#, fuzzy, kde-format +#| msgid "Select Addressee" +msgid "Home Address Street" +msgstr "Выберыце адрасата" + +#: addressee.cpp:873 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Home Address Post Office Box" +msgstr "Абанентавая скрыня" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Home Address State" +msgstr "Адрасы электроннай пошты" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Home Address Label" +msgstr "Адрасы электроннай пошты" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Business Address Post Office Box" +msgstr "Абанентавая скрыня" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Хатні факс" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Пэйджэр" + +#: addressee.cpp:978 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Email Address" +msgstr "Адрасы электроннай пошты" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "" + +#: addressee.cpp:1231 +#, fuzzy, kde-format +#| msgid "No" +msgid "Note" +msgstr "Не" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, fuzzy, kde-format +#| msgctxt "Home Address" +#| msgid "Home" +msgid "Homepage" +msgstr "Хатні" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Др." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Сп-ня" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Сп." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Сп." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Сп." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Праф." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "мал." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Сп." + +#: field.cpp:206 +#, fuzzy, kde-format +#| msgid "Unknown type" +msgid "Unknown Field" +msgstr "Невядомы тып" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "" + +#: field.cpp:223 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgctxt "street/postal" +msgid "Address" +msgstr "Адрасы электроннай пошты" + +#: field.cpp:225 +#, fuzzy, kde-format +#| msgid "Email" +msgid "Email" +msgstr "Электронная пошта" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "" + +#: field.cpp:231 +#, fuzzy, kde-format +#| msgid "Custom" +msgid "Custom" +msgstr "Асаблівы" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "" + +#: key.cpp:198 +#, fuzzy, kde-format +#| msgid "X509" +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, fuzzy, kde-format +#| msgid "PGP" +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, fuzzy, kde-format +#| msgid "Custom" +msgctxt "A custom key" +msgid "Custom" +msgstr "Асаблівы" + +#: key.cpp:207 +#, fuzzy, kde-format +#| msgid "Unknown type" +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Невядомы тып" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Хатні" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Працоўны" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Для паведамленняў" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Голас" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "" + +#: phonenumber.cpp:186 +#, fuzzy, kde-format +#| msgid "Video" +msgctxt "Video phone" +msgid "Video" +msgstr "Відэа" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Паштовая скрыня" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Мадэм" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, fuzzy, kde-format +#| msgid "Other" +msgctxt "another type of phone" +msgid "Other" +msgstr "Іншы" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Асноўны нумар" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Працоўны факс" + +#: secrecy.cpp:98 +#, fuzzy, kde-format +#| msgid "Public" +msgctxt "access is for everyone" +msgid "Public" +msgstr "Публічны" + +#: secrecy.cpp:101 +#, fuzzy, kde-format +#| msgid "Private" +msgctxt "access is by owner only" +msgid "Private" +msgstr "Прыватны" + +#: secrecy.cpp:104 +#, fuzzy, kde-format +#| msgid "Confidential" +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Канфідэнцыйны" + +#: secrecy.cpp:107 +#, fuzzy, kde-format +#| msgid "Unknown type" +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Невядомы тып" + +#~ msgid "List of Emails" +#~ msgstr "Спіс электронных скрыняў" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Дарафей Праляскоўскі" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "komzpa@licei2.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Немагчыма адкрыць рэсурс '%1'" + +#, fuzzy +#~| msgid "Select Addressee" +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Выберыце адрасата" + +#, fuzzy +#~| msgid "Name" +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Назва" + +#, fuzzy +#~| msgid "Email" +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Электронная пошта" + +#, fuzzy +#~| msgid "Selected" +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Вылучаны" + +#, fuzzy +#~| msgid "Unselect" +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Зняць выбар" + +#, fuzzy +#~ msgid "Configure Distribution Lists" +#~ msgstr "Настаўленні спісаў распаўсюджвання" + +#~ msgid "Select Email Address" +#~ msgstr "Выберыце адрас электроннай пошты" + +#~ msgid "Email Addresses" +#~ msgstr "Адрасы электроннай пошты" + +#, fuzzy +#~| msgid "Yes" +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Так" + +#, fuzzy +#~| msgid "No" +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Не" + +#~ msgid "New List..." +#~ msgstr "Новы спіс..." + +#~ msgid "Rename List..." +#~ msgstr "Пераназваць спіс..." + +#~ msgid "Remove List" +#~ msgstr "Выдаліць спіс" + +#~ msgid "Available addresses:" +#~ msgstr "Наяўныя адрасы:" + +#, fuzzy +#~| msgid "Preferred Email" +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Асноўная электронная скрыня" + +#~ msgid "Add Entry" +#~ msgstr "Дадаць запіс" + +#, fuzzy +#~| msgid "Email" +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Электронная пошта" + +#, fuzzy +#~| msgid "Use Preferred" +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Выкарыстоўваць асноўны" + +#~ msgid "Change Email..." +#~ msgstr "Змяніць электронную скрыню..." + +#~ msgid "Remove Entry" +#~ msgstr "Выдаліць запіс" + +#, fuzzy +#~ msgid "New Distribution List" +#~ msgstr "Новы спіс распаўсюджвання" + +#~ msgid "Please enter &name:" +#~ msgstr "Калі ласка, вызначыце &назву:" + +#, fuzzy +#~ msgid "Distribution List" +#~ msgstr "Спіс распаўсюджвання" + +#~ msgid "Please change &name:" +#~ msgstr "Калі ласка, змяніце &назву:" + +#, fuzzy +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Выдаліць спіс распаўсюджвання '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Выбраныя адрасаты:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Выбраныя адрасы ў '%1':" + +#, fuzzy +#~| msgid "No" +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Не" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Фармат vCard" + +#~ msgid "No description available." +#~ msgstr "Апісанне недаступнае." + +#~ msgid "Error" +#~ msgstr "Памылка" + +#, fuzzy +#~| msgid "Unable to load resource '%1'" +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Немагчыма адкрыць рэсурс '%1'" + +#, fuzzy +#~| msgid "Select Addressee" +#~ msgid "Default Address Book" +#~ msgstr "Выберыце адрасата" diff --git a/po/bg/kcontacts5.po b/po/bg/kcontacts5.po new file mode 100644 index 0000000..f8deb6d --- /dev/null +++ b/po/bg/kcontacts5.po @@ -0,0 +1,581 @@ +# Mincho Kondarev , 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 \n" +"Language-Team: Bulgarian \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 22.04.0\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Пощенска кутия" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Информация за разширен адрес" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Улица" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Местност" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Регион" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Пощенски код" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Държава" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Етикет за доставка" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Вътрешни" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Международен" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Пощенски" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Парцел" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Домашен адрес" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Служебен адрес" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Предпочитан адрес" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Други" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Уникален идентификатор" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Име" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Форматирано име" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Фамилно име" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Собствено име" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Допълнителни имена" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Почетни префикси" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Почетни суфикси" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Псевдоним" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Рожден ден" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Улица с домашен адрес" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Пощенска кутия на домашен адрес" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Град на домашен адрес" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Област на домашния адрес" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Пощенски код за домашен адрес" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Държава на домашен адрес" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Етикет с домашен адрес" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Улица на служебен адрес" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Пощенска кутия за служебен адрес" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Служебен адрес град" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Държавен адрес на служебен адреса" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Пощенски код на служебен адрес" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Държава на служебен адреса" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Етикет за служебен адрес" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Домашен телефон" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Служебен Телефон" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Мобилен телефон" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Домашен факс" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Служебен факс" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Телефон на кола" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Пейджър" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Имейл адрес" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Пощенски клиент" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Часова зона" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Географско положение" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Заглавие" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Позиция" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Организация" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Отдел" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Забележка" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Идентификатор на продукта" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Дата на контрол" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Сортиращ низ" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Начална страница" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Клас на сигурност" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Лого" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Снимка" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Звук" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Д-р" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Госпожица" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Г-н" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Г-жа" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Г-ца" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Проф." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Младши" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Старши" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Поле непознати" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Всички" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Често срещан" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Адрес" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Електронна поща" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Лични" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Персонализиран" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Неопределен" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Персонализиран" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Неизвестен тип" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Телефонен номер" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Домашен" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Работен" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Съобщения" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Предпочитан" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Глас" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Мобилен" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Видео" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Пощенска кутия" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Модем" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Кола" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Други" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Предпочитан номер" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Служебен факс" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Публичен" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Частен" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Поверителен" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Неизвестен тип" diff --git a/po/bs/kcontacts5.po b/po/bs/kcontacts5.po new file mode 100644 index 0000000..b8638e9 --- /dev/null +++ b/po/bs/kcontacts5.po @@ -0,0 +1,744 @@ +# Bosnian translation for kdepimlibs +# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 +# This file is distributed under the same license as the kdepimlibs package. +# FIRST AUTHOR , 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 \n" +"Language-Team: Bosnian \n" +"Language: bs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Launchpad (build 16807)\n" +"X-Launchpad-Export-Date: 2013-10-19 05:16+0000\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "PoÅ¡tanski pretinac" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Dodatne informacije o adresi" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Ulica" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Lokalitet" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Oblast" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "PoÅ¡tanski broj" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Zemlja:" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Dostavna oznaka" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domaći" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Međunarodno" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PoÅ¡tanski" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paket" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Početak" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Posao" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Preferirana adresa" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Ostale" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Jedinstveni identifikator" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ime" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Uobličeno ime" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Prezime" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Ime" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Dodatna imena" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Počasni prefiksi" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Počasni sufiksi" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Nadimak" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Rođendan" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Kućna adresa - Ulica" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Kućna adresa, poÅ¡tanski fah" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Kućna adresa - Grad" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Kućna adresa - Kanton" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Kućna adresa - PoÅ¡t. br." + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Kućna adresa - Država" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Kućna adresa - Oznaka" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Poslovna adresa - Ulica" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Poslovna adresa, poÅ¡tanski fah" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Poslovna adresa - Grad" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Poslovna adresa - Kanton" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Poslovna adresa - PoÅ¡t. br." + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Poslovna adresa - Država" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Poslovna adresa - Oznaka" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Kućni telefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon na poslu" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobilni telefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Kućni faks" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax na poslu" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefon u automobilu" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pejdžer" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-mail adresa" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Klijent poÅ¡te" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Vremenska zona" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografski položaj" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Naslov" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Uloga" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizacija" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Odjeljenje" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "BiljeÅ¡ka" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identifikator proizvoda" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Datum revizije" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "String za sortiranje" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Početna stranica" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Sigurnosna klasa" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotip" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotografija" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Zvuk" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Gđica" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Gdin." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Gđa." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "gđica" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Ml." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "St." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Nepoznato polje" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Sve" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Često" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresa" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Lično" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Prilagođeno" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nedefinisano" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Prilagođeno" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Nepoznata vrsta" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Početak" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Posao" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Glasnik" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferirano" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Glas" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobilni" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Sandučić" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Automobil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Ostali" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Preferirani broj" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Faks na poslu" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Javni" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privatni" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Povjerljivi" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Nepoznat tip" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferirano" + +#~ msgid "List of Emails" +#~ msgstr "Lista e-mail adresa" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Samir Ribić,Vedran Ljubovic" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "samir.ribic@etf.unsa.ba,vljubovic@smartnet.ba" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Ne mogu čitati sa resursa '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Izaberite adresanta" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Ime" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Odabrano" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "PoniÅ¡ti odabir" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Podesite liste distribucije" + +#~ msgid "Select Email Address" +#~ msgstr "Izaberite e-adresu" + +#~ msgid "Email Addresses" +#~ msgstr "E-adrese" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Da" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "New List..." +#~ msgstr "Nova lista..." + +#~ msgid "Rename List..." +#~ msgstr "Preimenuj listu..." + +#~ msgid "Remove List" +#~ msgstr "Ukloni listu" + +#~ msgid "Available addresses:" +#~ msgstr "Dostupne adrese:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Preferirani email" + +#~ msgid "Add Entry" +#~ msgstr "Dodaj unos" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Koristi preferirani" + +#~ msgid "Change Email..." +#~ msgstr "Promijeni e-adresu..." + +#~ msgid "Remove Entry" +#~ msgstr "Ukloni stavku" + +#~ msgid "New Distribution List" +#~ msgstr "Nova distribuciona lista" + +#~ msgid "Please enter &name:" +#~ msgstr "Molim unesite &ime:" + +#~ msgid "Distribution List" +#~ msgstr "Lista distribucije" + +#~ msgid "Please change &name:" +#~ msgstr "Molim izmijenite &ime:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Da briÅ¡em distribucionu listu '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Izabrani adresanti:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Izabrane adrese u '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Format vCard-a" + +#~ msgid "No description available." +#~ msgstr "Opis nije dostupan." + +#~ msgid "Unable to open lock file." +#~ msgstr "Ne mogu otvoriti lock datoteku." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Resurs '%1' je zaključan od strane aplikacije '%2'." + +#~ msgid "Error" +#~ msgstr "GreÅ¡ka" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Otključavanje nije uspjelo. Lock datoteku posjeduje drugi proces: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Sve brave su u funkciji ali do zaključavanja ustvari nije doÅ¡lo." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Sva zaključavanja su neuspjeÅ¡na." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Neuspjelo učitavanje resursa '%1'." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Neuspjelo snimanje resursa '%1'." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Ne mogu da otvorim resurs '%1'." + +#~ msgid "Default Address Book" +#~ msgstr "Podrazumijevani adresar" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Ne mogu snimiti resurs '%1' zato Å¡to je zaključan." diff --git a/po/ca/kcontacts5.po b/po/ca/kcontacts5.po new file mode 100644 index 0000000..332458b --- /dev/null +++ b/po/ca/kcontacts5.po @@ -0,0 +1,741 @@ +# Translation of kcontacts5.po to Catalan +# Copyright (C) 2007-2017 This_file_is_part_of_KDE +# This file is distributed under the license LGPL version 2.1 or +# version 3 or later versions approved by the membership of KDE e.V. +# +# Josep M. Ferrer , 2007, 2008, 2009, 2010, 2015, 2017. +# Albert Astals Cid , 2009. +# Manuel Tortosa Moreno , 2009. +# Antoni Bella Pérez , 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 \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Accelerator-Marker: &\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Apartat de correus" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informació ampliada de l'adreça" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Carrer" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localitat" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Província" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Codi postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "País" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etiqueta de lliurament" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Nacional" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paquets postals" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Llar" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Feina" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Adreça preferida" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Altra" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificador únic" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nom" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nom amb format" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Cognoms" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nom" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Noms addicionals" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixos honorífics" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufixos honorífics" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Sobrenom" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Data de naixement" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Carrer de l'adreça particular" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Apartat de correus de l'adreça particular" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Població de l'adreça particular" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Província de l'adreça particular" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Codi postal de l'adreça particular" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "País de l'adreça particular" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiqueta de l'adreça particular" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Carrer de l'adreça professional" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Apartat de correus de l'adreça professional" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Població de l'adreça professional" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Província de l'adreça professional" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Codi postal de l'adreça professional" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "País de l'adreça professional" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etiqueta de l'adreça professional" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telèfon particular" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telèfon professional" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telèfon mòbil" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax de la llar" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax professional" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telèfon del cotxe" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "XDSI" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Cercapersones" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adreça de correu electrònic" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Client de correu" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zona horària" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posició geogràfica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Títol" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Funció" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organització" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departament" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificador del producte" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data de la revisió" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Text curt" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Pàgina personal" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe de seguretat" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotip" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "So" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Sra." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Sra." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Sra." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Camp desconegut" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Tot" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Freqüent" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adreça" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Correu electrònic" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalitzada" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Sense definir" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalitzada" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipus desconegut" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Número de telèfon" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Llar" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Feina" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferit" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Veu" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mòbil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vídeo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Bústia" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Mòdem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Cotxe" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Altres" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Número preferit" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax de la feina" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Públic" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidencial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipus desconegut" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferida" + +#~ msgid "List of Emails" +#~ msgstr "Llista d'adreces electròniques" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "No s'ha pogut carregar el recurs «%1»" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Selecció del destinatari" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nom" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Adreça electrònica" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Selecciona" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Desselecciona" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Configuració de les llistes de distribució" + +#~ msgid "Select Email Address" +#~ msgstr "Selecció de l'adreça de correu electrònic" + +#~ msgid "Email Addresses" +#~ msgstr "Adreces de correu electrònic" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Sí" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "New List..." +#~ msgstr "Llista nova..." + +#~ msgid "Rename List..." +#~ msgstr "Reanomena una llista..." + +#~ msgid "Remove List" +#~ msgstr "Suprimeix la llista" + +#~ msgid "Available addresses:" +#~ msgstr "Adreces disponibles:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Adreça electrònica preferida" + +#~ msgid "Add Entry" +#~ msgstr "Afegeix una entrada" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Adreça electrònica" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Usa la preferida" + +#~ msgid "Change Email..." +#~ msgstr "Canvia l'adreça de correu..." + +#~ msgid "Remove Entry" +#~ msgstr "Suprimeix una entrada" + +#~ msgid "New Distribution List" +#~ msgstr "Llista de distribució nova" + +#~ msgid "Please enter &name:" +#~ msgstr "Introduïu el &nom:" + +#~ msgid "Distribution List" +#~ msgstr "Llista de distribució" + +#~ msgid "Please change &name:" +#~ msgstr "Canvieu el &nom:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Suprimeixo la llista de distribució «%1»?" + +#~ msgid "Selected addressees:" +#~ msgstr "Destinatari seleccionat:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Adreces seleccionades en «%1»:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Format vCard" + +#~ msgid "No description available." +#~ msgstr "No hi ha disponible cap descripció." + +#~ msgid "Unable to open lock file." +#~ msgstr "No s'ha pogut obrir el fitxer de bloqueig." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "El recurs «%1» està bloquejat per l'aplicació «%2»." + +#~ msgid "Error" +#~ msgstr "Error" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "El desbloqueig ha fallat. Un altre procés té el fitxer de bloqueig: %1 " +#~ "(%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: tots els bloqueigs han funcionat, però no s'ha fet cap bloqueig " +#~ "real." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: tots els bloqueigs han fallat." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "La càrrega del recurs «%1» ha fallat." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "El desament del recurs «%1» ha fallat." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "No s'ha pogut obrir el recurs «%1»." + +#~ msgid "Default Address Book" +#~ msgstr "Llibreta d'adreces per omissió" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "No s'ha pogut desar en el recurs «%1». Està bloquejat." diff --git a/po/ca@valencia/kcontacts5.po b/po/ca@valencia/kcontacts5.po new file mode 100644 index 0000000..251fd3d --- /dev/null +++ b/po/ca@valencia/kcontacts5.po @@ -0,0 +1,590 @@ +# Translation of kcontacts5.po to Catalan (Valencian) +# Copyright (C) 2007-2017 This_file_is_part_of_KDE +# This file is distributed under the license LGPL version 2.1 or +# version 3 or later versions approved by the membership of KDE e.V. +# +# Josep M. Ferrer , 2007, 2008, 2009, 2010, 2015, 2017. +# Albert Astals Cid , 2009. +# Manuel Tortosa Moreno , 2009. +# Antoni Bella Pérez , 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 \n" +"Language-Team: Catalan \n" +"Language: ca@valencia\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Accelerator-Marker: &\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Apartat de correus" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informació ampliada de l'adreça" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Carrer" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localitat" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Província" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Codi postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "País" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etiqueta de lliurament" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Nacional" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paquets postals" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Llar" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Faena" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Adreça preferida" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Altra" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificador únic" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nom" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nom amb format" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Cognoms" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nom" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Noms addicionals" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixos honorífics" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufixos honorífics" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Sobrenom" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Data de naixement" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Carrer de l'adreça particular" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Apartat de correus de l'adreça particular" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Població de l'adreça particular" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Província de l'adreça particular" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Codi postal de l'adreça particular" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "País de l'adreça particular" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiqueta de l'adreça particular" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Carrer de l'adreça professional" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Apartat de correus de l'adreça professional" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Població de l'adreça professional" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Província de l'adreça professional" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Codi postal de l'adreça professional" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "País de l'adreça professional" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etiqueta de l'adreça professional" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telèfon particular" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telèfon professional" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telèfon mòbil" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax de la llar" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax professional" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telèfon del cotxe" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "XDSI" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Buscapersones" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adreça de correu electrònic" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Client de correu" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zona horària" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posició geogràfica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Títol" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Funció" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organització" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departament" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificador del producte" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data de la revisió" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Text curt" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Pàgina personal" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe de seguretat" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotip" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "So" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Sra." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Sra." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Sra." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Camp desconegut" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Tot" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Freqüent" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adreça" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Correu electrònic" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalitzada" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Sense definir" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalitzada" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipus desconegut" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Número de telèfon" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Llar" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Faena" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferit" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Veu" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mòbil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vídeo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Bústia" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Mòdem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Cotxe" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Altres" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Número preferit" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax de la faena" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Públic" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidencial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipus desconegut" diff --git a/po/cs/kcontacts5.po b/po/cs/kcontacts5.po new file mode 100644 index 0000000..4debc02 --- /dev/null +++ b/po/cs/kcontacts5.po @@ -0,0 +1,585 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Lukáš Tinkl , 2010. +# Vít Pelčák , 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 \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"X-Generator: Lokalize 2.0\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "PoÅ¡tovní schránka" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Rozšířená informace o adrese" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Ulice" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Město" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "PSČ" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Země" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Å títek" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domácí" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Mezinárodní" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PoÅ¡tovní" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Balík" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Domů" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Pracovní" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Preferovaná adresa" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Jiné" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unikátní identifikátor" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Jméno" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formátované jméno" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Jméno rodiny" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Jméno" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Další jména" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Před jménem" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Za jménem" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Přezdívka" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Narozeniny" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Ulice domácí adresy" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "PoÅ¡tovní schránka domů" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Město domácí adresy" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Stát domácí adresy" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "PSČ domácí adresy" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Země domácí adresy" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Popisek domácí adresy" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Ulice obchodní adresy" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "PoÅ¡tovní schránka do práce" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Město obchodní adresy" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Stát obchodní adresy" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "PSČ obchodní adresy" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Země obchodní adresy" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Popisek obchodní adresy" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefon domů" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon do práce" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobilní telefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax domů" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax do práce" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefon do auta" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-mailová adresa" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "PoÅ¡tovní klient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Časové pásmo" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Zeměpisná pozice" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titul" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Role" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizace" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Oddělení" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Poznámka" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identifikátor produktu" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Datum revize" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Třídící řetězec" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Domovská stránka" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Bezpečnostní třída" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotka" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Zvuk" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Slečna" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Pan" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Paní" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Pí." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Neznámé pole" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "VÅ¡e" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Časté" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresa" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Osobní" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Vlastní" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nedefinovaný" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Vlastní" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Neznámý typ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonní číslo" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Domů" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Pracovní" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Komunikátor" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferovaný" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Hlas" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobilní" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "PoÅ¡tovní schránka" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Auto" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Jiný" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Preferované číslo" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax do práce" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Veřejný" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Soukromý" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Důvěrný" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Neznámý typ" diff --git a/po/da/kcontacts5.po b/po/da/kcontacts5.po new file mode 100644 index 0000000..89f4f8d --- /dev/null +++ b/po/da/kcontacts5.po @@ -0,0 +1,742 @@ +# translation of kabc.po to dansk +# translation of kabc.po to +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Martin Schlander , 2008, 2009, 2016. +# Jan Madsen , 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 \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postboks" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Udvidet adresseinformation" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Gade" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Egn" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postnummer" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Leveringsetiket" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Indenrigs" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "International" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Post" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Pakke" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Hjemme" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Arbejde" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Foretrukken adresse" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Andet" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unik identifikator" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Navn" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formateret navn" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Efternavn" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Fornavn" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Yderligere navne" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Ærestitel (før)" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Ærestitel (efter)" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Kaldenavn" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Fødselsdag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Vejnavn, hjemmeadresse" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Hjemmeadresse, postboks" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "By, hjemmeadresse" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Delstat, hjemmeadresse" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Postnummer, hjemmeadresse" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Land, hjemmeadresse" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiket med hjemmeadresse" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Vejnavn, erhvervsadresse" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Erhvervsadresse, postboks" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "By, erhvervsadresse" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Delstat, erhvervsadresse" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Postnummer, erhvervsadresse" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Land, erhvervsadresse" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etiket med erhvervsadresse" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Hjemmetelefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Arbejdstelefon" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiltelefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Hjemmefax" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Arbejdsfax" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Biltelefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Personsøger" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-mailadresse" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Mail-klient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Tidszone" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografisk position" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Funktion" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisation" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Afdeling" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Note" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produkt-identifikator" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Ændringsdato" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorteringsstreng" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Hjemmeside" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Sikkerhedsniveau" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Lyd" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Fr." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Hr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Fr." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Fr." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Ukendt felt" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Alle" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Hyppig" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresse" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personligt" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Brugerdefineret" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Udefineret" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Brugerdefineret" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Ukendt type" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonnummer" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Hjemme" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Arbejde" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Foretrukket" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voice" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postkasse" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Bil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Andet" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Foretrukket nummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Arbejdsfax" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Offentlig" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Fortrolig" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Ukendt type" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Foretrukken" + +#~ msgid "List of Emails" +#~ msgstr "Liste over e-mails" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Martin Schlander" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "mschlander@opensuse.org" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Kan ikke indlæse ressourcen '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Vælg adressat" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Navn" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Valgt" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Fravælg" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Indstil distributionslister" + +#~ msgid "Select Email Address" +#~ msgstr "Vælg e-mailadresse" + +#~ msgid "Email Addresses" +#~ msgstr "E-mailadresser" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nej" + +#~ msgid "New List..." +#~ msgstr "Ny liste..." + +#~ msgid "Rename List..." +#~ msgstr "Omdøb liste..." + +#~ msgid "Remove List" +#~ msgstr "Fjern liste" + +#~ msgid "Available addresses:" +#~ msgstr "Tilgængelige adresser:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Foretrukken e-mail" + +#~ msgid "Add Entry" +#~ msgstr "Tilføj indgang" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Brug foretrukken" + +#~ msgid "Change Email..." +#~ msgstr "Ændr e-mail..." + +#~ msgid "Remove Entry" +#~ msgstr "Fjern indgang" + +#~ msgid "New Distribution List" +#~ msgstr "Ny distributionsliste" + +#~ msgid "Please enter &name:" +#~ msgstr "Indtast venligst &navn:" + +#~ msgid "Distribution List" +#~ msgstr "Distributionsliste" + +#~ msgid "Please change &name:" +#~ msgstr "Ændr venligst &navn:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Slet distributionslisten '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Valgte adresserede:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Valgte adresser i '%1'." + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nej" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard-format" + +#~ msgid "No description available." +#~ msgstr "Ingen beskrivelse tilgængelig." + +#~ msgid "Unable to open lock file." +#~ msgstr "Kan ikke Ã¥bne lock-fil." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Ressourcen '%1' er lÃ¥st af programmet '%2'." + +#~ msgid "Error" +#~ msgstr "Fejl" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "LÃ¥s op fejlede. Lock-fil er ejet af en anden proces: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: Alle lÃ¥se gennemføres men ingen lÃ¥sning udføres faktisk." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Alle lÃ¥se fejler." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Indlæsning af ressourcen '%1' fejlede." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Gemning af ressourcen '%1' fejlede." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Kan ikke Ã¥bne ressourcen \"%1\"." + +#~ msgid "Default Address Book" +#~ msgstr "Standardadressebog" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Kan ikke gemme til ressourcen '%1'. Den er lÃ¥st." diff --git a/po/de/kcontacts5.po b/po/de/kcontacts5.po new file mode 100644 index 0000000..4a11782 --- /dev/null +++ b/po/de/kcontacts5.po @@ -0,0 +1,743 @@ +# Stephan Johach , 2007. +# Burkhard Lück , 2008, 2009, 2021. +# Thomas Reitelbach , 2009. +# Frederik Schwarzer , 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 \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postfach" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Erweiterte Adressinformationen" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Straße" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Ort" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postleitzahl" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Adressaufkleber" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Inland" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "International" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postanschrift" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paketanschrift" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Privat" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Dienstlich" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Bevorzugte Adresse" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Sonstige" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Eindeutiger Bezeichner" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Name" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatierter Name" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Nachname" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Vorname" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Zusätzliche Namen" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Titel-Abk. (vor Name)" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Titel-Abk. (nach Name)" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Spitzname" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Geburtstag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Straße (privat)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Postfach (privat)" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Stadt (privat)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Staat/Bundesland (privat)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Postleitzahl (privat)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Land (privat)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Aufkleber (Privatadresse)" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Straße (geschäftlich)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Postfach (geschäftlich)" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Stadt (geschäftlich)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Staat/Bundesland (geschäftlich)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Postleitzahl (geschäftlich)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Land (geschäftlich)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Aufkleber (Geschäftsadresse)" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefon (privat)" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon (geschäftlich)" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiltelefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax (privat)" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax (geschäftlich)" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Autotelefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-Mail-Adresse" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Mail-Programm" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zeitzone" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Ort" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rolle" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisation" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Abteilung" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Notiz" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produktkennung" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Korrekturdatum" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sortierungsschlüssel" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Internetseite" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Sicherheitsklasse" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Klang" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Fräulein" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Herr" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Frau" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Frau" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jun." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sen." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Unbekanntes Feld" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Alle" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Häufig" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresse" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-Mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Persönlich" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Benutzerdefiniert" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nicht definiert" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Benutzerdefiniert" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Unbekannter Typ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonnummer" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Privat" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Dienstlich" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Bevorzugte" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voice" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Mailbox" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Autotelefon" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Sonstige" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Bevorzugte Telefonnummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax dienstlich" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Öffentlich" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Vertraulich" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Unbekannter Typ" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Bevorzugte" + +#~ msgid "List of Emails" +#~ msgstr "E-Mail-Liste" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Stephan Johach" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "hunsum@gmx.de" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Die Ressource „%1“ kann nicht geladen werden" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Empfänger auswählen" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Name" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-Mail-Adresse" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Ausgewählt" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Auswahl aufheben" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Verteilerlisten einrichten" + +#~ msgid "Select Email Address" +#~ msgstr "E-Mail-Adresse auswählen" + +#~ msgid "Email Addresses" +#~ msgstr "E-Mail-Adressen" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgid "New List..." +#~ msgstr "Neue Liste ..." + +#~ msgid "Rename List..." +#~ msgstr "Liste umbenennen ..." + +#~ msgid "Remove List" +#~ msgstr "Liste löschen" + +#~ msgid "Available addresses:" +#~ msgstr "Verfügbare Adressen:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Bevorzugte E-Mail-Adresse" + +#~ msgid "Add Entry" +#~ msgstr "Eintrag hinzufügen" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-Mail-Adresse" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Bevorzugte verwenden" + +#~ msgid "Change Email..." +#~ msgstr "E-Mail bearbeiten ..." + +#~ msgid "Remove Entry" +#~ msgstr "Eintrag löschen" + +#~ msgid "New Distribution List" +#~ msgstr "Neue Verteilerliste" + +#~ msgid "Please enter &name:" +#~ msgstr "&Name:" + +#~ msgid "Distribution List" +#~ msgstr "Verteilerliste" + +#~ msgid "Please change &name:" +#~ msgstr "&Namen ändern:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Möchten Sie die Verteilerliste „%1“ löschen?" + +#~ msgid "Selected addressees:" +#~ msgstr "Ausgewählte Empfänger:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Ausgewählte Empfänger in „%1“:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard-Format" + +#~ msgid "No description available." +#~ msgstr "Keine Beschreibung verfügbar." + +#~ msgid "Unable to open lock file." +#~ msgstr "Die Sperrdatei kann nicht geöffnet werden." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Die Ressource „%1“ ist von der Anwendung „%2“ gesperrt." + +#~ msgid "Error" +#~ msgstr "Fehler" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Das Entsperren ist fehlgeschlagen. Die Sperrdatei gehört zu einem anderen " +#~ "Prozess: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Alle Sperren waren erfolgreich, es wurde aber keine echte " +#~ "Sperrung durchgeführt." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Alle Sperren sind fehlgeschlagen." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Das Laden der Ressource „%1“ ist fehlgeschlagen." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Das Speichern der Ressource „%1“ ist fehlgeschlagen." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Die Ressource „%1“ kann nicht geöffnet werden" + +#~ msgid "Default Address Book" +#~ msgstr "Standard-Adressbuch" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "" +#~ "Die Ressource „%1“ kann nicht gespeichert werden, da sie gesperrt ist." diff --git a/po/el/kcontacts5.po b/po/el/kcontacts5.po new file mode 100644 index 0000000..23f4e96 --- /dev/null +++ b/po/el/kcontacts5.po @@ -0,0 +1,747 @@ +# translation of kabc.po to greek +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Spiros Georgaras , 2007. +# Toussis Manolis , 2008, 2009. +# Dimitrios Glentadakis , 2010, 2013. +# Stelios , 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 \n" +"Language-Team: Greek \n" +"Language: el\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 20.04.2\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Ταχυδρομική θυρίδα" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Εκτεταμένες πληροφορίες διεύθυνσης" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Οδός" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Δήμος/Πόλη" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Νομός/Περιφέρεια" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Ταχυδρομικός κώδικας" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Χώρα" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Ετικέτα παράδοσης" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Εγχώρια" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Διεθνής" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Ταχυδρομική" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Δεμάτων" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Οικία" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Εργασία" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Προτιμώμενη διεύθυνση" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Άλλη" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Μοναδικό αναγνωριστικό" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Όνομα" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Μορφοποιημένο όνομα" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Όνομα οικογενείας" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Δοσμένο όνομα" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Πρόσθετα ονόματα" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Τιμητικά προθέματα" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Τιμητικά επιθέματα" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Ψευδώνυμο" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Γενέθλια" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Οδός διεύθυνσης οικίας" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Ταχυδρομική θυρίδα διεύθυνσης οικίας" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Πόλη διεύθυνσης οικίας" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Νομός/Περιφέρεια διεύθυνσης οικίας" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Ταχ. κώδ. διεύθυνσης οικίας" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Χώρα διεύθυνσης οικίας" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Ετικέτα διεύθυνσης οικίας" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Οδός διεύθυνσης επιχείρησης" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Ταχυδρομική θυρίδα διεύθυνσης επιχείρισης" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Πόλη διεύθυνσης επιχείρησης" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Νομός/Περιφέρεια διεύθυνσης επιχείρησης" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Ταχ. κώδ. διεύθυνσης επιχείρησης" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Χώρα διεύθυνσης επιχείρησης" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Ετικέτα διεύθυνσης επιχείρησης" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Τηλέφωνο οικίας" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Τηλέφωνο επιχείρησης" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Κινητό τηλέφωνο" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Φαξ οικίας" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Φαξ επιχείρησης" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Τηλέφωνο αυτοκινήτου" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Βομβητής" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Διεύθυνση ηλ. αλληλογραφίας" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Πελάτης ταχυδρομείου" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Ωρολογιακή ζώνη" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Γεωγραφική θέση" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Τίτλος" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Ρόλος" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Οργανισμός" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Τμήμα" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Σημείωση" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Αναγνωριστικό προϊόντος" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Ημερομηνία αναθεώρησης" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Συμβολοσειρά ταξινόμησης" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Προσωπική σελίδα" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Κλάση ασφαλείας" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Λογότυπο" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Φωτογραφία" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Ήχος" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Δρ." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Δις" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "κ." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "κα." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "κα." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Καθ." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Σερ" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Άγνωστο πεδίο" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Όλα" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Συχνά" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Διεύθυνση" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Ηλ. αλληλογραφία" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Προσωπικά" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Προσαρμοσμένο" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Μη ορισμένο" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Προσαρμοσμένο" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Άγνωστος τύπος" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Αριθμός τηλεφώνου" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Οικία" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Εργασία" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Αποστολέας μηνυμάτων" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Προτεινόμενο" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Φωνή" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Φαξ" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Κινητό" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Βίντεο" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Γραμματοκιβώτιο" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Μόντεμ" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Τηλέφωνο αυτοκινήτου" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Άλλο" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Προτιμώμενος αριθμός" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Φαξ εργασίας" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Δημόσιο" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Ιδιωτικό" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Εμπιστευτικό" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Άγνωστος τύπος" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Προτεινόμενο" + +#~ msgid "List of Emails" +#~ msgstr "Λίστα διευθύνσεων ηλ. αλληλογραφίας" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Σπύρος Γεωργαράς, Τούσης Μανώλης" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "sng@hellug.gr, manolis@koppermind.homelinux.org" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Δεν είναι δυνατή η φόρτωση του πόρου '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Επιλέξτε παραλήπτη" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Όνομα" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Επιλεγμένο" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Αποεπιλογή" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Ρύθμιση λιστών διανομής" + +#~ msgid "Select Email Address" +#~ msgstr "Επιλέξτε διεύθυνση ηλ. αλληλογραφίας" + +#~ msgid "Email Addresses" +#~ msgstr "Διευθύνσεις ηλ. αλληλογραφίας" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Ναι" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Όχι" + +#~ msgid "New List..." +#~ msgstr "Νέα λίστα..." + +#~ msgid "Rename List..." +#~ msgstr "Μετονομασία λίστας..." + +#~ msgid "Remove List" +#~ msgstr "Αφαίρεση λίστας" + +#~ msgid "Available addresses:" +#~ msgstr "Διαθέσιμες διευθύνσεις:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Προτιμώμενη ηλ. αλληλογραφία" + +#~ msgid "Add Entry" +#~ msgstr "Προσθήκη καταχώρησης" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Ηλ. αλληλογραφία" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Χρήση προτιμώμενου" + +#~ msgid "Change Email..." +#~ msgstr "Αλλαγή ηλ. αλληλογραφίας..." + +#~ msgid "Remove Entry" +#~ msgstr "Αφαίρεση καταχώρησης" + +#~ msgid "New Distribution List" +#~ msgstr "Νέα λίστα διανομής" + +#~ msgid "Please enter &name:" +#~ msgstr "Παρακαλώ δώστε ό&νομα:" + +#~ msgid "Distribution List" +#~ msgstr "Λίστα διανομής" + +#~ msgid "Please change &name:" +#~ msgstr "Παρακαλώ αλλάξτε ό&νομα:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Διαγραφή της λίστας διανομής '%1';" + +#~ msgid "Selected addressees:" +#~ msgstr "Επιλεγμένοι παραλήπτες:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Επιλεγμένοι παραλήπτες στο '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Όχι" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Μορφή vCard" + +#~ msgid "No description available." +#~ msgstr "Περιγραφή μη διαθέσιμη." + +#~ msgid "Unable to open lock file." +#~ msgstr "Δεν είναι δυνατό το άνοιγμα του αρχείου κλειδώματος." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Ο πόρος '%1' είναι κλειδωμένος από την εφαρμογή '%2'." + +#~ msgid "Error" +#~ msgstr "Σφάλμα" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Το ξεκλείδωμα απέτυχε. Το αρχείο κλειδώματος ανήκει σε άλλη διεργασία: %1 " +#~ "(%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Όλα τα κλειδώματα πετυχαίνουν αλλά δε γίνεται πραγματικό " +#~ "κλείδωμα." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Όλα τα κλειδώματα αποτυγχάνουν." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Η φόρτωση του πόρου '%1' απέτυχε." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Η αποθήκευση ßτου πόρου '%1' απέτυχε." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Αδύνατο το άνοιγμα του πόρου «%1»." + +#~ msgid "Default Address Book" +#~ msgstr "Προκαθορισμένο βιβλίο διευθύνσεων" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Δεν είναι δυνατή η αποθήκευση στον πόρο '%1'. Είναι κλειδωμένος." diff --git a/po/en_GB/kcontacts5.po b/po/en_GB/kcontacts5.po new file mode 100644 index 0000000..53b658e --- /dev/null +++ b/po/en_GB/kcontacts5.po @@ -0,0 +1,591 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Steve Allewell , 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 \n" +"Language-Team: British English \n" +"Language: en_GB\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 1.5\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Post Office Box" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Extended Address Information" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Street" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Locality" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postal Code" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Country" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Delivery Label" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domestic" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "International" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Parcel" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Home" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Work" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Preferred Address" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Other" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unique Identifier" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Name" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatted Name" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Family Name" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Given Name" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Additional Names" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Honorific Prefixes" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Honorific Suffixes" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Nick Name" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Birthday" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Home Address Street" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Home Address Post Office Box" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Home Address City" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Home Address County" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Home Address Post Code" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Home Address Country" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Home Address Label" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Business Address Street" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Business Address Post Office Box" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Business Address City" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Business Address County" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Business Address Post Code" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Business Address Country" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Business Address Label" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Home Phone" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Business Phone" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobile Phone" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Home Fax" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Business Fax" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Car Phone" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Email Address" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Mail Client" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Time Zone" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geographic Position" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Title" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Role" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisation" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Department" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Note" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Product Identifier" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Revision Date" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sort String" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Homepage" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Security Class" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Photo" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Sound" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Mr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mrs." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Unknown Field" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "All" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frequent" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Address" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Email" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Custom" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Undefined" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Custom" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Unknown type" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telephone number" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Home" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Work" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferred" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voice" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobile" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Mailbox" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Car" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Other" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Preferred Number" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Work Fax" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Public" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Private" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidential" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Unknown type" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferred" + +#~ msgid "List of Emails" +#~ msgstr "List of Emails" diff --git a/po/eo/kcontacts5.po b/po/eo/kcontacts5.po new file mode 100644 index 0000000..2cee2d0 --- /dev/null +++ b/po/eo/kcontacts5.po @@ -0,0 +1,587 @@ +# Translation of kcontacts5.pot to esperanto. +# Copyright (C) 2009 Free Software Foundation, Inc. +# This file is distributed under the same license as the "kcontacts" package. +# Axel Rousseau , 2009. +# Oliver Kellogg , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: kabc\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2023-01-07 01:00+0100\n" +"Last-Translator: Oliver Kellogg \n" +"Language-Team: esperanto \n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: pology\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Poŝtofica Kesto" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Etenditaj Adres-Informoj" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Strato" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Loko" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Regiono" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Poŝtkodo" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Lando" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Liveretikedo" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Enlanda" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacia" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Poŝta" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Pakaĵo" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Hejmo" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Laboro" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Preferata adreso" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Alia" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unika Identigilo" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nomo" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatita Nomo" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Familinomo" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Donita Nomo" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Pluaj Nomoj" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Honorindaj Prefiksoj" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Honorindaj Sufiksoj" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Kromnomo" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Naskiĝdato" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Hejmadresa Strato" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Hejmadresa Poŝtkesto" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Hejmadresa Urbo" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Hejmadresa Ŝtato" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Hejmadresa Poŝtkodo" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Hejmadresa Lando" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Hejmadresa Etikedo" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Mesaĝricevilo" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Retpoŝta adreso" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "" + +#: addressee.cpp:1018 +#, fuzzy, kde-format +#| msgid "Timezone Error" +msgid "Time Zone" +msgstr "Tempzona eraro" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizaĵo" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Distrikto" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Noto" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "TTT-hejmpaĝo" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Sekureca Kategorio" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Sono" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "D-ro" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Sinjorino" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "S-ro" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "S-ino" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "F-ino" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "P-ro" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jn" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Mjn" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Ĉiuj" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Ofta" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adreso" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Retpoŝto" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personaj" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Propra" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nedifinita" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Propra" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Nekonata tipo" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonnumero" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Hejm" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Labpra" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferata" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voĉa" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobila" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Poŝtkesto" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "AÅ­tomobila" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Alia" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Preferata Numero" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Laboreja Fakso" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publika" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privata" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidenca" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Nekonata tipo" diff --git a/po/es/kcontacts5.po b/po/es/kcontacts5.po new file mode 100644 index 0000000..60f3944 --- /dev/null +++ b/po/es/kcontacts5.po @@ -0,0 +1,591 @@ +# translation of kabc.po to Spanish +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Santiago Fernández Sancho , 2007, 2008. +# Dario Andres Rodriguez , 2008, 2009. +# Jaime Robles , 2009. +# Adrián Martínez , 2010. +# Javier Vinal , 2011, 2012, 2013, 2015. +# Cristina Yenyxe González García , 2011. +# Eloy Cuadra , 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 \n" +"Language-Team: Spanish \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 20.03.90\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Dirección postal" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Información extendida de la dirección" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Calle" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localidad" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Región" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Código postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "País" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etiqueta de entrega" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Nacional" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paquetería" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Particular" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Trabajo" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Direcciones preferidas" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Otra" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificador único" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nombre" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nombre formateado" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Apellidos" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nombre" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nombres adicionales" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefijos honoríficos" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufijos honoríficos" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Apodo" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Cumpleaños" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Calle de la dirección particular" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Apartado de correos de la dirección particular" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Ciudad de la dirección particular" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Estado de la dirección particular" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Código postal de la dirección particular" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "País de la dirección particular" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiqueta de la dirección particular" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Calle de la dirección de trabajo" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Apartado de correos de la dirección de trabajo" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Ciudad de la dirección de trabajo" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Estado de la dirección de trabajo" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Código postal de la dirección de trabajo" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "País de la dirección de trabajo" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etiqueta de la dirección de trabajo" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Teléfono particular" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Teléfono del trabajo" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Teléfono móvil" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax particular" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax del trabajo" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Teléfono del automóvil" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "RDSI" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Busca" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Dirección de correo electrónico" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Cliente de correo" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zona horaria" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posición geográfica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Título" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Papel" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organización" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departamento" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificador de producto" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Fecha de revisión" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Ordenar cadena" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Página web" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Clase de seguridad" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotografía" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Sonido" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Srta." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Sra." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Srta." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Campo desconocido" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Todos" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frecuente" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Dirección" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Correo electrónico" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalizado" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Sin definir" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalizada" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipo desconocido" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Número de teléfono" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Particular" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Trabajo" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mensajería" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferido" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voz" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Móvil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vídeo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Buzón" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Módem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Automóvil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Otro" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Número preferido" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax del trabajo" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Público" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privado" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidencial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipo desconocido" diff --git a/po/et/kcontacts5.po b/po/et/kcontacts5.po new file mode 100644 index 0000000..a611b15 --- /dev/null +++ b/po/et/kcontacts5.po @@ -0,0 +1,740 @@ +# translation of kabc.po to +# +# Marek Laane , 2006-2007. +# Marek Laane , 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 \n" +"Language-Team: Estonian \n" +"Language: et\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postkast" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Laiendatud aadressiteave" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Tänav" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Asula" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Piirkond" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postiindeks" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Riik" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Posti etikett" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Kodumaine" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Rahvusvaheline" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postiindeks" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Postipakk" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Kodu" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Töö" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Eelistatud aadress" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Muu" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unikaalne identifikaator" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nimi" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Vormindatud nimi" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Perekonnanimi" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Eesnimi" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Lisanimed" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Austavad eesliited" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Austavad järelliited" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Hüüdnimi" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Sünnipäev" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Koduse aadressi tänav" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Koduse aadressi postkast" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Koduse aadressi linn" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Koduse aadressi maakond/provints" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Koduse aadressi postiindeks" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Koduse aadressi riik" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Koduse aadressi etikett" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Tööaadressi tänav" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Tööaadressi postkast" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Tööaadressi linn" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Tööaadressi maakond/provints" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Tööaadressi postiindeks" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Tööaadressi riik" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Tööaadressi etikett" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Kodune telefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Töötelefon" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiiltelefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Kodune faks" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Tööfaks" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Autotelefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Peiler" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-posti aadress" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-posti klient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Ajavöönd" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geograafiline asukoht" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Tiitel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Amet" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisatsioon" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Osakond" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Märkus" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Toote identifikaator" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Versiooni kuupäev" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorteerimisalus" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Kodulehekülg" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Turbeklass" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Heli" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Preili" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Hr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Pr." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Pr." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Tundmatu väli" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Kõik" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Sagedased" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Aadress" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-post" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Isiklik" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Kohandatud" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Määramata" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Kohandatud" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tundmatu tüüp" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefoninumber" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Kodu" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Töö" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Automaatvastaja" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Eelistatud" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Hääl" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobiil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postkast" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Auto" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Muu" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Eelistatud number" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Töö faks" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Avalik" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privaatne" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidentsiaalne" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tundmatu tüüp" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Eelistatud" + +#~ msgid "List of Emails" +#~ msgstr "E-kirjade nimekiri" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Marek Laane" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "bald@smail.ee" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Ressursi '%1' laadimine nurjus" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Adressaadi valik" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nimi" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-post" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Valitud" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Tühista valik" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Postiloendite seadistamine" + +#~ msgid "Select Email Address" +#~ msgstr "Vali e-posti aadress" + +#~ msgid "Email Addresses" +#~ msgstr "E-posti aadressid" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Jah" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Ei" + +#~ msgid "New List..." +#~ msgstr "Uus loend..." + +#~ msgid "Rename List..." +#~ msgstr "Nimeta loend ümber..." + +#~ msgid "Remove List" +#~ msgstr "Eemalda loend" + +#~ msgid "Available addresses:" +#~ msgstr "Saadaolevad aadressid:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Eelistatud e-posti aadress" + +#~ msgid "Add Entry" +#~ msgstr "Lisa kirje" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-post" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Eelistatud kirje" + +#~ msgid "Change Email..." +#~ msgstr "Muuda e-posti aadressi..." + +#~ msgid "Remove Entry" +#~ msgstr "Eemalda kirje" + +#~ msgid "New Distribution List" +#~ msgstr "Uus postiloend" + +#~ msgid "Please enter &name:" +#~ msgstr "Palun sisesta &nimi:" + +#~ msgid "Distribution List" +#~ msgstr "Postiloend" + +#~ msgid "Please change &name:" +#~ msgstr "Palun muuda &nime:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Kas kustutada postiloend '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Valitud adressaadid:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Valitud adressaadid nimekirjas '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Ei" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCardi vorming" + +#~ msgid "No description available." +#~ msgstr "Kirjeldus puudub." + +#~ msgid "Unable to open lock file." +#~ msgstr "Lukufaili pole võimalik avada." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Ressursi '%1' on lukustanud rakendus '%2'." + +#~ msgid "Error" +#~ msgstr "Viga" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "Luku avamine nurjus. Lukufail kuulub muule protsessile: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: kõik lukustused õnnestusid, aga tegelikult midagi ei lukustatud." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: kõik lukustused nurjusid." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Ressursi '%1' laadimine nurjus." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Ressursi '%1' salvestamine nurjus." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Ressursi '%1' avamine nurjus." + +#~ msgid "Default Address Book" +#~ msgstr "Vaikimisi aadressiraamat" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Ressursi '%1' salvestamine nurjus, sest ressurss on lukus." diff --git a/po/eu/kcontacts5.po b/po/eu/kcontacts5.po new file mode 100644 index 0000000..2f0f137 --- /dev/null +++ b/po/eu/kcontacts5.po @@ -0,0 +1,589 @@ +# Translation of kcontacts5.po to Euskara/Basque (eu). +# Copyright (C) 2019, This file is copyright: +# This file is distributed under the same license as the kcontacts package. +# KDE euskaratzeko proiektuaren arduraduna . +# +# Translators: +# Iñigo Salvador Azurmendi , 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 \n" +"Language-Team: Basque \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 19.08.2\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Posta-kutxa" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Helbidearen informazio hedatua" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Kalea" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Herria" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Eskualdea" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Posta-kodea" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Herrialdea" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Banatze etiketa" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Nazionala" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Nazioartekoa" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postala" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paketeak" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Etxekoa" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Lanekoa" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Hobetsitako helbidea" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Bestelakoak" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identifikatzaile bakuna" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Izena" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatudun izena" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Abizenak" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Izena" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Gainerako izenak" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Ohorezko aurrizkiak" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Ohorezko atzizkiak" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Goitizena" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Urtemuga" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Etxeko helbideko kalea" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Etxeko helbideko posta-kutxa" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Etxeko helbideko hiria" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Etxeko helbideko probintzia" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Etxeko helbideko posta-kodea" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Etxeko helbideko herrialdea" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etxeko helbideko etiketa" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Laneko helbideko kalea" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Laneko helbideko posta-kutxa" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Laneko helbideko hiria" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Laneko helbideko probintzia" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Laneko helbideko posta-kodea" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Laneko helbideko herrialdea" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Laneko helbideko etiketa" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Etxeko telefonoa" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Laneko telefonoa" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telefono mugikorra" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Etxeko faxa" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Laneko faxa" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Beribileko telefonoa" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "RDSI (ISDN)" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Bilagailua" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Eposta helbidea" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Posta bezeroa" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Ordu eremua" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Kokapen geografikoa" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titulua" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rola" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Erakundea" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Saila" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Oharra" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produktuaren identifikatzailea" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Berrikuspen data" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sailkatzeko katea" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Orri nagusia" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Segurtasun klasea" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logoa" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Argazkia" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Soinua" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "dk." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Andereño" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "jn." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "and." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "adño." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "irak." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "jr." + +# xalba 2019-10-20 ig. Bere horretan utzi dut euskaraz nola ipini ez dudalako aurkitu. +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Eremu ezezaguna" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Guztia" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Maiztasuna" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Helbidea" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-posta" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Pertsonala" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Norberak finkatua" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Definitu gabea" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Norberak finkatua" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Mota ezezagunekoa" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefono zenbakia" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Etxekoa" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Lanekoa" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mezularia" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Hobetsia" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Ahotsa" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faxa" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mugikorra" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Bideoa" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postontzia" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modema" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Beribila" + +# Personal Communications Service +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Bestelakoak" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Hobetsitako zenbakia" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Laneko faxa" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publikoa" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Pribatua" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Isilpekoa" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Mota ezezaguna" diff --git a/po/fi/kcontacts5.po b/po/fi/kcontacts5.po new file mode 100644 index 0000000..5bd7953 --- /dev/null +++ b/po/fi/kcontacts5.po @@ -0,0 +1,596 @@ +# Translation of kabc.po to Finnish +# Copyright © 2007, 2009, 2012 This_file_is_part_of_KDE +# This file is distributed under the same license as the kdepimlibs package. +# Mikko Piippo , 2007. +# Tommi Nieminen , 2009, 2012. +# Lasse Liehu , 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 \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-POT-Import-Date: 2012-12-01 22:25:17+0000\n" +"X-Generator: Lokalize 2.0\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "PL" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Tarkemmat osoitetiedot" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Katuosoite" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Paikkakunta" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Alue" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postinumero" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Maa" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Toimitusosoite" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Kotimaan osoite" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Kansainvälinen osoite" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postiosoite" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Pakettiosoite" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Koti" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Työ" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Ensisijainen osoite" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Muu " + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Ainutkertainen tunniste" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nimi" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Muotoiltu nimi" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Sukunimi" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Etunimi" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Lisänimet" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Kunnioittavat etuliitteet" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Kunnioittavat jälkiliitteet" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Kutsumanimi" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Syntymäpäivä" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Kotiosoitteen katuosoite" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Kotiosoitteen postilokero" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Kotiosoitteen kaupunki" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Kotiosoitteen osavaltio" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Kotiosoitteen postinumero" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Kotiosoitteen maa" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Kotiosoite" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Työosoitteen katuosoite" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Työosoitteen postilokero" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Työosoitteen kaupunki" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Työosoitteen osavaltio" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Työosoitteen postinumero" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Työosoitteen maa" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Työosoite" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Kotipuhelin" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Työpuhelin" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Matkapuhelin" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Kotifaksi" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Työfaksi" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Autopuhelin" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Hakulaite" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Sähköpostiosoite" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Postiohjelma" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Aikavyöhyke" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Maantieteellinen sijainti" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Ammatti" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Työnkuva" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisaatio" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Osasto" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Huomautukset" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Tuotteen tunniste" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Tarkistuspäivä" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Lajittelujono" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Kotisivu" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Turvallisuusluokitus" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Valokuva" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Äänitiedosto" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Tri" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Neiti" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Herra" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Rouva" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Rouva" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "nuor." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "vanh." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Tuntematon kenttä" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Kaikki" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Säännöllinen" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Osoite" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Sähköposti" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Henkilökohtainen" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Oma" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Määrittämätön" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Oma" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tuntematon tyyppi" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Puhelinnumero" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Koti" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Työ" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Pikaviestin" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Ensisijainen" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Ääni" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faksi" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Matkapuhelin" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postilaatikko" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modeemi" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Auto" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Muu " + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Ensisijainen numero" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Työfaksi" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Julkinen" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Yksityinen" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Luottamuksellinen" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tuntematon tyyppi" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Ensisijainen" + +#~ msgid "List of Emails" +#~ msgstr "Luettelo sähköposteista" diff --git a/po/fr/kcontacts5.po b/po/fr/kcontacts5.po new file mode 100644 index 0000000..4a9c09b --- /dev/null +++ b/po/fr/kcontacts5.po @@ -0,0 +1,768 @@ +# translation of kabc.po to Francais +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# Francois Grange , 2007, 2008. +# Guillaume Pujol , 2008. +# Sébastien Renard , 2008. +# Mickael Sibelle , 2008. +# Sebastien Renard , 2010, 2013. +# xavier , 2013. +# Vincent Pinon , 2017. +# +# Xavier BESNARD , 2023. +msgid "" +msgstr "" +"Project-Id-Version: kabc\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2023-01-06 19:23+0100\n" +"Last-Translator: Xavier BESNARD \n" +"Language-Team: fr\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Lokalize 22.12.0\n" +"X-Environment: kde\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Boîte postale" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informations de complément d'adresse" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Rue" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Ville" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Région" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Code postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Pays" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Étiquette de livraison" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "National" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "International" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paquet" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Domicile" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Travail" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Adresse préférée" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Autre" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identifiant unique" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nom" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nom formaté" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Nom de famille" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Prénom" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Noms additionnels" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Préfixes honorifiques" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Suffixes honorifiques" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Pseudonyme" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Date d'anniversaire" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Rue du domicile" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Code postal du domicile" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Ville du domicile" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "État du domicile" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Code postal du domicile" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Pays du domicile" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Libellé de l'adresse du domicile" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Rue du lieu de travail" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Code postal du lieu de travail" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Ville du lieu de travail" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "État du lieu de travail" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Code postal du lieu de travail" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Pays du lieu de travail" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Libellé du lieu de travail" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Téléphone du domicile" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Téléphone professionnel" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Téléphone mobile" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax personnel" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax professionnel" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Téléphone de voiture" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "RNIS" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adresse de courrier électronique" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Client de courrier électronique" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Fuseau horaire" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Position géographique" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titre" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rôle" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisation" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Département" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Note" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identifiant du produit" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Date de révision" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Chaîne de tri" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Page d'accueil" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe de sécurité" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Photo" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Son" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Mlle" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "M." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mme" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Mme" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Pr." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I " + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III " + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Champ inconnu" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Tous" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Fréquent" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresse" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Adresse de courrier électronique" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personnel" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personnalisé" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Indéfini" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personnalisé" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Type inconnu" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Numéro de téléphone" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Domicile" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Professionnel" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messagerie" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Préféré" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Boîte vocale" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Portable" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vidéo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Boîte aux lettres" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Voiture" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Autre" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Numéro préféré" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax professionnel" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Public" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privé" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidentiel" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Type inconnu" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Adresse préférée" + +#~ msgid "List of Emails" +#~ msgstr "Liste des adresses de courrier électronique" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Nicolas Ternisien" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "nicolas.ternisien@gmail.com" + +# unreviewed-context +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Impossible de charger la ressource « %1 »" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Sélectionner le destinataire" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nom" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Adresse de courrier électronique" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Sélectionné" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Dé-sélectionné" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Configurer les listes de distribution" + +#~ msgid "Select Email Address" +#~ msgstr "Sélectionner l'adresse de courrier électronique" + +#~ msgid "Email Addresses" +#~ msgstr "Adresse de courrier électronique" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Oui" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "New List..." +#~ msgstr "Nouvelle liste..." + +#~ msgid "Rename List..." +#~ msgstr "Renommer une liste..." + +#~ msgid "Remove List" +#~ msgstr "Supprimer une liste" + +# unreviewed-context +#~ msgid "Available addresses:" +#~ msgstr "Adresses disponibles :" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Adresse préférée de courrier électronique" + +#~ msgid "Add Entry" +#~ msgstr "Ajouter une entrée" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Adresse de courrier électronique" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Utiliser l'adresse préférée de courrier électronique " + +#~ msgid "Change Email..." +#~ msgstr "Modifier les adresses de courrier électronique..." + +#~ msgid "Remove Entry" +#~ msgstr "Supprimer une entrée" + +#~ msgid "New Distribution List" +#~ msgstr "Nouvelle liste de distribution" + +# unreviewed-context +#~ msgid "Please enter &name:" +#~ msgstr "Veuillez saisir un &nom : " + +#~ msgid "Distribution List" +#~ msgstr "Liste de distribution" + +# unreviewed-context +#~ msgid "Please change &name:" +#~ msgstr "Veuillez modifier le &nom : " + +# unreviewed-context +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Supprimer la liste de distribution « %1 » ?" + +# unreviewed-context +#~ msgid "Selected addressees:" +#~ msgstr "Destinataires sélectionnés :" + +# unreviewed-context +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Destinataires sélectionnés dans « %1 » :" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Format « vCard »" + +#~ msgid "No description available." +#~ msgstr "Aucune description disponible." + +#~ msgid "Unable to open lock file." +#~ msgstr "Impossible d'ouvrir un fichier verrouillé." + +# unreviewed-context +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "La ressource « %1 » est verrouillée par l'application « %2 »." + +#~ msgid "Error" +#~ msgstr "Erreur" + +# unreviewed-context +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Échec du déverrouillage. Le fichier verrouillé appartient à un autre " +#~ "processus : %1 (%2)" + +# unreviewed-context +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull : tous les verrouillages ont réussi mais rien n'est verrouillé." + +# unreviewed-context +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull : tous les verrouillages ont échoué." + +# unreviewed-context +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Échec du chargement de la ressource « %1 »." + +# unreviewed-context +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Échec de l'enregistrement de la ressource « %1 »." + +# unreviewed-context +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Impossible de charger la ressource « %1 »" + +#~ msgid "Default Address Book" +#~ msgstr "Carnet d'adresses par défaut" + +# unreviewed-context +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Impossible d'enregistrer la ressource « %1 ». Elle est verrouillée." diff --git a/po/ga/kcontacts5.po b/po/ga/kcontacts5.po new file mode 100644 index 0000000..87af786 --- /dev/null +++ b/po/ga/kcontacts5.po @@ -0,0 +1,742 @@ +# Irish translation of kabc +# Copyright (C) 2009 This_file_is_part_of_KDE +# This file is distributed under the same license as the kabc package. +# Kevin Scannell , 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 \n" +"Language-Team: Irish \n" +"Language: ga\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n < 11 ? " +"3 : 4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Bosca Oifig an Phoist" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Eolas Seolta Breisithe" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Sráid" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Ceantar" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Réigiún" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Cód Poist" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Tír" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Lipéad Seachadta" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Intíre" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Idirnáisiúnta" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Post" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Beart" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Baile" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Obair" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Seoladh de Rogha" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Eile" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Aitheantóir Sainiúil" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ainm" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Ainm Formáidithe" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Sloinne" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Ainm" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Ainmneacha Eile" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Réimíreanna Ómóis" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Iarmhíreanna Ómóis" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Leasainm" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Lá Breithe" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Seoladh Baile - Sráid" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Bosca Oifig an Phoist - Baile" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Seoladh Baile - Cathair" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Seoladh Baile - Stát" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Seoladh Baile - Cód Poist" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Seoladh Baile - Tír" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Seoladh Baile - Lipéad" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Seoladh Gnó - Sráid" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Bosca Oifig an Phoist - Gnó" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Seoladh Gnó - Cathair" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Seoladh Gnó - Stát" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Seoladh Gnó - Cód Poist" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Seoladh Gnó - Tír" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Seoladh Gnó - Lipéad" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Fón Baile" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Fón Gnó" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Fón Póca" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Facs Baile" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Facs Gnó" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Fón Cairr" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "LDSC" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Glaoire" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Seoladh Ríomhphoist" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Cliant Ríomhphoist" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Crios Ama" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Suíomh Geografach" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Teideal" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Ról" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Eagras" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Roinn" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nóta" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Aitheantóir Táirge" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Dáta Leasaithe" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Teaghrán Sórtála" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Leathanach Baile" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Aicme Slándála" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Lógó" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Grianghraf" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Fuaim" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "An Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Iníon" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "An tUas." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Bean" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "An tOll." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Óg" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Mór" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Réimse Anaithnid" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Uile" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Go Minic" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Seoladh" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Ríomhphost" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Pearsanta" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Saincheaptha" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Neamhshainithe" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X.509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Saincheaptha" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Cineál anaithnid" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Baile" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Obair" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Teachtaire" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Molta" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Guth" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Facs" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Fón Póca" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Fón Físe" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Bosca Poist" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Móideim" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Carr" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Eile" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Uimhir de Rogha" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Facs oibre" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Poiblí" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Príobháideach" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Faoi Rún" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Cineál anaithnid" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "De Rogha" + +#~ msgid "List of Emails" +#~ msgstr "Liosta Ríomhphost" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Kevin Scannell" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "kscanne@gmail.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Ní féidir acmhainn '%1' a luchtú" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Roghnaigh an Seolaí" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Ainm" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Ríomhphost" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Roghnaithe" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Díroghnaigh" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Cumraigh Liostaí Dáilte" + +#~ msgid "Select Email Address" +#~ msgstr "Roghnaigh Seoladh Ríomhphoist" + +#~ msgid "Email Addresses" +#~ msgstr "Seoltaí Ríomhphoist" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Tá" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Níl" + +#~ msgid "New List..." +#~ msgstr "Liosta Nua..." + +#~ msgid "Rename List..." +#~ msgstr "Athainmnigh Liosta..." + +#~ msgid "Remove List" +#~ msgstr "Bain Liosta" + +#~ msgid "Available addresses:" +#~ msgstr "Seoltaí ar fáil:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Ríomhphost de Rogha" + +#~ msgid "Add Entry" +#~ msgstr "Cuir Iontráil Leis" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Ríomhphost" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Úsáid an ceann de rogha" + +#~ msgid "Change Email..." +#~ msgstr "Athraigh Seoladh Ríomhphoist..." + +#~ msgid "Remove Entry" +#~ msgstr "Bain Iontráil" + +#~ msgid "New Distribution List" +#~ msgstr "Liosta Dáilte Nua" + +#~ msgid "Please enter &name:" +#~ msgstr "Iontráil ai&nm:" + +#~ msgid "Distribution List" +#~ msgstr "Liosta Dáilte" + +#~ msgid "Please change &name:" +#~ msgstr "Athraigh an t-ai&nm le do thoil:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Scrios an liosta dáilte '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Seolaithe roghnaithe:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Seoltaí roghnaithe i '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Níl" + +#~ msgid "vCard" +#~ msgstr "v-Chárta" + +#~ msgid "vCard Format" +#~ msgstr "Formáid v-Chárta" + +#~ msgid "No description available." +#~ msgstr "Níl cur síos ar fáil." + +#~ msgid "Unable to open lock file." +#~ msgstr "Ní féidir comhad glais a oscailt." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Tá acmhainn '%1' faoi ghlas ag feidhmchlár '%2'." + +#~ msgid "Error" +#~ msgstr "Earráid" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Theip ar oscailt an ghlais. Is le próiseas eile an comhad ghlais: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: D'éirigh le gach glas ach níor chuir aon rud faoi ghlas i " +#~ "ndáiríre." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Theip ar gach glas." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Níorbh fhéidir acmhainn '%1' a luchtú." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Níorbh fhéidir acmhainn '%1' a shábháil." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Ní féidir acmhainn '%1' a oscailt." + +#~ msgid "Default Address Book" +#~ msgstr "Leabhar Seoltaí Réamhshocraithe" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Ní féidir acmhainn '%1' a shábháil. Tá sí faoi ghlas." diff --git a/po/gl/kcontacts5.po b/po/gl/kcontacts5.po new file mode 100644 index 0000000..48fce3c --- /dev/null +++ b/po/gl/kcontacts5.po @@ -0,0 +1,753 @@ +# translation of kabc.po to galician +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# mvillarino , 2007, 2008, 2009. +# Marce Villarino , 2009. +# marce villarino , 2009. +# Xosé , 2009. +# Marce Villarino , 2012, 2013. +# Adrián Chaves Fernández (Gallaecio) , 2015. +# Adrián Chaves (Gallaecio) , 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) \n" +"Language-Team: Galician \n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Apartado de correos" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Información ampliada do enderezo" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Rúa" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localidade" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Rexión" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Código postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "País" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etiqueta de envío" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Nacional" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paquetaría" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Casa" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Traballo" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Enderezo preferido" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Outro" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificador único" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nome" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nome Formatado" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Apelido" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nome Propio" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nomes Adicionais" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixos Honoríficos" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufixos Honoríficos" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Alcume" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Aniversario" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Rúa do enderezo particular" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Apartado de correos do enderezo particular" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Cidade do enderezo particular" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Provincia do enderezo particular" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Código postal do enderezo particular" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "País do enderezo particular" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiqueta do enderezo particular" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Rúa do enderezo do traballo" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Caixa de correo do enderezo do traballo" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Cidade do enderezo do traballo" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Provincia do enderezo do traballo" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Código postal do enderezo do traballo" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "País do enderezo do traballo" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etiqueta do enderezo do traballo" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Teléfono privado" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Teléfono do traballo" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Móbil" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax privado" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax do traballo" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Teléfono do coche" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "RDSI" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Busca" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Enderezo de correo electrónico" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Cliente de correo" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Fuso horario" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posición xeográfica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Título" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Función" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organización" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departamento" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificador do produto" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data de revisión" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Ordenar a cadea" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Páxina web" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Clase de seguranza" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotipo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Son" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Sra." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Srta." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Sra." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Campo descoñecido" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Todos" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frecuente" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Enderezo" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Correo electrónico" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Persoal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalizado" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Non definido" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalizado" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipo descoñecido" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Número de teléfono" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Casa" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Traballo" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mensaxaría" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferido" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voz" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Móbil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vídeo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Caixa de correo" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Módem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Coche" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Outro" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Número preferido" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax do traballo" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Público" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privado" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidencial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipo descoñecido" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferido" + +#~ msgid "List of Emails" +#~ msgstr "Lista de correos electrónicos" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "" +#~ "mvillarino, \n" +#~ "Xosé Calvo" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "" +#~ "mvillarino@users.sourceforge.net, \n" +#~ "xosecalvo@gmail.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Non foi posíbel cargar o recurso «%1»" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Escoller o destinatario" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nome" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Correo electrónico" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Escollidos" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Anular a selección" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Configurar as listas de distribución" + +#~ msgid "Select Email Address" +#~ msgstr "Escoller o enderezo de correo electrónico" + +#~ msgid "Email Addresses" +#~ msgstr "Enderezos de correo electrónico" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Si" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "New List..." +#~ msgstr "Lista nova..." + +#~ msgid "Rename List..." +#~ msgstr "Mudar o nome da lista..." + +#~ msgid "Remove List" +#~ msgstr "Eliminar a lista" + +#~ msgid "Available addresses:" +#~ msgstr "Enderezos dispoñíbeis:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Correo electrónico preferido" + +#~ msgid "Add Entry" +#~ msgstr "Engadir unha entrada" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Correo electrónico" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Utilizar o preferido" + +#~ msgid "Change Email..." +#~ msgstr "Mudar o correo electrónico..." + +#~ msgid "Remove Entry" +#~ msgstr "Eliminar a entrada" + +#~ msgid "New Distribution List" +#~ msgstr "Nova lista de distribución" + +#~ msgid "Please enter &name:" +#~ msgstr "Escriba o &nome:" + +#~ msgid "Distribution List" +#~ msgstr "Lista de distribución" + +#~ msgid "Please change &name:" +#~ msgstr "Mude o &nome:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Borrar a lista de distribución «%1»?" + +#~ msgid "Selected addressees:" +#~ msgstr "Escolla os destinatarios:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Enderezos escollidos en «%1»:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Non" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Formato vCard" + +#~ msgid "No description available." +#~ msgstr "Non hai ningunha descrición dispoñíbel." + +#~ msgid "Unable to open lock file." +#~ msgstr "Non foi posíbel abrir o ficheiro de bloqueo." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "O recurso «%1» está trancado polo programa «%2»." + +#~ msgid "Error" +#~ msgstr "Erro" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Fallou o desbloqueo. O ficheiro de bloqueo é propiedade de outros " +#~ "procesos: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Todos os bloqueos tiveron éxito pero non se trancou nada " +#~ "realmente." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Todos os bloqueos fallaron." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Fallou a carga do recurso «%1»." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Fallou o gardado do recurso «%1»." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Foi imposíbel abrir o recurso «%1»" + +#~ msgid "Default Address Book" +#~ msgstr "Caderno de enderezos predeterminado" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Non foi posíbel gardar no recurso «%1». Está trancado." diff --git a/po/hi/kcontacts5.po b/po/hi/kcontacts5.po new file mode 100644 index 0000000..d5beb8b --- /dev/null +++ b/po/hi/kcontacts5.po @@ -0,0 +1,809 @@ +# translation of kabc.po to Hindi +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Ravishankar Shrivastava , 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 \n" +"Language-Team: Hindi \n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "पोस्ट बॉक्स नं." + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "पता की विस्तारित जानकारी" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "सड़क" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "जगह" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "क्षेत्र" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "पिन कोड" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "देश" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "डिलेवरी लेबल" + +#: address.cpp:353 +#, fuzzy, kde-format +#| msgid "Domestic" +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "घरेलू" + +#: address.cpp:355 +#, fuzzy, kde-format +#| msgid "International" +msgctxt "Address is not in home country" +msgid "International" +msgstr "अंतर्राष्ट्रीय" + +#: address.cpp:357 +#, fuzzy, kde-format +#| msgid "Postal" +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "पोस्टल" + +#: address.cpp:359 +#, fuzzy, kde-format +#| msgid "Parcel" +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "पार्सल" + +#: address.cpp:361 +#, fuzzy, kde-format +#| msgid "Home" +msgctxt "Home Address" +msgid "Home" +msgstr "घर" + +#: address.cpp:363 +#, fuzzy, kde-format +#| msgid "Work" +msgctxt "Work Address" +msgid "Work" +msgstr "कार्यस्थल" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "पसंदीदा पता" + +#: address.cpp:367 +#, fuzzy, kde-format +#| msgid "Other" +msgctxt "another type of address" +msgid "Other" +msgstr "अन्य" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, fuzzy, kde-format +#| msgid "Name" +msgid "Name" +msgstr "नाम" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, fuzzy, kde-format +#| msgid "Name" +msgid "Nick Name" +msgstr "नाम" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "" + +#: addressee.cpp:868 +#, fuzzy, kde-format +#| msgid "Select Addressee" +msgid "Home Address Street" +msgstr "पाने वाला चुनें" + +#: addressee.cpp:873 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Home Address Post Office Box" +msgstr "पोस्ट बॉक्स नं." + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Home Address State" +msgstr "ईमेल पता" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Home Address Label" +msgstr "ईमेल पता" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Business Address Post Office Box" +msgstr "पोस्ट बॉक्स नं." + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, fuzzy, kde-format +#| msgid "Mobile" +msgid "Mobile Phone" +msgstr "मोबिल" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "घर का फ़ैक्स" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "आईएसडीएन" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "पेजर" + +#: addressee.cpp:978 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Email Address" +msgstr "ईमेल पता" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "" + +#: addressee.cpp:1231 +#, fuzzy, kde-format +#| msgid "No" +msgid "Note" +msgstr "नहीं" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, fuzzy, kde-format +#| msgid "Home" +msgid "Homepage" +msgstr "घर" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "डॉ." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "कुमारी" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "श्रीमान्" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "श्रीमती" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "सुश्री" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "प्रा." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "कनिष्ठ" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "वरिष्ठ" + +#: field.cpp:206 +#, fuzzy, kde-format +#| msgid "Unknown type" +msgid "Unknown Field" +msgstr "अज्ञात क़िस्म" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "" + +#: field.cpp:223 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgctxt "street/postal" +msgid "Address" +msgstr "ईमेल पता" + +#: field.cpp:225 +#, fuzzy, kde-format +#| msgid "Email" +msgid "Email" +msgstr "ईमेल" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "" + +#: field.cpp:231 +#, fuzzy, kde-format +#| msgid "Custom" +msgid "Custom" +msgstr "मनपसंद" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "" + +#: key.cpp:198 +#, fuzzy, kde-format +#| msgid "X509" +msgctxt "X.509 public key" +msgid "X509" +msgstr "एक्स509" + +#: key.cpp:201 +#, fuzzy, kde-format +#| msgid "PGP" +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "पीजीपी" + +#: key.cpp:204 +#, fuzzy, kde-format +#| msgid "Custom" +msgctxt "A custom key" +msgid "Custom" +msgstr "मनपसंद" + +#: key.cpp:207 +#, fuzzy, kde-format +#| msgid "Unknown type" +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "अज्ञात क़िस्म" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, fuzzy, kde-format +#| msgid "Home" +msgctxt "Home phone" +msgid "Home" +msgstr "घर" + +#: phonenumber.cpp:174 +#, fuzzy, kde-format +#| msgid "Work" +msgctxt "Work phone" +msgid "Work" +msgstr "कार्यस्थल" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "मेसेंजर " + +#: phonenumber.cpp:178 +#, fuzzy, kde-format +#| msgid "Preferred" +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "पसंदीदा" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "आवाज़" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "फ़ैक्स" + +#: phonenumber.cpp:184 +#, fuzzy, kde-format +#| msgid "Mobile" +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "मोबिल" + +#: phonenumber.cpp:186 +#, fuzzy, kde-format +#| msgid "Video" +msgctxt "Video phone" +msgid "Video" +msgstr "वीडियो" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "डाक डिब्बा" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "मॉडेम" + +#: phonenumber.cpp:192 +#, fuzzy, kde-format +#| msgid "Car" +msgctxt "Car Phone" +msgid "Car" +msgstr "कार" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "पीसीएस" + +#: phonenumber.cpp:200 +#, fuzzy, kde-format +#| msgid "Other" +msgctxt "another type of phone" +msgid "Other" +msgstr "अन्य" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "पसंदीदा संख्या" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "ऑफिस का फ़ैक्स" + +#: secrecy.cpp:98 +#, fuzzy, kde-format +#| msgid "Public" +msgctxt "access is for everyone" +msgid "Public" +msgstr "सार्वजनिक" + +#: secrecy.cpp:101 +#, fuzzy, kde-format +#| msgid "Private" +msgctxt "access is by owner only" +msgid "Private" +msgstr "निजी" + +#: secrecy.cpp:104 +#, fuzzy, kde-format +#| msgid "Confidential" +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "गोपनीय" + +#: secrecy.cpp:107 +#, fuzzy, kde-format +#| msgid "Unknown type" +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "अज्ञात क़िस्म" + +#, fuzzy +#~| msgid "Preferred" +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "पसंदीदा" + +#~ msgid "List of Emails" +#~ msgstr "ई-मेल सूची" + +#, fuzzy +#~| msgid "Your names" +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "रविशंकर श्रीवास्तव, जी. करूणाकर" + +#, fuzzy +#~| msgid "Your emails" +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "raviratlami@aol.in" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "रिसोर्स '%1' लोड करने में अक्षम." + +#, fuzzy +#~| msgid "Select Addressee" +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "पाने वाला चुनें" + +#, fuzzy +#~| msgid "Name" +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "नाम" + +#, fuzzy +#~| msgid "Email" +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "ईमेल" + +#, fuzzy +#~| msgid "Selected" +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "चुना गया" + +#, fuzzy +#~| msgid "Unselect" +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "अचयनित" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "वितरण सूचियाँ कॉन्फ़िगर करें" + +#~ msgid "Select Email Address" +#~ msgstr "ई-मेल पता चुनें" + +#~ msgid "Email Addresses" +#~ msgstr "ईमेल पता" + +#, fuzzy +#~| msgid "Yes" +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "हाँ" + +#, fuzzy +#~| msgid "No" +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "नहीं" + +#~ msgid "New List..." +#~ msgstr "नई सूची..." + +#~ msgid "Rename List..." +#~ msgstr "सूची का नया नाम..." + +#~ msgid "Remove List" +#~ msgstr "सूची मिटाएँ" + +#~ msgid "Available addresses:" +#~ msgstr "उपलब्ध पताः" + +#, fuzzy +#~| msgid "Preferred Email" +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "प्राथमिकता ईमेल " + +#~ msgid "Add Entry" +#~ msgstr "एन्ट्री जोड़ें" + +#, fuzzy +#~| msgid "Email" +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "ईमेल" + +#, fuzzy +#~| msgid "Use Preferred" +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "पसंदीदा इस्तेमाल करें" + +#~ msgid "Change Email..." +#~ msgstr "ईमेल बदलें..." + +#~ msgid "Remove Entry" +#~ msgstr "एन्ट्री हटाएँ" + +#~ msgid "New Distribution List" +#~ msgstr "नई वितरण सूची" + +#~ msgid "Please enter &name:" +#~ msgstr "कृपया नाम भरें (&n):" + +#~ msgid "Distribution List" +#~ msgstr "वितरण सूची" + +#~ msgid "Please change &name:" +#~ msgstr "कृपया नाम बदलें (&n):" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "वितरण सूची '%1' हटाएँ?" + +#~ msgid "Selected addressees:" +#~ msgstr "चुने हुए पतेः" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr " '%1' में चुने हुए पते:" + +#, fuzzy +#~| msgid "No" +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "नहीं" + +#~ msgid "vCard" +#~ msgstr "वीकार्ड " + +#~ msgid "vCard Format" +#~ msgstr "वीकार्ड फॉर्मेट" + +#~ msgid "No description available." +#~ msgstr "कोई वर्णन उपलब्ध नहीं" + +#~ msgid "Unable to open lock file." +#~ msgstr "लाक फ़ाइल खोलने में अक्षम." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "रिसोर्स '%1' अनुप्रयोग '%2' द्वारा तालाबंद है." + +#~ msgid "Error" +#~ msgstr "त्रुटि" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "ताला खोलने में असफल. लाक फ़ाइल अन्य प्रक्रम के स्वामित्व में है: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: सभी तालाबंद सफल किंतु वास्तविक ताला नहीं लगाया." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: सभी ताला असफल." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "संसाधन '%1' लोड करना असफल." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "संसाधन '%1' सहेना असफल." + +#, fuzzy +#~| msgid "Unable to load resource '%1'" +#~ msgid "Unable to open resource '%1'." +#~ msgstr "रिसोर्स '%1' लोड करने में अक्षम." + +#, fuzzy +#~| msgid "Select Addressee" +#~ msgid "Default Address Book" +#~ msgstr "पाने वाला चुनें" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "संसाधन '%1' पर सहेजने में अक्षम. यह ताला बंद है." diff --git a/po/hne/kcontacts5.po b/po/hne/kcontacts5.po new file mode 100644 index 0000000..df9fae7 --- /dev/null +++ b/po/hne/kcontacts5.po @@ -0,0 +1,746 @@ +# translation of kabc.po to Hindi +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Ravishankar Shrivastava , 2008. +# Ravishankar Shrivastava , 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 \n" +"Language-Team: Hindi \n" +"Language: hne\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 0.2\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "पोस्ट डब्बा नं." + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "पता के विस्तारित जानकारी" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "सड़क" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "जगह" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "छेत्र" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "पिन कोड" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "देस" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "डिलेवरी लेबल" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "घरेलू" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "अंतररास्ट्रीय" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "पोस्टल" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "पार्सल" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "घर" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "कामस्थल" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "निसानी पता" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "अन्य" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "बेजोड़ पहचान" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "नांव" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "फार्मेटेड नाम" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "कुटुंब नाम" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "दे गे नाम" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "अतिरिक्त नाम" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "उप नांव" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "जन्मदिन" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "घर के पता सड़क" + +#: addressee.cpp:873 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Home Address Post Office Box" +msgstr "पोस्ट डब्बा नं." + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "घर के पता सहर" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "घर के पता राज्य" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "घर के पता जिप कोड" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "घर के पता देस" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "घर के पता लेबल" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Business Address Post Office Box" +msgstr "पोस्ट डब्बा नं." + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "घर फोन" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "व्यवसाय फोन" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "मोबाइल फोन" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "घर के फैक्स" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "व्यवसाय फेक्स" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "कार फोन" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "आईएसडीएन" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "पेजर" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "ईमेल पता" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "डाकिया" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "समय छेत्र" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "भौगोलिक स्थिति" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "सीर्सक" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "भूमिका" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "संगठन " + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "विभाग" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "टिप्पनी" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "संसोधन तारीक" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "मुख पेज" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "सुरक्छा क्लास" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "लोगो" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "फोटू" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "अवाज" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "डा." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "कुमारी" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "स्रीमान्" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "स्रीमती" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "सुस्री" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "प्रा." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "कनिस्ठ" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "वरिस्ठ" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "अग्यात छेत्र" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "सब्बो" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "बारंबार" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "पता" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "ईमेल" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "निजी" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "मनमाफिक" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "अपरिभासित " + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "एक्स509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "पीजीपी" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "मनमाफिक" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "अग्यात किसिम" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "घर" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "कामस्थल" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "मेसेंजर " + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "निसानी" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "अवाज" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "फैक्स" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "मोबाइल" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "वीडियो" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "डाक डिब्बा" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "माडेम" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "कार" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "पीसीएस" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "अन्य" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "निसानी संख्या" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "आफिस के फैक्स" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "सार्वजनिक" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "निजी" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "गोपनीय" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "अग्यात किसिम" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "निसानी" + +#~ msgid "List of Emails" +#~ msgstr "ई-मेल सूची" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "रविसंकर सिरीवास्तव, जी. करूनाकर" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "raviratlami@aol.in," + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "रिसोर्स '%1' लोड करे मं अक्छम." + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "पावइया चुनव" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "नांव" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "ईमेल" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "चुने गे" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "मतचुनव" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "वितरन सूचियाँ कान्फिगर करव" + +#~ msgid "Select Email Address" +#~ msgstr "ई-मेल पता चुनव" + +#~ msgid "Email Addresses" +#~ msgstr "ईमेल पता" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "हाँ" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "नइ" + +#~ msgid "New List..." +#~ msgstr "नवा सूची..." + +#~ msgid "Rename List..." +#~ msgstr "सूची के नवा नाम..." + +#~ msgid "Remove List" +#~ msgstr "सूची मेटाव" + +#~ msgid "Available addresses:" +#~ msgstr "मिलत पताः" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "प्राथमिकता ईमेल " + +#~ msgid "Add Entry" +#~ msgstr "एन्ट्री जोड़व" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "ईमेल" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "निसानी उपयोग करव" + +#~ msgid "Change Email..." +#~ msgstr "ईमेल बदलव..." + +#~ msgid "Remove Entry" +#~ msgstr "एन्ट्री हटाव" + +#~ msgid "New Distribution List" +#~ msgstr "नवा वितरन सूची" + +#~ msgid "Please enter &name:" +#~ msgstr "किरपा करके, नाम भरव (&n):" + +#~ msgid "Distribution List" +#~ msgstr "वितरन सूची" + +#~ msgid "Please change &name:" +#~ msgstr "किरपा करके, नाम बदलव (&n):" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "वितरन सूची '%1' हटाव?" + +#~ msgid "Selected addressees:" +#~ msgstr "चुने हुए पतेः" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr " '%1' मं चुने हुए पते:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "नइ" + +#~ msgid "vCard" +#~ msgstr "वीकार्ड " + +#~ msgid "vCard Format" +#~ msgstr "वीकार्ड फार्मेट" + +#~ msgid "No description available." +#~ msgstr "कोई वर्नन नइ मिलत" + +#~ msgid "Unable to open lock file." +#~ msgstr "लाक फाइल खोले मं अक्छम." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "रिसोर्स '%1' अनुपरयोग '%2' से तालाबंद हे." + +#~ msgid "Error" +#~ msgstr "गलती" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "ताला खोले मं फेल. लाक फाइल अउ प्रक्रम के मालिकाना मं हे: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: सब्बो तालाबंद सफल किंतु सही ताला नइ लगाही." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: सब्बो ताला फेल." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "संसाधन '%1' लोड करना फेल." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "संसाधन '%1' सहेना फेल." + +#, fuzzy +#~| msgid "Unable to load resource '%1'" +#~ msgid "Unable to open resource '%1'." +#~ msgstr "रिसोर्स '%1' लोड करे मं अक्छम." + +#, fuzzy +#~ msgid "Default Address Book" +#~ msgstr "पावइया चुनव" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "संसाधन '%1' मं सहेजे मं अक्छम. ए ताला बंद हे." diff --git a/po/hu/kcontacts5.po b/po/hu/kcontacts5.po new file mode 100644 index 0000000..f8239bf --- /dev/null +++ b/po/hu/kcontacts5.po @@ -0,0 +1,742 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Tamas Szanto , 2007. +# Kristóf Kiszel , 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 \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 20.03.70\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postafiók" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Kibővített címadatok" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Utca" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Helység" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Megye/régió" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Irányítószám" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Ország" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Kézbesítési címke" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Belföldi" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Külföldi" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postai cím" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Csomag" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Otthoni" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Munkahelyi" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Elsődleges cím" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Egyéb" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Egyedi azonosító" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Név" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formázott név" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Családi név" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Utónév" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Egyéb nevek" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Előtagok" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Utótagok" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Becenév" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Születésnap" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Utca (otthoni)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Postafiók (otthoni)" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Helység (otthoni)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Állam (otthoni)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Irányítószám (otthoni)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Ország (otthoni)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Címke (otthoni)" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Utca (munkahelyi)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Postafiók (munkahelyi)" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Helység (munkahelyi)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Állam (munkahelyi)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Irányítószám (munkahelyi)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Ország (munkahelyi)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Címke (munkahelyi)" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefon (otthoni)" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon (munkahelyi)" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobil" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax (otthoni)" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax (munkahelyi)" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Autótelefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Csipogó" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-mail cím" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Levelezőprogram" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Időzóna" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Földrajzi pozíció" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Megszólítás" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Beosztás" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Szervezet" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Osztály" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Megjegyzés" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Termékazonosító" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Verzió" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Rendezési sztring" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Honlap" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Biztonsági osztály" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logó" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fénykép" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Hang" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Mr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mrs." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Ismeretlen mező" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Mind" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "A fontosabbak" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Cím" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail cím" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Privát" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Egyedi" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nincs megadva" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Egyedi" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Ismeretlen címtípus" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonszám" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Otthoni" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Munkahelyi" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Üzenetküldő" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Elsődleges" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Hang" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Videó" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postaláda" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Autó" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Egyéb" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Elsődleges telefonszám" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Munkahelyi fax" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Nyilvános" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privát" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Bizalmas" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Ismeretlen" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Elsődleges" + +#~ msgid "List of Emails" +#~ msgstr "E-mail címek" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Szántó Tamás,Kiszel Kristóf" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "tszanto@interware.hu,ulysses@kubuntu.org" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Nem sikerült betölteni ezt az erőforrást: „%1”." + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Címzett kiválasztása" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Név" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-mail cím" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Kijelölve" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Nincs kijelölve" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Címlisták beállítása" + +#~ msgid "Select Email Address" +#~ msgstr "E-mail cím kiválasztása" + +#~ msgid "Email Addresses" +#~ msgstr "E-mail címek" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Igen" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nem" + +#~ msgid "New List..." +#~ msgstr "Új lista…" + +#~ msgid "Rename List..." +#~ msgstr "Lista átnevezése…" + +#~ msgid "Remove List" +#~ msgstr "Lista eltávolítása" + +#~ msgid "Available addresses:" +#~ msgstr "Címek:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Elsődleges e-mail cím" + +#~ msgid "Add Entry" +#~ msgstr "Új bejegyzés" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-mail cím" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Az elsődleges cím használata" + +#~ msgid "Change Email..." +#~ msgstr "E-mail cím módosítása…" + +#~ msgid "Remove Entry" +#~ msgstr "Bejegyzés törlése" + +#~ msgid "New Distribution List" +#~ msgstr "Új címlista" + +#~ msgid "Please enter &name:" +#~ msgstr "Né&v:" + +#~ msgid "Distribution List" +#~ msgstr "Címlista" + +#~ msgid "Please change &name:" +#~ msgstr "Változtassa meg a n&evet:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Törölni szeretné ezt a címlistát: „%1”?" + +#~ msgid "Selected addressees:" +#~ msgstr "Kijelölt címzettek:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Kijelölt címzettek itt: „%1”:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nem" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard formátum" + +#~ msgid "No description available." +#~ msgstr "Nincs leírás." + +#~ msgid "Unable to open lock file." +#~ msgstr "Nem sikerült megnyitni egy zárolófájlt." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "A(z) „%2” alkalmazás zárolta ezt a fájlt: „%1”." + +#~ msgid "Error" +#~ msgstr "Hiba" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "A feloldás nem sikerült, mert a zárolófájlt fogja ez a folyamat: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "A zárolások sikerültek, de nem történt tényleges zárolás." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "Egy zárolás sem sikerült." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Nem sikerült betölteni ezt az erőforrást: „%1”." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Nem sikerült elmenteni ezt az erőforrást: „%1”." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Nem sikerült megnyitni ezt az erőforrást: „%1”." + +#~ msgid "Default Address Book" +#~ msgstr "Alapértelmezett címjegyzék" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "" +#~ "A következő erőforrás zárolt, ezért nem sikerült bele menteni: „%1”." diff --git a/po/ia/kcontacts5.po b/po/ia/kcontacts5.po new file mode 100644 index 0000000..0bd605b --- /dev/null +++ b/po/ia/kcontacts5.po @@ -0,0 +1,743 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# g.sora , 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 \n" +"Language-Team: Interlingua \n" +"Language: ia\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Cassa de officio de posta" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Information de adresse extendite" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Strata" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localitate" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Codice postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Pais" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etiquetta de livration" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domestic" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "International" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Parcella" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Domo" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Labor" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Adresse preferite" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Altere" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificator unic" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nomine" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nomine formatate" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Nomine de Familia" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nomine date" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nomines additional" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixos honorific" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Suffixos honorific" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Pseudonymo" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Anniversario de nativitate" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Strata de adresse de domo" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Cassa de officio de posta de adresse de domo" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Citate de adresse de domo" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Stato de adresse de domo" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Codice postal de adresse de domo" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Pais de adresse de domo" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiquetta de adresse de domo" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Strata de adresse de labor" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Cassa de officio de posta de adresse de labor" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Citate de adresse de labor" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Stato de adresse de labor" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Codice postal de adresse de labor" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Pais de adresse de labor" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etiquetta de adresse de labor" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telephono de domo" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telephono de affaires" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telephono mobile" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax de domo" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax de affaires" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telephono de automobile" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adresse de E-Posta" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Cliente de e-posta" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zona de Tempore" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Position geographic" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titulo" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rolo" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organization" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departimento" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificator de producto" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data de revision" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Ordina catena" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Pagina Domo o Principal" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe de securitate" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Photo" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Sono" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Senioretta" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Senior" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Seniora" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Seniora" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Campo incognite" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Omne" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frequente" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresse" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-posta" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalisate" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Non definite" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalisate" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Typo incognite" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Numero de telephono" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Domo" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Labor" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messagero" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferite" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voce" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobile" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Cassa postal" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Automobile" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Altere" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Numero preferite" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax de labor" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Public" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Private" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidential" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Typo incognite" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferite" + +#~ msgid "List of Emails" +#~ msgstr "Lista de e-postas" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Giovanni Sora" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "g.sora@tiscali.it" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Incapace de cargar ressource: '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Selige destinatario" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nomine" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-posta" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Seligite" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "De-selige" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Configura listas de distribution" + +#~ msgid "Select Email Address" +#~ msgstr "Selige adresses de e-posta" + +#~ msgid "Email Addresses" +#~ msgstr "Adresses de E-Posta" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Si" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "New List..." +#~ msgstr "Nove lista..." + +#~ msgid "Rename List..." +#~ msgstr "Renomina lista..." + +#~ msgid "Remove List" +#~ msgstr "Remove lista" + +#~ msgid "Available addresses:" +#~ msgstr "Adresses disponibile:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "E-posta preferite" + +#~ msgid "Add Entry" +#~ msgstr "Adde Entrata" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-posta" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Usa preferite" + +#~ msgid "Change Email..." +#~ msgstr "Cambia e-posta..." + +#~ msgid "Remove Entry" +#~ msgstr "Remove entrata" + +#~ msgid "New Distribution List" +#~ msgstr "Nove lista de distribution" + +#~ msgid "Please enter &name:" +#~ msgstr "Per favor inserta &nomine:" + +#~ msgid "Distribution List" +#~ msgstr "Lista de distribution" + +#~ msgid "Please change &name:" +#~ msgstr "Pro favor cambia &nomine:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Dele lista de distribution '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Destinatarios seligite:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Adresses seligite in '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Formato de vCard" + +#~ msgid "No description available." +#~ msgstr "Nulle description disponibile." + +#~ msgid "Unable to open lock file." +#~ msgstr "Incapace de aperir file de bloco." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Le ressource '%1' es blocate per application '%2'." + +#~ msgid "Error" +#~ msgstr "Error" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Il falleva a disblocar. File de bloco es de proprietate de un altere " +#~ "processo: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Tote blocos habeva successo ma nulle bloco in realitate ha " +#~ "essite facite." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Omne blocos falleva." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Il falleva a cargar ressource '%1'." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Il falleva a salveguardar ressource '%1'." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Incapace de aperir ressource '%1'." + +#~ msgid "Default Address Book" +#~ msgstr "Adressario predefinite" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Incapace de salveguardar ressource '%1'. Il es blocate." diff --git a/po/id/kcontacts5.po b/po/id/kcontacts5.po new file mode 100644 index 0000000..c02fb98 --- /dev/null +++ b/po/id/kcontacts5.po @@ -0,0 +1,583 @@ +# Copyright (C) YEAR This file is copyright: +# This file is distributed under the same license as the kcontacts package. +# Wantoyo , 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 \n" +"Language-Team: Indonesian \n" +"Language: id\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Kotak Kantor Pos" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informasi Alamat Diperluas" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Jalan" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Lokalitas" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Kode Pos" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Negeri" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Label Pengiriman" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domestik" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internasional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Kartu Pos" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Parsel" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Rumah" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Kantor" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Alamat yang Disukai" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Lainnya" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Pengidentifikasi Unik" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nama" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nama yang Diformat" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Nama Keluarga" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nama yang Diberikan" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nama-nama Tambahan" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Awalan Kehormatan" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Akhiran Kehormatan" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Nama Panggilan" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Hari Lahir" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Jalan Alamat Rumah" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Kotak Kantor Pos Alamat Rumah" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Kota Alamat Rumah" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Negara Alamat Rumah" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Kode Zip Alamat Rumah" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Negeri Alamat Rumah" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Label Alamat Rumah" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Jalan Alamat Bisnis" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Kotak Kantor Pos Alamat Bisnis" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Kota Alamat Bisnis" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Negara Alamat Bisnis" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Kode Zip Alamat Bisnis" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Negeri Alamat Bisnis" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Label Alamat Bisnis" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telepon Rumah" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telepon Bisnis" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telepon Genggam" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax Rumah" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax Bianis" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telepon Mobil" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pèjer (Pager)" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Alamat Email" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Klien Mail" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zona Waktu" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posisi Geografis" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Judul" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Peran" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisasi" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Jawatan" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Catatan" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Pengidentifikasi Produk" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Tanggal Revisi" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Urutkan String" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Laman" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Kelas Keamanan" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Suara" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Nona" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Tn." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Ny." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Nn." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Bidang tak diketahui" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Semua" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Sering" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Alamat" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Email" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Kustom" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Tak ditentukan" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Kustom" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipe tak diketahui" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Nomor telepon" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Rumah" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Kantor" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Perpesanan" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Disukai" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Suara" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Seluler" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Kotak Surat" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Mobil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Lainnya" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Nomor yang Disukai" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax Kantor" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publik" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Diberi Kepercayaan" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipe tak diketahui" diff --git a/po/it/kcontacts5.po b/po/it/kcontacts5.po new file mode 100644 index 0000000..0e7819f --- /dev/null +++ b/po/it/kcontacts5.po @@ -0,0 +1,746 @@ +# translation of kabc.po to Italian +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the kabc package. +# Federico Zenith , 2007. +# Pino Toscano , 2009. +# Luigi Toscano , 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 \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Casella postale" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informazioni estese sull'indirizzo" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Via" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Località" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Regione" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Codice postale" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Nazione" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etichetta di consegna" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domestico" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internazionale" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postale" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Pacco" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Casa" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Lavoro" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Indirizzo preferito" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Altro" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificatore univoco" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nome" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nome formattato" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Cognome" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nome" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Altri nomi" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefissi onorifici" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Suffissi onorifici" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Soprannome" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Data di nascita" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Via indirizzo di casa" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Casella postale indirizzo di casa" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Città indirizzo di casa" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Stato indirizzo di casa" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "CAP indirizzo di casa" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Stato indirizzo di casa" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etichetta indirizzo di casa" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Via indirizzo di lavoro" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Casella postale indirizzo di lavoro" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Città indirizzo di lavoro" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Stato indirizzo di lavoro" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "CAP indirizzo di lavoro" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Stato indirizzo di lavoro" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etichetta indirizzo di lavoro" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefono di casa" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefono di lavoro" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telefono cellulare" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax a casa" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax di lavoro" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefono auto" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Cercapersone" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Indirizzo di posta elettronica" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Programma di posta elettronica" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Fuso orario" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posizione geografica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titolo" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Ruolo" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizzazione" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Dipartimento" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificativo prodotto" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data di revisione" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Stringa di ordinamento" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Homepage" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe di sicurezza" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Suono" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dott." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Sig.rina" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sig." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Sig.ra" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ing." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Campo sconosciuto" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Tutto" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frequente" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Indirizzo" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Posta elettronica" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personale" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalizzato" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Non definito" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalizzata" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipo sconosciuto" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Numero di telefono" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Casa" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Lavoro" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messaggistica" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferito" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voce" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Cellulare" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Casella" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Macchina" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Altro" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Numero preferito" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax al lavoro" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Pubblico" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privato" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidenziale" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipo sconosciuto" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferito" + +#~ msgid "List of Emails" +#~ msgstr "Elenco di indirizzi" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Federico Zenith" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "federico.zenith@member.fsf.org" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Impossibile caricare la risorsa «%1»" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Seleziona destinatario" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nome" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Posta elettronica" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Selezionato" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Deseleziona" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Configura liste di distribuzione" + +#~ msgid "Select Email Address" +#~ msgstr "Seleziona indirizzo di posta" + +#~ msgid "Email Addresses" +#~ msgstr "Indirizzi di posta" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Sì" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "New List..." +#~ msgstr "Nuova lista..." + +#~ msgid "Rename List..." +#~ msgstr "Rinomina lista..." + +#~ msgid "Remove List" +#~ msgstr "Rimuovi lista" + +#~ msgid "Available addresses:" +#~ msgstr "Indirizzi disponibili:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Indirizzo di posta preferito" + +#~ msgid "Add Entry" +#~ msgstr "Aggiungi voce" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Posta elettronica" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Usa preferito" + +#~ msgid "Change Email..." +#~ msgstr "Cambia indirizzo di posta..." + +#~ msgid "Remove Entry" +#~ msgstr "Rimuovi voce" + +#~ msgid "New Distribution List" +#~ msgstr "Nuova lista di distribuzione" + +#~ msgid "Please enter &name:" +#~ msgstr "Inserisci il &nome:" + +#~ msgid "Distribution List" +#~ msgstr "Lista di distribuzione" + +#~ msgid "Please change &name:" +#~ msgstr "Cambia il &nome:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Eliminare la lista di distribuzione «%1»?" + +#~ msgid "Selected addressees:" +#~ msgstr "Destinatari selezionati:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Destinatari selezionati in «%1»:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "No" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Formato vCard" + +#~ msgid "No description available." +#~ msgstr "Nessuna descrizione disponibile." + +#~ msgid "Unable to open lock file." +#~ msgstr "Impossibile aprire file di blocco." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "La risorsa «%1» è bloccata dall'applicazione «%2»." + +#~ msgid "Error" +#~ msgstr "Errore" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Sblocco non riuscito. Il file di blocco è di proprietà di un altro " +#~ "processo: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "Blocco nullo: tutti i blocchi sono riusciti, ma non è stato effettuato " +#~ "nessun blocco." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "Blocco nullo: nessun blocco è riuscito." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Caricamento della risorsa «%1» non riuscito." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Salvataggio della risorsa «%1» non riuscito." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Impossibile aprire la risorsa «%1»" + +#~ msgid "Default Address Book" +#~ msgstr "Rubrica predefinita" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Impossibile salvare la risorsa «%1»: è bloccata." diff --git a/po/ja/kcontacts5.po b/po/ja/kcontacts5.po new file mode 100644 index 0000000..366e16b --- /dev/null +++ b/po/ja/kcontacts5.po @@ -0,0 +1,585 @@ +# Translation of kabc into Japanese. +# This file is distributed under the same license as the kdepimlibs package. +# Yukiko Bando , 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 \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "私書箱" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "住所の詳細" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "番地" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "区市町村" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "都道府県" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "郵便番号" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "国" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "宛先ラベル" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "国内" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "国際" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "郵便" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "小包" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "自宅" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "勤務先" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "優先住所" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "その他" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "一意の識別子" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "名前" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "フォーマットされた名前" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "姓" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "名" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "付加的な名前" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "敬称 (前)" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "敬称 (後)" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "ニックネーム" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "誕生日" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "自宅住所 番地" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "自宅住所 私書箱" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "自宅住所 市" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "自宅住所 都道府県" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "自宅住所 郵便番号" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "自宅住所 国" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "自宅住所 ラベル" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "勤務先住所 番地" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "勤務先住所 私書箱" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "勤務先住所 市" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "勤務先住所 都道府県" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "勤務先住所 郵便番号" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "勤務先住所 国" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "勤務先住所 ラベル" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "自宅電話" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "勤務先電話" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "携帯電話" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "自宅のファクス" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "勤務先ファクス" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "車載電話" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "ポケットベル" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "メールアドレス" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "メールクライアント" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "タイムゾーン" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "地理的な位置" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "肩書" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "役割" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "組織" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "部署" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "備考" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "製品の識別子" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "改訂日付" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "ソート文字列" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "ホームページ" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "セキュリティクラス" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "ロゴ" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "写真" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "音声" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Mr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mrs." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "未知のフィールド" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "すべて" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "よく使う" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "住所" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "メール" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "個人的" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "カスタム" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "未定義" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X.509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "カスタム" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "未知のタイプ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "自宅" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "勤務先" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "メッセンジャー" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "優先電話番号" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "ボイスフォン" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "ファクス" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "携帯電話" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "ビデオフォン" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "メールボックス" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "モデム" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "自動車電話" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "その他" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "優先番号" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "勤務先のファクス" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "公開" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "プライベート" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "内密" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "未知のタイプ" diff --git a/po/ka/kcontacts5.po b/po/ka/kcontacts5.po new file mode 100644 index 0000000..cd38a38 --- /dev/null +++ b/po/ka/kcontacts5.po @@ -0,0 +1,585 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR This file is copyright: +# This file is distributed under the same license as the kcontacts package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: kcontacts\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2022-09-18 11:56+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.1.1\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "საფოსტო ყუთი" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "გაფართოებული მისამართი" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "ქუჩა" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "რაიონი" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "რეგიონი" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "საფოსტო კოდი" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "ქვეყანა" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "მიწოდების ეტიკეტი" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "შიდა" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "საერთაშორისო" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "საფოსტო კოდი" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "ამანათი" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "სახლი" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "სამუშაო" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "სასურველი მისამართი" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "სხვა" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "უნიკალური იდენტიფიკატორი" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "სახელი" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "ფორმატირებული სახელი" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "საოჯახო სახელი" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "სახელი" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "დამატებითი სახელები" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "საპატიო პრეფიქსი" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "საპატიო სუფიქსი" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "მეტსახელი" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "დაბადების დღე" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "სახლის მისამართი ქუჩა" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "სახლის მისამართი საფოსტო ყუთი" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "სახლის მისამართი ქალაქი" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "სახლის მისამართი შტატი" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "სახლის მისამართი საფოსტო კოდი" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "სახლის მისამართი ქვეყანა" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "სახლის მისამართი ჭდე" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "სამსახურის მისამართი ქუჩა" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "სამსახურის მისამართი საფოსტო ყუთი" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "სამსახურის მისამართი ქალაქი" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "სამსახურის მისამართი შტატი" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "სამსახურის მისამართი საფოსტო კოდი" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "სამსახურის მისამართი ქვეყანა" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "სამსახურის მისამართი ჭდე" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "სახლის ტელეფონი" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "სამსახურის ტელეფონი" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "მობილური ტელეფონი" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "სახლის ფაქსი" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "სამსახურის ფაქსი" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "მანქანის ტელეფონი" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "პეიჯერი" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "ელ-ფოსტის მისამართი" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "საფოსტო კლიენტი" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "დროის სარტყელი" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "გეოგრაფიული მდებარეობა" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "სათაური" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "როლი" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "ორგანიზაცია" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "დეპარტამენტი" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "შენიშვნა" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "პროდუქტის იდენტიფიკატორი" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "გადასინჯვის თარიღი" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "დალაგების სტრიქონი" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "საწყისი გვერდი" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "უსაფრთხოების კლასი" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "ლოგო" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "სურათი" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "ხმა" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "დრ." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "ქნ" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "ბნ." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "ქნ." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "ქნ." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "პროფ." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "უმც." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "უფრ." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "უცნობი ველი" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "ყველა" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "ხშირი" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "მისამართი" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "ელფოტა" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "პერსონალური" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "ხელით მითითება" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "გაურკვეველი" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "ხელით მითითება" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "უცნობი ტიპი" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "ტელეფონის ნომერი" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "სახლი" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "სამუშაო" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "მესინჯერი" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "მირჩევნია" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "ხმა" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "ფაქსი" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "მობაილი" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "ვიდეო" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "საფოსტო ყუთი" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "მოდემი" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "მანქანა" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "სხვა" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "სასურველი ნომერი" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "სამსახურის ფაქსი" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "საჯარო" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "პირადი" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "კონფიდენციალური" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "უცნობი ტიპი" diff --git a/po/kk/kcontacts5.po b/po/kk/kcontacts5.po new file mode 100644 index 0000000..da2d986 --- /dev/null +++ b/po/kk/kcontacts5.po @@ -0,0 +1,741 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Sairan Kikkarin , 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 \n" +"Language-Team: Kazakh \n" +"Language: kk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Абоненттік жәшік" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Кеңейтілген адресі" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Көше" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Елді мекен" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Өлке/Обылыс" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Пошта индексі" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Ел" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Жапсырма жарлық" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Ел ішіндегі" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Халықаралық" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Хаттарға арналған" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Дестелерге арналған" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Ұй" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Жұмыс" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Негізгі адресі" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Басқа" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Бірегей идентификаторы" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Аты-жөні" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Пішімделген атау" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Тегі" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Өз аты" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Әкесінің (қосымша) аты" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Қошеметтеу префиксі" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Қошеметтеу жұрнағы" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Бүркеншік аты" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Туған күні" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Үй адрес көшесі" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Үй адрес абоненттік жәшігі" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Үй адрес қаласы" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Үй адрес уәлаят/облысы" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Үй адрес пошта индексі" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Үй адрес Елі" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Үй адрес жапсырма жарлығы" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Жұмыс адрес көшесі" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Жұмыс адрес абоненттік жәшігі" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Жұмыс адрес қаласы" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Жұмыс адрес уәлаят/облысы" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Жұмыс адрес пошта индексі" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Жұмыс адрес Елі" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Жұмыс адрес жапсырма жарлығы" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Үй телефоны" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Жұмыс телефоны" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Қалта телефоны" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Үйдегі факсы" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Жұмыстағы факс" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Машинадағы телефоны" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr " " + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Пейджері" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Эл.пошта адресі" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Пошта клиенті" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Уақыт белдеуі" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Географиялық орны" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Атағы" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Қызметі" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Ұйымы" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Бөлімі" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Жазба" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Өнім идентификаторы" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Соңғы өзгертілген кезі" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Реттеу" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Мекен парағы" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Қауіпсіздік класы" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Логотипі" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Фотосуреті" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Дыбысы" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "д-р" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "мис." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "мистер" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "мадам" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "миссис" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "проф." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Беймәлім өріс" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Бүкілі" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Жиі қолданатын" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Адресі" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Эл.поштасы" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Дербес" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Өзге" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Анықталмаған" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Өзге" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Беймәлім түрі" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Ұй" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Жұмыс" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Хабарласу" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Негізгісі" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Дауыс" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Қалтафон" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Бейнефон" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Дауыс поштасы" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Модем" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Машинадағы телефон" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS (GSM-1900)" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Басқа" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Негізгі тел. нөмірі" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Жұмыс факсы" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Ашық" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Жеке" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Сырлы" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Беймәлім түрі" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Негізгі адресі" + +#~ msgid "List of Emails" +#~ msgstr "Эл.пошта адрестер тізімі" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Сайран Киккарин" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "sairan@computer.org" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "'%1' дерек көздегісі жүктеуге келмейді" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Адресатты таңдау" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Аты-жөні" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Эл.поштасы" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Таңдағаны" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Таңдаудан шығару" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Тарату тізімдерін баптау" + +#~ msgid "Select Email Address" +#~ msgstr "Эл.пошта адресін таңдау" + +#~ msgid "Email Addresses" +#~ msgstr "Эл.пошта адрестері" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Иә" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Жоқ" + +#~ msgid "New List..." +#~ msgstr "Жаңа тізім..." + +#~ msgid "Rename List..." +#~ msgstr "Тізім атауын өзгерту..." + +#~ msgid "Remove List" +#~ msgstr "Тізімді өшіру" + +#~ msgid "Available addresses:" +#~ msgstr "Бар адрестері:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Негізгі эл.пошта адресі" + +#~ msgid "Add Entry" +#~ msgstr "Жазуды қосу" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Эл.пошта" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Қолданатыны" + +#~ msgid "Change Email..." +#~ msgstr "Эл.поштаны өзгерту..." + +#~ msgid "Remove Entry" +#~ msgstr "Жазуды өшіру" + +#~ msgid "New Distribution List" +#~ msgstr "Жаңа тарату тізімі" + +#~ msgid "Please enter &name:" +#~ msgstr "&Атауы:" + +#~ msgid "Distribution List" +#~ msgstr "Тарату тізімі" + +#~ msgid "Please change &name:" +#~ msgstr "Атауын өзгертіңіз:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "'%1' тарату тізімін өшірмексіз бе?" + +#~ msgid "Selected addressees:" +#~ msgstr "Таңдалған адрестері:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "'%1' дегенде таңдалғаны:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Жоқ" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "VCard пішімі" + +#~ msgid "No description available." +#~ msgstr "Сипаттамасы жоқ." + +#~ msgid "Unable to open lock file." +#~ msgstr "Бұғаттау файл ашылмады." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "'%1' деректер көзін '%2' бағдарламасы бұғаттаған." + +#~ msgid "Error" +#~ msgstr "Қате" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "Бұғаты шешу жаңылысы. Бұғат файлдың ие-процесі: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Бүкіл бұғаттаулар сәтті өтті, бірақ іс жүзінде ештеңе " +#~ "бұғатталған жоқ." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Бұкіл бұғаттаулар жаңылды." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "'%1' деген ресурс жүктелмеді." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "'%1' деген ресурс сақталмады." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "'%1' ресурсы ашылмады." + +#~ msgid "Default Address Book" +#~ msgstr "Әдетті адрестік кітапша" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "'%1' ресурсына сақталмады, себебі ол бұғатталған." diff --git a/po/km/kcontacts5.po b/po/km/kcontacts5.po new file mode 100644 index 0000000..465dd37 --- /dev/null +++ b/po/km/kcontacts5.po @@ -0,0 +1,745 @@ +# translation of kabc.po to Khmer +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Khoem Sokhem , 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 \n" +"Language-Team: Khmer \n" +"Language: km\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"\n" +"\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "ប្រអប់​សំបុត្រ" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "ព័ត៌មាន​អាសយដ្ឋាន​បន្ថែម" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "ផ្លូវ" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "មូលដ្ឋាន" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "តំបន់" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "កូដ​​ប្រៃសណីយ៍" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "ប្រទេស" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "ស្លាក​បញ្ចូន" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "ក្នុង​ប្រទេស" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "អន្តរជាតិ" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "ប្រៃសណីយ៍" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "កញ្ចប់" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "ផ្ទះ" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "ការងារ" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "អាសយដ្ឋាន​ដែល​ពេញចិត្ត" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "ផ្សេងៗ" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "ឧបករណ៍​កំណត់​អត្តសញ្ញាណ​តែ​មួយ​គត់" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "ឈ្មោះ" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "ឈ្មោះ​មានទ្រង់ទ្រាយ" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "នាម​ត្រកូល" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "នាម​ខ្លួន" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "ឈ្មោះ​បន្ថែម" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "បុព្វបទ​កិត្តិយស" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "បច្ច័យ​កិត្តិយស" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "សម្មតិនាម" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "ថ្ងៃ​កំណើត" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "ផ្លូវ​អាសយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "ប្រអប់​សំបុត្រ​នៃ​អាយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "ទីក្រុង​អាសយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "រដ្ឋ​អាសយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "កូដ​តំបន់​អាសយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "ប្រទេស​អាសយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "ស្លាក​អាសយដ្ឋាន​ផ្ទះ" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "ផ្លូវ​អាសយដ្ឋាន​ពាណិជ្ជកម្ម" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "ប្រអប់​សំបុត្រ​នៃ​អាសយដ្ឋាន​កន្លែង​ធ្វើការ" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "ទីក្រុង​អាសយដ្ឋាន​ពាណិជ្ជកម្ម" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "រដ្ឋ​អាសយដ្ឋាន​ពាណិជ្ជកម្ម" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "កូដ​តំបន់​អាសយដ្ឋាន​ពាណិជ្ជកម្ម" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "ប្រភេទ​អាសយដ្ឋាន​ពាណិជ្ជកម្ម" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "ស្លាក​អាសយដ្ឋាន​ពាណិជ្ជកម្ម" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "ទូរស័ព្ទ​ផ្ទះ" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "ទូរស័ព្ទ​ពាណិជ្ជកម្ម" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "ទូរស័ព្ទ​ចល័ត" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "ទូរសារ​នៅ​ផ្ទះ" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "ទូរសារ​ពាណិជ្ជកម្ម" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "ទូរស័ព្ទ​រថយន្ត" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "ភេកយ័រ" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "អាសយដ្ឋាន​អ៊ីមែល" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "កម្មវិធី​អ៊ីមែល" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "តំបន់​ពេលវេលា" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "ទីតាំង​ភូមិសាស្ត្រ" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "មុខងារ" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "តួនាទី" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "អង្គភាព" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "នាយកដ្ឋាន" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "ចំណាំ" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "ឧបករណ៍​កំណត់​អត្តសញ្ញាណ​ផលិតផល" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "កាលបរិច្ឆេទ​ពិនិត្យ​ឡើង​វិញ" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "តម្រៀប​ខ្សែអក្សរ" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "គេហទំព័រ" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "ថ្នាក់​សុវត្ថិភាព" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "រូបសញ្ញា" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "រូបថត" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "សំឡេង" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "វេជ្ជបណ្ឌិត" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "កញ្ញា" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "លោក" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "អ្នក​ស្រី" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "អ្នកនាង" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "សាស្ត្រាចារ្យ" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "មិនស្គាល់​វាល" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "ទាំងអស់" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "ញឹកញាប់" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "អាសយដ្ឋាន" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "អ៊ីមែល" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "ផ្ទាល់ខ្លួន" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "ផ្ទាល់ខ្លួន" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "មិន​បាន​កំណត់" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "ផ្ទាល់ខ្លួន" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "ប្រភេទ​មិន​ស្គាល់" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "ផ្ទះ" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "ការងារ" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "កម្មវិធី​ផ្ញើ​សំបុត្រ" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "បាន​ពេញចិត្ត" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "សំឡេង" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "ទូរសារ" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "ចល័ត" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "វីដេអូ" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "ប្រអប់​សំបុត្រ" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "ម៉ូដឹម" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "រថយន្ត" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "ផ្សេងៗ" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "លេខ​ពេញ​ចិត្ត" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "ទូរសារ​កន្លែង​ធ្វើការ" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "សាធារណៈ" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "ឯកជន" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "សម្ងាត់" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "ប្រភេទ​មិន​ស្គាល់" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "ពេញចិត្ត" + +#~ msgid "List of Emails" +#~ msgstr "បញ្ជី​អ៊ីមែល" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "ខឹម សុខែម, អេង វណ្ណៈ, អោក ពិសិដ្ឋ​​" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "" +#~ "khoemsokhem@khmeros.info,​​evannak@khmeros.info,piseth_dv@khmeros.info" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "មិន​អាច​ផ្ទុក​ធនធាន '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "ជ្រើស​អ្នក​ទទួ›​សំបុត្រ" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "ឈ្មោះ" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "អ៊ីមែល" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "បាន​ជ្រើស" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "ដោះ​ជ្រើស" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "កំណត់​រចនាសម្ព័ន្ធ​បញ្ជី​ចែកចាយ" + +#~ msgid "Select Email Address" +#~ msgstr "ជ្រើស​អាសយដ្ឋាន​អ៊ីមែល" + +#~ msgid "Email Addresses" +#~ msgstr "អាសយដ្ឋាន​អ៊ីមែល" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "បាទ/ចាស" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "ទេ" + +#~ msgid "New List..." +#~ msgstr "បញ្ជី​ថ្មី..." + +#~ msgid "Rename List..." +#~ msgstr "ប្ដូរ​ឈ្មោះ​បញ្ជី..." + +#~ msgid "Remove List" +#~ msgstr "យក​បញ្ជី​ចេញ" + +#~ msgid "Available addresses:" +#~ msgstr "អាសយដ្ឋាន​ដែល​មាន ៖" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "អ៊ីមែល​ដែល​ចូល​ចិត្ត" + +#~ msgid "Add Entry" +#~ msgstr "បន្ថែម​ធាតុបញ្ចូល" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "អ៊ីមែល" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "ការប្រើ​ដែល​ចូលចិត្ត" + +#~ msgid "Change Email..." +#~ msgstr "ផ្លាស់ប្ដូរ​អ៊ីមែល..." + +#~ msgid "Remove Entry" +#~ msgstr "យក​ធាតុ​ចេញ" + +#~ msgid "New Distribution List" +#~ msgstr "បញ្ជី​ចែកចាយ​ថ្មី" + +#~ msgid "Please enter &name:" +#~ msgstr "សូម​បញ្ចូល​ឈ្មោះ ៖" + +#~ msgid "Distribution List" +#~ msgstr "បញ្ជី​ចែកចាយ" + +#~ msgid "Please change &name:" +#~ msgstr "សូម​ផ្លាស់ប្ដូរ​ឈ្មោះ ៖" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "លុប​បញ្ជី​ចែកចាយ '%1' ?" + +#~ msgid "Selected addressees:" +#~ msgstr "អ្នក​ទទួល​សំបុត្រ​ដែល​បាន​ជ្រើស ៖" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "អាសយដ្ឋាន​ដែល​បាន​ជ្រើស​ក្នុង '%1' ៖" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "ទេ" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "ទ្រង់ទ្រាយ vCard" + +#~ msgid "No description available." +#~ msgstr "មិន​មាន​​ការ​ពិពណ៌នា ។" + +#~ msgid "Unable to open lock file." +#~ msgstr "មិន​អាច​បើក​ឯកសារ​ជាប់​សោ ។" + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "ធនធាន '%1' ត្រូវ​បាន​ចាក់សោ​ដោយ​កម្មវិធី '%2' ។" + +#~ msgid "Error" +#~ msgstr "កំហុស" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "បាន​បរាជ័យ​ក្នុង​ការដោះសោ ។ ឯកសារ​ជាប់សោ​ជា​កម្មសិទ្ធិ​របស់​ដំណើរការ​ផ្សេង ៖ %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull ៖ ការ​ចាក់សោ​​​ទាំងអស់​ជោគជ័យ ប៉ុន្តែ​គ្មាន​ការចាក់សោ​ពិតប្រាកដ​ត្រូវ​បាន​ធ្វើនោះ​ទេ ។" + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull ៖ ការចាក់សោ​ទាំងអស់​បាន​បរាជ័យ ។" + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "បានបរាជ័យ​ក្នុង​កា​រផ្ទុក '%1' ។" + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "បាន​បរាជ័យ​ក្នុង​កា​ររក្សាទុក​ធនធាន '%1' ។" + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "មិនអាច​បើក​ធនធាន '%1' បាន​ទេ ។" + +#~ msgid "Default Address Book" +#~ msgstr "សៀវភៅ​អាសយដ្ឋាន​លំនាំដើម" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "មិន​អាច​រក្សាទុក​ទៅ​កាន់​ធនធាន '%1' ។ វា​ជាប់​សោ ។" diff --git a/po/ko/kcontacts5.po b/po/ko/kcontacts5.po new file mode 100644 index 0000000..216a76b --- /dev/null +++ b/po/ko/kcontacts5.po @@ -0,0 +1,739 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# Shinjo Park , 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 \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Lokalize 2.0\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "우편 사서함" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "확장 주소 정보" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "도로명" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "자치구" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "지역" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "우편 번호" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "국가" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "배달 정보" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "국내" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "국제" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "우편" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "소포" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "집" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "직장" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "선호 주소" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "기타" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "고유 식별자" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "이름" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "형식 있는 이름" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "성" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "성 제외 이름" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "추가 이름" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "ì¡´ì¹­ 접두사" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "ì¡´ì¹­ 접미사" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "별명" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "생일" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "집 주소 도로명" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "집 주소 사서함" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "집 주소 도시" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "집 주소 도/광역시" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "집 주소 우편 번호" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "집 주소 국가" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "집 주소 레이블" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "직장 주소 도로명" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "직장 주소 사서함" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "직장 주소 도시" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "직장 주소 도/광역시" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "직장 주소 우편 번호" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "직장 주소 국가" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "직장 주소 레이블" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "집 전화" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "직장 전화" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "휴대 전화" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "집 팩스" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "직장 팩스" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "카폰" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "호출기" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "이메일 주소" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "메일 클라이언트" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "시간대" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "지리적 위치" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "직위" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "직급" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "조직" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "부서" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "메모" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "제품 식별자" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "리비전 날짜" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "정렬 문자열" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "홈페이지" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "보안 등급" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "로고" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "사진" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "소리" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "박사" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "교수" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "1세" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "2세" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "3세" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "알 수 없는 필드" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "모두" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "자주" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "주소" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "이메일" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "개인" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "사용자 정의" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "정의되지 않음" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "사용자 정의" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "알 수 없는 형식" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "전화 번호" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "홈" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "직장" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "메신저" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "선호함" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "음성" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "팩스" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "휴대폰" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "동영상" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "사서함" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "모뎀" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "카폰" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "기타" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "선호하는 번호" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "직장 팩스" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "공공" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "개인" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "통제됨" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "알 수 없는 형식" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "선호함" + +#~ msgid "List of Emails" +#~ msgstr "이메일 목록" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Shinjo Park" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "kde@peremen.name" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "자원 '%1'을(를) 불러올 수 없음" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "주소 대상 선택" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "이름" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "이메일" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "선택됨" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "선택 해제" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "분배 목록 설정" + +#~ msgid "Select Email Address" +#~ msgstr "이메일 주소 선택" + +#~ msgid "Email Addresses" +#~ msgstr "이메일 주소" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "예" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "아니요" + +#~ msgid "New List..." +#~ msgstr "새 목록..." + +#~ msgid "Rename List..." +#~ msgstr "목록 이름 변경..." + +#~ msgid "Remove List" +#~ msgstr "목록 삭제" + +#~ msgid "Available addresses:" +#~ msgstr "사용 가능한 주소:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "선호하는 이메일" + +#~ msgid "Add Entry" +#~ msgstr "항목 추가" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "이메일" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "선호 사용" + +#~ msgid "Change Email..." +#~ msgstr "이메일 변경..." + +#~ msgid "Remove Entry" +#~ msgstr "항목 삭제" + +#~ msgid "New Distribution List" +#~ msgstr "새 분배 목록" + +#~ msgid "Please enter &name:" +#~ msgstr "이름 입력(&N):" + +#~ msgid "Distribution List" +#~ msgstr "분배 목록" + +#~ msgid "Please change &name:" +#~ msgstr "이름 변경(&N):" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "분배 목록 '%1'을(를) 삭제하시겠습니까?" + +#~ msgid "Selected addressees:" +#~ msgstr "주소 선택:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "'%1'의 주소 선택:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "아니요" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard 형식" + +#~ msgid "No description available." +#~ msgstr "설명 없음." + +#~ msgid "Unable to open lock file." +#~ msgstr "잠금 파일을 열 수 없습니다." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "자원 '%1'을(를) 프로그램 '%2'에서 잠갔습니다." + +#~ msgid "Error" +#~ msgstr "오류" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "잠금 실패. 다른 프로세스에서 잠금 파일을 소유하고 있습니다: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: 모든 잠금이 성공하였지만 실제로 잠기지 않았습니다." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: 모든 잠금이 실패하였습니다." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "자원 '%1'을(를) 불러올 수 없습니다." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "자원 '%1'을(를) 저장할 수 없습니다." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "자원 '%1'을(를) 열 수 없습니다." + +#~ msgid "Default Address Book" +#~ msgstr "기본 주소록" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "자원 '%1'을(를) 저장할 수 없습니다. 잠겼습니다." diff --git a/po/lt/kcontacts5.po b/po/lt/kcontacts5.po new file mode 100644 index 0000000..445d117 --- /dev/null +++ b/po/lt/kcontacts5.po @@ -0,0 +1,593 @@ +# translation of kabc.po to Lithuanian +# This file is distributed under the same license as the kabc package. +# Donatas Glodenis , 2007-2009. +# Tomas Straupis , 2011. +# Remigijus Jarmalavičius , 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 \n" +"Language-Team: Lithuanian \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n" +"%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n" +"X-Generator: Poedit 2.2.4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "PaÅ¡to dėžutė" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Papildoma adreso informacija" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Gatvė" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Vietovė" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Regionas" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "PaÅ¡to indeksas" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Å alis" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Pristatymo etiketė" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Å alies viduje" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Tarptautinis" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PaÅ¡to" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Siuntinys" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Namų" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Darbo" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Pageidautinas adresas" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Kita" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unikalus identifikatorius" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Vardas" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatuotas vardas" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Pavardė" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Vardas" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Kiti vardai" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Garbės prieÅ¡dėliai" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Garbės priesagos" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Slapyvardis" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Gimimo diena" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Namų adreso gatvė" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Namų adreso paÅ¡to dėžutė" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Namų adreso miestas" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Namų adreso valstija" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Namų adreso paÅ¡to kodas" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Namų adreso Å¡alis" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Namų adreso etiketė" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Darbo adreso gatvė" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Darbo adreso paÅ¡to dėžutė" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Darbo adreso miestas" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Darbo adreso valstija" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Darbo adreso paÅ¡to kodas" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Darbo adreso Å¡alis" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Darbo adreso etiketė" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Namų telefonas" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Verslo telefonas" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobilus telefonas" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Namų faksas" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Darbo faksas" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Automobilio telefonas" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "PraneÅ¡imų gaviklis" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "El. paÅ¡to adresas" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "PaÅ¡to klientas" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Laiko zona" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografinė vieta" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "AntraÅ¡tė" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Vaidmuo" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizacija" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Skyrius" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Pastaba" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produkto identifikatorius" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Keitimo data" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Rikiavimo eilutė" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Namų puslapis" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Saugumo klasė" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Nuotrauka" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Garsas" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Panelė" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Ponas" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Ponia" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "P." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jaun." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Vyr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Nežinomas laukas" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Visi" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Dažnus" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresas" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "El. paÅ¡tas" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Asmeninis" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Pasirinktas" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Neapibrėžtas" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Pasirinktas" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Nežinomas tipas" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefono numeris" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Namų" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Darbo" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Pranešėjas" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Pagrindinis" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Balsas" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faksas" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobilus" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "PaÅ¡to dėžutė" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modemas" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Automobilinis" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Kita" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Pageidautinas numeris" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Darbo faksas" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "VieÅ¡a" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Asmeninė" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidenciali" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Nežinomas tipas" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Pageidautinas" + +#~ msgid "List of Emails" +#~ msgstr "El. paÅ¡to sąraÅ¡as" diff --git a/po/lv/kcontacts5.po b/po/lv/kcontacts5.po new file mode 100644 index 0000000..290bf81 --- /dev/null +++ b/po/lv/kcontacts5.po @@ -0,0 +1,745 @@ +# translation of kabc.po to Latvian +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Viesturs Zarins , 2007, 2008, 2010. +# Maris Nartiss , 2008. +# Viesturs Zariņš , 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 \n" +"Language-Team: Latvian \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Pasta kastÄ«te" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "PaplaÅ¡ināta adreses informācija" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Iela" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Apvidus" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "ReÄ£ions" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Pasta indekss" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Valsts" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Piegādes uzlÄ«me" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "IekÅ¡zemes" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Starptautisks" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Pastam" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paciņām" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Mājas" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Darbs" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Vēlamā adrese" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Cita" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unikāls identifikators" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Vārds" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatēts vārds" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Uzvārds" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Vārds" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Papildus vārdi" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Goda prefiksi" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Goda sufiksi" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Iesauka" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "DzimÅ¡anas diena" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Mājas adreses iela" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Mājas adreses pasta nodaļas kastÄ«te" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Mājas adreses pilsēta" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Mājas adreses Å¡tats" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Mājas adreses pasta indekss" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Mājas adreses valsts" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Mājas adreses birka" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Darba adreses iela" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Darba adrese pasta nodaļas kastÄ«te" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Darba adreses pilsēta" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Darba adreses Å¡tats" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Darba adreses pasta indekss" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Darba adreses valsts" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Darba adreses birka" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Mājas tālrunis" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Darba tālrunis" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "MobÄ«lais tālrunis" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Mājas fakss" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Darba fakss" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Automašīnas tālrunis" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Peidžers" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-pasta adrese" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Pasta klients" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Laika zona" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Ä¢eogrāfiskais novietojums" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Amats" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Loma" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizācija" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departaments" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "PiezÄ«me" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produkta identifikators" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "RevÄ«zijas datums" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "KārtoÅ¡anas virkne" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Mājaslapa" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Drošības klase" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Skaņa" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Kungs" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Kundze" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Misiz" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jun." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sers" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Nezināms lauks" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Visi" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Biežs" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adrese" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-pasts" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "PersonÄ«gs" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Pielāgots" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nenodefinēts" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Pielāgota" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Nezināma tipa" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Mājas" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Darbs" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Ziņojumprogramma" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Vēlamais" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Balss" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fakss" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "MobÄ«lais" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "PastkastÄ«te" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modēms" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Mašīna" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Cits" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Vēlamais numurs" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fakss darbā" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publisks" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privāts" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidenciāls" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Nezināms tips" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Vēlamais" + +#~ msgid "List of Emails" +#~ msgstr "E-pastu saraksts" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Viesturs Zarins" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "viesturs.zarins@mi.lu.lv" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Neizdevās ielādēt resursu '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Izvēlieties adresātu" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Vārds" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-pasts" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Izvēlēts" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Noņemt izvēli" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Konfigurēt adresātu sarakstus" + +#~ msgid "Select Email Address" +#~ msgstr "Izvēlēties epasta adresi" + +#~ msgid "Email Addresses" +#~ msgstr "Epasta adreses" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Jā" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nē" + +#~ msgid "New List..." +#~ msgstr "Jauns saraksts..." + +#~ msgid "Rename List..." +#~ msgstr "Pārdēvēt sarakstu..." + +#~ msgid "Remove List" +#~ msgstr "Izmest sarakstu" + +#~ msgid "Available addresses:" +#~ msgstr "Pieejamās adreses:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Vēlamais e-pasts" + +#~ msgid "Add Entry" +#~ msgstr "Pievienot vienÄ«bu" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-pasts" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Izmantot vēlamo" + +#~ msgid "Change Email..." +#~ msgstr "MainÄ«t epastu..." + +#~ msgid "Remove Entry" +#~ msgstr "Izņemt ierakstu" + +#~ msgid "New Distribution List" +#~ msgstr "Jauns adresātu saraksts" + +#~ msgid "Please enter &name:" +#~ msgstr "LÅ«dzu ievadiet &nosaukumu:" + +#~ msgid "Distribution List" +#~ msgstr "Adresātu saraksts" + +#~ msgid "Please change &name:" +#~ msgstr "LÅ«dzu mainiet &nosaukumu:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Dzēst adresātu sarakstu '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Izvēlētās adreses:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Izvēlētās adreses no '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nē" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard formāts" + +#~ msgid "No description available." +#~ msgstr "Apraksts nav piejams." + +#~ msgid "Unable to open lock file." +#~ msgstr "Neizdevās atvērt slēgÅ¡anas failu." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Resursu '%1' jau ir slēgusi programma '%2'." + +#~ msgid "Error" +#~ msgstr "Kļūda" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "Neizdevās atslēgt. SlēgÅ¡anas fails pieder procesam: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Visas slēgÅ¡anas operācijas veiksmÄ«gas, bet reāli neviena " +#~ "slēgÅ¡ana nenotika." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Visas slēgÅ¡anas operācijas neveiksmÄ«gas." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Resursa '%1' ielāde neveiksmÄ«ga." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Resursa '%1' saglabāšana neveiksmÄ«ga." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Neizdevās atvērt resursu '%1'." + +#~ msgid "Default Address Book" +#~ msgstr "Noklusētā adreÅ¡u grāmata" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Neizdevās saglabāt '%1', Å¡is resurss ir slēgts." diff --git a/po/mai/kcontacts5.po b/po/mai/kcontacts5.po new file mode 100644 index 0000000..a2c50ce --- /dev/null +++ b/po/mai/kcontacts5.po @@ -0,0 +1,636 @@ +# translation of kabc.po to Maithili +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Rajesh Ranjan , 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 \n" +"Language-Team: Maithili \n" +"Language: mai\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "सड़क" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "नगर" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "क्षेत्र" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "पोस्टल कोड" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "देश" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "घरेलू" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "अंतर्राष्ट्रीय" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "पोस्टल" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "पार्सल" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "घर" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "कामकाज" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "आन" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "नाम" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "घरक नाम" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "देल नाम" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "जन्मदिन" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "फोन आवास" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "मोबाइल फोन" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "घरक फैक्स" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "पेजर" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "इमेल पता" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "डाकिया" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "समय क्षेत्र" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "भौगोलिक स्थिति" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "शीर्षक" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "भूमिका" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "संस्था" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "विभाग" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "नोट" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "मुख्य पृष्ठ" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "लोगो" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "चित्र" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "ध्वनि" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "सभ" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "पता" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "इमेल" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "व्यक्तिगत" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "पसंदीदा" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "अपरिभाषित" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "पीजीपी" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "पसंदीदा" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "अज्ञात प्रकार" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "घर" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "कामकाज" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "पसंदीदा" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "आवाज" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "फैक्स" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "मोबाइल" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "वीडियो" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "माडेम" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "कार" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "आन" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "कार्यालय फ़ैक्स" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "सार्वजनिक" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "निजी" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "गोपनीय" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "अज्ञात प्रकार" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "पसंदीदा" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "संगीता कुमारी" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "sangeeta09@gmail.com" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "नाम" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "इमेल" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "चयनित" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "विचयनित करू" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "हँ" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "नहि" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "इमेल" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "नहि" + +#~ msgid "No description available." +#~ msgstr "कोनो विवरण उपलब्ध नहि अछि." + +#~ msgid "Error" +#~ msgstr "त्रुटि" diff --git a/po/ml/kcontacts5.po b/po/ml/kcontacts5.po new file mode 100644 index 0000000..beacc3a --- /dev/null +++ b/po/ml/kcontacts5.po @@ -0,0 +1,585 @@ +# Malayalam translations for kcontacts package. +# Copyright (C) 2019 This file is copyright: +# This file is distributed under the same license as the kcontacts package. +# Automatically generated, 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: kcontacts\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2019-06-19 03:19+0200\n" +"Last-Translator: Automatically generated\n" +"Language-Team: Swathanthra|സ്വതന്ത്ര Malayalam|മലയാളം Computing|കമ്പ്യൂട്ടിങ്ങ് \n" +"Language: ml\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "" diff --git a/po/mr/kcontacts5.po b/po/mr/kcontacts5.po new file mode 100644 index 0000000..5c1dfd1 --- /dev/null +++ b/po/mr/kcontacts5.po @@ -0,0 +1,642 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Chetan Khona , 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 \n" +"Language-Team: Marathi \n" +"Language: mr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Generator: Lokalize 1.5\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "विभाग" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "देश" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "" + +#: address.cpp:361 +#, fuzzy, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "मुख्य" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "इतर" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "नाव" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "वाढदिवस" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, fuzzy, kde-format +msgid "Home Phone" +msgstr "घरचा फोन (&M):" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "पेजर" + +#: addressee.cpp:978 +#, fuzzy, kde-format +msgid "Email Address" +msgstr "इमेल पत्ता :" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "मेल ग्राहक" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "वेळ क्षेत्र" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "शिर्षक" + +#: addressee.cpp:1140 +#, fuzzy, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "भूमीका :" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "संस्था" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "नोंद" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "मुख्यपान" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, fuzzy, kde-format +msgid "Logo" +msgstr "प्रतिकचिन्ह (&L):" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "ध्वनी" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Mr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mrs." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "सर्व" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "पत्ता" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "इमेल" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "खाजगी" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "ऐच्छिक" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "व्याख्यारहित" + +#: key.cpp:198 +#, fuzzy, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "x" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "ऐच्छिक" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, fuzzy, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "मुख्य" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "पसंतीचे" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "" + +#: phonenumber.cpp:184 +#, fuzzy, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "मोबाईल" + +#: phonenumber.cpp:186 +#, fuzzy, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "दृश्य" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "मोडेम" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "इतर" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "सार्वजनिक" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "वैयक्तिक" + +#: secrecy.cpp:104 +#, fuzzy, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "गुप्त" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "पसंतीचे" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "चेतन खोना" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "chetan@kompkin.com" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "नाव" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "इमेल" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "निवडलेले" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "निवड काढून टाका" + +#, fuzzy +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "हो" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "नाही" + +#~ msgid "Add Entry" +#~ msgstr "नोंद जोडा" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "इमेल" + +#~ msgid "Remove Entry" +#~ msgstr "नोंद काढून टाका" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "नाही" + +#, fuzzy +#~ msgid "No description available." +#~ msgstr "वर्णन उपलब्ध नाही." + +#~ msgid "Error" +#~ msgstr "त्रुटी" diff --git a/po/nb/kcontacts5.po b/po/nb/kcontacts5.po new file mode 100644 index 0000000..2579776 --- /dev/null +++ b/po/nb/kcontacts5.po @@ -0,0 +1,587 @@ +# Translation of kcontacts5 to Norwegian BokmÃ¥l +# +# Nils Kristian Tomren , 2007. +# Bjørn Steensrud , 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 \n" +"Language-Team: Norwegian BokmÃ¥l \n" +"Language: nb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Environment: kde\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postboks" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Utvidet adresseinformasjon" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Gate" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Sted" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "OmrÃ¥de" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postnummer" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Leveringsetikett" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Innenlands" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internasjonalt" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Post" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Pakke" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Hjem" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Arbeid" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Foretrukket adresse" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Andre" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Entydig identifikasjon" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Navn" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formattert navn" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Etternavn" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Fornavn" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Flere navn" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Høflige prefikser" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Høflige suffikser" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Kallenavn" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Fødselsdag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Hjemmeadresse,gate" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Hjemmeadresse, postboks" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Hjemmeadresse, by" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Hjemmeadresse, stat" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Hjemmeadresse, postnummer" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Hjemmeadresse, land" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Hjemmeadresse, merkelapp" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Firmaadresse, gate" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Firmaadresse, postboks" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Firmaadresse, by" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Firmaadresse, stat" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Firmaadresse, postnummer" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Firmaadresse, land" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Firmaadresse, merkelapp" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Hjemmetelefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon arbeid" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiltelefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Hjemmefaks" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Faks arbeid" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefon i bil" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Personsøker" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-postadresse" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-postklient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Tidssone" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografisk plassering" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Tittel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rolle" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisasjon" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Avdeling" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Merknad" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produkt-identifikator" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Revidert dato" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorteringsstreng" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Hjemmeside" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Sikkerhetsklasse" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Lyd" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Frøken" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Herr" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Fru" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Fr." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Ukjent felt" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Alle" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Ofte" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresse" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-post" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Privat" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Tilpasset" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Udefinert" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Tilpasset" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Ukjent type" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Hjem" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Arbeid" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Meldingstjeneste" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Foretrukket" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Stemme" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postkasse" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Bil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Andre" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Foretrukket nummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Arbeidsfaks" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Offentlig" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidensiell" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Ukjent type" diff --git a/po/nds/kcontacts5.po b/po/nds/kcontacts5.po new file mode 100644 index 0000000..ad138f1 --- /dev/null +++ b/po/nds/kcontacts5.po @@ -0,0 +1,594 @@ +# Translation of kabc.po to Low Saxon +# translation of kabc.po to Low Saxon +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# Sönke Dibbern , 2007, 2008. +# Manfred Wiese , 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 \n" +"Language-Team: Low Saxon \n" +"Language: nds\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postfach" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Verwiedert Adressinformatschonen" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Straat" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Oort" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Regioon" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postleddtall" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Leveropbacker" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Binnenlannsch" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Butenlannsch" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postadress" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paketadress" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Tohuus" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Arbeit" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Vörtrocken Adress" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Annerswat" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Eenkennig Beteker" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Naam" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formateert Naam" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Familiennaam" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Vörnaam" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Naams bito" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Höflichkeits-Prefixen" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Höflichkeits-Suffixen" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Ökelnaam" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Geboortsdag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Straat (Tohuus)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Postfach (Tohuus)" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Stadt (Tohuus)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Bunnsland (Tohuus)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Postleddtall (Tohuus)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Land (Tohuus)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Adressopbacker (Tohuus)" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Straat (Arbeit)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Postfach (Arbeit)" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Stadt (Arbeit)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Land (Arbeit)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Postleddtall (Arbeit)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Land (Arbeit)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Adressopbacker (Arbeit)" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefoon (Tohuus)" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefoon (Arbeit)" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiltelefoon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax (Tohuus)" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax (Arbeit)" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Autotelefoon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Nettpostadress" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Nettpostprogramm" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Tietrebeet" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geograafsch Steed" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rull" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisatschoon" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Afdelen" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Notiz" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produktbeteker" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Revischoondatum" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorteer-Tekenkeed" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Tohuussiet" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Sekerheitklass" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Klang" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Fru" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Herr" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Fru" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Fru" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Perf." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jun." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sen." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Nich begäng Feld" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "All" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Faken" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adress" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Nettpost" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Persöönlich" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Anner" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nich fastleggt" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Anner" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Typ nich begäng" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Tohuus" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Arbeit" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Kortnarichten" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Vörtrocken" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Stimm" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobiltelefoon" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Antermaschien" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Auto" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Annerswat" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Vörtrocken Nummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax (Arbeit)" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Apen" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privaat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Vertrolich" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Typ nich begäng" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Vörtrocken" + +#~ msgid "List of Emails" +#~ msgstr "Nettbreven-List" diff --git a/po/nl/kcontacts5.po b/po/nl/kcontacts5.po new file mode 100644 index 0000000..19eab59 --- /dev/null +++ b/po/nl/kcontacts5.po @@ -0,0 +1,748 @@ +# translation of kabc.po to Nederlands +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Bram Schoenmakers , 2007. +# Antoon Tolboom , 2008. +# Kristof Bal , 2009. +# Freek de Kruijf , 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 \n" +"Language-Team: \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 22.04.2\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postbus" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Uitgebreide adresinformatie" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Straat" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Plaats" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Regio" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postcode" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Bezorglabel" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Binnenlands" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internationaal" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postadres" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Perceel" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Thuis" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Werk" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Voorkeuradres" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Overige" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unieke identifier" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Naam" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Opgemaakte naam" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Achternaam" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Voornaam" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Extra namen" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Titel voorvoegsel" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Titel-achtervoegsels" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Bijnaam" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Verjaardag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Straat privé" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Postbus van huisadres" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Plaats privé" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Provincie privé" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Postcode privé" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Land privé" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Label privé" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Straat zakelijk" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Postbus van zakelijke adres" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Plaats zakelijk" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Provincie zakelijk" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Postcode zakelijk" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Land zakelijk" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Label zakelijk" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefoon privé" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefoon zakelijk" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiele telefoon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax privé" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax zakelijk" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Autotelefoon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Semafoon" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-mailadres" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-mailprogramma" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Tijdzone" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografische positie" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Functie" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisatie" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Afdeling" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Notitie" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Product-identifier" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Revisiedatum" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorteertekst" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Webpagina" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Beveiligingsklasse" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Geluid" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Mej." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Men." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mevr." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Mevr." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Onbekend veld" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Alles" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Vaak" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adres" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mailadres" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Persoonlijk" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Aangepast" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Ongedefinieerd" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Aangepast" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Onbekend type" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefoonnummer" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Thuis" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Werk" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Voorkeur" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Stem" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobiel" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postbus" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Auto" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Overige" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Voorkeurnummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax zakelijk" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publiek" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privé" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Vertrouwelijk" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Onbekend type" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Voorkeur" + +#~ msgid "List of Emails" +#~ msgstr "Lijst met e-mailberichten" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Bram Schoenmakers,Antoon Tolboom" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "bramschoenmakers@kde.nl,atolboo@casema.nl" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "De hulpbron '%1' kon niet worden geladen" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Geadresseerde selecteren" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Naam" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Geselecteerd" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Deselecteren" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Distributielijsten instellen" + +#~ msgid "Select Email Address" +#~ msgstr "E-mailadressen selecteren" + +#~ msgid "Email Addresses" +#~ msgstr "E-mailadressen" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nee" + +#~ msgid "New List..." +#~ msgstr "Nieuwe lijst..." + +#~ msgid "Rename List..." +#~ msgstr "Lijst hernoemen..." + +#~ msgid "Remove List" +#~ msgstr "Lijst verwijderen" + +#~ msgid "Available addresses:" +#~ msgstr "Beschikbare adressen:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Voorkeur e-mail" + +#~ msgid "Add Entry" +#~ msgstr "Item toevoegen" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-mail" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Voorkeur gebruiken" + +#~ msgid "Change Email..." +#~ msgstr "E-mail wijzigen..." + +#~ msgid "Remove Entry" +#~ msgstr "Ingang verwijderen" + +#~ msgid "New Distribution List" +#~ msgstr "Nieuwe distributielijst" + +#~ msgid "Please enter &name:" +#~ msgstr "Voer een &naam in:" + +#~ msgid "Distribution List" +#~ msgstr "Distributielijst" + +#~ msgid "Please change &name:" +#~ msgstr "Wijzig de &naam:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Distributielijst '%1' verwijderen?" + +#~ msgid "Selected addressees:" +#~ msgstr "Geselecteerde adressen:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Geselecteerde adressen in '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nee" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard-opmaak" + +#~ msgid "No description available." +#~ msgstr "Geen beschrijving beschikbaar." + +#~ msgid "Unable to open lock file." +#~ msgstr "Lock-bestand kon niet worden geopend." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "De hulpbron '%1' is vergrendeld door toepassing '%2'." + +#~ msgid "Error" +#~ msgstr "Fout" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Het ontgrendelen is niet gelukt. Het Lock-bestand is eigendom van een " +#~ "ander proces: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Alle vergrendelingen zijn gelukt, maar vonden niet werkelijk " +#~ "plaats." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Alle vergrendelingen mislukken." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Laden van hulpbron '%1' is mislukt." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Het opslaan van hulpbron '%1' is mislukt." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "De hulpbron '%1' kon niet worden geopend." + +#~ msgid "Default Address Book" +#~ msgstr "Standaard adresboek" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "" +#~ "Er kon niet worden opgeslagen naar hulpbron '%1'. Deze is vergrendeld." diff --git a/po/nn/kcontacts5.po b/po/nn/kcontacts5.po new file mode 100644 index 0000000..2044866 --- /dev/null +++ b/po/nn/kcontacts5.po @@ -0,0 +1,587 @@ +# Translation of kcontacts5 to Norwegian Nynorsk +# +# Eirik U. Birkeland , 2008, 2009. +# Karl Ove Hufthammer , 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 \n" +"Language-Team: Norwegian Nynorsk \n" +"Language: nn\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 19.04.3\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Environment: kde\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postboks" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Utvida adresseinformasjon" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Adresse" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Stad" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "OmrÃ¥de" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postnummer" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Leveringsetikett" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Lokal" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internasjonal" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Post" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Pakke" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Heime" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Arbeid" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Føretrekt adresse" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Anna" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unik identifikator" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Namn" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formatert namn" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Etternamn" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Fornamn" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Andre namn" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Titlar før namnet" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Titlar etter namnet" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Kallenamn" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Fødselsdag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Adresse, heime" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Postboks, heime" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Poststad, heime" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Delstat/region, heime" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Postnummer, heime" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Land, heime" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Merkelapp, heime" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Adresse, firma" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Postboks, firma" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Poststad, firma" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Delstat/region, firma" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Postnummer, firma" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Land, firma" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Merkelapp, firma" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Heimetelefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Jobbtelefon" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiltelefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Heimefaks" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Firmafaks" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Biltelefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Personsøkjar" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-postadresse" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-postklient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Tidssone" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografisk plassering" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Tittel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rolle" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisasjon" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Avdeling" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Notat" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produktidentifikasjon" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Revisjonsdato" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorter streng" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Heimeside" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Tryggleiksklasse" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Lyd" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Frøken" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Herr" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Fru" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Fr." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Ukjent felt" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Alle" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Vanleg" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresse" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-post" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personleg" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Tilpassa" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Udefinert" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Tilpassa" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Ukjend type" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonnummer" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Heime" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Arbeid" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Meldingsteneste" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Føretrekt" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Stemme" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Postkasse" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Bil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Anna" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Føretrekt nummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Faks, arbeid" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Offentleg" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidensiell" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Ukjend type" diff --git a/po/pa/kcontacts5.po b/po/pa/kcontacts5.po new file mode 100644 index 0000000..a35d4d0 --- /dev/null +++ b/po/pa/kcontacts5.po @@ -0,0 +1,741 @@ +# translation of kabc.po to Punjabi +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# AP S Alam , 2007. +# A S Alam , 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 \n" +"Language-Team: ਪੰਜਾਬੀ \n" +"Language: pa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "ਪੋਸਟ ਆਫਿਸ ਬਾਕਸ" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "ਹੋਰ ਸਿਰਨਾਵਾਂ ਜਾਣਕਾਰੀ" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "ਗਲੀ" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "ਟਿਕਾਣਾ" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "ਖੇਤਰ" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "ਪੋਸਟ ਕੋਡ" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "ਦੇਸ਼" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "ਪਚਾਉਣਯੋਗ ਲੇਬਲ" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "ਘਰੇਲੂ" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "ਅੰਤਰਰਾਸ਼ਟਰੀ" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "ਪੋਸਟ" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "ਪਾਰਸਲ" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "ਘਰ" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "ਕੰਮ" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "ਪਸੰਦੀਦਾ ਸਿਰਨਾਵਾਂ" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "ਹੋਰ" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "ਵਿਲੱਖਣ ਪਛਾਣਕਰਤਾ" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "ਨਾਂ" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "ਫਾਰਮੈਟ ਕੀਤਾ ਨਾਂ" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "ਪਰਵਾਰਿਕ ਨਾਂ" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "ਦਿੱਤਾ ਨਾਂ" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "ਹੋਰ ਨਾਂ" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "ਛੋਟਾ ਨਾਂ" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "ਜਨਮਦਿਨ" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "ਘਰ ਐਡਰੈੱਸ ਗਲੀ" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "ਘਰ ਐਡਰੈੱਸ ਪੋਸਟ ਆਫਿਸ ਬਾਕਸ" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "ਘਰ ਐਡਰੈੱਸ ਸ਼ਹਿਰ" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "ਘਰ ਐਡਰੈੱਸ ਸੂਬਾ" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "ਘਰ ਐਡਰੈੱਸ ਜ਼ਿਪਕੋਡ" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "ਘਰ ਐਡਰੈੱਸ ਦੇਸ਼" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "ਘਰ ਐਡਰੈੱਸ ਲੇਬਲ" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਗਲੀ" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਪੋਸਟ ਆਫਿਸ ਬਾਕਸ" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਸ਼ਹਿਰ" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਸੂਬਾ" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਜ਼ਿੱਪਕੋਡ" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਦੇਸ਼" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "ਵਪਾਰਕ ਐਡਰੈਸ ਲੇਬਲ" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "ਘਰ ਫੋਨ" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "ਵਪਾਰਕ ਫੋਨ" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "ਮੋਬਾਇਲ ਫੋਨ" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "ਫੈਕਸ ਘਰ" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "ਵਪਾਰਕ ਫੈਕਸ" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "ਕਾਰ ਫੋਨ" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "ਪੇਜ਼ਰ" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "ਈਮੇਲ ਐਡਰੈਸ" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "ਮੇਲ ਕਲਾਇਟ" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "ਟਾਈਮ ਜ਼ੋਨ" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "ਭੂਗੋਲਿਕ ਸਥਿਤੀ" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "ਟਾਈਟਲ" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "ਰੋਲ" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "ਸੰਗਠਨ" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "ਵਿਭਾਗ" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "ਨੋਟ" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "ਪਰੋਡੱਕਟ ਪਛਾਣਕਰਤਾ" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "ਰੀਵਿਜ਼ਨ ਮਿਤੀ" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "ਲੜੀਬੱਧ ਲਾਈਨ" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "ਮੁੱਖ ਪੇਜ਼" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "ਸੁਰੱਖਿਆ ਕਲਾਸ" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "ਲੋਗੋ" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "ਫੋਟੋ" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "ਸਾਊਂਡ" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "ਡਾ." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "ਕੁਮਾਰੀ" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "ਸ੍ਰੀਮਾਨ" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "ਸ੍ਰੀਮਤੀ" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "ਸ੍ਰੀਮਤੀ" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "ਪ੍ਰੋ:" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "ਜੂਨੀ" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "ਸੀਨੀ" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "ਅਣਜਾਣ ਖੇਤਰ" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "ਸਭ" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "ਅਕਸਰ" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "ਐਡਰੈੱਸ" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "ਈਮੇਲ" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "ਨਿੱਜੀ" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "ਕਸਟਮ" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "ਅਣ-ਪਰਭਾਸ਼ਿਤ" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "ਕਸਟਮ" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "ਅਣਜਾਣ ਕਿਸਮ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "ਘਰ" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "ਕੰਮ" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "ਮੈਸੰਜਰ" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "ਪਸੰਦੀਦਾ" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "ਅਵਾਜ਼" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "ਫੈਕਸ" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "ਮੋਬਾਇਲ" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "ਵੀਡਿਓ" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "ਪੱਤਰ-ਬਕਸਾ" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "ਮਾਡਮ" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "ਕਾਰ" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "ਹੋਰ" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "ਪਸੰਦੀਦਾ ਨੰਬਰ" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "ਫੈਕਸ ਕੰਮ" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "ਪਬਲਿਕ" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "ਪ੍ਰਾਈਵੇਟ" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "ਗੁਪਤ" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "ਅਣਜਾਣ ਕਿਸਮ" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "ਪਸੰਦੀਦਾ" + +#~ msgid "List of Emails" +#~ msgstr "ਈਮੇਲਾਂ ਦੀ ਲਿਸਟ" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "aalam@users.sf.net" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "ਸਰੋਤ '%1' ਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "ਐਡਰੈੱਸ ਚੁਣੋ" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "ਨਾਂ" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "ਈਮੇਲ" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "ਚੁਣੇ" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "ਅਣ-ਚੁਣੇ" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "ਵੰਡ ਲਿਸਟ ਸੰਰਚਨਾ" + +#~ msgid "Select Email Address" +#~ msgstr "ਈਮੇਲ ਸਿਰਨਾਵਾਂ ਚੁਣੋ" + +#~ msgid "Email Addresses" +#~ msgstr "ਈਮੇਲ ਸਿਰਨਾਵਾਂ" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "ਹਾਂ" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "ਨਹੀਂ" + +#~ msgid "New List..." +#~ msgstr "ਨਵੀਂ ਲਿਸਟ..." + +#~ msgid "Rename List..." +#~ msgstr "ਲਿਸਟ ਨਾਂ ਬਦਲੋ" + +#~ msgid "Remove List" +#~ msgstr "ਲਿਸਟ ਹਟਾਓ" + +#~ msgid "Available addresses:" +#~ msgstr "ਉਪਲੱਬਧ ਸਿਰਨਾਵੀਂ:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "ਪਸੰਦੀਦਾ ਈ-ਮੇਲ" + +#~ msgid "Add Entry" +#~ msgstr "ਇੰਦਰਾਜ਼ ਸ਼ਾਮਲ" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "ਈਮੇਲ" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "ਪਸੰਦੀਦਾ ਵਰਤੋਂ" + +#~ msgid "Change Email..." +#~ msgstr "ਈਮੇਲ ਬਦਲੋ" + +#~ msgid "Remove Entry" +#~ msgstr "ਇੰਦਰਾਜ਼ ਹਟਾਓ" + +#~ msgid "New Distribution List" +#~ msgstr "ਨਵੀਂ ਵੰਡ ਲਿਸਟ" + +#~ msgid "Please enter &name:" +#~ msgstr "ਨਾਂ ਦਿਓ ਜੀ(&n):" + +#~ msgid "Distribution List" +#~ msgstr "ਵੰਡ ਲਿਸਟ" + +#~ msgid "Please change &name:" +#~ msgstr "ਆਪਣਾ ਨਾਂ ਬਦਲੋ ਜੀ(&n):" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "ਕੀ ਵੰਡ ਲਿਸਟ '%1' ਹਟਾਉਣੀ ਹੈ?" + +#~ msgid "Selected addressees:" +#~ msgstr "ਚੁਣੇ ਸਿਰਨਾਵੀਂ:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "'%1' ਵਿੱਚ ਚੁਣੇ ਐਡਰੈੱਸ:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "ਨਹੀਂ" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard ਫਾਰਮੈਟ" + +#~ msgid "No description available." +#~ msgstr "ਕੋਈ ਵੇਰਵਾ ਨਹੀਂ ਹੈ।" + +#~ msgid "Unable to open lock file." +#~ msgstr "ਲਾਕ ਫਾਇਲ ਖੋਲ੍ਹਣ ਤੋਂ ਅਸਮਰੱਥ ਹੈ।" + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "ਕਾਰਜ '%2' ਨੇ ਸਰੋਤ '%1' ਤੇ ਲਾਕ ਲਗਾਇਆ ਹੈ।" + +#~ msgid "Error" +#~ msgstr "ਗਲਤੀ" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "ਅਣ-ਲਾਕ ਅਸਫਲ, ਲਾਕ ਫਾਇਲ਼ ਹੋਰ ਕਾਰਜ ਨੇ ਸੰਭਾਲ ਹੈ: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: ਸਾਰੇ ਲਾਕ ਸਫਲ ਰਹੇ ਹਨ, ਪਰ ਅਸਲ ਵਿੱਚ ਅਸਲੀ ਲਾਕਿੰਗ ਅਸਫਲ ਹੈ।" + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: ਸਾਰੇ ਲਾਕ ਅਸਫਲ।" + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "ਸਰੋਤ '%1' ਲੋਡ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ।" + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "ਸਰੋਤ '%1' ਸੰਭਾਲਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।" + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "ਸਰੋਤ '%1' ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ" + +#~ msgid "Default Address Book" +#~ msgstr "ਡਿਫਾਲਟ ਐਡਰੈਸ ਬੁੱਕ" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "ਸਰੋਤ '%1' ਸੰਭਾਲਣ ਲਈ ਅਸਮਰੱਥ। ਇਹ ਲਾਕ ਹੈ।" diff --git a/po/pl/kcontacts5.po b/po/pl/kcontacts5.po new file mode 100644 index 0000000..333c745 --- /dev/null +++ b/po/pl/kcontacts5.po @@ -0,0 +1,592 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Łukasz Wojniłowicz , 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 \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 2.0\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Skrytka pocztowa" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Rozszerzone informacje adresowe" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Ulica" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Miejscowość" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Region" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Kod pocztowy" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Kraj" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etykieta dostarczania" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Krajowy" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Międzynarodowy" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Poczta" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Parcela" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Dom" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Praca" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Domyślny adres" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Inny" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Niepowtarzalny identyfikator" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nazwa" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Sformatowana nazwa" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Nazwisko" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Imię" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Dodatkowe imiona" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Tytuły (przedrostki)" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Tytuły (przyrostki)" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Pseudonim" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Urodziny" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Adres (ulica)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Skrytka pocztowa adresu domowego" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Adres (miasto)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Adres (województwo, prowincja, stan)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Adres (kod pocztowy)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Adres (kraj)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etykieta adresowa" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Adres do pracy (ulica)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Skrytka pocztowa adresu w pracy" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Adres do pracy (miasto)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Adres do pracy (województwo, prowincja, stan)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Adres do pracy (kod pocztowy)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Adres do pracy (kraj)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Etykieta adresowa do pracy" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefon domowy" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon do pracy" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telefon komórkowy" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Domowy fax" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax w pracy" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefon w samochodzie" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adres e-mail" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Program pocztowy" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Strefa czasowa" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Położenie geograficzne" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Tytuł" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rola" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizacja" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Dział" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Notatka" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identyfikator produktu" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data wydania" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Ciąg sortujący" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Strona domowa" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Klasa bezpieczeństwa" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Zdjęcie" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Dźwięk" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Panna" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Pan" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Pani" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Pani" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Junior" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Senior" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Nieznany rodzaj pola" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Wszystkie" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Częsty" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adres" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Osobiste" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Własny" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nieokreślony" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Własny" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Nieznany rodzaj" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Numer telefonu" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Dom" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Praca" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Komunikator" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferowane" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Głosowy" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Telefon komórkowy" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Wideo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Skrzynka pocztowa" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Samochód" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Inny" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Numer preferowany" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Faks w pracy" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publiczny" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Prywatny" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Poufny" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Nieznany rodzaj" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferowany" + +#~ msgid "List of Emails" +#~ msgstr "Lista adresów e-mail" diff --git a/po/pt/kcontacts5.po b/po/pt/kcontacts5.po new file mode 100644 index 0000000..f4fda65 --- /dev/null +++ b/po/pt/kcontacts5.po @@ -0,0 +1,585 @@ +msgid "" +msgstr "" +"Project-Id-Version: kabc\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2015-12-25 12:52+0000\n" +"Last-Translator: José Nuno Coelho Pires \n" +"Language-Team: pt \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-POFile-SpellExtra: Mails Pager LockNull Jr PCS Srt\n" +"X-POFile-IgnoreConsistency: Name\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Caixa de Correio" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informação Estendida do Endereço" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Rua" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localidade" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Região" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Código Postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "País" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Legenda de Entrega" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Doméstico" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Parcela" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Residência" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Emprego" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Endereço Preferido" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Outro" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificador Único" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nome" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nome Formatado" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Apelido" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Nome Próprio" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nomes Adicionais" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixos Honoríficos" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufixos Honoríficos" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Alcunha" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Data de Nascimento" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Endereço da Residência" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Caixa de Correio da Residência" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Cidade do Endereço da Residência" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Província do Endereço da Residência" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Código Postal do Endereço da Residência" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "País do Endereço da Residência" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Legenda do Endereço da Residência" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Rua do Endereço de Trabalho" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Caixa de Correio do Endereço de Trabalho" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Cidade do Endereço de Trabalho" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Província do Endereço de Trabalho" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Código Postal do Endereço de Trabalho" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "País do Endereço de Trabalho" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Legenda do Endereço de Trabalho" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefone da Residência" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefone do Trabalho" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telemóvel" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax de Casa" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax do Trabalho" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefone do Carro" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "RDIS" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "'Pager'" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Endereço de E-mail" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Cliente de E-mail" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Fuso-Horário" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posição Geográfica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Título" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Papel" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organização" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departamento" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Nota" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificador do Produto" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data de Revisão" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Texto de Ordenação" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Página Web" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe de Segurança" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logótipo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotografia" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Som" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Menina" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Srª." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Srtª." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Campo Desconhecido" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Tudo" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frequente" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Endereço" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Pessoal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalizado" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Indefinido" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalizada" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Número de telefone" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Residência" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Emprego" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mensageiro" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferido" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voz" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Telemóvel" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vídeo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Caixa de Correio" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "vCard" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Outro" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Número Preferido" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax do Emprego" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Público" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privado" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidencial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferido" diff --git a/po/pt_BR/kcontacts5.po b/po/pt_BR/kcontacts5.po new file mode 100644 index 0000000..55d7928 --- /dev/null +++ b/po/pt_BR/kcontacts5.po @@ -0,0 +1,591 @@ +# Translation of kcontacts5.po to Brazilian Portuguese +# Copyright (C) 2014-2015 This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# André Marcelo Alvarenga , 2014, 2015. +# Luiz Fernando Ranghetti , 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 \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Lokalize 20.04.2\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Caixa postal" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informação estendida do endereço" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Rua" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localidade" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Região" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "CEP" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "País" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etiqueta de entrega" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Nacional" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internacional" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Encomenda" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Residencial" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Comercial" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Endereço preferido" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Outro" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificador único" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nome" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nome formatado" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Sobrenome" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Primeiro nome" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nomes adicionais" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixos honoríficos" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufixos honoríficos" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Nome de exibição" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Aniversário" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Endereço residencial" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Caixa de correio do endereço residencial" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Cidade do endereço residencial" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Estado do endereço residencial" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "CEP do endereço residencial" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "País do endereço residencial" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Legenda do endereço residencial" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Endereço comercial" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Caixa de correio do endereço comercial" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Cidade do endereço comercial" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Estado do endereço comercial" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "CEP do endereço comercial" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "País do endereço comercial" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Legenda do endereço comercial" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefone residencial" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefone comercial" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Celular" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax residencial" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax comercial" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefone do carro" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +# Dispositivo eletrônico "Bip". (Alvarenga) +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Endereço de e-mail" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Cliente de e-mail" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Fuso horário" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Posição geográfica" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Título" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Função" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Empresa" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departamento" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Observação" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificador do produto" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data de revisão" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "String de ordenação" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Site" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Classe de segurança" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotipo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Som" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr(a)." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Srta." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Sr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Srª." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Srª." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof(a)." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Campo desconhecido" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Todos" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frequente" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Endereço" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Pessoal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalizado" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Não definido" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalizada" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Número do telefone" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Residencial" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Comercial" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mensageiro" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferido" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voz" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Celular" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Vídeo" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Caixa de e-mail" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Carro" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Outro" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Número preferido" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax comercial" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Público" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privado" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidencial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferido" diff --git a/po/ro/kcontacts5.po b/po/ro/kcontacts5.po new file mode 100644 index 0000000..33a4b41 --- /dev/null +++ b/po/ro/kcontacts5.po @@ -0,0 +1,744 @@ +# translation of kabc to Romanian +# Copyright (C) 2008 This_file_is_part_of_KDE +# This file is distributed under the same license as the kabc package. +# LaurenÅ£iu Buzdugan , 2008". +# Sergiu Bivol , 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 \n" +"Language-Team: Romanian\n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Lokalize 19.12.3\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Căsuță poștală" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informații adresă extinse" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Strada" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Localitate" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Regiune" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Cod poștal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Țară" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Etichetă livrare" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domiciliu" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internațională" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Poștală" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Colet" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Acasă" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Serviciu" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Adresa preferată" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Alta" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identificator unic" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Nume" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Nume formatat" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Nume de familie" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Prenume" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Nume suplimentare" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefixe onorifice" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Sufixe onorifice" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Poreclă" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Zi de naștere" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Strada adresei de acasă" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Căsuța poștală a adresei de acasă" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Orașul adresei de acasă" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Statul adresei de acasă" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Cod poștal al adresei de acasă" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Țara adresei de acasă" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Eticheta adresei de acasă" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Strada adresei de afaceri" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Căsuța poștală a adresei de afaceri" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Orașul adresei de afaceri" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Statul adresei de afaceri" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Cod poștal al adresei de afaceri" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Țara adresei de afaceri" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Eticheta adresei de afaceri" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefon la domiciliu" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon de afaceri" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telefon mobil" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax acasă" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax de afaceri" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefon în mașină" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adresă de e-mail" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Program de poștă electronică" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Fus orar" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Poziție geografică" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titlu" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Rol" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizație" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departament" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Notă" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identificator produs" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Dată revizie" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sortează șirul" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Pagină WEB" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Clasă de securitate" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotografie" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Sunet" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Domnișoara" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Dl." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "D-na." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "D-șoara." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Câmp necunoscut" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Toate" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Frecvent" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresă" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Email" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personal" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Personalizat" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nedefinit" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Personalizat" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Tip necunoscut" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Număr de telefon" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Acasă" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Serviciu" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Mesager" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Preferat" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Voce" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Cutie poștală" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Mașină" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Alta" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Număr preferat" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax serviciu" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Public" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Confidențial" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Tip necunoscut" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferată" + +#~ msgid "List of Emails" +#~ msgstr "Lista adreselor" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Sergiu Bivol" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "sergiu@ase.md" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Imposibil de încărcat resursa „%1”" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Alege destinatar" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Nume" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Selectat" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Deselectează" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Configurează liste de disctribuție" + +#~ msgid "Select Email Address" +#~ msgstr "Alege adresa de email" + +#~ msgid "Email Addresses" +#~ msgstr "Adrese e-mail" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Da" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nu" + +#~ msgid "New List..." +#~ msgstr "Listă nouă..." + +#~ msgid "Rename List..." +#~ msgstr "Redenumire listă..." + +#~ msgid "Remove List" +#~ msgstr "Elimină lista" + +#~ msgid "Available addresses:" +#~ msgstr "Adrese disponibile:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Email preferat" + +#~ msgid "Add Entry" +#~ msgstr "Adaugă înregistrare" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Utilizează preferat" + +#~ msgid "Change Email..." +#~ msgstr "Schimbare email..." + +#~ msgid "Remove Entry" +#~ msgstr "Elimină înregistrarea" + +#~ msgid "New Distribution List" +#~ msgstr "Listă de distribuție nouă" + +#~ msgid "Please enter &name:" +#~ msgstr "Introduceți de&numirea:" + +#~ msgid "Distribution List" +#~ msgstr "Listă de distribuție" + +#~ msgid "Please change &name:" +#~ msgstr "Schimbați de&numirea:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Ștergeți lista de distribuție „%1”?" + +#~ msgid "Selected addressees:" +#~ msgstr "Destinatari aleși:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nu" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Format vCard" + +#~ msgid "No description available." +#~ msgstr "Nicio descriere disponibilă." + +#~ msgid "Unable to open lock file." +#~ msgstr "Imposibil de deschis fișierul de blocare." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Resursa „%1” este blocată de aplicația „%2”." + +#~ msgid "Error" +#~ msgstr "Eroare" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Deblocarea a eșuat. Fișierul de blocare este deținut de alt proces: %1 " +#~ "(%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Toate blocările reușesc dar nu are loc blocarea propriu-zisă." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Toate blocările eșuează." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Încărcarea resursei „%1” a eșuat." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Salvarea resursei „%1” a eșuat." + +#, fuzzy +#~| msgid "Unable to load resource '%1'" +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Imposibil de încărcat resursa „%1”" + +#~ msgid "Default Address Book" +#~ msgstr "Carte de adrese implicită" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Imposibil de salvat în resursa „%1”. Este blocată." diff --git a/po/ru/kcontacts5.po b/po/ru/kcontacts5.po new file mode 100644 index 0000000..69b5929 --- /dev/null +++ b/po/ru/kcontacts5.po @@ -0,0 +1,751 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Чуплыгин Сергей , 2007. +# Nick Shaforostoff , 2007, 2008. +# Andrey Cherepanov , 2009. +# Alexander Potashev , 2010, 2011, 2016. +# Alexander Yavorsky , 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 \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 18.12.1\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Environment: kde\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Абонентский ящик" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Расширенная информация об адресе" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Улица" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Населённый пункт" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Область" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Почтовый индекс" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Страна" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Наклейка на конверт" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Адрес внутри страны" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Международный адрес" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Адрес для корреспонденции" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Адрес для посылок" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Домашний адрес" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Служебный адрес" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Основной адрес" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Другой адрес" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Уникальный идентификатор" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Имя" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Полное имя" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Фамилия" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Имя" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Дополнительные имена" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Почтительное обращение (в начале)" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Почтительное обращение (в конце)" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Ник" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "День рождения" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Домашний адрес: улица" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Домашний адрес: а/я" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Домашний адрес: город" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Домашний адрес: область/край" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Домашний адрес: индекс" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Домашний адрес: страна" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Домашний адрес: наклейка" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Служебный адрес: улица" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Служебный адрес: а/я" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Служебный адрес: город" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Служебный адрес: область/край" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Служебный адрес: индекс" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Служебный адрес: страна" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Служебный адрес: наклейка" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Домашний телефон" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Служебный телефон" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Мобильный телефон" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Домашний факс" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Служебный факс" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Телефон в автомобиле" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Пейджер" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Адрес электронной почты" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Почтовый клиент" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Часовой пояс" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Географическое местоположение" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Обращение" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Должность" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Организация" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Отдел" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Заметка" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Идентификатор продукта" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Дата изменения" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Сортировка" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Веб-сайт" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Класс безопасности" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Логотип" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Фотография" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Звуковой файл" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Д-р" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Г-жа" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Г-н" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Г-жа" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Г-жа" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Проф." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "мл." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "ст." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Неизвестное поле" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Все" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Часто используемые" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Адрес" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Адрес электронной почты" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Персональный" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Другой" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Не определён" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Другой" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Неизвестный тип" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Номер телефона" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Домашний телефон" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Служебный телефон" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Мгновенные сообщения" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Основной телефон" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Обычный" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Мобильный" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Видеофон" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Голосовая почта" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Модем" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Телефон в автомобиле" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Другой тип" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Основной номер" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Служебный факс" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Доступен всем" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Приватный доступ" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Конфиденциальный доступ" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Неизвестный доступ" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Основной адрес" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Чуплыгин Сергей, Николай Шафоростов" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "chapay_s@list.ru, shaforostoff@kde.ru" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Невозможно открыть источник «%1»" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Выбор адресата" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Имя" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Адрес электронной почты" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Выбрано" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Отменить выбор" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Настройка списков рассылки" + +#~ msgid "Select Email Address" +#~ msgstr "Выбор адресов электронной почты" + +#~ msgid "Email Addresses" +#~ msgstr "Адреса электронной почты" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Да" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Нет" + +#~ msgid "New List..." +#~ msgstr "Новый список..." + +#~ msgid "Rename List..." +#~ msgstr "Переименовать список..." + +#~ msgid "Remove List" +#~ msgstr "Удалить список..." + +#~ msgid "Available addresses:" +#~ msgstr "Доступные адреса:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Основной адрес" + +#~ msgid "Add Entry" +#~ msgstr "Добавить адрес" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Адрес электронной почты" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Использовать основной" + +#~ msgid "Change Email..." +#~ msgstr "Изменить адрес..." + +#~ msgid "Remove Entry" +#~ msgstr "Удалить адрес" + +#~ msgid "New Distribution List" +#~ msgstr "Новый список рассылки" + +#~ msgid "Please enter &name:" +#~ msgstr "Введите &имя:" + +#~ msgid "Distribution List" +#~ msgstr "Список рассылки" + +#~ msgid "Please change &name:" +#~ msgstr "Измените &имя:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Удалить список рассылки «%1»?" + +#~ msgid "Selected addressees:" +#~ msgstr "Выбранные адреса:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Выбранные адреса в «%1»:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Не основной" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Формат vCard" + +#~ msgid "No description available." +#~ msgstr "Описание отсутствует." + +#~ msgid "Unable to open lock file." +#~ msgstr "Невозможно открыть файл блокировки." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Источник «%1» заблокирован приложением «%2»." + +#~ msgid "Error" +#~ msgstr "Ошибка" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Ошибка разблокирования. Файл блокировки принадлежит другому процессу: %1 " +#~ "(%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: все операции блокировки выполнены успешно, но никаких " +#~ "блокировок не установлено." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: блокировки не выполнены." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Невозможно открыть источник «%1»." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Невозможно сохранить в источнике «%1»." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Не удалось открыть источник «%1»." + +#~ msgid "Default Address Book" +#~ msgstr "Адресная книга по умолчанию" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Невозможно сохранить в источнике «%1»: источник заблокирован." + +#~ msgid "List of Emails" +#~ msgstr "Список адресов" diff --git a/po/se/kcontacts5.po b/po/se/kcontacts5.po new file mode 100644 index 0000000..06aeb55 --- /dev/null +++ b/po/se/kcontacts5.po @@ -0,0 +1,586 @@ +# Translation of kcontacts5 to Northern Sami +# +msgid "" +msgstr "" +"Project-Id-Version: kabc\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2007-09-11 22:44+0200\n" +"Last-Translator: Northern Sami translation team \n" +"Language-Team: Northern Sami \n" +"Language: se\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Environment: kde\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "" diff --git a/po/sk/kcontacts5.po b/po/sk/kcontacts5.po new file mode 100644 index 0000000..93621fa --- /dev/null +++ b/po/sk/kcontacts5.po @@ -0,0 +1,589 @@ +# translation of kabc5.po to Slovak +# Roman Paholík , 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 \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "PoÅ¡tová schránka" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Rozšírené adresové informácie" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Ulica" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Lokalita" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Región" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "PSČ" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Krajina" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Návestie doručenia" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domáci" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Medzinárodný" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PoÅ¡tový" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Balík" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Doma" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Práca" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Preferovaná adresa" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Ostatné" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Jedinečný identifikátor" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Názov" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formátované meno" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Priezvisko" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Krstné meno" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "ĎalÅ¡ie mená" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Titul pred menom" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Titul za menom" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Prezývka" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Narodeniny" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Adresa domov - ulica" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "PoÅ¡tová schránka domácej adresy" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Adresa domov - mesto" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Adresa domov - Å¡tát" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Adresa domov - PSČ" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Adresa domov - krajina" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Návestie adresy domov" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Adresa - ulica" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "PoÅ¡tová schránka pracovnej adresy" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Adresa do zamestnania - mesto" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Adresa do zamestnania - Å¡tát" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Adresa do zamestnania - PSČ" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Adresa do zamestnania - krajina" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Návestie adresy do zamestnania" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefón domov" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefón do práce" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobilný telefón" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Fax domov" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Fax do práce" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefón v aute" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-mailová adresa" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "PoÅ¡tový klient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Časové pásmo" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografická pozícia" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titul" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Funkcia" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizácia" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Oddelenie" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Poznámka" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identifikátor produktu" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Dátum revízie" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "ZoradiÅ¥ reÅ¥azec" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Domovská stránka" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Trieda bezpečnosti" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotka" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Zvuk" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Slečna" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Pán" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Pani" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Slečna" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Neznáme pole" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "VÅ¡etko" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Častý" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresa" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-mail" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Osobné" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Vlastné" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nedefinované" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Vlastné" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Neznámy typ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefóne číslo" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Domov" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Práca" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Doručovateľ" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Uprednostňovaný" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Hlas" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Mailbox" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Auto" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Ostatné" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Uprednostňované číslo" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Fax do práce" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Verejný" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Súkromný" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Dôverné" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Neznámy typ" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Preferovaný" + +#~ msgid "List of Emails" +#~ msgstr "Zoznam emailov" diff --git a/po/sl/kcontacts5.po b/po/sl/kcontacts5.po new file mode 100644 index 0000000..b3f0e94 --- /dev/null +++ b/po/sl/kcontacts5.po @@ -0,0 +1,747 @@ +# translation of kabc.po to Slovenian +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Andrej Vernekar , 2007, 2008, 2010. +# Jure Repinc , 2009, 2012. +# Andrej Mernik , 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 \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 \n" +"X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" +"%100==4 ? 3 : 0);\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "PoÅ¡tni predal" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "RazÅ¡irjeni podatki o naslovu" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Ulica" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Ime poÅ¡te" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Območje" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "PoÅ¡tna Å¡tevilka" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Država" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Oznaka za dostavo" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Notranji" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Mednarodni" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PoÅ¡tni" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paketni" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Domači" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Službeni" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Prednostni naslov" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Drugi" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Edinstven določilnik" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ime" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Oblikovano ime" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Priimek" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Dano ime" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Dodatna imena" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Častne predpone" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Častne pripone" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Vzdevek" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Rojstni dan" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Ulica domačega naslova" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "PoÅ¡tni predal domačega naslova" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Mesto domačega naslova" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Zvezna država domačega naslova" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "PoÅ¡tna Å¡tevilka domačega naslova" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Država domačega naslova" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Oznaka domačega naslova" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Ulica poslovnega naslova" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "PoÅ¡tni predal poslovnega naslova" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Mesto poslovnega naslova" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Zvezna država poslovnega naslova" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "PoÅ¡tna Å¡tevilka poslovnega naslova" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Država poslovnega naslova" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Oznaka poslovnega naslova" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Domači telefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Poslovni telefon" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Prenosni telefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Domači faks" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Poslovni faks" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Avtomobilski telefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pozivnik" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-poÅ¡tni naslov" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "PoÅ¡tni odjemalec" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Časovni pas" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografski položaj" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Naziv" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Vloga" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizacija" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Oddelek" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Opomba" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Določilnik izdelka" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Datum predelave" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Niz za razvrščanje" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Domača stran" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Varnostni razred" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotip" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotografija" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Zvok" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Gdč." + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "G." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Ga." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ga./Gdč." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "ml." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "st." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Neznano polje" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Vse" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Pogosto" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Naslov" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-poÅ¡ta" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Osebno" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Po meri" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Nedoločeno" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Po meri" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Neznana vrsta" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonska Å¡tevilka" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Domači" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Službeni" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Sporočilnik" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Prednostni" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Glasovna poÅ¡ta" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Prenosni" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "PoÅ¡tni predal" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Avtomobilski" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Drugo" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Prednostna Å¡tevilka" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Službeni faks" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Javen" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Zasebni" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Zaupni" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Neznana vrsta" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Prednostni" + +#~ msgid "List of Emails" +#~ msgstr "Seznam e-poÅ¡t" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Jure Repinc,Andrej Vernekar,Gregor Rakar" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "jlp@holodeck1.com,andrej.vernekar@gmail.com,gregor.rakar@kiss.si" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Ni moč naložiti vira »%1«" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Izberite naslovnika" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Ime" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-poÅ¡ta" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Izbrano" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Odizberi" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Nastavi sezname za razpoÅ¡iljanje" + +#~ msgid "Select Email Address" +#~ msgstr "Izberite e-poÅ¡tni naslov" + +#~ msgid "Email Addresses" +#~ msgstr "E-poÅ¡tni naslovi" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Da" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "New List..." +#~ msgstr "Nov seznam ..." + +#~ msgid "Rename List..." +#~ msgstr "Preimenuj seznam ..." + +#~ msgid "Remove List" +#~ msgstr "Odstrani seznam" + +#~ msgid "Available addresses:" +#~ msgstr "Razpoložljivi naslovi:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Prednostna e-poÅ¡ta" + +#~ msgid "Add Entry" +#~ msgstr "Dodaj vnos" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-poÅ¡ta" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Uporabi prednostno" + +#~ msgid "Change Email..." +#~ msgstr "Spremeni e-poÅ¡to ..." + +#~ msgid "Remove Entry" +#~ msgstr "Odstrani vnos" + +#~ msgid "New Distribution List" +#~ msgstr "Nov seznam za razpoÅ¡iljanje" + +#~ msgid "Please enter &name:" +#~ msgstr "V&nesite ime:" + +#~ msgid "Distribution List" +#~ msgstr "Seznam za razpoÅ¡iljanje" + +#~ msgid "Please change &name:" +#~ msgstr "Spreme&nite ime:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Ali izbriÅ¡em seznam za razpoÅ¡iljanje »%1«?" + +#~ msgid "Selected addressees:" +#~ msgstr "Izbrani naslovniki:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Izbrani naslovi v »%1«:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Ne" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "Oblika vCard" + +#~ msgid "No description available." +#~ msgstr "Opis ni na voljo." + +#~ msgid "Unable to open lock file." +#~ msgstr "Ni moč odpreti zaklepne datoteke." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Program »%2« je zaklenil vir »%1«." + +#~ msgid "Error" +#~ msgstr "Napaka" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Odklepanje ni uspelo. Zaklepno datoteko si lasti drug proces: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Vsa zaklepanja so uspela, vendar noben dejansko ni bil " +#~ "opravljen." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Vsa zaklepanja odpovedo." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Nalaganje vira »%1« ni uspelo." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Shranjevanje vira »%1« ni uspelo." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Ni moč odpreti vira »%1«" + +#~ msgid "Default Address Book" +#~ msgstr "Privzeti imenik" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Ni moč shraniti v vir »%1«, je zaklenjen." diff --git a/po/sq/kcontacts5.po b/po/sq/kcontacts5.po new file mode 100644 index 0000000..70f0eda --- /dev/null +++ b/po/sq/kcontacts5.po @@ -0,0 +1,746 @@ +# Albanian translation for kdepimlibs +# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 +# This file is distributed under the same license as the kdepimlibs package. +# +# FIRST AUTHOR , 2009. +# Agron Selimaj , 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 \n" +"Language-Team: kdeshqip\n" +"Language: sq\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-04-21 22:43+0000\n" +"X-Generator: Lokalize 20.12.3\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Kuti Zyre Postale" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Informacion i Zgjeruar i Adresës" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Rruga" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Lokaliteti" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Rajoni" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Kodi Postal" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Vendi" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Kodi i Shpërndarjes" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Vendas" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Ndërkombëtar" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Postal" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Dëftesa" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Shtëpia" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Puna" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Adresa e Preferuar" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Të Tjera" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Identifikues i Vetëm" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Emri" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Emër i Formatuar" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Mbiemri" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Emri i dhënë" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Emra Shtesë" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Prefikse Nderimi" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Shtesa Nderimi" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "I Mbiquajtur" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Ditëlindja" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Rruga e Adresës së Shtëpisë" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Kutia e Zyrës Postare të Adresës së Shtëpisë" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Qyteti i Adresës së Shtëpisë" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Shteti i Adresës së Shtëpisë" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Zip Kodi i Adresës së Shtëpisë" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Vendi i Adresës së Shtëpisë" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Etiketa e Adresës së Shtëpisë" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Adresa e Rrugës së Biznesit" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Kutia e Zyrës Postare të Adresës së Biznesit" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Qyteti i Adresës së Biznesit" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Shteti i Adresës së Biznesit" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Kodi Zip i Adresës së Biznesit" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Vendi i Adresës së Biznesit" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Shënimi i Adresës së Biznesit" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Telefoni i Shtëpisë" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefoni i Zyrës" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Telefoni Celular" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Faksi i Shtëpisë" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Faksi i Zyrës" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Telefoni në makinë" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Pager" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Adresa Email" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Klient Poste" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zona Kohore" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Pozicioni Gjeografik" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titulli" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Roli" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organizata" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Departamenti" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Shënim" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Identifikuesi i Produktit" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Data e Rishikimit" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Shiriti i Nisjes" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Faqja Kryesore" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Shkalla e Sigurisë" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Stema" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Zëri" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Zonjusha" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Zoti" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Zonja" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Zonja" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Zt." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Fushë e Panjohur" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Të Gjitha" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Shpesh" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adresa" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Email" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personale" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "E Personalizuar" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "E papërcaktuar" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "E Personalizuar" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Lloj i panjohur" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Numri i telefonit" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Shtëpia" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Puna" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Messenger" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "I Preferuar" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Zë" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Telefon Celular" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Kuti Postare" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Makina" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Të Tjera" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Numri i Preferuar" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Faks Pune" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Publike" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Private" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Në konfidencë" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Lloj i panjohur" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "I Preferuar" + +#~ msgid "List of Emails" +#~ msgstr "Lista e email-eve" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "KDE Shqip, Launchpad Contributions: Vilson Gjeci" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "kde-shqip@yahoogroups.com,vilsongjeci@gmail.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Nuk qemë në gjendje të ngarkojmë resursin '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Zgjidhni të Adresuarin" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Emri" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "I zgjedhur" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Hiqe Përzgjedhjen" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Konfiguro Listat Shpërndarëse" + +#~ msgid "Select Email Address" +#~ msgstr "Zgjidh Adresën Email" + +#~ msgid "Email Addresses" +#~ msgstr "Adresat Email" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Po" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Jo" + +#~ msgid "New List..." +#~ msgstr "Listë E Re..." + +#~ msgid "Rename List..." +#~ msgstr "Riemërto Listën..." + +#~ msgid "Remove List" +#~ msgstr "Hiqe Listën" + +#~ msgid "Available addresses:" +#~ msgstr "Adresat e Disponueshme:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Email i Preferuar" + +#~ msgid "Add Entry" +#~ msgstr "Shto Hyrje" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "Email" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Përdor të Preferuarat" + +#~ msgid "Change Email..." +#~ msgstr "Ndrysho Email..." + +#~ msgid "Remove Entry" +#~ msgstr "Hiqe Hyrjen" + +#~ msgid "New Distribution List" +#~ msgstr "Listë e Re Distribucioni" + +#~ msgid "Please enter &name:" +#~ msgstr "Ju lutemi vendosni një &emër:" + +#~ msgid "Distribution List" +#~ msgstr "Lista e Distribucioneve" + +#~ msgid "Please change &name:" +#~ msgstr "Ju lutemi ndryshoni &emrin:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Ta fshij listën e distribucionit '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Adresat e përzgjedhura:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Adresat e përzgjedhura në '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Jo" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard Format" + +#~ msgid "No description available." +#~ msgstr "Asnjë përshkrim në dispozicion." + +#~ msgid "Unable to open lock file." +#~ msgstr "Nuk mundëm të hapim skedarin e bllokuar." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Resursi '%1' është bllokuar nga programi '%2'." + +#~ msgid "Error" +#~ msgstr "Gabim" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Zhbllokimi dështoi. Skedari i bllokuar po përdoret nga një proçes tjetër: " +#~ "%1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "" +#~ "LockNull: Të gjitha bllokimet ndodhën pro nuk u krye asnjë bllokim aktual." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Të gjitha bllokimet dështuan." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Ngarkimi i resursit '%1' dështoi." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Ruajtja e resursit '%1' dështoi." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Nuk jemi në gjendje të hapim burimin '%1'." + +#~ msgid "Default Address Book" +#~ msgstr "Libri i Parazgjedhur i Adresave" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "" +#~ "Nuk qemë në gjendje të regjistrojmë në resursin '%1'. Është i bllokuar." diff --git a/po/sr/kcontacts5.po b/po/sr/kcontacts5.po new file mode 100644 index 0000000..74dbf03 --- /dev/null +++ b/po/sr/kcontacts5.po @@ -0,0 +1,606 @@ +# Translation of kcontacts5.po into Serbian. +# Chusslove Illich , 2007, 2009, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" +"X-Environment: kde\n" + +#: address.cpp:397 +#, kde-format +msgid "Post Office Box" +msgstr "Поштански фах" + +#: address.cpp:413 +#, kde-format +msgid "Extended Address Information" +msgstr "Додатни адресни подаци" + +#: address.cpp:429 +#, kde-format +msgid "Street" +msgstr "Улица" + +#: address.cpp:445 +#, kde-format +msgid "Locality" +msgstr "Локалитет" + +#: address.cpp:461 +#, kde-format +msgid "Region" +msgstr "Регија" + +#: address.cpp:477 +#, kde-format +msgid "Postal Code" +msgstr "Поштански број" + +#: address.cpp:493 +#, kde-format +msgid "Country" +msgstr "Држава" + +#: address.cpp:509 +#, kde-format +msgid "Delivery Label" +msgstr "Етикета испоруке" + +#: address.cpp:527 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Домаћа" + +#: address.cpp:529 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Међународна" + +#: address.cpp:531 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Поштанска" + +#: address.cpp:533 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Пакетна" + +# >> @label Address type +#: address.cpp:535 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Кућна" + +# >> @label Address type +#: address.cpp:537 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Пословна" + +# >> @label Address type +#: address.cpp:539 +#, kde-format +msgid "Preferred Address" +msgstr "Пожељна адреса" + +#: address.cpp:541 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Друга" + +#: addressee.cpp:433 +#, kde-format +msgid "Unique Identifier" +msgstr "јединствени идентификатор" + +#: addressee.cpp:453 +#, kde-format +msgid "Name" +msgstr "име и презиме" + +#: addressee.cpp:649 +#, kde-format +msgid "Formatted Name" +msgstr "форматирано име" + +#: addressee.cpp:669 +#, kde-format +msgid "Family Name" +msgstr "презиме" + +#: addressee.cpp:689 +#, kde-format +msgid "Given Name" +msgstr "име" + +#: addressee.cpp:709 +#, kde-format +msgid "Additional Names" +msgstr "додатна имена" + +#: addressee.cpp:729 +#, kde-format +msgid "Honorific Prefixes" +msgstr "титуларни префикси" + +#: addressee.cpp:749 +#, kde-format +msgid "Honorific Suffixes" +msgstr "титуларни суфикси" + +#: addressee.cpp:800 +#, kde-format +msgid "Nick Name" +msgstr "надимак" + +#: addressee.cpp:840 +#, kde-format +msgid "Birthday" +msgstr "рођендан" + +#: addressee.cpp:845 +#, kde-format +msgid "Home Address Street" +msgstr "кућна адреса, улица" + +#: addressee.cpp:850 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "кућна адреса, поштански фах" + +#: addressee.cpp:855 +#, kde-format +msgid "Home Address City" +msgstr "кућна адреса, град" + +#: addressee.cpp:860 +#, kde-format +msgid "Home Address State" +msgstr "кућна адреса, република" + +#: addressee.cpp:865 +#, kde-format +msgid "Home Address Zip Code" +msgstr "кућна адреса, поштански број" + +#: addressee.cpp:870 +#, kde-format +msgid "Home Address Country" +msgstr "кућна адреса, држава" + +#: addressee.cpp:875 +#, kde-format +msgid "Home Address Label" +msgstr "кућна адреса, етикета" + +#: addressee.cpp:880 +#, kde-format +msgid "Business Address Street" +msgstr "пословна адреса, улица" + +#: addressee.cpp:885 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "пословна адреса, поштански фах" + +#: addressee.cpp:890 +#, kde-format +msgid "Business Address City" +msgstr "пословна адреса, град" + +#: addressee.cpp:895 +#, kde-format +msgid "Business Address State" +msgstr "пословна адреса, република" + +#: addressee.cpp:900 +#, kde-format +msgid "Business Address Zip Code" +msgstr "пословна адреса, поштански број" + +#: addressee.cpp:905 +#, kde-format +msgid "Business Address Country" +msgstr "пословна адреса, држава" + +#: addressee.cpp:910 +#, kde-format +msgid "Business Address Label" +msgstr "пословна адреса, етикета" + +#: addressee.cpp:915 +#, kde-format +msgid "Home Phone" +msgstr "кућни телефон" + +#: addressee.cpp:920 +#, kde-format +msgid "Business Phone" +msgstr "пословни телефон" + +#: addressee.cpp:925 +#, kde-format +msgid "Mobile Phone" +msgstr "мобилни телефон" + +#: addressee.cpp:930 phonenumber.cpp:231 +#, kde-format +msgid "Home Fax" +msgstr "Кућни факс" + +#: addressee.cpp:935 +#, kde-format +msgid "Business Fax" +msgstr "пословни факс" + +#: addressee.cpp:940 +#, kde-format +msgid "Car Phone" +msgstr "телефон у колима" + +#: addressee.cpp:945 phonenumber.cpp:207 +#, kde-format +msgid "ISDN" +msgstr "ИСДН" + +#: addressee.cpp:950 phonenumber.cpp:211 +#, kde-format +msgid "Pager" +msgstr "Пејџер" + +#: addressee.cpp:955 +#, kde-format +msgid "Email Address" +msgstr "адреса е‑поште" + +#: addressee.cpp:975 +#, kde-format +msgid "Mail Client" +msgstr "поштански клијент" + +#: addressee.cpp:995 +#, kde-format +msgid "Time Zone" +msgstr "временска зона" + +#: addressee.cpp:1015 +#, kde-format +msgid "Geographic Position" +msgstr "географски положај" + +#: addressee.cpp:1066 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "титула" + +#: addressee.cpp:1117 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "положај" + +#: addressee.cpp:1168 field.cpp:241 +#, kde-format +msgid "Organization" +msgstr "организација" + +#: addressee.cpp:1188 +#, kde-format +msgid "Department" +msgstr "одељење" + +#: addressee.cpp:1208 +#, kde-format +msgid "Note" +msgstr "напомена" + +#: addressee.cpp:1228 +#, kde-format +msgid "Product Identifier" +msgstr "идентификатор производа" + +#: addressee.cpp:1248 +#, kde-format +msgid "Revision Date" +msgstr "датум ревизије" + +#: addressee.cpp:1268 +#, kde-format +msgid "Sort String" +msgstr "ниска за ређање" + +#: addressee.cpp:1294 +#, kde-format +msgid "Homepage" +msgstr "домаћа страница" + +#: addressee.cpp:1314 +#, kde-format +msgid "Security Class" +msgstr "безбедносна класа" + +#: addressee.cpp:1334 +#, kde-format +msgid "Logo" +msgstr "логотип" + +#: addressee.cpp:1354 +#, kde-format +msgid "Photo" +msgstr "фотографија" + +#: addressee.cpp:1374 +#, kde-format +msgid "Sound" +msgstr "звук" + +#: addresseehelper.cpp:74 +#, kde-format +msgid "Dr." +msgstr "др" + +#: addresseehelper.cpp:75 +#, kde-format +msgid "Miss" +msgstr "гђица" + +#: addresseehelper.cpp:76 +#, kde-format +msgid "Mr." +msgstr "гдин" + +#: addresseehelper.cpp:77 +#, kde-format +msgid "Mrs." +msgstr "гђа" + +#: addresseehelper.cpp:78 +#, kde-format +msgid "Ms." +msgstr "гђица" + +#: addresseehelper.cpp:79 +#, kde-format +msgid "Prof." +msgstr "проф." + +#: addresseehelper.cpp:81 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:82 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:83 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:84 +#, kde-format +msgid "Jr." +msgstr "млађи" + +#: addresseehelper.cpp:85 +#, kde-format +msgid "Sr." +msgstr "старији" + +#: field.cpp:218 +#, kde-format +msgid "Unknown Field" +msgstr "непознато поље" + +# >> @item category of fields +#: field.cpp:231 +#, kde-format +msgid "All" +msgstr "сва" + +# >> @item category of fields +#: field.cpp:233 +#, kde-format +msgid "Frequent" +msgstr "честа" + +# >> @item category of fields +#: field.cpp:235 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "адреса" + +# >> @item category of fields +#: field.cpp:237 +#, kde-format +msgid "Email" +msgstr "е‑пошта" + +# >> @item category of fields +#: field.cpp:239 +#, kde-format +msgid "Personal" +msgstr "лична" + +# >> @item category of fields +#: field.cpp:243 +#, kde-format +msgid "Custom" +msgstr "посебна" + +# >> @item category of fields +#: field.cpp:245 +#, kde-format +msgid "Undefined" +msgstr "недефинисана" + +#: key.cpp:214 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "Икс.509" + +#: key.cpp:217 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "ПГП" + +#: key.cpp:220 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "посебан" + +#: key.cpp:223 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "непознат" + +#: phonenumber.cpp:183 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Број телефона" + +# >> @label Communication resource: home phone +#: phonenumber.cpp:185 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Кућни" + +# >> @label Communication resource: work phone +#: phonenumber.cpp:187 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Пословни" + +# >> @label Communication resource +#: phonenumber.cpp:189 +#, kde-format +msgid "Messenger" +msgstr "Гласник" + +# >> @label Communication resource: preferred phone +#: phonenumber.cpp:191 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Пожељни" + +# >> @label Communication resource +#: phonenumber.cpp:193 +#, kde-format +msgid "Voice" +msgstr "Гласовни" + +# >> @label Communication resource +#: phonenumber.cpp:195 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:197 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Мобилни" + +#: phonenumber.cpp:199 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Видео" + +# >> @label Communication resource +#: phonenumber.cpp:201 +#, kde-format +msgid "Mailbox" +msgstr "Сандуче" + +# >> @label Communication resource +#: phonenumber.cpp:203 +#, kde-format +msgid "Modem" +msgstr "Модем" + +# >> @label Communication resource +#: phonenumber.cpp:205 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "У колима" + +#: phonenumber.cpp:209 +#, kde-format +msgid "PCS" +msgstr "ПЦС" + +#: phonenumber.cpp:213 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Други" + +# >> @label Communication resource +#: phonenumber.cpp:226 +#, kde-format +msgid "Preferred Number" +msgstr "Пожељни број" + +#: phonenumber.cpp:236 +#, kde-format +msgid "Work Fax" +msgstr "Пословни факс" + +#: secrecy.cpp:111 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "јавно" + +#: secrecy.cpp:114 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "приватно" + +#: secrecy.cpp:117 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "поверљиво" + +#: secrecy.cpp:120 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "непознато" diff --git a/po/sr@ijekavian/kcontacts5.po b/po/sr@ijekavian/kcontacts5.po new file mode 100644 index 0000000..5643936 --- /dev/null +++ b/po/sr@ijekavian/kcontacts5.po @@ -0,0 +1,606 @@ +# Translation of kcontacts5.po into Serbian. +# Chusslove Illich , 2007, 2009, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \n" +"Language: sr@ijekavian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" +"X-Environment: kde\n" + +#: address.cpp:397 +#, kde-format +msgid "Post Office Box" +msgstr "Поштански фах" + +#: address.cpp:413 +#, kde-format +msgid "Extended Address Information" +msgstr "Додатни адресни подаци" + +#: address.cpp:429 +#, kde-format +msgid "Street" +msgstr "Улица" + +#: address.cpp:445 +#, kde-format +msgid "Locality" +msgstr "Локалитет" + +#: address.cpp:461 +#, kde-format +msgid "Region" +msgstr "Регија" + +#: address.cpp:477 +#, kde-format +msgid "Postal Code" +msgstr "Поштански број" + +#: address.cpp:493 +#, kde-format +msgid "Country" +msgstr "Држава" + +#: address.cpp:509 +#, kde-format +msgid "Delivery Label" +msgstr "Етикета испоруке" + +#: address.cpp:527 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Домаћа" + +#: address.cpp:529 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Међународна" + +#: address.cpp:531 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Поштанска" + +#: address.cpp:533 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Пакетна" + +# >> @label Address type +#: address.cpp:535 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Кућна" + +# >> @label Address type +#: address.cpp:537 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Пословна" + +# >> @label Address type +#: address.cpp:539 +#, kde-format +msgid "Preferred Address" +msgstr "Пожељна адреса" + +#: address.cpp:541 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Друга" + +#: addressee.cpp:433 +#, kde-format +msgid "Unique Identifier" +msgstr "јединствени идентификатор" + +#: addressee.cpp:453 +#, kde-format +msgid "Name" +msgstr "име и презиме" + +#: addressee.cpp:649 +#, kde-format +msgid "Formatted Name" +msgstr "форматирано име" + +#: addressee.cpp:669 +#, kde-format +msgid "Family Name" +msgstr "презиме" + +#: addressee.cpp:689 +#, kde-format +msgid "Given Name" +msgstr "име" + +#: addressee.cpp:709 +#, kde-format +msgid "Additional Names" +msgstr "додатна имена" + +#: addressee.cpp:729 +#, kde-format +msgid "Honorific Prefixes" +msgstr "титуларни префикси" + +#: addressee.cpp:749 +#, kde-format +msgid "Honorific Suffixes" +msgstr "титуларни суфикси" + +#: addressee.cpp:800 +#, kde-format +msgid "Nick Name" +msgstr "надимак" + +#: addressee.cpp:840 +#, kde-format +msgid "Birthday" +msgstr "рођендан" + +#: addressee.cpp:845 +#, kde-format +msgid "Home Address Street" +msgstr "кућна адреса, улица" + +#: addressee.cpp:850 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "кућна адреса, поштански фах" + +#: addressee.cpp:855 +#, kde-format +msgid "Home Address City" +msgstr "кућна адреса, град" + +#: addressee.cpp:860 +#, kde-format +msgid "Home Address State" +msgstr "кућна адреса, република" + +#: addressee.cpp:865 +#, kde-format +msgid "Home Address Zip Code" +msgstr "кућна адреса, поштански број" + +#: addressee.cpp:870 +#, kde-format +msgid "Home Address Country" +msgstr "кућна адреса, држава" + +#: addressee.cpp:875 +#, kde-format +msgid "Home Address Label" +msgstr "кућна адреса, етикета" + +#: addressee.cpp:880 +#, kde-format +msgid "Business Address Street" +msgstr "пословна адреса, улица" + +#: addressee.cpp:885 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "пословна адреса, поштански фах" + +#: addressee.cpp:890 +#, kde-format +msgid "Business Address City" +msgstr "пословна адреса, град" + +#: addressee.cpp:895 +#, kde-format +msgid "Business Address State" +msgstr "пословна адреса, република" + +#: addressee.cpp:900 +#, kde-format +msgid "Business Address Zip Code" +msgstr "пословна адреса, поштански број" + +#: addressee.cpp:905 +#, kde-format +msgid "Business Address Country" +msgstr "пословна адреса, држава" + +#: addressee.cpp:910 +#, kde-format +msgid "Business Address Label" +msgstr "пословна адреса, етикета" + +#: addressee.cpp:915 +#, kde-format +msgid "Home Phone" +msgstr "кућни телефон" + +#: addressee.cpp:920 +#, kde-format +msgid "Business Phone" +msgstr "пословни телефон" + +#: addressee.cpp:925 +#, kde-format +msgid "Mobile Phone" +msgstr "мобилни телефон" + +#: addressee.cpp:930 phonenumber.cpp:231 +#, kde-format +msgid "Home Fax" +msgstr "Кућни факс" + +#: addressee.cpp:935 +#, kde-format +msgid "Business Fax" +msgstr "пословни факс" + +#: addressee.cpp:940 +#, kde-format +msgid "Car Phone" +msgstr "телефон у колима" + +#: addressee.cpp:945 phonenumber.cpp:207 +#, kde-format +msgid "ISDN" +msgstr "ИСДН" + +#: addressee.cpp:950 phonenumber.cpp:211 +#, kde-format +msgid "Pager" +msgstr "Пејџер" + +#: addressee.cpp:955 +#, kde-format +msgid "Email Address" +msgstr "адреса е‑поште" + +#: addressee.cpp:975 +#, kde-format +msgid "Mail Client" +msgstr "поштански клијент" + +#: addressee.cpp:995 +#, kde-format +msgid "Time Zone" +msgstr "временска зона" + +#: addressee.cpp:1015 +#, kde-format +msgid "Geographic Position" +msgstr "географски положај" + +#: addressee.cpp:1066 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "титула" + +#: addressee.cpp:1117 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "положај" + +#: addressee.cpp:1168 field.cpp:241 +#, kde-format +msgid "Organization" +msgstr "организација" + +#: addressee.cpp:1188 +#, kde-format +msgid "Department" +msgstr "одељење" + +#: addressee.cpp:1208 +#, kde-format +msgid "Note" +msgstr "напомена" + +#: addressee.cpp:1228 +#, kde-format +msgid "Product Identifier" +msgstr "идентификатор производа" + +#: addressee.cpp:1248 +#, kde-format +msgid "Revision Date" +msgstr "датум ревизије" + +#: addressee.cpp:1268 +#, kde-format +msgid "Sort String" +msgstr "ниска за ређање" + +#: addressee.cpp:1294 +#, kde-format +msgid "Homepage" +msgstr "домаћа страница" + +#: addressee.cpp:1314 +#, kde-format +msgid "Security Class" +msgstr "безбједносна класа" + +#: addressee.cpp:1334 +#, kde-format +msgid "Logo" +msgstr "логотип" + +#: addressee.cpp:1354 +#, kde-format +msgid "Photo" +msgstr "фотографија" + +#: addressee.cpp:1374 +#, kde-format +msgid "Sound" +msgstr "звук" + +#: addresseehelper.cpp:74 +#, kde-format +msgid "Dr." +msgstr "др" + +#: addresseehelper.cpp:75 +#, kde-format +msgid "Miss" +msgstr "гђица" + +#: addresseehelper.cpp:76 +#, kde-format +msgid "Mr." +msgstr "гдин" + +#: addresseehelper.cpp:77 +#, kde-format +msgid "Mrs." +msgstr "гђа" + +#: addresseehelper.cpp:78 +#, kde-format +msgid "Ms." +msgstr "гђица" + +#: addresseehelper.cpp:79 +#, kde-format +msgid "Prof." +msgstr "проф." + +#: addresseehelper.cpp:81 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:82 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:83 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:84 +#, kde-format +msgid "Jr." +msgstr "млађи" + +#: addresseehelper.cpp:85 +#, kde-format +msgid "Sr." +msgstr "старији" + +#: field.cpp:218 +#, kde-format +msgid "Unknown Field" +msgstr "непознато поље" + +# >> @item category of fields +#: field.cpp:231 +#, kde-format +msgid "All" +msgstr "сва" + +# >> @item category of fields +#: field.cpp:233 +#, kde-format +msgid "Frequent" +msgstr "честа" + +# >> @item category of fields +#: field.cpp:235 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "адреса" + +# >> @item category of fields +#: field.cpp:237 +#, kde-format +msgid "Email" +msgstr "е‑пошта" + +# >> @item category of fields +#: field.cpp:239 +#, kde-format +msgid "Personal" +msgstr "лична" + +# >> @item category of fields +#: field.cpp:243 +#, kde-format +msgid "Custom" +msgstr "посебна" + +# >> @item category of fields +#: field.cpp:245 +#, kde-format +msgid "Undefined" +msgstr "недефинисана" + +#: key.cpp:214 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "Икс.509" + +#: key.cpp:217 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "ПГП" + +#: key.cpp:220 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "посебан" + +#: key.cpp:223 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "непознат" + +#: phonenumber.cpp:183 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Број телефона" + +# >> @label Communication resource: home phone +#: phonenumber.cpp:185 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Кућни" + +# >> @label Communication resource: work phone +#: phonenumber.cpp:187 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Пословни" + +# >> @label Communication resource +#: phonenumber.cpp:189 +#, kde-format +msgid "Messenger" +msgstr "Гласник" + +# >> @label Communication resource: preferred phone +#: phonenumber.cpp:191 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Пожељни" + +# >> @label Communication resource +#: phonenumber.cpp:193 +#, kde-format +msgid "Voice" +msgstr "Гласовни" + +# >> @label Communication resource +#: phonenumber.cpp:195 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:197 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Мобилни" + +#: phonenumber.cpp:199 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Видео" + +# >> @label Communication resource +#: phonenumber.cpp:201 +#, kde-format +msgid "Mailbox" +msgstr "Сандуче" + +# >> @label Communication resource +#: phonenumber.cpp:203 +#, kde-format +msgid "Modem" +msgstr "Модем" + +# >> @label Communication resource +#: phonenumber.cpp:205 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "У колима" + +#: phonenumber.cpp:209 +#, kde-format +msgid "PCS" +msgstr "ПЦС" + +#: phonenumber.cpp:213 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Други" + +# >> @label Communication resource +#: phonenumber.cpp:226 +#, kde-format +msgid "Preferred Number" +msgstr "Пожељни број" + +#: phonenumber.cpp:236 +#, kde-format +msgid "Work Fax" +msgstr "Пословни факс" + +#: secrecy.cpp:111 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "јавно" + +#: secrecy.cpp:114 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "приватно" + +#: secrecy.cpp:117 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "повјерљиво" + +#: secrecy.cpp:120 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "непознато" diff --git a/po/sr@ijekavianlatin/kcontacts5.po b/po/sr@ijekavianlatin/kcontacts5.po new file mode 100644 index 0000000..3e0c7f0 --- /dev/null +++ b/po/sr@ijekavianlatin/kcontacts5.po @@ -0,0 +1,606 @@ +# Translation of kcontacts5.po into Serbian. +# Chusslove Illich , 2007, 2009, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \n" +"Language: sr@ijekavianlatin\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" +"X-Environment: kde\n" + +#: address.cpp:397 +#, kde-format +msgid "Post Office Box" +msgstr "PoÅ¡tanski fah" + +#: address.cpp:413 +#, kde-format +msgid "Extended Address Information" +msgstr "Dodatni adresni podaci" + +#: address.cpp:429 +#, kde-format +msgid "Street" +msgstr "Ulica" + +#: address.cpp:445 +#, kde-format +msgid "Locality" +msgstr "Lokalitet" + +#: address.cpp:461 +#, kde-format +msgid "Region" +msgstr "Regija" + +#: address.cpp:477 +#, kde-format +msgid "Postal Code" +msgstr "PoÅ¡tanski broj" + +#: address.cpp:493 +#, kde-format +msgid "Country" +msgstr "Država" + +#: address.cpp:509 +#, kde-format +msgid "Delivery Label" +msgstr "Etiketa isporuke" + +#: address.cpp:527 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domaća" + +#: address.cpp:529 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Međunarodna" + +#: address.cpp:531 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PoÅ¡tanska" + +#: address.cpp:533 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paketna" + +# >> @label Address type +#: address.cpp:535 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Kućna" + +# >> @label Address type +#: address.cpp:537 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Poslovna" + +# >> @label Address type +#: address.cpp:539 +#, kde-format +msgid "Preferred Address" +msgstr "Poželjna adresa" + +#: address.cpp:541 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Druga" + +#: addressee.cpp:433 +#, kde-format +msgid "Unique Identifier" +msgstr "jedinstveni identifikator" + +#: addressee.cpp:453 +#, kde-format +msgid "Name" +msgstr "ime i prezime" + +#: addressee.cpp:649 +#, kde-format +msgid "Formatted Name" +msgstr "formatirano ime" + +#: addressee.cpp:669 +#, kde-format +msgid "Family Name" +msgstr "prezime" + +#: addressee.cpp:689 +#, kde-format +msgid "Given Name" +msgstr "ime" + +#: addressee.cpp:709 +#, kde-format +msgid "Additional Names" +msgstr "dodatna imena" + +#: addressee.cpp:729 +#, kde-format +msgid "Honorific Prefixes" +msgstr "titularni prefiksi" + +#: addressee.cpp:749 +#, kde-format +msgid "Honorific Suffixes" +msgstr "titularni sufiksi" + +#: addressee.cpp:800 +#, kde-format +msgid "Nick Name" +msgstr "nadimak" + +#: addressee.cpp:840 +#, kde-format +msgid "Birthday" +msgstr "rođendan" + +#: addressee.cpp:845 +#, kde-format +msgid "Home Address Street" +msgstr "kućna adresa, ulica" + +#: addressee.cpp:850 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "kućna adresa, poÅ¡tanski fah" + +#: addressee.cpp:855 +#, kde-format +msgid "Home Address City" +msgstr "kućna adresa, grad" + +#: addressee.cpp:860 +#, kde-format +msgid "Home Address State" +msgstr "kućna adresa, republika" + +#: addressee.cpp:865 +#, kde-format +msgid "Home Address Zip Code" +msgstr "kućna adresa, poÅ¡tanski broj" + +#: addressee.cpp:870 +#, kde-format +msgid "Home Address Country" +msgstr "kućna adresa, država" + +#: addressee.cpp:875 +#, kde-format +msgid "Home Address Label" +msgstr "kućna adresa, etiketa" + +#: addressee.cpp:880 +#, kde-format +msgid "Business Address Street" +msgstr "poslovna adresa, ulica" + +#: addressee.cpp:885 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "poslovna adresa, poÅ¡tanski fah" + +#: addressee.cpp:890 +#, kde-format +msgid "Business Address City" +msgstr "poslovna adresa, grad" + +#: addressee.cpp:895 +#, kde-format +msgid "Business Address State" +msgstr "poslovna adresa, republika" + +#: addressee.cpp:900 +#, kde-format +msgid "Business Address Zip Code" +msgstr "poslovna adresa, poÅ¡tanski broj" + +#: addressee.cpp:905 +#, kde-format +msgid "Business Address Country" +msgstr "poslovna adresa, država" + +#: addressee.cpp:910 +#, kde-format +msgid "Business Address Label" +msgstr "poslovna adresa, etiketa" + +#: addressee.cpp:915 +#, kde-format +msgid "Home Phone" +msgstr "kućni telefon" + +#: addressee.cpp:920 +#, kde-format +msgid "Business Phone" +msgstr "poslovni telefon" + +#: addressee.cpp:925 +#, kde-format +msgid "Mobile Phone" +msgstr "mobilni telefon" + +#: addressee.cpp:930 phonenumber.cpp:231 +#, kde-format +msgid "Home Fax" +msgstr "Kućni faks" + +#: addressee.cpp:935 +#, kde-format +msgid "Business Fax" +msgstr "poslovni faks" + +#: addressee.cpp:940 +#, kde-format +msgid "Car Phone" +msgstr "telefon u kolima" + +#: addressee.cpp:945 phonenumber.cpp:207 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:950 phonenumber.cpp:211 +#, kde-format +msgid "Pager" +msgstr "Pejdžer" + +#: addressee.cpp:955 +#, kde-format +msgid "Email Address" +msgstr "adresa e‑poÅ¡te" + +#: addressee.cpp:975 +#, kde-format +msgid "Mail Client" +msgstr "poÅ¡tanski klijent" + +#: addressee.cpp:995 +#, kde-format +msgid "Time Zone" +msgstr "vremenska zona" + +#: addressee.cpp:1015 +#, kde-format +msgid "Geographic Position" +msgstr "geografski položaj" + +#: addressee.cpp:1066 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "titula" + +#: addressee.cpp:1117 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "položaj" + +#: addressee.cpp:1168 field.cpp:241 +#, kde-format +msgid "Organization" +msgstr "organizacija" + +#: addressee.cpp:1188 +#, kde-format +msgid "Department" +msgstr "odeljenje" + +#: addressee.cpp:1208 +#, kde-format +msgid "Note" +msgstr "napomena" + +#: addressee.cpp:1228 +#, kde-format +msgid "Product Identifier" +msgstr "identifikator proizvoda" + +#: addressee.cpp:1248 +#, kde-format +msgid "Revision Date" +msgstr "datum revizije" + +#: addressee.cpp:1268 +#, kde-format +msgid "Sort String" +msgstr "niska za ređanje" + +#: addressee.cpp:1294 +#, kde-format +msgid "Homepage" +msgstr "domaća stranica" + +#: addressee.cpp:1314 +#, kde-format +msgid "Security Class" +msgstr "bezbjednosna klasa" + +#: addressee.cpp:1334 +#, kde-format +msgid "Logo" +msgstr "logotip" + +#: addressee.cpp:1354 +#, kde-format +msgid "Photo" +msgstr "fotografija" + +#: addressee.cpp:1374 +#, kde-format +msgid "Sound" +msgstr "zvuk" + +#: addresseehelper.cpp:74 +#, kde-format +msgid "Dr." +msgstr "dr" + +#: addresseehelper.cpp:75 +#, kde-format +msgid "Miss" +msgstr "gđica" + +#: addresseehelper.cpp:76 +#, kde-format +msgid "Mr." +msgstr "gdin" + +#: addresseehelper.cpp:77 +#, kde-format +msgid "Mrs." +msgstr "gđa" + +#: addresseehelper.cpp:78 +#, kde-format +msgid "Ms." +msgstr "gđica" + +#: addresseehelper.cpp:79 +#, kde-format +msgid "Prof." +msgstr "prof." + +#: addresseehelper.cpp:81 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:82 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:83 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:84 +#, kde-format +msgid "Jr." +msgstr "mlađi" + +#: addresseehelper.cpp:85 +#, kde-format +msgid "Sr." +msgstr "stariji" + +#: field.cpp:218 +#, kde-format +msgid "Unknown Field" +msgstr "nepoznato polje" + +# >> @item category of fields +#: field.cpp:231 +#, kde-format +msgid "All" +msgstr "sva" + +# >> @item category of fields +#: field.cpp:233 +#, kde-format +msgid "Frequent" +msgstr "česta" + +# >> @item category of fields +#: field.cpp:235 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "adresa" + +# >> @item category of fields +#: field.cpp:237 +#, kde-format +msgid "Email" +msgstr "e‑poÅ¡ta" + +# >> @item category of fields +#: field.cpp:239 +#, kde-format +msgid "Personal" +msgstr "lična" + +# >> @item category of fields +#: field.cpp:243 +#, kde-format +msgid "Custom" +msgstr "posebna" + +# >> @item category of fields +#: field.cpp:245 +#, kde-format +msgid "Undefined" +msgstr "nedefinisana" + +#: key.cpp:214 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X.509" + +#: key.cpp:217 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:220 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "poseban" + +#: key.cpp:223 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "nepoznat" + +#: phonenumber.cpp:183 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Broj telefona" + +# >> @label Communication resource: home phone +#: phonenumber.cpp:185 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Kućni" + +# >> @label Communication resource: work phone +#: phonenumber.cpp:187 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Poslovni" + +# >> @label Communication resource +#: phonenumber.cpp:189 +#, kde-format +msgid "Messenger" +msgstr "Glasnik" + +# >> @label Communication resource: preferred phone +#: phonenumber.cpp:191 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Poželjni" + +# >> @label Communication resource +#: phonenumber.cpp:193 +#, kde-format +msgid "Voice" +msgstr "Glasovni" + +# >> @label Communication resource +#: phonenumber.cpp:195 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:197 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobilni" + +#: phonenumber.cpp:199 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +# >> @label Communication resource +#: phonenumber.cpp:201 +#, kde-format +msgid "Mailbox" +msgstr "Sanduče" + +# >> @label Communication resource +#: phonenumber.cpp:203 +#, kde-format +msgid "Modem" +msgstr "Modem" + +# >> @label Communication resource +#: phonenumber.cpp:205 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "U kolima" + +#: phonenumber.cpp:209 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:213 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Drugi" + +# >> @label Communication resource +#: phonenumber.cpp:226 +#, kde-format +msgid "Preferred Number" +msgstr "Poželjni broj" + +#: phonenumber.cpp:236 +#, kde-format +msgid "Work Fax" +msgstr "Poslovni faks" + +#: secrecy.cpp:111 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "javno" + +#: secrecy.cpp:114 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "privatno" + +#: secrecy.cpp:117 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "povjerljivo" + +#: secrecy.cpp:120 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "nepoznato" diff --git a/po/sr@latin/kcontacts5.po b/po/sr@latin/kcontacts5.po new file mode 100644 index 0000000..83a6540 --- /dev/null +++ b/po/sr@latin/kcontacts5.po @@ -0,0 +1,606 @@ +# Translation of kcontacts5.po into Serbian. +# Chusslove Illich , 2007, 2009, 2015, 2017. +# Dalibor Djuric , 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 \n" +"Language-Team: Serbian \n" +"Language: sr@latin\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Accelerator-Marker: &\n" +"X-Text-Markup: kde4\n" +"X-Environment: kde\n" + +#: address.cpp:397 +#, kde-format +msgid "Post Office Box" +msgstr "PoÅ¡tanski fah" + +#: address.cpp:413 +#, kde-format +msgid "Extended Address Information" +msgstr "Dodatni adresni podaci" + +#: address.cpp:429 +#, kde-format +msgid "Street" +msgstr "Ulica" + +#: address.cpp:445 +#, kde-format +msgid "Locality" +msgstr "Lokalitet" + +#: address.cpp:461 +#, kde-format +msgid "Region" +msgstr "Regija" + +#: address.cpp:477 +#, kde-format +msgid "Postal Code" +msgstr "PoÅ¡tanski broj" + +#: address.cpp:493 +#, kde-format +msgid "Country" +msgstr "Država" + +#: address.cpp:509 +#, kde-format +msgid "Delivery Label" +msgstr "Etiketa isporuke" + +#: address.cpp:527 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Domaća" + +#: address.cpp:529 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Međunarodna" + +#: address.cpp:531 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "PoÅ¡tanska" + +#: address.cpp:533 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paketna" + +# >> @label Address type +#: address.cpp:535 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Kućna" + +# >> @label Address type +#: address.cpp:537 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Poslovna" + +# >> @label Address type +#: address.cpp:539 +#, kde-format +msgid "Preferred Address" +msgstr "Poželjna adresa" + +#: address.cpp:541 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Druga" + +#: addressee.cpp:433 +#, kde-format +msgid "Unique Identifier" +msgstr "jedinstveni identifikator" + +#: addressee.cpp:453 +#, kde-format +msgid "Name" +msgstr "ime i prezime" + +#: addressee.cpp:649 +#, kde-format +msgid "Formatted Name" +msgstr "formatirano ime" + +#: addressee.cpp:669 +#, kde-format +msgid "Family Name" +msgstr "prezime" + +#: addressee.cpp:689 +#, kde-format +msgid "Given Name" +msgstr "ime" + +#: addressee.cpp:709 +#, kde-format +msgid "Additional Names" +msgstr "dodatna imena" + +#: addressee.cpp:729 +#, kde-format +msgid "Honorific Prefixes" +msgstr "titularni prefiksi" + +#: addressee.cpp:749 +#, kde-format +msgid "Honorific Suffixes" +msgstr "titularni sufiksi" + +#: addressee.cpp:800 +#, kde-format +msgid "Nick Name" +msgstr "nadimak" + +#: addressee.cpp:840 +#, kde-format +msgid "Birthday" +msgstr "rođendan" + +#: addressee.cpp:845 +#, kde-format +msgid "Home Address Street" +msgstr "kućna adresa, ulica" + +#: addressee.cpp:850 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "kućna adresa, poÅ¡tanski fah" + +#: addressee.cpp:855 +#, kde-format +msgid "Home Address City" +msgstr "kućna adresa, grad" + +#: addressee.cpp:860 +#, kde-format +msgid "Home Address State" +msgstr "kućna adresa, republika" + +#: addressee.cpp:865 +#, kde-format +msgid "Home Address Zip Code" +msgstr "kućna adresa, poÅ¡tanski broj" + +#: addressee.cpp:870 +#, kde-format +msgid "Home Address Country" +msgstr "kućna adresa, država" + +#: addressee.cpp:875 +#, kde-format +msgid "Home Address Label" +msgstr "kućna adresa, etiketa" + +#: addressee.cpp:880 +#, kde-format +msgid "Business Address Street" +msgstr "poslovna adresa, ulica" + +#: addressee.cpp:885 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "poslovna adresa, poÅ¡tanski fah" + +#: addressee.cpp:890 +#, kde-format +msgid "Business Address City" +msgstr "poslovna adresa, grad" + +#: addressee.cpp:895 +#, kde-format +msgid "Business Address State" +msgstr "poslovna adresa, republika" + +#: addressee.cpp:900 +#, kde-format +msgid "Business Address Zip Code" +msgstr "poslovna adresa, poÅ¡tanski broj" + +#: addressee.cpp:905 +#, kde-format +msgid "Business Address Country" +msgstr "poslovna adresa, država" + +#: addressee.cpp:910 +#, kde-format +msgid "Business Address Label" +msgstr "poslovna adresa, etiketa" + +#: addressee.cpp:915 +#, kde-format +msgid "Home Phone" +msgstr "kućni telefon" + +#: addressee.cpp:920 +#, kde-format +msgid "Business Phone" +msgstr "poslovni telefon" + +#: addressee.cpp:925 +#, kde-format +msgid "Mobile Phone" +msgstr "mobilni telefon" + +#: addressee.cpp:930 phonenumber.cpp:231 +#, kde-format +msgid "Home Fax" +msgstr "Kućni faks" + +#: addressee.cpp:935 +#, kde-format +msgid "Business Fax" +msgstr "poslovni faks" + +#: addressee.cpp:940 +#, kde-format +msgid "Car Phone" +msgstr "telefon u kolima" + +#: addressee.cpp:945 phonenumber.cpp:207 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:950 phonenumber.cpp:211 +#, kde-format +msgid "Pager" +msgstr "Pejdžer" + +#: addressee.cpp:955 +#, kde-format +msgid "Email Address" +msgstr "adresa e‑poÅ¡te" + +#: addressee.cpp:975 +#, kde-format +msgid "Mail Client" +msgstr "poÅ¡tanski klijent" + +#: addressee.cpp:995 +#, kde-format +msgid "Time Zone" +msgstr "vremenska zona" + +#: addressee.cpp:1015 +#, kde-format +msgid "Geographic Position" +msgstr "geografski položaj" + +#: addressee.cpp:1066 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "titula" + +#: addressee.cpp:1117 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "položaj" + +#: addressee.cpp:1168 field.cpp:241 +#, kde-format +msgid "Organization" +msgstr "organizacija" + +#: addressee.cpp:1188 +#, kde-format +msgid "Department" +msgstr "odeljenje" + +#: addressee.cpp:1208 +#, kde-format +msgid "Note" +msgstr "napomena" + +#: addressee.cpp:1228 +#, kde-format +msgid "Product Identifier" +msgstr "identifikator proizvoda" + +#: addressee.cpp:1248 +#, kde-format +msgid "Revision Date" +msgstr "datum revizije" + +#: addressee.cpp:1268 +#, kde-format +msgid "Sort String" +msgstr "niska za ređanje" + +#: addressee.cpp:1294 +#, kde-format +msgid "Homepage" +msgstr "domaća stranica" + +#: addressee.cpp:1314 +#, kde-format +msgid "Security Class" +msgstr "bezbednosna klasa" + +#: addressee.cpp:1334 +#, kde-format +msgid "Logo" +msgstr "logotip" + +#: addressee.cpp:1354 +#, kde-format +msgid "Photo" +msgstr "fotografija" + +#: addressee.cpp:1374 +#, kde-format +msgid "Sound" +msgstr "zvuk" + +#: addresseehelper.cpp:74 +#, kde-format +msgid "Dr." +msgstr "dr" + +#: addresseehelper.cpp:75 +#, kde-format +msgid "Miss" +msgstr "gđica" + +#: addresseehelper.cpp:76 +#, kde-format +msgid "Mr." +msgstr "gdin" + +#: addresseehelper.cpp:77 +#, kde-format +msgid "Mrs." +msgstr "gđa" + +#: addresseehelper.cpp:78 +#, kde-format +msgid "Ms." +msgstr "gđica" + +#: addresseehelper.cpp:79 +#, kde-format +msgid "Prof." +msgstr "prof." + +#: addresseehelper.cpp:81 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:82 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:83 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:84 +#, kde-format +msgid "Jr." +msgstr "mlađi" + +#: addresseehelper.cpp:85 +#, kde-format +msgid "Sr." +msgstr "stariji" + +#: field.cpp:218 +#, kde-format +msgid "Unknown Field" +msgstr "nepoznato polje" + +# >> @item category of fields +#: field.cpp:231 +#, kde-format +msgid "All" +msgstr "sva" + +# >> @item category of fields +#: field.cpp:233 +#, kde-format +msgid "Frequent" +msgstr "česta" + +# >> @item category of fields +#: field.cpp:235 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "adresa" + +# >> @item category of fields +#: field.cpp:237 +#, kde-format +msgid "Email" +msgstr "e‑poÅ¡ta" + +# >> @item category of fields +#: field.cpp:239 +#, kde-format +msgid "Personal" +msgstr "lična" + +# >> @item category of fields +#: field.cpp:243 +#, kde-format +msgid "Custom" +msgstr "posebna" + +# >> @item category of fields +#: field.cpp:245 +#, kde-format +msgid "Undefined" +msgstr "nedefinisana" + +#: key.cpp:214 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X.509" + +#: key.cpp:217 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:220 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "poseban" + +#: key.cpp:223 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "nepoznat" + +#: phonenumber.cpp:183 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Broj telefona" + +# >> @label Communication resource: home phone +#: phonenumber.cpp:185 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Kućni" + +# >> @label Communication resource: work phone +#: phonenumber.cpp:187 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Poslovni" + +# >> @label Communication resource +#: phonenumber.cpp:189 +#, kde-format +msgid "Messenger" +msgstr "Glasnik" + +# >> @label Communication resource: preferred phone +#: phonenumber.cpp:191 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Poželjni" + +# >> @label Communication resource +#: phonenumber.cpp:193 +#, kde-format +msgid "Voice" +msgstr "Glasovni" + +# >> @label Communication resource +#: phonenumber.cpp:195 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:197 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobilni" + +#: phonenumber.cpp:199 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +# >> @label Communication resource +#: phonenumber.cpp:201 +#, kde-format +msgid "Mailbox" +msgstr "Sanduče" + +# >> @label Communication resource +#: phonenumber.cpp:203 +#, kde-format +msgid "Modem" +msgstr "Modem" + +# >> @label Communication resource +#: phonenumber.cpp:205 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "U kolima" + +#: phonenumber.cpp:209 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:213 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Drugi" + +# >> @label Communication resource +#: phonenumber.cpp:226 +#, kde-format +msgid "Preferred Number" +msgstr "Poželjni broj" + +#: phonenumber.cpp:236 +#, kde-format +msgid "Work Fax" +msgstr "Poslovni faks" + +#: secrecy.cpp:111 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "javno" + +#: secrecy.cpp:114 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "privatno" + +#: secrecy.cpp:117 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "poverljivo" + +#: secrecy.cpp:120 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "nepoznato" diff --git a/po/sv/kcontacts5.po b/po/sv/kcontacts5.po new file mode 100644 index 0000000..9f67915 --- /dev/null +++ b/po/sv/kcontacts5.po @@ -0,0 +1,740 @@ +# translation of kabc.po to Swedish +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Stefan Asserhäll , 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 \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Postbox" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Utökad adressinformation" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Gata" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Plats" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "OmrÃ¥de" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Postnummer" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Land" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Leveransetikett" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Inrikes" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Internationell" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Post" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paket" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Hem" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Arbete" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Önskad adress" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Övriga" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Unik identifiering" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Namn" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Formaterat namn" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Efternamn" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Tilltalsnamn" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Andra namn" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Inledande titlar" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Efterföljande titlar" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Smeknamn" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Födelsedag" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Gatuadress hem" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Postboxadress hem" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Stadsadress hem" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Stat hem" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Postnummer hem" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Landsadress hem" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Adressetikett hem" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Gatuadress arbete" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Postboxadress arbete" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Stadsadress arbete" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Stat arbete" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Postnummer arbete" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Landsadress arbete" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Adressetikett arbete" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Hemtelefon" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Telefon arbete" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Mobiltelefon" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Hemtelefax" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Arbetsfax" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Biltelefon" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Personsökare" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-postadress" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-postklient" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Tidszon" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Geografisk plats" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Titel" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Roll" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Organisation" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Avdelning" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Anteckning" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Produktidentifiering" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Ändringsdatum" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sorteringsbegrepp" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Hemsida" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Säkerhetsklass" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logotyp" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Foto" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Ljud" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Fröken" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Herr" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Fru" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Professor" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Okänt fält" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Alla" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Vanlig" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adress" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-post" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Personligt" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Egen" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Odefinierad" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Egen" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Okänd typ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefonnummer" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Hem" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Arbete" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Meddelandetjänst" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Önskat" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Röst" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Fax" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Mobil" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "BrevlÃ¥da" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Bil" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Övriga" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Önskat nummer" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Arbetstelefax" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Öppen" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Privat" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Konfidentiell" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Okänd typ" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Föredragen" + +#~ msgid "List of Emails" +#~ msgstr "Lista med e-post" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Stefan Asserhäll" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "stefan.asserhall@bredband.net" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "Kan inte ladda resursen '%1'" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Välj adressat" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "Namn" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-post" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Markerad" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Avmarkera" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Anpassa distributionslistor" + +#~ msgid "Select Email Address" +#~ msgstr "Välj e-postadress" + +#~ msgid "Email Addresses" +#~ msgstr "E-postadresser" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Nej" + +#~ msgid "New List..." +#~ msgstr "Ny lista..." + +#~ msgid "Rename List..." +#~ msgstr "Byt namn pÃ¥ lista..." + +#~ msgid "Remove List" +#~ msgstr "Ta bort lista" + +#~ msgid "Available addresses:" +#~ msgstr "Tillgängliga adresser:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Önskad e-post" + +#~ msgid "Add Entry" +#~ msgstr "Lägg till post" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-post" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Använd önskad" + +#~ msgid "Change Email..." +#~ msgstr "Ändra e-post..." + +#~ msgid "Remove Entry" +#~ msgstr "Ta bort post" + +#~ msgid "New Distribution List" +#~ msgstr "Ny distributionslista" + +#~ msgid "Please enter &name:" +#~ msgstr "Ange &namn:" + +#~ msgid "Distribution List" +#~ msgstr "Distributionslista" + +#~ msgid "Please change &name:" +#~ msgstr "Ändra &namn:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "Ta bort distributionslistan '%1'?" + +#~ msgid "Selected addressees:" +#~ msgstr "Valda adressater:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "Valda adresser i '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Nej" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard-format" + +#~ msgid "No description available." +#~ msgstr "Ingen beskrivning tillgänglig." + +#~ msgid "Unable to open lock file." +#~ msgstr "Kan inte öppna lÃ¥sfil." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "Resursen '%1' är lÃ¥st av programmet '%2'." + +#~ msgid "Error" +#~ msgstr "Fel" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "UpplÃ¥sning misslyckades. LÃ¥sfilen ägs av en annan process: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: Alla lÃ¥s lyckas, men ingen verklig lÃ¥sning görs." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Alla lÃ¥s misslyckas." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "Misslyckades ladda resursen '%1'." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "Misslyckades spara resursen '%1'." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "Kan inte öppna resursen '%1'." + +#~ msgid "Default Address Book" +#~ msgstr "Förvald adressbok" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "Kan inte spara till resursen '%1' eftersom den är lÃ¥st." diff --git a/po/tg/kcontacts5.po b/po/tg/kcontacts5.po new file mode 100644 index 0000000..43c4690 --- /dev/null +++ b/po/tg/kcontacts5.po @@ -0,0 +1,584 @@ +# Copyright (C) YEAR This file is copyright: +# This file is distributed under the same license as the kcontacts package. +# +# Victor Ibragimov , 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 \n" +"Language-Team: English \n" +"Language: tg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Lokalize 19.04.3\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Нишонии почта" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Маълумоти васеъшудаи нишонӣ" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Кӯча" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Маҳал" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Ноҳия" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Рамзи почта" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Кишвар" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Тамғаи таҳвил" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Дохилӣ" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Байналмилалӣ" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Почтаӣ" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Бӯғча" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Хонагӣ" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Корӣ" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Нишонии пазируфта" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Дигар" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Рақами мушаххас" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ном" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Номи пурра" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Насаб" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Номи падар" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Номҳои иловагӣ" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Пешванди номи бошараф" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Пасванди номи бошараф" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Тахаллус" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Зодрӯз" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Кӯчаи нишонии хонагӣ" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Нишонии почта (Нишонии хонагӣ)" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Шаҳри нишонии хонагӣ" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Ноҳияи нишонии хонагӣ" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Рамзи почтаи нишонии хонагӣ" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Кишвари нишонии хонагӣ" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Тамғаи нишонии хонагӣ" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Кӯчаи нишонии корӣ" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Нишонии почта (Нишонии корӣ)" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Шаҳри нишонии корӣ" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Ноҳияи нишонии корӣ" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Рамзи почтаи нишонии корӣ" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Кишвари нишонии корӣ" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Тамғаи нишонии корӣ" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Рақами телефони хонагӣ" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Рақами телефони корӣ" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Рақами телефони дастӣ" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Факси хонагӣ" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Факси корӣ" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Телефони мошинӣ" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Пейҷер" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Нишонии почтаи электронӣ" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Мизоҷи почта" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Минтақаи вақт" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Мавқеи ҷуғрофӣ" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Унвон" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Вазифа" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Ташкилот" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Шуъба" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Тавзеҳ" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Рақами мушаххаси маҳсул" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Санаи тафтиш" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Мураттабсозӣ" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Сомона" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Дараҷаи амният" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Тамға" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Сурат" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Овоз" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Доктор" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Хонум" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Раис" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Раиса" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Бону" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Профессор" + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Хурд" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Ҷаноб" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Сатри номаълум" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Ҳама" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Оддӣ" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Нишонӣ" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Почтаи электронӣ" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Шахсӣ" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Фармоишӣ" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Номуайян" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Фармоишӣ" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Навъи номаълум" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Рақами телефон" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Хонагӣ" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Корӣ" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Паёмнависӣ" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Пазируфта" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Овозӣ" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Дастӣ" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Видеоӣ" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Қутти почта" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Модем" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Мошинӣ" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Дигар" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Рақами пазируфта" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Факси корӣ" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Ҷамъиятӣ" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Шахсӣ" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Махфӣ" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Навъи номаълум" diff --git a/po/th/kcontacts5.po b/po/th/kcontacts5.po new file mode 100644 index 0000000..35d5a15 --- /dev/null +++ b/po/th/kcontacts5.po @@ -0,0 +1,744 @@ +# translation of kabc.po to Thai +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Thanomsub Noppaburana , 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 \n" +"Language-Team: Thai \n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "ตู้ไปรษณีย์" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "ข้อมูลที่อยู่เพิ่มเติม" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "ถนน" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "แขวง/ตำบล" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "เขต/อำเภอ" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "รหัสไปรษณีย์" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "ประเทศ" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "ป้ายจัดส่ง" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "ในประเทศ" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "ต่างประเทศ" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "ไปรษณีย์" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "ที่จัดส่งพัสดุ" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "ที่บ้าน" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "ที่ทำงาน" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "ที่อยู่ที่ควรใช้" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "อื่น ๆ" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "ชื่อ" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "ชื่อตามรูปแบบ" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "นามสกุล" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "ชื่อจริง" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "ชื่อเล่น" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "วันเกิด" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "ที่อยู่ที่บ้าน" + +#: addressee.cpp:873 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Home Address Post Office Box" +msgstr "ตู้ไปรษณีย์" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Home Address State" +msgstr "ที่อยู่อีเมล" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, fuzzy, kde-format +#| msgid "Email Addresses" +msgid "Home Address Label" +msgstr "ที่อยู่อีเมล" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, fuzzy, kde-format +#| msgid "Post Office Box" +msgid "Business Address Post Office Box" +msgstr "ตู้ไปรษณีย์" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "โทรศัพท์ที่บ้าน" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "โทรศัพท์ภาคธุรกิจ" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "โทรศัพท์เคลื่อนที่" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "โทรสารที่บ้าน" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "โทรสารภาคธุรกิจ" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "โทรศัพท์ติดรถยนตร์" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "หมายเลข ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "เพจเจอร์" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "ที่อยู่อีเมล" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "โปรแกรมรับส่งอีเมล" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "เขตเวลา" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "ตำแหน่งพิกัดทางภูมิศาสตร์" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "ตำแหน่ง" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "บทบาทหน้าที่" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "องค์กร" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "แผนก" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "บันทึกย่อ" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "ค่าประจำตัวผลิตภัณฑ์" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "วันที่ปรับปรุงใหม่" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "เรียงลำดับข้อความ" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "หน้าเว็บหลัก" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "ระดับความปลอดภัย" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "โลโก้" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "ภาพถ่าย" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "เสียง" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "ดร." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "นางสาว" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "นาย" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "นาง" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "น.ส." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "ศ." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "ด.ช." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "ด.ช." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "ช่องข้อมูลที่ไม่รู้จัก" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "ทั้งหมด" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "ความถี่" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "ที่อยู่" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "อีเมล" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "ส่วนบุคคล" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "กำหนดเอง" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "ยังไม่กำหนด" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "แบบ X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "แบบ PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "กำหนดเอง" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "ไม่ทราบประเภท" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "ที่บ้าน" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "ที่ทำงาน" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "ข้อความด่วนทันใจ" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "ที่ควรใช้" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "เสียง" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "โทรสาร" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "โทรศัพท์เคลื่อนที่" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "โทรศัพท์ภาพ" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "กล่องจดหมาย" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "โมเด็ม" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "โทรศัพท์ติดรถยนต์" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "หมายเลข PCT" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "อื่น ๆ" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "หมายเลขที่ควรใช้" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "โทรสารที่ทำงาน" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "สาธารณะ" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "ส่วนบุคคล" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "ชั้นความลับ" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "ไม่ทราบประเภท" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "ที่ควรใช้" + +#~ msgid "List of Emails" +#~ msgstr "รายการอีเมล" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "ถนอมทรัพย์ นพบูรณ์" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "donga.nb@gmail.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "ไม่สามารถโหลดทรัพยากร '%1' ได้" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "เลือกที่อยู่" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "ชื่อ" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "อีเมล" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "ที่เลือก" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "ไม่เลือก" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "ปรับแต่งรายการผู้รวบรวมแจกจ่าย" + +#~ msgid "Select Email Address" +#~ msgstr "เลือกที่อยู่อีเมล" + +#~ msgid "Email Addresses" +#~ msgstr "ที่อยู่อีเมล" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "ใช่" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "ไม่" + +#~ msgid "New List..." +#~ msgstr "รายการใหม่..." + +#~ msgid "Rename List..." +#~ msgstr "เปลี่ยนชื่อรายการ..." + +#~ msgid "Remove List" +#~ msgstr "ลบรายการ" + +#~ msgid "Available addresses:" +#~ msgstr "ที่อยู่ที่มีอยู่:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "อีเมลที่ควรใช้" + +#~ msgid "Add Entry" +#~ msgstr "เพิ่มข้อมูล" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "อีเมล" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "ใช้ที่ควรใช้" + +#~ msgid "Change Email..." +#~ msgstr "แก้ไขอีเมล..." + +#~ msgid "Remove Entry" +#~ msgstr "ลบข้อมูล" + +#~ msgid "New Distribution List" +#~ msgstr "รายการผู้รวบรวมแจกจ่ายใหม่" + +#~ msgid "Please enter &name:" +#~ msgstr "โปรดกรอกชื่อ:" + +#~ msgid "Distribution List" +#~ msgstr "รายการผู้รวบรวมแจกจ่าย" + +#~ msgid "Please change &name:" +#~ msgstr "โปรดแก้ไขชื่อ:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "ต้องการลบรายการผู้รวบรวมแจกจ่าย '%1' ?" + +#~ msgid "Selected addressees:" +#~ msgstr "ที่อยู่ที่เลือกไว้:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "ที่อยู่ที่เลือกใน '%1':" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "ไม่" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "รูปแบบ vCard" + +#~ msgid "No description available." +#~ msgstr "ไม่มีข้อมูลรายละเอียด" + +#~ msgid "Unable to open lock file." +#~ msgstr "ไม่สามารถเปิดแฟ้มล็อคได้" + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "ทรัพยากร '%1' ถูกล็อคโดยแอพพลิเคชัน '%2'" + +#~ msgid "Error" +#~ msgstr "ผิดพลาด" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "การปลดล็อคล้มเหลว แฟ้มล็อคเป็นของโพรเซสอื่น: %1 (%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: การล็อคทั้งหมดสำเร็จ แต่ไม่มีการล็อคจริงเกิดขึ้น" + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: การล็อคทั้งหมดล้มเหลว" + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "ล้มเหลวในการโหลดทรัพยากร '%1'" + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "ล้มเหลวในการบันทึกทรัพยากร '%1'" + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "ไม่สามารถเปิดทรัพยากร '%1' ได้" + +#~ msgid "Default Address Book" +#~ msgstr "สมุดที่อยู่ปริยาย" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "ไม่สามารถบันทึกทรัพยากร '%1' ได้ เนื่องจากมันถูกล็อคอยู่" diff --git a/po/tr/kcontacts5.po b/po/tr/kcontacts5.po new file mode 100644 index 0000000..3001e9a --- /dev/null +++ b/po/tr/kcontacts5.po @@ -0,0 +1,746 @@ +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# H. İbrahim Güngör , 2010. +# obsoleteman , 2008-2009. +# Volkan Gezer , 2013-2014, 2017. +# Kaan Ozdincer , 2014. +# Emir SARI , 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 \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Lokalize 21.12.3\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Posta Kutusu" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Genişletilmiş Adres Bilgisi" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Cadde" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Semt" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Bölge" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Posta Kodu" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Ülke" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Dağıtım Etiketi" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Yerel" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Uluslararası" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Posta" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Paket" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Ev" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "İş" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Tercih Edilen Adres" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Diğer" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Özgün Tanımlayıcı" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ad" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Biçimlendirilmiş Ad" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Soyad" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Verilen Ad" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Ek Adlar" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Unvan Önekleri" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Unvan Sonekleri" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Takma Ad" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "Doğum Günü" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Ev Adresi Cadde" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Ev Adresi Posta Kutusu" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Ev Adresi Şehir" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Ev Adresi Eyalet" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Ev Adresi Posta Kodu" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Ev Adresi Ülke" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Ev Adresi Etiketi" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "İş Adresi Cadde" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "İş Adresi Posta Kutusu" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "İş Adresi Şehir" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "İş Adresi Eyalet" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "İş Adresi Posta Kodu" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "İş Adresi Ülke" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "İş Adresi Etiketi" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Ev Telefonu" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "İş Telefonu" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Cep Telefonu" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Ev Faksı" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "İş Faks Numarası" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Araç Telefonu" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Çağrı Aygıtı" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "E-posta Adresi" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "E-posta İstemcisi" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Zaman Dilimi" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Coğrafi Konum" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Başlık" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Unvan" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Kurum" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Bölüm" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Not" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Ürün Tanımlayıcı" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Değiştirilme Tarihi" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Sıralama Dizisi" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Anasayfa" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Güvenlik Sınıfı" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Logo" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Fotoğraf" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Ses" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Bayan" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Bay" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Bayan" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Bayan" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Bilinmeyen Alan" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Tümü" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Sık Sık" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Adres" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "E-posta" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Kişisel" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Özel" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Tanımlanmamış" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Özel" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Bilinmeyen tür" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Telefon numarası" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Ev" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "İş" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Anında İletileşme" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Tercih Edilen" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Ses" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Faks" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Cep" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Video" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Posta Kutusu" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Araba" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Diğer" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Tercih Edilen Numara" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "İş Faksı" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Genel" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Özel" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Güvenilir" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Bilinmeyen tür" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Tercih Edilen" + +#~ msgid "List of Emails" +#~ msgstr "E-postaların Listesi" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "Serdar Soytetir" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "tulliana@gmail.com" + +#~ msgid "Unable to load resource '%1'" +#~ msgstr "'%1' kaynağı yüklenemedi" + +#~ msgctxt "@title:window" +#~ msgid "Select Addressee" +#~ msgstr "Adres Seç" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "İsim" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "E-posta" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "Seç" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "Seçme" + +#~ msgid "Configure Distribution Lists" +#~ msgstr "Dağıtım Listesini Yapılandır" + +#~ msgid "Select Email Address" +#~ msgstr "E-posta Adresini Seç" + +#~ msgid "Email Addresses" +#~ msgstr "E-posta Adresleri" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "Evet" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "Hayır" + +#~ msgid "New List..." +#~ msgstr "Yeni Liste..." + +#~ msgid "Rename List..." +#~ msgstr "Listeyi Yeniden Adlandır..." + +#~ msgid "Remove List" +#~ msgstr "Listeyi Kaldır" + +#~ msgid "Available addresses:" +#~ msgstr "Kullanılabilir adresler:" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Preferred Email" +#~ msgstr "Tercih Edilen E-posta" + +#~ msgid "Add Entry" +#~ msgstr "Girdi Ekle" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "E-posta" + +#~ msgctxt "@title:column use preferred email" +#~ msgid "Use Preferred" +#~ msgstr "Tercih Edileni Kullan" + +#~ msgid "Change Email..." +#~ msgstr "E-postayı Değiştir..." + +#~ msgid "Remove Entry" +#~ msgstr "Girdiyi Kaldır" + +#~ msgid "New Distribution List" +#~ msgstr "Yeni Dağıtım Listesi" + +#~ msgid "Please enter &name:" +#~ msgstr "Lütfen ismi giri&n:" + +#~ msgid "Distribution List" +#~ msgstr "Dağıtım Listesi" + +#~ msgid "Please change &name:" +#~ msgstr "Lütfen ismi değiştiri&n:" + +#~ msgid "Delete distribution list '%1'?" +#~ msgstr "'%1' dağıtım listesi silinsin mi?" + +#~ msgid "Selected addressees:" +#~ msgstr "Seçilen adresler:" + +#~ msgid "Selected addresses in '%1':" +#~ msgstr "'%1' içerisinden seçilen adresler:" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "Hayır" + +#~ msgid "vCard" +#~ msgstr "vCard" + +#~ msgid "vCard Format" +#~ msgstr "vCard Biçimi" + +#~ msgid "No description available." +#~ msgstr "Açıklama yok." + +#~ msgid "Unable to open lock file." +#~ msgstr "Kilit dosyası açılamadı." + +#~ msgid "The resource '%1' is locked by application '%2'." +#~ msgstr "'%1' kaynağı '%2' uygulaması tarafından kilitlenmiş." + +#~ msgid "Error" +#~ msgstr "Hata" + +#~ msgid "Unlock failed. Lock file is owned by other process: %1 (%2)" +#~ msgstr "" +#~ "Kilidi açma işlemi başarısız oldu. Kilit dosyası başka bir sürece ait: %1 " +#~ "(%2)" + +#~ msgid "LockNull: All locks succeed but no actual locking is done." +#~ msgstr "LockNull: Tüm kilitler başarılı hiç gerçek kilitleme yapılamadı." + +#~ msgid "LockNull: All locks fail." +#~ msgstr "LockNull: Tüm kilitler başarısız." + +#~ msgid "Loading resource '%1' failed." +#~ msgstr "'%1' kaynağı yüklenemedi." + +#~ msgid "Saving resource '%1' failed." +#~ msgstr "'%1' kaynağı kaydedilemedi." + +#~ msgid "Unable to open resource '%1'." +#~ msgstr "'%1' kaynağı açılamadı." + +#~ msgid "Default Address Book" +#~ msgstr "Öntanımlı Adres Defteri" + +#~ msgid "Unable to save to resource '%1'. It is locked." +#~ msgstr "'%1' kaynağı kaydedilemedi. Kilitli." diff --git a/po/ug/kcontacts5.po b/po/ug/kcontacts5.po new file mode 100644 index 0000000..bebc5e5 --- /dev/null +++ b/po/ug/kcontacts5.po @@ -0,0 +1,652 @@ +# Uyghur translation for kabc. +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# Sahran , 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 \n" +"Language-Team: Uyghur Computer Science Association \n" +"Language: ug\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Post Office Box" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "كوچا" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "ئورۇن" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "رايون" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "دۆلەت" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "خەلقئارا" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "ماكان" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "ئىش" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "ئامراق ئادرېس" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "باشقا" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "ئاتى" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "تەگات" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "بېرىلگەن ئاتى" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "لەقىمى" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "تۇغۇلغان كۈن" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "ئوي ئادرېسى ئەنى" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "ئۆي تېلېفون" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "شىركەت تېلېفون" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "يانفون" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "ئوي فاكىسى" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "خىزمەت فاكىس" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "ماشىنا تېلېفونى" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "چاقىرغۇ" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "ئېلخەت ئادرېسلىرى" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "خەت خېرىدارى" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "ۋاقىت رايونى" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "ماۋزۇ" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "رول" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "ئورگان" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "تارماق" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "ئىزاھات" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "باش بەت" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "تۇغ" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "سۈرەت" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "ئاۋاز" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "دوكتور" + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "خانقىز" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "ئەپەندى" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "خانىم" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "خانىم" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "ئەۋلاد" + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "ئەجداد" + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "ھەممىسى" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "دائىم" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "ئادرېس" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "ئېلخەت" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "شەخسىي" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "ئىختىيارى" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "ئېنىقلىمىسىز" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "ئىختىيارى" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "نامەلۇم تىپ" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "ماكان" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "ئىش" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "مۇڭداشقۇ" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "1-تاللاش تۈرى" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "ئاۋاز" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "فاكىس" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "يانفون" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "سىن" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "خەت ساندۇقى" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "مودېم" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "ماشىنا" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "باشقا" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "خىزمەتتىكى فاكىس" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "ئاممىۋى" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "شەخسىي" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "مەخپىي" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "نامەلۇم تىپ" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "1-تاللاش تۈرى" + +#~ msgctxt "NAME OF TRANSLATORS" +#~ msgid "Your names" +#~ msgstr "ئابدۇقادىر ئابلىز, غەيرەت كەنجى" + +#~ msgctxt "EMAIL OF TRANSLATORS" +#~ msgid "Your emails" +#~ msgstr "sahran.ug@gmail.com, gheyret@gmail.com" + +#~ msgctxt "@title:column addressee name" +#~ msgid "Name" +#~ msgstr "ئاتى" + +#~ msgctxt "@title:column addressee email" +#~ msgid "Email" +#~ msgstr "ئېلخەت" + +#~ msgctxt "@title:group selected addressees" +#~ msgid "Selected" +#~ msgstr "تاللانغان" + +#~ msgctxt "@action:button unselect addressee" +#~ msgid "Unselect" +#~ msgstr "تاللىما" + +#~ msgid "Email Addresses" +#~ msgstr "ئېلخەت ئادرېسلىرى" + +#~ msgctxt "this the preferred email address" +#~ msgid "Yes" +#~ msgstr "ھەئە" + +#~ msgctxt "this is not the preferred email address" +#~ msgid "No" +#~ msgstr "ياق" + +#~ msgid "New List..." +#~ msgstr "يېڭى تىزىم…" + +#~ msgid "Remove List" +#~ msgstr "تىزىمنى چىقىرىۋېتىش" + +#~ msgid "Add Entry" +#~ msgstr "كىرگۈ قوش" + +#~ msgctxt "@title:column addressee preferred email" +#~ msgid "Email" +#~ msgstr "ئېلخەت" + +#~ msgid "Remove Entry" +#~ msgstr "تۈرنى چىقىرىۋەت" + +#~ msgid "New Distribution List" +#~ msgstr "يېڭى تارقىتىلما تىزىمى" + +#~ msgctxt "this is not preferred email address" +#~ msgid "No" +#~ msgstr "ياق" + +#~ msgid "No description available." +#~ msgstr "چۈشەندۈرۈشى يوق." + +#~ msgid "Error" +#~ msgstr "خاتالىق" diff --git a/po/uk/kcontacts5.po b/po/uk/kcontacts5.po new file mode 100644 index 0000000..fe345c3 --- /dev/null +++ b/po/uk/kcontacts5.po @@ -0,0 +1,594 @@ +# Translation of kcontacts5.po to Ukrainian +# Copyright (C) 2018 This_file_is_part_of_KDE +# This file is distributed under the license LGPL version 2.1 or +# version 3 or later versions approved by the membership of KDE e.V. +# +# Yuri Chornoivan , 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 \n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 1.5\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "Абонентська скринька" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "Додаткова інформація про адресу" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "Вулиця" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "Район" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "Область" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "Поштовий код" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "Країна" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "Надпис доставки" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "Домашня" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "Міжнародна" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "Поштова" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "Для посилок" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "Домашня" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "Робоча" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "Головна адреса" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "Інша" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "Унікальний ідентифікатор" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "Ім’я" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "Форматоване ім’я" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "Прізвище" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "Ім'я" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "Додаткові імена" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "Почесні префікси" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "Почесні суфікси" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "Псевдонім" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "День народження" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "Домашня адреса (вулиця)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "Абонентська скринька домашньої адреси" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "Домашня адреса (місто)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "Домашня адреса (область)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "Домашня адреса (поштовий код)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "Домашня адреса (країна)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "Домашня адреса (мітка)" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "Робоча адреса (вулиця)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "Абонентська скринька робочої адреси" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "Робоча адреса (місто)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "Робоча адреса (область)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "Робоча адреса (поштовий код)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "Робоча адреса (країна)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "Робоча адреса (мітка)" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "Домашній телефон" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "Робочий телефон" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "Мобільний телефон" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "Домашній факс" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "Робочий факс" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "Автомобільний телефон" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "Пейджер" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "Адреса ел. пошти" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "Поштовий клієнт" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "Часовий пояс" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "Географічне розташування" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "Титул" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "Посада" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "Установа" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "Відділ" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "Примітка" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "Ідентифікатор продукту" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "Дата модифікації" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "Рядок сорту" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "Домашня сторінка" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "Клас безпеки" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "Логотип" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "Фото" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "Звук" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Др." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "панна" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "пан" + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "пані" + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "пані" + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Проф." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Мол." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Ст." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "Невідоме поле" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "Всі" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "Часті" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "Адреса" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "Ел. пошта" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "Особисті" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "Нетипові" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "Не визначено" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "Нетиповий" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "Невідомий тип" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "Номер телефону" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "Домашній" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "Робочий" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "Кур'єр" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "Головний" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "Голос" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "Факс" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "Мобільний" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "Відео" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "Поштова скринька" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Модем" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "Автомобільний" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "Інший" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "Головний номер" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "Робочий факс" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "Публічний" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "Особистий" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "Конфіденційний" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "Невідомий тип" + +#~ msgctxt "Preferred address" +#~ msgid "Preferred" +#~ msgstr "Головна" + +#~ msgid "List of Emails" +#~ msgstr "Список адрес ел. пошти" diff --git a/po/zh_CN/kcontacts5.po b/po/zh_CN/kcontacts5.po new file mode 100644 index 0000000..1b76efe --- /dev/null +++ b/po/zh_CN/kcontacts5.po @@ -0,0 +1,584 @@ +msgid "" +msgstr "" +"Project-Id-Version: kdeorg\n" +"Report-Msgid-Bugs-To: https://bugs.kde.org\n" +"POT-Creation-Date: 2022-02-27 00:41+0000\n" +"PO-Revision-Date: 2023-01-12 10:30\n" +"Last-Translator: \n" +"Language-Team: Chinese Simplified\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: kdeorg\n" +"X-Crowdin-Project-ID: 269464\n" +"X-Crowdin-Language: zh-CN\n" +"X-Crowdin-File: /kf5-trunk/messages/kcontacts/kcontacts5.pot\n" +"X-Crowdin-File-ID: 10972\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "邮局邮箱" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "扩展地址信息" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "街道" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "位置" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "地域" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "邮政编码" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "国家" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "邮递标签" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "国内" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "国际" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "邮局" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "包裹" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "家庭" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "办公" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "首选地址" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "其他" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "唯一标识符" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "名字" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "格式化姓名" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "姓氏" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "姓名" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "其他姓名" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "敬称前缀" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "敬称后缀" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "昵名" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "生日" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "居住地址(街道)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "住宅邮局邮箱" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "居住地址(城市)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "居住地址(区域)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "居住地址(邮编)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "居住地址(国家)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "居住地址(标志)" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "办公地址(街道)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "办公地址邮局信箱" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "办公地址(城市)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "办公地址(地区)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "办公地址(邮编)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "办公地址(城市)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "办公地址(标签)" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "宅电" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "办公电话" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "移动电话" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "家庭传真" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "办公传真" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "汽车电话" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "寻呼机" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "电子邮件地址" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "邮件客户端" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "时区" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "地理位置" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "头衔" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "职务" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "组织" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "部门" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "备注" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "产品标识符" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "修订日期" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "排序字符串" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "主页" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "安全类别" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "徽标" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "照片" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "声音" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr." + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Mr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mrs." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "未知字段" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "全部" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "频繁" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "地址" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "电子邮件" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "个人" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "自定义" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "未定义" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "自定义" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "未知类型" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "电话号码" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "家庭" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "办公" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "信使" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "首选" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "语音" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "传真" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "手机" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "视频" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "邮箱" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "调制解调器" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "车载" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "其他" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "首选号码" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "办公传真" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "公共" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "个人" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "机密" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "未知类型" diff --git a/po/zh_TW/kcontacts5.po b/po/zh_TW/kcontacts5.po new file mode 100644 index 0000000..901c4a9 --- /dev/null +++ b/po/zh_TW/kcontacts5.po @@ -0,0 +1,587 @@ +# translation of kabc.po to Chinese Traditional +# Copyright (C) YEAR This_file_is_part_of_KDE +# This file is distributed under the same license as the PACKAGE package. +# +# Franklin Weng , 2007, 2008. +# Frank Weng (a.k.a. Franklin) , 2008, 2009. +# pan93412 , 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 \n" +"Language-Team: Chinese \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 2.0\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: address.cpp:223 +#, kde-format +msgid "Post Office Box" +msgstr "郵政信箱" + +#: address.cpp:239 +#, kde-format +msgid "Extended Address Information" +msgstr "延伸位址資訊" + +#: address.cpp:255 +#, kde-format +msgid "Street" +msgstr "街道" + +#: address.cpp:271 +#, kde-format +msgid "Locality" +msgstr "位置" + +#: address.cpp:287 +#, kde-format +msgid "Region" +msgstr "區域" + +#: address.cpp:303 +#, kde-format +msgid "Postal Code" +msgstr "郵遞區號" + +#: address.cpp:319 +#, kde-format +msgid "Country" +msgstr "國家" + +#: address.cpp:335 +#, kde-format +msgid "Delivery Label" +msgstr "傳送標籤" + +#: address.cpp:353 +#, kde-format +msgctxt "Address is in home country" +msgid "Domestic" +msgstr "家庭" + +#: address.cpp:355 +#, kde-format +msgctxt "Address is not in home country" +msgid "International" +msgstr "國際" + +#: address.cpp:357 +#, kde-format +msgctxt "Address for delivering letters" +msgid "Postal" +msgstr "郵局" + +#: address.cpp:359 +#, kde-format +msgctxt "Address for delivering packages" +msgid "Parcel" +msgstr "包裹" + +#: address.cpp:361 +#, kde-format +msgctxt "Home Address" +msgid "Home" +msgstr "住家" + +#: address.cpp:363 +#, kde-format +msgctxt "Work Address" +msgid "Work" +msgstr "工作" + +#: address.cpp:365 +#, kde-format +msgid "Preferred Address" +msgstr "預設位址" + +#: address.cpp:367 +#, kde-format +msgctxt "another type of address" +msgid "Other" +msgstr "其他" + +#: addressee.cpp:456 +#, kde-format +msgid "Unique Identifier" +msgstr "唯一身份" + +#: addressee.cpp:476 +#, kde-format +msgid "Name" +msgstr "名稱" + +#: addressee.cpp:672 +#, kde-format +msgid "Formatted Name" +msgstr "格式化名稱" + +#: addressee.cpp:692 +#, kde-format +msgid "Family Name" +msgstr "姓氏" + +#: addressee.cpp:712 +#, kde-format +msgid "Given Name" +msgstr "指定名稱" + +#: addressee.cpp:732 +#, kde-format +msgid "Additional Names" +msgstr "額外名稱" + +#: addressee.cpp:752 +#, kde-format +msgid "Honorific Prefixes" +msgstr "前置敬語" + +#: addressee.cpp:772 +#, kde-format +msgid "Honorific Suffixes" +msgstr "後置敬語" + +#: addressee.cpp:823 +#, kde-format +msgid "Nick Name" +msgstr "暱稱" + +#: addressee.cpp:863 +#, kde-format +msgid "Birthday" +msgstr "生日" + +#: addressee.cpp:868 +#, kde-format +msgid "Home Address Street" +msgstr "住家地址(街道)" + +#: addressee.cpp:873 +#, kde-format +msgid "Home Address Post Office Box" +msgstr "住家地址郵政信箱" + +#: addressee.cpp:878 +#, kde-format +msgid "Home Address City" +msgstr "住家地址(城市)" + +#: addressee.cpp:883 +#, kde-format +msgid "Home Address State" +msgstr "住家地址(省、州)" + +#: addressee.cpp:888 +#, kde-format +msgid "Home Address Zip Code" +msgstr "住家地址(郵遞區號)" + +#: addressee.cpp:893 +#, kde-format +msgid "Home Address Country" +msgstr "住家地址(國家)" + +#: addressee.cpp:898 +#, kde-format +msgid "Home Address Label" +msgstr "住家地址標籤" + +#: addressee.cpp:903 +#, kde-format +msgid "Business Address Street" +msgstr "辦公室地址(街道)" + +#: addressee.cpp:908 +#, kde-format +msgid "Business Address Post Office Box" +msgstr "辦公室地址郵政信箱" + +#: addressee.cpp:913 +#, kde-format +msgid "Business Address City" +msgstr "辦公室地址(城市)" + +#: addressee.cpp:918 +#, kde-format +msgid "Business Address State" +msgstr "辦公室地址(省、州)" + +#: addressee.cpp:923 +#, kde-format +msgid "Business Address Zip Code" +msgstr "辦公室地址(郵遞區號)" + +#: addressee.cpp:928 +#, kde-format +msgid "Business Address Country" +msgstr "辦公室地址(國家)" + +#: addressee.cpp:933 +#, kde-format +msgid "Business Address Label" +msgstr "辦公室地址標籤" + +#: addressee.cpp:938 +#, kde-format +msgid "Home Phone" +msgstr "住家電話" + +#: addressee.cpp:943 +#, kde-format +msgid "Business Phone" +msgstr "辦公室電話" + +#: addressee.cpp:948 +#, kde-format +msgid "Mobile Phone" +msgstr "行動電話" + +#: addressee.cpp:953 phonenumber.cpp:218 +#, kde-format +msgid "Home Fax" +msgstr "家用傳真" + +#: addressee.cpp:958 +#, kde-format +msgid "Business Fax" +msgstr "辦公室傳真" + +#: addressee.cpp:963 +#, kde-format +msgid "Car Phone" +msgstr "車上電話" + +#: addressee.cpp:968 phonenumber.cpp:194 +#, kde-format +msgid "ISDN" +msgstr "ISDN" + +#: addressee.cpp:973 phonenumber.cpp:198 +#, kde-format +msgid "Pager" +msgstr "呼叫器" + +#: addressee.cpp:978 +#, kde-format +msgid "Email Address" +msgstr "電子郵件地址" + +#: addressee.cpp:998 +#, kde-format +msgid "Mail Client" +msgstr "郵件處理程式" + +#: addressee.cpp:1018 +#, kde-format +msgid "Time Zone" +msgstr "時區" + +#: addressee.cpp:1038 +#, kde-format +msgid "Geographic Position" +msgstr "地理位置" + +#: addressee.cpp:1089 +#, kde-format +msgctxt "a person's title" +msgid "Title" +msgstr "職稱" + +#: addressee.cpp:1140 +#, kde-format +msgctxt "of a person in an organization" +msgid "Role" +msgstr "角色" + +#: addressee.cpp:1191 field.cpp:229 +#, kde-format +msgid "Organization" +msgstr "組織" + +#: addressee.cpp:1211 +#, kde-format +msgid "Department" +msgstr "部門" + +#: addressee.cpp:1231 +#, kde-format +msgid "Note" +msgstr "附註" + +#: addressee.cpp:1251 +#, kde-format +msgid "Product Identifier" +msgstr "產品識別" + +#: addressee.cpp:1271 +#, kde-format +msgid "Revision Date" +msgstr "版本日期" + +#: addressee.cpp:1291 +#, kde-format +msgid "Sort String" +msgstr "排序字串" + +#: addressee.cpp:1317 +#, kde-format +msgid "Homepage" +msgstr "首頁" + +#: addressee.cpp:1337 +#, kde-format +msgid "Security Class" +msgstr "安全類別" + +#: addressee.cpp:1357 +#, kde-format +msgid "Logo" +msgstr "圖標" + +#: addressee.cpp:1377 +#, kde-format +msgid "Photo" +msgstr "相片" + +#: addressee.cpp:1397 +#, kde-format +msgid "Sound" +msgstr "音效" + +#: addresseehelper.cpp:59 +#, kde-format +msgid "Dr." +msgstr "Dr. " + +#: addresseehelper.cpp:60 +#, kde-format +msgid "Miss" +msgstr "Miss" + +#: addresseehelper.cpp:61 +#, kde-format +msgid "Mr." +msgstr "Mr." + +#: addresseehelper.cpp:62 +#, kde-format +msgid "Mrs." +msgstr "Mrs." + +#: addresseehelper.cpp:63 +#, kde-format +msgid "Ms." +msgstr "Ms." + +#: addresseehelper.cpp:64 +#, kde-format +msgid "Prof." +msgstr "Prof." + +#: addresseehelper.cpp:66 +#, kde-format +msgid "I" +msgstr "I" + +#: addresseehelper.cpp:67 +#, kde-format +msgid "II" +msgstr "II" + +#: addresseehelper.cpp:68 +#, kde-format +msgid "III" +msgstr "III" + +#: addresseehelper.cpp:69 +#, kde-format +msgid "Jr." +msgstr "Jr." + +#: addresseehelper.cpp:70 +#, kde-format +msgid "Sr." +msgstr "Sr." + +#: field.cpp:206 +#, kde-format +msgid "Unknown Field" +msgstr "未知的欄位" + +#: field.cpp:219 +#, kde-format +msgid "All" +msgstr "全部" + +#: field.cpp:221 +#, kde-format +msgid "Frequent" +msgstr "頻繁" + +#: field.cpp:223 +#, kde-format +msgctxt "street/postal" +msgid "Address" +msgstr "地址" + +#: field.cpp:225 +#, kde-format +msgid "Email" +msgstr "電子郵件" + +#: field.cpp:227 +#, kde-format +msgid "Personal" +msgstr "個人" + +#: field.cpp:231 +#, kde-format +msgid "Custom" +msgstr "自訂" + +#: field.cpp:233 +#, kde-format +msgid "Undefined" +msgstr "未定義" + +#: key.cpp:198 +#, kde-format +msgctxt "X.509 public key" +msgid "X509" +msgstr "X509" + +#: key.cpp:201 +#, kde-format +msgctxt "Pretty Good Privacy key" +msgid "PGP" +msgstr "PGP" + +#: key.cpp:204 +#, kde-format +msgctxt "A custom key" +msgid "Custom" +msgstr "自訂" + +#: key.cpp:207 +#, kde-format +msgctxt "another type of encryption key" +msgid "Unknown type" +msgstr "未知的型態" + +#: phonenumber.cpp:170 +#, kde-format +msgctxt "Undefined phone type" +msgid "Telephone number" +msgstr "電話號碼" + +#: phonenumber.cpp:172 +#, kde-format +msgctxt "Home phone" +msgid "Home" +msgstr "住家" + +#: phonenumber.cpp:174 +#, kde-format +msgctxt "Work phone" +msgid "Work" +msgstr "工作" + +#: phonenumber.cpp:176 +#, kde-format +msgid "Messenger" +msgstr "即時訊息" + +#: phonenumber.cpp:178 +#, kde-format +msgctxt "Preferred phone" +msgid "Preferred" +msgstr "預設" + +#: phonenumber.cpp:180 +#, kde-format +msgid "Voice" +msgstr "語音" + +#: phonenumber.cpp:182 +#, kde-format +msgid "Fax" +msgstr "傳真" + +#: phonenumber.cpp:184 +#, kde-format +msgctxt "Mobile Phone" +msgid "Mobile" +msgstr "行動電話" + +#: phonenumber.cpp:186 +#, kde-format +msgctxt "Video phone" +msgid "Video" +msgstr "影像" + +#: phonenumber.cpp:188 +#, kde-format +msgid "Mailbox" +msgstr "郵政信箱" + +#: phonenumber.cpp:190 +#, kde-format +msgid "Modem" +msgstr "Modem" + +#: phonenumber.cpp:192 +#, kde-format +msgctxt "Car Phone" +msgid "Car" +msgstr "車用電話" + +#: phonenumber.cpp:196 +#, kde-format +msgid "PCS" +msgstr "PCS" + +#: phonenumber.cpp:200 +#, kde-format +msgctxt "another type of phone" +msgid "Other" +msgstr "其他" + +#: phonenumber.cpp:213 +#, kde-format +msgid "Preferred Number" +msgstr "預設號碼" + +#: phonenumber.cpp:223 +#, kde-format +msgid "Work Fax" +msgstr "工作傳真" + +#: secrecy.cpp:98 +#, kde-format +msgctxt "access is for everyone" +msgid "Public" +msgstr "公開" + +#: secrecy.cpp:101 +#, kde-format +msgctxt "access is by owner only" +msgid "Private" +msgstr "私人" + +#: secrecy.cpp:104 +#, kde-format +msgctxt "access is by owner and a controlled group" +msgid "Confidential" +msgstr "機密" + +#: secrecy.cpp:107 +#, kde-format +msgctxt "unknown secrecy type" +msgid "Unknown type" +msgstr "未知的型態" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..3a34c9c --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,224 @@ +add_library(KF5Contacts) +add_library(KF5::Contacts ALIAS KF5Contacts) + +target_sources(KF5Contacts PRIVATE + address.cpp + addressee.cpp + addressee.h + addresseehelper.cpp + addresseehelper.h + addresseelist.h + addressformat.cpp + addressformatparser.cpp + addressformatscript.cpp + addressformatter.cpp + address.h + calendarurl.cpp + calendarurl.h + clientpidmap.cpp + clientpidmap.h + contactgroup.cpp + contactgroup.h + contactgrouptool.cpp + contactgrouptool.h + converter/ldifconverter.cpp + converter/ldifconverter.h + converter/vcardconverter.cpp + converter/vcardconverter.h + email.cpp + email.h + field.cpp + fieldgroup.cpp + fieldgroup.h + field.h + gender.cpp + gender.h + geo.cpp + geo.h + impp.cpp + impp.h + key.cpp + key.h + lang.cpp + lang.h + ldif.cpp + ldif_p.h + namespace.cpp + nickname.cpp + nickname.h + note.cpp + note.h + org.cpp + org.h + parametermap_p.h + phonenumber.cpp + phonenumber.h + picture.cpp + picture.h + related.cpp + related.h + resourcelocatorurl.cpp + resourcelocatorurl.h + role.cpp + role.h + secrecy.cpp + secrecy.h + sound.cpp + sound.h + timezone.cpp + timezone.h + title.cpp + title.h + vcarddrag.cpp + vcarddrag.h + vcardparser/vcard.cpp + vcardparser/vcardline.cpp + vcardparser/vcardline_p.h + vcardparser/vcardparser.cpp + vcardparser/vcardparser_p.h + vcardparser/vcard_p.h + vcardtool.cpp + vcardtool_p.h + + + kcontacts.qrc + improtocols/improtocols.qrc +) + +ecm_qt_declare_logging_category(KF5Contacts + HEADER kcontacts_debug.h + IDENTIFIER KCONTACTS_LOG + CATEGORY_NAME kf.contacts + OLD_CATEGORY_NAMES log_kcontacts org.kde.pim.kcontacts + DESCRIPTION "KContacts" + EXPORT KCONTACTS +) + +ecm_generate_export_header(KF5Contacts + EXPORT_FILE_NAME kcontacts_export.h + BASE_NAME kcontacts + GROUP_BASE_NAME KF + VERSION ${KF_VERSION} + DEPRECATED_BASE_VERSION 0 + DEPRECATION_VERSIONS 5.88 5.89 5.92 + EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT} +) + +target_include_directories(KF5Contacts INTERFACE "$") +set(KContacts_BUILD_INCLUDE_DIRS + ${KContacts_SOURCE_DIR}/src + ${KContacts_BINARY_DIR}/src + ${KContacts_SOURCE_DIR}/src/vcardparser +) +target_include_directories(KF5Contacts PUBLIC "$") + +target_link_libraries(KF5Contacts +PUBLIC + Qt${QT_MAJOR_VERSION}::Core + Qt${QT_MAJOR_VERSION}::Gui +PRIVATE + KF5::CoreAddons + KF5::ConfigCore + KF5::I18n + KF5::I18nLocaleData + KF5::Codecs # for the vcard parser +) + +if (TARGET Qt6::Core5Compat) + target_link_libraries(KF5Contacts PRIVATE Qt6::Core5Compat) # QTextCodec +endif() + +set_target_properties(KF5Contacts PROPERTIES + VERSION ${KContacts_VERSION} + SOVERSION ${KContacts_SOVERSION} + EXPORT_NAME Contacts +) + +install(TARGETS KF5Contacts EXPORT KF5ContactsTargets ${KF_INSTALL_TARGETS_DEFAULT_ARGS}) + +ecm_generate_headers(KContacts_CamelCase_HEADERS + HEADER_NAMES + Address + AddressFormat + Addressee + AddresseeList + CalendarUrl + ContactGroup + ContactGroupTool + Email + Field + Geo + Gender + Key + Lang + Namespace + Impp + PhoneNumber + Picture + Related + ResourceLocatorUrl + Secrecy + Sound + TimeZone + Title + Role + Note + Org + NickName + VCardDrag + FieldGroup + ClientPidMap + PREFIX KContacts + REQUIRED_HEADERS KContacts_HEADERS +) + +add_subdirectory(converter) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/kcontacts_export.h + ${KContacts_HEADERS} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/kcontacts + COMPONENT Devel +) + +install(FILES + ${KContacts_CamelCase_HEADERS} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/KContacts + COMPONENT Devel +) + +ecm_qt_install_logging_categories( + EXPORT KCONTACTS + FILE kcontacts.categories + DESTINATION "${KDE_INSTALL_LOGGINGCATEGORIESDIR}" +) + +ecm_generate_pri_file(BASE_NAME KContacts LIB_NAME KF5Contacts DEPS "KCoreAddons" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts) +install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) + +if(BUILD_QCH) + ecm_add_qch( + KF5Contacts_QCH + NAME KContacts + BASE_NAME KF5Contacts + VERSION ${KContacts_VERSION} + ORG_DOMAIN org.kde + SOURCES # using only public headers, to cover only public API + ${KContacts_HEADERS} + "${CMAKE_SOURCE_DIR}/docs/AddressFormat.md" + MD_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md" + LINK_QCHS + Qt5Core_QCH + INCLUDE_DIRS + ${KContacts_BUILD_INCLUDE_DIRS} + BLANK_MACROS + KCONTACTS_EXPORT + "KCONTACTS_DEPRECATED_VERSION(x, y, t)" + "KCONTACTS_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)" + "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION(x, y, t)" + "KCONTACTS_ENUMERATOR_DEPRECATED_VERSION_BELATED(x, y, xt, yt, t)" + TAGFILE_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR} + QCH_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR} + COMPONENT Devel + ) +endif() diff --git a/src/Messages.sh b/src/Messages.sh new file mode 100644 index 0000000..98e3c3c --- /dev/null +++ b/src/Messages.sh @@ -0,0 +1,2 @@ +#! /usr/bin/env bash +$XGETTEXT *.cpp -o $podir/kcontacts5.pot diff --git a/src/address.cpp b/src/address.cpp new file mode 100644 index 0000000..7d227f8 --- /dev/null +++ b/src/address.cpp @@ -0,0 +1,456 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "address.h" +#include "addressformat.h" +#include "addressformatter_p.h" + +#include "kcontacts_debug.h" +#include +#include +#include +#include + +#include + +#include +#include + +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(static_cast(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 diff --git a/src/address.h b/src/address.h new file mode 100644 index 0000000..04391f8 --- /dev/null +++ b/src/address.h @@ -0,0 +1,414 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + 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 +#include +#include +#include + +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
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 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. + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 92, "Use KContacts::Address::formatted() instead") + QString formattedAddress(const QString &realName = QString(), const QString &orgaName = QString()) const; +#endif + + // note: cannot be called "formattedAddress" due to a collision + // with the property of that name in QML + /** + Returns this address formatted according to the country-specific + address formatting rules. The formatting rules applied depend on + either the addresses {@link #country country} field, or (if the + latter is empty) on the system country setting. + + @param style the formatting style variant to use + @param realName the formatted name of the contact + @param orgaName the name of the organization or company + @return the formatted address + @since 5.92 + */ + Q_REQUIRED_RESULT Q_INVOKABLE QString formatted(KContacts::AddressFormatStyle style, + const QString &realName = QString(), + const QString &orgaName = QString()) const; + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 89) + /** + Returns ISO code for a localized country name. Only localized country + names will be understood. + @param cname name of the country + @return two digit ISO code, empty string if the country was not + recognized + @deprecated since 5.88, use KCountry::fromName() instead. + Note that this function returned the ISO code incorrectly in lower case, + while KCountry does not do that. + */ + KCONTACTS_DEPRECATED_VERSION(5, 89, "Use KCountry::fromName()") + static QString countryToISO(const QString &cname); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 89) + /** + Returns a localized country name for a ISO code. + This might be replaced by a KLocale method in the future. + @param ISOname two digit ISO code + @return localized name of the country + @deprecated since 5.88, use KCountry::fromAlpha2() instead. + Note that this function returns @p ISOname if that is not a valid country code, + while KCountry will need an explicit check for that case. + */ + KCONTACTS_DEPRECATED_VERSION(5, 89, "Use KCountry::fromAlpha2()") + static QString ISOtoCountry(const QString &ISOname); +#endif + + static QString typeFlagLabel(TypeFlag type); + + /** + Set geographic position. + */ + void setGeo(const Geo &geo); + + /** + Return geographic position. + */ + Q_REQUIRED_RESULT Geo geo() const; + +private: + QString formattedPostalAddress() const; + + class Private; + QSharedDataPointer d; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(Address::Type) + +/** + Serializes the @p address object into the @p stream. +*/ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Address &address); + +/** + Initializes the @p address object from the @p stream. +*/ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Address &address); +} + +Q_DECLARE_METATYPE(KContacts::Address) + +#endif diff --git a/src/addressee.cpp b/src/addressee.cpp new file mode 100644 index 0000000..d9f9037 --- /dev/null +++ b/src/addressee.cpp @@ -0,0 +1,2766 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + SPDX-FileCopyrightText: 2003 Carsten Pfeiffer + SPDX-FileCopyrightText: 2005 Ingo Kloecker + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include +#include +#include +#include + +#include "kcontacts_debug.h" +#include + +#include "addressee.h" +#include "addresseehelper.h" +#include "field.h" +#include "parametermap_p.h" + +using namespace KContacts; + +static bool matchBinaryPattern(int value, int pattern); + +template +static bool listEquals(const QVector &list, const QVector &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::iterator findByName(const QString &qualifiedName) + { + return std::find_if(mCustomFields.begin(), mCustomFields.end(), [&qualifiedName](const CustomData &info) { + return info.name == qualifiedName; + }); + } + + std::vector::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 mCustomFields; + CalendarUrl::List mCalendarUrl; + Sound::List mSoundListExtra; + Picture::List mPhotoExtraList; + Picture::List mLogoExtraList; + ResourceLocatorUrl::List mUrlExtraList; + QVector 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 &urlList) +{ + d->mEmpty = false; + d->mSources = urlList; +} + +QVector 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 ¶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); + } +} + +void Addressee::setAddresses(const Address::List &addresses) +{ + d->mEmpty = false; + d->mAddresses = addresses; +} + +Address Addressee::address(Address::Type type) const +{ + Address address(type); + for (const Address &addr : d->mAddresses) { + if (matchBinaryPattern(addr.type(), type)) { + if (addr.type() & Address::Pref) { + return addr; + } else if (address.isEmpty()) { + address = addr; + } + } + } + + return address; +} + +Address::List Addressee::addresses() const +{ + return d->mAddresses; +} + +Address::List Addressee::addresses(Address::Type type) const +{ + Address::List list; + + std::copy_if(d->mAddresses.cbegin(), d->mAddresses.cend(), std::back_inserter(list), [type](const Address &addr) { + return matchBinaryPattern(addr.type(), type); + }); + + return list; +} + +Address Addressee::findAddress(const QString &id) const +{ + auto it = std::find_if(d->mAddresses.cbegin(), d->mAddresses.cend(), [&id](const Address &addr) { + return addr.id() == id; + }); + return it != d->mAddresses.cend() ? *it : Address{}; +} + +void Addressee::insertCategory(const QString &c) +{ + d->mEmpty = false; + + if (d->mCategories.contains(c)) { + return; + } + + d->mCategories.append(c); +} + +void Addressee::removeCategory(const QString &category) +{ + if (d->mCategories.contains(category)) { + d->mCategories.removeAll(category); + } +} + +bool Addressee::hasCategory(const QString &category) const +{ + return d->mCategories.contains(category); +} + +void Addressee::setCategories(const QStringList &c) +{ + d->mEmpty = false; + + d->mCategories = c; +} + +QStringList Addressee::categories() const +{ + return d->mCategories; +} + +void Addressee::insertMember(const QString &member) +{ + d->mEmpty = false; + + if (d->mMembers.contains(member)) { + return; + } + + d->mMembers.append(member); +} + +void Addressee::setMembers(const QStringList &m) +{ + d->mEmpty = false; + d->mMembers = m; +} + +QStringList Addressee::members() const +{ + return d->mMembers; +} + +void Addressee::insertRelationship(const Related &relation) +{ + d->mEmpty = false; + + if (d->mRelationships.contains(relation)) { + return; + } + + d->mRelationships.append(relation); +} + +void Addressee::setRelationships(const Related::List &c) +{ + d->mEmpty = false; + d->mRelationships = c; +} + +Related::List Addressee::relationships() const +{ + return d->mRelationships; +} + +static const auto VENDOR_ID = QStringLiteral("KADDRESSBOOK"); +static const auto X_ANNIVERSARY = QStringLiteral("X-Anniversary"); +static const auto X_ASSISTANTSNAME = QStringLiteral("X-AssistantsName"); +static const auto BLOGFEED = QStringLiteral("BlogFeed"); +static const auto X_MANAGERSNAME = QStringLiteral("X-ManagersName"); +static const auto X_OFFICE = QStringLiteral("X-Office"); +static const auto X_PROFESSION = QStringLiteral("X-Profession"); +static const auto X_SPOUSESNAME = QStringLiteral("X-SpousesName"); + +QDate Addressee::anniversary() const +{ + return QDate::fromString(custom(VENDOR_ID, X_ANNIVERSARY), Qt::ISODate); +} + +void Addressee::setAnniversary(const QDate &anniversary) +{ + if (anniversary.isValid()) { + insertCustom(VENDOR_ID, X_ANNIVERSARY, anniversary.toString(Qt::ISODate)); + } else { + removeCustom(VENDOR_ID, X_ANNIVERSARY); + } +} + +QString Addressee::assistantsName() const +{ + return custom(VENDOR_ID, X_ASSISTANTSNAME); +} + +void Addressee::setAssistantsName(const QString &assistantsName) +{ + if (!assistantsName.isEmpty()) { + insertCustom(VENDOR_ID, X_ASSISTANTSNAME, assistantsName); + } else { + removeCustom(VENDOR_ID, X_ASSISTANTSNAME); + } +} + +QUrl Addressee::blogFeed() const +{ + return QUrl(custom(VENDOR_ID, BLOGFEED)); +} + +void Addressee::setBlogFeed(const QUrl &blogFeed) +{ + if (!blogFeed.isEmpty()) { + insertCustom(VENDOR_ID, BLOGFEED, blogFeed.url()); + } else { + removeCustom(VENDOR_ID, BLOGFEED); + } +} + +QString Addressee::managersName() const +{ + return custom(VENDOR_ID, X_MANAGERSNAME); +} + +void Addressee::setManagersName(const QString &managersName) +{ + if (!managersName.isEmpty()) { + insertCustom(VENDOR_ID, X_MANAGERSNAME, managersName); + } else { + removeCustom(VENDOR_ID, X_MANAGERSNAME); + } +} + +QString Addressee::office() const +{ + return custom(VENDOR_ID, X_OFFICE); +} + +void Addressee::setOffice(const QString &office) +{ + if (!office.isEmpty()) { + insertCustom(VENDOR_ID, X_OFFICE, office); + } else { + removeCustom(VENDOR_ID, X_OFFICE); + } +} + +QString Addressee::profession() const +{ + return custom(VENDOR_ID, X_PROFESSION); +} + +void Addressee::setProfession(const QString &profession) +{ + if (!profession.isEmpty()) { + insertCustom(VENDOR_ID, X_PROFESSION, profession); + } else { + removeCustom(VENDOR_ID, X_PROFESSION); + } +} + +QString Addressee::spousesName() const +{ + return custom(VENDOR_ID, X_SPOUSESNAME); +} + +void Addressee::setSpousesName(const QString &spousesName) +{ + if (!spousesName.isEmpty()) { + insertCustom(VENDOR_ID, X_SPOUSESNAME, spousesName); + } else { + removeCustom(VENDOR_ID, X_SPOUSESNAME); + } +} + +void Addressee::insertCustom(const QString &app, const QString &name, const QString &value) +{ + if (value.isEmpty() || name.isEmpty() || app.isEmpty()) { + return; + } + + d->mEmpty = false; + + const QString qualifiedName = app + QLatin1Char('-') + name; + + auto it = d->findByName(qualifiedName); + if (it != d->mCustomFields.end()) { + it->value = value; + } else { + const CustomData newdata{qualifiedName, value}; + auto beforeIt = std::lower_bound(d->mCustomFields.begin(), d->mCustomFields.end(), newdata); + d->mCustomFields.insert(beforeIt, newdata); + } +} + +void Addressee::removeCustom(const QString &app, const QString &name) +{ + const QString qualifiedName = app + QLatin1Char('-') + name; + auto it = d->findByName(qualifiedName); + if (it != d->mCustomFields.end()) { + d->mCustomFields.erase(it); + } +} + +QString Addressee::custom(const QString &app, const QString &name) const +{ + const QString qualifiedName = app + QLatin1Char('-') + name; + auto it = d->findByName(qualifiedName); + return it != d->mCustomFields.cend() ? it->value : QString{}; +} + +void Addressee::setCustoms(const QStringList &customs) +{ + d->mEmpty = false; + + d->mCustomFields.clear(); + + // Less than 10 elements in "customs", we needn't use a set + QStringList seen; + for (const QString &custom : customs) { + const int index = custom.indexOf(QLatin1Char(':')); + if (index == -1) { + continue; + } + + const QString qualifiedName = custom.left(index); + const QString value = custom.mid(index + 1); + + if (!seen.contains(qualifiedName)) { + d->mCustomFields.push_back({qualifiedName, value}); + seen.push_back(qualifiedName); + } + } + std::sort(d->mCustomFields.begin(), d->mCustomFields.end()); +} + +QStringList Addressee::customs() const +{ + QStringList result; + result.reserve(d->mCustomFields.size()); + + static const QLatin1Char sep(':'); + for (const auto &[name, value] : d->mCustomFields) { + result << name + sep + value; + } + + return result; +} + +void Addressee::parseEmailAddress(const QString &rawEmail, QString &fullName, QString &email) +{ + // This is a simplified version of KPIM::splitAddress(). + + fullName.clear(); + email.clear(); + if (rawEmail.isEmpty()) { + return; // KPIM::AddressEmpty; + } + + // The code works on 8-bit strings, so convert the input to UTF-8. + QByteArray address = rawEmail.toUtf8(); + + QByteArray displayName; + QByteArray addrSpec; + QByteArray comment; + + // The following is a primitive parser for a mailbox-list (cf. RFC 2822). + // The purpose is to extract a displayable string from the mailboxes. + // Comments in the addr-spec are not handled. No error checking is done. + + enum sourceLevel { + TopLevel, + InComment, + InAngleAddress, + }; + sourceLevel context = TopLevel; + bool inQuotedString = false; + int commentLevel = 0; + bool stop = false; + + for (char *p = address.data(); *p && !stop; ++p) { + switch (context) { + case TopLevel: + switch (*p) { + case '"': + inQuotedString = !inQuotedString; + displayName += *p; + break; + case '(': + if (!inQuotedString) { + context = InComment; + commentLevel = 1; + } else { + displayName += *p; + } + break; + case '<': + if (!inQuotedString) { + context = InAngleAddress; + } else { + displayName += *p; + } + break; + case '\\': // quoted character + displayName += *p; + ++p; // skip the '\' + if (*p) { + displayName += *p; + } else { + // return KPIM::UnexpectedEnd; + goto ABORT_PARSING; + } + break; + case ',': + if (!inQuotedString) { + // if ( allowMultipleAddresses ) + // stop = true; + // else + // return KPIM::UnexpectedComma; + goto ABORT_PARSING; + } else { + displayName += *p; + } + break; + default: + displayName += *p; + } + break; + case InComment: + switch (*p) { + case '(': + ++commentLevel; + comment += *p; + break; + case ')': + --commentLevel; + if (commentLevel == 0) { + context = TopLevel; + comment += ' '; // separate the text of several comments + } else { + comment += *p; + } + break; + case '\\': // quoted character + comment += *p; + ++p; // skip the '\' + if (*p) { + comment += *p; + } else { + // return KPIM::UnexpectedEnd; + goto ABORT_PARSING; + } + break; + default: + comment += *p; + } + break; + case InAngleAddress: + switch (*p) { + case '"': + inQuotedString = !inQuotedString; + addrSpec += *p; + break; + case '>': + if (!inQuotedString) { + context = TopLevel; + } else { + addrSpec += *p; + } + break; + case '\\': // quoted character + addrSpec += *p; + ++p; // skip the '\' + if (*p) { + addrSpec += *p; + } else { + // return KPIM::UnexpectedEnd; + goto ABORT_PARSING; + } + break; + default: + addrSpec += *p; + } + break; + } // switch ( context ) + } + +ABORT_PARSING: + displayName = displayName.trimmed(); + comment = comment.trimmed(); + addrSpec = addrSpec.trimmed(); + fullName = QString::fromUtf8(displayName); + email = QString::fromUtf8(addrSpec); // check for errors + if (inQuotedString) { + return; // KPIM::UnbalancedQuote; + } + if (context == InComment) { + return; // KPIM::UnbalancedParens; + } + if (context == InAngleAddress) { + return; // KPIM::UnclosedAngleAddr; + } + + if (addrSpec.isEmpty()) { + if (displayName.isEmpty()) { + return; // KPIM::NoAddressSpec; + } else { + // addrSpec = displayName; + // displayName.truncate( 0 ); + // Address of the form "foo@bar" or "foo@bar (Name)". + email = fullName; + fullName = QString::fromUtf8(comment); + } + } + + email = email.toLower(); + + // Check that the full name is not enclosed in balanced double quotes. + // If it is then remove them. + const unsigned int len = fullName.length(); + if (len < 3) { // not long enough to be + return; + } + if (fullName.startsWith(QLatin1Char('"')) && fullName.endsWith(QLatin1Char('"'))) { + fullName = fullName.mid(1, len - 2); + } +} + +void Addressee::setChanged(bool value) +{ + d->mChanged = value; +} + +bool Addressee::changed() const +{ + return d->mChanged; +} + +QString Addressee::mimeType() +{ + return QStringLiteral("text/directory"); +} + +QDataStream &KContacts::operator<<(QDataStream &s, const Addressee &a) +{ + s << a.d->mUid; + + s << a.d->mName; + s << a.d->mFormattedName; + s << a.d->mFamilyName; + s << a.d->mGivenName; + s << a.d->mAdditionalName; + s << a.d->mPrefix; + s << a.d->mSuffix; + s << a.d->mBirthday; + s << a.d->mBirthdayWithTime; + s << a.d->mMailer; + s << a.d->mTimeZone; + s << a.d->mGeo; + s << a.d->mDepartment; + s << a.d->mNote; + s << a.d->mProductId; + s << a.d->mRevision; + s << a.d->mSortString; + s << a.d->mSecrecy; + s << a.d->mLogo; + s << a.d->mPhoto; + s << a.d->mSound; + s << a.d->mPhoneNumbers; + s << a.d->mAddresses; + s << a.d->mEmails; + s << a.d->mCategories; + s << a.customs(); + s << a.d->mKeys; + s << a.d->mLangs; + s << a.d->mGender; + s << a.d->mKind; + s << a.d->mCalendarUrl; + s << a.d->mSoundListExtra; + s << a.d->mPhotoExtraList; + s << a.d->mLogoExtraList; + s << a.d->mUrlExtraList; + s << a.d->mMembers; + s << a.d->mRelationships; + s << a.d->mSources; + s << a.d->mImpps; + s << a.d->mFieldGroupList; + s << a.d->mTitleExtraList; + s << a.d->mRoleExtraList; + s << a.d->mOrgExtraList; + s << a.d->mNickNameExtraList; + s << a.d->mClientPidMapList; + + return s; +} + +QDataStream &KContacts::operator>>(QDataStream &s, Addressee &a) +{ + s >> a.d->mUid; + + s >> a.d->mName; + s >> a.d->mFormattedName; + s >> a.d->mFamilyName; + s >> a.d->mGivenName; + s >> a.d->mAdditionalName; + s >> a.d->mPrefix; + s >> a.d->mSuffix; + s >> a.d->mBirthday; + s >> a.d->mBirthdayWithTime; + s >> a.d->mMailer; + s >> a.d->mTimeZone; + s >> a.d->mGeo; + s >> a.d->mDepartment; + s >> a.d->mNote; + s >> a.d->mProductId; + s >> a.d->mRevision; + s >> a.d->mSortString; + s >> a.d->mSecrecy; + s >> a.d->mLogo; + s >> a.d->mPhoto; + s >> a.d->mSound; + s >> a.d->mPhoneNumbers; + s >> a.d->mAddresses; + s >> a.d->mEmails; + s >> a.d->mCategories; + QStringList customFields; + s >> customFields; + a.setCustoms(customFields); + s >> a.d->mKeys; + s >> a.d->mLangs; + s >> a.d->mGender; + s >> a.d->mKind; + s >> a.d->mCalendarUrl; + s >> a.d->mSoundListExtra; + s >> a.d->mPhotoExtraList; + s >> a.d->mLogoExtraList; + s >> a.d->mUrlExtraList; + s >> a.d->mMembers; + s >> a.d->mRelationships; + s >> a.d->mSources; + s >> a.d->mImpps; + s >> a.d->mFieldGroupList; + s >> a.d->mTitleExtraList; + s >> a.d->mRoleExtraList; + s >> a.d->mOrgExtraList; + s >> a.d->mNickNameExtraList; + s >> a.d->mClientPidMapList; + a.d->mEmpty = false; + + return s; +} + +bool matchBinaryPattern(int value, int pattern) +{ + /** + We want to match all telephonnumbers/addresses which have the bits in the + pattern set. More are allowed. + if pattern == 0 we have a special handling, then we want only those with + exactly no bit set. + */ + if (pattern == 0) { + return value == 0; + } else { + return pattern == (pattern & value); + } +} + +template +bool listEquals(const QVector &list, const QVector &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 +static QVariantList toVariantList(const QVector &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 +static QVector fromVariantList(const QVariantList &v) +{ + QVector l; + l.reserve(v.size()); + std::transform(v.begin(), v.end(), std::back_inserter(l), [](const QVariant &elem) { + return elem.value(); + }); + 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(emails)); +} + +void Addressee::setPhoneNumbersVariant(const QVariantList &emails) +{ + setPhoneNumbers(fromVariantList(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(impps)); +} + +#include "moc_addressee.cpp" diff --git a/src/addressee.h b/src/addressee.h new file mode 100644 index 0000000..d4b4941 --- /dev/null +++ b/src/addressee.h @@ -0,0 +1,1245 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + SPDX-FileCopyrightText: 2013 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSEE_H +#define KCONTACTS_ADDRESSEE_H + +#include +#include +#include +#include +#include + +#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 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 ¶m = QMap()); +#endif + + /** + Adds an email address. If the email address (i.e. @p email.mail()) already + exists in this addressee it won't be duplicated, instead @p email is assigned + to it. + + @since 5.88 + */ + void addEmail(const Email &email); + + /** + Remove email address. If the email address doesn't exist, nothing happens. + + @param email Email address to remove + */ + void removeEmail(const QString &email); + + /** + Return preferred email address. This is the first email address or the last + one added with insertEmail() or addEmail() with a set preferred parameter. + */ + QString preferredEmail() const; + + /** + Return list of all email addresses. + */ + QStringList emails() const; + + /** + Set the emails to @p list. + The first email address gets the preferred one! + @param list The list of email addresses. + */ + void setEmails(const QStringList &list); + + /** + Insert a phone number. If a phone number with the same id already exists + in this addressee it is not duplicated. + + @param phoneNumber The telephone number to insert to the addressee + */ + void insertPhoneNumber(const PhoneNumber &phoneNumber); + + /** + Remove phone number. If no phone number with the given id exists for this + addressee, nothing happens. + + @param phoneNumber The telephone number to remove from the addressee + */ + void removePhoneNumber(const PhoneNumber &phoneNumber); + + /** + Return phone number, which matches the given type. + + @param type The type of phone number to get + */ + PhoneNumber phoneNumber(PhoneNumber::Type type) const; + + /** + Return list of all phone numbers. + */ + PhoneNumber::List phoneNumbers() const; + + void setPhoneNumbers(const PhoneNumber::List &phoneNumbers); + + /** + Return list of phone numbers with a special type. + + @param type The type of phone number to get + */ + PhoneNumber::List phoneNumbers(PhoneNumber::Type type) const; + + /** + Return phone number with the given id. + + @param id The identifier of the phone number to look for. + See PhoneNumber::id() + */ + PhoneNumber findPhoneNumber(const QString &id) const; + + /** + Insert a key. If a key with the same id already exists + in this addressee it is not duplicated. + + @param key The key to insert + */ + void insertKey(const Key &key); + + /** + Remove a key. If no key with the given id exists for this + addressee, nothing happens. + + @param key The key to remove + */ + void removeKey(const Key &key); + + /** + Return key, which matches the given type. + If @p type == Key::Custom you can specify a string + that should match. If you leave the string empty, the first + key with a custom value is returned. + + @param type The type of key to look for + @param customTypeString A string to match custom keys against when + @p type is @c Key::Custom + */ + Key key(Key::Type type, const QString &customTypeString = QString()) const; + + /** + Return list of all keys. + */ + Key::List keys() const; + + /** + Set the list of keys + @param keys The keys to be set. + */ + void setKeys(const Key::List &keys); + + /** + Return list of keys with a special type. + If @p type == Key::Custom you can specify a string + that should match. If you leave the string empty, all custom + keys will be returned. + + @param type The type of key to look for + @param customTypeString A string to match custom keys against when + @p type is @c Key::Custom + */ + Key::List keys(Key::Type type, const QString &customTypeString = QString()) const; + + /** + Return key with the given id. + + @param id The identifier of the key to look for. See Key::id() + */ + Key findKey(const QString &id) const; + + /** + Insert an address. If an address with the same id already exists + in this addressee it is not duplicated. + + @param address The address to insert + */ + void insertAddress(const Address &address); + + /** + Remove address. If no address with the given id exists for this + addressee, nothing happens. + + @param address The address to remove + */ + void removeAddress(const Address &address); + + /** + Set the addressee + + @param addresses The new addresses + @since 5.100 + */ + void setAddresses(const Address::List &addresses); + + /** + Return address, which matches the given type. + + @param type The type of address to look for + */ + Address address(Address::Type type) const; + + /** + Return list of all addresses. + */ + Address::List addresses() const; + + /** + Return list of addresses with a special type. + + @param type The type of addresses to look for + */ + Address::List addresses(Address::Type type) const; + + /** + Return address with the given id. + + @param id The identifier of the address to look for. See Address::id() + */ + Address findAddress(const QString &id) const; + + /** + Insert category. If the category already exists it is not duplicated. + */ + void insertCategory(const QString &category); + + /** + Remove category. + */ + void removeCategory(const QString &category); + + /** + Return, if addressee has the given category. + */ + bool hasCategory(const QString &category) const; + + /** + Set categories to given value. + */ + void setCategories(const QStringList &category); + + /** + Return list of all set categories. + */ + QStringList categories() const; + + /** + Insert custom entry. The entry is identified by the name of the inserting + application and a unique name. If an entry with the given app and name + already exists its value is replaced with the new given value. + + An empty value isn't allowed (nothing happens if this is called with + any of the three arguments being empty) + + @param app Name of the application inserting this custom entry + @param name Name of this application specific custom entry + @param value Value of this application specific custom entry + */ + void insertCustom(const QString &app, const QString &name, const QString &value); + + /** + Remove custom entry. + + @param app Name of the application which has inserted this custom entry + @param name Name of this application specific custom entry + */ + void removeCustom(const QString &app, const QString &name); + + /** + Return value of custom entry, identified by app and entry name. + + @param app Name of the application which has inserted this custom entry + @param name Name of this application specific custom entry + */ + QString custom(const QString &app, const QString &name) const; + + /** + Set all custom entries. + */ + void setCustoms(const QStringList &customs); + + /** + Return list of all custom entries. + + The format of the custom entries is 'app-key:value' and the list is sorted + alphabetically by 'app-key'. + */ + QStringList customs() const; + + /** + Parse full email address. The result is given back in fullName and email. + + @param rawEmail The input string to parse for name and email + @param fullName The name part of the @p rawEmail input, if it contained one + @param email The email part of the @p rawEmail input, if it contained one + */ + static void parseEmailAddress(const QString &rawEmail, QString &fullName, QString &email); + + /** + Returns string representation of the addressee. + */ + QString toString() const; + + /** + Mark addressee as changed. + + @param value Sets the status indicating changed data + */ + void setChanged(bool value); + + /** + Return whether the addressee is changed. + */ + bool changed() const; + + /** + Returns the MIME type used for Addressees + */ + static QString mimeType(); + + KContacts::Email::List emailList() const; + void setEmailList(const Email::List &list); + + /** + * Remove Language + * @brief removeLang + * @param language + */ + void removeLang(const QString &language); + /** + * Insert Language + * @brief insertLang + * @param language + */ + void insertLang(const Lang &language); + /** + * @brief langs + * @return List of lang + */ + Lang::List langs() const; + void setLangs(const Lang::List &langs); + + void setGender(const Gender &gender); + Gender gender() const; + + QString kind() const; + void setKind(const QString &kind); + + void insertCalendarUrl(const CalendarUrl &calendarUrl); + CalendarUrl::List calendarUrlList() const; + + void insertExtraSound(const Sound &sound); + void setExtraSoundList(const Sound::List &soundList); + Sound::List extraSoundList() const; + + void insertExtraPhoto(const Picture &picture); + void setExtraPhotoList(const Picture::List &pictureList); + Picture::List extraPhotoList() const; + + void insertExtraLogo(const Picture &logo); + void setExtraLogoList(const Picture::List &logoList); + Picture::List extraLogoList() const; + + ResourceLocatorUrl::List extraUrlList() const; + void setExtraUrlList(const ResourceLocatorUrl::List &urlList); + void insertExtraUrl(const ResourceLocatorUrl &url); + + // Member + void insertMember(const QString &member); + void setMembers(const QStringList &c); + QStringList members() const; + + // Relation + void insertRelationship(const Related &related); + void setRelationships(const Related::List &c); + Related::List relationships() const; + + // Source + void insertSourceUrl(const QUrl &url); + void setSourcesUrlList(const QVector &urlList); + QVector 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 d; +}; + +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &, const Addressee &); +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &, Addressee &); +} + +#define KCONTACTS_ADDRESSEE_METATYPE_DEFINED 1 +Q_DECLARE_METATYPE(KContacts::Addressee) + +#endif diff --git a/src/addresseehelper.cpp b/src/addresseehelper.cpp new file mode 100644 index 0000000..465369c --- /dev/null +++ b/src/addresseehelper.cpp @@ -0,0 +1,103 @@ +/* + This file is part of the KDE libraries + SPDX-FileCopyrightText: 2003 Carsten Pfeiffer + + This SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "addresseehelper.h" + +#include +#include +#include + +using namespace KContacts; + +class Q_DECL_HIDDEN KContacts::AddresseeHelperPrivate +{ +public: + QSet mTitles; + QSet mPrefixes; + QSet 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 &container) +{ + for (const auto &str : list) { + if (!str.isEmpty()) { + container.insert(str); + } + } +} + +void AddresseeHelper::initSettings() +{ + d->mTitles.clear(); + d->mSuffixes.clear(); + d->mPrefixes.clear(); + + d->mTitles.insert(i18n("Dr.")); + d->mTitles.insert(i18n("Miss")); + d->mTitles.insert(i18n("Mr.")); + d->mTitles.insert(i18n("Mrs.")); + d->mTitles.insert(i18n("Ms.")); + d->mTitles.insert(i18n("Prof.")); + + d->mSuffixes.insert(i18n("I")); + d->mSuffixes.insert(i18n("II")); + d->mSuffixes.insert(i18n("III")); + d->mSuffixes.insert(i18n("Jr.")); + d->mSuffixes.insert(i18n("Sr.")); + + d->mPrefixes.insert(QStringLiteral("van")); + d->mPrefixes.insert(QStringLiteral("von")); + d->mPrefixes.insert(QStringLiteral("de")); + + KConfig _config(QStringLiteral("kabcrc"), KConfig::NoGlobals); + KConfigGroup config(&_config, "General"); + + addToSet(config.readEntry("Prefixes", QStringList()), d->mTitles); + addToSet(config.readEntry("Inclusions", QStringList()), d->mPrefixes); + addToSet(config.readEntry("Suffixes", QStringList()), d->mSuffixes); + d->mTreatAsFamilyName = config.readEntry("TreatAsFamilyName", true); +} + +bool AddresseeHelper::containsTitle(const QString &title) const +{ + return d->mTitles.contains(title); +} + +bool AddresseeHelper::containsPrefix(const QString &prefix) const +{ + return d->mPrefixes.contains(prefix); +} + +bool AddresseeHelper::containsSuffix(const QString &suffix) const +{ + return d->mSuffixes.contains(suffix); +} + +bool AddresseeHelper::treatAsFamilyName() const +{ + return d->mTreatAsFamilyName; +} diff --git a/src/addresseehelper.h b/src/addresseehelper.h new file mode 100644 index 0000000..85cac8a --- /dev/null +++ b/src/addresseehelper.h @@ -0,0 +1,113 @@ +/* + This file is part of the KDE libraries + SPDX-FileCopyrightText: 2003 Carsten Pfeiffer + + This SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSEEHELPER_H +#define KCONTACTS_ADDRESSEEHELPER_H + +#include "kcontacts_export.h" + +#include + +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 d; +}; +} + +#endif diff --git a/src/addresseelist.h b/src/addresseelist.h new file mode 100644 index 0000000..9a468e3 --- /dev/null +++ b/src/addresseelist.h @@ -0,0 +1,25 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Jost Schenck + SPDX-FileCopyrightText: 2003 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSEELIST_H +#define KCONTACTS_ADDRESSEELIST_H + +#include + +namespace KContacts +{ +class Addressee; + +/** + * @short a QVector of Addressee. + */ +typedef QVector AddresseeList; + +} + +#endif diff --git a/src/addressformat.cpp b/src/addressformat.cpp new file mode 100644 index 0000000..9af3e66 --- /dev/null +++ b/src/addressformat.cpp @@ -0,0 +1,157 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + 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 +#include +#include + +#include +#include + +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 &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 AddressFormat::elementsForQml() const +{ + QList l; + l.reserve(d->elements.size()); + std::copy(d->elements.begin(), d->elements.end(), std::back_inserter(l)); + return l; +} + +static QString addressFormatRc() +{ + Q_INIT_RESOURCE(kcontacts); // must be called outside of a namespace + return QStringLiteral(":/org.kde.kcontacts/addressformatrc"); +} + +AddressFormat +AddressFormatRepository::formatForCountry(const QString &countryCode, AddressFormatScriptPreference scriptPref, AddressFormatPreference formatPref) +{ + static const KConfig entry(addressFormatRc(), KConfig::SimpleConfig); + KConfigGroup group = entry.group(countryCode.toUtf8()); + + AddressFormat format; + auto fmt = AddressFormatPrivate::get(format); + fmt->required = AddressFormatParser::parseFields(group.readEntry("Required", QString())); + fmt->upper = AddressFormatParser::parseFields(group.readEntry("Upper", QString())); + + QString formatString; + if (scriptPref == AddressFormatScriptPreference::Latin && formatPref == AddressFormatPreference::Business) { + formatString = group.readEntry("LatinBusinessAddressFormat", QString()); + } + if (formatString.isEmpty() && scriptPref == AddressFormatScriptPreference::Latin) { + formatString = group.readEntry("LatinAddressFormat", QString()); + } + if (formatString.isEmpty() && formatPref == AddressFormatPreference::Business) { + formatString = group.readEntry("BusinessAddressFormat", QString()); + } + if (formatString.isEmpty()) { + formatString = group.readEntry("AddressFormat", QStringLiteral("%N%n%O%n%A%nPO BOX %P%n%C %S %Z")); + } + fmt->elements = AddressFormatParser::parseElements(formatString); + fmt->postalCodeFormat = group.readEntry("PostalCodeFormat", QString()); + fmt->country = countryCode; + return format; +} + +AddressFormat AddressFormatRepository::formatForAddress(const Address &address, AddressFormatPreference formatPref) +{ + KCountry c; + if (address.country().size() == 2) { + c = KCountry::fromAlpha2(address.country()); + } + if (!c.isValid()) { + c = KCountry::fromName(address.country()); + } + // fall back to our own country + if (!c.isValid()) { + c = KCountry::fromQLocale(QLocale().country()); + } + + const auto scriptPref = AddressFormatScript::detect(address) == AddressFormatScript::LatinLikeScript ? AddressFormatScriptPreference::Latin + : AddressFormatScriptPreference::Local; + return formatForCountry(c.alpha2(), scriptPref, formatPref); +} diff --git a/src/addressformat.h b/src/addressformat.h new file mode 100644 index 0000000..ab9b597 --- /dev/null +++ b/src/addressformat.h @@ -0,0 +1,143 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSFORMAT_H +#define KCONTACTS_ADDRESSFORMAT_H + +#include "kcontacts_export.h" +#include "namespace.h" + +#include + +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 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 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 &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 elementsForQml() const; + friend class AddressFormatPrivate; + QExplicitlySharedDataPointer d; +}; + +/** Provides address format information for a given country. + * + * @since 5.92 + */ +class KCONTACTS_EXPORT AddressFormatRepository +{ + Q_GADGET +public: + /** Look up format data for a country. + * @param countryCode ISO 3166-1 alpha 2 country code. + */ + static Q_INVOKABLE KContacts::AddressFormat formatForCountry(const QString &countryCode, + KContacts::AddressFormatScriptPreference scriptPref, + KContacts::AddressFormatPreference formatPref = AddressFormatPreference::Generic); + + /** Look up format data for a given address. + * The preferred script is determined from the script used in the address object. + * If the address object has no country information set, the local country is assumed. + */ + static KContacts::AddressFormat formatForAddress(const Address &address, AddressFormatPreference formatPref = AddressFormatPreference::Generic); +}; + +} + +Q_DECLARE_METATYPE(KContacts::AddressFormat) +Q_DECLARE_METATYPE(KContacts::AddressFormatElement) +Q_DECLARE_METATYPE(KContacts::AddressFormatRepository) + +#endif // KCONTACTS_ADDRESSFORMAT_H diff --git a/src/addressformat_p.h b/src/addressformat_p.h new file mode 100644 index 0000000..a85d78f --- /dev/null +++ b/src/addressformat_p.h @@ -0,0 +1,45 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSFORMAT_P_H +#define KCONTACTS_ADDRESSFORMAT_P_H + +#include "addressformat.h" + +#include + +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 elements; + QString postalCodeFormat; + QString country; +}; + +} + +#endif // KCONTACTS_ADDRESSFORMAT_P_H diff --git a/src/addressformatparser.cpp b/src/addressformatparser.cpp new file mode 100644 index 0000000..b951513 --- /dev/null +++ b/src/addressformatparser.cpp @@ -0,0 +1,86 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "addressformat_p.h" +#include "addressformatparser_p.h" + +#include + +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 AddressFormatParser::parseElements(QStringView s) +{ + std::vector elements; + QString literal; + for (auto it = s.begin(); it != s.end(); ++it) { + if ((*it) == QLatin1Char('%') && std::next(it) != s.end()) { + if (!literal.isEmpty()) { + AddressFormatElement elem; + auto e = AddressFormatElementPrivate::get(elem); + e->literal = std::move(literal); + elements.push_back(elem); + } + ++it; + if ((*it) == QLatin1Char('n')) { + elements.push_back(AddressFormatElement{}); + } else { + const auto f = parseField(*it); + if (f == AddressFormatField::NoField) { + qWarning() << "invalid format field element: %" << *it << "in" << s; + } else { + AddressFormatElement elem; + auto e = AddressFormatElementPrivate::get(elem); + e->field = f; + elements.push_back(elem); + } + } + } else { + literal.push_back(*it); + } + } + if (!literal.isEmpty()) { + AddressFormatElement elem; + auto e = AddressFormatElementPrivate::get(elem); + e->literal = std::move(literal); + elements.push_back(elem); + } + return elements; +} diff --git a/src/addressformatparser_p.h b/src/addressformatparser_p.h new file mode 100644 index 0000000..3abd1f1 --- /dev/null +++ b/src/addressformatparser_p.h @@ -0,0 +1,27 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSFORMATPARSER_P_H +#define KCONTACTS_ADDRESSFORMATPARSER_P_H + +#include "addressformat.h" + +#include + +namespace KContacts +{ + +/** Parsing functions for address format data. + * @internal + */ +namespace AddressFormatParser +{ +AddressFormatField parseField(QChar c); +AddressFormatFields parseFields(QStringView s); +std::vector parseElements(QStringView s); +} +} + +#endif // KCONTACTS_ADDRESSFORMATPARSER_P_H diff --git a/src/addressformatrc b/src/addressformatrc new file mode 100644 index 0000000..457ab57 --- /dev/null +++ b/src/addressformatrc @@ -0,0 +1,949 @@ +[AD] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=AD[1-7]0\\d + +[AE] +AddressFormat=%N%n%O%n%A%n%S +LatinAddressFormat=%N%n%O%n%A%n%S +Required=AS + +[AF] +AddressFormat=%N%n%O%n%A%n%C%n%Z +PostalCodeFormat=\\d{4} + +[AI] +AddressFormat=%N%n%O%n%A%n%C%n%Z +PostalCodeFormat=(?:AI-)?2640 + +[AL] +AddressFormat=%N%n%O%n%A%n%Z%n%C +PostalCodeFormat=\\d{4} + +[AM] +AddressFormat=%N%n%O%n%A%n%Z%n%C%n%S +LatinAddressFormat=%N%n%O%n%A%n%Z%n%C%n%S +PostalCodeFormat=(?:37)?\\d{4} + +[AR] +AddressFormat=%N%n%O%nCasilla de Correo %P%n%A%n%Z %C%n%S +Upper=ACZ +PostalCodeFormat=((?:[A-HJ-NP-Z])?\\d{4})([A-Z]{3})? + +[AS] +AddressFormat=%N%n%O%n%A%n%C %S %Z +Upper=ACNOS +Required=ACSZ +PostalCodeFormat=(96799)(?:[ \\-](\\d{4}))? + +[AT] +AddressFormat=%O%n%N%nPostfach %P%n%A%n%Z %C +BusinessAddressFormat=%O%nz.Hd. %N%nPostfach %P%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[AU] +AddressFormat=%O%n%N%n%A%nPO BOX %P%n%C %S %Z +Upper=CSR +Required=ACSZ +PostalCodeFormat=\\d{4} + +[AX] +AddressFormat=%O%n%N%nPB %P%n%A%nAX-%Z %C%n%R +Required=ACZ +Upper=R +PostalCodeFormat=22\\d{3} + +[AZ] +AddressFormat=%N%n%O%n%A%nAZ %Z %C +PostalCodeFormat=\\d{4} + +[BA] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[BB] +AddressFormat=%N%n%O%n%A%n%C, %S %Z +PostalCodeFormat=BB\\d{5} + +[BD] +AddressFormat=%N%n%O%n%A%n%C - %Z +PostalCodeFormat=\\d{4} + +[BE] +AddressFormat=%O%n%N%n%A%nPO Box %P%n%Z %C +AddressFormat[de]=%O%n%N%n%A%nPostfach %P%n%Z %C +AddressFormat[fr]=%O%n%N%n%A%nBP %P%n%Z %C +AddressFormat[nl]=%O%n%N%n%A%nPostbus %P%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{4} + +[BF] +AddressFormat=%N%n%O%n%A%n%C %X + +[BG] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[BH] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=(?:\\d|1[0-2])\\d{2} + +[BL] +AddressFormat=%O%n%N%n%A%nBP %P%n%Z %C %X +Upper=ACXR +Required=ACZ +PostalCodeFormat=9[78][01]\\d{2} + +[BM] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=[A-Z]{2} ?[A-Z0-9]{2} + +[BN] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=[A-Z]{2} ?\\d{4} + +[BR] +AddressFormat=%O%n%N%nCaixa Postal %P%n%A%n%D%n%C-%S%n%Z +Upper=CS +Required=ASCZ +PostalCodeFormat=\\d{5}-?\\d{3} + +[BS] +AddressFormat=%N%n%O%n%A%n%C, %S + +[BT] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=\\d{5} + +[BY] +AddressFormat=%O%n%N%n%A%n%Z, %C%n%S +PostalCodeFormat=\\d{6} + +[CA] +AddressFormat=%N%n%O%n%A%nPO BOX %P%n%C %S %Z +Upper=ACNOSZR +Required=ACSZ +PostalCodeFormat=[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z] ?\\d[ABCEGHJ-NPRSTV-Z]\\d + +[CC] +AddressFormat=%O%n%N%n%A%n%C %S %Z +Upper=CS +PostalCodeFormat=6799 + +[CH] +AddressFormat=%O%n%N%nP.O. Box %P%n%A%n%Z %C +AddressFormat[de]=%O%n%N%nPostfach %P%n%A%n%Z %C +AddressFormat[fr]=%O%n%N%nCase postale %P%n%A%n%Z %C +AddressFormat[it]=%O%n%N%nCasella postale %P%n%A%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{4} + +[CI] +AddressFormat=%N%n%O%n%X %A %C %X + +[CL] +AddressFormat=%N%n%O%n%A%n%Z %C%n%S +PostalCodeFormat=\\d{7} + +[CN] +AddressFormat=%Z%n%S%C%D%n%A%n%O%n%N +LatinAddressFormat=%N%n%O%n%A%n%D%n%C%n%S, %Z +Upper=S +Required=ACSZ +PostalCodeFormat=\\d{6} + +[CO] +AddressFormat=%N%n%O%n%A%n%C, %S, %Z +Required=AS +PostalCodeFormat=\\d{6} + +[CR] +AddressFormat=%N%n%O%n%A%n%S, %C%n%Z +Required=ACS +PostalCodeFormat=\\d{4,5}|\\d{3}-\\d{4} + +[CU] +AddressFormat=%N%n%O%n%A%n%C %S%n%Z +PostalCodeFormat=\\d{5} + +[CV] +AddressFormat=%N%n%O%n%A%n%Z %C%n%S +PostalCodeFormat=\\d{4} + +[CX] +AddressFormat=%O%n%N%n%A%n%C %S %Z +Upper=CS +PostalCodeFormat=6798 + +[CY] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[CZ] +AddressFormat=%N%np. p. %P%n%O%n%A%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{3} ?\\d{2} + +[DE] +AddressFormat=%N%n%O%nPostfach %P%n%A%n%Z %C +AddressFormat[nds]=%N%n- %O -%nPostfach %P%n%A%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{5} + +[DK] +AddressFormat=%N%n%O%n%A%nPostboks %P%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{4} + +[DO] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[DZ] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[EC] +AddressFormat=%N%n%O%n%A%n%Z%n%C +Upper=CZ +PostalCodeFormat=\\d{6} + +[EE] +AddressFormat=%N%n%O%n%A%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{5} + +[EG] +AddressFormat=%N%n%O%n%A%n%C%n%S%n%Z +LatinAddressFormat=%N%n%O%n%A%n%C%n%S%n%Z +PostalCodeFormat=\\d{5} + +[EH] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[ES] +AddressFormat=%N%n%O%nApartado Postal %P%n%A%n%Z %C %S +Upper=CS +Required=ACSZ +PostalCodeFormat=\\d{5} + +[ET] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[FI] +AddressFormat=%O%n%N%nPB %P%n%A%nFI-%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{5} + +[FK] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=FIQQ 1ZZ + +[FM] +AddressFormat=%N%n%O%n%A%n%C %S %Z +Upper=ACNOS +Required=ACSZ +PostalCodeFormat=(9694[1-4])(?:[ \\-](\\d{4}))? + +[FO] +AddressFormat=%N%n%O%n%A%nFO%Z %C +PostalCodeFormat=\\d{3} + +[FR] +AddressFormat=%O%n%N%n%A%nBP %P%n%Z %C +Upper=CR +Required=ACZ +PostalCodeFormat=\\d{2} ?\\d{3} + +[GB] +AddressFormat=%N%n%O%nPO Box %P%n%A%n%C%n%Z +Upper=CZR +Required=ACZ +PostalCodeFormat=GIR ?0AA|(?:(?:AB|AL|B|BA|BB|BD|BF|BH|BL|BN|BR|BS|BT|BX|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(?:\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2}))|BFPO ?\\d{1,4} + +[GE] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[GF] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=9[78]3\\d{2} + +[GG] +AddressFormat=%N%n%O%n%A%n%C%nGUERNSEY%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=GY\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2} + +[GI] +AddressFormat=%N%n%O%n%A%nGIBRALTAR%n%Z +Required=A +PostalCodeFormat=GX11 1AA + +[GL] +AddressFormat=%N%n%O%n%A%n(Postboks %P%n%Z %C +Required=ACZ +PostalCodeFormat=39\\d{2} + +[GN] +AddressFormat=%N%n%O%n%Z %A %C +PostalCodeFormat=\\d{3} + +[GP] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=9[78][01]\\d{2} + +[GR] +AddressFormat=%N%n%O%n%A%nP.O. BOX %P%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{3} ?\\d{2} + +[GS] +AddressFormat=%N%n%O%n%A%n%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=SIQQ 1ZZ + +[GT] +AddressFormat=%N%n%O%n%A%n%Z- %C +PostalCodeFormat=\\d{5} + +[GU] +AddressFormat=%N%n%O%n%A%n%C %Z +Upper=ACNO +Required=ACZ +PostalCodeFormat=(969(?:[12]\\d|3[12]))(?:[ \\-](\\d{4}))? + +[GW] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[HK] +AddressFormat=%S%n%C%n%A%n%O%n%N +LatinAddressFormat=%N%n%O%n%A%n%C%n%S +Upper=S +Required=AS + +[HM] +AddressFormat=%O%n%N%n%A%n%C %S %Z +Upper=CS +PostalCodeFormat=\\d{4} + +[HN] +AddressFormat=%N%n%O%n%A%n%C, %S%n%Z +Required=ACS +PostalCodeFormat=\\d{5} + +[HR] +AddressFormat=%N%n%O%n%A%nHR-%Z %C +PostalCodeFormat=\\d{5} + +[HT] +AddressFormat=%N%n%O%n%A%nHT%Z %C +PostalCodeFormat=\\d{4} + +[HU] +AddressFormat=%N%n%O%n%C%n%A%nPF. %P%n%Z +Upper=ACNO +Required=ACZ +PostalCodeFormat=\\d{4} + +[ID] +AddressFormat=%N%n%O%n%A%n%C%n%S %Z +Required=AS +PostalCodeFormat=\\d{5} + +[IE] +AddressFormat=%N%n%O%n%A%n%D%n%C%n%S%n%Z +PostalCodeFormat=[\\dA-Z]{3} ?[\\dA-Z]{4} + +[IL] +AddressFormat=%N%n%Oת.ד. %P%n%n%A%n%C %Z +PostalCodeFormat=\\d{5}(?:\\d{2})? +Upper=R + +[IM] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=IM\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2} + +[IN] +AddressFormat=%N%n%O%n%A%n%C %Z%n%S +Required=ACSZ +PostalCodeFormat=\\d{6} + +[IO] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=BBND 1ZZ + +[IQ] +AddressFormat=%O%n%N%n%A%n%C, %S%n%Z +Upper=CS +Required=ACS +PostalCodeFormat=\\d{5} + +[IR] +AddressFormat=%O%n%N%n%S%n%C, %D%n%A%n%Z +PostalCodeFormat=\\d{5}-?\\d{5} + +[IS] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{3} + +[IT] +AddressFormat=%N%n%O%n%A%nCASELLA POSTALE %P%n%Z %C %S +Upper=CSR +Required=ACSZ +PostalCodeFormat=\\d{5} + +[JE] +AddressFormat=%N%n%O%n%A%n%C%nJERSEY%n%Z +Upper=CZ +PostalCodeFormat=JE\\d[\\dA-Z]? ?\\d[ABD-HJLN-UW-Z]{2} + +[JM] +AddressFormat=%N%n%O%n%A%n%C%n%S %X +Required=ACS + +[JO] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=\\d{5} + +[JP] +AddressFormat=%R%n〒%Z%n%S%C%A%n%O%n%N +LatinAddressFormat=%N%n%O%n%A, %C%n%S %Z +Upper=SR +Required=ASZ +PostalCodeFormat=\\d{3}-?\\d{4} + +[KE] +AddressFormat=%N%n%O%n%A%n%C%n%Z +PostalCodeFormat=\\d{5} + +[KG] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{6} + +[KH] +AddressFormat=%N%n%O%n%A%nP.O. Box %P%n%C %Z +Upper=R +PostalCodeFormat=\\d{5,6} + +[KI] +AddressFormat=%N%n%O%n%A%n%S%n%C +Upper=ACNOS + +[KN] +AddressFormat=%N%n%O%n%A%n%C, %S +Required=ACS + +[KR] +AddressFormat=%R%n%S %C%D%n%A%n%O%n%N%n%Z +LatinAddressFormat=%N%n%O%n%A%n%D%n%C%n%S%n%Z +Upper=Z +Required=ACSZ +PostalCodeFormat=\\d{5} + +[KW] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[KY] +AddressFormat=%N%n%O%n%A%n%S %Z +Required=AS +PostalCodeFormat=KY\\d-\\d{4} + +[KZ] +AddressFormat=%Z%n%S%n%C%n%A%n%O%n%N +PostalCodeFormat=\\d{6} + +[LA] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[LB] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=(?:\\d{4})(?: ?(?:\\d{4}))? + +[LI] +AddressFormat=%O%n%N%n%A%nFL-%Z %C +Required=ACZ +PostalCodeFormat=948[5-9]|949[0-8] + +[LK] +AddressFormat=%N%n%O%n%A%n%C%n%Z +PostalCodeFormat=\\d{5} + +[LR] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[LS] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=\\d{3} + +[LT] +AddressFormat=%O%n%N%n%A%nLT-%Z %C +Required=ACZ +PostalCodeFormat=\\d{5} + +[LU] +AddressFormat=%O%n%N%nPO Box %P%n%A%nL-%Z %C +AddressFormat[fr]=%O%n%N%nBP %P%n%A%nL-%Z %C +AddressFormat[de]=%O%n%N%nPostfach %P%n%A%nL-%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{4} + +[LV] +AddressFormat=%N%n%O%n%A%n%C, %Z +Required=ACZ +PostalCodeFormat=LV-\\d{4} + +[MA] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[MC] +AddressFormat=%N%n%O%n%A%nMC-%Z %C %X +PostalCodeFormat=980\\d{2} + +[MD] +AddressFormat=%N%n%O%n%A%nMD-%Z %C +PostalCodeFormat=\\d{4} + +[ME] +AddressFormat=%N%n%O%n%A%npoÅ¡tanski fah %P%n%Z %C +AddressFormat[sr]=%N%n%O%n%A%nпоштански фах %P%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=8\\d{4} + +[MF] +AddressFormat=%O%n%N%n%A%nBP %P%n%Z %C %X +Upper=ACXR +PostalCodeFormat=9[78][01]\\d{2} + +[MG] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{3} + +[MH] +AddressFormat=%N%n%O%n%A%n%C %S %Z +Upper=ACNOS +Required=ACSZ +PostalCodeFormat=(969[67]\\d)(?:[ \\-](\\d{4}))? + +[MK] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[MM] +AddressFormat=%N%n%O%n%A%n%C, %Z +PostalCodeFormat=\\d{5} + +[MN] +AddressFormat=%N%n%O%n%A%n%C%n%S %Z +PostalCodeFormat=\\d{5} + +[MO] +AddressFormat=%A%n%O%n%N +LatinAddressFormat=%N%n%O%n%A +Required=A + +[MP] +AddressFormat=%N%n%O%n%A%nPO BOX %P%n%C %S %Z +Upper=ACNOSR +Required=ACSZ +PostalCodeFormat=(9695[012])(?:[ \\-](\\d{4}))? + +[MQ] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=9[78]2\\d{2} + +[MT] +AddressFormat=%N%n%O%n%A%n%C %Z +Upper=CZ +PostalCodeFormat=[A-Z]{3} ?\\d{2,4} + +[MU] +AddressFormat=%N%n%O%n%A%n%Z%n%C +Upper=CZ +PostalCodeFormat=\\d{3}(?:\\d{2}|[A-Z]{2}\\d{3}) + +[MV] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=\\d{5} + +[MW] +AddressFormat=%N%n%O%n%A%n%C %X + +[MX] +AddressFormat=%N%n%O%n%A%n%D%n%Z %C, %S +Upper=CSZ +Required=ACSZ +PostalCodeFormat=\\d{5} + +[MZ] +AddressFormat=%N%n%O%n%A%n%Z %C%S +PostalCodeFormat=\\d{4} + +[NA] +AddressFormat=%N%n%O%n%A%n%C%nP.O. Box %P%n%Z +PostalCodeFormat=\\d{5} + +[NC] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=988\\d{2} + +[NE] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[NF] +AddressFormat=%O%n%N%n%A%n%C %S %Z +Upper=CS +PostalCodeFormat=2899 + +[NG] +AddressFormat=%N%n%O%n%A%n%D%n%C %Z%n%S +Upper=CS +PostalCodeFormat=\\d{6} + +[NI] +AddressFormat=%N%n%O%n%A%n%Z%n%C, %S +Upper=CS +PostalCodeFormat=\\d{5} + +[NL] +AddressFormat=%O%n%N%nPostbus %P%n%A%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{4} ?[A-Z]{2} + +[NO] +AddressFormat=%N%n%O%nPostboks %P%n%A%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{4} + +[NP] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=\\d{5} + +[NR] +AddressFormat=%N%n%O%n%A%n%S +Required=AS + +[NZ] +AddressFormat=%N%n%O%nPO Box %P%n%A%n%D%n%C %Z +Upper=R +Required=ACZ +PostalCodeFormat=\\d{4} + +[OM] +AddressFormat=%N%n%O%n%A%n%Z%n%C +PostalCodeFormat=(?:PC )?\\d{3} + +[PA] +AddressFormat=%N%n%O%n%A%n%C%n%S +Upper=CS + +[PE] +AddressFormat=%N%n%O%n%A%n%C %Z%n%S +PostalCodeFormat=(?:LIMA \\d{1,2}|CALLAO 0?\\d)|[0-2]\\d{4} + +[PF] +AddressFormat=%N%n%O%n%A%n%Z %C %S +Upper=CS +Required=ACSZ +PostalCodeFormat=987\\d{2} + +[PG] +AddressFormat=%N%n%O%n%A%n%C %Z %S +Required=ACS +PostalCodeFormat=\\d{3} + +[PH] +AddressFormat=%N%n%O%n%A%n%D, %C%n%Z %S +PostalCodeFormat=\\d{4} + +[PK] +AddressFormat=%N%n%O%n%A%n%C-%Z +PostalCodeFormat=\\d{5} + +[PL] +AddressFormat=%N%n%O%n%A%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{2}-\\d{3} + +[PM] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=9[78]5\\d{2} + +[PN] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=PCRN 1ZZ + +[PR] +AddressFormat=%N%n%O%n%A%n%C PR %Z +Upper=ACNO +Required=ACZ +PostalCodeFormat=(00[679]\\d{2})(?:[ \\-](\\d{4}))? + +[PT] +AddressFormat=%N%n%O%n%A%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{4}-\\d{3} + +[PW] +AddressFormat=%N%n%O%n%A%n%C %S %Z +Upper=ACNOS +Required=ACSZ +PostalCodeFormat=(969(?:39|40))(?:[ \\-](\\d{4}))? + +[PY] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[RE] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=9[78]4\\d{2} + +[RO] +AddressFormat=%N%n%O%n%A%n%Z %C +Upper=AC +Required=ACZ +PostalCodeFormat=\\d{6} + +[RS] +AddressFormat=%N%n%O%n%A%nпоштански фах %P%n%Z %C +AddressFormat[sr@latin]=%N%n%O%n%A%npoÅ¡tanski fah %P%n%Z %C +Upper=R +Required=ACZ +PostalCodeFormat=\\d{5,6} + +[RU] +AddressFormat=%N%n%O%n%A%n%C%n%S%n%Z +LatinAddressFormat=%N%n%O%n%A%n%C%n%S%n%Z +Upper=AC +PostalCodeFormat=\\d{6} + +[SA] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=\\d{5} + +[SC] +AddressFormat=%N%n%O%n%A%n%C%n%S +Upper=S + +[SD] +AddressFormat=%N%n%O%n%A%n%C%n%Z +PostalCodeFormat=\\d{5} + +[SE] +AddressFormat=%O%n%N%nBox %P%n%A%nSE-%Z %C +Required=ACZ +PostalCodeFormat=\\d{3} ?\\d{2} + +[SG] +AddressFormat=%N%n%O%n%A%nSINGAPORE %Z +Required=AZ +PostalCodeFormat=\\d{6} + +[SH] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=(?:ASCN|STHL) 1ZZ + +[SI] +AddressFormat=%N%n%O%n%A%np.p. %P%nSI-%Z %C +PostalCodeFormat=\\d{4} + +[SJ] +AddressFormat=%N%n%O%n%A%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{4} + +[SK] +AddressFormat=%N%n%O%n%A%n%Z %C +Required=ACZ +PostalCodeFormat=\\d{3} ?\\d{2} + +[SM] +AddressFormat=%N%n%O%n%A%n%Z %C +Required=AZ +PostalCodeFormat=4789\\d + +[SN] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} + +[SO] +AddressFormat=%N%n%O%n%A%n%C, %S %Z +Upper=ACS +Required=ACS +PostalCodeFormat=[A-Z]{2} ?\\d{5} + +[SR] +AddressFormat=%N%n%O%n%A%n%C%n%S +Upper=AS + +[SV] +AddressFormat=%N%n%O%n%A%n%Z-%C%n%S +Upper=CSZ +Required=ACS +PostalCodeFormat=CP [1-3][1-7][0-2]\\d + +[SZ] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=ACZ +PostalCodeFormat=[HLMS]\\d{3} + +[TC] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Upper=CZ +Required=ACZ +PostalCodeFormat=TKCA 1ZZ + +[TH] +AddressFormat=%N%n%O%n%A%n%D %C%n%S %Z +LatinAddressFormat=%N%n%O%n%A%n%D, %C%n%S %Z +Upper=S +PostalCodeFormat=\\d{5} + +[TJ] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{6} + +[TM] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{6} + +[TN] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4} + +[TR] +AddressFormat=%N%n%O%n%A%n%Z %C/%S +Required=ACZ +PostalCodeFormat=\\d{5} + +[TV] +AddressFormat=%N%n%O%n%A%n%C%n%S +Upper=ACS + +[TW] +AddressFormat=%Z%n%S%C%n%A%n%O%n%N +LatinAddressFormat=%N%n%O%n%A%n%C, %S %Z +Required=ACSZ +PostalCodeFormat=\\d{3}(?:\\d{2,3})? + +[TZ] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{4,5} + +[UA] +AddressFormat=%N%n%O%n%A%n%C%n%S%n%Z +LatinAddressFormat=%N%n%O%n%A%n%C%n%S%n%Z +Required=ACZ +PostalCodeFormat=\\d{5} + +[UM] +AddressFormat=%N%n%O%n%A%n%C %S %Z +Upper=ACNOS +Required=ACS +PostalCodeFormat=96898 + +[US] +AddressFormat=%N%n%O%n%A%nPO BOX %P%n%C, %S %Z +Upper=CSR +Required=ACSZ +PostalCodeFormat=(\\d{5})(?:[ \\-](\\d{4}))? + +[UY] +AddressFormat=%N%n%O%n%A%n%Z %C %S +Upper=CS +PostalCodeFormat=\\d{5} + +[UZ] +AddressFormat=%N%n%O%n%A%n%Z %C%n%S +Upper=CS +PostalCodeFormat=\\d{6} + +[VA] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=00120 + +[VC] +AddressFormat=%N%n%O%n%A%n%C %Z +PostalCodeFormat=VC\\d{4} + +[VE] +AddressFormat=%N%n%O%n%A%n%C %Z, %S +Upper=CS +Required=ACS +PostalCodeFormat=\\d{4} + +[VG] +AddressFormat=%N%n%O%n%A%n%C%n%Z +Required=A +PostalCodeFormat=VG\\d{4} + +[VI] +AddressFormat=%N%n%O%n%A%n%C %S %Z +Upper=ACNOS +Required=ACSZ +PostalCodeFormat=(008(?:(?:[0-4]\\d)|(?:5[01])))(?:[ \\-](\\d{4}))? + +[VN] +AddressFormat=%N%n%O%n%A%n%C%n%S %Z +LatinAddressFormat=%N%n%O%n%A%n%C%n%S %Z +PostalCodeFormat=\\d{5}\\d? + +[WF] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=986\\d{2} + +[YT] +AddressFormat=%O%n%N%n%A%n%Z %C %X +Upper=ACX +Required=ACZ +PostalCodeFormat=976\\d{2} + +[ZA] +AddressFormat=%N%n%O%n%A%n%D%n%C%n%Z +Required=ACZ +PostalCodeFormat=\\d{4} + +[ZM] +AddressFormat=%N%n%O%n%A%n%Z %C +PostalCodeFormat=\\d{5} diff --git a/src/addressformatscript.cpp b/src/addressformatscript.cpp new file mode 100644 index 0000000..512d7cb --- /dev/null +++ b/src/addressformatscript.cpp @@ -0,0 +1,32 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "address.h" +#include "addressformatscript_p.h" + +using namespace KContacts; + +AddressFormatScript::ScriptType AddressFormatScript::detect(const QString &s) +{ + for (auto c : s) { + switch (c.script()) { + case QChar::Script_Arabic: + return AddressFormatScript::ArabicLikeScript; + case QChar::Script_Han: + return AddressFormatScript::HanLikeScript; + case QChar::Script_Hangul: + case QChar::Script_Thai: + return AddressFormatScript::HangulLikeScript; + default: + break; + } + } + return AddressFormatScript::LatinLikeScript; +} + +AddressFormatScript::ScriptType AddressFormatScript::detect(const Address &addr) +{ + return std::max(detect(addr.street()), detect(addr.locality())); +} diff --git a/src/addressformatscript_p.h b/src/addressformatscript_p.h new file mode 100644 index 0000000..f36e807 --- /dev/null +++ b/src/addressformatscript_p.h @@ -0,0 +1,37 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSFORMATSCRIPT_P_H +#define KCONTACTS_ADDRESSFORMATSCRIPT_P_H + +#include "addressformat.h" + +namespace KContacts +{ + +/** + * Classify the script used in an address. + * This is used for two things: + * - determining the line style separator + * - decide whether to use local or latin script format alternatives when available + * + * @see address_formatter.cc in libaddressinput + * @internal + */ +namespace AddressFormatScript +{ +enum ScriptType { + LatinLikeScript, + ArabicLikeScript, + HanLikeScript, + HangulLikeScript, +}; + +ScriptType detect(const QString &s); +ScriptType detect(const Address &addr); +} +} + +#endif // KCONTACTS_ADDRESSFORMATSCRIPT_P_H diff --git a/src/addressformatter.cpp b/src/addressformatter.cpp new file mode 100644 index 0000000..2b67652 --- /dev/null +++ b/src/addressformatter.cpp @@ -0,0 +1,211 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + 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 + +#include +#include + +using namespace KContacts; + +static constexpr auto AllFields = AddressFormatField::Country | AddressFormatField::Region | AddressFormatField::Locality + | AddressFormatField::DependentLocality | AddressFormatField::SortingCode | AddressFormatField::PostalCode | AddressFormatField::StreetAddress + | AddressFormatField::Organization | AddressFormatField::Name | AddressFormatField::PostOfficeBox; +static constexpr auto AllDomesticFields = AllFields & ~(int)AddressFormatField::Country; +static constexpr auto GeoUriFields = AddressFormatField::StreetAddress | AddressFormatField::PostalCode | AddressFormatField::Locality + | AddressFormatField::DependentLocality | AddressFormatField::Region | AddressFormatField::Country; + +enum Separator { Newline, Comma, Native }; + +// keep the same order as the enum! +struct { + Separator separator; + bool honorUpper; + bool forceCountry; + AddressFormatFields includeFields; +} static constexpr const style_map[] = { + {Newline, true, true, AllDomesticFields}, // AddressFormatStyle::Postal + {Newline, false, false, AllDomesticFields}, // AddressFormatStyle::MultiLineDomestic + {Newline, false, true, AllFields}, // AddressFormatStyle::MultiLineInternational + {Native, false, false, AllDomesticFields}, // AddressFormatStyle::SingleLineDomestic + {Native, false, true, AllFields}, // AddressFormatStyle::SingleLineInternational + {Comma, true, true, GeoUriFields}, // AddressFormatStyle::GeoUriQuery +}; + +static constexpr const char *separator_map[] = {"\n", ","}; +static constexpr const char *native_separator_map[] = {", ", "، ", "", " "}; + +static bool isReverseOrder(const AddressFormat &fmt) +{ + return !fmt.elements().empty() && fmt.elements()[0].field() == AddressFormatField::Country; +} + +QString +AddressFormatter::format(const Address &address, const QString &name, const QString &organization, const AddressFormat &format, AddressFormatStyle style) +{ + const auto styleData = style_map[(int)style]; + const auto isFieldEmpty = [&](AddressFormatField f) -> bool { + if ((styleData.includeFields & f) == 0) { + return true; + } + switch (f) { + case AddressFormatField::NoField: + case AddressFormatField::DependentLocality: + case AddressFormatField::SortingCode: + return true; + case AddressFormatField::Name: + return name.isEmpty(); + case AddressFormatField::Organization: + return organization.isEmpty(); + case AddressFormatField::PostOfficeBox: + return address.postOfficeBox().isEmpty(); + case AddressFormatField::StreetAddress: + return address.street().isEmpty() && (address.extended().isEmpty() || style == AddressFormatStyle::GeoUriQuery); + case AddressFormatField::PostalCode: + return address.postalCode().isEmpty(); + case AddressFormatField::Locality: + return address.locality().isEmpty(); + case AddressFormatField::Region: + return address.region().isEmpty(); + case AddressFormatField::Country: + return address.country().isEmpty(); + } + return true; + }; + const auto countryName = [&]() -> QString { + if (address.country().isEmpty()) { + return {}; + } + // we use the already ISO 3166-1 resolved country from format here to + // avoid a potentially expensive second name-based lookup + return style == AddressFormatStyle::GeoUriQuery ? format.country() : KCountry::fromAlpha2(format.country()).name(); + }; + + QStringList lines; + QString line, secondaryLine; + + for (auto it = format.elements().begin(); it != format.elements().end(); ++it) { + // add separators if: + // - the preceding line is not empty + // - we use newline separators and the preceding element is another separator + const auto precedingSeparator = (it != format.elements().begin() && (*std::prev(it)).isSeparator()); + if ((*it).isSeparator() && (!line.isEmpty() || (precedingSeparator && styleData.separator == Newline))) { + lines.push_back(line); + line.clear(); + if (!secondaryLine.isEmpty()) { + lines.push_back(secondaryLine); + secondaryLine.clear(); + } + continue; + } + + // literals are only added if they not follow an empty field and are not preceding an empty field + // to support incomplete addresses we deviate from the libaddressinput algorithm here and also add + // the separator if any preceding field in the same line is non-empty, not just the immediate one. + // this is to produce useful output e.g. for "%C %S %Z" if %S is empty. + bool precedingFieldHasContent = (it == format.elements().begin() || (*std::prev(it)).isSeparator()); + for (auto it2 = it; !(*it2).isSeparator(); --it2) { + if ((*it2).isField() && !isFieldEmpty((*it2).field())) { + precedingFieldHasContent = true; + break; + } + if (it2 == format.elements().begin()) { + break; + } + } + const auto followingFieldEmpty = (std::next(it) != format.elements().end() && (*std::next(it)).isField() && isFieldEmpty((*std::next(it)).field())); + if ((*it).isLiteral() && precedingFieldHasContent && !followingFieldEmpty) { + line += (*it).literal(); + continue; + } + + if ((*it).isField() && (styleData.includeFields & (*it).field())) { + QString v; + switch ((*it).field()) { + case AddressFormatField::NoField: + case AddressFormatField::DependentLocality: + case AddressFormatField::SortingCode: + break; + case AddressFormatField::Name: + v = name; + break; + case AddressFormatField::Organization: + v = organization; + break; + case AddressFormatField::PostOfficeBox: + v = address.postOfficeBox(); + break; + case AddressFormatField::StreetAddress: + if (!address.street().isEmpty() && !address.extended().isEmpty() && style != AddressFormatStyle::GeoUriQuery) { + if (isReverseOrder(format)) { + secondaryLine = address.extended(); + } else { + lines.push_back(address.extended()); + } + } + v = address.street().isEmpty() ? address.extended() : address.street(); + break; + case AddressFormatField::PostalCode: + v = address.postalCode(); + break; + case AddressFormatField::Locality: + v = address.locality(); + break; + case AddressFormatField::Region: + v = address.region(); + break; + case AddressFormatField::Country: + v = countryName(); + break; + } + if (styleData.honorUpper && format.upperCaseFields() & (*it).field()) { + v = v.toUpper(); + } + line += v; + } + } + if (!line.isEmpty()) { + lines.push_back(line); + } + if (!secondaryLine.isEmpty()) { + lines.push_back(secondaryLine); + } + + // append country for formats that need it (international style + not yet present in format.elements()) + if (styleData.forceCountry && (format.usedFields() & AddressFormatField::Country & styleData.includeFields) == 0 && !address.country().isEmpty()) { + auto c = countryName(); + if (style == AddressFormatStyle::Postal) { + // the format of the country for postal addresses depends on the sending country, not the destination + const auto sourceCountry = KCountry::fromQLocale(QLocale().country()); + const auto sourceFmt = AddressFormatRepository::formatForCountry(sourceCountry.alpha2(), AddressFormatScriptPreference::Local); + const auto shouldPrepend = isReverseOrder(sourceFmt); + if (!lines.isEmpty()) { + shouldPrepend ? lines.push_front({}) : lines.push_back({}); + } + if (styleData.honorUpper && (sourceFmt.upperCaseFields() & AddressFormatField::Country)) { + c = c.toUpper(); + } + shouldPrepend ? lines.push_front(c) : lines.push_back(c); + } else { + if (styleData.honorUpper && (format.upperCaseFields() & AddressFormatField::Country)) { + c = c.toUpper(); + } + lines.push_back(c); + } + } + + if (styleData.separator == Native) { + const auto script = AddressFormatScript::detect(address); + return lines.join(QString::fromUtf8(native_separator_map[script])); + } + return lines.join(QLatin1String(separator_map[styleData.separator])); +} diff --git a/src/addressformatter_p.h b/src/addressformatter_p.h new file mode 100644 index 0000000..e4851a5 --- /dev/null +++ b/src/addressformatter_p.h @@ -0,0 +1,27 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_ADDRESSFORMATTER_H +#define KCONTACTS_ADDRESSFORMATTER_H + +#include "namespace.h" + +class QString; + +namespace KContacts +{ + +class Address; +class AddressFormat; + +/** Apply address formatting rules for a given address. */ +namespace AddressFormatter +{ +QString format(const Address &address, const QString &name, const QString &organization, const AddressFormat &format, AddressFormatStyle style); +}; + +} + +#endif // KCONTACTS_ADDRESSFORMATTER_H diff --git a/src/calendarurl.cpp b/src/calendarurl.cpp new file mode 100644 index 0000000..ba2f5f7 --- /dev/null +++ b/src/calendarurl.cpp @@ -0,0 +1,170 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "calendarurl.h" +#include "parametermap_p.h" + +#include +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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(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(type); + return s; +} diff --git a/src/calendarurl.h b/src/calendarurl.h new file mode 100644 index 0000000..aa9f6a6 --- /dev/null +++ b/src/calendarurl.h @@ -0,0 +1,95 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CALENDARURL_H +#define CALENDARURL_H +#include "kcontacts_export.h" + +#include +#include +#include +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; + +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const CalendarUrl &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, CalendarUrl &object); +} +Q_DECLARE_TYPEINFO(KContacts::CalendarUrl, Q_MOVABLE_TYPE); +#endif // CALENDARURL_H diff --git a/src/clientpidmap.cpp b/src/clientpidmap.cpp new file mode 100644 index 0000000..fd45415 --- /dev/null +++ b/src/clientpidmap.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "clientpidmap.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/clientpidmap.h b/src/clientpidmap.h new file mode 100644 index 0000000..8a09813 --- /dev/null +++ b/src/clientpidmap.h @@ -0,0 +1,83 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef CLIENTPIDMAP_H +#define CLIENTPIDMAP_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const ClientPidMap &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, ClientPidMap &object); +} +Q_DECLARE_TYPEINFO(KContacts::ClientPidMap, Q_MOVABLE_TYPE); +#endif // CLIENTPIDMAP_H diff --git a/src/contactgroup.cpp b/src/contactgroup.cpp new file mode 100644 index 0000000..c474836 --- /dev/null +++ b/src/contactgroup.cpp @@ -0,0 +1,483 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2008 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "contactgroup.h" + +#include +#include +#include +#include + +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 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 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 mCustoms; +}; + +ContactGroup::Data::Data() + : d(new DataPrivate) +{ +} + +ContactGroup::Data::Data(const Data &other) + : d(other.d) +{ +} + +ContactGroup::Data::Data(const QString &name, const QString &email) + : d(new DataPrivate) +{ + d->mName = name; + d->mEmail = email; +} + +ContactGroup::Data::~Data() +{ +} + +void ContactGroup::Data::setName(const QString &name) +{ + d->mName = name; +} + +QString ContactGroup::Data::name() const +{ + return d->mName; +} + +void ContactGroup::Data::setEmail(const QString &email) +{ + d->mEmail = email; +} + +QString ContactGroup::Data::email() const +{ + return d->mEmail; +} + +void ContactGroup::Data::insertCustom(const QString &key, const QString &value) +{ + d->mCustoms.insert(key, value); +} + +void ContactGroup::Data::removeCustom(const QString &key) +{ + d->mCustoms.remove(key); +} + +QString ContactGroup::Data::custom(const QString &key) const +{ + return d->mCustoms.value(key); +} + +ContactGroup::Data &ContactGroup::Data::operator=(const ContactGroup::Data &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +bool ContactGroup::Data::operator==(const Data &other) const +{ + return d->mName == other.d->mName // + && d->mEmail == other.d->mEmail // + && d->mCustoms == other.d->mCustoms; +} + +class Q_DECL_HIDDEN ContactGroup::Private : public QSharedData +{ +public: + Private() + : QSharedData() + , mIdentifier(QUuid::createUuid().toString().mid(1, 36)) // We avoid the curly braces so the string is RFC4122 compliant and can be used as urn + { + } + + Private(const Private &other) + : QSharedData(other) + { + mIdentifier = other.mIdentifier; + mName = other.mName; + mContactReferences = other.mContactReferences; + mContactGroupReferences = other.mContactGroupReferences; + mDataObjects = other.mDataObjects; + } + + QString mIdentifier; + QString mName; + ContactGroup::ContactReference::List mContactReferences; + ContactGroup::ContactGroupReference::List mContactGroupReferences; + ContactGroup::Data::List mDataObjects; +}; + +ContactGroup::ContactGroup() + : d(new Private) +{ +} + +ContactGroup::ContactGroup(const ContactGroup &other) + : d(other.d) +{ +} + +ContactGroup::ContactGroup(const QString &name) + : d(new Private) +{ + d->mName = name; +} + +ContactGroup::~ContactGroup() +{ +} + +void ContactGroup::setName(const QString &name) +{ + d->mName = name; +} + +QString ContactGroup::name() const +{ + return d->mName; +} + +void ContactGroup::setId(const QString &id) +{ + d->mIdentifier = id; +} + +QString ContactGroup::id() const +{ + return d->mIdentifier; +} + +int ContactGroup::count() const +{ + return d->mContactReferences.count() + d->mDataObjects.count(); +} + +int ContactGroup::contactReferenceCount() const +{ + return d->mContactReferences.count(); +} + +int ContactGroup::contactGroupReferenceCount() const +{ + return d->mContactGroupReferences.count(); +} + +int ContactGroup::dataCount() const +{ + return d->mDataObjects.count(); +} + +ContactGroup::ContactReference &ContactGroup::contactReference(int index) +{ + Q_ASSERT_X(index < d->mContactReferences.count(), "contactReference()", "index out of range"); + + return d->mContactReferences[index]; +} + +const ContactGroup::ContactReference &ContactGroup::contactReference(int index) const +{ + Q_ASSERT_X(index < d->mContactReferences.count(), "contactReference()", "index out of range"); + + return d->mContactReferences[index]; +} + +ContactGroup::ContactGroupReference &ContactGroup::contactGroupReference(int index) +{ + Q_ASSERT_X(index < d->mContactGroupReferences.count(), "contactGroupReference()", "index out of range"); + + return d->mContactGroupReferences[index]; +} + +const ContactGroup::ContactGroupReference &ContactGroup::contactGroupReference(int index) const +{ + Q_ASSERT_X(index < d->mContactGroupReferences.count(), "contactGroupReference()", "index out of range"); + + return d->mContactGroupReferences[index]; +} + +ContactGroup::Data &ContactGroup::data(int index) +{ + Q_ASSERT_X(index < d->mDataObjects.count(), "data()", "index out of range"); + + return d->mDataObjects[index]; +} + +const ContactGroup::Data &ContactGroup::data(int index) const +{ + Q_ASSERT_X(index < d->mDataObjects.count(), "data()", "index out of range"); + + return d->mDataObjects[index]; +} + +void ContactGroup::append(const ContactReference &reference) +{ + d->mContactReferences.append(reference); +} + +void ContactGroup::append(const ContactGroupReference &reference) +{ + d->mContactGroupReferences.append(reference); +} + +void ContactGroup::append(const Data &data) +{ + d->mDataObjects.append(data); +} + +void ContactGroup::remove(const ContactReference &reference) +{ + d->mContactReferences.removeOne(reference); +} + +void ContactGroup::remove(const ContactGroupReference &reference) +{ + d->mContactGroupReferences.removeOne(reference); +} + +void ContactGroup::remove(const Data &data) +{ + d->mDataObjects.removeOne(data); +} + +void ContactGroup::removeAllContactReferences() +{ + d->mContactReferences.clear(); +} + +void ContactGroup::removeAllContactGroupReferences() +{ + d->mContactGroupReferences.clear(); +} + +void ContactGroup::removeAllContactData() +{ + d->mDataObjects.clear(); +} + +ContactGroup &ContactGroup::operator=(const ContactGroup &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +bool ContactGroup::operator==(const ContactGroup &other) const +{ + return d->mIdentifier == other.d->mIdentifier // + && d->mName == other.d->mName // + && d->mContactReferences == other.d->mContactReferences // + && d->mContactGroupReferences == other.d->mContactGroupReferences // + && d->mDataObjects == other.d->mDataObjects; +} + +QString ContactGroup::mimeType() +{ + return QStringLiteral("application/x-vnd.kde.contactgroup"); +} diff --git a/src/contactgroup.h b/src/contactgroup.h new file mode 100644 index 0000000..481135f --- /dev/null +++ b/src/contactgroup.h @@ -0,0 +1,474 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2008 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_CONTACTGROUP_H +#define KCONTACTS_CONTACTGROUP_H + +#include +#include +#include + +#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 + * @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 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 d; + }; + + /** + * This class represents a contact group reference + */ + class KCONTACTS_EXPORT ContactGroupReference + { + public: + /** + * A list of contact group references. + */ + typedef QVector 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 d; + }; + + /** + * This class represents a contact data object + */ + class KCONTACTS_EXPORT Data + { + public: + /** + * A list of contact data. + */ + typedef QVector 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 d; + }; + + /** + * A list of contact groups. + */ + typedef QVector 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 d; +}; +} +Q_DECLARE_TYPEINFO(KContacts::ContactGroup::ContactGroupReference, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(KContacts::ContactGroup::ContactReference, Q_MOVABLE_TYPE); + +#define KCONTACTS_CONTACTGROUP_METATYPE_DEFINED +Q_DECLARE_METATYPE(KContacts::ContactGroup) + +#endif diff --git a/src/contactgroup.xsd b/src/contactgroup.xsd new file mode 100644 index 0000000..03592b0 --- /dev/null +++ b/src/contactgroup.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/contactgrouptool.cpp b/src/contactgrouptool.cpp new file mode 100644 index 0000000..1b5bab0 --- /dev/null +++ b/src/contactgrouptool.cpp @@ -0,0 +1,352 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2008 Tobias Koenig + SPDX-FileCopyrightText: 2008 Kevin Krammer + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "contactgrouptool.h" +#include "contactgroup.h" + +#include + +#include +#include + +using namespace KContacts; + +class XmlContactGroupWriter : public QXmlStreamWriter +{ +public: + XmlContactGroupWriter(); + + void write(const ContactGroup &group, QIODevice *device); + void write(const QVector &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 &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 &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 &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 &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 &groupList, QIODevice *device, QString *errorMessage) +{ + Q_UNUSED(errorMessage); + + XmlContactGroupWriter writer; + writer.write(groupList, device); + + return true; +} diff --git a/src/contactgrouptool.h b/src/contactgrouptool.h new file mode 100644 index 0000000..cf9e0ac --- /dev/null +++ b/src/contactgrouptool.h @@ -0,0 +1,57 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2008 Tobias Koenig + SPDX-FileCopyrightText: 2008 Kevin Krammer + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_CONTACTGROUPTOOL_H +#define KCONTACTS_CONTACTGROUPTOOL_H + +#include "kcontacts_export.h" +#include +class QIODevice; + +template +class QList; + +namespace KContacts +{ +class ContactGroup; + +/** + * Static methods for converting ContactGroup to XML format and vice versa. + * + * @author Kevin Krammer + * @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 &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 &list, QIODevice *device, QString *errorMessage = nullptr); +} +} + +#endif diff --git a/src/converter/CMakeLists.txt b/src/converter/CMakeLists.txt new file mode 100644 index 0000000..f32bfff --- /dev/null +++ b/src/converter/CMakeLists.txt @@ -0,0 +1,22 @@ +ecm_generate_headers(KContacts_CamelCase_Converter_HEADERS + HEADER_NAMES + LDIFConverter + VCardConverter + PREFIX KContacts + REQUIRED_HEADERS KContacts_Converter_HEADERS +) + +install(FILES + ${KContacts_CamelCase_Converter_HEADERS} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/KContacts + COMPONENT Devel +) + + +install(FILES + ${KContacts_Converter_HEADERS} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KContacts/kcontacts + COMPONENT Devel +) + + diff --git a/src/converter/ldifconverter.cpp b/src/converter/ldifconverter.cpp new file mode 100644 index 0000000..5de151e --- /dev/null +++ b/src/converter/ldifconverter.cpp @@ -0,0 +1,660 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Helge Deller + + 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 +#include + +#include +#include +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#include +#endif +#include + +using namespace KContacts; + +/* internal functions - do not use !! */ + +namespace KContacts +{ +/** + @internal + + Evaluates @p fieldname and sets the @p value at the addressee or the address + objects when appropriate. + + @param a The addressee to store information into + @param homeAddr The home address to store respective information into + @param workAddr The work address to store respective information into + @param fieldname LDIF field name to evaluate + @param value The value of the field addressed by @p fieldname +*/ +void evaluatePair(Addressee &a, + Address &homeAddr, + Address &workAddr, + QString &fieldname, + QString &value, + int &birthday, + int &birthmonth, + int &birthyear, + ContactGroup &contactGroup); +} + +/* generate LDIF stream */ + +static void ldif_out(QTextStream &t, const QString &formatStr, const QString &value) +{ + if (value.isEmpty()) { + return; + } + + const QByteArray txt = Ldif::assembleLine(formatStr, value, 72); + + // write the string + t << QString::fromUtf8(txt) << "\n"; +} + +bool LDIFConverter::addresseeAndContactGroupToLDIF(const AddresseeList &addrList, const ContactGroup::List &contactGroupList, QString &str) +{ + bool result = addresseeToLDIF(addrList, str); + if (!contactGroupList.isEmpty()) { + result = (contactGroupToLDIF(contactGroupList, str) || result); // order matters + } + return result; +} + +bool LDIFConverter::contactGroupToLDIF(const ContactGroup &contactGroup, QString &str) +{ + if (contactGroup.dataCount() <= 0) { + return false; + } + QTextStream t(&str, QIODevice::WriteOnly | QIODevice::Append); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + t.setCodec(QTextCodec::codecForName("UTF-8")); +#endif + + t << "objectclass: top\n"; + t << "objectclass: groupOfNames\n"; + + for (int i = 0; i < contactGroup.dataCount(); ++i) { + const ContactGroup::Data &data = contactGroup.data(i); + const QString value = QStringLiteral("cn=%1,mail=%2").arg(data.name(), data.email()); + ldif_out(t, QStringLiteral("member"), value); + } + + t << "\n"; + return true; +} + +bool LDIFConverter::contactGroupToLDIF(const ContactGroup::List &contactGroupList, QString &str) +{ + if (contactGroupList.isEmpty()) { + return false; + } + + bool result = true; + for (const ContactGroup &group : contactGroupList) { + result = (contactGroupToLDIF(group, str) || result); // order matters + } + return result; +} + +bool LDIFConverter::addresseeToLDIF(const AddresseeList &addrList, QString &str) +{ + if (addrList.isEmpty()) { + return false; + } + + bool result = true; + for (const Addressee &addr : addrList) { + result = (addresseeToLDIF(addr, str) || result); // order matters + } + return result; +} + +static QString countryName(const QString &isoCodeOrName) +{ + const auto c = KCountry::fromAlpha2(isoCodeOrName); + return c.isValid() ? c.name() : isoCodeOrName; +} + +bool LDIFConverter::addresseeToLDIF(const Addressee &addr, QString &str) +{ + if (addr.isEmpty()) { + return false; + } + + QTextStream t(&str, QIODevice::WriteOnly | QIODevice::Append); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + t.setCodec(QTextCodec::codecForName("UTF-8")); +#endif + + const Address homeAddr = addr.address(Address::Home); + const Address workAddr = addr.address(Address::Work); + + ldif_out(t, QStringLiteral("dn"), QStringLiteral("cn=%1,mail=%2").arg(addr.formattedName().simplified(), addr.preferredEmail())); + t << "objectclass: top\n"; + t << "objectclass: person\n"; + t << "objectclass: organizationalPerson\n"; + + ldif_out(t, QStringLiteral("givenname"), addr.givenName()); + ldif_out(t, QStringLiteral("sn"), addr.familyName()); + ldif_out(t, QStringLiteral("cn"), addr.formattedName().simplified()); + ldif_out(t, QStringLiteral("uid"), addr.uid()); + ldif_out(t, QStringLiteral("nickname"), addr.nickName()); + ldif_out(t, QStringLiteral("xmozillanickname"), addr.nickName()); + ldif_out(t, QStringLiteral("mozillanickname"), addr.nickName()); + + ldif_out(t, QStringLiteral("mail"), addr.preferredEmail()); + const QStringList emails = addr.emails(); + const int numEmails = emails.count(); + for (int i = 1; i < numEmails; ++i) { + if (i == 0) { + // nothing + } else if (i == 1) { + ldif_out(t, QStringLiteral("mozillasecondemail"), emails[1]); + } else { + ldif_out(t, QStringLiteral("othermailbox"), emails[i]); + } + } + // ldif_out( t, "mozilla_AIMScreenName: %1\n", "screen_name" ); + + ldif_out(t, QStringLiteral("telephonenumber"), addr.phoneNumber(PhoneNumber::Work).number()); + ldif_out(t, QStringLiteral("facsimiletelephonenumber"), addr.phoneNumber(PhoneNumber::Fax).number()); + ldif_out(t, QStringLiteral("homephone"), addr.phoneNumber(PhoneNumber::Home).number()); + ldif_out(t, QStringLiteral("mobile"), + addr.phoneNumber(PhoneNumber::Cell).number()); // Netscape 7 + ldif_out(t, QStringLiteral("cellphone"), + addr.phoneNumber(PhoneNumber::Cell).number()); // Netscape 4.x + ldif_out(t, QStringLiteral("pager"), addr.phoneNumber(PhoneNumber::Pager).number()); + ldif_out(t, QStringLiteral("pagerphone"), addr.phoneNumber(PhoneNumber::Pager).number()); + + ldif_out(t, QStringLiteral("streethomeaddress"), homeAddr.street()); + ldif_out(t, QStringLiteral("postalcode"), workAddr.postalCode()); + ldif_out(t, QStringLiteral("postofficebox"), workAddr.postOfficeBox()); + + QStringList streets = homeAddr.street().split(QLatin1Char('\n')); + const int numberOfStreets(streets.count()); + if (numberOfStreets > 0) { + ldif_out(t, QStringLiteral("homepostaladdress"), streets.at(0)); // Netscape 7 + } + if (numberOfStreets > 1) { + ldif_out(t, QStringLiteral("mozillahomepostaladdress2"), streets.at(1)); // Netscape 7 + } + ldif_out(t, QStringLiteral("mozillahomelocalityname"), homeAddr.locality()); // Netscape 7 + ldif_out(t, QStringLiteral("mozillahomestate"), homeAddr.region()); + ldif_out(t, QStringLiteral("mozillahomepostalcode"), homeAddr.postalCode()); + ldif_out(t, QStringLiteral("mozillahomecountryname"), countryName(homeAddr.country())); + ldif_out(t, QStringLiteral("locality"), workAddr.locality()); + ldif_out(t, QStringLiteral("streetaddress"), workAddr.street()); // Netscape 4.x + + streets = workAddr.street().split(QLatin1Char('\n')); + const int streetsCount = streets.count(); + if (streetsCount > 0) { + ldif_out(t, QStringLiteral("street"), streets.at(0)); + } + if (streetsCount > 1) { + ldif_out(t, QStringLiteral("mozillaworkstreet2"), streets.at(1)); + } + ldif_out(t, QStringLiteral("countryname"), countryName(workAddr.country())); + ldif_out(t, QStringLiteral("l"), workAddr.locality()); + ldif_out(t, QStringLiteral("c"), countryName(workAddr.country())); + ldif_out(t, QStringLiteral("st"), workAddr.region()); + + ldif_out(t, QStringLiteral("title"), addr.title()); + ldif_out(t, QStringLiteral("vocation"), addr.prefix()); + ldif_out(t, QStringLiteral("ou"), addr.role()); + ldif_out(t, QStringLiteral("o"), addr.organization()); + ldif_out(t, QStringLiteral("organization"), addr.organization()); + ldif_out(t, QStringLiteral("organizationname"), addr.organization()); + + // Compatibility with older kabc versions. + if (!addr.department().isEmpty()) { + ldif_out(t, QStringLiteral("department"), addr.department()); + } else { + ldif_out(t, QStringLiteral("department"), addr.custom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-Department"))); + } + + ldif_out(t, QStringLiteral("workurl"), addr.url().url().toDisplayString()); + ldif_out(t, QStringLiteral("homeurl"), addr.url().url().toDisplayString()); + ldif_out(t, QStringLiteral("mozillahomeurl"), addr.url().url().toDisplayString()); + + ldif_out(t, QStringLiteral("description"), addr.note()); + if (addr.revision().isValid()) { + ldif_out(t, QStringLiteral("modifytimestamp"), dateToVCardString(addr.revision())); + } + + const QDate birthday = addr.birthday().date(); + if (birthday.isValid()) { + const int year = birthday.year(); + if (year > 0) { + ldif_out(t, QStringLiteral("birthyear"), QString::number(year)); + } + ldif_out(t, QStringLiteral("birthmonth"), QString::number(birthday.month())); + ldif_out(t, QStringLiteral("birthday"), QString::number(birthday.day())); + } + + t << "\n"; + + return true; +} + +/* convert from LDIF stream */ +bool LDIFConverter::LDIFToAddressee(const QString &str, AddresseeList &addrList, ContactGroup::List &contactGroupList, const QDateTime &dt) +{ + if (str.isEmpty()) { + return true; + } + + bool endldif = false; + bool end = false; + Ldif ldif; + Ldif::ParseValue ret; + Addressee a; + Address homeAddr; + Address workAddr; + int birthday = -1; + int birthmonth = -1; + int birthyear = -1; + ContactGroup contactGroup; + ldif.setLdif(str.toLatin1()); + QDateTime qdt = dt; + if (!qdt.isValid()) { + qdt = QDateTime::currentDateTime(); + } + a.setRevision(qdt); + homeAddr = Address(Address::Home); + workAddr = Address(Address::Work); + + do { + ret = ldif.nextItem(); + switch (ret) { + case Ldif::Item: { + QString fieldname = ldif.attr().toLower(); + QString value = QString::fromUtf8(ldif.value()); + evaluatePair(a, homeAddr, workAddr, fieldname, value, birthday, birthmonth, birthyear, contactGroup); + break; + } + case Ldif::EndEntry: + if (contactGroup.count() == 0) { + // if the new address is not empty, append it + QDate birthDate(birthyear, birthmonth, birthday); + if (birthDate.isValid()) { + a.setBirthday(birthDate); + } + + if (!a.formattedName().isEmpty() || !a.name().isEmpty() || !a.familyName().isEmpty()) { + if (!homeAddr.isEmpty()) { + a.insertAddress(homeAddr); + } + if (!workAddr.isEmpty()) { + a.insertAddress(workAddr); + } + addrList.append(a); + } + } else { + contactGroupList.append(contactGroup); + } + a = Addressee(); + contactGroup = ContactGroup(); + a.setRevision(qdt); + homeAddr = Address(Address::Home); + workAddr = Address(Address::Work); + break; + case Ldif::MoreData: + if (endldif) { + end = true; + } else { + ldif.endLdif(); + endldif = true; + break; + } + default: + break; + } + } while (!end); + + return true; +} + +void KContacts::evaluatePair(Addressee &a, + Address &homeAddr, + Address &workAddr, + QString &fieldname, + QString &value, + int &birthday, + int &birthmonth, + int &birthyear, + ContactGroup &contactGroup) +{ + if (fieldname == QLatin1String("dn")) { // ignore + return; + } + + if (fieldname.startsWith(QLatin1Char('#'))) { + return; + } + + if (fieldname.isEmpty() && !a.note().isEmpty()) { + // some LDIF export filters are broken and add additional + // comments on stand-alone lines. Just add them to the notes for now. + a.setNote(a.note() + QLatin1Char('\n') + value); + return; + } + + if (fieldname == QLatin1String("givenname")) { + a.setGivenName(value); + return; + } + + if (fieldname == QLatin1String("xmozillanickname") // + || fieldname == QLatin1String("nickname") // + || fieldname == QLatin1String("mozillanickname")) { + a.setNickName(value); + return; + } + + if (fieldname == QLatin1String("sn")) { + a.setFamilyName(value); + return; + } + + if (fieldname == QLatin1String("uid")) { + a.setUid(value); + return; + } + if (fieldname == QLatin1String("mail") // + || fieldname == QLatin1String("mozillasecondemail") /* mozilla */ + || fieldname == QLatin1String("othermailbox") /*TheBat!*/) { + if (a.emails().indexOf(value) == -1) { + a.addEmail(value); + } + return; + } + + if (fieldname == QLatin1String("title")) { + a.setTitle(value); + return; + } + + if (fieldname == QLatin1String("vocation")) { + a.setPrefix(value); + return; + } + + if (fieldname == QLatin1String("cn")) { + a.setFormattedName(value); + return; + } + + if (fieldname == QLatin1Char('o') || fieldname == QLatin1String("organization") // Exchange + || fieldname == QLatin1String("organizationname")) { // Exchange + a.setOrganization(value); + return; + } + + // clang-format off + if (fieldname == QLatin1String("description") + || fieldname == QLatin1String("mozillacustom1") + || fieldname == QLatin1String("mozillacustom2") + || fieldname == QLatin1String("mozillacustom3") + || fieldname == QLatin1String("mozillacustom4") + || fieldname == QLatin1String("custom1") + || fieldname == QLatin1String("custom2") + || fieldname == QLatin1String("custom3") + || fieldname == QLatin1String("custom4")) { + if (!a.note().isEmpty()) { + a.setNote(a.note() + QLatin1Char('\n')); + } + a.setNote(a.note() + value); + return; + } + // clang-format on + + if (fieldname == QLatin1String("homeurl") // + || fieldname == QLatin1String("workurl") // + || fieldname == QLatin1String("mozillahomeurl")) { + if (a.url().url().isEmpty()) { + ResourceLocatorUrl url; + url.setUrl(QUrl(value)); + a.setUrl(url); + return; + } + if (a.url().url().toDisplayString() == QUrl(value).toDisplayString()) { + return; + } + // TODO: current version of kabc only supports one URL. + // TODO: change this with KDE 4 + } + + if (fieldname == QLatin1String("homephone")) { + a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Home)); + return; + } + + if (fieldname == QLatin1String("telephonenumber")) { + a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Work)); + return; + } + if (fieldname == QLatin1String("mobile") /* mozilla/Netscape 7 */ + || fieldname == QLatin1String("cellphone")) { + a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Cell)); + return; + } + + if (fieldname == QLatin1String("pager") // mozilla + || fieldname == QLatin1String("pagerphone")) { // mozilla + a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Pager)); + return; + } + + if (fieldname == QLatin1String("facsimiletelephonenumber")) { + a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Fax)); + return; + } + + if (fieldname == QLatin1String("xmozillaanyphone")) { // mozilla + a.insertPhoneNumber(PhoneNumber(value, PhoneNumber::Work)); + return; + } + + if (fieldname == QLatin1String("streethomeaddress") // + || fieldname == QLatin1String("mozillahomestreet")) { // thunderbird + homeAddr.setStreet(value); + return; + } + + if (fieldname == QLatin1String("street") // + || fieldname == QLatin1String("postaladdress")) { // mozilla + workAddr.setStreet(value); + return; + } + if (fieldname == QLatin1String("mozillapostaladdress2") // + || fieldname == QLatin1String("mozillaworkstreet2")) { // mozilla + workAddr.setStreet(workAddr.street() + QLatin1Char('\n') + value); + return; + } + + if (fieldname == QLatin1String("postalcode")) { + workAddr.setPostalCode(value); + return; + } + + if (fieldname == QLatin1String("postofficebox")) { + workAddr.setPostOfficeBox(value); + return; + } + + if (fieldname == QLatin1String("homepostaladdress")) { // Netscape 7 + homeAddr.setStreet(value); + return; + } + + if (fieldname == QLatin1String("mozillahomepostaladdress2")) { // mozilla + homeAddr.setStreet(homeAddr.street() + QLatin1Char('\n') + value); + return; + } + + if (fieldname == QLatin1String("mozillahomelocalityname")) { // mozilla + homeAddr.setLocality(value); + return; + } + + if (fieldname == QLatin1String("mozillahomestate")) { // mozilla + homeAddr.setRegion(value); + return; + } + + if (fieldname == QLatin1String("mozillahomepostalcode")) { // mozilla + homeAddr.setPostalCode(value); + return; + } + + if (fieldname == QLatin1String("mozillahomecountryname")) { // mozilla + if (value.length() <= 2) { + value = countryName(value); + } + homeAddr.setCountry(value); + return; + } + + if (fieldname == QLatin1String("locality")) { + workAddr.setLocality(value); + return; + } + + if (fieldname == QLatin1String("streetaddress")) { // Netscape 4.x + workAddr.setStreet(value); + return; + } + + if (fieldname == QLatin1String("countryname") // + || fieldname == QLatin1Char('c')) { // mozilla + if (value.length() <= 2) { + value = countryName(value); + } + workAddr.setCountry(value); + return; + } + + if (fieldname == QLatin1Char('l')) { // mozilla + workAddr.setLocality(value); + return; + } + + if (fieldname == QLatin1String("st")) { + workAddr.setRegion(value); + return; + } + + if (fieldname == QLatin1String("ou")) { + a.setRole(value); + return; + } + + if (fieldname == QLatin1String("department")) { + a.setDepartment(value); + return; + } + + if (fieldname == QLatin1String("member")) { + // this is a mozilla list member (cn=xxx, mail=yyy) + const QStringList list = value.split(QLatin1Char(',')); + QString name; + QString email; + + const QLatin1String cnTag("cn="); + const QLatin1String mailTag("mail="); + for (const auto &str : list) { + if (str.startsWith(cnTag)) { + name = QStringView(str).mid(cnTag.size()).trimmed().toString(); + } else if (str.startsWith(mailTag)) { + email = QStringView(str).mid(mailTag.size()).trimmed().toString(); + } + } + + if (!name.isEmpty() && !email.isEmpty()) { + email = QLatin1String(" <") + email + QLatin1Char('>'); + } + ContactGroup::Data data; + data.setEmail(email); + data.setName(name); + contactGroup.append(data); + return; + } + + if (fieldname == QLatin1String("modifytimestamp")) { + if (value == QLatin1String("0Z")) { // ignore + return; + } + QDateTime dt = VCardStringToDate(value); + if (dt.isValid()) { + a.setRevision(dt); + return; + } + } + + if (fieldname == QLatin1String("display-name")) { + contactGroup.setName(value); + return; + } + + if (fieldname == QLatin1String("objectclass")) { // ignore + return; + } + + if (fieldname == QLatin1String("birthyear")) { + bool ok; + birthyear = value.toInt(&ok); + if (!ok) { + birthyear = -1; + } + return; + } + if (fieldname == QLatin1String("birthmonth")) { + birthmonth = value.toInt(); + return; + } + if (fieldname == QLatin1String("birthday")) { + birthday = value.toInt(); + return; + } + if (fieldname == QLatin1String("xbatbirthday")) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const QStringView str{value}; +#else + const QStringRef str{&value}; +#endif + QDate dt(str.mid(0, 4).toInt(), str.mid(4, 2).toInt(), str.mid(6, 2).toInt()); + if (dt.isValid()) { + a.setBirthday(dt); + } + return; + } + qCWarning(KCONTACTS_LOG) << QStringLiteral("LDIFConverter: Unknown field for '%1': '%2=%3'\n").arg(a.formattedName(), fieldname, value); +} diff --git a/src/converter/ldifconverter.h b/src/converter/ldifconverter.h new file mode 100644 index 0000000..5752c5f --- /dev/null +++ b/src/converter/ldifconverter.h @@ -0,0 +1,83 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Helge Deller + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_LDIFCONVERTER_H +#define KCONTACTS_LDIFCONVERTER_H + +#include "addressee.h" +#include "contactgroup.h" + +#include +#include + +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 &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 &contactGroupList, QString &str); +/** + Converts an addressee to a LDIF string. + + @param addr The addressee. + @param str The LDIF string. +*/ +Q_REQUIRED_RESULT KCONTACTS_EXPORT bool addresseeToLDIF(const Addressee &addr, QString &str); + +/** + Converts a list of contact group to a LDIF string. + + @param contactGroupList The contact group list + @param str The LDIF string. +*/ +Q_REQUIRED_RESULT KCONTACTS_EXPORT bool contactGroupToLDIF(const ContactGroup::List &contactGroupList, QString &str); + +/** + Converts a contact group to a LDIF string. + + @param contactGroup The contact group + @param str The LDIF string. +*/ +Q_REQUIRED_RESULT KCONTACTS_EXPORT bool contactGroupToLDIF(const ContactGroup &contactGroup, QString &str); +} +} +#endif diff --git a/src/converter/vcardconverter.cpp b/src/converter/vcardconverter.cpp new file mode 100644 index 0000000..121b1b1 --- /dev/null +++ b/src/converter/vcardconverter.cpp @@ -0,0 +1,145 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "vcardconverter.h" +#include "vcardtool_p.h" + +using namespace KContacts; + +VCardConverter::VCardConverter() + : d(nullptr) +{ +} + +VCardConverter::~VCardConverter() +{ +} + +QByteArray VCardConverter::exportVCard(const Addressee &addr, Version version) const +{ + Addressee::List list; + list.append(addr); + + return exportVCards(list, version); +} + +QByteArray VCardConverter::exportVCards(const Addressee::List &list, Version version) const +{ + VCardTool tool; + QByteArray returnValue; + switch (version) { + case v2_1: + returnValue = tool.exportVCards(list, VCard::v2_1); + break; + case v3_0: + returnValue = tool.exportVCards(list, VCard::v3_0); + break; + case v4_0: + returnValue = tool.exportVCards(list, VCard::v4_0); + break; + } + + return returnValue; +} + +QByteArray VCardConverter::createVCard(const Addressee &addr, Version version) const +{ + Addressee::List list; + list.append(addr); + + return createVCards(list, version); +} + +QByteArray VCardConverter::createVCards(const Addressee::List &list, Version version) const +{ + VCardTool tool; + QByteArray returnValue; + switch (version) { + case v2_1: + returnValue = tool.createVCards(list, VCard::v2_1); + break; + case v3_0: + returnValue = tool.createVCards(list, VCard::v3_0); + break; + case v4_0: + returnValue = tool.createVCards(list, VCard::v4_0); + break; + } + + return returnValue; +} + +Addressee VCardConverter::parseVCard(const QByteArray &vcard) const +{ + Addressee::List list = parseVCards(vcard); + + return list.isEmpty() ? Addressee() : list[0]; +} + +Addressee::List VCardConverter::parseVCards(const QByteArray &vcard) const +{ + VCardTool tool; + + return tool.parseVCards(vcard); +} + +/* Helper functions */ + +QString KContacts::dateToVCardString(const QDateTime &dateTime) +{ + return dateTime.toString(QStringLiteral("yyyyMMddThhmmssZ")); +} + +QString KContacts::dateToVCardString(QDate date) +{ + return date.toString(QStringLiteral("yyyyMMdd")); +} + +QDateTime KContacts::VCardStringToDate(const QString &dateString) +{ + QDate date; + QTime time; + QString d(dateString); + + d = d.remove(QLatin1Char('-')).remove(QLatin1Char(':')); + + if (d.length() >= 8) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const QStringView strView(d); + date = QDate(strView.mid(0, 4).toUInt(), strView.mid(4, 2).toUInt(), strView.mid(6, 2).toUInt()); +#else + date = QDate(d.midRef(0, 4).toUInt(), d.midRef(4, 2).toUInt(), d.midRef(6, 2).toUInt()); +#endif + } + + if (d.length() > 9 && d[8].toUpper() == QLatin1Char('T')) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const QStringView strView(d); + time = QTime(strView.mid(9, 2).toUInt(), strView.mid(11, 2).toUInt(), strView.mid(13, 2).toUInt()); +#else + time = QTime(d.midRef(9, 2).toUInt(), d.midRef(11, 2).toUInt(), d.midRef(13, 2).toUInt()); +#endif + } + + return QDateTime(date, time); +} + +void KContacts::adaptIMAttributes(QByteArray &data) +{ + data.replace("X-messaging/aim-All", ("X-AIM")); + data.replace("X-messaging/icq-All", ("X-ICQ")); + data.replace("X-messaging/xmpp-All", ("X-JABBER")); + data.replace("X-messaging/msn-All", ("X-MSN")); + data.replace("X-messaging/yahoo-All", ("X-YAHOO")); + data.replace("X-messaging/gadu-All", ("X-GADUGADU")); + data.replace("X-messaging/skype-All", ("X-SKYPE")); + data.replace("X-messaging/groupwise-All", ("X-GROUPWISE")); + data.replace("X-messaging/sms-All", ("X-SMS")); + data.replace("X-messaging/meanwhile-All", ("X-MEANWHILE")); + data.replace("X-messaging/irc-All", ("X-IRC")); + data.replace("X-messaging/googletalk-All", ("X-GTALK")); +} diff --git a/src/converter/vcardconverter.h b/src/converter/vcardconverter.h new file mode 100644 index 0000000..8fffe05 --- /dev/null +++ b/src/converter/vcardconverter.h @@ -0,0 +1,142 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + 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 + +namespace KContacts +{ +/** + @short Class to converting contact objects into vCard format and vice versa. + + This class implements reading and writing of contact using from/to the + vCard format. Currently vCard version 2.1 and 3.0 is supported. + + Example: + + \code + + QFile file( "myfile.vcf" ); + file.open( QIODevice::ReadOnly ); + + QByteArray data = file.readAll(); + + VCardConverter converter; + Addressee::List list = converter.parseVCards( data ); + + // print formatted name of first contact + qDebug( "name=%s", list[ 0 ].formattedName().toLatin1() ); + + \endcode +*/ +class KCONTACTS_EXPORT VCardConverter +{ +public: + /** + @li v2_1 - VCard format version 2.1 + @li v3_0 - VCard format version 3.0 + @li v4_0 - VCard format version 4.0 + */ + enum Version { + v2_1, + v3_0, + v4_0, + }; + + /** + Constructor. + */ + VCardConverter(); + + /** + Destructor. + */ + ~VCardConverter(); + + /** + Creates a string in vCard format which contains the given + contact. + + @param addr The contact object + @param version The version of the generated vCard format + */ + Q_REQUIRED_RESULT QByteArray createVCard(const Addressee &addr, Version version = v3_0) const; + + /** + Creates a string in vCard format which contains the given + list of contact. + + @param list The list of contact objects + @param version The version of the generated vCard format + */ + // FIXME: Add error handling + Q_REQUIRED_RESULT QByteArray createVCards(const Addressee::List &list, Version version = v3_0) const; + + /** + * @since 4.9.1 + */ + Q_REQUIRED_RESULT QByteArray exportVCard(const Addressee &addr, Version version) const; + + /** + * @since 4.9.1 + */ + Q_REQUIRED_RESULT QByteArray exportVCards(const Addressee::List &list, Version version) const; + + /** + Parses a string in vCard format and returns the first contact. + */ + Q_REQUIRED_RESULT Addressee parseVCard(const QByteArray &vcard) const; + + /** + Parses a string in vCard format and returns a list of contact objects. + */ + // FIXME: Add error handling + Q_REQUIRED_RESULT Addressee::List parseVCards(const QByteArray &vcard) const; + +private: + Q_DISABLE_COPY(VCardConverter) + class VCardConverterPrivate; + VCardConverterPrivate *const d; +}; + +/** + Helper functions + */ + +/** + * Converts a QDateTime to a date string as it is used in VCard and LDIF files. + * The return value is in the form "yyyyMMddThhmmssZ" (e.g. "20031201T120000Z") + * @param dateTime date and time to be converted + */ +Q_REQUIRED_RESULT KCONTACTS_EXPORT QString dateToVCardString(const QDateTime &dateTime); + +/** + * Converts a QDate to a short date string as it is used in VCard and LDIF files. + * The return value is in the form "yyyyMMdd" (e.g. "20031201") + * @param date date to be converted + */ +Q_REQUIRED_RESULT KCONTACTS_EXPORT QString dateToVCardString(QDate date); + +/** + * Converts a date string as it is used in VCard and LDIF files to a QDateTime value. + * If the date string does not contain a time value, it will be returned as 00:00:00. + * (e.g. "20031201T120000" will return a QDateTime for 2003-12-01 at 12:00) + * @param dateString string representing the date and time. + */ +Q_REQUIRED_RESULT KCONTACTS_EXPORT QDateTime VCardStringToDate(const QString &dateString); + +/** + * @brief adaptIMAttributes. Convert KAddressBook attribute to VCard IM Attribute + * @param data + */ +KCONTACTS_EXPORT void adaptIMAttributes(QByteArray &data); +} +#endif diff --git a/src/email.cpp b/src/email.cpp new file mode 100644 index 0000000..f61f772 --- /dev/null +++ b/src/email.cpp @@ -0,0 +1,234 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "email.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/email.h b/src/email.h new file mode 100644 index 0000000..bddb570 --- /dev/null +++ b/src/email.h @@ -0,0 +1,136 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef EMAIL_H +#define EMAIL_H + +#include "kcontacts_export.h" + +#include +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(Email::Type) + +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Email &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Email &object); +} +Q_DECLARE_METATYPE(KContacts::Email) +Q_DECLARE_TYPEINFO(KContacts::Email, Q_MOVABLE_TYPE); +#endif // EMAIL_H diff --git a/src/field.cpp b/src/field.cpp new file mode 100644 index 0000000..16c5d39 --- /dev/null +++ b/src/field.cpp @@ -0,0 +1,639 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "field.h" + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +#include +#include +#include +#include + +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 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 fieldIds = cfg.readEntry(identifier, QList()); + + Field::List fields; + + int custom = 0; + QList::ConstIterator it; + fields.reserve(fieldIds.count()); + for (it = fieldIds.begin(); it != fieldIds.end(); ++it) { + Private *f = nullptr; + if ((*it) == Private::CustomField) { + QStringList customEntry = + cfg.readEntry(QLatin1String("KCONTACTS_CustomEntry_") + identifier + QLatin1Char('_') + QString::number(custom++), QStringList()); + f = new Private(*it, CustomCategory, customEntry[0], customEntry[1], customEntry[2]); + } else { + f = new Private(*it); + } + fields.append(new Field(f)); + } + + return fields; +} + +bool Field::equals(Field *field) +{ + bool sameId = (d->fieldId() == field->d->fieldId()); + + if (!sameId) { + return false; + } + + if (d->fieldId() != Private::CustomField) { + return true; + } + + return d->key() == field->d->key(); +} + +Field *Field::createCustomField(const QString &label, int category, const QString &key, const QString &app) +{ + Field *field = new Field(new Private(Private::CustomField, category | CustomCategory, label, key, app)); + Private::mCustomFields.append(field); + + return field; +} +#endif diff --git a/src/field.h b/src/field.h new file mode 100644 index 0000000..6890764 --- /dev/null +++ b/src/field.h @@ -0,0 +1,228 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Cornelius Schumacher + + 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 + +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 List; + + /** + * Represents the category a field belongs to. + */ + enum FieldCategory { + /** + * All fields + */ + All = 0x0, + /** + * Frequently used fields + */ + Frequent = 0x01, + /** + * Fields which belong to the address, such as Street, City, Zip, etc. + */ + Address = 0x02, + /** + * Fields which store information about the e-mail contact, such as + * e-mail address or mail client + */ + Email = 0x04, + /** + * Personal fields, such as Birthday, Home Address fields, IM Address, etc. + */ + Personal = 0x08, + /** + * Fields about the organization, such as Business Address fields, Department, + * Profession, etc. + */ + Organization = 0x10, + /** + * Custom (user-defined) fields + */ + CustomCategory = 0x20, + }; + + /** + * Returns the translated label for this field. + */ + Q_REQUIRED_RESULT virtual QString label(); + + /** + * Returns the ored categories the field belongs to. + */ + Q_REQUIRED_RESULT virtual int category(); + + /** + * Returns the translated label for @p category. + * + * @param category the category of type FieldCategory + * @return the translated label + */ + static QString categoryLabel(int category); + + /** + * Returns a string representation of the value the field has in the given + * Addressee. + * + * @return the string representation of the value or QString(), if it + * is not possible to convert the value to a string. + */ + Q_REQUIRED_RESULT virtual QString value(const KContacts::Addressee &addressee); + + /** + * Sets the value of the field in the given Addressee. + * + * @return @c true on success or @c false, if the given string couldn't + * be converted to a valid value. + */ + Q_REQUIRED_RESULT virtual bool setValue(KContacts::Addressee &addressee, const QString &value); + + /** + * Returns a string, that can be used for sorting. + */ + Q_REQUIRED_RESULT QString sortKey(const KContacts::Addressee &addressee); + + /** + * Returns, if the field is a user-defined field. + * + * @return @c true if this is a custom field, @c false otherwise + */ + Q_REQUIRED_RESULT virtual bool isCustom(); + + /** + * Returns, if the field is equal with @p field. + * + * @param field the field to compare this field to + * @return @c true if the fields are equal, @c false otherwise + */ + Q_REQUIRED_RESULT virtual bool equals(Field *field); + + /** + * Returns a list of all fields. + */ + static Field::List allFields(); + + /** + * Returns a list of the default fields. + */ + Q_REQUIRED_RESULT static Field::List defaultFields(); + + /** + * Creates a custom field. + * + * @param label The label for this field + * @param category The category of this field + * @param key Unique key for this field + * @param app Unique app name for this field + */ + static Field *createCustomField(const QString &label, int category, const QString &key, const QString &app); + + /** + * Delete all fields from list. + */ + static void deleteFields(); + + /** + * Save the field settings to a config file. + * + * @param cfg The config file object + * @param identifier The unique identifier + * @param fields The list of the fields + */ + static void saveFields(KConfigGroup &cfg, const QString &identifier, const Field::List &fields); + /** + * @overload + * + * Here, the list is stored in KSharedConfig::openConfig() in group "KABCFields". + * + * @param identifier The unique identifier + * @param fields The list of the fields + */ + static void saveFields(const QString &identifier, const Field::List &fields); + + /** + * Load the field settings from a config file. + * + * @param cfg The config file object + * @param identifier The unique identifier + */ + static Field::List restoreFields(const KConfigGroup &cfg, const QString &identifier); + + /** + * @overload + * + * Here, the list is loaded from KSharedConfig::openConfig() from group "KABCFields". + * + * @param identifier The unique identifier + */ + static Field::List restoreFields(const QString &identifier); + +protected: + /** + * @internal + * + * Creates a field and appends it to the general list of fields. + * + * @param id The identifier for the field + * @param category The optional category for the field + */ + static void createField(int id, int category = 0); + + /** + * @internal + * + * Creates a field and appends it to the list of default fields. + * + * @param id The identifier for the field + * @param category The optional category for the field + */ + static void createDefaultField(int id, int category = 0); + +private: + class Private; + + Field(Private *p); + virtual ~Field(); + + Private *const d; +}; +} +#endif +#endif diff --git a/src/fieldgroup.cpp b/src/fieldgroup.cpp new file mode 100644 index 0000000..f538f52 --- /dev/null +++ b/src/fieldgroup.cpp @@ -0,0 +1,142 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "fieldgroup.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/fieldgroup.h b/src/fieldgroup.h new file mode 100644 index 0000000..888cfd4 --- /dev/null +++ b/src/fieldgroup.h @@ -0,0 +1,86 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef FIELDGROUP_H +#define FIELDGROUP_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const FieldGroup &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, FieldGroup &object); +} +Q_DECLARE_TYPEINFO(KContacts::FieldGroup, Q_MOVABLE_TYPE); +#endif // FIELDGROUP_H diff --git a/src/gender.cpp b/src/gender.cpp new file mode 100644 index 0000000..71566d5 --- /dev/null +++ b/src/gender.cpp @@ -0,0 +1,113 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "gender.h" +#include "parametermap_p.h" + +using namespace KContacts; + +class Q_DECL_HIDDEN Gender::Private : public QSharedData +{ +public: + Private() + { + } + + Private(const Private &other) + : QSharedData(other) + { + comment = other.comment; + gender = other.gender; + } + + QString gender; + QString comment; +}; + +Gender::Gender() + : d(new Private) +{ +} + +Gender::Gender(const QString &gender) + : d(new Private) +{ + d->gender = gender; +} + +Gender::Gender(const Gender &other) + : d(other.d) +{ +} + +Gender::~Gender() +{ +} + +bool Gender::operator==(const Gender &other) const +{ + return (d->comment == other.comment()) && (d->gender == other.gender()); +} + +bool Gender::operator!=(const Gender &other) const +{ + return !(other == *this); +} + +Gender &Gender::operator=(const Gender &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +QString Gender::toString() const +{ + QString str = QLatin1String("Gender {\n"); + str += QStringLiteral(" gender: %1\n").arg(d->gender); + str += QStringLiteral(" comment: %1\n").arg(d->comment); + str += QLatin1String("}\n"); + return str; +} + +void Gender::setGender(const QString &gender) +{ + d->gender = gender; +} + +QString Gender::gender() const +{ + return d->gender; +} + +void Gender::setComment(const QString &comment) +{ + d->comment = comment; +} + +QString Gender::comment() const +{ + return d->comment; +} + +bool Gender::isValid() const +{ + return !d->gender.isEmpty() || !d->comment.isEmpty(); +} + +QDataStream &KContacts::operator<<(QDataStream &s, const Gender &gender) +{ + return s << gender.d->comment << gender.d->gender; +} + +QDataStream &KContacts::operator>>(QDataStream &s, Gender &gender) +{ + s >> gender.d->comment >> gender.d->gender; + return s; +} diff --git a/src/gender.h b/src/gender.h new file mode 100644 index 0000000..11a1263 --- /dev/null +++ b/src/gender.h @@ -0,0 +1,59 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef GENDER_H +#define GENDER_H +#include "kcontacts_export.h" +#include +#include + +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 d; +}; + +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Gender &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Gender &object); +} +Q_DECLARE_TYPEINFO(KContacts::Gender, Q_MOVABLE_TYPE); +#endif // GENDER_H diff --git a/src/geo.cpp b/src/geo.cpp new file mode 100644 index 0000000..65fa093 --- /dev/null +++ b/src/geo.cpp @@ -0,0 +1,162 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "geo.h" + +#include +#include + +using namespace KContacts; + +class Q_DECL_HIDDEN Geo::Private : public QSharedData +{ +public: + Private() + : mLatitude(91) + , mLongitude(181) + , mValidLatitude(false) + , mValidLongitude(false) + { + } + + Private(const Private &other) + : QSharedData(other) + { + mLatitude = other.mLatitude; + mLongitude = other.mLongitude; + mValidLatitude = other.mValidLatitude; + mValidLongitude = other.mValidLongitude; + } + + float mLatitude; + float mLongitude; + + bool mValidLatitude; + bool mValidLongitude; +}; + +Geo::Geo() + : d(new Private) +{ +} + +Geo::Geo(float latitude, float longitude) + : d(new Private) +{ + setLatitude(latitude); + setLongitude(longitude); +} + +Geo::Geo(const Geo &other) + : d(other.d) +{ +} + +Geo::~Geo() +{ +} + +void Geo::setLatitude(float latitude) +{ + if (latitude >= -90 && latitude <= 90) { + d->mLatitude = latitude; + d->mValidLatitude = true; + } else { + d->mLatitude = 91; + d->mValidLatitude = false; + } +} + +float Geo::latitude() const +{ + return d->mLatitude; +} + +void Geo::setLongitude(float longitude) +{ + if (longitude >= -180 && longitude <= 180) { + d->mLongitude = longitude; + d->mValidLongitude = true; + } else { + d->mLongitude = 181; + d->mValidLongitude = false; + } +} + +float Geo::longitude() const +{ + return d->mLongitude; +} + +bool Geo::isValid() const +{ + return d->mValidLatitude && d->mValidLongitude; +} + +bool Geo::operator==(const Geo &other) const +{ + if (!other.isValid() && !isValid()) { + return true; + } + + if (!other.isValid() || !isValid()) { + return false; + } + + if (other.d->mLatitude == d->mLatitude && other.d->mLongitude == d->mLongitude) { + return true; + } + + return false; +} + +bool Geo::operator!=(const Geo &other) const +{ + return !(*this == other); +} + +Geo &Geo::operator=(const Geo &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +QString Geo::toString() const +{ + QString str = QLatin1String("Geo {\n"); + str += QStringLiteral(" Valid: %1\n").arg(isValid() ? QStringLiteral("true") : QStringLiteral("false")); + str += QStringLiteral(" Latitude: %1\n").arg(d->mLatitude); + str += QStringLiteral(" Longitude: %1\n").arg(d->mLongitude); + str += QLatin1String("}\n"); + + return str; +} + +void Geo::clear() +{ + d->mValidLatitude = false; + d->mValidLongitude = false; +} + +// clang-format off +QDataStream &KContacts::operator<<(QDataStream &s, const Geo &geo) +{ + return s << geo.d->mLatitude << geo.d->mValidLatitude + << geo.d->mLongitude << geo.d->mValidLongitude; +} + +QDataStream &KContacts::operator>>(QDataStream &s, Geo &geo) +{ + s >> geo.d->mLatitude >> geo.d->mValidLatitude + >> geo.d->mLongitude >> geo.d->mValidLongitude; + + return s; +} +// clang-format on diff --git a/src/geo.h b/src/geo.h new file mode 100644 index 0000000..c50bdd0 --- /dev/null +++ b/src/geo.h @@ -0,0 +1,135 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_GEO_H +#define KCONTACTS_GEO_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 d; +}; + +/** + * Serializes the geographical position @p object into the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Geo &object); + +/** + * Initializes the geographical position @p object from the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Geo &object); +} +Q_DECLARE_METATYPE(KContacts::Geo) +Q_DECLARE_TYPEINFO(KContacts::Geo, Q_MOVABLE_TYPE); +#endif diff --git a/src/impp.cpp b/src/impp.cpp new file mode 100644 index 0000000..3eef884 --- /dev/null +++ b/src/impp.cpp @@ -0,0 +1,222 @@ +/* + This file is part of libkabc. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "impp.h" +#include "kcontacts_debug.h" +#include "parametermap_p.h" + +#include + +#include +#include +#include +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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 Impp::serviceTypes() +{ + QVector types; + auto paths = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kf5/kcontacts/improtocols"), QStandardPaths::LocateDirectory); + paths.push_back(QStringLiteral(":/org.kde.kcontacts/improtocols/")); + for (const auto &path : paths) { + QDirIterator it(path, QDir::Files); + while (it.hasNext()) { + it.next(); + const auto fi = it.fileInfo(); + if (fi.suffix() == QLatin1String("desktop")) { + types.push_back(fi.baseName()); + } + } + } + + std::sort(types.begin(), types.end()); + types.erase(std::unique(types.begin(), types.end()), types.end()); + return types; +} + +#include "moc_impp.cpp" diff --git a/src/impp.h b/src/impp.h new file mode 100644 index 0000000..64c24a7 --- /dev/null +++ b/src/impp.h @@ -0,0 +1,143 @@ +/* + This file is part of libkabc. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef IMPP_H +#define IMPP_H + +#include "kcontacts_export.h" + +#include +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 serviceTypes(); + +private: + void setParams(const ParameterMap ¶ms); + Q_REQUIRED_RESULT ParameterMap params() const; + + class Private; + QSharedDataPointer d; +}; + +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Impp &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Impp &object); +} + +Q_DECLARE_METATYPE(KContacts::Impp) +Q_DECLARE_TYPEINFO(KContacts::Impp, Q_MOVABLE_TYPE); +#endif // IMPP_H diff --git a/src/improtocols/NOTE b/src/improtocols/NOTE new file mode 100644 index 0000000..029b50d --- /dev/null +++ b/src/improtocols/NOTE @@ -0,0 +1 @@ +File names in here should match the corresponding URI scheme. diff --git a/src/improtocols/aim.desktop b/src/improtocols/aim.desktop new file mode 100644 index 0000000..a2b13fc --- /dev/null +++ b/src/improtocols/aim.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-aim +Comment=AIM Protocol +Comment[ar]=ميفاق AIM +Comment[az]=AIM Protokolu +Comment[bg]=Протокол на AIM +Comment[ca]=Protocol AIM +Comment[ca@valencia]=Protocol AIM +Comment[cs]=Protokol AIM +Comment[da]=AIM-protokollen +Comment[de]=AIM-Protokoll +Comment[el]=AIM πρωτόκολλο +Comment[en_GB]=AIM Protocol +Comment[es]=Protocolo AIM +Comment[et]=AIM protokoll +Comment[eu]=AIM Protokoloa +Comment[fi]=AIM-yhteyskäytäntö +Comment[fr]=Protocole AIM +Comment[gl]=Protocolo de AIM +Comment[hu]=AIM protokoll +Comment[ia]=Protocollo AIM +Comment[id]=Protokol AIM +Comment[it]=Protocollo AIM +Comment[ja]=AIM プロトコル +Comment[ka]=AIM პროტოკოლი +Comment[ko]=AIM 프로토콜 +Comment[lt]=AIM protokolas +Comment[nb]=AIM-protokoll +Comment[nl]=AIM-protocol +Comment[nn]=AIM-protokoll +Comment[pl]=Protokół AIM +Comment[pt]=Protocolo AIM +Comment[pt_BR]=Protocolo do AIM +Comment[ro]=Protocol AIM +Comment[ru]=Протокол AIM +Comment[sk]=AIM Protokol +Comment[sl]=Protokol AIM +Comment[sq]=AIM Protocol +Comment[sv]=AIM-protokoll +Comment[tg]=Протоколи AIM +Comment[tr]=AIM Protokolü +Comment[uk]=Протокол AIM +Comment[x-test]=xxAIM Protocolxx +Comment[zh_CN]=AIM 协议 +Comment[zh_TW]=AIM 通訊協定 +Name=AIM +Name[ar]=AIM +Name[az]=AIM +Name[bg]=AIM +Name[ca]=AIM +Name[ca@valencia]=AIM +Name[cs]=AIM +Name[da]=AIM +Name[de]=AIM +Name[el]=AIM +Name[en_GB]=AIM +Name[es]=AIM +Name[et]=AIM +Name[eu]=AIM +Name[fi]=AIM +Name[fr]=AIM +Name[gl]=AIM +Name[hu]=AIM +Name[ia]=AIM +Name[id]=AIM +Name[it]=AIM +Name[ja]=AIM +Name[ka]=AIM +Name[ko]=AIM +Name[lt]=AIM +Name[nb]=AIM +Name[nl]=AIM +Name[nn]=AIM +Name[pl]=AIM +Name[pt]=AIM +Name[pt_BR]=AIM +Name[ro]=AIM +Name[ru]=AIM +Name[sk]=AIM +Name[sl]=AIM +Name[sq]=AIM +Name[sv]=AIM +Name[tg]=AIM +Name[tr]=AIM +Name[uk]=AIM +Name[x-test]=xxAIMxx +Name[zh_CN]=AIM +Name[zh_TW]=AIM diff --git a/src/improtocols/facebook.desktop b/src/improtocols/facebook.desktop new file mode 100644 index 0000000..279c75f --- /dev/null +++ b/src/improtocols/facebook.desktop @@ -0,0 +1,85 @@ +[Desktop Entry] +Type=Service +Icon=im-facebook +Comment=Facebook Protocol +Comment[ar]=ميفاق فيسبوك +Comment[az]=Facebook Protokolu +Comment[bg]=Протокол на Facebook +Comment[ca]=Protocol Facebook +Comment[ca@valencia]=Protocol Facebook +Comment[cs]=Protokol Facebook +Comment[da]=Facebook-protokollen +Comment[de]=Facebook-Protokoll +Comment[el]=Facebook πρωτόκολλο +Comment[en_GB]=Facebook Protocol +Comment[es]=Protocolo Facebook +Comment[et]=Facebooki protokoll +Comment[eu]=Facebook Protokoloa +Comment[fi]=Facebook-yhteyskäytäntö +Comment[fr]=Protocole Facebook +Comment[gl]=Protocolo de Facebook +Comment[hu]=Facebook protokoll +Comment[ia]=Protocollo de Facebook +Comment[id]=Protokol Facebook +Comment[it]=Protocollo di Facebook +Comment[ka]=Facebook პროტოკოლი +Comment[ko]=Facebook 프로토콜 +Comment[lt]=Facebook protokolas +Comment[nl]=Facebook-protocol +Comment[nn]=Facebook-protokoll +Comment[pl]=Protokół Facebooka +Comment[pt]=Protocolo do Facebook +Comment[pt_BR]=Protocolo do Facebook +Comment[ro]=Protocol Facebook +Comment[ru]=Протокол Facebook +Comment[sk]=Facebook Protokol +Comment[sl]=Protokol Facebook +Comment[sq]=Protokoli Facebook +Comment[sv]=Facebook-protokoll +Comment[tg]=Протоколи Facebook +Comment[tr]=Facebook Protokolü +Comment[uk]=Протокол Facebook +Comment[x-test]=xxFacebook Protocolxx +Comment[zh_CN]=Facebook 协议 +Comment[zh_TW]=Facebook 通訊協定 +Name=Facebook +Name[ar]=فيسبوك +Name[az]=FAcebook +Name[bg]=Facebook +Name[ca]=Facebook +Name[ca@valencia]=Facebook +Name[cs]=Facebook +Name[da]=Facebook +Name[de]=Facebook +Name[el]=Facebook +Name[en_GB]=Facebook +Name[es]=Facebook +Name[et]=Facebook +Name[eu]=Facebook +Name[fi]=Facebook +Name[fr]=Facebook +Name[gl]=Facebook +Name[hu]=Facebook +Name[ia]=Facebook +Name[id]=Facebook +Name[it]=Facebook +Name[ka]=Facebook +Name[ko]=Facebook +Name[lt]=Facebook +Name[nl]=Facebook +Name[nn]=Facebook +Name[pl]=Facebook +Name[pt]=Facebook +Name[pt_BR]=Facebook +Name[ro]=Facebook +Name[ru]=Facebook +Name[sk]=Facebook +Name[sl]=Facebook +Name[sq]=Facebook +Name[sv]=Facebook +Name[tg]=Facebook +Name[tr]=Facebook +Name[uk]=Facebook +Name[x-test]=xxFacebookxx +Name[zh_CN]=Facebook +Name[zh_TW]=Facebook diff --git a/src/improtocols/gg.desktop b/src/improtocols/gg.desktop new file mode 100644 index 0000000..70a888b --- /dev/null +++ b/src/improtocols/gg.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-gadugadu +Comment=Gadu-Gadu Protocol +Comment[ar]=ميفاق غادو-غادو +Comment[az]=Gadu-Gadu Protokolu +Comment[bg]=Протокол на Gadu-Gadu +Comment[ca]=Protocol Gadu-Gadu +Comment[ca@valencia]=Protocol Gadu-Gadu +Comment[cs]=Protokol Gadu-Gadu +Comment[da]=Gadu-Gadu-protokollen +Comment[de]=Gadu-Gadu-Protokoll +Comment[el]=Gadu-Gadu πρωτόκολλο +Comment[en_GB]=Gadu-Gadu Protocol +Comment[es]=Protocolo Gadu-Gadu +Comment[et]=Gadu-Gadu protokoll +Comment[eu]=Gadu-Gadu Protokoloa +Comment[fi]=Gadu-Gadu-yhteyskäytäntö +Comment[fr]=Protocole Gadu-Gadu +Comment[gl]=Protocolo de Gadu-Gadu +Comment[hu]=Gadu-Gadu protokoll +Comment[ia]=Protocollo Gadu-Gadu +Comment[id]=Protokol Gadu-Gadu +Comment[it]=Protocollo Gadu-Gadu +Comment[ja]=Gadu-Gadu プロトコル +Comment[ka]=გადუ-გადუს პროტოკოლი +Comment[ko]=Gadu-Gadu 프로토콜 +Comment[lt]=Gadu-Gadu protokolas +Comment[nb]=Gadu-Gadu-protokoll +Comment[nl]=Gadu-Gadu-protocol +Comment[nn]=Gadu-Gadu-protokoll +Comment[pl]=Protokół Gadu-Gadu +Comment[pt]=Protocolo Gadu-Gadu +Comment[pt_BR]=Protocolo do Gadu-Gadu +Comment[ro]=Protocol Gadu-Gadu +Comment[ru]=Протокол Gadu-Gadu +Comment[sk]=Gadu-Gadu Protokol +Comment[sl]=Protokol Gadu-Gadu +Comment[sq]=Protokoli Gadu-Gadu +Comment[sv]=Gadu-Gadu protokoll +Comment[tg]=Протоколи Gadu-Gadu +Comment[tr]=Gadu-Gadu Protokolü +Comment[uk]=Протокол Gadu-Gadu +Comment[x-test]=xxGadu-Gadu Protocolxx +Comment[zh_CN]=Gadu-Gadu 协议 +Comment[zh_TW]=Gadu-Gadu 通訊協定 +Name=Gadu-Gadu +Name[ar]=غادو-غادو +Name[az]=Gadu-Gadu +Name[bg]=Gadu-Gadu +Name[ca]=Gadu-Gadu +Name[ca@valencia]=Gadu-Gadu +Name[cs]=Gadu-Gadu +Name[da]=Gadu-Gadu +Name[de]=Gadu-Gadu +Name[el]=Gadu-Gadu +Name[en_GB]=Gadu-Gadu +Name[es]=Gadu-Gadu +Name[et]=Gadu-Gadu +Name[eu]=Gadu-Gadu +Name[fi]=Gadu-Gadu +Name[fr]=Gadu-Gadu +Name[gl]=Gadu-Gadu +Name[hu]=Gadu-Gadu +Name[ia]=Gadu-Gadu +Name[id]=Gadu-Gadu +Name[it]=Gadu-Gadu +Name[ja]=Gadu-Gadu +Name[ka]=Gadu-Gadu +Name[ko]=Gadu-Gadu +Name[lt]=Gadu-Gadu +Name[nb]=Gadu-Gadu +Name[nl]=Gadu-Gadu +Name[nn]=Gadu-Gadu +Name[pl]=Gadu-Gadu +Name[pt]=Gadu-Gadu +Name[pt_BR]=Gadu-Gadu +Name[ro]=Gadu-Gadu +Name[ru]=Gadu-Gadu +Name[sk]=Gadu-Gadu +Name[sl]=Gadu-Gadu +Name[sq]=Gadu-Gadu +Name[sv]=Gadu-Gadu +Name[tg]=Gadu-Gadu +Name[tr]=Gadu-Gadu +Name[uk]=Gadu-Gadu +Name[x-test]=xxGadu-Gaduxx +Name[zh_CN]=Gadu-Gadu +Name[zh_TW]=Gadu-Gadu diff --git a/src/improtocols/googletalk.desktop b/src/improtocols/googletalk.desktop new file mode 100644 index 0000000..09950b3 --- /dev/null +++ b/src/improtocols/googletalk.desktop @@ -0,0 +1,87 @@ +[Desktop Entry] +Type=Service +Icon=im-google +Comment=Google Talk +Comment[ar]=جوجل توك +Comment[az]=Google Talk +Comment[bg]=Google Talk +Comment[ca]=Google Talk +Comment[ca@valencia]=Google Talk +Comment[cs]=Google Talk +Comment[da]=Google Talk +Comment[de]=Google Talk +Comment[el]=Google Talk +Comment[en_GB]=Google Talk +Comment[es]=Google Talk +Comment[et]=Google Talk +Comment[eu]=Google Talk +Comment[fi]=Google Talk +Comment[fr]=Google Talk +Comment[gl]=Google Talk +Comment[hu]=Google Talk +Comment[ia]=Google Talk +Comment[id]=Google Talk +Comment[it]=Google Talk +Comment[ka]=Google Talk +Comment[ko]=Google 토크 +Comment[lt]=Google Talk +Comment[nb]=Google Talk +Comment[nl]=Google Talk +Comment[nn]=Google Talk +Comment[pl]=Google Talk +Comment[pt]=Google Talk +Comment[pt_BR]=Google Talk +Comment[ro]=Google Talk +Comment[ru]=Google Talk +Comment[sk]=Google Talk +Comment[sl]=Google Talk +Comment[sq]=Google Talk +Comment[sv]=Google Talk +Comment[tg]=Google Talk +Comment[tr]=Google Talk +Comment[uk]=Google Talk +Comment[x-test]=xxGoogle Talkxx +Comment[zh_CN]=Google Talk +Comment[zh_TW]=Google Talk +Name=Google Talk +Name[ar]=جوجل توك +Name[az]=Google Talk +Name[bg]=Google Talk +Name[ca]=Google Talk +Name[ca@valencia]=Google Talk +Name[cs]=Google Talk +Name[da]=Google Talk +Name[de]=Google Talk +Name[el]=Google Talk +Name[en_GB]=Google Talk +Name[es]=Google Talk +Name[et]=Google Talk +Name[eu]=Google Talk +Name[fi]=Google Talk +Name[fr]=Google Talk +Name[gl]=Google Talk +Name[hu]=Google Talk +Name[ia]=Google Talk +Name[id]=Google Talk +Name[it]=Google Talk +Name[ka]=Google Talk +Name[ko]=Google 토크 +Name[lt]=Google Talk +Name[nb]=Google Talk +Name[nl]=Google Talk +Name[nn]=Google Talk +Name[pl]=Google Talk +Name[pt]=Google Talk +Name[pt_BR]=Google Talk +Name[ro]=Google Talk +Name[ru]=Google Talk +Name[sk]=Google Talk +Name[sl]=Google Talk +Name[sq]=Google Talk +Name[sv]=Google Talk +Name[tg]=Google Talk +Name[tr]=Google Talk +Name[uk]=Google Talk +Name[x-test]=xxGoogle Talkxx +Name[zh_CN]=Google Talk +Name[zh_TW]=Google Talk diff --git a/src/improtocols/groupwise.desktop b/src/improtocols/groupwise.desktop new file mode 100644 index 0000000..71740cc --- /dev/null +++ b/src/improtocols/groupwise.desktop @@ -0,0 +1,88 @@ +[Desktop Entry] +Type=Service +Icon=im-groupwise +Comment=Novell GroupWise Messenger +Comment[ar]=نوفل مرسال GroupWise +Comment[az]=Novell GroupWise Mesenceri +Comment[bg]=Моментни съобщения GroupWise на Novell +Comment[ca]=Novell GroupWise Messenger +Comment[ca@valencia]=Novell GroupWise Messenger +Comment[cs]=Novell GroupWise komunikátor +Comment[da]=Novell GroupWise Messenger +Comment[de]=Novell GroupWise Messenger +Comment[el]=Novell GroupWise Messenger +Comment[en_GB]=Novell GroupWise Messenger +Comment[es]=Novell GroupWise Messenger +Comment[et]=Novelli GroupWise sõnumirakendus +Comment[eu]=Novell GroupWise Mezularia +Comment[fi]=Novell Groupwise -pikaviestin +Comment[fr]=Messagerie « GroupWise Novell » +Comment[gl]=Mensaxeiro GroupWise de Novell +Comment[hu]=Novell GroupWise Messenger +Comment[ia]=Messagero de GroupWise de Novell +Comment[id]=Perpesanan GroupWise Novell +Comment[it]=Novell GroupWise Messenger +Comment[ka]=Novell GroupWise Messenger +Comment[ko]=Novell GroupWise 메신저 +Comment[lt]=Novell GroupWise pokalbių programa +Comment[nb]=Novell GroupWise meldingsprogram +Comment[nl]=Protocol voor Novell GroupWise Messenger +Comment[nn]=Lynmeldingstenesta Novell GroupWise +Comment[pl]=Komunikator Novell GroupWise +Comment[pt]=Novell GroupWise Messenger +Comment[pt_BR]=Mensageiro do GroupWise da Novell +Comment[ro]=Mesager Novell GroupWise +Comment[ru]=Программа обмена сообщениями Novell GroupWise +Comment[sk]=Novell GroupWise Messenger +Comment[sl]=Novell GroupWise Messenger +Comment[sq]=Novell GroupWise Messenger +Comment[sv]=Novell GroupWise-meddelandeklient +Comment[tg]=Паёмнависи Novell GroupWise +Comment[tr]=Novell GroupWise Messenger +Comment[uk]=Програма обміну повідомленнями Novell GroupWise +Comment[x-test]=xxNovell GroupWise Messengerxx +Comment[zh_CN]=Novell GroupWise Messenger +Comment[zh_TW]=Novell GroupWise Messenger +Name=GroupWise +Name[ar]=GroupWise +Name[az]=GroupWise +Name[bg]=GroupWise +Name[ca]=GroupWise +Name[ca@valencia]=GroupWise +Name[cs]=GroupWise +Name[da]=GroupWise +Name[de]=GroupWise +Name[el]=GroupWise +Name[en_GB]=GroupWise +Name[es]=GroupWise +Name[et]=GroupWise +Name[eu]=GroupWise +Name[fi]=GroupWise +Name[fr]=GroupWise +Name[gl]=GroupWise +Name[hu]=GroupWise +Name[ia]=GroupWise +Name[id]=GroupWise +Name[it]=GroupWise +Name[ja]=GroupWise +Name[ka]=GroupWise +Name[ko]=GroupWise +Name[lt]=GroupWise +Name[nb]=GroupWise +Name[nl]=GroupWise +Name[nn]=GroupWise +Name[pl]=GroupWise +Name[pt]=GroupWise +Name[pt_BR]=GroupWise +Name[ro]=GroupWise +Name[ru]=GroupWise +Name[sk]=GroupWise +Name[sl]=GroupWise +Name[sq]=GroupWise +Name[sv]=GroupWise +Name[tg]=GroupWise +Name[tr]=GroupWise +Name[uk]=GroupWise +Name[x-test]=xxGroupWisexx +Name[zh_CN]=GroupWise +Name[zh_TW]=GroupWise diff --git a/src/improtocols/icq.desktop b/src/improtocols/icq.desktop new file mode 100644 index 0000000..387dfc8 --- /dev/null +++ b/src/improtocols/icq.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-icq +Comment=ICQ Protocol +Comment[ar]=ميفاق ICQ +Comment[az]=ICQ Protokol +Comment[bg]=Протокол на ICQ +Comment[ca]=Protocol ICQ +Comment[ca@valencia]=Protocol ICQ +Comment[cs]=Protokol ICQ +Comment[da]=ICQ-protokollen +Comment[de]=ICQ-Protokoll +Comment[el]=ICQ πρωτόκολλο +Comment[en_GB]=ICQ Protocol +Comment[es]=Protocolo ICQ +Comment[et]=ICQ protokoll +Comment[eu]=ICQ Protokoloa +Comment[fi]=ICQ-yhteyskäytäntö +Comment[fr]=Protocole ICQ +Comment[gl]=Protocolo de ICQ +Comment[hu]=ICQ protokoll +Comment[ia]=Protocollo ICQ +Comment[id]=Protokol ICQ +Comment[it]=Protocollo ICQ +Comment[ja]=ICQ プロトコル +Comment[ka]=ICQ პროტოკოლი +Comment[ko]=ICQ 프로토콜 +Comment[lt]=ICQ protokolas +Comment[nb]=ICQ-protokoll +Comment[nl]=ICQ-protocol +Comment[nn]=ICQ-protokoll +Comment[pl]=Protokół ICQ +Comment[pt]=Protocolo ICQ +Comment[pt_BR]=Protocolo do ICQ +Comment[ro]=Protocol ICQ +Comment[ru]=Протокол ICQ +Comment[sk]=ICQ Protokol +Comment[sl]=Protokol ICQ +Comment[sq]=ICQ Protocol +Comment[sv]=ICQ-protokoll +Comment[tg]=Протоколи ICQ +Comment[tr]=ICQ Protokolü +Comment[uk]=Протокол ICQ +Comment[x-test]=xxICQ Protocolxx +Comment[zh_CN]=ICQ 协议 +Comment[zh_TW]=ICQ 通訊協定 +Name=ICQ +Name[ar]=آي أر سي +Name[az]=ICQ +Name[bg]=ICQ +Name[ca]=ICQ +Name[ca@valencia]=ICQ +Name[cs]=ICQ +Name[da]=ICQ +Name[de]=ICQ +Name[el]=ICQ +Name[en_GB]=ICQ +Name[es]=ICQ +Name[et]=ICQ +Name[eu]=ICQ +Name[fi]=ICQ +Name[fr]=ICQ +Name[gl]=ICQ +Name[hu]=ICQ +Name[ia]=ICQ +Name[id]=ICQ +Name[it]=ICQ +Name[ja]=ICQ +Name[ka]=ICQ +Name[ko]=ICQ +Name[lt]=ICQ +Name[nb]=ICQ +Name[nl]=ICQ +Name[nn]=ICQ +Name[pl]=ICQ +Name[pt]=ICQ +Name[pt_BR]=ICQ +Name[ro]=ICQ +Name[ru]=ICQ +Name[sk]=ICQ +Name[sl]=ICQ +Name[sq]=ICQ +Name[sv]=ICQ +Name[tg]=ICQ +Name[tr]=ICQ +Name[uk]=ICQ +Name[x-test]=xxICQxx +Name[zh_CN]=ICQ +Name[zh_TW]=ICQ diff --git a/src/improtocols/improtocols.qrc b/src/improtocols/improtocols.qrc new file mode 100644 index 0000000..9ea0213 --- /dev/null +++ b/src/improtocols/improtocols.qrc @@ -0,0 +1,25 @@ + + + aim.desktop + facebook.desktop + gg.desktop + googletalk.desktop + groupwise.desktop + icq.desktop + irc.desktop + meanwhile.desktop + msn.desktop + qq.desktop + sip.desktop + skype.desktop + sms.desktop + twitter.desktop + xmpp.desktop + ymsgr.desktop + matrix.desktop + telegram.desktop + rocketchat.desktop + signal.desktop + threema.desktop + + diff --git a/src/improtocols/irc.desktop b/src/improtocols/irc.desktop new file mode 100644 index 0000000..abf00fa --- /dev/null +++ b/src/improtocols/irc.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-irc +Comment=Internet Relay Chat +Comment[ar]=بروتوكول الدردشة عبر الإنترنت +Comment[az]=Internet Relay Chat (IRC) +Comment[bg]=Internet Relay Chat +Comment[ca]=Internet Relay Chat +Comment[ca@valencia]=Internet Relay Chat +Comment[cs]=Internet Relay Chat +Comment[da]=Internet Relay Chat +Comment[de]=Internet Relay Chat +Comment[el]=Internet Relay Chat +Comment[en_GB]=Internet Relay Chat +Comment[es]=Internet Relay Chat +Comment[et]=IRC +Comment[eu]=IRC (Internet Relay Chat) +Comment[fi]=Internet Relay Chat +Comment[fr]=Internet Relay Chat +Comment[gl]=Internet Relay Chat +Comment[hu]=Internet Relay Chat +Comment[ia]=Internet Relay Chat (IRC) +Comment[id]=Internet Relay Chat +Comment[it]=Internet Relay Chat +Comment[ja]=インターネットリレーチャット +Comment[ka]=Internet Relay Chat +Comment[ko]=인터넷 릴레이 채팅 +Comment[lt]=Tiesioginiai pokalbiai internete +Comment[nb]=Internet Relay Chat +Comment[nl]=Internet Relay Chat +Comment[nn]=Internet Relay Chat +Comment[pl]=Internet Relay Chat +Comment[pt]=Internet Relay Chat +Comment[pt_BR]=Bate-papo via Internet (IRC) +Comment[ro]=Internet Relay Chat +Comment[ru]=Internet Relay Chat (IRC) +Comment[sk]=Internet Relay Chat +Comment[sl]=Internet Relay Chat +Comment[sq]=Internet Relay Chat +Comment[sv]=Internet Relay Chat +Comment[tg]=Суҳбати иттисоли интернетӣ +Comment[tr]=IRC +Comment[uk]=Internet Relay Chat +Comment[x-test]=xxInternet Relay Chatxx +Comment[zh_CN]=互联网中继聊天 +Comment[zh_TW]=網際網路中繼聊天 (IRC) +Name=IRC +Name[ar]=آي أر سي +Name[az]=IRC +Name[bg]=IRC +Name[ca]=IRC +Name[ca@valencia]=IRC +Name[cs]=IRC +Name[da]=IRC +Name[de]=IRC +Name[el]=IRC +Name[en_GB]=IRC +Name[es]=IRC +Name[et]=IRC +Name[eu]=IRC +Name[fi]=IRC +Name[fr]=IRC +Name[gl]=IRC +Name[hu]=IRC +Name[ia]=IRC +Name[id]=IRC +Name[it]=IRC +Name[ja]=IRC +Name[ka]=IRC +Name[ko]=IRC +Name[lt]=IRC +Name[nb]=IRC +Name[nl]=IRC +Name[nn]=IRC +Name[pl]=IRC +Name[pt]=IRC +Name[pt_BR]=IRC +Name[ro]=IRC +Name[ru]=IRC +Name[sk]=IRC +Name[sl]=IRC +Name[sq]=IRC +Name[sv]=IRC +Name[tg]=IRC +Name[tr]=IRC +Name[uk]=IRC +Name[x-test]=xxIRCxx +Name[zh_CN]=IRC +Name[zh_TW]=IRC diff --git a/src/improtocols/matrix.desktop b/src/improtocols/matrix.desktop new file mode 100644 index 0000000..022b887 --- /dev/null +++ b/src/improtocols/matrix.desktop @@ -0,0 +1,66 @@ +[Desktop Entry] +Type=Service +Comment=Matrix +Comment[ar]=ماتريكس +Comment[az]=Matrix +Comment[bg]=Matrix +Comment[ca]=Matrix +Comment[ca@valencia]=Matrix +Comment[cs]=Matrix +Comment[de]=Matrix +Comment[el]=Matrix +Comment[en_GB]=Matrix +Comment[es]=Matrix +Comment[eu]=Matrix +Comment[fi]=Matrix +Comment[fr]=Matrix +Comment[ia]=Matrix +Comment[it]=Matrix +Comment[ka]=Matrix +Comment[ko]=Matrix +Comment[nl]=Matrix +Comment[nn]=Matrix +Comment[pl]=Matrix +Comment[pt]=Matrix +Comment[pt_BR]=Matrix +Comment[ro]=Matrix +Comment[ru]=Matrix +Comment[sk]=Matica +Comment[sl]=Matrix +Comment[sv]=Matrix +Comment[tr]=Matrix +Comment[uk]=Matrix +Comment[x-test]=xxMatrixxx +Comment[zh_CN]=Matrix +Name=Matrix +Name[ar]=ماتريكس +Name[az]=Matrix +Name[bg]=Matrix +Name[ca]=Matrix +Name[ca@valencia]=Matrix +Name[cs]=Matrix +Name[de]=Matrix +Name[el]=Matrix +Name[en_GB]=Matrix +Name[es]=Matrix +Name[eu]=Matrix +Name[fi]=Matrix +Name[fr]=Matrix +Name[ia]=Matrix +Name[it]=Matrix +Name[ka]=Matrix +Name[ko]=Matrix +Name[nl]=Matrix +Name[nn]=Matrix +Name[pl]=Matrix +Name[pt]=Matrix +Name[pt_BR]=Matrix +Name[ro]=Matrix +Name[ru]=Matrix +Name[sk]=Matica +Name[sl]=Matrix +Name[sv]=Matrix +Name[tr]=Matrix +Name[uk]=Matrix +Name[x-test]=xxMatrixxx +Name[zh_CN]=Matrix diff --git a/src/improtocols/meanwhile.desktop b/src/improtocols/meanwhile.desktop new file mode 100644 index 0000000..5f0d451 --- /dev/null +++ b/src/improtocols/meanwhile.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-meanwhile +Comment=Meanwhile Protocol +Comment[ar]=ميفاق Meanwhile +Comment[az]=Meanwhile Protokolu +Comment[bg]=Протокол на Meanwhile +Comment[ca]=Protocol Meanwhile +Comment[ca@valencia]=Protocol Meanwhile +Comment[cs]=Protokol Meanwhile +Comment[da]=Meanwhile-protokollen +Comment[de]=Meanwhile-Protokoll +Comment[el]=Meanwhile πρωτόκολλο +Comment[en_GB]=Meanwhile Protocol +Comment[es]=Protocolo Meanwhile +Comment[et]=Meanwhile protokoll +Comment[eu]=Meanwhile Protokoloa +Comment[fi]=Meanwhile-yhteyskäytäntö +Comment[fr]=Protocole « Meanwhile » +Comment[gl]=Protocolo de Meanwhile +Comment[hu]=Meanwhile protokoll +Comment[ia]=Protocollo Meanwhile +Comment[id]=Protokol Meanwhile +Comment[it]=Protocollo Meanwhile +Comment[ja]=Meanwhile プロトコル +Comment[ka]=Meanwhile პროტოკოლი +Comment[ko]=Meanwhile 프로토콜 +Comment[lt]=Meanwhile protokolas +Comment[nb]=Meanwhile-protokoll +Comment[nl]=Meanwhile-protocol +Comment[nn]=Meanwhile-protokoll +Comment[pl]=Protokół Meanwhile +Comment[pt]=Protocolo Meanwhile +Comment[pt_BR]=Protocolo do Meanwhile +Comment[ro]=Protocol Meanwhile +Comment[ru]=Протокол Meanwhile +Comment[sk]=Meanwhile Protokol +Comment[sl]=Protokol Meanwhile +Comment[sq]=Meanwhile Protocol +Comment[sv]=Meanwhile-protokoll +Comment[tg]=Протоколи Meanwhile +Comment[tr]=Meanwhile Protokolü +Comment[uk]=Протокол Meanwhile +Comment[x-test]=xxMeanwhile Protocolxx +Comment[zh_CN]=Meanwhile 协议 +Comment[zh_TW]=Meanwhile 通訊協定 +Name=Meanwhile +Name[ar]=Meanwhile +Name[az]=Meanwhile +Name[bg]=Meanwhile +Name[ca]=Meanwhile +Name[ca@valencia]=Meanwhile +Name[cs]=Meanwhile +Name[da]=Meanwhile +Name[de]=Meanwhile +Name[el]=Meanwhile +Name[en_GB]=Meanwhile +Name[es]=Meanwhile +Name[et]=Meanwhile +Name[eu]=Meanwhile +Name[fi]=Meanwhile +Name[fr]=Meanwhile +Name[gl]=Meanwhile +Name[hu]=Meanwhile +Name[ia]=Meanwhile +Name[id]=Meanwhile +Name[it]=Meanwhile +Name[ja]=Meanwhile +Name[ka]=Meanwhile +Name[ko]=Meanwhile +Name[lt]=Meanwhile +Name[nb]=Meanwhile +Name[nl]=Meanwhile +Name[nn]=Meanwhile +Name[pl]=Meanwhile +Name[pt]=Meanwhile +Name[pt_BR]=Meanwhile +Name[ro]=Meanwhile +Name[ru]=Meanwhile +Name[sk]=Meanwhile +Name[sl]=Meanwhile +Name[sq]=Meanwhile +Name[sv]=Meanwhile +Name[tg]=Meanwhile +Name[tr]=Meanwhile +Name[uk]=Meanwhile +Name[x-test]=xxMeanwhilexx +Name[zh_CN]=Meanwhile +Name[zh_TW]=Meanwhile diff --git a/src/improtocols/msn.desktop b/src/improtocols/msn.desktop new file mode 100644 index 0000000..7f0ef2c --- /dev/null +++ b/src/improtocols/msn.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-msn +Comment=MSN Messenger +Comment[ar]=مرسال ام اس ان +Comment[az]=MSN Mesencer +Comment[bg]=MSN Messenger +Comment[ca]=MSN Messenger +Comment[ca@valencia]=MSN Messenger +Comment[cs]=MSN Messenger +Comment[da]=MSN Messenger +Comment[de]=MSN Messenger +Comment[el]=MSN Messenger +Comment[en_GB]=MSN Messenger +Comment[es]=MSN Messenger +Comment[et]=MSN Messenger +Comment[eu]=MSN Mezularia +Comment[fi]=MSN Messenger +Comment[fr]=Messagerie MSN +Comment[gl]=MSN Messenger +Comment[hu]=MSN Messenger +Comment[ia]=Messaggero MSN +Comment[id]=Perpesanan MSN +Comment[it]=MSN Messenger +Comment[ja]=MSN メッセンジャー +Comment[ka]=MSN მესინჯერი +Comment[ko]=MSN 메신저 +Comment[lt]=MSN pokalbių programa +Comment[nb]=MSN Messenger +Comment[nl]=MSN Messenger +Comment[nn]=MSN Messenger +Comment[pl]=MSN Messenger +Comment[pt]=MSN Messenger +Comment[pt_BR]=MSN Messenger +Comment[ro]=Mesager MSN +Comment[ru]=Обмен сообщениями MSN +Comment[sk]=MSN Messenger +Comment[sl]=MSN Messenger +Comment[sq]=MSN Messenger +Comment[sv]=MSN Messenger +Comment[tg]=Паёмнависи MSN +Comment[tr]=MSN Messenger +Comment[uk]=MSN Messenger +Comment[x-test]=xxMSN Messengerxx +Comment[zh_CN]=MSN Messenger +Comment[zh_TW]=MSN Messenger +Name=MSN Messenger +Name[ar]=مرسال ام اس ان +Name[az]=MSN Mesencer +Name[bg]=MSN Messenger +Name[ca]=MSN Messenger +Name[ca@valencia]=MSN Messenger +Name[cs]=MSN Messenger +Name[da]=MSN Messenger +Name[de]=MSN Messenger +Name[el]=MSN Messenger +Name[en_GB]=MSN Messenger +Name[es]=MSN Messenger +Name[et]=MSN Messenger +Name[eu]=MSN Mezularia +Name[fi]=MSN Messenger +Name[fr]=Messagerie MSN +Name[gl]=MSN Messenger +Name[hu]=MSN Messenger +Name[ia]=Messaggero MSN +Name[id]=MSN Messenger +Name[it]=MSN Messenger +Name[ja]=MSN メッセンジャー +Name[ka]=MSN მესინჯერი +Name[ko]=MSN 메신저 +Name[lt]=MSN pokalbių programa +Name[nb]=MSN Messenger +Name[nl]=MSN Messenger +Name[nn]=MSN Messenger +Name[pl]=MSN Messenger +Name[pt]=MSN Messenger +Name[pt_BR]=MSN Messenger +Name[ro]=Mesager MSN +Name[ru]=MSN Messenger +Name[sk]=MSN Messenger +Name[sl]=MSN Messenger +Name[sq]=MSN Messenger +Name[sv]=MSN Messenger +Name[tg]=Паёмнависи MSN +Name[tr]=MSN Messenger +Name[uk]=MSN Messenger +Name[x-test]=xxMSN Messengerxx +Name[zh_CN]=MSN Messenger +Name[zh_TW]=MSN Messenger diff --git a/src/improtocols/qq.desktop b/src/improtocols/qq.desktop new file mode 100644 index 0000000..97b5f9d --- /dev/null +++ b/src/improtocols/qq.desktop @@ -0,0 +1,85 @@ +[Desktop Entry] +Type=Service +Icon=im-qq +Comment=Tencent QQ Messaging +Comment[ar]=رسائل ترانسنت QQ +Comment[az]=Tencent QQ Mesajlaşma +Comment[bg]=Tencent QQ съобщения +Comment[ca]=Missatgeria Tencent QQ +Comment[ca@valencia]=Missatgeria Tencent QQ +Comment[cs]=Zprávy Tencent QQ +Comment[da]=Tencent QQ Messaging +Comment[de]=Tencent QQ Messaging +Comment[el]=Tencent QQ Messaging +Comment[en_GB]=Tencent QQ Messaging +Comment[es]=Mensajería Tencent QQ +Comment[et]=Tencent QQ snumirakendus +Comment[eu]=Tencent QQ Mezularitza +Comment[fi]=Tencent QQ -pikaviestintä +Comment[fr]=Messagerie « QQ » de Tencent +Comment[gl]=Tencent QQ Messaging +Comment[hu]=Tencent QQ üzenetküldés +Comment[ia]=Tencent QQ Messaging +Comment[id]=Perpesanan Tencent QQ +Comment[it]=Messaggistica Tencent QQ +Comment[ka]=Tencent QQ შეტყობინებები +Comment[ko]=Tencent QQ 메시징 +Comment[lt]=Tencent QQ praneÅ¡imų perdavimas +Comment[nl]=Tencent QQ Messaging +Comment[nn]=Tencent QQ-lynmeldingar +Comment[pl]=Wiadomości Tencent QQ +Comment[pt]=Mensagens do Tencent QQ +Comment[pt_BR]=Mensagens do Tencent QQ +Comment[ro]=Mesagerie Tencent QQ +Comment[ru]=Обмен сообщениями Tencent QQ +Comment[sk]=Tencent QQ Messaging +Comment[sl]=Sporočanje Tencent QQ +Comment[sq]=Tencent QQ Messaging +Comment[sv]=Tencent QQ-meddelandeklient +Comment[tg]=Паёмнависи Tencent QQ +Comment[tr]=Tencent QQ Messaging +Comment[uk]=Обмін повідомленнями Tencent QQ +Comment[x-test]=xxTencent QQ Messagingxx +Comment[zh_CN]=腾讯 QQ 聊天 +Comment[zh_TW]=Tencent QQ 通訊 +Name=QQ +Name[ar]=QQ +Name[az]=QQ +Name[bg]=QQ +Name[ca]=QQ +Name[ca@valencia]=QQ +Name[cs]=QQ +Name[da]=QQ +Name[de]=QQ +Name[el]=QQ +Name[en_GB]=QQ +Name[es]=QQ +Name[et]=QQ +Name[eu]=QQ +Name[fi]=QQ +Name[fr]=QQ +Name[gl]=QQ +Name[hu]=QQ +Name[ia]=QQ +Name[id]=QQ +Name[it]=QQ +Name[ka]=QQ +Name[ko]=QQ +Name[lt]=QQ +Name[nl]=QQ +Name[nn]=QQ +Name[pl]=QQ +Name[pt]=QQ +Name[pt_BR]=QQ +Name[ro]=QQ +Name[ru]=QQ +Name[sk]=QQ +Name[sl]=QQ +Name[sq]=QQ +Name[sv]=QQ +Name[tg]=QQ +Name[tr]=QQ +Name[uk]=QQ +Name[x-test]=xxQQxx +Name[zh_CN]=QQ +Name[zh_TW]=QQ diff --git a/src/improtocols/rocketchat.desktop b/src/improtocols/rocketchat.desktop new file mode 100644 index 0000000..4430742 --- /dev/null +++ b/src/improtocols/rocketchat.desktop @@ -0,0 +1,50 @@ +[Desktop Entry] +Type=Service +Comment=RocketChat +Comment[ar]=روكيت تشات +Comment[bg]=RocketChat +Comment[ca]=RocketChat +Comment[ca@valencia]=RocketChat +Comment[cs]=RocketChat +Comment[de]=RocketChat +Comment[el]=RocketChat +Comment[en_GB]=RocketChat +Comment[es]=RocketChat +Comment[eu]=RocketChat +Comment[fr]=RocketChat +Comment[ia]=RocketChat +Comment[it]=RocketChat +Comment[ka]=RocketChat +Comment[nl]=RocketChat +Comment[nn]=RocketChat +Comment[pl]=RocketChat +Comment[pt]=RocketChat +Comment[pt_BR]=RocketChat +Comment[sl]=RocketChat +Comment[tr]=RocketChat +Comment[uk]=RocketChat +Comment[x-test]=xxRocketChatxx +Name=RocketChat +Name[ar]=روكيت تشات +Name[bg]=RocketChat +Name[ca]=RocketChat +Name[ca@valencia]=RocketChat +Name[cs]=RocketChat +Name[de]=RocketChat +Name[el]=RocketChat +Name[en_GB]=RocketChat +Name[es]=RocketChat +Name[eu]=RocketChat +Name[fr]=RocketChat +Name[ia]=RocketChat +Name[it]=RocketChat +Name[ka]=RocketChat +Name[nl]=RocketChat +Name[nn]=RocketChat +Name[pl]=RocketChat +Name[pt]=RocketChat +Name[pt_BR]=RocketChat +Name[sl]=RocketChat +Name[tr]=RocketChat +Name[uk]=RocketChat +Name[x-test]=xxRocketChatxx diff --git a/src/improtocols/signal.desktop b/src/improtocols/signal.desktop new file mode 100644 index 0000000..f0cf0ba --- /dev/null +++ b/src/improtocols/signal.desktop @@ -0,0 +1,50 @@ +[Desktop Entry] +Type=Service +Comment=Signal +Comment[ar]=سيجنال +Comment[bg]=Signal +Comment[ca]=Signal +Comment[ca@valencia]=Signal +Comment[cs]=Signal +Comment[de]=Signal +Comment[el]=Signal +Comment[en_GB]=Signal +Comment[es]=Signal +Comment[eu]=Signal +Comment[fr]=Signal +Comment[ia]=Signal +Comment[it]=Signal +Comment[ka]=Signal +Comment[nl]=Signaal +Comment[nn]=Signal +Comment[pl]=Signal +Comment[pt]=Signal +Comment[pt_BR]=Signal +Comment[sl]=Signal +Comment[tr]=Signal +Comment[uk]=Сигнал +Comment[x-test]=xxSignalxx +Name=Signal +Name[ar]=سيجنال +Name[bg]=Signal +Name[ca]=Signal +Name[ca@valencia]=Signal +Name[cs]=Signal +Name[de]=Signal +Name[el]=Signal +Name[en_GB]=Signal +Name[es]=Signal +Name[eu]=Signal +Name[fr]=Signal +Name[ia]=Signal +Name[it]=Signal +Name[ka]=Signal +Name[nl]=Signaal +Name[nn]=Signal +Name[pl]=Signal +Name[pt]=Signal +Name[pt_BR]=Signal +Name[sl]=Signal +Name[tr]=Signal +Name[uk]=Сигнал +Name[x-test]=xxSignalxx diff --git a/src/improtocols/sip.desktop b/src/improtocols/sip.desktop new file mode 100644 index 0000000..9606f03 --- /dev/null +++ b/src/improtocols/sip.desktop @@ -0,0 +1,85 @@ +[Desktop Entry] +Type=Service +Icon=internet-telephone +Comment=Session Initiation Protocol +Comment[ar]=بروتوكول بدء جلسة +Comment[az]=Session İnitial Protocol (SİP) +Comment[bg]=Session Initiation Protocol +Comment[ca]=Protocol per a la iniciació de la sessió +Comment[ca@valencia]=Protocol per a la iniciació de la sessió +Comment[cs]=Session Initiation Protocol (SIP) +Comment[da]=Sessionsinitiering-protokollen +Comment[de]=Session Initiation Protocol +Comment[el]=Session Initiation Protocol +Comment[en_GB]=Session Initiation Protocol +Comment[es]=Protocolo de inicio de sesión +Comment[et]=SIP +Comment[eu]=SIP (Saioa Hasieratzeko Protokoloa) +Comment[fi]=Istunnonalustusyhteyskäytäntö +Comment[fr]=Session Initiation Protocol +Comment[gl]=Protocolo de inicio de sesión +Comment[hu]=Session Initiation Protocol +Comment[ia]=Session Initiation Protocol (Protocollo de initiation de session) +Comment[id]=Protokol Permulaan Sesi +Comment[it]=Session Initiation Protocol +Comment[ka]=Session Initiation Protocol +Comment[ko]=세션 연결 프로토콜(SIP) +Comment[lt]=Session Initiation protokolas +Comment[nl]=Session Initiation Protocol +Comment[nn]=Session Initiation Protocol +Comment[pl]=Session Initiation Protocol +Comment[pt]=Protocolo de Início de Sessão +Comment[pt_BR]=Protocolo de Iniciação de Sessão +Comment[ro]=Protocol de Inițiere a Sesiunii +Comment[ru]=Session Initiation Protocol (SIP) +Comment[sk]=Session Initiation Protokol +Comment[sl]=Session Initiation Protocol +Comment[sq]=Session Initiation Protocol +Comment[sv]=Sessionsinitieringsprotokoll +Comment[tg]=Протоколи омодасозии ҷаласа +Comment[tr]=Oturum İlklendirme Protokolü +Comment[uk]=Session Initiation Protocol +Comment[x-test]=xxSession Initiation Protocolxx +Comment[zh_CN]=会话初始化协议 +Comment[zh_TW]=對話啟動協定 (SIP) +Name=SIP +Name[ar]=SIP +Name[az]=SİP +Name[bg]=SIP +Name[ca]=SIP +Name[ca@valencia]=SIP +Name[cs]=SIP +Name[da]=SIP +Name[de]=SIP +Name[el]=SIP +Name[en_GB]=SIP +Name[es]=SIP +Name[et]=SIP +Name[eu]=SIP +Name[fi]=SIP +Name[fr]=SIP +Name[gl]=SIP +Name[hu]=SIP +Name[ia]=SIP +Name[id]=SIP +Name[it]=SIP +Name[ka]=SIP +Name[ko]=SIP +Name[lt]=SIP +Name[nl]=SIP +Name[nn]=SIP +Name[pl]=SIP +Name[pt]=SIP +Name[pt_BR]=SIP +Name[ro]=SIP +Name[ru]=SIP +Name[sk]=SIP +Name[sl]=SIP +Name[sq]=SIP +Name[sv]=SIP +Name[tg]=SIP +Name[tr]=SIP +Name[uk]=SIP +Name[x-test]=xxSIPxx +Name[zh_CN]=SIP +Name[zh_TW]=SIP diff --git a/src/improtocols/skype.desktop b/src/improtocols/skype.desktop new file mode 100644 index 0000000..5cb5256 --- /dev/null +++ b/src/improtocols/skype.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-skype +Comment=Skype Internet Telephony +Comment[ar]=الاتصال عبر الإنترنت سكايب +Comment[az]=Skype +Comment[bg]=Skype Internet Telephony +Comment[ca]=Telefonia d'Internet Skype +Comment[ca@valencia]=Telefonia d'Internet Skype +Comment[cs]=Internetová telefonie Skype +Comment[da]=Skype internettelefoni +Comment[de]=Skype-Internet-Telefonie +Comment[el]=Skype Internet Telephony +Comment[en_GB]=Skype Internet Telephony +Comment[es]=Telefonía por Internet de Skype +Comment[et]=Internetitelefon Skype +Comment[eu]=Skype Internet Telefonia +Comment[fi]=Skype-internetpuhelin +Comment[fr]=Téléphonie Internet Skype +Comment[gl]=Skype Internet Telephony +Comment[hu]=Skype internetes telefonálás +Comment[ia]=Telephonia Internet de Skype +Comment[id]=Telepon Internet Skype +Comment[it]=Telefonia su Internet di Skype +Comment[ja]=Skype インターネット電話 +Comment[ka]=Skype Internet Telephony +Comment[ko]=Skype 인터넷 전화 +Comment[lt]=Skype interneto telefonija +Comment[nb]=Skype IP-telefoni +Comment[nl]=Skype internet-telefonie +Comment[nn]=Skype Internett-telefoni +Comment[pl]=Internetowa telefonia Skype +Comment[pt]=Telefonia Internet Skype +Comment[pt_BR]=Telefonia Internet Skype +Comment[ro]=Telefonie pin internet Skype +Comment[ru]=Skype +Comment[sk]=Skype Internet Telephony +Comment[sl]=Skype internetna telefonija +Comment[sq]=Skype Internet Telephony +Comment[sv]=Skype Internettelefoni +Comment[tg]=Телефони интернетии Skype +Comment[tr]=Skype İnternet Telefonu +Comment[uk]=Інтернет-телефонія Skype +Comment[x-test]=xxSkype Internet Telephonyxx +Comment[zh_CN]=Skype 互联网电话 +Comment[zh_TW]=Skype 網路電話 +Name=Skype +Name[ar]=سكايب +Name[az]=Skype +Name[bg]=Skype +Name[ca]=Skype +Name[ca@valencia]=Skype +Name[cs]=Skype +Name[da]=Skype +Name[de]=Skype +Name[el]=Skype +Name[en_GB]=Skype +Name[es]=Skype +Name[et]=Skype +Name[eu]=Skype +Name[fi]=Skype +Name[fr]=Skype +Name[gl]=Skype +Name[hu]=Skype +Name[ia]=Skype +Name[id]=Skype +Name[it]=Skype +Name[ja]=Skype +Name[ka]=Skype +Name[ko]=Skype +Name[lt]=Skype +Name[nb]=Skype +Name[nl]=Skype +Name[nn]=Skype +Name[pl]=Skype +Name[pt]=Skype +Name[pt_BR]=Skype +Name[ro]=Skype +Name[ru]=Skype +Name[sk]=Skype +Name[sl]=Skype +Name[sq]=Skype +Name[sv]=Skype +Name[tg]=Skype +Name[tr]=Skype +Name[uk]=Skype +Name[x-test]=xxSkypexx +Name[zh_CN]=Skype +Name[zh_TW]=Skype diff --git a/src/improtocols/sms.desktop b/src/improtocols/sms.desktop new file mode 100644 index 0000000..48e6dd3 --- /dev/null +++ b/src/improtocols/sms.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-sms +Comment=SMS Protocol +Comment[ar]=ميفاق خدمة الرسائل القصيرة +Comment[az]=SMS Protokolu +Comment[bg]=Протокол SMS +Comment[ca]=Protocol SMS +Comment[ca@valencia]=Protocol SMS +Comment[cs]=SMS protokol +Comment[da]=SMS-protokollen +Comment[de]=SMS-Protokoll +Comment[el]=SMS πρωτόκολλο +Comment[en_GB]=SMS Protocol +Comment[es]=Protocolo SMS +Comment[et]=SMS protokoll +Comment[eu]=SMS Protokoloa +Comment[fi]=Tekstiviestiyhteyskäytäntö +Comment[fr]=Protocole SMS +Comment[gl]=Protocolo de SMS +Comment[hu]=SMS protokoll +Comment[ia]=Protocollo SMS +Comment[id]=Protokol SMS +Comment[it]=Protocollo SMS +Comment[ja]=SMS プロトコル +Comment[ka]=SMS პროტოკოლი +Comment[ko]=SMS 프로토콜 +Comment[lt]=SMS protokolas +Comment[nb]=SMS Protokoll +Comment[nl]=SMS-protocol +Comment[nn]=SMS-protokoll +Comment[pl]=Protokół SMS +Comment[pt]=Protocolo SMS +Comment[pt_BR]=Protocolo SMS +Comment[ro]=Protocol SMS +Comment[ru]=Протокол SMS +Comment[sk]=SMS Protokol +Comment[sl]=Protokol SMS +Comment[sq]=SMS Protocol +Comment[sv]=SMS-protokoll +Comment[tg]=Протоколи СМС +Comment[tr]=SMS Protokolü +Comment[uk]=Протокол SMS +Comment[x-test]=xxSMS Protocolxx +Comment[zh_CN]=短信协议 +Comment[zh_TW]=SMS 通訊協定 +Name=SMS +Name[ar]=اس ام اس +Name[az]=SMS +Name[bg]=SMS +Name[ca]=SMS +Name[ca@valencia]=SMS +Name[cs]=SMS +Name[da]=SMS +Name[de]=SMS +Name[el]=SMS +Name[en_GB]=SMS +Name[es]=SMS +Name[et]=SMS +Name[eu]=SMS +Name[fi]=Tekstiviesti +Name[fr]=SMS +Name[gl]=SMS +Name[hu]=SMS +Name[ia]=SMS +Name[id]=SMS +Name[it]=SMS +Name[ja]=SMS +Name[ka]=SMS +Name[ko]=SMS +Name[lt]=SMS +Name[nb]=SMS +Name[nl]=SMS +Name[nn]=SMS +Name[pl]=SMS +Name[pt]=SMS +Name[pt_BR]=SMS +Name[ro]=SMS +Name[ru]=SMS +Name[sk]=SMS +Name[sl]=SMS +Name[sq]=SMS +Name[sv]=SMS +Name[tg]=СМС +Name[tr]=SMS +Name[uk]=SMS +Name[x-test]=xxSMSxx +Name[zh_CN]=短信 +Name[zh_TW]=SMS diff --git a/src/improtocols/telegram.desktop b/src/improtocols/telegram.desktop new file mode 100644 index 0000000..2131026 --- /dev/null +++ b/src/improtocols/telegram.desktop @@ -0,0 +1,66 @@ +[Desktop Entry] +Type=Service +Comment=Telegram +Comment[ar]=تلغرام +Comment[az]=Teleqram +Comment[bg]=Telegram +Comment[ca]=Telegram +Comment[ca@valencia]=Telegram +Comment[cs]=Telegram +Comment[de]=Telegram +Comment[el]=Telegram +Comment[en_GB]=Telegram +Comment[es]=Telegram +Comment[eu]=Telegram +Comment[fi]=Telegram +Comment[fr]=Telegram +Comment[ia]=Telegram +Comment[it]=Telegram +Comment[ka]=ტელეგრამი +Comment[ko]=텔레그램 +Comment[nl]=Telegram +Comment[nn]=Telegram +Comment[pl]=Telegram +Comment[pt]=Telegram +Comment[pt_BR]=Telegram +Comment[ro]=Telegram +Comment[ru]=Telegram +Comment[sk]=Telegram +Comment[sl]=Telegram +Comment[sv]=Telegram +Comment[tr]=Telegram +Comment[uk]=Telegram +Comment[x-test]=xxTelegramxx +Comment[zh_CN]=Telegram +Name=Telegram +Name[ar]=تلغرام +Name[az]=Teleqram +Name[bg]=Telegram +Name[ca]=Telegram +Name[ca@valencia]=Telegram +Name[cs]=Telegram +Name[de]=Telegram +Name[el]=Telegram +Name[en_GB]=Telegram +Name[es]=Telegram +Name[eu]=Telegram +Name[fi]=Telegram +Name[fr]=Telegram +Name[ia]=Telegram +Name[it]=Telegram +Name[ka]=ტელეგრამი +Name[ko]=텔레그램 +Name[nl]=Telegram +Name[nn]=Telegram +Name[pl]=Telegram +Name[pt]=Telegram +Name[pt_BR]=Telegram +Name[ro]=Telegram +Name[ru]=Telegram +Name[sk]=Telegram +Name[sl]=Telegram +Name[sv]=Telegram +Name[tr]=Telegram +Name[uk]=Telegram +Name[x-test]=xxTelegramxx +Name[zh_CN]=Telegram diff --git a/src/improtocols/threema.desktop b/src/improtocols/threema.desktop new file mode 100644 index 0000000..cbcd6df --- /dev/null +++ b/src/improtocols/threema.desktop @@ -0,0 +1,50 @@ +[Desktop Entry] +Type=Service +Comment=Threema +Comment[ar]=ثریما +Comment[bg]=Threema +Comment[ca]=Threema +Comment[ca@valencia]=Threema +Comment[cs]=Threema +Comment[de]=Threema +Comment[el]=Threema +Comment[en_GB]=Threema +Comment[es]=Threema +Comment[eu]=Threema +Comment[fr]=Threema +Comment[ia]=Threema +Comment[it]=Threema +Comment[ka]=Threema +Comment[nl]=Threema +Comment[nn]=Threema +Comment[pl]=Threema +Comment[pt]=Threema +Comment[pt_BR]=Threema +Comment[sl]=Threema +Comment[tr]=Threema +Comment[uk]=Threema +Comment[x-test]=xxThreemaxx +Name=Threema +Name[ar]=ثریما +Name[bg]=Threema +Name[ca]=Threema +Name[ca@valencia]=Threema +Name[cs]=Threema +Name[de]=Threema +Name[el]=Threema +Name[en_GB]=Threema +Name[es]=Threema +Name[eu]=Threema +Name[fr]=Threema +Name[ia]=Threema +Name[it]=Threema +Name[ka]=Threema +Name[nl]=Threema +Name[nn]=Threema +Name[pl]=Threema +Name[pt]=Threema +Name[pt_BR]=Threema +Name[sl]=Threema +Name[tr]=Threema +Name[uk]=Threema +Name[x-test]=xxThreemaxx diff --git a/src/improtocols/twitter.desktop b/src/improtocols/twitter.desktop new file mode 100644 index 0000000..3fcbdd5 --- /dev/null +++ b/src/improtocols/twitter.desktop @@ -0,0 +1,86 @@ +[Desktop Entry] +Type=Service +Icon=im-twitter +Comment=Twitter Protocol +Comment[ar]=ميفاق تويتر +Comment[az]=Twitter Protokolu +Comment[bg]=Протокол на Twitter +Comment[ca]=Protocol Twitter +Comment[ca@valencia]=Protocol Twitter +Comment[cs]=Protokol Twitter +Comment[da]=Twitter-protokollen +Comment[de]=Twitter-Protokoll +Comment[el]=Twitter πρωτόκολλο +Comment[en_GB]=Twitter Protocol +Comment[es]=Protocolo Twitter +Comment[et]=Twitteri protokoll +Comment[eu]=Twitter Protokoloa +Comment[fi]=Twitter-yhteyskäytäntö +Comment[fr]=Protocole Twitter +Comment[gl]=Protocolo de Twitter +Comment[hu]=Twitter protokoll +Comment[ia]=Protocollo de Twitter +Comment[id]=Protokol Twitter +Comment[it]=Protocollo di Twitter +Comment[ka]=Twitter პროტოკოლი +Comment[ko]=트위터 프로토콜 +Comment[lt]=Twitter protokolas +Comment[nl]=Twitter-protocol +Comment[nn]=Twitter-protokoll +Comment[pl]=Protokół Twittera +Comment[pt]=Protocolo do Twitter +Comment[pt_BR]=Protocolo do Twitter +Comment[ro]=Protocol Twitter +Comment[ru]=Протокол Twitter +Comment[sk]=Twitter Protokol +Comment[sl]=Protokol Twitter +Comment[sq]=Twitter Protocol +Comment[sv]=Twitter-protokoll +Comment[tg]=Протоколи Twitter +Comment[tr]=Twitter Protokolü +Comment[uk]=Протокол Twitter +Comment[x-test]=xxTwitter Protocolxx +Comment[zh_CN]=Twitter 协议 +Comment[zh_TW]=Twitter 通訊協定 +Name=Twitter +Name[ar]=تويتر +Name[az]=Twitter +Name[bg]=Twitter +Name[ca]=Twitter +Name[ca@valencia]=Twitter +Name[cs]=Twitter +Name[da]=Twitter +Name[de]=Twitter +Name[el]=Twitter +Name[en_GB]=Twitter +Name[es]=Twitter +Name[et]=Twitter +Name[eu]=Twitter +Name[fi]=Twitter +Name[fr]=Twitter +Name[gl]=Twitter +Name[hu]=Twitter +Name[ia]=Twitter +Name[id]=Twitter +Name[it]=Twitter +Name[ka]=Twitter +Name[ko]=트위터 +Name[lt]=Twitter +Name[nb]=Twitter +Name[nl]=Twitter +Name[nn]=Twitter +Name[pl]=Twitter +Name[pt]=Twitter +Name[pt_BR]=Twitter +Name[ro]=Twitter +Name[ru]=Twitter +Name[sk]=Twitter +Name[sl]=Twitter +Name[sq]=Twitter +Name[sv]=Twitter +Name[tg]=Twitter +Name[tr]=Twitter +Name[uk]=Twitter +Name[x-test]=xxTwitterxx +Name[zh_CN]=Twitter +Name[zh_TW]=Twitter diff --git a/src/improtocols/xmpp.desktop b/src/improtocols/xmpp.desktop new file mode 100644 index 0000000..894ab72 --- /dev/null +++ b/src/improtocols/xmpp.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-jabber +Comment=Jabber Protocol +Comment[ar]=ميفاق جابر +Comment[az]=Jabber Protokolu +Comment[bg]=Протокол на Jabber +Comment[ca]=Protocol Jabber +Comment[ca@valencia]=Protocol Jabber +Comment[cs]=Protokol Jabber +Comment[da]=Jabber-protokollen +Comment[de]=Jabber-Protokoll +Comment[el]=Jabber πρωτόκολλο +Comment[en_GB]=Jabber Protocol +Comment[es]=Protocolo Jabber +Comment[et]=Jabberi protokoll +Comment[eu]=Jabber Protokoloa +Comment[fi]=Jabber-yhteyskäytäntö +Comment[fr]=Protocole Jabber +Comment[gl]=Protocolo de Jabber +Comment[hu]=Jabber protokoll +Comment[ia]=Protocollo Jabber +Comment[id]=Protokol Jabber +Comment[it]=Protocollo Jabber +Comment[ja]=Jabber プロトコル +Comment[ka]=ჯაბერის პროტოკოლი +Comment[ko]=Jabber 프로토콜 +Comment[lt]=Jabber protokolas +Comment[nb]=Jabber-protokoll +Comment[nl]=Jabber-protocol +Comment[nn]=Jabber-protokoll +Comment[pl]=Protokół Jabber +Comment[pt]=Protocolo Jabber +Comment[pt_BR]=Protocolo do Jabber +Comment[ro]=Protocol Jabber +Comment[ru]=Протокол Jabber +Comment[sk]=Jabber Protokol +Comment[sl]=Protokol Jabber +Comment[sq]=Jabber Protocol +Comment[sv]=Jabber-protokoll +Comment[tg]=Протоколи Jabber +Comment[tr]=Jabber Protokolü +Comment[uk]=Протокол Jabber +Comment[x-test]=xxJabber Protocolxx +Comment[zh_CN]=Jabber 协议 +Comment[zh_TW]=Jabber 通訊協定 +Name=Jabber +Name[ar]=جابر +Name[az]=Jabber +Name[bg]=Jabber +Name[ca]=Jabber +Name[ca@valencia]=Jabber +Name[cs]=Jabber +Name[da]=Jabber +Name[de]=Jabber +Name[el]=Jabber +Name[en_GB]=Jabber +Name[es]=Jabber +Name[et]=Jabber +Name[eu]=Jabber +Name[fi]=Jabber +Name[fr]=Jabber +Name[gl]=Jabber +Name[hu]=Jabber +Name[ia]=Jabber +Name[id]=Jabber +Name[it]=Jabber +Name[ja]=Jabber +Name[ka]=Jabber +Name[ko]=Jabber +Name[lt]=Jabber +Name[nb]=Jabber +Name[nl]=Jabber +Name[nn]=Jabber +Name[pl]=Jabber +Name[pt]=Jabber +Name[pt_BR]=Jabber +Name[ro]=Jabber +Name[ru]=Jabber +Name[sk]=Jabber +Name[sl]=Jabber +Name[sq]=Jabber +Name[sv]=Jabber +Name[tg]=Jabber +Name[tr]=Jabber +Name[uk]=Jabber +Name[x-test]=xxJabberxx +Name[zh_CN]=Jabber +Name[zh_TW]=Jabber diff --git a/src/improtocols/ymsgr.desktop b/src/improtocols/ymsgr.desktop new file mode 100644 index 0000000..cbd05aa --- /dev/null +++ b/src/improtocols/ymsgr.desktop @@ -0,0 +1,89 @@ +[Desktop Entry] +Type=Service +Icon=im-yahoo +Comment=Yahoo Protocol +Comment[ar]=ميفاق ياهو +Comment[az]=Yahoo Protokolu +Comment[bg]=Протокол на Yahoo +Comment[ca]=Protocol Yahoo +Comment[ca@valencia]=Protocol Yahoo +Comment[cs]=Protokol Yahoo +Comment[da]=Yahoo-protokollen +Comment[de]=Yahoo-Protokoll +Comment[el]=Yahoo πρωτόκολλο +Comment[en_GB]=Yahoo Protocol +Comment[es]=Protocolo Yahoo +Comment[et]=Yahoo protokoll +Comment[eu]=Yahoo Protokoloa +Comment[fi]=Yahoo-yhteyskäytäntö +Comment[fr]=Protocole Yahoo +Comment[gl]=Protocolo de Yahoo +Comment[hu]=Yahoo protokoll +Comment[ia]=Protocollo Yahoo +Comment[id]=Protokol Yahoo +Comment[it]=Protocollo di Yahoo +Comment[ja]=Yahoo プロトコル +Comment[ka]=Yahoo პროტოკოლი +Comment[ko]=Yahoo 프로토콜 +Comment[lt]=Yahoo protokolas +Comment[nb]=Yahoo-protokoll +Comment[nl]=Yahoo-protocol +Comment[nn]=Yahoo!-protokoll +Comment[pl]=Protokół Yahoo +Comment[pt]=Protocolo Yahoo +Comment[pt_BR]=Protocolo do Yahoo +Comment[ro]=Protocol Yahoo +Comment[ru]=Протокол Yahoo +Comment[sk]=Yahoo Protokol +Comment[sl]=Protokol Yahoo +Comment[sq]=Yahoo Protocol +Comment[sv]=Yahoo-protokoll +Comment[tg]=Протоколи Yahoo +Comment[tr]=Yahoo Protokolü +Comment[uk]=Протокол Yahoo +Comment[x-test]=xxYahoo Protocolxx +Comment[zh_CN]=雅虎协议 +Comment[zh_TW]=Yahoo 通訊協定 +Name=Yahoo +Name[ar]=ياهو +Name[az]=Yahoo +Name[bg]=Yahoo +Name[ca]=Yahoo +Name[ca@valencia]=Yahoo +Name[cs]=Yahoo +Name[da]=Yahoo +Name[de]=Yahoo +Name[el]=Yahoo +Name[en_GB]=Yahoo +Name[es]=Yahoo +Name[et]=Yahoo +Name[eu]=Yahoo +Name[fi]=Yahoo +Name[fr]=Yahoo +Name[gl]=Yahoo +Name[hu]=Yahoo +Name[ia]=Yahoo +Name[id]=Yahoo +Name[it]=Yahoo +Name[ja]=Yahoo +Name[ka]=Yahoo +Name[ko]=Yahoo +Name[lt]=Yahoo +Name[nb]=Yahoo +Name[nl]=Yahoo +Name[nn]=Yahoo +Name[pl]=Yahoo +Name[pt]=Yahoo +Name[pt_BR]=Yahoo +Name[ro]=Yahoo +Name[ru]=Yahoo +Name[sk]=Yahoo +Name[sl]=Yahoo +Name[sq]=Yahoo +Name[sv]=Yahoo +Name[tg]=Yahoo +Name[tr]=Yahoo +Name[uk]=Yahoo +Name[x-test]=xxYahooxx +Name[zh_CN]=雅虎 +Name[zh_TW]=Yahoo diff --git a/src/kcontacts.qrc b/src/kcontacts.qrc new file mode 100644 index 0000000..bbc13d5 --- /dev/null +++ b/src/kcontacts.qrc @@ -0,0 +1,5 @@ + + + addressformatrc + + diff --git a/src/key.cpp b/src/key.cpp new file mode 100644 index 0000000..66ed984 --- /dev/null +++ b/src/key.cpp @@ -0,0 +1,229 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "key.h" + +#include +#include + +#include + +using namespace KContacts; + +class Q_DECL_HIDDEN Key::Private : public QSharedData +{ +public: + Private() + : mId(KRandom::randomString(8)) + { + } + + Private(const Private &other) + : QSharedData(other) + { + mId = other.mId; + mBinaryData = other.mBinaryData; + mTextData = other.mTextData; + mCustomTypeString = other.mCustomTypeString; + mIsBinary = other.mIsBinary; + mType = other.mType; + } + + QString mId; + QByteArray mBinaryData; + QString mTextData; + QString mCustomTypeString; + + Type mType; + bool mIsBinary; +}; + +Key::Key(const QString &text, Type type) + : d(new Private) +{ + d->mTextData = text; + d->mIsBinary = false; + d->mType = type; +} + +Key::Key(const Key &other) + : d(other.d) +{ +} + +Key::~Key() +{ +} + +bool Key::operator==(const Key &other) const +{ + if (d->mId != other.d->mId) { + return false; + } + + if (d->mType != other.d->mType) { + return false; + } + + if (d->mIsBinary != other.d->mIsBinary) { + return false; + } + + if (d->mIsBinary) { + if (d->mBinaryData != other.d->mBinaryData) { + return false; + } + } else { + if (d->mTextData != other.d->mTextData) { + return false; + } + } + + if (d->mCustomTypeString != other.d->mCustomTypeString) { + return false; + } + + return true; +} + +bool Key::operator!=(const Key &other) const +{ + return !(*this == other); +} + +Key &Key::operator=(const Key &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +void Key::setId(const QString &id) +{ + d->mId = id; +} + +QString Key::id() const +{ + return d->mId; +} + +void Key::setBinaryData(const QByteArray &binary) +{ + d->mBinaryData = binary; + d->mIsBinary = true; +} + +QByteArray Key::binaryData() const +{ + return d->mBinaryData; +} + +void Key::setTextData(const QString &text) +{ + d->mTextData = text; + d->mIsBinary = false; +} + +QString Key::textData() const +{ + return d->mTextData; +} + +bool Key::isBinary() const +{ + return d->mIsBinary; +} + +void Key::setType(Type type) +{ + d->mType = type; +} + +void Key::setCustomTypeString(const QString &custom) +{ + d->mCustomTypeString = custom; +} + +Key::Type Key::type() const +{ + return d->mType; +} + +QString Key::customTypeString() const +{ + return d->mCustomTypeString; +} + +QString Key::toString() const +{ + QString str = QLatin1String("Key {\n"); + str += QStringLiteral(" Id: %1\n").arg(d->mId); + str += QStringLiteral(" Type: %1\n").arg(typeLabel(d->mType)); + if (d->mType == Custom) { + str += QStringLiteral(" CustomType: %1\n").arg(d->mCustomTypeString); + } + str += QStringLiteral(" IsBinary: %1\n").arg(d->mIsBinary ? QStringLiteral("true") : QStringLiteral("false")); + if (d->mIsBinary) { + str += QStringLiteral(" Binary: %1\n").arg(QString::fromLatin1(d->mBinaryData.toBase64())); + } else { + str += QStringLiteral(" Text: %1\n").arg(d->mTextData); + } + str += QLatin1String("}\n"); + + return str; +} + +Key::TypeList Key::typeList() +{ + static TypeList list; + + if (list.isEmpty()) { + list << X509 << PGP << Custom; + } + + return list; +} + +QString Key::typeLabel(Type type) +{ + switch (type) { + case X509: + return i18nc("X.509 public key", "X509"); + break; + case PGP: + return i18nc("Pretty Good Privacy key", "PGP"); + break; + case Custom: + return i18nc("A custom key", "Custom"); + break; + default: + return i18nc("another type of encryption key", "Unknown type"); + break; + } +} + +// clang-format off +QDataStream &KContacts::operator<<(QDataStream &s, const Key &key) +{ + return s << key.d->mId << key.d->mType << key.d->mIsBinary << key.d->mBinaryData + << key.d->mTextData << key.d->mCustomTypeString; +} + +QDataStream &KContacts::operator>>(QDataStream &s, Key &key) +{ + uint type; + s >> key.d->mId >> type >> key.d->mIsBinary >> key.d->mBinaryData >> key.d->mTextData + >> key.d->mCustomTypeString; + + key.d->mType = Key::Type(type); + + return s; +} +// clang-format on diff --git a/src/key.h b/src/key.h new file mode 100644 index 0000000..b670326 --- /dev/null +++ b/src/key.h @@ -0,0 +1,171 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_KEY_H +#define KCONTACTS_KEY_H + +#include "kcontacts_export.h" + +#include +#include + +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 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 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 d; +}; + +/** + Serializes the @p key object into the @p stream. +*/ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Key &key); + +/** + Initializes the @p key object from the @p stream. +*/ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Key &key); +} +Q_DECLARE_TYPEINFO(KContacts::Key, Q_MOVABLE_TYPE); +#endif diff --git a/src/lang.cpp b/src/lang.cpp new file mode 100644 index 0000000..beba4f0 --- /dev/null +++ b/src/lang.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "lang.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/lang.h b/src/lang.h new file mode 100644 index 0000000..2e92067 --- /dev/null +++ b/src/lang.h @@ -0,0 +1,84 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef LANG_H +#define LANG_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Lang &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Lang &object); +} +Q_DECLARE_TYPEINFO(KContacts::Lang, Q_MOVABLE_TYPE); +#endif // LANG_H diff --git a/src/ldif.cpp b/src/ldif.cpp new file mode 100644 index 0000000..cc3e722 --- /dev/null +++ b/src/ldif.cpp @@ -0,0 +1,429 @@ +/* + A temporary copy to break dependency to KLDAP + + This file is part of libkldap. + SPDX-FileCopyrightText: 2004-2006 Szombathelyi György + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "ldif_p.h" + +#include "kcontacts_debug.h" + +class Q_DECL_HIDDEN Ldif::LdifPrivate +{ +public: + int mModType; + bool mDelOldRdn, mUrl; + QByteArray mDn; + QString mAttr, mNewRdn, mNewSuperior, mOid; + QByteArray mLdif, mValue; + EntryType mEntryType; + + bool mIsNewLine, mIsComment, mCritical; + ParseValue mLastParseValue; + uint mPos, mLineNumber; + QByteArray mLine; +}; + +Ldif::Ldif() + : d(new LdifPrivate) +{ + startParsing(); +} + +Ldif::Ldif(const Ldif &that) + : d(new LdifPrivate) +{ + *d = *that.d; + + startParsing(); +} + +Ldif &Ldif::operator=(const Ldif &that) +{ + if (this == &that) { + return *this; + } + + *d = *that.d; + + return *this; +} + +Ldif::~Ldif() +{ + delete d; +} + +QByteArray Ldif::assembleLine(const QString &fieldname, const QByteArray &value, uint linelen, bool url) +{ + QByteArray result; + + if (url) { + result = fieldname.toUtf8() + ":< " + value; + } else { + bool safe = false; + bool isDn = fieldname.toLower() == QLatin1String("dn"); + // SAFE-INIT-CHAR + if (value.size() > 0 && value[0] > 0 && value[0] != '\n' // + && value[0] != '\r' && value[0] != ':' && value[0] != '<') { + safe = true; + } + + // SAFE-CHAR + if (safe) { + for (int i = 1; i < value.size(); ++i) { + // allow utf-8 in Distinguished Names + if ((isDn && value[i] == 0) // + || (!isDn && value[i] <= 0) // + || value[i] == '\r' || value[i] == '\n') { + safe = false; + break; + } + } + } + + if (value.isEmpty()) { + safe = true; + } + + if (safe) { + result = fieldname.toUtf8() + ": " + value; + } else { + result = fieldname.toUtf8() + ":: " + value.toBase64(); + } + + if (linelen > 0) { + int i = (uint)(fieldname.length() + 2) > linelen ? fieldname.length() + 2 : linelen; + while (i < result.length()) { + result.insert(i, "\n "); + i += linelen + 2; + } + } + } + return result; +} + +QByteArray Ldif::assembleLine(const QString &fieldname, const QString &value, uint linelen, bool url) +{ + return assembleLine(fieldname, value.toUtf8(), linelen, url); +} + +bool Ldif::splitLine(const QByteArray &line, QString &fieldname, QByteArray &value) +{ + int position; + int linelen; + + // qCDebug(KCONTACTS_LOG) << "line:" << QString::fromUtf8(line); + + position = line.indexOf(":"); + if (position == -1) { + // strange: we did not find a fieldname + fieldname = QLatin1String(""); + value = line.trimmed(); + // qCDebug(KCONTACTS_LOG) << "value :" << value[0]; + return false; + } + + linelen = line.size(); + fieldname = QString::fromUtf8(line.left(position).trimmed()); + + if (linelen > (position + 1) && line[position + 1] == ':') { + // String is BASE64 encoded -> decode it now. + if (linelen <= (position + 3)) { + value.resize(0); + return false; + } + value = QByteArray::fromBase64(line.mid(position + 3)); + return false; + } + + if (linelen > (position + 1) && line[position + 1] == '<') { + // String is an URL. + if (linelen <= (position + 3)) { + value.resize(0); + return false; + } + value = QByteArray::fromBase64(line.mid(position + 3)); + return true; + } + + if (linelen <= (position + 2)) { + value.resize(0); + return false; + } + value = line.mid(position + 2); + return false; +} + +bool Ldif::splitControl(const QByteArray &line, QString &oid, bool &critical, QByteArray &value) +{ + QString tmp; + critical = false; + bool url = splitLine(line, tmp, value); + + qCDebug(KCONTACTS_LOG) << "value:" << QString::fromUtf8(value); + if (tmp.isEmpty()) { + tmp = QString::fromUtf8(value); + value.resize(0); + } + if (tmp.endsWith(QLatin1String("true"))) { + critical = true; + tmp.chop(5); + } else if (tmp.endsWith(QLatin1String("false"))) { + critical = false; + tmp.chop(6); + } + oid = tmp; + return url; +} + +Ldif::ParseValue Ldif::processLine() +{ + if (d->mIsComment) { + return None; + } + + ParseValue retval = None; + if (d->mLastParseValue == EndEntry) { + d->mEntryType = Entry_None; + } + + d->mUrl = splitLine(d->mLine, d->mAttr, d->mValue); + + QString attrLower = d->mAttr.toLower(); + + switch (d->mEntryType) { + case Entry_None: + if (attrLower == QLatin1String("version")) { + if (!d->mDn.isEmpty()) { + retval = Err; + } + } else if (attrLower == QLatin1String("dn")) { + qCDebug(KCONTACTS_LOG) << "ldapentry dn:" << QString::fromUtf8(d->mValue); + d->mDn = d->mValue; + d->mModType = Mod_None; + retval = NewEntry; + } else if (attrLower == QLatin1String("changetype")) { + if (d->mDn.isEmpty()) { + retval = Err; + } else { + QString tmpval = QString::fromUtf8(d->mValue); + qCDebug(KCONTACTS_LOG) << "changetype:" << tmpval; + if (tmpval == QLatin1String("add")) { + d->mEntryType = Entry_Add; + } else if (tmpval == QLatin1String("delete")) { + d->mEntryType = Entry_Del; + } else if (tmpval == QLatin1String("modrdn") || tmpval == QLatin1String("moddn")) { + d->mNewRdn = QLatin1String(""); + d->mNewSuperior = QLatin1String(""); + d->mDelOldRdn = true; + d->mEntryType = Entry_Modrdn; + } else if (tmpval == QLatin1String("modify")) { + d->mEntryType = Entry_Mod; + } else { + retval = Err; + } + } + } else if (attrLower == QLatin1String("control")) { + d->mUrl = splitControl(d->mValue, d->mOid, d->mCritical, d->mValue); + retval = Control; + } else if (!d->mAttr.isEmpty() && !d->mValue.isEmpty()) { + d->mEntryType = Entry_Add; + retval = Item; + } + break; + case Entry_Add: + if (d->mAttr.isEmpty() && d->mValue.isEmpty()) { + retval = EndEntry; + } else { + retval = Item; + } + break; + case Entry_Del: + if (d->mAttr.isEmpty() && d->mValue.isEmpty()) { + retval = EndEntry; + } else { + retval = Err; + } + break; + case Entry_Mod: + if (d->mModType == Mod_None) { + qCDebug(KCONTACTS_LOG) << "new modtype" << d->mAttr; + if (d->mAttr.isEmpty() && d->mValue.isEmpty()) { + retval = EndEntry; + } else if (attrLower == QLatin1String("add")) { + d->mModType = Mod_Add; + } else if (attrLower == QLatin1String("replace")) { + d->mModType = Mod_Replace; + d->mAttr = QString::fromUtf8(d->mValue); + d->mValue = QByteArray(); + retval = Item; + } else if (attrLower == QLatin1String("delete")) { + d->mModType = Mod_Del; + d->mAttr = QString::fromUtf8(d->mValue); + d->mValue = QByteArray(); + retval = Item; + } else { + retval = Err; + } + } else { + if (d->mAttr.isEmpty()) { + if (QString::fromUtf8(d->mValue) == QLatin1String("-")) { + d->mModType = Mod_None; + } else if (d->mValue.isEmpty()) { + retval = EndEntry; + } else { + retval = Err; + } + } else { + retval = Item; + } + } + break; + case Entry_Modrdn: + if (d->mAttr.isEmpty() && d->mValue.isEmpty()) { + retval = EndEntry; + } else if (attrLower == QLatin1String("newrdn")) { + d->mNewRdn = QString::fromUtf8(d->mValue); + } else if (attrLower == QLatin1String("newsuperior")) { + d->mNewSuperior = QString::fromUtf8(d->mValue); + } else if (attrLower == QLatin1String("deleteoldrdn")) { + if (d->mValue.size() > 0 && d->mValue[0] == '0') { + d->mDelOldRdn = false; + } else if (d->mValue.size() > 0 && d->mValue[0] == '1') { + d->mDelOldRdn = true; + } else { + retval = Err; + } + } else { + retval = Err; + } + break; + } + return retval; +} + +Ldif::ParseValue Ldif::nextItem() +{ + ParseValue retval = None; + char c = 0; + + while (retval == None) { + if (d->mPos < (uint)d->mLdif.size()) { + c = d->mLdif[d->mPos]; + d->mPos++; + if (d->mIsNewLine && c == '\r') { + continue; // handle \n\r line end + } + if (d->mIsNewLine && (c == ' ' || c == '\t')) { // line folding + d->mIsNewLine = false; + continue; + } + if (d->mIsNewLine) { + d->mIsNewLine = false; + retval = processLine(); + d->mLastParseValue = retval; + d->mLine.resize(0); + d->mIsComment = (c == '#'); + } + if (c == '\n' || c == '\r') { + d->mLineNumber++; + d->mIsNewLine = true; + continue; + } + } else { + retval = MoreData; + break; + } + + if (!d->mIsComment) { + d->mLine += c; + } + } + return retval; +} + +void Ldif::endLdif() +{ + QByteArray tmp(3, '\n'); + d->mLdif = tmp; + d->mPos = 0; +} + +void Ldif::startParsing() +{ + d->mPos = d->mLineNumber = 0; + d->mDelOldRdn = false; + d->mEntryType = Entry_None; + d->mModType = Mod_None; + d->mNewRdn.clear(); + d->mNewSuperior.clear(); + d->mLine = QByteArray(); + d->mIsNewLine = false; + d->mIsComment = false; + d->mLastParseValue = None; +} + +void Ldif::setLdif(const QByteArray &ldif) +{ + d->mLdif = ldif; + d->mPos = 0; +} + +Ldif::EntryType Ldif::entryType() const +{ + return d->mEntryType; +} + +int Ldif::modType() const +{ + return d->mModType; +} + +QString Ldif::newRdn() const +{ + return d->mNewRdn; +} + +QString Ldif::newSuperior() const +{ + return d->mNewSuperior; +} + +bool Ldif::delOldRdn() const +{ + return d->mDelOldRdn; +} + +QString Ldif::attr() const +{ + return d->mAttr; +} + +QByteArray Ldif::value() const +{ + return d->mValue; +} + +bool Ldif::isUrl() const +{ + return d->mUrl; +} + +bool Ldif::isCritical() const +{ + return d->mCritical; +} + +QString Ldif::oid() const +{ + return d->mOid; +} + +uint Ldif::lineNumber() const +{ + return d->mLineNumber; +} diff --git a/src/ldif_p.h b/src/ldif_p.h new file mode 100644 index 0000000..5b5e25b --- /dev/null +++ b/src/ldif_p.h @@ -0,0 +1,164 @@ +/* + A temporary copy to break dependency to KLDAP + + This file is part of libkldap. + SPDX-FileCopyrightText: 2004-2006 Szombathelyi György + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef LDIF_P_H +#define LDIF_P_H + +#include +#include + +/** + * Ldif + * + * Ldif implements an RFC 2849 compliant Ldif parser. Ldif files are used to + * represent directory information on LDAP-based servers, or to describe a set + * of changes which are to be applied to a directory. + */ +class Ldif +{ +public: + typedef enum { None, NewEntry, EndEntry, Item, Control, Err, MoreData } ParseValue; + + typedef enum { Entry_None, Entry_Add, Entry_Del, Entry_Mod, Entry_Modrdn } EntryType; + + typedef enum { Mod_None, Mod_Add, Mod_Replace, Mod_Del } ModType; + + Ldif(); + + Ldif(const Ldif &that); + Ldif &operator=(const Ldif &that); + + virtual ~Ldif(); + + /** + * Assembles fieldname and value into a valid Ldif line, BASE64 encodes the + * value if necessary and optionally splits into more lines. + * @param fieldname The name of the entry. + * @param value The value of the entry. + * @param linelen Maximum length of the lines in the result. + * @param url If true, encode value as url ( use :< ). + */ + static QByteArray assembleLine(const QString &fieldname, const QByteArray &value, uint linelen = 0, bool url = false); + /** + * This is the same as the above function, the only difference that + * this accepts QString as the value. + */ + static QByteArray assembleLine(const QString &fieldname, const QString &value, uint linelen = 0, bool url = false); + + /** + * Splits one line from an Ldif file to attribute and value components. + * @return true if value is an URL, false otherwise + */ + static bool splitLine(const QByteArray &line, QString &fieldname, QByteArray &value); + + /** + * Splits a control specification (without the "control:" directive) + * @param line is the control directive + * @param oid will contain the OID + * @param critical will contain the criticality of control + * @param value is the control value + */ + static bool splitControl(const QByteArray &line, QString &oid, bool &critical, QByteArray &value); + + /** + * Starts the parsing of a new Ldif + */ + void startParsing(); + + /** + * Process one Ldif line + */ + ParseValue processLine(); + + /** + * Process the Ldif until a complete item can be returned + * @return NewEntry if a new DN encountered, Item if a new item returned, + * Err if the Ldif contains error, EndEntry if the parser reached the end + * of the current entry and MoreData if the parser encountered the end of + * the current chunk of the Ldif. + * + * If you want to finish the parsing after receiving MoreData, then call + * endLdif(), so the parser can safely flush the current entry. + */ + ParseValue nextItem(); + + /** + * Sets a chunk of Ldif. Call before startParsing(), or if nextItem() + * returned MoreData. + */ + void setLdif(const QByteArray &ldif); + + /** + * Indicates the end of the Ldif file/stream. Call if nextItem() returned + * MoreData, but actually you don't have more data. + */ + void endLdif(); + + /** + * Returns the requested LDAP operation extracted from the current entry. + */ + EntryType entryType() const; + + /** + * Returns the LDAP modify request type if entryType() returned Entry_Mod. + */ + int modType() const; + + /** + * Returns the new Relative Distinguished Name if modType() returned + * Entry_Modrdn. + */ + QString newRdn() const; + + /** + * Returns the new parent of the entry if modType() returned Entry_Modrdn. + */ + QString newSuperior() const; + + /** + * Returns if the delete of the old RDN is required. + */ + bool delOldRdn() const; + + /** + * Returns the attribute name. + */ + QString attr() const; + + /** + * Returns the attribute value. + */ + QByteArray value() const; + + /** + * Returns if val() is an url + */ + bool isUrl() const; + + /** + * Returns the criticality level when modType() returned Control. + */ + bool isCritical() const; + + /** + * Returns the OID when modType() returned Control. + */ + QString oid() const; + + /** + * Returns the line number which the parser processes. + */ + uint lineNumber() const; + +private: + class LdifPrivate; + LdifPrivate *const d; +}; + +#endif diff --git a/src/namespace.cpp b/src/namespace.cpp new file mode 100644 index 0000000..54b6ee1 --- /dev/null +++ b/src/namespace.cpp @@ -0,0 +1,7 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "namespace.h" +#include "moc_namespace.cpp" diff --git a/src/namespace.h b/src/namespace.h new file mode 100644 index 0000000..5207357 --- /dev/null +++ b/src/namespace.h @@ -0,0 +1,88 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_NAMESPACE_H +#define KCONTACTS_NAMESPACE_H + +#include "kcontacts_export.h" + +#include + +/** @file namespace.h + * Everything that needs to go in to the KContacts Q_NAMESPACE meta object. + */ + +namespace KContacts +{ +KCONTACTS_EXPORT Q_NAMESPACE + + /** Address formatting styles. + * @see KContacts::Address::formatted + * @since 5.92 + */ + enum class AddressFormatStyle { + Postal, ///< Format used for addressing postal mail + MultiLineDomestic, ///< Multi-line format without country, for displaying + MultiLineInternational, ///< Multi-line format including the country, for displaying + SingleLineDomestic, ///< Single-line format without country, for displaying + SingleLineInternational, ///< Single-line format including the country, for displaying + GeoUriQuery, ///< Format used in geo: URI query expressions + }; + +Q_ENUM_NS(AddressFormatStyle) + +/** Address field types. + * These are the field types that can be referenced in address format rules. + * @note Not all of those are represented by vCard and thus KContacts, but exist + * only for compatibility with libaddressinput, so format rules from that can be + * consumed directly. + * @see KContacts::AddressFormat + * @since 5.92 + */ +enum class AddressFormatField { + NoField = 0, + // from libaddressinput + Country = 1, + Region = 2, + Locality = 4, + DependentLocality = 8, // not used by us + SortingCode = 16, // not used by us + PostalCode = 32, + StreetAddress = 64, + Organization = 128, + Name = 256, + // added by us for vCard compat + PostOfficeBox = 512, +}; +Q_ENUM_NS(AddressFormatField) + +/** A set of address fields. + * @see KContacts::AddressFormat + * @since 5.92 + */ +Q_DECLARE_FLAGS(AddressFormatFields, AddressFormatField) +Q_FLAG_NS(AddressFormatFields) + +/** Indicate whether to use a address format in the local script or a Latin transliteration. + * @see KContacts::AddressFormatRepository + * @since 5.92 + */ +enum class AddressFormatScriptPreference { + Local, + Latin, +}; +Q_ENUM_NS(AddressFormatScriptPreference) + +/** Indicate whether to prefer an address format for (postal) business address or a generic one. + * @see KContacts::AddressFormatRepository + * @since 5.92 + */ +enum class AddressFormatPreference { Generic, Business }; +Q_ENUM_NS(AddressFormatPreference) +} + +Q_DECLARE_OPERATORS_FOR_FLAGS(KContacts::AddressFormatFields) + +#endif // KCONTACTS_NAMESPACE_H diff --git a/src/nickname.cpp b/src/nickname.cpp new file mode 100644 index 0000000..be17325 --- /dev/null +++ b/src/nickname.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "nickname.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/nickname.h b/src/nickname.h new file mode 100644 index 0000000..ac47512 --- /dev/null +++ b/src/nickname.h @@ -0,0 +1,83 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef NICKNAME_H +#define NICKNAME_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const NickName &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, NickName &object); +} +Q_DECLARE_TYPEINFO(KContacts::NickName, Q_MOVABLE_TYPE); +#endif // NICKNAME_H diff --git a/src/note.cpp b/src/note.cpp new file mode 100644 index 0000000..3d26317 --- /dev/null +++ b/src/note.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "note.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/note.h b/src/note.h new file mode 100644 index 0000000..cd1bd3b --- /dev/null +++ b/src/note.h @@ -0,0 +1,80 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef NOTE_H +#define NOTE_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Note &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Note &object); +} +Q_DECLARE_TYPEINFO(KContacts::Note, Q_MOVABLE_TYPE); +#endif // NOTE_H diff --git a/src/org.cpp b/src/org.cpp new file mode 100644 index 0000000..0b457df --- /dev/null +++ b/src/org.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "org.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/org.h b/src/org.h new file mode 100644 index 0000000..c1dfbef --- /dev/null +++ b/src/org.h @@ -0,0 +1,83 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ORG_H +#define ORG_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Org &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Org &object); +} +Q_DECLARE_TYPEINFO(KContacts::Org, Q_MOVABLE_TYPE); +#endif // ORG_H diff --git a/src/parametermap_p.h b/src/parametermap_p.h new file mode 100644 index 0000000..034f0bb --- /dev/null +++ b/src/parametermap_p.h @@ -0,0 +1,125 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2021 Ahmad Samir + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef PARAMETERMAP_P_H +#define PARAMETERMAP_P_H + +#include +#include +#include + +#include +#include + +namespace KContacts +{ +struct ParameterData { + QString param; + QStringList paramValues; +}; + +class ParameterMap : public std::vector +{ +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 ¶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 toQMap() const + { + QMap 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(map.size()); + for (const auto &[p, list] : map) { + s << p << list; + } + return s; +} + +inline QDataStream &operator>>(QDataStream &s, ParameterMap &map) +{ + map.clear(); + quint32 n; + s >> n; + for (quint32 i = 0; i < n; ++i) { + QString p; + QStringList lst; + s >> p >> lst; + if (s.status() != QDataStream::Ok) { + map.clear(); + break; + } + map.push_back({p, lst}); + } + + return s; +} +} + +#endif diff --git a/src/phonenumber.cpp b/src/phonenumber.cpp new file mode 100644 index 0000000..a287b1e --- /dev/null +++ b/src/phonenumber.cpp @@ -0,0 +1,308 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "phonenumber.h" +#include "parametermap_p.h" + +#include +#include + +#include +#include + +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(static_cast(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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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(phone.d->mType) << phone.d->mNumber << phone.d->mParamMap; +} + +QDataStream &KContacts::operator>>(QDataStream &s, PhoneNumber &phone) +{ + uint type; + s >> phone.d->mId >> type >> phone.d->mNumber >> phone.d->mParamMap; + phone.d->mType = PhoneNumber::Type(type); + + return s; +} diff --git a/src/phonenumber.h b/src/phonenumber.h new file mode 100644 index 0000000..b3b4bce --- /dev/null +++ b/src/phonenumber.h @@ -0,0 +1,280 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_PHONENUMBER_H +#define KCONTACTS_PHONENUMBER_H + +#include "kcontacts_export.h" + +#include +#include +#include +#include +#include + +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 TypeList; + + /** + * List of phone numbers. + */ + typedef QVector 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap parameters() const; +#endif + +private: + void setParams(const ParameterMap ¶ms); + Q_REQUIRED_RESULT ParameterMap params() const; + + class Private; + QSharedDataPointer d; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(PhoneNumber::Type) + +/** + * Serializes the phone @p number object into the @p stream. + * + * @param stream The stream to write into + * @param number The phone number object to serialize + */ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const PhoneNumber &number); + +/** + * Initializes the phone @p number object from the @p stream. + * + * @param stream The stream to read from + * @param number The phone number object to deserialize into + */ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, PhoneNumber &number); +} +Q_DECLARE_METATYPE(KContacts::PhoneNumber) +Q_DECLARE_TYPEINFO(KContacts::PhoneNumber, Q_MOVABLE_TYPE); +#endif diff --git a/src/picture.cpp b/src/picture.cpp new file mode 100644 index 0000000..bfa5bc6 --- /dev/null +++ b/src/picture.cpp @@ -0,0 +1,227 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "picture.h" + +#include +#include + + +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, s_sharedEmpty, (new KContacts::PicturePrivate)) + +using namespace KContacts; + +Picture::Picture() + : d(*s_sharedEmpty()) +{ +} + +Picture::Picture(const QString &url) + : d(new PicturePrivate) +{ + d->mUrl = url; +} + +Picture::Picture(const QImage &data) + : d(new PicturePrivate) +{ + setData(data); +} + +Picture::Picture(const Picture &other) + : d(other.d) +{ +} + +Picture::~Picture() +{ +} + +Picture &Picture::operator=(const Picture &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +bool Picture::operator==(const Picture &p) const +{ + if (d->mIntern != p.d->mIntern) { + return false; + } + + if (d->mType != p.d->mType) { + return false; + } + + if (d->mIntern) { + if (!d->mData.isNull() && !p.d->mData.isNull()) { + if (d->mData != p.d->mData) { + return false; + } + } else if (!d->mRawData.isEmpty() && !p.d->mRawData.isEmpty()) { + if (d->mRawData != p.d->mRawData) { + return false; + } + } else if ((!d->mData.isNull() || !d->mRawData.isEmpty()) // + && (!p.d->mData.isNull() || !p.d->mRawData.isEmpty())) { + if (data() != p.data()) { + return false; + } + } else { + // if one picture is empty and the other is not + return false; + } + } else { + if (d->mUrl != p.d->mUrl) { + return false; + } + } + + return true; +} + +bool Picture::operator!=(const Picture &p) const +{ + return !(p == *this); +} + +bool Picture::isEmpty() const +{ + return (!d->mIntern && d->mUrl.isEmpty()) // + || (d->mIntern && d->mData.isNull() && d->mRawData.isEmpty()); +} + +void Picture::setUrl(const QString &url) +{ + d->mUrl = url; + d->mType.clear(); + d->mIntern = false; +} + +void Picture::setUrl(const QString &url, const QString &type) +{ + d->mUrl = url; + d->mType = type; + d->mIntern = false; +} + +void Picture::setData(const QImage &data) +{ + d->mRawData.clear(); + d->mData = data; + d->mIntern = true; + + // set the type, the raw data will have when accessed through Picture::rawData() + if (!d->mData.hasAlphaChannel()) { + d->mType = QStringLiteral("jpeg"); + } else { + d->mType = QStringLiteral("png"); + } +} + +void Picture::setRawData(const QByteArray &rawData, const QString &type) +{ + d->mRawData = rawData; + d->mType = type; + d->mData = QImage(); + d->mIntern = true; +} + +bool Picture::isIntern() const +{ + return d->mIntern; +} + +QString Picture::url() const +{ + return d->mUrl; +} + +QImage Picture::data() const +{ + if (d->mData.isNull() && !d->mRawData.isEmpty()) { + d->mData.loadFromData(d->mRawData); + } + + return d->mData; +} + +QByteArray Picture::rawData() const +{ + if (d->mRawData.isEmpty() && !d->mData.isNull()) { + QBuffer buffer(&d->mRawData); + buffer.open(QIODevice::WriteOnly); + + // d->mType was already set accordingly by Picture::setData() + d->mData.save(&buffer, d->mType.toUpper().toLatin1().data()); + } + + return d->mRawData; +} + +QString Picture::type() const +{ + return d->mType; +} + +QString Picture::toString() const +{ + QString str = QLatin1String("Picture {\n"); + str += QStringLiteral(" Type: %1\n").arg(d->mType); + str += QStringLiteral(" IsIntern: %1\n").arg(d->mIntern ? QStringLiteral("true") : QStringLiteral("false")); + if (d->mIntern) { + str += QStringLiteral(" Data: %1\n").arg(QString::fromLatin1(rawData().toBase64())); + } else { + str += QStringLiteral(" Url: %1\n").arg(d->mUrl); + } + str += QLatin1String("}\n"); + + return str; +} + +QDataStream &KContacts::operator<<(QDataStream &s, const Picture &picture) +{ + return s << picture.d->mIntern << picture.d->mUrl << picture.d->mType << picture.data(); +} + +QDataStream &KContacts::operator>>(QDataStream &s, Picture &picture) +{ + s >> picture.d->mIntern >> picture.d->mUrl >> picture.d->mType >> picture.d->mData; + + return s; +} diff --git a/src/picture.h b/src/picture.h new file mode 100644 index 0000000..3f02f56 --- /dev/null +++ b/src/picture.h @@ -0,0 +1,188 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_PICTURE_H +#define KCONTACTS_PICTURE_H + +#include "kcontacts_export.h" + +#include +#include +#include +#include + +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 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 d; +}; + +/** + * Serializes the @p picture object into the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Picture &picture); + +/** + * Initializes the @p picture object from the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Picture &picture); +} +Q_DECLARE_TYPEINFO(KContacts::Picture, Q_MOVABLE_TYPE); +#endif diff --git a/src/related.cpp b/src/related.cpp new file mode 100644 index 0000000..319d52f --- /dev/null +++ b/src/related.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "related.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/related.h b/src/related.h new file mode 100644 index 0000000..a95d1c3 --- /dev/null +++ b/src/related.h @@ -0,0 +1,81 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef RELATED_H +#define RELATED_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Related &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Related &object); +} +Q_DECLARE_TYPEINFO(KContacts::Related, Q_MOVABLE_TYPE); +#endif // LANG_H diff --git a/src/resourcelocatorurl.cpp b/src/resourcelocatorurl.cpp new file mode 100644 index 0000000..93aee6c --- /dev/null +++ b/src/resourcelocatorurl.cpp @@ -0,0 +1,228 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "resourcelocatorurl.h" + +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/resourcelocatorurl.h b/src/resourcelocatorurl.h new file mode 100644 index 0000000..088e29e --- /dev/null +++ b/src/resourcelocatorurl.h @@ -0,0 +1,135 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2015-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef RESOURCELOCATORURL_H +#define RESOURCELOCATORURL_H + +#include "kcontacts_export.h" + +#include +#include +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(ResourceLocatorUrl::Type) + +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const ResourceLocatorUrl &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, ResourceLocatorUrl &object); +} +Q_DECLARE_METATYPE(KContacts::ResourceLocatorUrl) +Q_DECLARE_TYPEINFO(KContacts::ResourceLocatorUrl, Q_MOVABLE_TYPE); + +#endif // RESOURCELOCATORURL_H diff --git a/src/role.cpp b/src/role.cpp new file mode 100644 index 0000000..29420da --- /dev/null +++ b/src/role.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "role.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/role.h b/src/role.h new file mode 100644 index 0000000..feb9f20 --- /dev/null +++ b/src/role.h @@ -0,0 +1,83 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef ROLE_H +#define ROLE_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 ¶ms); +#endif + +#if KCONTACTS_ENABLE_DEPRECATED_SINCE(5, 88) + /** + * @deprecated Since 5.88 for lack of usage + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap 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 d; +}; +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Role &object); + +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Role &object); +} +Q_DECLARE_TYPEINFO(KContacts::Role, Q_MOVABLE_TYPE); +#endif // ROLE_H diff --git a/src/secrecy.cpp b/src/secrecy.cpp new file mode 100644 index 0000000..6f40685 --- /dev/null +++ b/src/secrecy.cpp @@ -0,0 +1,147 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "secrecy.h" + +#include + +#include +#include + +using namespace KContacts; + +class Q_DECL_HIDDEN Secrecy::PrivateData : public QSharedData +{ +public: + PrivateData() + : mType(Secrecy::Invalid) + { + } + + PrivateData(const PrivateData &other) + : QSharedData(other) + { + mType = other.mType; + } + + Type mType; +}; + +Secrecy::Secrecy(Type type) + : d(new PrivateData) +{ + d->mType = type; +} + +Secrecy::Secrecy(const Secrecy &other) + : d(other.d) +{ +} + +Secrecy::~Secrecy() +{ +} + +Secrecy &Secrecy::operator=(const Secrecy &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +bool Secrecy::operator==(const Secrecy &other) const +{ + return d->mType == other.d->mType; +} + +bool Secrecy::operator!=(const Secrecy &other) const +{ + return !(*this == other); +} + +bool Secrecy::isValid() const +{ + return d->mType != Invalid; +} + +void Secrecy::setType(Type type) +{ + d->mType = type; +} + +Secrecy::Type Secrecy::type() const +{ + return d->mType; +} + +Secrecy::TypeList Secrecy::typeList() +{ + static TypeList list; + + if (list.isEmpty()) { + list << Public << Private << Confidential; + } + + return list; +} + +QString Secrecy::typeLabel(Type type) +{ + switch (type) { + case Public: + return i18nc("access is for everyone", "Public"); + break; + case Private: + return i18nc("access is by owner only", "Private"); + break; + case Confidential: + return i18nc("access is by owner and a controlled group", "Confidential"); + break; + default: + return i18nc("unknown secrecy type", "Unknown type"); + break; + } +} + +QString Secrecy::toString() const +{ + QString str = QLatin1String("Secrecy {\n"); + str += QStringLiteral(" Type: %1\n").arg(typeLabel(d->mType)); + str += QLatin1String("}\n"); + + return str; +} + +QDataStream &KContacts::operator<<(QDataStream &s, const Secrecy &secrecy) +{ + return s << (uint)secrecy.d->mType; +} + +QDataStream &KContacts::operator>>(QDataStream &s, Secrecy &secrecy) +{ + uint type; + s >> type; + + switch (type) { + case 0: + secrecy.d->mType = Secrecy::Public; + break; + case 1: + secrecy.d->mType = Secrecy::Private; + break; + case 2: + secrecy.d->mType = Secrecy::Confidential; + break; + default: + secrecy.d->mType = Secrecy::Invalid; + break; + } + + return s; +} diff --git a/src/secrecy.h b/src/secrecy.h new file mode 100644 index 0000000..cfa3e39 --- /dev/null +++ b/src/secrecy.h @@ -0,0 +1,113 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_SECRECY_H +#define KCONTACTS_SECRECY_H + +#include "kcontacts_export.h" +#include +#include + +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 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 d; +}; + +/** + * Serializes the @p secrecy object into the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Secrecy &secrecy); + +/** + * Initializes the @p secrecy object from the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Secrecy &secrecy); +} +Q_DECLARE_TYPEINFO(KContacts::Secrecy, Q_MOVABLE_TYPE); +#endif diff --git a/src/sound.cpp b/src/sound.cpp new file mode 100644 index 0000000..2b5991e --- /dev/null +++ b/src/sound.cpp @@ -0,0 +1,153 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "sound.h" + +#include +#include + +using namespace KContacts; + +class Q_DECL_HIDDEN Sound::Private : public QSharedData +{ +public: + Private() + : mIntern(false) + { + } + + Private(const Private &other) + : QSharedData(other) + { + mUrl = other.mUrl; + mData = other.mData; + mIntern = other.mIntern; + } + + QString mUrl; + QByteArray mData; + + bool mIntern; +}; + +Sound::Sound() + : d(new Private) +{ +} + +Sound::Sound(const QString &url) + : d(new Private) +{ + d->mUrl = url; +} + +Sound::Sound(const QByteArray &data) + : d(new Private) +{ + d->mIntern = true; + d->mData = data; +} + +Sound::Sound(const Sound &other) + : d(other.d) +{ +} + +Sound::~Sound() +{ +} + +Sound &Sound::operator=(const Sound &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +bool Sound::operator==(const Sound &other) const +{ + if (d->mIntern != other.d->mIntern) { + return false; + } + + if (d->mIntern) { + if (d->mData != other.d->mData) { + return false; + } + } else { + if (d->mUrl != other.d->mUrl) { + return false; + } + } + + return true; +} + +bool Sound::operator!=(const Sound &other) const +{ + return !(other == *this); +} + +void Sound::setUrl(const QString &url) +{ + d->mIntern = false; + d->mUrl = url; +} + +void Sound::setData(const QByteArray &data) +{ + d->mIntern = true; + d->mData = data; +} + +bool Sound::isIntern() const +{ + return d->mIntern; +} + +bool Sound::isEmpty() const +{ + return (d->mIntern && d->mData.isEmpty()) || (!d->mIntern && d->mUrl.isEmpty()); +} + +QString Sound::url() const +{ + return d->mUrl; +} + +QByteArray Sound::data() const +{ + return d->mData; +} + +QString Sound::toString() const +{ + QString str = QLatin1String("Sound {\n"); + str += QStringLiteral(" IsIntern: %1\n").arg(d->mIntern ? QStringLiteral("true") : QStringLiteral("false")); + if (d->mIntern) { + str += QStringLiteral(" Data: %1\n").arg(QString::fromLatin1(d->mData.toBase64())); + } else { + str += QStringLiteral(" Url: %1\n").arg(d->mUrl); + } + str += QLatin1String("}\n"); + + return str; +} + +QDataStream &KContacts::operator<<(QDataStream &s, const Sound &sound) +{ + return s << sound.d->mIntern << sound.d->mUrl << sound.d->mData; +} + +QDataStream &KContacts::operator>>(QDataStream &s, Sound &sound) +{ + s >> sound.d->mIntern >> sound.d->mUrl >> sound.d->mData; + + return s; +} diff --git a/src/sound.h b/src/sound.h new file mode 100644 index 0000000..8b7d532 --- /dev/null +++ b/src/sound.h @@ -0,0 +1,168 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2002 Tobias Koenig + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_SOUND_H +#define KCONTACTS_SOUND_H + +#include "kcontacts_export.h" +#include +#include + +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 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 d; +}; + +/** + * Serializes the @p sound object into the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const Sound &sound); + +/** + * Initializes the @p sound object from the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, Sound &sound); +} +Q_DECLARE_TYPEINFO(KContacts::Sound, Q_MOVABLE_TYPE); +#endif diff --git a/src/timezone.cpp b/src/timezone.cpp new file mode 100644 index 0000000..1796e5a --- /dev/null +++ b/src/timezone.cpp @@ -0,0 +1,120 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "timezone.h" + +#include +#include + +using namespace KContacts; + +class Q_DECL_HIDDEN TimeZone::Private : public QSharedData +{ +public: + Private(int offset = 0, bool valid = false) + : mOffset(offset) + , mValid(valid) + { + } + + Private(const Private &other) + : QSharedData(other) + { + mOffset = other.mOffset; + mValid = other.mValid; + } + + int mOffset; + bool mValid; +}; + +TimeZone::TimeZone() + : d(new Private) +{ +} + +TimeZone::TimeZone(int offset) + : d(new Private(offset, true)) +{ +} + +TimeZone::TimeZone(const TimeZone &other) + : d(other.d) +{ +} + +TimeZone::~TimeZone() +{ +} + +void TimeZone::setOffset(int offset) +{ + d->mOffset = offset; + d->mValid = true; +} + +int TimeZone::offset() const +{ + return d->mOffset; +} + +bool TimeZone::isValid() const +{ + return d->mValid; +} + +bool TimeZone::operator==(const TimeZone &t) const +{ + if (!t.isValid() && !isValid()) { + return true; + } + + if (!t.isValid() || !isValid()) { + return false; + } + + if (t.d->mOffset == d->mOffset) { + return true; + } + + return false; +} + +bool TimeZone::operator!=(const TimeZone &t) const +{ + return !(*this == t); +} + +TimeZone &TimeZone::operator=(const TimeZone &other) +{ + if (this != &other) { + d = other.d; + } + + return *this; +} + +QString TimeZone::toString() const +{ + QString str = QLatin1String("TimeZone {\n"); + str += QStringLiteral(" Offset: %1\n").arg(d->mOffset); + str += QLatin1String("}\n"); + + return str; +} + +QDataStream &KContacts::operator<<(QDataStream &s, const TimeZone &zone) +{ + return s << zone.d->mOffset << zone.d->mValid; +} + +QDataStream &KContacts::operator>>(QDataStream &s, TimeZone &zone) +{ + s >> zone.d->mOffset >> zone.d->mValid; + + return s; +} diff --git a/src/timezone.h b/src/timezone.h new file mode 100644 index 0000000..d3f1f07 --- /dev/null +++ b/src/timezone.h @@ -0,0 +1,93 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2001 Cornelius Schumacher + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_TIMEZONE_H +#define KCONTACTS_TIMEZONE_H + +#include "kcontacts_export.h" +#include +#include + +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 d; +}; + +/** + * Serializes the @p timezone object into the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator<<(QDataStream &stream, const TimeZone &timeZone); + +/** + * Initializes the @p timezone object from the @p stream. + */ +KCONTACTS_EXPORT QDataStream &operator>>(QDataStream &stream, TimeZone &timeZone); +} +Q_DECLARE_TYPEINFO(KContacts::TimeZone, Q_MOVABLE_TYPE); + +#endif diff --git a/src/title.cpp b/src/title.cpp new file mode 100644 index 0000000..04b608e --- /dev/null +++ b/src/title.cpp @@ -0,0 +1,130 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "title.h" +#include "parametermap_p.h" + +#include +#include + +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 ¶ms) +{ + d->mParamMap = ParameterMap::fromQMap(params); +} +#endif + +#if KCONTACTS_BUILD_DEPRECATED_SINCE(5, 88) +QMap 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; +} diff --git a/src/title.h b/src/title.h new file mode 100644 index 0000000..7a31299 --- /dev/null +++ b/src/title.h @@ -0,0 +1,83 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2016-2019 Laurent Montel + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef TITLE_H +#define TITLE_H + +#include "kcontacts_export.h" + +#include +#include +#include + +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 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 + */ + Q_REQUIRED_RESULT + KCONTACTS_DEPRECATED_VERSION(5, 88, "For lack of usage.") + QMap<QString, QStringList> parameters() const; +#endif + + Q_REQUIRED_RESULT bool operator==(const Title &other) const; + Q_REQUIRED_RESULT bool operator!=(const Title &other) const; + + Title &operator=(const Title &other); + + Q_REQUIRED_RESULT QString toString() const; + +private: + void setParams(const ParameterMap ¶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 diff --git a/src/vcarddrag.cpp b/src/vcarddrag.cpp new file mode 100644 index 0000000..b9efe27 --- /dev/null +++ b/src/vcarddrag.cpp @@ -0,0 +1,79 @@ +/* + This file is part of the KContacts framework. + + SPDX-FileCopyrightText: 2002 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "vcarddrag.h" + +#include "converter/vcardconverter.h" + +#include <QMimeDatabase> + +using namespace KContacts; + +static QString findCompatibleMimeType(const QMimeData *md) +{ + if (!md) { + return {}; + } + // check the canonical MIME type first + if (md->hasFormat(KContacts::Addressee::mimeType())) { + return KContacts::Addressee::mimeType(); + } + + const QStringList mimeTypeOffers = md->formats(); + const QMimeDatabase db; + for (const QString &mimeType : mimeTypeOffers) { + const QMimeType mimeTypePtr = db.mimeTypeForName(mimeType); + if (mimeTypePtr.isValid() && mimeTypePtr.inherits(KContacts::Addressee::mimeType())) { + return mimeType; + } + } + + return QString(); +} + +bool VCardDrag::populateMimeData(QMimeData *md, const QByteArray &content) +{ + md->setData(KContacts::Addressee::mimeType(), content); + return true; +} + +bool VCardDrag::populateMimeData(QMimeData *md, const KContacts::Addressee::List &addressees) +{ + KContacts::VCardConverter converter; + const QByteArray vcards = converter.createVCards(addressees); + if (!vcards.isEmpty()) { + return populateMimeData(md, vcards); + } else { + return false; + } +} + +bool VCardDrag::canDecode(const QMimeData *md) +{ + return !findCompatibleMimeType(md).isEmpty(); +} + +bool VCardDrag::fromMimeData(const QMimeData *md, QByteArray &content) +{ + const QString mimeOffer = findCompatibleMimeType(md); + if (mimeOffer.isEmpty()) { + return false; + } + content = md->data(mimeOffer); + return !content.isEmpty(); +} + +bool VCardDrag::fromMimeData(const QMimeData *md, KContacts::Addressee::List &addressees) +{ + const QString mimeOffer = findCompatibleMimeType(md); + if (mimeOffer.isEmpty()) { + return false; + } + addressees = KContacts::VCardConverter().parseVCards(md->data(mimeOffer)); + return !addressees.isEmpty(); +} diff --git a/src/vcarddrag.h b/src/vcarddrag.h new file mode 100644 index 0000000..4b20dbb --- /dev/null +++ b/src/vcarddrag.h @@ -0,0 +1,86 @@ +/* + This file is part of the KContacts framework. + + SPDX-FileCopyrightText: 2002-2010 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_VCARDDRAG_H +#define KCONTACTS_VCARDDRAG_H + +#include "kcontacts_export.h" + +#include <QMimeData> +#include <kcontacts/addressee.h> + +namespace KContacts +{ +/** + @brief Utility function for implementing drag&drop for vCards + + See the Qt drag'n'drop documentation. + + @since 4.5 +*/ +namespace VCardDrag +{ +/** + Adds the vCard representation as data of the drag object. + + @param md the object to set the data on + @param content the vCard data to set + + @return Always @c true +*/ +KCONTACTS_EXPORT bool populateMimeData(QMimeData *md, const QByteArray &content); + +/** + Adds the vCard representation as data of the drag object. + + @param md the object to set the data on + @param contacts list of Addressee objects to serialize to vCard + + @return @c true if serializing of the given list worked, otherwise @c false + + @see VCardConverter::createVCards() +*/ +KCONTACTS_EXPORT bool populateMimeData(QMimeData *md, const KContacts::Addressee::List &contacts); + +/** + Returns if drag&drop object can be decoded to vCard. + + @param md the object to check for vCard data + + @return @c true if the given data object contains a vCard MIME type, otherwise @c false +*/ +KCONTACTS_EXPORT bool canDecode(const QMimeData *md); + +/** + Decodes the drag&drop object to vCard component @p content. + + @param md the object to check for vCard data + @param content where to put the vCard data from @p md + + @return @c true if there was data for the vCard MIME type, otherwise @c false + + @see canDecode() +*/ +KCONTACTS_EXPORT bool fromMimeData(const QMimeData *md, QByteArray &content); + +/** + Decodes the MIME data @p md and puts the resulting vCard into @p contacts. + + @param md the object to check for vCard data + @param contacts where to put the parsed vCards from @p md + + @return @c true if there was data for the vCard MIME type and it could be parsed successfully, + otherwise @c false + + @see canDecode() +*/ +KCONTACTS_EXPORT bool fromMimeData(const QMimeData *md, KContacts::Addressee::List &contacts); +} +} + +#endif // VCARDDRAG_H diff --git a/src/vcardparser/vcard.cpp b/src/vcardparser/vcard.cpp new file mode 100644 index 0000000..101083f --- /dev/null +++ b/src/vcardparser/vcard.cpp @@ -0,0 +1,116 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "vcard_p.h" + +using namespace KContacts; + +VCard::VCard() +{ +} + +VCard::VCard(const VCard &vcard) + : mLineMap(vcard.mLineMap) +{ +} + +VCard::~VCard() +{ +} + +VCard &VCard::operator=(const VCard &vcard) +{ + if (&vcard == this) { + return *this; + } + + mLineMap = vcard.mLineMap; + + return *this; +} + +void VCard::clear() +{ + mLineMap.clear(); +} + +QStringList VCard::identifiers() const +{ + QStringList list; + list.reserve(mLineMap.size()); + for (const auto &[lineId, l] : mLineMap) { + list.append(lineId); + } + return list; +} + +void VCard::addLine(const VCardLine &line) +{ + auto it = findByLineId(line.identifier()); + if (it != mLineMap.end()) { + it->list.append(line); + } else { + const LineData newdata{line.identifier(), {line}}; + auto beforeIt = std::lower_bound(mLineMap.begin(), mLineMap.end(), newdata); + mLineMap.insert(beforeIt, newdata); + } +} + +VCardLine::List VCard::lines(const QString &identifier) const +{ + auto it = findByLineId(identifier); + return it != mLineMap.cend() ? it->list : VCardLine::List{}; +} + +VCardLine VCard::line(const QString &identifier) const +{ + auto it = findByLineId(identifier); + return it != mLineMap.cend() && !it->list.isEmpty() ? it->list.at(0) : VCardLine{}; +} + +static const char s_verStr[] = "VERSION"; + +void VCard::setVersion(Version version) +{ + + VCardLine line; + line.setIdentifier(QLatin1String(s_verStr)); + if (version == v2_1) { + line.setIdentifier(QStringLiteral("2.1")); + } else if (version == v3_0) { + line.setIdentifier(QStringLiteral("3.0")); + } else if (version == v4_0) { + line.setIdentifier(QStringLiteral("4.0")); + } + + auto it = findByLineId(QLatin1String(s_verStr)); + if (it != mLineMap.end()) { + it->list.append(line); + } else { + const LineData newData{QLatin1String(s_verStr), {line}}; + auto beforeIt = std::lower_bound(mLineMap.begin(), mLineMap.end(), newData); + mLineMap.insert(beforeIt, newData); + } +} + +VCard::Version VCard::version() const +{ + auto versionEntryIt = findByLineId(QLatin1String(s_verStr)); + if (versionEntryIt == mLineMap.cend()) { + return v3_0; + } + + const VCardLine line = versionEntryIt->list.at(0); + if (line.value() == QLatin1String("2.1")) { + return v2_1; + } + if (line.value() == QLatin1String("3.0")) { + return v3_0; + } + + return v4_0; +} diff --git a/src/vcardparser/vcard_p.h b/src/vcardparser/vcard_p.h new file mode 100644 index 0000000..0da712b --- /dev/null +++ b/src/vcardparser/vcard_p.h @@ -0,0 +1,106 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef VCARDPARSER_VCARD_H +#define VCARDPARSER_VCARD_H + +#include "vcardline_p.h" +#include <QMap> +#include <QStringList> +#include <QVector> + +#include <vector> + +namespace KContacts +{ +class VCard +{ +public: + typedef QVector<VCard> List; + + struct LineData { + QString identifier; + VCardLine::List list; + }; + using LineMap = std::vector<LineData>; + + inline LineMap::iterator findByLineId(const QString &identifier) + { + return std::find_if(mLineMap.begin(), mLineMap.end(), [&identifier](const LineData &data) { + return data.identifier == identifier; + }); + } + + inline LineMap::const_iterator findByLineId(const QString &identifier) const + { + return std::find_if(mLineMap.cbegin(), mLineMap.cend(), [&identifier](const LineData &data) { + return data.identifier == identifier; + }); + } + + enum Version { + v2_1, + v3_0, + v4_0, + }; + + VCard(); + VCard(const VCard &card); + + ~VCard(); + + VCard &operator=(const VCard &card); + + /** + * Removes all lines from the vCard. + */ + void clear(); + + /** + * Returns a list of all identifiers that exists in the vCard. + */ + Q_REQUIRED_RESULT QStringList identifiers() const; + + /** + * Adds a VCardLine to the VCard + */ + void addLine(const VCardLine &line); + + /** + * Returns all lines of the vcard with a special identifier. + */ + Q_REQUIRED_RESULT VCardLine::List lines(const QString &identifier) const; + + /** + * Returns only the first line of the vcard with a special identifier. + */ + Q_REQUIRED_RESULT VCardLine line(const QString &identifier) const; + + /** + * Set the version of the vCard. + */ + void setVersion(Version version); + + /** + * Returns the version of this vCard. + */ + Q_REQUIRED_RESULT Version version() const; + +private: + /** + * A container of LineData, sorted by identifier. + */ + LineMap mLineMap; +}; + +inline bool operator<(const VCard::LineData &a, const VCard::LineData &b) +{ + return a.identifier < b.identifier; +} +} + +#endif diff --git a/src/vcardparser/vcardline.cpp b/src/vcardparser/vcardline.cpp new file mode 100644 index 0000000..dedf3a1 --- /dev/null +++ b/src/vcardparser/vcardline.cpp @@ -0,0 +1,145 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "vcardline_p.h" + +#include "parametermap_p.h" + +using namespace KContacts; + +VCardLine::VCardLine() +{ +} + +VCardLine::VCardLine(const QString &identifier) + : VCardLine(identifier, {}) +{ +} + +VCardLine::VCardLine(const QString &identifier, const QVariant &value) + : mIdentifier(identifier) + , mValue(value) +{ +} + +VCardLine::VCardLine(const VCardLine &line) + : mParamMap(line.mParamMap) + , mIdentifier(line.mIdentifier) + , mGroup(line.mGroup) + , mValue(line.mValue) +{ +} + +VCardLine::~VCardLine() +{ +} + +VCardLine &VCardLine::operator=(const VCardLine &line) +{ + if (&line == this) { + return *this; + } + + mParamMap = line.mParamMap; + mValue = line.mValue; + mIdentifier = line.mIdentifier; + mGroup = line.mGroup; + + return *this; +} + +bool VCardLine::operator==(const VCardLine &other) const +{ + // clang-format off + return (mParamMap == other.parameterMap()) + && (mValue == other.value()) + && (mIdentifier == other.identifier()) + && (mGroup == other.group()); + // clang-format on +} + +void VCardLine::setIdentifier(const QString &identifier) +{ + mIdentifier = identifier; +} + +QString VCardLine::identifier() const +{ + return mIdentifier; +} + +void VCardLine::setValue(const QVariant &value) +{ + mValue = value; +} + +QVariant VCardLine::value() const +{ + return mValue; +} + +void VCardLine::setGroup(const QString &group) +{ + mGroup = group; +} + +QString VCardLine::group() const +{ + return mGroup; +} + +bool VCardLine::hasGroup() const +{ + return !mGroup.isEmpty(); +} + +QStringList VCardLine::parameterList() const +{ + QStringList list; + list.reserve(mParamMap.size()); + for (const auto &[param, values] : mParamMap) { + list.append(param); + } + + return list; +} + +void VCardLine::addParameters(const ParameterMap ¶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; +} diff --git a/src/vcardparser/vcardline_p.h b/src/vcardparser/vcardline_p.h new file mode 100644 index 0000000..521588c --- /dev/null +++ b/src/vcardparser/vcardline_p.h @@ -0,0 +1,122 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef VCARDLINE_H +#define VCARDLINE_H + +#include <QString> +#include <QStringList> +#include <QVariant> + +#include "kcontacts_export.h" + +#include "../parametermap_p.h" + +namespace KContacts +{ +class KCONTACTS_EXPORT VCardLine +{ +public: + typedef QVector<VCardLine> List; + + VCardLine(); + VCardLine(const QString &identifier); + VCardLine(const QString &identifier, const QVariant &value); + VCardLine(const VCardLine &line); + + ~VCardLine(); + + VCardLine &operator=(const VCardLine &line); + + /** + * Equality operator. + * + */ + Q_REQUIRED_RESULT bool operator==(const VCardLine &other) const; + + /** + * Sets the identifier of this line e.g. UID, FN, CLASS + * + * @param identifier The VCard identifier of this line + */ + void setIdentifier(const QString &identifier); + + /** + * Returns the identifier of this line. + */ + Q_REQUIRED_RESULT QString identifier() const; + + /** + * Sets the value of this line. + */ + void setValue(const QVariant &value); + + /** + * Returns the value of this line. + */ + Q_REQUIRED_RESULT QVariant value() const; + + /** + * Sets the group the line belongs to. + */ + void setGroup(const QString &group); + + /** + * Returns the group the line belongs to. + */ + Q_REQUIRED_RESULT QString group() const; + + /** + * Returns whether the line belongs to a group. + */ + Q_REQUIRED_RESULT bool hasGroup() const; + + /** + * Returns all parameters. + */ + Q_REQUIRED_RESULT QStringList parameterList() const; + + /** + * Add a new parameter to the line. + * + * @param param Name of the parameter to insert + * @param value Value of the parameter to insert + */ + void addParameter(const QString ¶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 diff --git a/src/vcardparser/vcardparser.cpp b/src/vcardparser/vcardparser.cpp new file mode 100644 index 0000000..6994a57 --- /dev/null +++ b/src/vcardparser/vcardparser.cpp @@ -0,0 +1,485 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "kcontacts_debug.h" +#include "vcardparser_p.h" +#include <KCodecs> +#include <QTextCodec> +#include <functional> + +// This cache for QString::fromLatin1() isn't about improving speed, but about reducing memory usage by sharing common strings +class StringCache +{ +public: + QString fromLatin1(const QByteArray &value) + { + if (value.isEmpty()) { + return QString(); + } + + auto it = m_values.constFind(value); + if (it != m_values.constEnd()) { + return it.value(); + } + + QString string = QString::fromLatin1(value); + m_values.insert(value, string); + return string; + } + +private: + QHash<QByteArray, QString> m_values; +}; + +using namespace KContacts; + +static void addEscapes(QByteArray &str, bool excludeEscapedComma) +{ + str.replace('\\', "\\\\"); + if (!excludeEscapedComma) { + str.replace(',', "\\,"); + } + str.replace('\r', "\\r"); + str.replace('\n', "\\n"); +} + +static void removeEscapes(QByteArray &str) +{ + // It's more likely that no escape is present, so add fast path + if (!str.contains('\\')) { + return; + } + str.replace("\\n", "\n"); + str.replace("\\N", "\n"); + str.replace("\\r", "\r"); + str.replace("\\,", ","); + str.replace("\\\\", "\\"); +} + +class VCardLineParser +{ +public: + VCardLineParser(StringCache &cache, std::function<QByteArray()> fetchAnotherLine) + : m_cache(cache) + , m_fetchAnotherLine(fetchAnotherLine) + { + } + + void parseLine(const QByteArray ¤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; +} diff --git a/src/vcardparser/vcardparser_p.h b/src/vcardparser/vcardparser_p.h new file mode 100644 index 0000000..69ff8d2 --- /dev/null +++ b/src/vcardparser/vcardparser_p.h @@ -0,0 +1,32 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef VCARDPARSER_H +#define VCARDPARSER_H + +#include "vcard_p.h" +#include <QByteArray> + +namespace KContacts +{ +class VCardParser +{ +public: + VCardParser(); + ~VCardParser(); + + static VCard::List parseVCards(const QByteArray &text); + static QByteArray createVCards(const VCard::List &list); + +private: + Q_DISABLE_COPY(VCardParser) + class VCardParserPrivate; + VCardParserPrivate *d = nullptr; +}; +} + +#endif diff --git a/src/vcardtool.cpp b/src/vcardtool.cpp new file mode 100644 index 0000000..001a05c --- /dev/null +++ b/src/vcardtool.cpp @@ -0,0 +1,1583 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "fieldgroup.h" +#include "gender.h" +#include "kcontacts_debug.h" +#include "key.h" +#include "lang.h" +#include "picture.h" +#include "related.h" +#include "secrecy.h" +#include "sound.h" +#include "vcardtool_p.h" + +#include <QString> + +using namespace KContacts; + +static bool needsEncoding(const QString &value) +{ + int length = value.length(); + for (int i = 0; i < length; ++i) { + char c = value.at(i).toLatin1(); + if ((c < 33 || c > 126) && c != ' ' && c != '=') { + return true; + } + } + + return false; +} + +struct AddressTypeInfo { + const char *addressType; + Address::TypeFlag flag; +}; + +static const AddressTypeInfo s_addressTypes[] = { + {"dom", Address::Dom}, + {"home", Address::Home}, + {"intl", Address::Intl}, + {"parcel", Address::Parcel}, + {"postal", Address::Postal}, + {"pref", Address::Pref}, + {"work", Address::Work}, +}; + +static Address::TypeFlag stringToAddressType(const QString &str) +{ + auto it = std::find_if(std::begin(s_addressTypes), std::end(s_addressTypes), [&str](const AddressTypeInfo &info) { + return str == QLatin1String(info.addressType); + }); + return it != std::end(s_addressTypes) ? it->flag : Address::TypeFlag{}; +} + +struct PhoneTypeInfo { + const char *phoneType; + PhoneNumber::TypeFlag flag; +}; + +static const PhoneTypeInfo s_phoneTypes[] = { + {"BBS", PhoneNumber::Bbs}, + {"CAR", PhoneNumber::Car}, + {"CELL", PhoneNumber::Cell}, + {"FAX", PhoneNumber::Fax}, + {"HOME", PhoneNumber::Home}, + {"ISDN", PhoneNumber::Isdn}, + {"MODEM", PhoneNumber::Modem}, + {"MSG", PhoneNumber::Msg}, + {"PAGER", PhoneNumber::Pager}, + {"PCS", PhoneNumber::Pcs}, + {"PREF", PhoneNumber::Pref}, + {"VIDEO", PhoneNumber::Video}, + {"VOICE", PhoneNumber::Voice}, + {"WORK", PhoneNumber::Work}, +}; + +static PhoneNumber::TypeFlag stringToPhoneType(const QString &str) +{ + auto it = std::find_if(std::begin(s_phoneTypes), std::end(s_phoneTypes), [&str](const PhoneTypeInfo &info) { + return str == QLatin1String(info.phoneType); + }); + return it != std::end(s_phoneTypes) ? it->flag : PhoneNumber::TypeFlag{}; +} + +VCardTool::VCardTool() +{ +} + +VCardTool::~VCardTool() +{ +} + +QByteArray VCardTool::exportVCards(const Addressee::List &list, VCard::Version version) const +{ + return createVCards(list, version, true /*export vcard*/); +} + +QByteArray VCardTool::createVCards(const Addressee::List &list, VCard::Version version) const +{ + return createVCards(list, version, false /*don't export*/); +} + +void VCardTool::addParameter(VCardLine *line, VCard::Version version, const QString &key, const QStringList &valueStringList) const +{ + if (version == VCard::v2_1) { + for (const QString &valueStr : valueStringList) { + line->addParameter(valueStr, QString()); + } + } else if (version == VCard::v3_0) { + line->addParameter(key, valueStringList.join(QLatin1Char(','))); + } else { + if (valueStringList.count() < 2) { + line->addParameter(key, valueStringList.join(QLatin1Char(','))); + } else { + line->addParameter(key, QLatin1Char('"') + valueStringList.join(QLatin1Char(',')) + QLatin1Char('"')); + } + } +} + +void VCardTool::processAddresses(const Address::List &addresses, VCard::Version version, VCard *card) const +{ + for (const auto &addr : addresses) { + QStringList address; + + // clang-format off + const bool isEmpty = addr.postOfficeBox().isEmpty() + && addr.extended().isEmpty() + && addr.street().isEmpty() + && addr.locality().isEmpty() + && addr.region().isEmpty() + && addr.postalCode().isEmpty() + && addr.country().isEmpty(); + // clang-format on + + address.append(addr.postOfficeBox().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + address.append(addr.extended().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + address.append(addr.street().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + address.append(addr.locality().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + address.append(addr.region().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + address.append(addr.postalCode().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + address.append(addr.country().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + + const QString addressJoined(address.join(QLatin1Char(';'))); + VCardLine adrLine(QStringLiteral("ADR"), addressJoined); + if (version == VCard::v2_1 && needsEncoding(addressJoined)) { + adrLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + adrLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + + const bool hasLabel = !addr.label().isEmpty(); + QStringList addreLineType; + QStringList labelLineType; + + for (const auto &info : s_addressTypes) { + if (info.flag & addr.type()) { + const QString str = QString::fromLatin1(info.addressType); + addreLineType << str; + if (hasLabel) { + labelLineType << str; + } + } + } + + if (hasLabel) { + if (version == VCard::v4_0) { + if (!addr.label().isEmpty()) { + adrLine.addParameter(QStringLiteral("LABEL"), QStringLiteral("\"%1\"").arg(addr.label())); + } + } else { + VCardLine labelLine(QStringLiteral("LABEL"), addr.label()); + if (version == VCard::v2_1 && needsEncoding(addr.label())) { + labelLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + labelLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + addParameter(&labelLine, version, QStringLiteral("TYPE"), labelLineType); + card->addLine(labelLine); + } + } + if (version == VCard::v4_0) { + Geo geo = addr.geo(); + if (geo.isValid()) { + QString str = QString::asprintf("\"geo:%.6f,%.6f\"", geo.latitude(), geo.longitude()); + adrLine.addParameter(QStringLiteral("GEO"), str); + } + } + if (!isEmpty) { + addParameter(&adrLine, version, QStringLiteral("TYPE"), addreLineType); + card->addLine(adrLine); + } + } +} + +void VCardTool::processEmailList(const Email::List &emailList, VCard::Version version, VCard *card) const +{ + for (const auto &email : emailList) { + VCardLine line(QStringLiteral("EMAIL"), email.mail()); + const ParameterMap pMap = email.params(); + for (const auto &[param, l] : pMap) { + QStringList list = l; + if (version == VCard::v2_1) { + if (param.toLower() == QLatin1String("type")) { + bool hasPreferred = false; + const int removeItems = list.removeAll(QStringLiteral("PREF")); + if (removeItems > 0) { + hasPreferred = true; + } + if (!list.isEmpty()) { + addParameter(&line, version, param, list); + } + if (hasPreferred) { + line.addParameter(QStringLiteral("PREF"), QString()); + } + } else { + line.addParameter(param, list.join(QLatin1Char(','))); + } + } else { + line.addParameter(param, list.join(QLatin1Char(','))); + } + } + card->addLine(line); + } +} + +void VCardTool::processOrganizations(const Addressee &addressee, VCard::Version version, VCard *card) const +{ + const QVector<Org> lstOrg = addressee.extraOrganizationList(); + for (const Org &org : lstOrg) { + QStringList organization{org.organization().replace(QLatin1Char(';'), QLatin1String("\\;"))}; + if (!addressee.department().isEmpty()) { + organization.append(addressee.department().replace(QLatin1Char(';'), QLatin1String("\\;"))); + } + const QString orgStr = organization.join(QLatin1Char(';')); + VCardLine orgLine(QStringLiteral("ORG"), orgStr); + if (version == VCard::v2_1 && needsEncoding(orgStr)) { + orgLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + orgLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + orgLine.addParameters(org.params()); + card->addLine(orgLine); + } +} + +void VCardTool::processPhoneNumbers(const PhoneNumber::List &phoneNumbers, VCard::Version version, VCard *card) const +{ + for (const auto &phone : phoneNumbers) { + VCardLine line(QStringLiteral("TEL"), phone.number()); + const ParameterMap paramsMap = phone.params(); + for (const auto &[param, list] : paramsMap) { + if (param.toUpper() != QLatin1String("TYPE")) { + line.addParameter(param, list.join(QLatin1Char(','))); + } + } + + const PhoneNumber::Type type = phone.type(); + QStringList lst; + for (const auto &pType : s_phoneTypes) { + if (pType.flag & type) { + const QString str = QString::fromLatin1(pType.phoneType); + if (version == VCard::v4_0) { + lst << str.toLower(); + } else { + lst << str; + } + } + } + if (!lst.isEmpty()) { + addParameter(&line, version, QStringLiteral("TYPE"), lst); + } + card->addLine(line); + } +} + +void VCardTool::processCustoms(const QStringList &customs, VCard::Version version, VCard *card, bool exportVcard) const +{ + for (const auto &str : customs) { + QString identifier = QLatin1String("X-") + QStringView(str).left(str.indexOf(QLatin1Char(':'))); + const QString value = str.mid(str.indexOf(QLatin1Char(':')) + 1); + if (value.isEmpty()) { + continue; + } + // Convert to standard identifier + if (exportVcard) { + if (identifier == QLatin1String("X-messaging/aim-All")) { + identifier = QStringLiteral("X-AIM"); + } else if (identifier == QLatin1String("X-messaging/icq-All")) { + identifier = QStringLiteral("X-ICQ"); + } else if (identifier == QLatin1String("X-messaging/xmpp-All")) { + identifier = QStringLiteral("X-JABBER"); + } else if (identifier == QLatin1String("X-messaging/msn-All")) { + identifier = QStringLiteral("X-MSN"); + } else if (identifier == QLatin1String("X-messaging/yahoo-All")) { + identifier = QStringLiteral("X-YAHOO"); + } else if (identifier == QLatin1String("X-messaging/gadu-All")) { + identifier = QStringLiteral("X-GADUGADU"); + } else if (identifier == QLatin1String("X-messaging/skype-All")) { + identifier = QStringLiteral("X-SKYPE"); + } else if (identifier == QLatin1String("X-messaging/groupwise-All")) { + identifier = QStringLiteral("X-GROUPWISE"); + } else if (identifier == QLatin1String("X-messaging/sms-All")) { + identifier = QStringLiteral("X-SMS"); + } else if (identifier == QLatin1String("X-messaging/meanwhile-All")) { + identifier = QStringLiteral("X-MEANWHILE"); + } else if (identifier == QLatin1String("X-messaging/irc-All")) { + identifier = QStringLiteral("X-IRC"); // Not defined by rfc but need for fixing #300869 + } else if (identifier == QLatin1String("X-messaging/googletalk-All")) { + // Not defined by rfc but need for fixing #300869 + identifier = QStringLiteral("X-GTALK"); + } else if (identifier == QLatin1String("X-messaging/twitter-All")) { + identifier = QStringLiteral("X-TWITTER"); + } + } + + if (identifier.toLower() == QLatin1String("x-kaddressbook-x-anniversary") && version == VCard::v4_0) { + // ANNIVERSARY + if (!value.isEmpty()) { + const QDate date = QDate::fromString(value, Qt::ISODate); + QDateTime dt = QDateTime(date.startOfDay()); + dt.setTime(QTime()); + VCardLine line(QStringLiteral("ANNIVERSARY"), createDateTime(dt, version, false)); + card->addLine(line); + } + } else if (identifier.toLower() == QLatin1String("x-kaddressbook-x-spousesname") && version == VCard::v4_0) { + if (!value.isEmpty()) { + VCardLine line(QStringLiteral("RELATED"), QStringLiteral(";")); + line.addParameter(QStringLiteral("TYPE"), QStringLiteral("spouse")); + line.addParameter(QStringLiteral("VALUE"), value); + card->addLine(line); + } + } else { + VCardLine line(identifier, value); + if (version == VCard::v2_1 && needsEncoding(value)) { + line.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + line.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + card->addLine(line); + } + } +} + +QByteArray VCardTool::createVCards(const Addressee::List &list, VCard::Version version, bool exportVcard) const +{ + VCard::List vCardList; + + for (const auto &addressee : list) { + VCard card; + // VERSION + if (version == VCard::v2_1) { + card.addLine(VCardLine(QStringLiteral("VERSION"), QStringLiteral("2.1"))); + } else if (version == VCard::v3_0) { + card.addLine(VCardLine(QStringLiteral("VERSION"), QStringLiteral("3.0"))); + } else if (version == VCard::v4_0) { + card.addLine(VCardLine(QStringLiteral("VERSION"), QStringLiteral("4.0"))); + } + + // ADR + LABEL + const Address::List addresses = addressee.addresses(); + processAddresses(addresses, version, &card); + + // BDAY + const bool withTime = addressee.birthdayHasTime(); + const QString birthdayString = createDateTime(addressee.birthday(), version, withTime); + card.addLine(VCardLine(QStringLiteral("BDAY"), birthdayString)); + + // CATEGORIES only > 2.1 + if (version != VCard::v2_1) { + QStringList categories = addressee.categories(); + for (auto &cat : categories) { + cat.replace(QLatin1Char(','), QLatin1String("\\,")); + } + + VCardLine catLine(QStringLiteral("CATEGORIES"), categories.join(QLatin1Char(','))); + card.addLine(catLine); + } + // MEMBER (only in 4.0) + if (version == VCard::v4_0) { + // The KIND property must be set to "group" in order to use this property. + if (addressee.kind().toLower() == QLatin1String("group")) { + const QStringList lst = addressee.members(); + for (const QString &member : lst) { + card.addLine(VCardLine(QStringLiteral("MEMBER"), member)); + } + } + } + // SOURCE + const QVector<QUrl> lstUrl = addressee.sourcesUrlList(); + for (const QUrl &url : lstUrl) { + VCardLine line = VCardLine(QStringLiteral("SOURCE"), url.url()); + card.addLine(line); + } + + const Related::List relatedList = addressee.relationships(); + for (const auto &rel : relatedList) { + VCardLine line(QStringLiteral("RELATED"), rel.related()); + line.addParameters(rel.params()); + card.addLine(line); + } + // CLASS only for version == 3.0 + if (version == VCard::v3_0) { + card.addLine(createSecrecy(addressee.secrecy())); + } + // LANG only for version == 4.0 + if (version == VCard::v4_0) { + const Lang::List langList = addressee.langs(); + for (const auto &lang : langList) { + VCardLine line(QStringLiteral("LANG"), lang.language()); + line.addParameters(lang.params()); + card.addLine(line); + } + } + // CLIENTPIDMAP + if (version == VCard::v4_0) { + const ClientPidMap::List clientpidmapList = addressee.clientPidMapList(); + for (const auto &pMap : clientpidmapList) { + VCardLine line(QStringLiteral("CLIENTPIDMAP"), pMap.clientPidMap()); + line.addParameters(pMap.params()); + card.addLine(line); + } + } + // EMAIL + const Email::List emailList = addressee.emailList(); + processEmailList(emailList, version, &card); + + // FN required for only version > 2.1 + VCardLine fnLine(QStringLiteral("FN"), addressee.formattedName()); + if (version == VCard::v2_1 && needsEncoding(addressee.formattedName())) { + fnLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + fnLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + card.addLine(fnLine); + + // GEO + const Geo geo = addressee.geo(); + if (geo.isValid()) { + QString str; + if (version == VCard::v4_0) { + str = QString::asprintf("geo:%.6f,%.6f", geo.latitude(), geo.longitude()); + } else { + str = QString::asprintf("%.6f;%.6f", geo.latitude(), geo.longitude()); + } + card.addLine(VCardLine(QStringLiteral("GEO"), str)); + } + + // KEY + const Key::List keys = addressee.keys(); + for (const auto &k : keys) { + card.addLine(createKey(k, version)); + } + + // LOGO + card.addLine(createPicture(QStringLiteral("LOGO"), addressee.logo(), version)); + const QVector<Picture> lstLogo = addressee.extraLogoList(); + for (const Picture &logo : lstLogo) { + card.addLine(createPicture(QStringLiteral("LOGO"), logo, version)); + } + + // MAILER only for version < 4.0 + if (version != VCard::v4_0) { + VCardLine mailerLine(QStringLiteral("MAILER"), addressee.mailer()); + if (version == VCard::v2_1 && needsEncoding(addressee.mailer())) { + mailerLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + mailerLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + card.addLine(mailerLine); + } + + // N required for only version < 4.0 + QStringList name; + name.append(addressee.familyName().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + name.append(addressee.givenName().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + name.append(addressee.additionalName().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + name.append(addressee.prefix().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + name.append(addressee.suffix().replace(QLatin1Char(';'), QStringLiteral("\\;"))); + + VCardLine nLine(QStringLiteral("N"), name.join(QLatin1Char(';'))); + if (version == VCard::v2_1 && needsEncoding(name.join(QLatin1Char(';')))) { + nLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + nLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + if (version == VCard::v4_0 && !addressee.sortString().isEmpty()) { + nLine.addParameter(QStringLiteral("SORT-AS"), addressee.sortString()); + } + + card.addLine(nLine); + + // NAME only for version < 4.0 + if (version != VCard::v4_0) { + VCardLine nameLine(QStringLiteral("NAME"), addressee.name()); + if (version == VCard::v2_1 && needsEncoding(addressee.name())) { + nameLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + nameLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + card.addLine(nameLine); + } + + // NICKNAME only for version > 2.1 + if (version != VCard::v2_1) { + const QVector<NickName> lstNickName = addressee.extraNickNameList(); + for (const NickName &nickName : lstNickName) { + VCardLine nickNameLine(QStringLiteral("NICKNAME"), nickName.nickname()); + nickNameLine.addParameters(nickName.params()); + + card.addLine(nickNameLine); + } + } + + // NOTE + VCardLine noteLine(QStringLiteral("NOTE"), addressee.note()); + if (version == VCard::v2_1 && needsEncoding(addressee.note())) { + noteLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + noteLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + card.addLine(noteLine); + + // ORG + processOrganizations(addressee, version, &card); + + // PHOTO + card.addLine(createPicture(QStringLiteral("PHOTO"), addressee.photo(), version)); + const QVector<Picture> lstExtraPhoto = addressee.extraPhotoList(); + for (const Picture &photo : lstExtraPhoto) { + card.addLine(createPicture(QStringLiteral("PHOTO"), photo, version)); + } + + // PROID only for version > 2.1 + if (version != VCard::v2_1) { + card.addLine(VCardLine(QStringLiteral("PRODID"), addressee.productId())); + } + + // REV + card.addLine(VCardLine(QStringLiteral("REV"), createDateTime(addressee.revision(), version))); + + // ROLE + const QVector<Role> lstExtraRole = addressee.extraRoleList(); + for (const Role &role : lstExtraRole) { + VCardLine roleLine(QStringLiteral("ROLE"), role.role()); + if (version == VCard::v2_1 && needsEncoding(role.role())) { + roleLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + roleLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + roleLine.addParameters(role.params()); + card.addLine(roleLine); + } + + // SORT-STRING + if (version == VCard::v3_0) { + card.addLine(VCardLine(QStringLiteral("SORT-STRING"), addressee.sortString())); + } + + // SOUND + card.addLine(createSound(addressee.sound(), version)); + const QVector<Sound> lstSound = addressee.extraSoundList(); + for (const Sound &sound : lstSound) { + card.addLine(createSound(sound, version)); + } + + // TEL + const PhoneNumber::List phoneNumbers = addressee.phoneNumbers(); + processPhoneNumbers(phoneNumbers, version, &card); + + // TITLE + const QVector<Title> lstTitle = addressee.extraTitleList(); + for (const Title &title : lstTitle) { + VCardLine titleLine(QStringLiteral("TITLE"), title.title()); + if (version == VCard::v2_1 && needsEncoding(title.title())) { + titleLine.addParameter(QStringLiteral("charset"), QStringLiteral("UTF-8")); + titleLine.addParameter(QStringLiteral("encoding"), QStringLiteral("QUOTED-PRINTABLE")); + } + titleLine.addParameters(title.params()); + + card.addLine(titleLine); + } + + // TZ + // TODO Add vcard4.0 support + const TimeZone timeZone = addressee.timeZone(); + if (timeZone.isValid()) { + int neg = 1; + if (timeZone.offset() < 0) { + neg = -1; + } + + QString str = + QString::asprintf("%c%02d:%02d", (timeZone.offset() >= 0 ? '+' : '-'), (timeZone.offset() / 60) * neg, (timeZone.offset() % 60) * neg); + + card.addLine(VCardLine(QStringLiteral("TZ"), str)); + } + + // UID + card.addLine(VCardLine(QStringLiteral("UID"), addressee.uid())); + + // URL + const QVector<ResourceLocatorUrl> lstExtraUrl = addressee.extraUrlList(); + for (const ResourceLocatorUrl &url : lstExtraUrl) { + VCardLine line(QStringLiteral("URL"), url.url()); + line.addParameters(url.params()); + card.addLine(line); + } + if (version == VCard::v4_0) { + // GENDER + const Gender gender = addressee.gender(); + if (gender.isValid()) { + QString genderStr; + if (!gender.gender().isEmpty()) { + genderStr = gender.gender(); + } + if (!gender.comment().isEmpty()) { + genderStr += QLatin1Char(';') + gender.comment(); + } + VCardLine line(QStringLiteral("GENDER"), genderStr); + card.addLine(line); + } + // KIND + if (!addressee.kind().isEmpty()) { + VCardLine line(QStringLiteral("KIND"), addressee.kind()); + card.addLine(line); + } + } + // From vcard4. + if (version == VCard::v4_0) { + const QVector<CalendarUrl> lstCalendarUrl = addressee.calendarUrlList(); + for (const CalendarUrl &url : lstCalendarUrl) { + if (url.isValid()) { + QString type; + switch (url.type()) { + case CalendarUrl::Unknown: + case CalendarUrl::EndCalendarType: + break; + case CalendarUrl::FBUrl: + type = QStringLiteral("FBURL"); + break; + case CalendarUrl::CALUri: + type = QStringLiteral("CALURI"); + break; + case CalendarUrl::CALADRUri: + type = QStringLiteral("CALADRURI"); + break; + } + if (!type.isEmpty()) { + VCardLine line(type, url.url().toDisplayString()); + line.addParameters(url.params()); + card.addLine(line); + } + } + } + } + + // FieldGroup + const QVector<FieldGroup> lstGroup = addressee.fieldGroupList(); + for (const FieldGroup &group : lstGroup) { + VCardLine line(group.fieldGroupName(), group.value()); + line.addParameters(group.params()); + card.addLine(line); + } + + // IMPP (supported in vcard 3 too) + const QVector<Impp> lstImpp = addressee.imppList(); + for (const Impp &impp : lstImpp) { + VCardLine line(QStringLiteral("IMPP"), impp.address().url()); + const ParameterMap pMap = impp.params(); + for (const auto &[param, list] : pMap) { + if (param.toLower() != QLatin1String("x-service-type")) { + line.addParameter(param, list.join(QLatin1Char(','))); + } + } + card.addLine(line); + } + + // X- + const QStringList customs = addressee.customs(); + processCustoms(customs, version, &card, exportVcard); + + vCardList.append(card); + } + + return VCardParser::createVCards(vCardList); +} + +Addressee::List VCardTool::parseVCards(const QByteArray &vcard) const +{ + static const QLatin1Char semicolonSep(';'); + static const QLatin1Char commaSep(','); + QString identifier; + QString group; + Addressee::List addrList; + const VCard::List vCardList = VCardParser::parseVCards(vcard); + + VCard::List::ConstIterator cardIt; + VCard::List::ConstIterator listEnd(vCardList.end()); + for (cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt) { + Addressee addr; + + const QStringList idents = (*cardIt).identifiers(); + QStringList::ConstIterator identIt; + QStringList::ConstIterator identEnd(idents.end()); + for (identIt = idents.begin(); identIt != identEnd; ++identIt) { + const VCardLine::List lines = (*cardIt).lines((*identIt)); + VCardLine::List::ConstIterator lineIt; + + // iterate over the lines + for (lineIt = lines.begin(); lineIt != lines.end(); ++lineIt) { + identifier = (*lineIt).identifier().toLower(); + group = (*lineIt).group(); + if (!group.isEmpty() && identifier != QLatin1String("adr")) { + KContacts::FieldGroup groupField(group + QLatin1Char('.') + (*lineIt).identifier()); + groupField.setParams((*lineIt).parameterMap()); + groupField.setValue((*lineIt).value().toString()); + addr.insertFieldGroup(groupField); + } + // ADR + else if (identifier == QLatin1String("adr")) { + Address address; + const QStringList addrParts = splitString(semicolonSep, (*lineIt).value().toString()); + const int addrPartsCount(addrParts.count()); + if (addrPartsCount > 0) { + address.setPostOfficeBox(addrParts.at(0)); + } + if (addrPartsCount > 1) { + address.setExtended(addrParts.at(1)); + } + if (addrPartsCount > 2) { + address.setStreet(addrParts.at(2)); + } + if (addrPartsCount > 3) { + address.setLocality(addrParts.at(3)); + } + if (addrPartsCount > 4) { + address.setRegion(addrParts.at(4)); + } + if (addrPartsCount > 5) { + address.setPostalCode(addrParts.at(5)); + } + if (addrPartsCount > 6) { + address.setCountry(addrParts.at(6)); + } + + Address::Type type; + + const QStringList types = (*lineIt).parameters(QStringLiteral("type")); + QStringList::ConstIterator end(types.end()); + for (QStringList::ConstIterator it = types.begin(); it != end; ++it) { + type |= stringToAddressType((*it).toLower()); + } + + address.setType(type); + QString label = (*lineIt).parameter(QStringLiteral("label")); + if (!label.isEmpty()) { + if (label.length() > 1) { + if (label.at(0) == QLatin1Char('"') && label.at(label.length() - 1) == QLatin1Char('"')) { + label = label.mid(1, label.length() - 2); + } + } + address.setLabel(label); + } + QString geoStr = (*lineIt).parameter(QStringLiteral("geo")); + if (!geoStr.isEmpty()) { + geoStr.remove(QLatin1Char('\"')); + geoStr.remove(QStringLiteral("geo:")); + if (geoStr.contains(QLatin1Char(','))) { + QStringList arguments = geoStr.split(QLatin1Char(',')); + KContacts::Geo geo; + geo.setLatitude(arguments.at(0).toDouble()); + geo.setLongitude(arguments.at(1).toDouble()); + address.setGeo(geo); + } + } + addr.insertAddress(address); + } + // ANNIVERSARY + else if (identifier == QLatin1String("anniversary")) { + const QString t = (*lineIt).value().toString(); + const QDateTime dt(parseDateTime(t)); + addr.insertCustom(QStringLiteral("KADDRESSBOOK"), QStringLiteral("X-Anniversary"), dt.date().toString(Qt::ISODate)); + } + // BDAY + else if (identifier == QLatin1String("bday")) { + bool withTime; + const QDateTime bday = parseDateTime((*lineIt).value().toString(), &withTime); + addr.setBirthday(bday, withTime); + } + // CATEGORIES + else if (identifier == QLatin1String("categories")) { + const QStringList categories = splitString(commaSep, (*lineIt).value().toString()); + addr.setCategories(categories); + } + // FBURL + else if (identifier == QLatin1String("fburl")) { + CalendarUrl calurl; + calurl.setType(CalendarUrl::FBUrl); + const QUrl url = QUrl((*lineIt).value().toString()); + calurl.setUrl(url); + calurl.setParams((*lineIt).parameterMap()); + addr.insertCalendarUrl(calurl); + } + // CALADRURI + else if (identifier == QLatin1String("caladruri")) { + CalendarUrl calurl; + calurl.setType(CalendarUrl::CALADRUri); + const QUrl url = QUrl((*lineIt).value().toString()); + calurl.setUrl(url); + calurl.setParams((*lineIt).parameterMap()); + addr.insertCalendarUrl(calurl); + } + // CALURI + else if (identifier == QLatin1String("caluri")) { + CalendarUrl calurl; + calurl.setType(CalendarUrl::CALUri); + const QUrl url = QUrl((*lineIt).value().toString()); + calurl.setUrl(url); + calurl.setParams((*lineIt).parameterMap()); + addr.insertCalendarUrl(calurl); + } + // IMPP + else if (identifier == QLatin1String("impp")) { + QUrl imppUrl((*lineIt).value().toString()); + Impp impp; + impp.setParams((*lineIt).parameterMap()); + if (!(*lineIt).parameter(QStringLiteral("x-service-type")).isEmpty() && imppUrl.scheme().isEmpty()) { + imppUrl.setScheme(normalizeImppServiceType((*lineIt).parameter(QStringLiteral("x-service-type")).toLower())); + } + impp.setAddress(imppUrl); + addr.insertImpp(impp); + } + // CLASS + else if (identifier == QLatin1String("class")) { + addr.setSecrecy(parseSecrecy(*lineIt)); + } + // GENDER + else if (identifier == QLatin1String("gender")) { + QString genderStr = (*lineIt).value().toString(); + if (!genderStr.isEmpty()) { + Gender gender; + if (genderStr.at(0) != QLatin1Char(';')) { + gender.setGender(genderStr.at(0)); + if (genderStr.length() > 2 && (genderStr.at(1) == QLatin1Char(';'))) { + gender.setComment(genderStr.right(genderStr.length() - 2)); + } + } else { + gender.setComment(genderStr.right(genderStr.length() - 1)); + } + addr.setGender(gender); + } + } + // LANG + else if (identifier == QLatin1String("lang")) { + Lang lang; + lang.setLanguage((*lineIt).value().toString()); + lang.setParams((*lineIt).parameterMap()); + addr.insertLang(lang); + } + // EMAIL + else if (identifier == QLatin1String("email")) { + const QStringList types = (*lineIt).parameters(QStringLiteral("type")); + Email mail((*lineIt).value().toString()); + mail.setParams((*lineIt).parameterMap()); + addr.addEmail(mail); + } + // KIND + else if (identifier == QLatin1String("kind")) { + addr.setKind((*lineIt).value().toString()); + } + // FN + else if (identifier == QLatin1String("fn")) { + addr.setFormattedName((*lineIt).value().toString()); + } + // GEO + else if (identifier == QLatin1String("geo")) { + Geo geo; + QString lineStr = (*lineIt).value().toString(); + if (lineStr.startsWith(QLatin1String("geo:"))) { // VCard 4.0 + lineStr.remove(QStringLiteral("geo:")); + const QStringList geoParts = lineStr.split(QLatin1Char(','), Qt::KeepEmptyParts); + if (geoParts.size() >= 2) { + geo.setLatitude(geoParts.at(0).toFloat()); + geo.setLongitude(geoParts.at(1).toFloat()); + addr.setGeo(geo); + } + } else { + const QStringList geoParts = lineStr.split(QLatin1Char(';'), Qt::KeepEmptyParts); + if (geoParts.size() >= 2) { + geo.setLatitude(geoParts.at(0).toFloat()); + geo.setLongitude(geoParts.at(1).toFloat()); + addr.setGeo(geo); + } + } + } + // KEY + else if (identifier == QLatin1String("key")) { + addr.insertKey(parseKey(*lineIt)); + } + // LABEL + else if (identifier == QLatin1String("label")) { + Address::Type type; + + const QStringList types = (*lineIt).parameters(QStringLiteral("type")); + QStringList::ConstIterator end(types.end()); + for (QStringList::ConstIterator it = types.begin(); it != end; ++it) { + type |= stringToAddressType((*it).toLower()); + } + + bool available = false; + KContacts::Address::List addressList = addr.addresses(); + for (KContacts::Address::List::Iterator it = addressList.begin(); it != addressList.end(); ++it) { + if ((*it).type() == type) { + (*it).setLabel((*lineIt).value().toString()); + addr.insertAddress(*it); + available = true; + break; + } + } + + if (!available) { // a standalone LABEL tag + KContacts::Address address(type); + address.setLabel((*lineIt).value().toString()); + addr.insertAddress(address); + } + } + // LOGO + else if (identifier == QLatin1String("logo")) { + Picture picture = parsePicture(*lineIt); + if (addr.logo().isEmpty()) { + addr.setLogo(picture); + } else { + addr.insertExtraLogo(picture); + } + } + // MAILER + else if (identifier == QLatin1String("mailer")) { + addr.setMailer((*lineIt).value().toString()); + } + // N + else if (identifier == QLatin1Char('n')) { + const QStringList nameParts = splitString(semicolonSep, (*lineIt).value().toString()); + const int numberOfParts(nameParts.count()); + if (numberOfParts > 0) { + addr.setFamilyName(nameParts.at(0)); + } + if (numberOfParts > 1) { + addr.setGivenName(nameParts.at(1)); + } + if (numberOfParts > 2) { + addr.setAdditionalName(nameParts.at(2)); + } + if (numberOfParts > 3) { + addr.setPrefix(nameParts.at(3)); + } + if (numberOfParts > 4) { + addr.setSuffix(nameParts.at(4)); + } + if (!(*lineIt).parameter(QStringLiteral("sort-as")).isEmpty()) { + addr.setSortString((*lineIt).parameter(QStringLiteral("sort-as"))); + } + } + // NAME + else if (identifier == QLatin1String("name")) { + addr.setName((*lineIt).value().toString()); + } + // NICKNAME + else if (identifier == QLatin1String("nickname")) { + NickName nickName((*lineIt).value().toString()); + nickName.setParams((*lineIt).parameterMap()); + addr.insertExtraNickName(nickName); + } + // NOTE + else if (identifier == QLatin1String("note")) { + addr.setNote((*lineIt).value().toString()); + } + // ORGANIZATION + else if (identifier == QLatin1String("org")) { + const QStringList orgParts = splitString(semicolonSep, (*lineIt).value().toString()); + const int orgPartsCount(orgParts.count()); + if (orgPartsCount > 0) { + Org organization(orgParts.at(0)); + organization.setParams((*lineIt).parameterMap()); + addr.insertExtraOrganization(organization); + } + if (orgPartsCount > 1) { + addr.setDepartment(orgParts.at(1)); + } + if (!(*lineIt).parameter(QStringLiteral("sort-as")).isEmpty()) { + addr.setSortString((*lineIt).parameter(QStringLiteral("sort-as"))); + } + } + // PHOTO + else if (identifier == QLatin1String("photo")) { + Picture picture = parsePicture(*lineIt); + if (addr.photo().isEmpty()) { + addr.setPhoto(picture); + } else { + addr.insertExtraPhoto(picture); + } + } + // PROID + else if (identifier == QLatin1String("prodid")) { + addr.setProductId((*lineIt).value().toString()); + } + // REV + else if (identifier == QLatin1String("rev")) { + addr.setRevision(parseDateTime((*lineIt).value().toString())); + } + // ROLE + else if (identifier == QLatin1String("role")) { + Role role((*lineIt).value().toString()); + role.setParams((*lineIt).parameterMap()); + addr.insertExtraRole(role); + } + // SORT-STRING + else if (identifier == QLatin1String("sort-string")) { + addr.setSortString((*lineIt).value().toString()); + } + // SOUND + else if (identifier == QLatin1String("sound")) { + Sound sound = parseSound(*lineIt); + if (addr.sound().isEmpty()) { + addr.setSound(sound); + } else { + addr.insertExtraSound(sound); + } + } + // TEL + else if (identifier == QLatin1String("tel")) { + PhoneNumber phone; + phone.setNumber((*lineIt).value().toString()); + + PhoneNumber::Type type; + bool foundType = false; + const QStringList types = (*lineIt).parameters(QStringLiteral("type")); + QStringList::ConstIterator typeEnd(types.constEnd()); + for (QStringList::ConstIterator it = types.constBegin(); it != typeEnd; ++it) { + type |= stringToPhoneType((*it).toUpper()); + foundType = true; + } + phone.setType(foundType ? type : PhoneNumber::Undefined); + phone.setParams((*lineIt).parameterMap()); + + addr.insertPhoneNumber(phone); + } + // TITLE + else if (identifier == QLatin1String("title")) { + Title title((*lineIt).value().toString()); + title.setParams((*lineIt).parameterMap()); + addr.insertExtraTitle(title); + } + // TZ + else if (identifier == QLatin1String("tz")) { + // TODO add vcard4 support + TimeZone tz; + const QString date = (*lineIt).value().toString(); + + if (!date.isEmpty()) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const QStringView dateView(date); + int hours = dateView.mid(1, 2).toInt(); + int minutes = dateView.mid(4, 2).toInt(); +#else + int hours = date.midRef(1, 2).toInt(); + int minutes = date.midRef(4, 2).toInt(); +#endif + int offset = (hours * 60) + minutes; + offset = offset * (date[0] == QLatin1Char('+') ? 1 : -1); + + tz.setOffset(offset); + addr.setTimeZone(tz); + } + } + // UID + else if (identifier == QLatin1String("uid")) { + addr.setUid((*lineIt).value().toString()); + } + // URL + else if (identifier == QLatin1String("url")) { + const QUrl url = QUrl((*lineIt).value().toString()); + ResourceLocatorUrl resourceLocatorUrl; + resourceLocatorUrl.setUrl(url); + resourceLocatorUrl.setParams((*lineIt).parameterMap()); + addr.insertExtraUrl(resourceLocatorUrl); + } + // SOURCE + else if (identifier == QLatin1String("source")) { + const QUrl url = QUrl((*lineIt).value().toString()); + addr.insertSourceUrl(url); + } + // MEMBER (vcard 4.0) + else if (identifier == QLatin1String("member")) { + addr.insertMember((*lineIt).value().toString()); + } + // RELATED (vcard 4.0) + else if (identifier == QLatin1String("related")) { + Related related; + related.setRelated((*lineIt).value().toString()); + related.setParams((*lineIt).parameterMap()); + addr.insertRelationship(related); + } + // CLIENTPIDMAP (vcard 4.0) + else if (identifier == QLatin1String("clientpidmap")) { + ClientPidMap clientpidmap; + clientpidmap.setClientPidMap((*lineIt).value().toString()); + clientpidmap.setParams((*lineIt).parameterMap()); + addr.insertClientPidMap(clientpidmap); + } + // X- + // TODO import X-GENDER + else if (identifier.startsWith(QLatin1String("x-"))) { + QString ident = (*lineIt).identifier(); + // clang-format off + //X-Evolution + // also normalize case of our own extensions, some backends "adjust" that + if (identifier == QLatin1String("x-evolution-spouse") + || identifier == QLatin1String("x-spouse")) { + ident = QStringLiteral("X-KADDRESSBOOK-X-SpousesName"); + } else if (identifier == QLatin1String("x-evolution-blog-url") || identifier.compare(QLatin1String("X-KADDRESSBOOK-BLOGFEED"), Qt::CaseInsensitive) == 0) { + ident = QStringLiteral("X-KADDRESSBOOK-BlogFeed"); + } else if (identifier == QLatin1String("x-evolution-assistant") + || identifier == QLatin1String("x-assistant") + || identifier.compare(QLatin1String("X-KADDRESSBOOK-X-ASSISTANTSNAME"), Qt::CaseInsensitive) == 0) { + ident = QStringLiteral("X-KADDRESSBOOK-X-AssistantsName"); + } else if (identifier == QLatin1String("x-evolution-anniversary") + || identifier == QLatin1String("x-anniversary") + || identifier.compare(QLatin1String("X-KADDRESSBOOK-X-ANNIVERSARY"), Qt::CaseInsensitive) == 0) { + ident = QStringLiteral("X-KADDRESSBOOK-X-Anniversary"); + } else if (identifier == QLatin1String("x-evolution-manager") + || identifier == QLatin1String("x-manager") + || identifier.compare(QLatin1String("X-KADDRESSBOOK-X-MANAGERSNAME"), Qt::CaseInsensitive) == 0) { + // clang-format on + ident = QStringLiteral("X-KADDRESSBOOK-X-ManagersName"); + } else if (identifier.compare(QLatin1String("X-KADDRESSBOOK-X-PROFESSION"), Qt::CaseInsensitive) == 0) { + ident = QStringLiteral("X-KADDRESSBOOK-X-Profession"); + } else if (identifier.compare(QLatin1String("X-KADDRESSBOOK-X-OFFICE"), Qt::CaseInsensitive) == 0) { + ident = QStringLiteral("X-KADDRESSBOOK-X-Office"); + } else if (identifier.compare(QLatin1String("X-KADDRESSBOOK-X-SPOUSESNAME"), Qt::CaseInsensitive) == 0) { + ident = QStringLiteral("X-KADDRESSBOOK-X-SpousesName"); + } else if (identifier == QLatin1String("x-aim")) { + ident = QStringLiteral("X-messaging/aim-All"); + } else if (identifier == QLatin1String("x-icq")) { + ident = QStringLiteral("X-messaging/icq-All"); + } else if (identifier == QLatin1String("x-jabber")) { + ident = QStringLiteral("X-messaging/xmpp-All"); + } else if (identifier == QLatin1String("x-jabber")) { + ident = QStringLiteral("X-messaging/xmpp-All"); + } else if (identifier == QLatin1String("x-msn")) { + ident = QStringLiteral("X-messaging/msn-All"); + } else if (identifier == QLatin1String("x-yahoo")) { + ident = QStringLiteral("X-messaging/yahoo-All"); + } else if (identifier == QLatin1String("x-gadugadu")) { + ident = QStringLiteral("X-messaging/gadu-All"); + } else if (identifier == QLatin1String("x-skype")) { + ident = QStringLiteral("X-messaging/skype-All"); + } else if (identifier == QLatin1String("x-groupwise")) { + ident = QStringLiteral("X-messaging/groupwise-All"); + } else if (identifier == QLatin1String("x-sms")) { + ident = QStringLiteral("X-messaging/sms-All"); + } else if (identifier == QLatin1String("x-meanwhile")) { + ident = QStringLiteral("X-messaging/meanwhile-All"); + } else if (identifier == QLatin1String("x-irc")) { + ident = QStringLiteral("X-messaging/irc-All"); + } else if (identifier == QLatin1String("x-gtalk")) { + ident = QStringLiteral("X-messaging/googletalk-All"); + } else if (identifier == QLatin1String("x-twitter")) { + ident = QStringLiteral("X-messaging/twitter-All"); + } + + const QString key = ident.mid(2); + const int dash = key.indexOf(QLatin1Char('-')); + + // convert legacy messaging fields into IMPP ones + if (key.startsWith(QLatin1String("messaging/"))) { + QUrl url; + url.setScheme(normalizeImppServiceType(key.mid(10, dash - 10))); + const auto values = (*lineIt).value().toString().split(QChar(0xE000), Qt::SkipEmptyParts); + for (const auto &value : values) { + url.setPath(value); + Impp impp; + impp.setParams((*lineIt).parameterMap()); + impp.setAddress(url); + addr.insertImpp(impp); + } + } else { + addr.insertCustom(key.left(dash), key.mid(dash + 1), (*lineIt).value().toString()); + } + } + } + } + + addrList.append(addr); + } + + return addrList; +} + +QDateTime VCardTool::parseDateTime(const QString &str, bool *timeValid) +{ + static const QLatin1Char sep('-'); + + const int posT = str.indexOf(QLatin1Char('T')); + QString dateString = posT >= 0 ? str.left(posT) : str; + const bool noYear = dateString.startsWith(QLatin1String("--")); + dateString.remove(QLatin1Char('-')); + QDate date; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const QStringView dstr{dateString}; +#else + const QStringRef dstr(&dateString); +#endif + if (noYear) { + date.setDate(-1, dstr.mid(0, 2).toInt(), dstr.mid(2, 2).toInt()); + } else { + // E.g. 20160120 + date.setDate(dstr.mid(0, 4).toInt(), dstr.mid(4, 2).toInt(), dstr.mid(6, 2).toInt()); + } + + QTime time; + Qt::TimeSpec spec = Qt::LocalTime; + int offsetSecs = 0; + if (posT >= 0) { + QString timeString = str.mid(posT + 1); + timeString.remove(QLatin1Char(':')); + const int zPos = timeString.indexOf(QLatin1Char('Z')); + const int plusPos = timeString.indexOf(QLatin1Char('+')); + const int minusPos = timeString.indexOf(sep); + const int tzPos = qMax(qMax(zPos, plusPos), minusPos); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const QStringView hhmmssString = tzPos >= 0 ? QStringView(timeString).left(tzPos) : QStringView(timeString); +#else + const QStringRef hhmmssString = tzPos >= 0 ? timeString.leftRef(tzPos) : QStringRef(&timeString); +#endif + int hour = 0; + int minutes = 0; + int seconds = 0; + switch (hhmmssString.size()) { + case 2: + hour = hhmmssString.toInt(); + break; + case 4: + hour = hhmmssString.mid(0, 2).toInt(); + minutes = hhmmssString.mid(2, 2).toInt(); + break; + case 6: + hour = hhmmssString.mid(0, 2).toInt(); + minutes = hhmmssString.mid(2, 2).toInt(); + seconds = hhmmssString.mid(4, 2).toInt(); + break; + } + time.setHMS(hour, minutes, seconds); + + if (tzPos >= 0) { + if (zPos >= 0) { + spec = Qt::UTC; + } else { + spec = Qt::OffsetFromUTC; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const auto offsetString = QStringView(timeString).mid(tzPos + 1); +#else + const QStringRef offsetString = timeString.midRef(tzPos + 1); +#endif + switch (offsetString.size()) { + case 2: // format: "hh" + offsetSecs = offsetString.left(2).toInt() * 3600; + break; + case 4: // format: "hhmm" + offsetSecs = offsetString.left(2).toInt() * 3600 + offsetString.mid(2, 2).toInt() * 60; + break; + } + } + if (minusPos >= 0) { + offsetSecs *= -1; + } + } + } + if (timeValid) { + *timeValid = time.isValid(); + } + + return QDateTime(date, time, spec, offsetSecs); +} + +QString VCardTool::createDateTime(const QDateTime &dateTime, VCard::Version version, bool withTime) +{ + if (!dateTime.date().isValid()) { + return QString(); + } + QString str = createDate(dateTime.date(), version); + if (!withTime) { + return str; + } + str += createTime(dateTime.time(), version); + if (dateTime.timeSpec() == Qt::UTC) { + str += QLatin1Char('Z'); + } else if (dateTime.timeSpec() == Qt::OffsetFromUTC) { + const int offsetSecs = dateTime.offsetFromUtc(); + if (offsetSecs >= 0) { + str += QLatin1Char('+'); + } else { + str += QLatin1Char('-'); + } + QTime offsetTime = QTime(0, 0).addSecs(abs(offsetSecs)); + if (version == VCard::v4_0) { + str += offsetTime.toString(QStringLiteral("HHmm")); + } else { + str += offsetTime.toString(QStringLiteral("HH:mm")); + } + } + return str; +} + +QString VCardTool::createDate(const QDate &date, VCard::Version version) +{ + QString format; + if (date.year() > 0) { + format = QStringLiteral("yyyyMMdd"); + } else { + format = QStringLiteral("--MMdd"); + } + if (version != VCard::v4_0) { + format.replace(QStringLiteral("yyyy"), QStringLiteral("yyyy-")); + format.replace(QStringLiteral("MM"), QStringLiteral("MM-")); + } + return date.toString(format); +} + +QString VCardTool::createTime(const QTime &time, VCard::Version version) +{ + QString format; + if (version == VCard::v4_0) { + format = QStringLiteral("HHmmss"); + } else { + format = QStringLiteral("HH:mm:ss"); + } + return QLatin1Char('T') + time.toString(format); +} + +Picture VCardTool::parsePicture(const VCardLine &line) const +{ + Picture pic; + + const QStringList params = line.parameterList(); + QString type; + if (params.contains(QLatin1String("type"))) { + type = line.parameter(QStringLiteral("type")); + } + if (params.contains(QLatin1String("encoding"))) { + pic.setRawData(line.value().toByteArray(), type); + } else if (params.contains(QLatin1String("value"))) { + if (line.parameter(QStringLiteral("value")).toLower() == QLatin1String("uri")) { + pic.setUrl(line.value().toString()); + } + } + + return pic; +} + +VCardLine VCardTool::createPicture(const QString &identifier, const Picture &pic, VCard::Version version) const +{ + VCardLine line(identifier); + + if (pic.isEmpty()) { + return line; + } + + if (pic.isIntern()) { + line.setValue(pic.rawData()); + if (version == VCard::v2_1) { + line.addParameter(QStringLiteral("ENCODING"), QStringLiteral("BASE64")); + line.addParameter(pic.type(), QString()); + } else { /*if (version == VCard::v3_0) */ + line.addParameter(QStringLiteral("encoding"), QStringLiteral("b")); + line.addParameter(QStringLiteral("type"), pic.type()); +#if 0 + } else { //version 4.0 + line.addParameter(QStringLiteral("data") + QStringLiteral(":image/") + pic.type(), QStringLiteral("base64")); +#endif + } + } else { + line.setValue(pic.url()); + line.addParameter(QStringLiteral("value"), QStringLiteral("URI")); + } + + return line; +} + +Sound VCardTool::parseSound(const VCardLine &line) const +{ + Sound snd; + + const QStringList params = line.parameterList(); + if (params.contains(QLatin1String("encoding"))) { + snd.setData(line.value().toByteArray()); + } else if (params.contains(QLatin1String("value"))) { + if (line.parameter(QStringLiteral("value")).toLower() == QLatin1String("uri")) { + snd.setUrl(line.value().toString()); + } + } + + /* TODO: support sound types + if ( params.contains( "type" ) ) + snd.setType( line.parameter( "type" ) ); + */ + + return snd; +} + +VCardLine VCardTool::createSound(const Sound &snd, VCard::Version version) const +{ + Q_UNUSED(version); + VCardLine line(QStringLiteral("SOUND")); + + if (snd.isIntern()) { + if (!snd.data().isEmpty()) { + line.setValue(snd.data()); + if (version == VCard::v2_1) { + line.addParameter(QStringLiteral("ENCODING"), QStringLiteral("BASE64")); + } else { + line.addParameter(QStringLiteral("encoding"), QStringLiteral("b")); + } + // TODO: need to store sound type!!! + } + } else if (!snd.url().isEmpty()) { + line.setValue(snd.url()); + line.addParameter(QStringLiteral("value"), QStringLiteral("URI")); + } + + return line; +} + +Key VCardTool::parseKey(const VCardLine &line) const +{ + Key key; + + const QStringList params = line.parameterList(); + if (params.contains(QLatin1String("encoding"))) { + key.setBinaryData(line.value().toByteArray()); + } else { + key.setTextData(line.value().toString()); + } + + if (params.contains(QLatin1String("type"))) { + if (line.parameter(QStringLiteral("type")).toLower() == QLatin1String("x509")) { + key.setType(Key::X509); + } else if (line.parameter(QStringLiteral("type")).toLower() == QLatin1String("pgp")) { + key.setType(Key::PGP); + } else { + key.setType(Key::Custom); + key.setCustomTypeString(line.parameter(QStringLiteral("type"))); + } + } else if (params.contains(QLatin1String("mediatype"))) { + const QString param = line.parameter(QStringLiteral("mediatype")).toLower(); + if (param == QLatin1String("application/x-x509-ca-cert")) { + key.setType(Key::X509); + } else if (param == QLatin1String("application/pgp-keys")) { + key.setType(Key::PGP); + } else { + key.setType(Key::Custom); + key.setCustomTypeString(line.parameter(QStringLiteral("type"))); + } + } + + return key; +} + +VCardLine VCardTool::createKey(const Key &key, VCard::Version version) const +{ + VCardLine line(QStringLiteral("KEY")); + + if (key.isBinary()) { + if (!key.binaryData().isEmpty()) { + line.setValue(key.binaryData()); + if (version == VCard::v2_1) { + line.addParameter(QStringLiteral("ENCODING"), QStringLiteral("BASE64")); + } else { + line.addParameter(QStringLiteral("encoding"), QStringLiteral("b")); + } + } + } else if (!key.textData().isEmpty()) { + line.setValue(key.textData()); + } + + if (version == VCard::v4_0) { + if (key.type() == Key::X509) { + line.addParameter(QStringLiteral("MEDIATYPE"), QStringLiteral("application/x-x509-ca-cert")); + } else if (key.type() == Key::PGP) { + line.addParameter(QStringLiteral("MEDIATYPE"), QStringLiteral("application/pgp-keys")); + } else if (key.type() == Key::Custom) { + line.addParameter(QStringLiteral("MEDIATYPE"), key.customTypeString()); + } + } else { + if (key.type() == Key::X509) { + line.addParameter(QStringLiteral("type"), QStringLiteral("X509")); + } else if (key.type() == Key::PGP) { + line.addParameter(QStringLiteral("type"), QStringLiteral("PGP")); + } else if (key.type() == Key::Custom) { + line.addParameter(QStringLiteral("type"), key.customTypeString()); + } + } + + return line; +} + +Secrecy VCardTool::parseSecrecy(const VCardLine &line) const +{ + Secrecy secrecy; + + const QString value = line.value().toString().toLower(); + if (value == QLatin1String("public")) { + secrecy.setType(Secrecy::Public); + } else if (value == QLatin1String("private")) { + secrecy.setType(Secrecy::Private); + } else if (value == QLatin1String("confidential")) { + secrecy.setType(Secrecy::Confidential); + } + + return secrecy; +} + +VCardLine VCardTool::createSecrecy(const Secrecy &secrecy) const +{ + VCardLine line(QStringLiteral("CLASS")); + + int type = secrecy.type(); + + if (type == Secrecy::Public) { + line.setValue(QStringLiteral("PUBLIC")); + } else if (type == Secrecy::Private) { + line.setValue(QStringLiteral("PRIVATE")); + } else if (type == Secrecy::Confidential) { + line.setValue(QStringLiteral("CONFIDENTIAL")); + } + + return line; +} + +QStringList VCardTool::splitString(QChar sep, const QString &str) const +{ + QStringList list; + QString value(str); + + int start = 0; + int pos = value.indexOf(sep, start); + + while (pos != -1) { + if (pos == 0 || value[pos - 1] != QLatin1Char('\\')) { + if (pos > start && pos <= value.length()) { + list << value.mid(start, pos - start); + } else { + list << QString(); + } + + start = pos + 1; + pos = value.indexOf(sep, start); + } else { + value.replace(pos - 1, 2, sep); + pos = value.indexOf(sep, pos); + } + } + + int l = value.length() - 1; + const QString mid = value.mid(start, l - start + 1); + if (!mid.isEmpty()) { + list << mid; + } else { + list << QString(); + } + + return list; +} + +QString VCardTool::normalizeImppServiceType(const QString &serviceType) const +{ + if (serviceType == QLatin1String("jabber")) { + return QStringLiteral("xmpp"); + } + if (serviceType == QLatin1String("yahoo")) { + return QStringLiteral("ymsgr"); + } + if (serviceType == QLatin1String("gadugadu")) { + return QStringLiteral("gg"); + } + return serviceType; +} diff --git a/src/vcardtool_p.h b/src/vcardtool_p.h new file mode 100644 index 0000000..f41bf28 --- /dev/null +++ b/src/vcardtool_p.h @@ -0,0 +1,86 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2003 Tobias Koenig <tokoe@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KCONTACTS_VCARDTOOL_H +#define KCONTACTS_VCARDTOOL_H + +#include "addressee.h" +#include "kcontacts_export.h" +#include "vcardparser/vcardparser_p.h" + +class QDateTime; + +namespace KContacts +{ +class Key; +class Picture; +class Secrecy; +class Sound; + +class KCONTACTS_EXPORT VCardTool +{ +public: + VCardTool(); + ~VCardTool(); + + /** + Creates a string that contains the addressees from the list in + the vCard format. + */ + Q_REQUIRED_RESULT QByteArray createVCards(const Addressee::List &list, VCard::Version version = VCard::v3_0) const; + + /** + * @since 4.9.1 + */ + Q_REQUIRED_RESULT QByteArray exportVCards(const Addressee::List &list, VCard::Version version = VCard::v3_0) const; + /** + Parses the string and returns a list of addressee objects. + */ + Q_REQUIRED_RESULT Addressee::List parseVCards(const QByteArray &vcard) const; + + static QDateTime parseDateTime(const QString &str, bool *timeValid = nullptr); + static QString createDateTime(const QDateTime &dateTime, VCard::Version version, bool withTime = true); + static QString createDate(const QDate &date, VCard::Version version); + static QString createTime(const QTime &time, VCard::Version version); + +private: + QByteArray createVCards(const Addressee::List &list, VCard::Version version, bool exportVcard) const; + + /** + Split a string and replaces escaped separators on the fly with + unescaped ones. + */ + QStringList splitString(QChar sep, const QString &value) const; + + Picture parsePicture(const VCardLine &line) const; + VCardLine createPicture(const QString &identifier, const Picture &pic, VCard::Version version) const; + + Sound parseSound(const VCardLine &line) const; + VCardLine createSound(const Sound &snd, VCard::Version version) const; + + Key parseKey(const VCardLine &line) const; + VCardLine createKey(const Key &key, VCard::Version version) const; + + Secrecy parseSecrecy(const VCardLine &line) const; + VCardLine createSecrecy(const Secrecy &secrecy) const; + + void addParameter(VCardLine *line, VCard::Version version, const QString &key, const QStringList &valueStringList) const; + + /** Translate alternative or legacy IMPP service types. */ + QString normalizeImppServiceType(const QString &serviceType) const; + + void processAddresses(const Address::List &addresses, VCard::Version version, VCard *card) const; + void processEmailList(const Email::List &emailList, VCard::Version version, VCard *card) const; + void processOrganizations(const Addressee &addressee, VCard::Version version, VCard *card) const; + void processPhoneNumbers(const PhoneNumber::List &phoneNumbers, VCard::Version version, VCard *card) const; + void processCustoms(const QStringList &customs, VCard::Version version, VCard *card, bool exportVcard) const; + + Q_DISABLE_COPY(VCardTool) +}; +} + +#endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..e9c4c31 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,27 @@ + +include(ECMMarkAsTest) + +########### next target ############### + +# FIXME: Build fails +add_executable(testread testread.cpp) +target_link_libraries(testread KF5Contacts KF5::I18n Qt${QT_MAJOR_VERSION}::Gui) + +########### next target ############### + +# FIXME: Build fails +add_executable(testwrite testwrite.cpp) +target_link_libraries(testwrite KF5Contacts Qt${QT_MAJOR_VERSION}::Gui KF5::I18n) + +########### next target ############### + +add_executable(testread2 testread2.cpp testutils.cpp) +target_link_libraries(testread2 KF5Contacts Qt${QT_MAJOR_VERSION}::Gui) + +if (TARGET Qt${QT_MAJOR_VERSION}::Quick) + add_executable(qmlintegrationtest + qmlintegrationtest.cpp + qmlintegrationtest.qrc + ) + target_link_libraries(qmlintegrationtest PRIVATE KF5::Contacts Qt${QT_MAJOR_VERSION}::Quick) +endif() diff --git a/tests/README.testing b/tests/README.testing new file mode 100644 index 0000000..1a70685 --- /dev/null +++ b/tests/README.testing @@ -0,0 +1,12 @@ +For testing the vcardparser there are some test files and a small testsuite +automatically checking for regressions. The tests directory contains some vCard +files and correpsonding reference output files (with an additional ".ref" +suffix). For running the geression test do "./testroundtrip" or simply run "ctest". + +For creating a new test put a vCard file to be parsed into the tests directory. +Create a reference file by running "testread" on the test file. It will put out +the parsed data as vCard again on stdout. Carefully check the output, manually +correct any errors and save the result as reference file in the tests directory. +Now add the filename to the testroundtrip.qrc resource file and run +"make && ./roundtriptest" If the check fails adapt the reference file or fix the bugs +in the parser, whatever is appropriate. diff --git a/tests/checkvcard.pl b/tests/checkvcard.pl new file mode 100755 index 0000000..5965c89 --- /dev/null +++ b/tests/checkvcard.pl @@ -0,0 +1,79 @@ +#!/usr/bin/perl + +if ( @ARGV != 1 ) { + print STDERR "Missing arg: filename\n"; + system "touch FAILED"; + exit 1; +} + +$file = $ARGV[0]; + +if ( !open( IN, "$file" ) ) { + print STDERR "Unable to open '$file'\n"; + system "touch FAILED"; + exit 1; +} + +while( <IN> ) { + if (/^VERSION:(.*)$/ ) { + $version = $1; + if ( $version eq "2.1" ) { $options = "--vcard21"; } + } +} + +close IN; + +$ref = "$file.ref"; + +if ( !open( REF, "$ref" ) ) { + print STDERR "Unable to open $ref\n"; + system "touch FAILED"; + exit 1; +} + +while( <REF> ) { + push @ref, $_; +} + +close REF; + +if ( !open( READ, "./testread $file $options 2> /dev/null |" ) ) { + print STDERR "Unable to open testread\n"; + system "touch FAILED"; + exit 1; +} + +print "Checking '$file':\n"; + +$gotsomething = 0; +$error = 0; +$i = 0; +while( <READ> ) { + $gotsomething = 1; + $out = $_; + $ref = @ref[$i++]; + + if ( $out ne $ref ) { + if ( $ref =~ /^UID/ && $out =~ /^UID/ ) { next; } + $error++; + print " Expected : $ref"; + print " Parser output : $out"; + } +} + +close READ; + +if ( $gotsomething == 0 ) { + print "\n FAILED: testread didn't output anything\n"; + system "touch FAILED"; + exit 1; +} +if ( $error > 0 ) { + print "\n FAILED: $error errors found.\n"; + system "touch FAILED"; + exit 1; +} else { + print " OK\n"; +} + +exit 0; diff --git a/tests/qmlintegrationtest.cpp b/tests/qmlintegrationtest.cpp new file mode 100644 index 0000000..8534d59 --- /dev/null +++ b/tests/qmlintegrationtest.cpp @@ -0,0 +1,50 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include <QGuiApplication> +#include <QQmlApplicationEngine> + +#include "../src/addressformat.h" +#include <KContacts/Address> + +using namespace KContacts; + +int main(int argc, char **argv) +{ + QCoreApplication::setApplicationName(QStringLiteral("kcontacts-qmlintegrationtest")); + QCoreApplication::setOrganizationName(QStringLiteral("KDE")); + QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org")); + + QGuiApplication app(argc, argv); + + // ### this should probably eventually move into a real QML plugin for KContacts + qmlRegisterUncreatableMetaObject(KContacts::staticMetaObject, "org.kde.contacts", 1, 0, "KContacts", {}); + qmlRegisterSingletonType("org.kde.contacts", 1, 0, "AddressFormatRepository", [](QQmlEngine *, QJSEngine *jsEngine) -> QJSValue { + return jsEngine->toScriptValue(AddressFormatRepository()); + }); + qRegisterMetaType<AddressFormat>(); + qRegisterMetaType<AddressFormatElement>(); + qRegisterMetaType<AddressFormatRepository>(); + qRegisterMetaType<AddressFormatPreference>(); + qRegisterMetaType<AddressFormatScriptPreference>(); + + // test data + qmlRegisterSingletonType("org.kde.contacts.test", 1, 0, "TestData", [](QQmlEngine *, QJSEngine *jsEngine) -> QJSValue { + Address address; + address.setCountry(QStringLiteral("DE")); + address.setRegion(QStringLiteral("BE")); + address.setLocality(QStringLiteral("Berlin")); + address.setPostalCode(QStringLiteral("10969")); + address.setStreet(QStringLiteral("Prinzenstraße 85 F")); + + auto obj = jsEngine->newObject(); + obj.setProperty(QStringLiteral("address"), jsEngine->toScriptValue(address)); + return obj; + }); + + QQmlApplicationEngine engine; + engine.load(QStringLiteral("qrc:/qmlintegrationtest.qml")); + return app.exec(); +} diff --git a/tests/qmlintegrationtest.qml b/tests/qmlintegrationtest.qml new file mode 100644 index 0000000..fc52b94 --- /dev/null +++ b/tests/qmlintegrationtest.qml @@ -0,0 +1,80 @@ +/* + SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import org.kde.i18n.localeData 1.0 +import org.kde.contacts 1.0 +import org.kde.contacts.test 1.0 + +ApplicationWindow { + visible: true + width: 480 + height: 720 + + ColumnLayout { + ComboBox { + id: styleCombo + textRole: "text" + valueRole: "style" + model: [ + { text: "Postal address", style: KContacts.AddressFormatStyle.Postal }, + { text: "Multiple lines, domestic", style: KContacts.AddressFormatStyle.MultiLineDomestic }, + { text: "Multiple lines, international", style: KContacts.AddressFormatStyle.MultiLineInternational }, + { text: "Single line, domestic", style: KContacts.AddressFormatStyle.SingleLineDomestic }, + { text: "Single line, international", style: KContacts.AddressFormatStyle.SingleLineInternational } + ] + } + + Label { + text: TestData.address.formatted(styleCombo.currentValue, "Dr. Konqi", "KDE e.V.") + } + + ComboBox { + id: countryCombo + model: Country.allCountries.map(c => c.alpha2) + } + + Label { + id: zipFormat + text: AddressFormatRepository.formatForCountry(countryCombo.currentValue, KContacts.AddressFormatScriptPreference.Local).postalCodeRegularExpression + } + TextField { + id: zipField + text: "12345" + } + Label { + text: zipField.text.match("^" + zipFormat.text + "$") ? "is a valid zip code" : "is not a valid zip code" + } + + Label { + text: "Formatting rule:" + } + Repeater { + model: AddressFormatRepository.formatForCountry(countryCombo.currentValue, KContacts.AddressFormatScriptPreference.Local, KContacts.AddressFormatPreference.Business).elements + Label { + text: { + const field_map = new Map([ + [ KContacts.AddressFormatField.Name, "Name" ], + [ KContacts.AddressFormatField.Organization, "Organization" ], + [ KContacts.AddressFormatField.StreetAddress, "Street" ], + [ KContacts.AddressFormatField.Locality, "City" ], + [ KContacts.AddressFormatField.DependentLocality, "Dependent Locality" ], + [ KContacts.AddressFormatField.PostOfficeBox, "PO Box" ], + [ KContacts.AddressFormatField.Country, "Country" ], + [ KContacts.AddressFormatField.Region, "State" ], + [ KContacts.AddressFormatField.SortingCode, "Sorting Code" ], + [ KContacts.AddressFormatField.PostalCode, "Zip Code" ], + ]); + if (modelData.isField) { return "Field: " + field_map.get(modelData.field); } + if (modelData.isLiteral) { return "Literal: \"" + modelData.literal + "\""; } + if (modelData.isSeparator) { return "Separator"; } + } + font.bold: AddressFormatRepository.formatForCountry(countryCombo.currentValue, KContacts.AddressFormatScriptPreference.LatinScript).requiredFields & modelData.field + } + } + } +} diff --git a/tests/qmlintegrationtest.qrc b/tests/qmlintegrationtest.qrc new file mode 100644 index 0000000..92a1153 --- /dev/null +++ b/tests/qmlintegrationtest.qrc @@ -0,0 +1,9 @@ +<!-- + SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> + SPDX-License-Identifier: CC0-1.0 +--> +<RCC> + <qresource prefix="/"> + <file>qmlintegrationtest.qml</file> + </qresource> +</RCC> diff --git a/tests/testread.cpp b/tests/testread.cpp new file mode 100644 index 0000000..43b5dec --- /dev/null +++ b/tests/testread.cpp @@ -0,0 +1,59 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include <iostream> + +#include <QFile> + +#include <QCommandLineOption> +#include <QCommandLineParser> +#include <QCoreApplication> +#include <QDebug> + +#include "converter/kcontacts/vcardconverter.h" +#include "vcard_p.h" + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + QCommandLineParser parser; + parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("vcard21"), QStringLiteral("vCard 2.1"))); + parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("+inputfile"), QStringLiteral("Input file"))); + + parser.addVersionOption(); + parser.addHelpOption(); + parser.process(app); + + if (parser.positionalArguments().count() != 1) { + std::cerr << "Missing argument" << std::endl; + return 1; + } + + QString inputFile(parser.positionalArguments().at(0)); + + QFile file(inputFile); + if (!file.open(QIODevice::ReadOnly)) { + qDebug("Unable to open file '%s' for reading!", qPrintable(file.fileName())); + return 1; + } + + QByteArray text = file.readAll(); + file.close(); + + KContacts::VCardConverter converter; + KContacts::Addressee::List list = converter.parseVCards(text); + + if (parser.isSet(QStringLiteral("vcard21"))) { + text = converter.createVCards(list, KContacts::VCardConverter::v2_1); // uses version 2.1 + } else { + text = converter.createVCards(list); // uses version 3.0 + } + + std::cout << text.data(); + + return 0; +} diff --git a/tests/testread2.cpp b/tests/testread2.cpp new file mode 100644 index 0000000..2b1cde1 --- /dev/null +++ b/tests/testread2.cpp @@ -0,0 +1,50 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "testutils.h" +#include <QDebug> +#include <converter/kcontacts/vcardconverter.h> +#include <kcontacts/addressee.h> + +using namespace KContacts; + +int main() +{ + Addressee::List l = vCardsAsAddresseeList(); + QByteArray vcards = vCardsAsText(); + + VCardConverter vct; + + Addressee::List parsed = vct.parseVCards(vcards); + + if (l.size() != parsed.size()) { + qDebug() << "\tSize - FAILED :" << l.size() << "vs. parsed" << parsed.size(); + } else { + qDebug() << "\tSize - PASSED"; + } + + Addressee::List::iterator itr1; + Addressee::List::iterator itr2; + // clang-format off + for (itr1 = l.begin(), itr2 = parsed.begin(); + itr1 != l.end() && itr2 != parsed.end(); ++itr1, ++itr2) { + if ((*itr1).fullEmail() == (*itr2).fullEmail() + && (*itr1).organization() == (*itr2).organization() + && (*itr1).phoneNumbers() == (*itr2).phoneNumbers() + && (*itr1).emails() == (*itr2).emails() + && (*itr1).role() == (*itr2).role()) { + qDebug() << "\tAddressee - PASSED"; + qDebug() << "\t\t" << (*itr1).fullEmail() << "VS." << (*itr2).fullEmail(); + // clang-format on + } else { + qDebug() << "\tAddressee - FAILED"; + qDebug() << (*itr1).toString(); + qDebug() << (*itr2).toString(); + // qDebug()<<"\t\t"<< (*itr1).fullEmail() << "VS." << (*itr2).fullEmail(); + } + } +} diff --git a/tests/testutils.cpp b/tests/testutils.cpp new file mode 100644 index 0000000..bdf6974 --- /dev/null +++ b/tests/testutils.cpp @@ -0,0 +1,104 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "testutils.h" +#include <QFile> + +#include "vcardparser_p.h" + +using namespace KContacts; + +Addressee vcard1() +{ + Addressee addr; + + addr.setName(QStringLiteral("Frank Dawson")); + addr.setOrganization(QStringLiteral("Lotus Development Corporation")); + KContacts::ResourceLocatorUrl url; + url.setUrl(QUrl(QStringLiteral("http://home.earthlink.net/~fdawson"))); + addr.setUrl(url); + addr.addEmail(Email(QStringLiteral("fdawson@earthlink.net"))); + + Email mail(QStringLiteral("Frank_Dawson@Lotus.com")); + mail.setPreferred(true); + addr.addEmail(mail); + addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-919-676-9515"), PhoneNumber::Voice | PhoneNumber::Msg | PhoneNumber::Work)); + addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-919-676-9564"), PhoneNumber::Fax | PhoneNumber::Work)); + Address a(Address::Work | Address::Postal | Address::Parcel); + a.setStreet(QStringLiteral("6544 Battleford Drive")); + a.setLocality(QStringLiteral("Raleigh")); + a.setRegion(QStringLiteral("NC")); + a.setPostalCode(QStringLiteral("27613-3502")); + a.setCountry(QStringLiteral("U.S.A.")); + addr.insertAddress(a); + return addr; +} + +Addressee vcard2() +{ + Addressee addr; + + addr.setName(QStringLiteral("Tim Howes")); + addr.setOrganization(QStringLiteral("Netscape Communications Corp.")); + addr.addEmail(Email(QStringLiteral("howes@netscape.com"))); + addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-415-937-3419"), // + PhoneNumber::Voice | PhoneNumber::Msg | PhoneNumber::Work)); + addr.insertPhoneNumber(PhoneNumber(QStringLiteral("+1-415-528-4164"), // + PhoneNumber::Fax | PhoneNumber::Work)); + Address a(Address::Work); + a.setStreet(QStringLiteral("501 E. Middlefield Rd.")); + a.setLocality(QStringLiteral("Mountain View")); + a.setRegion(QStringLiteral("CA")); + a.setPostalCode(QStringLiteral("94043")); + a.setCountry(QStringLiteral("U.S.A.")); + addr.insertAddress(a); + return addr; +} + +Addressee vcard3() +{ + Addressee addr; + + addr.setName(QStringLiteral("ian geiser")); + addr.setOrganization(QStringLiteral("Source eXtreme")); + addr.addEmail(QStringLiteral("geiseri@yahoo.com")); + addr.setTitle(QStringLiteral("VP of Engineering")); + return addr; +} + +QByteArray vcardAsText(const QString &location) +{ + QByteArray text; + + QFile file(location); + if (file.open(QIODevice::ReadOnly)) { + text = file.readAll(); + file.close(); + } + + return text; +} + +Addressee::List vCardsAsAddresseeList() +{ + Addressee::List l; + + l.append(vcard1()); + l.append(vcard2()); + l.append(vcard3()); + + return l; +} + +QByteArray vCardsAsText() +{ + QByteArray vcards = vcardAsText(QStringLiteral("tests/vcard1.vcf")); + vcards += vcardAsText(QStringLiteral("tests/vcard2.vcf")); + vcards += vcardAsText(QStringLiteral("tests/vcard3.vcf")); + + return vcards; +} diff --git a/tests/testutils.h b/tests/testutils.h new file mode 100644 index 0000000..f629cca --- /dev/null +++ b/tests/testutils.h @@ -0,0 +1,22 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef TESTUTILS_H +#define TESTUTILS_H + +#include <QByteArray> +#include <QString> + +#include <kcontacts/addressee.h> + +KContacts::Addressee vcard1(); +KContacts::Addressee vcard2(); +KContacts::Addressee vcard3(); +KContacts::Addressee::List vCardsAsAddresseeList(); +QByteArray vCardsAsText(); + +#endif diff --git a/tests/testwrite.cpp b/tests/testwrite.cpp new file mode 100644 index 0000000..b3f8582 --- /dev/null +++ b/tests/testwrite.cpp @@ -0,0 +1,109 @@ +/* + This file is part of the KContacts framework. + SPDX-FileCopyrightText: 2007 KDE-PIM team <kde-pim@kde.org> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include <QFile> + +#include <KLocalizedString> + +#include <QCommandLineParser> +#include <QCoreApplication> + +#include "converter/kcontacts/vcardconverter.h" +#include "kcontacts/address.h" +#include "kcontacts/addressee.h" +#include "kcontacts/key.h" +#include "kcontacts/phonenumber.h" +#include "kcontacts/picture.h" +#include "kcontacts/secrecy.h" +#include "kcontacts/sound.h" + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + QCommandLineParser parser; + parser.addVersionOption(); + parser.addHelpOption(); + parser.process(app); + + KContacts::Addressee addressee; + + addressee.setNameFromString(QLatin1String("Mr. Tobias Koenig Jr.")); + addressee.setNickName(QLatin1String("tokoe")); + addressee.setBirthday(QDateTime(QDate(1982, 7, 19).startOfDay())); + addressee.setMailer(QLatin1String("mutt1.2")); + addressee.setTimeZone(KContacts::TimeZone(+2)); + + KContacts::Geo geo; + geo.setLatitude(30); + geo.setLongitude(51); + addressee.setGeo(geo); + + addressee.setTitle(QLatin1String("nerd")); + addressee.setRole(QLatin1String("Maintainer")); + addressee.setOrganization(QLatin1String("KDE")); + addressee.setNote(QLatin1String("never\ntouch a running system")); + addressee.setProductId(QLatin1String("testId")); + addressee.setRevision(QDateTime::currentDateTime()); + addressee.setSortString(QLatin1String("koenig")); + KContacts::ResourceLocatorUrl url; + url.setUrl(QUrl(QLatin1String("http://wgess16.dyndns.org"))); + addressee.setUrl(url); + addressee.setSecrecy(KContacts::Secrecy(KContacts::Secrecy::Confidential)); + + KContacts::Email kdemail(QLatin1String("tokoe@kde.org")); + kdemail.setPreferred(true); + addressee.addEmail(kdemail); + + KContacts::Email yahoomail(QLatin1String("tokoe82@yahoo.de")); + yahoomail.setPreferred(true); + addressee.addEmail(yahoomail); + + KContacts::PhoneNumber phone1(QLatin1String("3541523475"), KContacts::PhoneNumber::Pref | KContacts::PhoneNumber::Home); + KContacts::PhoneNumber phone2(QLatin1String("+46745673475"), KContacts::PhoneNumber::Work); + addressee.insertPhoneNumber(phone1); + addressee.insertPhoneNumber(phone2); + + KContacts::Key key(QLatin1String("secret key"), KContacts::Key::X509); + addressee.insertKey(key); + + QStringList categories; + categories << QLatin1String("Friends") << QLatin1String("School") << QLatin1String("KDE"); + addressee.setCategories(categories); + + KContacts::Address a(KContacts::Address::Work | KContacts::Address::Postal | KContacts::Address::Parcel); + a.setStreet(QLatin1String("6544 Battleford Drive")); + a.setLocality(QLatin1String("Raleigh")); + a.setRegion(QLatin1String("NC")); + a.setPostalCode(QLatin1String("27613-3502")); + a.setCountry(QLatin1String("U.S.A.")); + addressee.insertAddress(a); + + addressee.insertCustom(QLatin1String("1hsdf"), QLatin1String("ertuer"), QLatin1String("iurt")); + addressee.insertCustom(QLatin1String("2hsdf"), QLatin1String("ertuer"), QLatin1String("iurt")); + addressee.insertCustom(QLatin1String("3hsdf"), QLatin1String("ertuer"), QLatin1String("iurt")); + + KContacts::Addressee::List list; + for (int i = 0; i < 1000; ++i) { + KContacts::Addressee addr = addressee; + addr.setUid(QString::number(i)); + list.append(addr); + } + + KContacts::VCardConverter converter; + QByteArray txt = converter.createVCards(list); + + QFile file(QLatin1String("out.vcf")); + if (!file.open(QIODevice::WriteOnly)) { + qDebug("Can't open file '%s' for writing", qPrintable(file.fileName())); + return 1; + } + + file.write(txt); + file.close(); + + return 0; +} diff --git a/tools/convert-libaddressinput-data.py b/tools/convert-libaddressinput-data.py new file mode 100755 index 0000000..dbc3768 --- /dev/null +++ b/tools/convert-libaddressinput-data.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> +# SPDX-License-Identifier: LGPL-2.0-or-later + +import json +import os +import requests + +# converts libaddressinput data to our addressbookformatrc format +# Note: This is not meant to just blindly overwrite our data, we have a number +# of additions and fixes that libaddressinput doesn't have. It is merely meant +# as an easier way to diff our data to that of libaddressinput. + +# get a list of all 3166-1 alpha 2 ISO codes +isoCodesFile = open('/usr/share/iso-codes/json/iso_3166-1.json') +isoCodesJson = json.loads(isoCodesFile.read()) +isoCodes = [] +for isoCode in isoCodesJson['3166-1']: + isoCodes.append(isoCode['alpha_2']) +isoCodes.sort() + +outFile = open('addressformatrc', 'w') + +# for each ISO code, see if libaddressinput has data +for isoCode in isoCodes: + req = requests.get(f"https://www.gstatic.com/chrome/autofill/libaddressinput/chromium-i18n/ssl-address/data/{isoCode}") + if req.status_code == 404: + print (f"{isoCode} has no format information") + continue + data = json.loads(req.text) + if not 'fmt' in data: + print(f"{isoCode} has no format") + continue + + outFile.write(f"[{isoCode}]\n") + outFile.write(f"AddressFormat={data['fmt']}\n") + if 'lfmt' in data: + outFile.write(f"LatinAddressFormat={data['lfmt']}\n") + if 'upper' in data: + outFile.write(f"Upper={data['upper']}\n") + if 'require' in data: + outFile.write(f"Required={data['require']}\n") + if 'zip' in data: + outFile.write(f"PostalCodeFormat={data['zip']}\n") + outFile.write('\n')