File indexing completed on 2024-04-21 03:54:21

0001 /*
0002     SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 // Undefine this because we don't want our i18n*() method names to be turned into i18nd*()
0008 #undef TRANSLATION_DOMAIN
0009 
0010 #include "klocalizedcontext.h"
0011 
0012 #include <klocalizedstring.h>
0013 
0014 #include "ki18n_logging.h"
0015 
0016 class KLocalizedContextPrivate
0017 {
0018 public:
0019     QString m_translationDomain;
0020 };
0021 
0022 KLocalizedContext::KLocalizedContext(QObject *parent)
0023     : QObject(parent)
0024     , d_ptr(new KLocalizedContextPrivate)
0025 {
0026 }
0027 
0028 KLocalizedContext::~KLocalizedContext() = default;
0029 
0030 QString KLocalizedContext::translationDomain() const
0031 {
0032     Q_D(const KLocalizedContext);
0033     return d->m_translationDomain;
0034 }
0035 
0036 void KLocalizedContext::setTranslationDomain(const QString &domain)
0037 {
0038     Q_D(KLocalizedContext);
0039     if (domain != d->m_translationDomain) {
0040         d->m_translationDomain = domain;
0041         Q_EMIT translationDomainChanged(domain);
0042     }
0043 }
0044 
0045 static void subsVariant(KLocalizedString &trMessage, const QVariant &value)
0046 {
0047     switch (value.userType()) {
0048     case QMetaType::QString:
0049         trMessage = trMessage.subs(value.toString());
0050         break;
0051     case QMetaType::Int:
0052         trMessage = trMessage.subs(value.toInt());
0053         break;
0054     case QMetaType::Double:
0055         trMessage = trMessage.subs(value.toDouble());
0056         break;
0057     case QMetaType::Char:
0058         trMessage = trMessage.subs(value.toChar());
0059         break;
0060     default:
0061         if (value.canConvert<QString>()) {
0062             trMessage = trMessage.subs(value.toString());
0063         } else {
0064             trMessage = trMessage.subs(QStringLiteral("???"));
0065             qCWarning(KI18N) << "couldn't convert" << value << "to translate";
0066         }
0067     }
0068 }
0069 
0070 static void resolveMessage(KLocalizedString &trMessage,
0071                            const QVariant &param1,
0072                            const QVariant &param2,
0073                            const QVariant &param3,
0074                            const QVariant &param4,
0075                            const QVariant &param5,
0076                            const QVariant &param6,
0077                            const QVariant &param7,
0078                            const QVariant &param8,
0079                            const QVariant &param9,
0080                            const QVariant &param10 = QVariant())
0081 {
0082     if (param1.isValid()) {
0083         subsVariant(trMessage, param1);
0084     }
0085     if (param2.isValid()) {
0086         subsVariant(trMessage, param2);
0087     }
0088     if (param3.isValid()) {
0089         subsVariant(trMessage, param3);
0090     }
0091     if (param4.isValid()) {
0092         subsVariant(trMessage, param4);
0093     }
0094     if (param5.isValid()) {
0095         subsVariant(trMessage, param5);
0096     }
0097     if (param6.isValid()) {
0098         subsVariant(trMessage, param6);
0099     }
0100     if (param7.isValid()) {
0101         subsVariant(trMessage, param7);
0102     }
0103     if (param8.isValid()) {
0104         subsVariant(trMessage, param8);
0105     }
0106     if (param9.isValid()) {
0107         subsVariant(trMessage, param9);
0108     }
0109     if (param10.isValid()) {
0110         subsVariant(trMessage, param10);
0111     }
0112 }
0113 
0114 static void resolvePlural(KLocalizedString &trMessage, const QVariant &param)
0115 {
0116     trMessage = trMessage.subs(param.toInt());
0117 }
0118 
0119 QString KLocalizedContext::i18n(const QString &message,
0120                                 const QVariant &param1,
0121                                 const QVariant &param2,
0122                                 const QVariant &param3,
0123                                 const QVariant &param4,
0124                                 const QVariant &param5,
0125                                 const QVariant &param6,
0126                                 const QVariant &param7,
0127                                 const QVariant &param8,
0128                                 const QVariant &param9,
0129                                 const QVariant &param10) const
0130 {
0131     if (message.isEmpty()) {
0132         qCWarning(KI18N) << "i18n() needs at least one parameter";
0133         return QString();
0134     }
0135 
0136     Q_D(const KLocalizedContext);
0137     KLocalizedString trMessage;
0138     if (!d->m_translationDomain.isEmpty()) {
0139         trMessage = ki18nd(d->m_translationDomain.toUtf8().constData(), message.toUtf8().constData());
0140     } else {
0141         trMessage = ki18n(message.toUtf8().constData());
0142     }
0143 
0144     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0145 
0146     return trMessage.toString();
0147 }
0148 
0149 QString KLocalizedContext::i18nc(const QString &context,
0150                                  const QString &message,
0151                                  const QVariant &param1,
0152                                  const QVariant &param2,
0153                                  const QVariant &param3,
0154                                  const QVariant &param4,
0155                                  const QVariant &param5,
0156                                  const QVariant &param6,
0157                                  const QVariant &param7,
0158                                  const QVariant &param8,
0159                                  const QVariant &param9,
0160                                  const QVariant &param10) const
0161 {
0162     if (context.isEmpty() || message.isEmpty()) {
0163         qCWarning(KI18N) << "i18nc() needs at least two arguments";
0164         return QString();
0165     }
0166 
0167     Q_D(const KLocalizedContext);
0168     KLocalizedString trMessage;
0169     if (!d->m_translationDomain.isEmpty()) {
0170         trMessage = ki18ndc(d->m_translationDomain.toUtf8().constData(), context.toUtf8().constData(), message.toUtf8().constData());
0171     } else {
0172         trMessage = ki18nc(context.toUtf8().constData(), message.toUtf8().constData());
0173     }
0174 
0175     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0176 
0177     return trMessage.toString();
0178 }
0179 
0180 QString KLocalizedContext::i18np(const QString &singular,
0181                                  const QString &plural,
0182                                  const QVariant &param1,
0183                                  const QVariant &param2,
0184                                  const QVariant &param3,
0185                                  const QVariant &param4,
0186                                  const QVariant &param5,
0187                                  const QVariant &param6,
0188                                  const QVariant &param7,
0189                                  const QVariant &param8,
0190                                  const QVariant &param9,
0191                                  const QVariant &param10) const
0192 {
0193     if (singular.isEmpty() || plural.isEmpty()) {
0194         qCWarning(KI18N) << "i18np() needs at least two arguments";
0195         return QString();
0196     }
0197 
0198     Q_D(const KLocalizedContext);
0199     KLocalizedString trMessage;
0200     if (!d->m_translationDomain.isEmpty()) {
0201         trMessage = ki18ndp(d->m_translationDomain.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0202     } else {
0203         trMessage = ki18np(singular.toUtf8().constData(), plural.toUtf8().constData());
0204     }
0205 
0206     resolvePlural(trMessage, param1);
0207     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0208 
0209     return trMessage.toString();
0210 }
0211 
0212 QString KLocalizedContext::i18ncp(const QString &context,
0213                                   const QString &singular,
0214                                   const QString &plural,
0215                                   const QVariant &param1,
0216                                   const QVariant &param2,
0217                                   const QVariant &param3,
0218                                   const QVariant &param4,
0219                                   const QVariant &param5,
0220                                   const QVariant &param6,
0221                                   const QVariant &param7,
0222                                   const QVariant &param8,
0223                                   const QVariant &param9,
0224                                   const QVariant &param10) const
0225 {
0226     if (context.isEmpty() || singular.isEmpty() || plural.isEmpty()) {
0227         qCWarning(KI18N) << "i18ncp() needs at least three arguments";
0228         return QString();
0229     }
0230 
0231     Q_D(const KLocalizedContext);
0232     KLocalizedString trMessage;
0233     if (!d->m_translationDomain.isEmpty()) {
0234         trMessage =
0235             ki18ndcp(d->m_translationDomain.toUtf8().constData(), context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0236     } else {
0237         trMessage = ki18ncp(context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0238     }
0239 
0240     resolvePlural(trMessage, param1);
0241     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0242 
0243     return trMessage.toString();
0244 }
0245 
0246 QString KLocalizedContext::i18nd(const QString &domain,
0247                                  const QString &message,
0248                                  const QVariant &param1,
0249                                  const QVariant &param2,
0250                                  const QVariant &param3,
0251                                  const QVariant &param4,
0252                                  const QVariant &param5,
0253                                  const QVariant &param6,
0254                                  const QVariant &param7,
0255                                  const QVariant &param8,
0256                                  const QVariant &param9,
0257                                  const QVariant &param10) const
0258 {
0259     if (domain.isEmpty() || message.isEmpty()) {
0260         qCWarning(KI18N) << "i18nd() needs at least two parameters";
0261         return QString();
0262     }
0263 
0264     KLocalizedString trMessage = ki18nd(domain.toUtf8().constData(), message.toUtf8().constData());
0265 
0266     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0267 
0268     return trMessage.toString();
0269 }
0270 
0271 QString KLocalizedContext::i18ndc(const QString &domain,
0272                                   const QString &context,
0273                                   const QString &message,
0274                                   const QVariant &param1,
0275                                   const QVariant &param2,
0276                                   const QVariant &param3,
0277                                   const QVariant &param4,
0278                                   const QVariant &param5,
0279                                   const QVariant &param6,
0280                                   const QVariant &param7,
0281                                   const QVariant &param8,
0282                                   const QVariant &param9,
0283                                   const QVariant &param10) const
0284 {
0285     if (domain.isEmpty() || context.isEmpty() || message.isEmpty()) {
0286         qCWarning(KI18N) << "i18ndc() needs at least three arguments";
0287         return QString();
0288     }
0289 
0290     KLocalizedString trMessage = ki18ndc(domain.toUtf8().constData(), context.toUtf8().constData(), message.toUtf8().constData());
0291 
0292     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0293 
0294     return trMessage.toString();
0295 }
0296 
0297 QString KLocalizedContext::i18ndp(const QString &domain,
0298                                   const QString &singular,
0299                                   const QString &plural,
0300                                   const QVariant &param1,
0301                                   const QVariant &param2,
0302                                   const QVariant &param3,
0303                                   const QVariant &param4,
0304                                   const QVariant &param5,
0305                                   const QVariant &param6,
0306                                   const QVariant &param7,
0307                                   const QVariant &param8,
0308                                   const QVariant &param9,
0309                                   const QVariant &param10) const
0310 {
0311     if (domain.isEmpty() || singular.isEmpty() || plural.isEmpty()) {
0312         qCWarning(KI18N) << "i18ndp() needs at least three arguments";
0313         return QString();
0314     }
0315 
0316     KLocalizedString trMessage = ki18ndp(domain.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0317 
0318     resolvePlural(trMessage, param1);
0319     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0320 
0321     return trMessage.toString();
0322 }
0323 
0324 QString KLocalizedContext::i18ndcp(const QString &domain,
0325                                    const QString &context,
0326                                    const QString &singular,
0327                                    const QString &plural,
0328                                    const QVariant &param1,
0329                                    const QVariant &param2,
0330                                    const QVariant &param3,
0331                                    const QVariant &param4,
0332                                    const QVariant &param5,
0333                                    const QVariant &param6,
0334                                    const QVariant &param7,
0335                                    const QVariant &param8,
0336                                    const QVariant &param9,
0337                                    const QVariant &param10) const
0338 {
0339     if (domain.isEmpty() || context.isEmpty() || singular.isEmpty() || plural.isEmpty()) {
0340         qCWarning(KI18N) << "i18ndcp() needs at least four arguments";
0341         return QString();
0342     }
0343 
0344     KLocalizedString trMessage =
0345         ki18ndcp(domain.toUtf8().constData(), context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0346 
0347     resolvePlural(trMessage, param1);
0348     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0349 
0350     return trMessage.toString();
0351 }
0352 
0353 /////////////////////////
0354 
0355 QString KLocalizedContext::xi18n(const QString &message,
0356                                  const QVariant &param1,
0357                                  const QVariant &param2,
0358                                  const QVariant &param3,
0359                                  const QVariant &param4,
0360                                  const QVariant &param5,
0361                                  const QVariant &param6,
0362                                  const QVariant &param7,
0363                                  const QVariant &param8,
0364                                  const QVariant &param9,
0365                                  const QVariant &param10) const
0366 {
0367     if (message.isEmpty()) {
0368         qCWarning(KI18N) << "xi18n() needs at least one parameter";
0369         return QString();
0370     }
0371 
0372     Q_D(const KLocalizedContext);
0373     KLocalizedString trMessage;
0374     if (!d->m_translationDomain.isEmpty()) {
0375         trMessage = kxi18nd(d->m_translationDomain.toUtf8().constData(), message.toUtf8().constData());
0376     } else {
0377         trMessage = kxi18n(message.toUtf8().constData());
0378     }
0379 
0380     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0381 
0382     return trMessage.toString();
0383 }
0384 
0385 QString KLocalizedContext::xi18nc(const QString &context,
0386                                   const QString &message,
0387                                   const QVariant &param1,
0388                                   const QVariant &param2,
0389                                   const QVariant &param3,
0390                                   const QVariant &param4,
0391                                   const QVariant &param5,
0392                                   const QVariant &param6,
0393                                   const QVariant &param7,
0394                                   const QVariant &param8,
0395                                   const QVariant &param9,
0396                                   const QVariant &param10) const
0397 {
0398     if (context.isEmpty() || message.isEmpty()) {
0399         qCWarning(KI18N) << "xi18nc() needs at least two arguments";
0400         return QString();
0401     }
0402 
0403     Q_D(const KLocalizedContext);
0404     KLocalizedString trMessage;
0405     if (!d->m_translationDomain.isEmpty()) {
0406         trMessage = kxi18ndc(d->m_translationDomain.toUtf8().constData(), context.toUtf8().constData(), message.toUtf8().constData());
0407     } else {
0408         trMessage = kxi18nc(context.toUtf8().constData(), message.toUtf8().constData());
0409     }
0410 
0411     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0412 
0413     return trMessage.toString();
0414 }
0415 
0416 QString KLocalizedContext::xi18np(const QString &singular,
0417                                   const QString &plural,
0418                                   const QVariant &param1,
0419                                   const QVariant &param2,
0420                                   const QVariant &param3,
0421                                   const QVariant &param4,
0422                                   const QVariant &param5,
0423                                   const QVariant &param6,
0424                                   const QVariant &param7,
0425                                   const QVariant &param8,
0426                                   const QVariant &param9,
0427                                   const QVariant &param10) const
0428 {
0429     if (singular.isEmpty() || plural.isEmpty()) {
0430         qCWarning(KI18N) << "xi18np() needs at least two arguments";
0431         return QString();
0432     }
0433 
0434     Q_D(const KLocalizedContext);
0435     KLocalizedString trMessage;
0436     if (!d->m_translationDomain.isEmpty()) {
0437         trMessage = kxi18ndp(d->m_translationDomain.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0438     } else {
0439         trMessage = kxi18np(singular.toUtf8().constData(), plural.toUtf8().constData());
0440     }
0441 
0442     resolvePlural(trMessage, param1);
0443     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0444 
0445     return trMessage.toString();
0446 }
0447 
0448 QString KLocalizedContext::xi18ncp(const QString &context,
0449                                    const QString &singular,
0450                                    const QString &plural,
0451                                    const QVariant &param1,
0452                                    const QVariant &param2,
0453                                    const QVariant &param3,
0454                                    const QVariant &param4,
0455                                    const QVariant &param5,
0456                                    const QVariant &param6,
0457                                    const QVariant &param7,
0458                                    const QVariant &param8,
0459                                    const QVariant &param9,
0460                                    const QVariant &param10) const
0461 {
0462     if (context.isEmpty() || singular.isEmpty() || plural.isEmpty()) {
0463         qCWarning(KI18N) << "xi18ncp() needs at least three arguments";
0464         return QString();
0465     }
0466 
0467     Q_D(const KLocalizedContext);
0468     KLocalizedString trMessage;
0469     if (!d->m_translationDomain.isEmpty()) {
0470         trMessage =
0471             kxi18ndcp(d->m_translationDomain.toUtf8().constData(), context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0472     } else {
0473         trMessage = kxi18ncp(context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0474     }
0475 
0476     resolvePlural(trMessage, param1);
0477     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0478 
0479     return trMessage.toString();
0480 }
0481 
0482 QString KLocalizedContext::xi18nd(const QString &domain,
0483                                   const QString &message,
0484                                   const QVariant &param1,
0485                                   const QVariant &param2,
0486                                   const QVariant &param3,
0487                                   const QVariant &param4,
0488                                   const QVariant &param5,
0489                                   const QVariant &param6,
0490                                   const QVariant &param7,
0491                                   const QVariant &param8,
0492                                   const QVariant &param9,
0493                                   const QVariant &param10) const
0494 {
0495     if (domain.isEmpty() || message.isEmpty()) {
0496         qCWarning(KI18N) << "xi18nd() needs at least two parameters";
0497         return QString();
0498     }
0499 
0500     KLocalizedString trMessage = kxi18nd(domain.toUtf8().constData(), message.toUtf8().constData());
0501 
0502     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0503 
0504     return trMessage.toString();
0505 }
0506 
0507 QString KLocalizedContext::xi18ndc(const QString &domain,
0508                                    const QString &context,
0509                                    const QString &message,
0510                                    const QVariant &param1,
0511                                    const QVariant &param2,
0512                                    const QVariant &param3,
0513                                    const QVariant &param4,
0514                                    const QVariant &param5,
0515                                    const QVariant &param6,
0516                                    const QVariant &param7,
0517                                    const QVariant &param8,
0518                                    const QVariant &param9,
0519                                    const QVariant &param10) const
0520 {
0521     if (domain.isEmpty() || context.isEmpty() || message.isEmpty()) {
0522         qCWarning(KI18N) << "x18ndc() needs at least three arguments";
0523         return QString();
0524     }
0525 
0526     KLocalizedString trMessage = kxi18ndc(domain.toUtf8().constData(), context.toUtf8().constData(), message.toUtf8().constData());
0527 
0528     resolveMessage(trMessage, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0529 
0530     return trMessage.toString();
0531 }
0532 
0533 QString KLocalizedContext::xi18ndp(const QString &domain,
0534                                    const QString &singular,
0535                                    const QString &plural,
0536                                    const QVariant &param1,
0537                                    const QVariant &param2,
0538                                    const QVariant &param3,
0539                                    const QVariant &param4,
0540                                    const QVariant &param5,
0541                                    const QVariant &param6,
0542                                    const QVariant &param7,
0543                                    const QVariant &param8,
0544                                    const QVariant &param9,
0545                                    const QVariant &param10) const
0546 {
0547     if (domain.isEmpty() || singular.isEmpty() || plural.isEmpty()) {
0548         qCWarning(KI18N) << "xi18ndp() needs at least three arguments";
0549         return QString();
0550     }
0551 
0552     KLocalizedString trMessage = kxi18ndp(domain.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0553 
0554     resolvePlural(trMessage, param1);
0555     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0556 
0557     return trMessage.toString();
0558 }
0559 
0560 QString KLocalizedContext::xi18ndcp(const QString &domain,
0561                                     const QString &context,
0562                                     const QString &singular,
0563                                     const QString &plural,
0564                                     const QVariant &param1,
0565                                     const QVariant &param2,
0566                                     const QVariant &param3,
0567                                     const QVariant &param4,
0568                                     const QVariant &param5,
0569                                     const QVariant &param6,
0570                                     const QVariant &param7,
0571                                     const QVariant &param8,
0572                                     const QVariant &param9,
0573                                     const QVariant &param10) const
0574 {
0575     if (domain.isEmpty() || context.isEmpty() || singular.isEmpty() || plural.isEmpty()) {
0576         qCWarning(KI18N) << "xi18ndcp() needs at least four arguments";
0577         return QString();
0578     }
0579 
0580     KLocalizedString trMessage =
0581         kxi18ndcp(domain.toUtf8().constData(), context.toUtf8().constData(), singular.toUtf8().constData(), plural.toUtf8().constData());
0582 
0583     resolvePlural(trMessage, param1);
0584     resolveMessage(trMessage, param2, param3, param4, param5, param6, param7, param8, param9, param10);
0585 
0586     return trMessage.toString();
0587 }
0588 
0589 #include "moc_klocalizedcontext.cpp"