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 ¶m1, 0072 const QVariant ¶m2, 0073 const QVariant ¶m3, 0074 const QVariant ¶m4, 0075 const QVariant ¶m5, 0076 const QVariant ¶m6, 0077 const QVariant ¶m7, 0078 const QVariant ¶m8, 0079 const QVariant ¶m9, 0080 const QVariant ¶m10 = 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 ¶m) 0115 { 0116 trMessage = trMessage.subs(param.toInt()); 0117 } 0118 0119 QString KLocalizedContext::i18n(const QString &message, 0120 const QVariant ¶m1, 0121 const QVariant ¶m2, 0122 const QVariant ¶m3, 0123 const QVariant ¶m4, 0124 const QVariant ¶m5, 0125 const QVariant ¶m6, 0126 const QVariant ¶m7, 0127 const QVariant ¶m8, 0128 const QVariant ¶m9, 0129 const QVariant ¶m10) 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 ¶m1, 0152 const QVariant ¶m2, 0153 const QVariant ¶m3, 0154 const QVariant ¶m4, 0155 const QVariant ¶m5, 0156 const QVariant ¶m6, 0157 const QVariant ¶m7, 0158 const QVariant ¶m8, 0159 const QVariant ¶m9, 0160 const QVariant ¶m10) 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 ¶m1, 0183 const QVariant ¶m2, 0184 const QVariant ¶m3, 0185 const QVariant ¶m4, 0186 const QVariant ¶m5, 0187 const QVariant ¶m6, 0188 const QVariant ¶m7, 0189 const QVariant ¶m8, 0190 const QVariant ¶m9, 0191 const QVariant ¶m10) 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 ¶m1, 0216 const QVariant ¶m2, 0217 const QVariant ¶m3, 0218 const QVariant ¶m4, 0219 const QVariant ¶m5, 0220 const QVariant ¶m6, 0221 const QVariant ¶m7, 0222 const QVariant ¶m8, 0223 const QVariant ¶m9, 0224 const QVariant ¶m10) 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 ¶m1, 0249 const QVariant ¶m2, 0250 const QVariant ¶m3, 0251 const QVariant ¶m4, 0252 const QVariant ¶m5, 0253 const QVariant ¶m6, 0254 const QVariant ¶m7, 0255 const QVariant ¶m8, 0256 const QVariant ¶m9, 0257 const QVariant ¶m10) 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 ¶m1, 0275 const QVariant ¶m2, 0276 const QVariant ¶m3, 0277 const QVariant ¶m4, 0278 const QVariant ¶m5, 0279 const QVariant ¶m6, 0280 const QVariant ¶m7, 0281 const QVariant ¶m8, 0282 const QVariant ¶m9, 0283 const QVariant ¶m10) 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 ¶m1, 0301 const QVariant ¶m2, 0302 const QVariant ¶m3, 0303 const QVariant ¶m4, 0304 const QVariant ¶m5, 0305 const QVariant ¶m6, 0306 const QVariant ¶m7, 0307 const QVariant ¶m8, 0308 const QVariant ¶m9, 0309 const QVariant ¶m10) 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 ¶m1, 0329 const QVariant ¶m2, 0330 const QVariant ¶m3, 0331 const QVariant ¶m4, 0332 const QVariant ¶m5, 0333 const QVariant ¶m6, 0334 const QVariant ¶m7, 0335 const QVariant ¶m8, 0336 const QVariant ¶m9, 0337 const QVariant ¶m10) 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 ¶m1, 0357 const QVariant ¶m2, 0358 const QVariant ¶m3, 0359 const QVariant ¶m4, 0360 const QVariant ¶m5, 0361 const QVariant ¶m6, 0362 const QVariant ¶m7, 0363 const QVariant ¶m8, 0364 const QVariant ¶m9, 0365 const QVariant ¶m10) 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 ¶m1, 0388 const QVariant ¶m2, 0389 const QVariant ¶m3, 0390 const QVariant ¶m4, 0391 const QVariant ¶m5, 0392 const QVariant ¶m6, 0393 const QVariant ¶m7, 0394 const QVariant ¶m8, 0395 const QVariant ¶m9, 0396 const QVariant ¶m10) 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 ¶m1, 0419 const QVariant ¶m2, 0420 const QVariant ¶m3, 0421 const QVariant ¶m4, 0422 const QVariant ¶m5, 0423 const QVariant ¶m6, 0424 const QVariant ¶m7, 0425 const QVariant ¶m8, 0426 const QVariant ¶m9, 0427 const QVariant ¶m10) 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 ¶m1, 0452 const QVariant ¶m2, 0453 const QVariant ¶m3, 0454 const QVariant ¶m4, 0455 const QVariant ¶m5, 0456 const QVariant ¶m6, 0457 const QVariant ¶m7, 0458 const QVariant ¶m8, 0459 const QVariant ¶m9, 0460 const QVariant ¶m10) 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 ¶m1, 0485 const QVariant ¶m2, 0486 const QVariant ¶m3, 0487 const QVariant ¶m4, 0488 const QVariant ¶m5, 0489 const QVariant ¶m6, 0490 const QVariant ¶m7, 0491 const QVariant ¶m8, 0492 const QVariant ¶m9, 0493 const QVariant ¶m10) 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 ¶m1, 0511 const QVariant ¶m2, 0512 const QVariant ¶m3, 0513 const QVariant ¶m4, 0514 const QVariant ¶m5, 0515 const QVariant ¶m6, 0516 const QVariant ¶m7, 0517 const QVariant ¶m8, 0518 const QVariant ¶m9, 0519 const QVariant ¶m10) 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 ¶m1, 0537 const QVariant ¶m2, 0538 const QVariant ¶m3, 0539 const QVariant ¶m4, 0540 const QVariant ¶m5, 0541 const QVariant ¶m6, 0542 const QVariant ¶m7, 0543 const QVariant ¶m8, 0544 const QVariant ¶m9, 0545 const QVariant ¶m10) 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 ¶m1, 0565 const QVariant ¶m2, 0566 const QVariant ¶m3, 0567 const QVariant ¶m4, 0568 const QVariant ¶m5, 0569 const QVariant ¶m6, 0570 const QVariant ¶m7, 0571 const QVariant ¶m8, 0572 const QVariant ¶m9, 0573 const QVariant ¶m10) 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"