• Skip to content
  • Skip to link menu
KDE 4.1 API Reference
  • KDE API Reference
  • kdelibs
  • Sitemap
  • Contact Us
 

KDECore

klocalizedstring.h

Go to the documentation of this file.
00001 /*  This file is part of the KDE libraries
00002     Copyright (C) 2006 Chusslove Illich <caslav.ilic@gmx.net>
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public License
00015     along with this library; see the file COPYING.LIB.  If not, write to
00016     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017     Boston, MA 02110-1301, USA.
00018 */
00019 #ifndef KLOCALIZEDSTRING_H
00020 #define KLOCALIZEDSTRING_H
00021 
00022 #include <kdecore_export.h>
00023 
00024 
00025 #include <QtCore/QChar>
00026 #include <QtCore/QLatin1Char>
00027 #include <QtCore/QStringList>
00028 
00029 class KLocale;
00030 struct KCatalogName;
00031 class KLocalizedStringPrivate;
00032 
00037 #ifndef I18N_NOOP
00038 
00051 #define I18N_NOOP(x) x
00052 #endif
00053 
00054 #ifndef I18N_NOOP2
00055 
00070 #define I18N_NOOP2(comment,x) x
00071 #endif
00072 
00256 class KDECORE_EXPORT KLocalizedString
00257 {
00258 
00259     friend KLocalizedString KDECORE_EXPORT ki18n (const char* msg);
00260     friend KLocalizedString KDECORE_EXPORT ki18nc (const char *ctxt, const char *msg);
00261     friend KLocalizedString KDECORE_EXPORT ki18np (const char *singular, const char *plural);
00262     friend KLocalizedString KDECORE_EXPORT ki18ncp (const char *ctxt,
00263                                      const char *singular, const char *plural);
00264 
00265 public:
00273     explicit KLocalizedString ();
00274 
00278     KLocalizedString (const KLocalizedString &rhs);
00279 
00283     KLocalizedString& operator= (const KLocalizedString &rhs);
00284 
00288     ~KLocalizedString ();
00289 
00299     QString toString () const;
00300 
00312     QString toString (const KLocale *locale) const;
00313 
00323     bool isEmpty() const;
00324 
00337     KLocalizedString subs (int a, int fieldWidth = 0, int base = 10,
00338                            const QChar &fillChar = QLatin1Char(' ')) const;
00339 
00352     KLocalizedString subs (uint a, int fieldWidth = 0, int base = 10,
00353                            const QChar &fillChar = QLatin1Char(' ')) const;
00354 
00367     KLocalizedString subs (long a, int fieldWidth = 0, int base = 10,
00368                            const QChar &fillChar = QLatin1Char(' ')) const;
00369 
00382     KLocalizedString subs (ulong a, int fieldWidth = 0, int base = 10,
00383                            const QChar &fillChar = QLatin1Char(' ')) const;
00384 
00397     KLocalizedString subs (qlonglong a, int fieldWidth = 0, int base = 10,
00398                            const QChar &fillChar = QLatin1Char(' ')) const;
00399 
00412     KLocalizedString subs (qulonglong a, int fieldWidth = 0, int base = 10,
00413                            const QChar &fillChar = QLatin1Char(' ')) const;
00414 
00427     KLocalizedString subs (double a, int fieldWidth = 0,
00428                            char format = 'g', int precision = -1,
00429                            const QChar &fillChar = QLatin1Char(' ')) const;
00430 
00441     KLocalizedString subs (QChar a, int fieldWidth = 0,
00442                            const QChar &fillChar = QLatin1Char(' ')) const;
00443 
00454     KLocalizedString subs (const QString &a, int fieldWidth = 0,
00455                            const QChar &fillChar = QLatin1Char(' ')) const;
00456 
00464     KLocalizedString inContext (const QString &key,
00465                                 const QString &text) const;
00466 
00470     static void notifyCatalogsUpdated (const QStringList &languages,
00471                                        const QList<KCatalogName> &catalogs);
00472 
00473 private:
00474     KLocalizedString (const char *ctxt,
00475                       const char *msg, const char *plural);
00476 
00477     KLocalizedStringPrivate * const d;
00478 };
00479 
00489 extern KLocalizedString KDECORE_EXPORT ki18n (const char* msg);
00490 
00503 extern KLocalizedString KDECORE_EXPORT ki18nc (const char *ctxt, const char *msg);
00504 
00515 extern KLocalizedString KDECORE_EXPORT ki18np (const char *singular, const char *plural);
00516 
00531 extern KLocalizedString KDECORE_EXPORT ki18ncp (const char *ctxt, const char *singular, const char *plural);
00532 
00538 inline QString tr2i18n (const char *message, const char *comment = 0) {
00539     if (comment && comment[0] && message && message[0]) {
00540         return ki18nc(comment, message).toString();
00541     }
00542     else if (message && message[0]) {
00543         return ki18n(message).toString();
00544     }
00545     else {
00546         return QString();
00547     }
00548 }
00549 
00550 #ifndef NDEBUG
00551 #define I18N_ERR_MSG String_literal_as_second_argument_to_i18n___Perhaps_you_need_i18nc_or_i18np
00552 template <typename T, int s> class I18nTypeCheck {public: static void I18N_ERR_MSG () {}};
00553 template <int s> class I18nTypeCheck<char[s], s> {};
00554 #define STATIC_ASSERT_NOT_LITERAL_STRING(T) I18nTypeCheck<T, sizeof(T)>::I18N_ERR_MSG ();
00555 #else
00556 #define STATIC_ASSERT_NOT_LITERAL_STRING(T)
00557 #endif
00558 
00559 // >>>>> Basic calls
00560 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00566 inline QString i18n (const char *text)
00567 {
00568   return ki18n(text).toString();
00569 }
00570 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00577 template <typename A1>
00578 inline QString i18n (const char *text, const A1 &a1)
00579 {
00580   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00581   return ki18n(text).subs(a1).toString();
00582 }
00583 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00591 template <typename A1, typename A2>
00592 inline QString i18n (const char *text, const A1 &a1, const A2 &a2)
00593 {
00594   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00595   return ki18n(text).subs(a1).subs(a2).toString();
00596 }
00597 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00606 template <typename A1, typename A2, typename A3>
00607 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
00608 {
00609   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00610   return ki18n(text).subs(a1).subs(a2).subs(a3).toString();
00611 }
00612 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00622 template <typename A1, typename A2, typename A3, typename A4>
00623 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
00624 {
00625   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00626   return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
00627 }
00628 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00639 template <typename A1, typename A2, typename A3, typename A4, typename A5>
00640 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
00641 {
00642   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00643   return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
00644 }
00645 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00657 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00658 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
00659 {
00660   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00661   return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
00662 }
00663 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00676 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
00677 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
00678 {
00679   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00680   return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
00681 }
00682 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00696 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
00697 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
00698 {
00699   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00700   return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
00701 }
00702 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00717 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
00718 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9)
00719 {
00720   STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00721   return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
00722 }
00723 // <<<<<<< End of basic calls
00724 
00725 // >>>>> Context calls
00726 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00733 inline QString i18nc (const char *ctxt, const char *text)
00734 {
00735   return ki18nc(ctxt, text).toString();
00736 }
00737 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00745 template <typename A1>
00746 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1)
00747 {
00748   return ki18nc(ctxt, text).subs(a1).toString();
00749 }
00750 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00759 template <typename A1, typename A2>
00760 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2)
00761 {
00762   return ki18nc(ctxt, text).subs(a1).subs(a2).toString();
00763 }
00764 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00774 template <typename A1, typename A2, typename A3>
00775 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
00776 {
00777   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).toString();
00778 }
00779 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00790 template <typename A1, typename A2, typename A3, typename A4>
00791 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
00792 {
00793   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
00794 }
00795 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00807 template <typename A1, typename A2, typename A3, typename A4, typename A5>
00808 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
00809 {
00810   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
00811 }
00812 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00825 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00826 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
00827 {
00828   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
00829 }
00830 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00844 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
00845 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
00846 {
00847   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
00848 }
00849 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00864 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
00865 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
00866 {
00867   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
00868 }
00869 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00885 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
00886 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9)
00887 {
00888   return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
00889 }
00890 // <<<<< End of context calls
00891 
00892 // >>>>> Plural calls
00893 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00901 template <typename A1>
00902 inline QString i18np (const char *sing, const char *plur, const A1 &a1)
00903 {
00904   return ki18np(sing, plur).subs(a1).toString();
00905 }
00906 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00915 template <typename A1, typename A2>
00916 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2)
00917 {
00918   return ki18np(sing, plur).subs(a1).subs(a2).toString();
00919 }
00920 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00930 template <typename A1, typename A2, typename A3>
00931 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3)
00932 {
00933   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).toString();
00934 }
00935 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00946 template <typename A1, typename A2, typename A3, typename A4>
00947 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
00948 {
00949   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).toString();
00950 }
00951 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00963 template <typename A1, typename A2, typename A3, typename A4, typename A5>
00964 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
00965 {
00966   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
00967 }
00968 // Autogenerated; contact KLocalizedString maintainer for batch changes.
00981 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00982 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
00983 {
00984   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
00985 }
00986 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01000 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
01001 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
01002 {
01003   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
01004 }
01005 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01020 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
01021 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
01022 {
01023   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
01024 }
01025 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01041 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
01042 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9)
01043 {
01044   return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
01045 }
01046 // <<<<< End of plural calls
01047 
01048 // >>>>> Context-plural calls
01049 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01058 template <typename A1>
01059 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1)
01060 {
01061   return ki18ncp(ctxt, sing, plur).subs(a1).toString();
01062 }
01063 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01073 template <typename A1, typename A2>
01074 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2)
01075 {
01076   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).toString();
01077 }
01078 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01089 template <typename A1, typename A2, typename A3>
01090 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3)
01091 {
01092   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).toString();
01093 }
01094 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01106 template <typename A1, typename A2, typename A3, typename A4>
01107 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
01108 {
01109   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).toString();
01110 }
01111 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01124 template <typename A1, typename A2, typename A3, typename A4, typename A5>
01125 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
01126 {
01127   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
01128 }
01129 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01143 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
01144 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
01145 {
01146   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
01147 }
01148 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01163 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
01164 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
01165 {
01166   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
01167 }
01168 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01184 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
01185 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
01186 {
01187   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
01188 }
01189 // Autogenerated; contact KLocalizedString maintainer for batch changes.
01206 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
01207 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9)
01208 {
01209   return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
01210 }
01211 // <<<<< End of context-plural calls
01212 
01213 #endif

KDECore

Skip menu "KDECore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • KIO
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • Kross
  • KUtils
  • Nepomuk
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal