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
00072 #define I18N_NOOP2(comment,x) x
00073 #endif
00074
00075 #ifndef I18N_NOOP2_NOSTRIP
00076
00102 #define I18N_NOOP2_NOSTRIP(ctxt, text) ctxt, text
00103 #endif
00104
00288 class KDECORE_EXPORT KLocalizedString
00289 {
00290
00291 friend KLocalizedString KDECORE_EXPORT ki18n (const char* msg);
00292 friend KLocalizedString KDECORE_EXPORT ki18nc (const char *ctxt, const char *msg);
00293 friend KLocalizedString KDECORE_EXPORT ki18np (const char *singular, const char *plural);
00294 friend KLocalizedString KDECORE_EXPORT ki18ncp (const char *ctxt,
00295 const char *singular, const char *plural);
00296
00297 public:
00305 explicit KLocalizedString ();
00306
00310 KLocalizedString (const KLocalizedString &rhs);
00311
00315 KLocalizedString& operator= (const KLocalizedString &rhs);
00316
00320 ~KLocalizedString ();
00321
00331 QString toString () const;
00332
00344 QString toString (const KLocale *locale) const;
00345
00355 bool isEmpty() const;
00356
00369 KLocalizedString subs (int a, int fieldWidth = 0, int base = 10,
00370 const QChar &fillChar = QLatin1Char(' ')) const;
00371
00384 KLocalizedString subs (uint a, int fieldWidth = 0, int base = 10,
00385 const QChar &fillChar = QLatin1Char(' ')) const;
00386
00399 KLocalizedString subs (long a, int fieldWidth = 0, int base = 10,
00400 const QChar &fillChar = QLatin1Char(' ')) const;
00401
00414 KLocalizedString subs (ulong a, int fieldWidth = 0, int base = 10,
00415 const QChar &fillChar = QLatin1Char(' ')) const;
00416
00429 KLocalizedString subs (qlonglong a, int fieldWidth = 0, int base = 10,
00430 const QChar &fillChar = QLatin1Char(' ')) const;
00431
00444 KLocalizedString subs (qulonglong a, int fieldWidth = 0, int base = 10,
00445 const QChar &fillChar = QLatin1Char(' ')) const;
00446
00459 KLocalizedString subs (double a, int fieldWidth = 0,
00460 char format = 'g', int precision = -1,
00461 const QChar &fillChar = QLatin1Char(' ')) const;
00462
00473 KLocalizedString subs (QChar a, int fieldWidth = 0,
00474 const QChar &fillChar = QLatin1Char(' ')) const;
00475
00486 KLocalizedString subs (const QString &a, int fieldWidth = 0,
00487 const QChar &fillChar = QLatin1Char(' ')) const;
00488
00496 KLocalizedString inContext (const QString &key,
00497 const QString &text) const;
00498
00502 static void notifyCatalogsUpdated (const QStringList &languages,
00503 const QList<KCatalogName> &catalogs);
00504
00505 private:
00506 KLocalizedString (const char *ctxt,
00507 const char *msg, const char *plural);
00508
00509 KLocalizedStringPrivate * const d;
00510 };
00511
00521 extern KLocalizedString KDECORE_EXPORT ki18n (const char* msg);
00522
00535 extern KLocalizedString KDECORE_EXPORT ki18nc (const char *ctxt, const char *msg);
00536
00547 extern KLocalizedString KDECORE_EXPORT ki18np (const char *singular, const char *plural);
00548
00563 extern KLocalizedString KDECORE_EXPORT ki18ncp (const char *ctxt, const char *singular, const char *plural);
00564
00570 inline QString tr2i18n (const char *message, const char *comment = 0) {
00571 if (comment && comment[0] && message && message[0]) {
00572 return ki18nc(comment, message).toString();
00573 }
00574 else if (message && message[0]) {
00575 return ki18n(message).toString();
00576 }
00577 else {
00578 return QString();
00579 }
00580 }
00581
00582 #ifndef NDEBUG
00583 #define I18N_ERR_MSG String_literal_as_second_argument_to_i18n___Perhaps_you_need_i18nc_or_i18np
00584 template <typename T, int s> class I18nTypeCheck {public: static void I18N_ERR_MSG () {}};
00585 template <int s> class I18nTypeCheck<char[s], s> {};
00586 #define STATIC_ASSERT_NOT_LITERAL_STRING(T) I18nTypeCheck<T, sizeof(T)>::I18N_ERR_MSG ();
00587 #else
00588 #define STATIC_ASSERT_NOT_LITERAL_STRING(T)
00589 #endif
00590
00591
00592
00598 inline QString i18n (const char *text)
00599 {
00600 return ki18n(text).toString();
00601 }
00602
00609 template <typename A1>
00610 inline QString i18n (const char *text, const A1 &a1)
00611 {
00612 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00613 return ki18n(text).subs(a1).toString();
00614 }
00615
00623 template <typename A1, typename A2>
00624 inline QString i18n (const char *text, const A1 &a1, const A2 &a2)
00625 {
00626 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00627 return ki18n(text).subs(a1).subs(a2).toString();
00628 }
00629
00638 template <typename A1, typename A2, typename A3>
00639 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
00640 {
00641 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00642 return ki18n(text).subs(a1).subs(a2).subs(a3).toString();
00643 }
00644
00654 template <typename A1, typename A2, typename A3, typename A4>
00655 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
00656 {
00657 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00658 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
00659 }
00660
00671 template <typename A1, typename A2, typename A3, typename A4, typename A5>
00672 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
00673 {
00674 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00675 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
00676 }
00677
00689 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00690 inline QString i18n (const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
00691 {
00692 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00693 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
00694 }
00695
00708 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
00709 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)
00710 {
00711 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00712 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
00713 }
00714
00728 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
00729 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)
00730 {
00731 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00732 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
00733 }
00734
00749 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
00750 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)
00751 {
00752 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
00753 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
00754 }
00755
00756
00757
00758
00765 inline QString i18nc (const char *ctxt, const char *text)
00766 {
00767 return ki18nc(ctxt, text).toString();
00768 }
00769
00777 template <typename A1>
00778 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1)
00779 {
00780 return ki18nc(ctxt, text).subs(a1).toString();
00781 }
00782
00791 template <typename A1, typename A2>
00792 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2)
00793 {
00794 return ki18nc(ctxt, text).subs(a1).subs(a2).toString();
00795 }
00796
00806 template <typename A1, typename A2, typename A3>
00807 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
00808 {
00809 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).toString();
00810 }
00811
00822 template <typename A1, typename A2, typename A3, typename A4>
00823 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
00824 {
00825 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
00826 }
00827
00839 template <typename A1, typename A2, typename A3, typename A4, typename A5>
00840 inline QString i18nc (const char *ctxt, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
00841 {
00842 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
00843 }
00844
00857 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
00858 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)
00859 {
00860 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
00861 }
00862
00876 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
00877 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)
00878 {
00879 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
00880 }
00881
00896 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
00897 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)
00898 {
00899 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
00900 }
00901
00917 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
00918 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)
00919 {
00920 return ki18nc(ctxt, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
00921 }
00922
00923
00924
00925
00933 template <typename A1>
00934 inline QString i18np (const char *sing, const char *plur, const A1 &a1)
00935 {
00936 return ki18np(sing, plur).subs(a1).toString();
00937 }
00938
00947 template <typename A1, typename A2>
00948 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2)
00949 {
00950 return ki18np(sing, plur).subs(a1).subs(a2).toString();
00951 }
00952
00962 template <typename A1, typename A2, typename A3>
00963 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3)
00964 {
00965 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).toString();
00966 }
00967
00978 template <typename A1, typename A2, typename A3, typename A4>
00979 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
00980 {
00981 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).toString();
00982 }
00983
00995 template <typename A1, typename A2, typename A3, typename A4, typename A5>
00996 inline QString i18np (const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
00997 {
00998 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
00999 }
01000
01013 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
01014 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)
01015 {
01016 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
01017 }
01018
01032 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
01033 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)
01034 {
01035 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
01036 }
01037
01052 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
01053 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)
01054 {
01055 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
01056 }
01057
01073 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
01074 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)
01075 {
01076 return ki18np(sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
01077 }
01078
01079
01080
01081
01090 template <typename A1>
01091 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1)
01092 {
01093 return ki18ncp(ctxt, sing, plur).subs(a1).toString();
01094 }
01095
01105 template <typename A1, typename A2>
01106 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2)
01107 {
01108 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).toString();
01109 }
01110
01121 template <typename A1, typename A2, typename A3>
01122 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3)
01123 {
01124 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).toString();
01125 }
01126
01138 template <typename A1, typename A2, typename A3, typename A4>
01139 inline QString i18ncp (const char *ctxt, const char *sing, const char *plur, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
01140 {
01141 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).toString();
01142 }
01143
01156 template <typename A1, typename A2, typename A3, typename A4, typename A5>
01157 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)
01158 {
01159 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
01160 }
01161
01175 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
01176 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)
01177 {
01178 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
01179 }
01180
01195 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
01196 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)
01197 {
01198 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
01199 }
01200
01216 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
01217 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)
01218 {
01219 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
01220 }
01221
01238 template <typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
01239 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)
01240 {
01241 return ki18ncp(ctxt, sing, plur).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
01242 }
01243
01244
01245 #endif