00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00560
00566 inline QString i18n (const char *text)
00567 {
00568 return ki18n(text).toString();
00569 }
00570
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
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
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
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
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
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
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
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
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
00724
00725
00726
00733 inline QString i18nc (const char *ctxt, const char *text)
00734 {
00735 return ki18nc(ctxt, text).toString();
00736 }
00737
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
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
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
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
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
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
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
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
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
00891
00892
00893
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
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
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
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
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
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
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
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
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
01047
01048
01049
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
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
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
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
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
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
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
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
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
01212
01213 #endif