1/* This file is part of the KDE libraries
2 SPDX-FileCopyrightText: 2006, 2013 Chusslove Illich <caslav.ilic@gmx.net>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6#ifndef KLOCALIZEDSTRING_H
7#define KLOCALIZEDSTRING_H
8
9#include <ki18n_export.h>
10
11#include <QChar>
12#include <QLatin1Char>
13#include <QSet>
14#include <QString>
15#include <QStringList>
16
17#include <kuitsetup.h>
18
19// enforce header to be parsed before redefining i18n* with preprocessor macros
20// depending on TRANSLATION_DOMAIN (see bottom of file)
21#include <klocalizedcontext.h>
22
23class KLocalizedStringPrivate;
24class KLazyLocalizedString;
25
26/*!
27 * \class KLocalizedString
28 * \inmodule KI18n
29 *
30 * \brief Class for producing and handling localized messages.
31 *
32 * KLocalizedString handles translation and
33 * argument substitution and formatting of user-visible text.
34 *
35 * KLocalizedString instances are usually not constructed directly,
36 * but through one of the wrapper *i18n* calls.
37 *
38 * For detailed information on how to use KI18n functions please refer
39 * to prg_guide.
40 */
41class KI18N_EXPORT KLocalizedString
42{
43 friend class KLocalizedStringPrivate;
44 friend class KLazyLocalizedString;
45
46 friend KLocalizedString KI18N_EXPORT ki18n(const char *text);
47 friend KLocalizedString KI18N_EXPORT ki18nc(const char *context, const char *text);
48 friend KLocalizedString KI18N_EXPORT ki18np(const char *singular, const char *plural);
49 friend KLocalizedString KI18N_EXPORT ki18ncp(const char *context, const char *singular, const char *plural);
50 friend KLocalizedString KI18N_EXPORT ki18nd(const char *domain, const char *text);
51 friend KLocalizedString KI18N_EXPORT ki18ndc(const char *domain, const char *context, const char *text);
52 friend KLocalizedString KI18N_EXPORT ki18ndp(const char *domain, const char *singular, const char *plural);
53 friend KLocalizedString KI18N_EXPORT ki18ndcp(const char *domain, const char *context, const char *singular, const char *plural);
54
55 friend KLocalizedString KI18N_EXPORT kxi18n(const char *text);
56 friend KLocalizedString KI18N_EXPORT kxi18nc(const char *context, const char *text);
57 friend KLocalizedString KI18N_EXPORT kxi18np(const char *singular, const char *plural);
58 friend KLocalizedString KI18N_EXPORT kxi18ncp(const char *context, const char *singular, const char *plural);
59 friend KLocalizedString KI18N_EXPORT kxi18nd(const char *domain, const char *text);
60 friend KLocalizedString KI18N_EXPORT kxi18ndc(const char *domain, const char *context, const char *text);
61 friend KLocalizedString KI18N_EXPORT kxi18ndp(const char *domain, const char *singular, const char *plural);
62 friend KLocalizedString KI18N_EXPORT kxi18ndcp(const char *domain, const char *context, const char *singular, const char *plural);
63
64public:
65 /*!
66 * Construct an empty message.
67 *
68 * Direct construction is used when another KLocalizedString instance,
69 * obtained by one of ki18n* calls, should later be assigned
70 * to directly constructed instance.
71 * Before the assignment happens, directly constructed instance
72 * is not valid for finalization by toString methods.
73 *
74 * \sa isEmpty
75 */
76 explicit KLocalizedString();
77
78 KLocalizedString(const KLocalizedString &rhs);
79
80 KLocalizedString &operator=(const KLocalizedString &rhs);
81
82 ~KLocalizedString();
83
84 /*!
85 * Check whether the message is empty.
86 *
87 * The message is considered empty if the object was constructed
88 * via the default constructor.
89 *
90 * Empty messages are not valid for finalization.
91 * The behavior of calling toString on them is undefined.
92 * In debug mode, an error mark may appear in the returned string.
93 *
94 * Returns \c true if the message is empty, \c false otherwise
95 */
96 bool isEmpty() const;
97
98 /*!
99 * Finalize the translation.
100 *
101 * Creates translated QString, with placeholders substituted
102 * by arguments given by KLocalizedString::subs methods.
103 * Translated text is searched for and arguments are formatted
104 * based on the global locale.
105 *
106 * If there was any mismatch between placeholders and arguments,
107 * in debug mode the returned string may contain error marks.
108 *
109 * Returns finalized translation
110 */
111 Q_REQUIRED_RESULT QString toString() const;
112
113 /*!
114 * Like toString, but look for translation only in given languages.
115 *
116 * Given languages override languages defined by the global locale,
117 * and any languages set earlier using withLanguages.
118 * If \a languages is empty, original message is returned.
119 *
120 * \a languages list of language codes (by decreasing priority)
121 * Returns finalized translation
122 */
123 Q_REQUIRED_RESULT QString toString(const QStringList &languages) const;
124
125 /*!
126 * Like toString, but look for translation in the given domain.
127 *
128 * Given domain overrides any set earlier using withDomain.
129 *
130 * \a domain the translation domain
131 *
132 * Returns finalized translation
133 */
134 Q_REQUIRED_RESULT QString toString(const char *domain) const;
135
136 /*!
137 * Like toString, but resolve KUIT markup into given visual format.
138 *
139 * Given visual format overrides that implied by the context UI marker
140 * or set earlier using withFormat.
141 * If the message is not markup-aware,
142 * this is same as toString without arguments.
143 *
144 * \a format the target visual format
145 *
146 * Returns finalized translation
147 */
148 Q_REQUIRED_RESULT QString toString(Kuit::VisualFormat format) const;
149
150 /*!
151 * Indicate to look for translation only in given languages.
152 *
153 * \a languages list of language codes (by decreasing priority)
154 *
155 * Returns updated KLocalizedString
156 */
157 Q_REQUIRED_RESULT KLocalizedString withLanguages(const QStringList &languages) const;
158
159 /*!
160 * Indicate to look for translation in the given domain.
161 *
162 * \a domain the translation domain
163 * Returns updated KLocalizedString
164 */
165 Q_REQUIRED_RESULT KLocalizedString withDomain(const char *domain) const;
166
167 /*!
168 * Indicate to resolve KUIT markup into given visual format.
169 *
170 * If the message is not markup-aware, this has no effect.
171 *
172 * \a format the target visual format
173 *
174 * Returns updated KLocalizedString
175 */
176 Q_REQUIRED_RESULT KLocalizedString withFormat(Kuit::VisualFormat format) const;
177
178 /*!
179 * Substitute an int argument into the message.
180 *
181 * \a a the argument
182 *
183 * \a fieldWidth width of the formatted field, padded by spaces.
184 * Positive value aligns right, negative aligns left
185 *
186 * \a base the radix used to represent the number as a string.
187 * Valid values range from 2 to 36
188 *
189 * \a fillChar the character used to fill up the empty places when
190 * field width is greater than argument width
191 *
192 * Returns updated KLocalizedString
193 */
194 Q_REQUIRED_RESULT KLocalizedString subs(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
195
196 /*!
197 * Substitute an unsigned int argument into the message.
198 *
199 * \a a the argument
200 *
201 * \a fieldWidth width of the formatted field, padded by spaces.
202 * Positive value aligns right, negative aligns left
203 *
204 * \a base the radix used to represent the number as a string.
205 * Valid values range from 2 to 36
206 *
207 * \a fillChar the character used to fill up the empty places when
208 * field width is greater than argument width
209 *
210 * Returns updated KLocalizedString
211 */
212 Q_REQUIRED_RESULT KLocalizedString subs(uint a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
213
214 /*!
215 * Substitute a long argument into the message.
216 *
217 * \a a the argument
218 *
219 * \a fieldWidth width of the formatted field, padded by spaces.
220 * Positive value aligns right, negative aligns left
221 *
222 * \a base the radix used to represent the number as a string.
223 * Valid values range from 2 to 36
224 *
225 * \a fillChar the character used to fill up the empty places when
226 * field width is greater than argument width
227 *
228 * Returns updated KLocalizedString
229 */
230 Q_REQUIRED_RESULT KLocalizedString subs(long a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
231
232 /*!
233 * Substitute an unsigned long argument into the message.
234 *
235 * \a a the argument
236 *
237 * \a fieldWidth width of the formatted field, padded by spaces.
238 * Positive value aligns right, negative aligns left
239 *
240 * \a base the radix used to represent the number as a string.
241 * Valid values range from 2 to 36
242 *
243 * \a fillChar the character used to fill up the empty places when
244 * field width is greater than argument width
245 *
246 * Returns updated KLocalizedString
247 */
248 Q_REQUIRED_RESULT KLocalizedString subs(ulong a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
249
250 /*!
251 * Substitute a long long argument into the message.
252 *
253 * \a a the argument
254 *
255 * \a fieldWidth width of the formatted field, padded by spaces.
256 * Positive value aligns right, negative aligns left
257 *
258 * \a base the radix used to represent the number as a string.
259 * Valid values range from 2 to 36
260 *
261 * \a fillChar the character used to fill up the empty places when
262 * field width is greater than argument width
263 *
264 * Returns updated KLocalizedString
265 */
266 Q_REQUIRED_RESULT KLocalizedString subs(qlonglong a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
267
268 /*!
269 * Substitute an unsigned long long argument into the message.
270 *
271 * \a a the argument
272 *
273 * \a fieldWidth width of the formatted field, padded by spaces.
274 * Positive value aligns right, negative aligns left
275 *
276 * \a base the radix used to represent the number as a string.
277 * Valid values range from 2 to 36
278 *
279 * \a fillChar the character used to fill up the empty places when
280 * field width is greater than argument width
281 *
282 * Returns updated KLocalizedString
283 */
284 Q_REQUIRED_RESULT KLocalizedString subs(qulonglong a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char(' ')) const;
285
286 /*!
287 * Substitute a double argument into the message.
288 *
289 * \a a the argument
290 *
291 * \a fieldWidth width of the formatted field, padded by spaces.
292 * Positive value aligns right, negative aligns left
293 *
294 * \a format type of floating point formatting, like in QString::arg
295 *
296 * \a precision number of digits after the decimal separator
297 *
298 * \a fillChar the character used to fill up the empty places when
299 * field width is greater than argument width
300 *
301 * Returns updated KLocalizedString
302 */
303 Q_REQUIRED_RESULT KLocalizedString subs(double a, int fieldWidth = 0, char format = 'g', int precision = -1, QChar fillChar = QLatin1Char(' ')) const;
304
305 /*!
306 * Substitute a QChar argument into the message.
307 *
308 * \a a the argument
309 *
310 * \a fieldWidth width of the formatted field, padded by spaces.
311 * Positive value aligns right, negative aligns left
312 *
313 * \a fillChar the character used to fill up the empty places when
314 * field width is greater than argument width
315 *
316 * Returns updated KLocalizedString
317 */
318 Q_REQUIRED_RESULT KLocalizedString subs(QChar a, int fieldWidth = 0, QChar fillChar = QLatin1Char(' ')) const;
319
320 /*!
321 * Substitute a QString argument into the message.
322 *
323 * \a a the argument
324 *
325 * \a fieldWidth width of the formatted field, padded by spaces.
326 * Positive value aligns right, negative aligns left
327 *
328 * \a fillChar the character used to fill up the empty places when
329 * field width is greater than argument width
330 *
331 * Returns updated KLocalizedString
332 */
333 Q_REQUIRED_RESULT KLocalizedString subs(const QString &a, int fieldWidth = 0, QChar fillChar = QLatin1Char(' ')) const;
334
335 /*!
336 * Substitute another KLocalizedString into the message.
337 *
338 * \a a the argument
339 *
340 * \a fieldWidth width of the formatted field, padded by spaces.
341 * Positive value aligns right, negative aligns left
342 *
343 * \a fillChar the character used to fill up the empty places when
344 * field width is greater than argument width
345 *
346 * Returns updated KLocalizedString
347 */
348 Q_REQUIRED_RESULT KLocalizedString subs(const KLocalizedString &a, int fieldWidth = 0, QChar fillChar = QLatin1Char(' ')) const;
349
350 /*!
351 * Add dynamic context to the message.
352 *
353 * See dyn_ctxt for use cases.
354 *
355 * \a key context key
356 *
357 * \a value context value
358 *
359 * Returns updated KLocalizedString
360 */
361 Q_REQUIRED_RESULT KLocalizedString inContext(const QString &key, const QString &value) const;
362
363 /*!
364 * Relax matching between placeholders and arguments.
365 *
366 * Normally the placeholders should start from %1 and have no gaps,
367 * and on finalization there must be exactly as many arguments
368 * supplied through subs methods as there are unique plaecholders.
369 * If this is not satisfied, in debug mode warnings are printed
370 * and the finalized string may contain error marks.
371 *
372 * This method relaxes the placeholder-argument matching,
373 * such that there must only be an argument available for
374 * every present unique placeholder (taking placeholder numbers
375 * to be 1-based indices into the argument list).
376 * This can come useful in some situations.
377 *
378 * Returns updated KLocalizedString
379 */
380 Q_REQUIRED_RESULT KLocalizedString relaxSubs() const;
381
382 /*!
383 * Do not resolve KUIT markup.
384 *
385 * If the message is markup-aware
386 * (constructed by one of *xi18n* calls),
387 * this function can be used to make it non-markup-aware.
388 * This may be useful for debugging markup.
389 *
390 * Returns updated KLocalizedString
391 */
392 Q_REQUIRED_RESULT KLocalizedString ignoreMarkup() const;
393
394 /*!
395 * Returns the untranslated text.
396 *
397 * \since 5.64
398 */
399 Q_REQUIRED_RESULT QByteArray untranslatedText() const;
400
401 /*!
402 * Set the given domain as application's main domain.
403 *
404 * This function must be called in applications, in order to have
405 * any translations at all. It should never be called in libraries.
406 * This allows to check whether the application is translated
407 * into a given language, so that if it is not, translations from
408 * underlying libraries will not appear even if they are translated.
409 * This prevents mixing of translated and untranslated text
410 * in the user interface.
411 *
412 * This function should be called right after creating the instance
413 * of QCoreApplication or one of its subclasses. At that time the locale
414 * setup has been made, including what is hooked into the
415 * QCoreApplication startup, like KXMLGUI's language switching support.
416 * So the initialisation done by this function sees all the data it should.
417 *
418 * \a domain the translation domain of the application
419 */
420 static void setApplicationDomain(const QByteArray &domain);
421
422 /*!
423 * Get the application's main translation domain.
424 *
425 * Returns the domain set by setApplicationDomain.
426 */
427 static QByteArray applicationDomain();
428
429 /*!
430 * Get the languages for which translations will be made.
431 *
432 * Returned languages are ordered with decreasing priority.
433 *
434 * Returns languages ordered list of language codes
435 * \sa setLanguages
436 * \sa clearLanguages
437 *
438 * \since 5.20.0
439 */
440 static QStringList languages();
441
442 /*!
443 * Set the languages for which translations will be made.
444 *
445 * This overrides the languages provided by the locale.
446 * Languages should be ordered with decreasing priority.
447 *
448 * \a languages ordered list of language codes
449 *
450 * \sa setLocale
451 * \sa clearLanguages
452 * \sa languages
453 */
454 static void setLanguages(const QStringList &languages);
455
456 /*!
457 * Clear override languages.
458 *
459 * This clears the override languages, going back to those
460 * provided by the locale.
461 *
462 * \sa setLanguages
463 * \sa languages
464 */
465 static void clearLanguages();
466
467 /*!
468 * Check whether the translation catalog file in the given language
469 * for the set application translation domain exists.
470 *
471 * \a language the language code to check
472 *
473 * Returns \c true if the translation catalog for \a language exits,
474 * \c false otherwise
475 * \sa setApplicationDomain
476 */
477 static bool isApplicationTranslatedInto(const QString &language);
478
479 /*!
480 * \since 5.0
481 *
482 * Get the languages for which there exists the translation catalog file
483 * for the set application translation domain.
484 *
485 * The application domain is set by setApplicationDomain.
486 * If the application domain was not set, empty set is returned.
487 * If the application domain was set, the language set will always
488 * contain at least the source code language (en_US).
489 *
490 * Returns set of language codes for existing translation catalogs
491 * \sa setApplicationDomain
492 */
493 static QSet<QString> availableApplicationTranslations();
494
495 /*!
496 * \since 5.0
497 *
498 * Get the languages for which a translation catalog file
499 * for the passed translation domain exists.
500 *
501 * If the translation domain was not specified in the
502 * domain parameter an empty set is returned.
503 *
504 * If the application domain was set, the language set will always
505 * contain at least the source code language (en_US).
506 *
507 * \a domain query for translations of a specific domain, if an empty
508 * QByteArray is passed, an empty set will be returned
509 *
510 * Returns set of language codes for existing translation catalogs
511 * \sa setApplicationDomain
512 * \sa availableApplicationTranslations
513 */
514 static QSet<QString> availableDomainTranslations(const QByteArray &domain);
515
516 /*!
517 * Load locales for a domain from a specific location
518 * This is useful for resources which have their translation files
519 * outside of the usual $XDG_DATA_DIRS/locales location
520 *
521 * \a domain the domain to load resources from
522 *
523 * \a path the full file path to the locale directory
524 */
525 static void addDomainLocaleDir(const QByteArray &domain, const QString &path);
526
527 /*!
528 * Find a path to the localized file for the given original path.
529 *
530 * This is intended mainly for non-text resources (images, sounds, etc).
531 * Text resources should be handled in more specific ways.
532 *
533 * Possible localized paths are checked in turn by priority of set
534 * languages, in form of <dirname>/l10n/<lang>/<basename>,
535 * where <dirname> and <basename> are those of
536 * the original path, and <lang> is the language code.
537 *
538 * \a filePath path to the original file
539 *
540 * Returns path to the localized file if found, original path otherwise
541 */
542 Q_REQUIRED_RESULT static QString localizedFilePath(const QString &filePath);
543
544 /*!
545 * Remove accelerator marker from a UI text label.
546 *
547 * Accelerator marker is not always a plain ampersand (&),
548 * so it is not enough to just remove it by QString::remove.
549 * The label may contain escaped markers ("&&") which must be resolved
550 * and skipped, as well as CJK-style markers ("Foo (&F)") where
551 * the whole parenthesis construct should be removed.
552 * Therefore always use this function to remove accelerator marker
553 * from UI labels.
554 *
555 * \a label UI label which may contain an accelerator marker
556 *
557 * Returns label without the accelerator marker
558 */
559 Q_REQUIRED_RESULT static QString removeAcceleratorMarker(const QString &label);
560
561private:
562 // exported because called from inline KLazyLocalizedString::operator KLocalizedString()
563 KLocalizedString(const char *domain, const char *context, const char *text, const char *plural, bool markupAware);
564
565private:
566 // intentionally not a unique_ptr as this file gets included a lot and using a unique_ptr
567 // results in too many template instantiations
568 KLocalizedStringPrivate *const d;
569};
570
571// Do not document every multi-argument i18n* call separately,
572// but provide special quasi-calls that only qdoc sees.
573// Placed in front of ki18n* calls, because i18n* are more basic.
574#ifdef Q_QDOC
575
576/*!
577 * Translate a string and substitute any arguments.
578 *
579 * \a text string to translate
580 *
581 * \a arg arguments to insert (0 to 9),
582 * admissible types according to KLocalizedString::subs methods
583 *
584 * Returns translated string
585 *
586 * \relates KLocalizedString
587 */
588QString i18n(const char *text, const TYPE &arg...);
589
590/*!
591 * Translate a string with context and substitute any arguments.
592 *
593 * \a context context of the string
594 *
595 * \a text string to translate
596 *
597 * \a arg arguments to insert (0 to 9),
598 * admissible types according to KLocalizedString::subs methods
599 *
600 * Returns translated string
601 *
602 * \relates KLocalizedString
603 */
604QString i18nc(const char *context, const char *text, const TYPE &arg...);
605
606/*!
607 * Translate a string with plural and substitute any arguments.
608 *
609 * \a singular singular form of the string to translate
610 *
611 * \a plural plural form of the string to translate
612 *
613 * \a arg arguments to insert (0 to 9),
614 * admissible types according to KLocalizedString::subs methods
615 *
616 * Returns translated string
617 *
618 * \relates KLocalizedString
619 */
620QString i18np(const char *singular, const char *plural, const TYPE &arg...);
621
622/*!
623 * Translate a string with context and plural and substitute any arguments.
624 *
625 * \a context context of the string
626 *
627 * \a singular singular form of the string to translate
628 *
629 * \a plural plural form of the string to translate
630 *
631 * \a arg arguments to insert (0 to 9),
632 * admissible types according to KLocalizedString::subs methods
633 *
634 * Returns translated string
635 *
636 * \relates KLocalizedString
637 */
638QString i18ncp(const char *context, const char *singular, const char *plural, const TYPE &arg...);
639
640/*!
641 * Translate a string from domain and substitute any arguments.
642 *
643 * \a domain domain in which to look for translations
644 *
645 * \a text string to translate
646 *
647 * \a arg arguments to insert (0 to 9),
648 * admissible types according to KLocalizedString::subs methods
649 *
650 * Returns translated string
651 *
652 * \relates KLocalizedString
653 */
654QString i18nd(const char *domain, const char *text, const TYPE &arg...);
655
656/*!
657 * Translate a string from domain with context and substitute any arguments.
658 *
659 * \a domain domain in which to look for translations
660 *
661 * \a context context of the string
662 *
663 * \a text string to translate
664 *
665 * \a arg arguments to insert (0 to 9),
666 * admissible types according to KLocalizedString::subs methods
667 *
668 * Returns translated string
669 *
670 * \relates KLocalizedString
671 */
672QString i18ndc(const char *domain, const char *context, const char *text, const TYPE &arg...);
673
674/*!
675 * Translate a string from domain with plural and substitute any arguments.
676 *
677 * \a domain domain in which to look for translations
678 *
679 * \a singular singular form of the string to translate
680 *
681 * \a plural plural form of the string to translate
682 *
683 * \a arg arguments to insert (0 to 9),
684 * admissible types according to KLocalizedString::subs methods
685 *
686 * Returns translated string
687 *
688 * \relates KLocalizedString
689 */
690QString i18ndp(const char *domain, const char *singular, const char *plural, const TYPE &arg...);
691
692/*!
693 * Translate a string from domain with context and plural
694 * and substitute any arguments.
695 *
696 * \a domain domain in which to look for translations
697 *
698 * \a context context of the string
699 *
700 * \a singular singular form of the string to translate
701 *
702 * \a plural plural form of the string to translate
703 *
704 * \a arg arguments to insert (0 to 9),
705 * admissible types according to KLocalizedString::subs methods
706 *
707 * Returns translated string
708 *
709 * \relates KLocalizedString
710 */
711QString i18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const TYPE &arg...);
712
713/*!
714 * Translate a markup-aware string and substitute any arguments.
715 *
716 * \a text string to translate
717 *
718 * \a arg arguments to insert (0 to 9),
719 * admissible types according to KLocalizedString::subs methods
720 *
721 * Returns translated string
722 *
723 * \relates KLocalizedString
724 */
725QString xi18n(const char *text, const TYPE &arg...);
726
727/*!
728 * Translate a markup-aware string with context and substitute any arguments.
729 *
730 * \a context context of the string
731 *
732 * \a text string to translate
733 *
734 * \a arg arguments to insert (0 to 9),
735 * admissible types according to KLocalizedString::subs methods
736 *
737 * Returns translated string
738 *
739 * \relates KLocalizedString
740 */
741QString xi18nc(const char *context, const char *text, const TYPE &arg...);
742
743/*!
744 * Translate a markup-aware string with plural and substitute any arguments.
745 *
746 * \a singular singular form of the string to translate
747 *
748 * \a plural plural form of the string to translate
749 *
750 * \a arg arguments to insert (0 to 9),
751 * admissible types according to KLocalizedString::subs methods
752 *
753 * Returns translated string
754 *
755 * \relates KLocalizedString
756 */
757QString xi18np(const char *singular, const char *plural, const TYPE &arg...);
758
759/*!
760 * Translate a markup-aware string with context and plural
761 * and substitute any arguments.
762 *
763 * \a context context of the string
764 *
765 * \a singular singular form of the string to translate
766 *
767 * \a plural plural form of the string to translate
768 *
769 * \a arg arguments to insert (0 to 9),
770 * admissible types according to KLocalizedString::subs methods
771 *
772 * Returns translated string
773 *
774 * \relates KLocalizedString
775 */
776QString xi18ncp(const char *context, const char *singular, const char *plural, const TYPE &arg...);
777
778/*!
779 * Translate a markup-aware string from domain and substitute any arguments.
780 *
781 * \a domain domain in which to look for translations
782 *
783 * \a text string to translate
784 *
785 * \a arg arguments to insert (0 to 9),
786 * admissible types according to KLocalizedString::subs methods
787 *
788 * Returns translated string
789 *
790 * \relates KLocalizedString
791 */
792QString xi18nd(const char *domain, const char *text, const TYPE &arg...);
793
794/*!
795 * Translate a markup-aware string from domain with context
796 * and substitute any arguments.
797 *
798 * \a domain domain in which to look for translations
799 *
800 * \a context context of the string
801 *
802 * \a text string to translate
803 *
804 * \a arg arguments to insert (0 to 9),
805 * admissible types according to KLocalizedString::subs methods
806 *
807 * Returns translated string
808 *
809 * \relates KLocalizedString
810 */
811QString xi18ndc(const char *domain, const char *context, const char *text, const TYPE &arg...);
812
813/*!
814 * Translate a markup-aware string from domain with plural
815 * and substitute any arguments.
816 *
817 * \a domain domain in which to look for translations
818 *
819 * \a singular singular form of the string to translate
820 *
821 * \a plural plural form of the string to translate
822 *
823 * \a arg arguments to insert (0 to 9),
824 * admissible types according to KLocalizedString::subs methods
825 *
826 * Returns translated string
827 *
828 * \relates KLocalizedString
829 */
830QString xi18ndp(const char *domain, const char *singular, const char *plural, const TYPE &arg...);
831
832/*!
833 * Translate a markup-aware string from domain with context and plural
834 * and substitute any arguments.
835 *
836 * \a domain domain in which to look for translations
837 *
838 * \a context context of the string
839 *
840 * \a singular singular form of the string to translate
841 *
842 * \a plural plural form of the string to translate
843 *
844 * \a arg arguments to insert (0 to 9),
845 * admissible types according to KLocalizedString::subs methods
846 *
847 * Returns translated string
848 *
849 * \relates KLocalizedString
850 */
851QString xi18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const TYPE &arg...);
852
853#endif // Q_QDOC
854
855/*!
856 * Create non-finalized translated string.
857 *
858 * \a text string to translate
859 *
860 * Returns non-finalized translated string
861 *
862 * \relates KLocalizedString
863 */
864KLocalizedString KI18N_EXPORT ki18n(const char *text);
865
866/*!
867 * Create non-finalized translated string with context.
868 *
869 * \a context context of the string
870 *
871 * \a text string to translate
872 *
873 * Returns non-finalized translated string
874 *
875 * \relates KLocalizedString
876 */
877KLocalizedString KI18N_EXPORT ki18nc(const char *context, const char *text);
878
879/*!
880 * Create non-finalized translated string with plural.
881 *
882 * \a singular singular form of the string to translate
883 *
884 * \a plural plural form of the string to translate
885 *
886 * Returns non-finalized translated string
887 *
888 * \relates KLocalizedString
889 */
890KLocalizedString KI18N_EXPORT ki18np(const char *singular, const char *plural);
891
892/*!
893 * Create non-finalized translated string with context and plural.
894 *
895 * \a context context of the string
896 *
897 * \a singular singular form of the string to translate
898 *
899 * \a plural plural form of the string to translate
900 *
901 * Returns non-finalized translated string
902 *
903 * \relates KLocalizedString
904 */
905KLocalizedString KI18N_EXPORT ki18ncp(const char *context, const char *singular, const char *plural);
906
907/*!
908 * Create non-finalized translated string from domain.
909 *
910 * \a domain domain in which to look for translations
911 *
912 * \a text string to translate
913 *
914 * Returns non-finalized translated string
915 *
916 * \relates KLocalizedString
917 */
918KLocalizedString KI18N_EXPORT ki18nd(const char *domain, const char *text);
919
920/*!
921 * Create non-finalized translated string from domain with context.
922 *
923 * \a domain domain in which to look for translations
924 *
925 * \a context context of the string
926 *
927 * \a text string to translate
928 *
929 * Returns non-finalized translated string
930 *
931 * \relates KLocalizedString
932 */
933KLocalizedString KI18N_EXPORT ki18ndc(const char *domain, const char *context, const char *text);
934
935/*!
936 * Create non-finalized translated string from domain with plural.
937 *
938 * \a domain domain in which to look for translations
939 *
940 * \a singular singular form of the string to translate
941 *
942 * \a plural plural form of the string to translate
943 *
944 * Returns non-finalized translated string
945 *
946 * \relates KLocalizedString
947 */
948KLocalizedString KI18N_EXPORT ki18ndp(const char *domain, const char *singular, const char *plural);
949
950/*!
951 * Create non-finalized translated string from domain with context and plural.
952 *
953 * \a domain domain in which to look for translations
954 *
955 * \a context context of the string
956 *
957 * \a singular singular form of the string to translate
958 *
959 * \a plural plural form of the string to translate
960 *
961 * Returns non-finalized translated string
962 *
963 * \relates KLocalizedString
964 */
965KLocalizedString KI18N_EXPORT ki18ndcp(const char *domain, const char *context, const char *singular, const char *plural);
966
967/*!
968 * Create non-finalized markup-aware translated string.
969 *
970 * \a text string to translate
971 *
972 * Returns non-finalized translated string
973 *
974 * \relates KLocalizedString
975 */
976KLocalizedString KI18N_EXPORT kxi18n(const char *text);
977
978/*!
979 * Create non-finalized markup-aware translated string with context.
980 *
981 * \a context context of the string
982 *
983 * \a text string to translate
984 *
985 * Returns non-finalized translated string
986 *
987 * \relates KLocalizedString
988 */
989KLocalizedString KI18N_EXPORT kxi18nc(const char *context, const char *text);
990
991/*!
992 * Create non-finalized markup-aware translated string with plural.
993 *
994 * \a singular singular form of the string to translate
995 *
996 * \a plural plural form of the string to translate
997 *
998 * Returns non-finalized translated string
999 *
1000 * \relates KLocalizedString
1001 */
1002KLocalizedString KI18N_EXPORT kxi18np(const char *singular, const char *plural);
1003
1004/*!
1005 * Create non-finalized markup-aware translated string.
1006 * with context and plural.
1007 *
1008 * \a context context of the string
1009 *
1010 * \a singular singular form of the string to translate
1011 *
1012 * \a plural plural form of the string to translate
1013 *
1014 * Returns non-finalized translated string
1015 *
1016 * \relates KLocalizedString
1017 */
1018KLocalizedString KI18N_EXPORT kxi18ncp(const char *context, const char *singular, const char *plural);
1019
1020/*!
1021 * Create non-finalized markup-aware translated string from domain.
1022 *
1023 * \a domain domain in which to look for translations
1024 *
1025 * \a text string to translate
1026 *
1027 * Returns non-finalized translated string
1028 *
1029 * \relates KLocalizedString
1030 */
1031KLocalizedString KI18N_EXPORT kxi18nd(const char *domain, const char *text);
1032
1033/*!
1034 * Create non-finalized markup-aware translated string from domain with context.
1035 *
1036 * \a domain domain in which to look for translations
1037 *
1038 * \a context context of the string
1039 *
1040 * \a text string to translate
1041 *
1042 * Returns non-finalized translated string
1043 *
1044 * \relates KLocalizedString
1045 */
1046KLocalizedString KI18N_EXPORT kxi18ndc(const char *domain, const char *context, const char *text);
1047
1048/*!
1049 * Create non-finalized markup-aware translated string from domain with plural.
1050 *
1051 * \a domain domain in which to look for translations
1052 *
1053 * \a singular singular form of the string to translate
1054 *
1055 * \a plural plural form of the string to translate
1056 *
1057 * Returns non-finalized translated string
1058 *
1059 * \relates KLocalizedString
1060 */
1061KLocalizedString KI18N_EXPORT kxi18ndp(const char *domain, const char *singular, const char *plural);
1062
1063/*!
1064 * Create non-finalized markup-aware translated string from domain
1065 * with context and plural.
1066 *
1067 * \a domain domain in which to look for translations
1068 *
1069 * \a context context of the string
1070 *
1071 * \a singular singular form of the string to translate
1072 *
1073 * \a plural plural form of the string to translate
1074 *
1075 * Returns non-finalized translated string
1076 *
1077 * \relates KLocalizedString
1078 */
1079KLocalizedString KI18N_EXPORT kxi18ndcp(const char *domain, const char *context, const char *singular, const char *plural);
1080
1081/*!
1082 * Redirect Qt's uic-generated translation calls to Ki18n.
1083 *
1084 * Use -tr tr2i18n option to uic to have it redirect calls.
1085 *
1086 * \a text string to translate
1087 *
1088 * \a comment Qt equivalent of disambiguation context
1089 *
1090 * Returns translated string
1091 *
1092 * \relates KLocalizedString
1093 */
1094inline QString tr2i18n(const char *text, const char *comment = nullptr)
1095{
1096 if (comment && comment[0] && text && text[0]) {
1097 return ki18nc(context: comment, text).toString();
1098 } else if (text && text[0]) {
1099 return ki18n(text).toString();
1100 } else {
1101 return QString();
1102 }
1103}
1104
1105/*!
1106 * Like tr2i18n, but look for translation in a specific domain.
1107 *
1108 * Use -tr tr2i18nd option to uic to have it redirect calls.
1109 *
1110 * \a domain domain in which to look for translations
1111 *
1112 * \a text string to translate
1113 *
1114 * \a comment Qt equivalent of disambiguation context
1115 *
1116 * Returns translated string
1117 *
1118 * \relates KLocalizedString
1119 */
1120inline QString tr2i18nd(const char *domain, const char *text, const char *comment = nullptr)
1121{
1122 if (comment && comment[0] && text && text[0]) {
1123 return ki18ndc(domain, context: comment, text).toString();
1124 } else if (text && text[0]) {
1125 return ki18nd(domain, text).toString();
1126 } else {
1127 return QString();
1128 }
1129}
1130
1131/*!
1132 * Like tr2i18n, but when UI strings are KUIT markup-aware.
1133 *
1134 * Use -tr tr2xi18n option to uic to have it redirect calls.
1135 *
1136 * \a text markup-aware string to translate
1137 *
1138 * \a comment Qt equivalent of disambiguation context
1139 *
1140 * Returns translated string
1141 *
1142 * \relates KLocalizedString
1143 */
1144inline QString tr2xi18n(const char *text, const char *comment = nullptr)
1145{
1146 if (comment && comment[0] && text && text[0]) {
1147 return kxi18nc(context: comment, text).toString();
1148 } else if (text && text[0]) {
1149 return kxi18n(text).toString();
1150 } else {
1151 return QString();
1152 }
1153}
1154
1155/*!
1156 * Like tr2xi18n, but look for translation in a specific domain.
1157 *
1158 * Use -tr tr2xi18nd option to uic to have it redirect calls.
1159 *
1160 * \a domain domain in which to look for translations
1161 *
1162 * \a text markup-aware string to translate
1163 *
1164 * \a comment Qt equivalent of disambiguation context
1165 *
1166 * Returns translated string
1167 *
1168 * \relates KLocalizedString
1169 */
1170inline QString tr2xi18nd(const char *domain, const char *text, const char *comment = nullptr)
1171{
1172 if (comment && comment[0] && text && text[0]) {
1173 return kxi18ndc(domain, context: comment, text).toString();
1174 } else if (text && text[0]) {
1175 return kxi18nd(domain, text).toString();
1176 } else {
1177 return QString();
1178 }
1179}
1180
1181#ifndef Q_QDOC
1182
1183#ifndef NDEBUG
1184#define I18N_ERR_MSG String_literal_as_second_argument_to_i18n___Perhaps_you_need_i18nc_or_i18np
1185template<typename T, int s>
1186class I18nTypeCheck
1187{
1188public:
1189 static void I18N_ERR_MSG()
1190 {
1191 }
1192};
1193template<int s>
1194class I18nTypeCheck<char[s], s>
1195{
1196};
1197#define STATIC_ASSERT_NOT_LITERAL_STRING(T) I18nTypeCheck<T, sizeof(T)>::I18N_ERR_MSG();
1198#else
1199#define STATIC_ASSERT_NOT_LITERAL_STRING(T)
1200#endif
1201
1202// >>>>> Basic calls
1203// Autogenerated; contact maintainer for batch changes.
1204inline QString i18n(const char *text)
1205{
1206 return ki18n(text).toString();
1207}
1208template<typename A1>
1209inline QString i18n(const char *text, const A1 &a1)
1210{
1211 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1212 return ki18n(text).subs(a1).toString();
1213}
1214template<typename A1, typename A2>
1215inline QString i18n(const char *text, const A1 &a1, const A2 &a2)
1216{
1217 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1218 return ki18n(text).subs(a1).subs(a2).toString();
1219}
1220template<typename A1, typename A2, typename A3>
1221inline QString i18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
1222{
1223 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1224 return ki18n(text).subs(a1).subs(a2).subs(a3).toString();
1225}
1226template<typename A1, typename A2, typename A3, typename A4>
1227inline QString i18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1228{
1229 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1230 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1231}
1232template<typename A1, typename A2, typename A3, typename A4, typename A5>
1233inline QString i18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1234{
1235 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1236 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1237}
1238template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1239inline QString i18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1240{
1241 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1242 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1243}
1244template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1245inline 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)
1246{
1247 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1248 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1249}
1250template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1251inline 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)
1252{
1253 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1254 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1255}
1256template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1257inline QString
1258i18n(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)
1259{
1260 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1261 return ki18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1262}
1263// <<<<<<< End of basic calls
1264
1265// >>>>> Context calls
1266// Autogenerated; contact maintainer for batch changes.
1267inline QString i18nc(const char *context, const char *text)
1268{
1269 return ki18nc(context, text).toString();
1270}
1271template<typename A1>
1272inline QString i18nc(const char *context, const char *text, const A1 &a1)
1273{
1274 return ki18nc(context, text).subs(a1).toString();
1275}
1276template<typename A1, typename A2>
1277inline QString i18nc(const char *context, const char *text, const A1 &a1, const A2 &a2)
1278{
1279 return ki18nc(context, text).subs(a1).subs(a2).toString();
1280}
1281template<typename A1, typename A2, typename A3>
1282inline QString i18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
1283{
1284 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).toString();
1285}
1286template<typename A1, typename A2, typename A3, typename A4>
1287inline QString i18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1288{
1289 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1290}
1291template<typename A1, typename A2, typename A3, typename A4, typename A5>
1292inline QString i18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1293{
1294 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1295}
1296template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1297inline QString i18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1298{
1299 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1300}
1301template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1302inline QString i18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
1303{
1304 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1305}
1306template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1307inline QString
1308i18nc(const char *context, 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)
1309{
1310 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1311}
1312template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1313inline QString i18nc(const char *context,
1314 const char *text,
1315 const A1 &a1,
1316 const A2 &a2,
1317 const A3 &a3,
1318 const A4 &a4,
1319 const A5 &a5,
1320 const A6 &a6,
1321 const A7 &a7,
1322 const A8 &a8,
1323 const A9 &a9)
1324{
1325 return ki18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1326}
1327// <<<<< End of context calls
1328
1329// >>>>> Plural calls
1330// Autogenerated; contact maintainer for batch changes.
1331template<typename A1>
1332inline QString i18np(const char *singular, const char *plural, const A1 &a1)
1333{
1334 return ki18np(singular, plural).subs(a1).toString();
1335}
1336template<typename A1, typename A2>
1337inline QString i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2)
1338{
1339 return ki18np(singular, plural).subs(a1).subs(a2).toString();
1340}
1341template<typename A1, typename A2, typename A3>
1342inline QString i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
1343{
1344 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).toString();
1345}
1346template<typename A1, typename A2, typename A3, typename A4>
1347inline QString i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1348{
1349 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1350}
1351template<typename A1, typename A2, typename A3, typename A4, typename A5>
1352inline QString i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1353{
1354 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1355}
1356template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1357inline QString i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1358{
1359 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1360}
1361template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1362inline QString i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
1363{
1364 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1365}
1366template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1367inline QString
1368i18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
1369{
1370 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1371}
1372template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1373inline QString i18np(const char *singular,
1374 const char *plural,
1375 const A1 &a1,
1376 const A2 &a2,
1377 const A3 &a3,
1378 const A4 &a4,
1379 const A5 &a5,
1380 const A6 &a6,
1381 const A7 &a7,
1382 const A8 &a8,
1383 const A9 &a9)
1384{
1385 return ki18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1386}
1387// <<<<< End of plural calls
1388
1389// >>>>> Context-plural calls
1390// Autogenerated; contact maintainer for batch changes.
1391template<typename A1>
1392inline QString i18ncp(const char *context, const char *singular, const char *plural, const A1 &a1)
1393{
1394 return ki18ncp(context, singular, plural).subs(a1).toString();
1395}
1396template<typename A1, typename A2>
1397inline QString i18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2)
1398{
1399 return ki18ncp(context, singular, plural).subs(a1).subs(a2).toString();
1400}
1401template<typename A1, typename A2, typename A3>
1402inline QString i18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
1403{
1404 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).toString();
1405}
1406template<typename A1, typename A2, typename A3, typename A4>
1407inline QString i18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1408{
1409 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1410}
1411template<typename A1, typename A2, typename A3, typename A4, typename A5>
1412inline QString i18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1413{
1414 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1415}
1416template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1417inline QString
1418i18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1419{
1420 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1421}
1422template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1423inline QString i18ncp(const char *context,
1424 const char *singular,
1425 const char *plural,
1426 const A1 &a1,
1427 const A2 &a2,
1428 const A3 &a3,
1429 const A4 &a4,
1430 const A5 &a5,
1431 const A6 &a6,
1432 const A7 &a7)
1433{
1434 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1435}
1436template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1437inline QString i18ncp(const char *context,
1438 const char *singular,
1439 const char *plural,
1440 const A1 &a1,
1441 const A2 &a2,
1442 const A3 &a3,
1443 const A4 &a4,
1444 const A5 &a5,
1445 const A6 &a6,
1446 const A7 &a7,
1447 const A8 &a8)
1448{
1449 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1450}
1451template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1452inline QString i18ncp(const char *context,
1453 const char *singular,
1454 const char *plural,
1455 const A1 &a1,
1456 const A2 &a2,
1457 const A3 &a3,
1458 const A4 &a4,
1459 const A5 &a5,
1460 const A6 &a6,
1461 const A7 &a7,
1462 const A8 &a8,
1463 const A9 &a9)
1464{
1465 return ki18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1466}
1467// <<<<< End of context-plural calls
1468
1469// >>>>> Basic calls with domain
1470// Autogenerated; contact maintainer for batch changes.
1471inline QString i18nd(const char *domain, const char *text)
1472{
1473 return ki18nd(domain, text).toString();
1474}
1475template<typename A1>
1476inline QString i18nd(const char *domain, const char *text, const A1 &a1)
1477{
1478 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1479 return ki18nd(domain, text).subs(a1).toString();
1480}
1481template<typename A1, typename A2>
1482inline QString i18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2)
1483{
1484 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1485 return ki18nd(domain, text).subs(a1).subs(a2).toString();
1486}
1487template<typename A1, typename A2, typename A3>
1488inline QString i18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
1489{
1490 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1491 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).toString();
1492}
1493template<typename A1, typename A2, typename A3, typename A4>
1494inline QString i18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1495{
1496 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1497 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1498}
1499template<typename A1, typename A2, typename A3, typename A4, typename A5>
1500inline QString i18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1501{
1502 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1503 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1504}
1505template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1506inline QString i18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1507{
1508 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1509 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1510}
1511template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1512inline QString i18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
1513{
1514 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1515 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1516}
1517template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1518inline QString
1519i18nd(const char *domain, 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)
1520{
1521 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1522 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1523}
1524template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1525inline QString i18nd(const char *domain,
1526 const char *text,
1527 const A1 &a1,
1528 const A2 &a2,
1529 const A3 &a3,
1530 const A4 &a4,
1531 const A5 &a5,
1532 const A6 &a6,
1533 const A7 &a7,
1534 const A8 &a8,
1535 const A9 &a9)
1536{
1537 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1538 return ki18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1539}
1540// <<<<<<< End of basic calls with domain
1541
1542// >>>>> Context calls with domain
1543// Autogenerated; contact maintainer for batch changes.
1544inline QString i18ndc(const char *domain, const char *context, const char *text)
1545{
1546 return ki18ndc(domain, context, text).toString();
1547}
1548template<typename A1>
1549inline QString i18ndc(const char *domain, const char *context, const char *text, const A1 &a1)
1550{
1551 return ki18ndc(domain, context, text).subs(a1).toString();
1552}
1553template<typename A1, typename A2>
1554inline QString i18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2)
1555{
1556 return ki18ndc(domain, context, text).subs(a1).subs(a2).toString();
1557}
1558template<typename A1, typename A2, typename A3>
1559inline QString i18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
1560{
1561 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).toString();
1562}
1563template<typename A1, typename A2, typename A3, typename A4>
1564inline QString i18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1565{
1566 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1567}
1568template<typename A1, typename A2, typename A3, typename A4, typename A5>
1569inline QString i18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1570{
1571 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1572}
1573template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1574inline QString
1575i18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1576{
1577 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1578}
1579template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1580inline QString i18ndc(const char *domain,
1581 const char *context,
1582 const char *text,
1583 const A1 &a1,
1584 const A2 &a2,
1585 const A3 &a3,
1586 const A4 &a4,
1587 const A5 &a5,
1588 const A6 &a6,
1589 const A7 &a7)
1590{
1591 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1592}
1593template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1594inline QString i18ndc(const char *domain,
1595 const char *context,
1596 const char *text,
1597 const A1 &a1,
1598 const A2 &a2,
1599 const A3 &a3,
1600 const A4 &a4,
1601 const A5 &a5,
1602 const A6 &a6,
1603 const A7 &a7,
1604 const A8 &a8)
1605{
1606 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1607}
1608template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1609inline QString i18ndc(const char *domain,
1610 const char *context,
1611 const char *text,
1612 const A1 &a1,
1613 const A2 &a2,
1614 const A3 &a3,
1615 const A4 &a4,
1616 const A5 &a5,
1617 const A6 &a6,
1618 const A7 &a7,
1619 const A8 &a8,
1620 const A9 &a9)
1621{
1622 return ki18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1623}
1624// <<<<< End of context calls with domain
1625
1626// >>>>> Plural calls with domain
1627// Autogenerated; contact maintainer for batch changes.
1628template<typename A1>
1629inline QString i18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1)
1630{
1631 return ki18ndp(domain, singular, plural).subs(a1).toString();
1632}
1633template<typename A1, typename A2>
1634inline QString i18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2)
1635{
1636 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).toString();
1637}
1638template<typename A1, typename A2, typename A3>
1639inline QString i18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
1640{
1641 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).toString();
1642}
1643template<typename A1, typename A2, typename A3, typename A4>
1644inline QString i18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1645{
1646 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1647}
1648template<typename A1, typename A2, typename A3, typename A4, typename A5>
1649inline QString i18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1650{
1651 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1652}
1653template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1654inline QString
1655i18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1656{
1657 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1658}
1659template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1660inline QString i18ndp(const char *domain,
1661 const char *singular,
1662 const char *plural,
1663 const A1 &a1,
1664 const A2 &a2,
1665 const A3 &a3,
1666 const A4 &a4,
1667 const A5 &a5,
1668 const A6 &a6,
1669 const A7 &a7)
1670{
1671 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1672}
1673template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1674inline QString i18ndp(const char *domain,
1675 const char *singular,
1676 const char *plural,
1677 const A1 &a1,
1678 const A2 &a2,
1679 const A3 &a3,
1680 const A4 &a4,
1681 const A5 &a5,
1682 const A6 &a6,
1683 const A7 &a7,
1684 const A8 &a8)
1685{
1686 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1687}
1688template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1689inline QString i18ndp(const char *domain,
1690 const char *singular,
1691 const char *plural,
1692 const A1 &a1,
1693 const A2 &a2,
1694 const A3 &a3,
1695 const A4 &a4,
1696 const A5 &a5,
1697 const A6 &a6,
1698 const A7 &a7,
1699 const A8 &a8,
1700 const A9 &a9)
1701{
1702 return ki18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1703}
1704// <<<<< End of plural calls with domain
1705
1706// >>>>> Context-plural calls with domain
1707// Autogenerated; contact maintainer for batch changes.
1708template<typename A1>
1709inline QString i18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1)
1710{
1711 return ki18ndcp(domain, context, singular, plural).subs(a1).toString();
1712}
1713template<typename A1, typename A2>
1714inline QString i18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2)
1715{
1716 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).toString();
1717}
1718template<typename A1, typename A2, typename A3>
1719inline QString i18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
1720{
1721 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).toString();
1722}
1723template<typename A1, typename A2, typename A3, typename A4>
1724inline QString
1725i18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1726{
1727 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1728}
1729template<typename A1, typename A2, typename A3, typename A4, typename A5>
1730inline QString
1731i18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1732{
1733 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1734}
1735template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1736inline QString i18ndcp(const char *domain,
1737 const char *context,
1738 const char *singular,
1739 const char *plural,
1740 const A1 &a1,
1741 const A2 &a2,
1742 const A3 &a3,
1743 const A4 &a4,
1744 const A5 &a5,
1745 const A6 &a6)
1746{
1747 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1748}
1749template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1750inline QString i18ndcp(const char *domain,
1751 const char *context,
1752 const char *singular,
1753 const char *plural,
1754 const A1 &a1,
1755 const A2 &a2,
1756 const A3 &a3,
1757 const A4 &a4,
1758 const A5 &a5,
1759 const A6 &a6,
1760 const A7 &a7)
1761{
1762 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1763}
1764template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1765inline QString i18ndcp(const char *domain,
1766 const char *context,
1767 const char *singular,
1768 const char *plural,
1769 const A1 &a1,
1770 const A2 &a2,
1771 const A3 &a3,
1772 const A4 &a4,
1773 const A5 &a5,
1774 const A6 &a6,
1775 const A7 &a7,
1776 const A8 &a8)
1777{
1778 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1779}
1780template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1781inline QString i18ndcp(const char *domain,
1782 const char *context,
1783 const char *singular,
1784 const char *plural,
1785 const A1 &a1,
1786 const A2 &a2,
1787 const A3 &a3,
1788 const A4 &a4,
1789 const A5 &a5,
1790 const A6 &a6,
1791 const A7 &a7,
1792 const A8 &a8,
1793 const A9 &a9)
1794{
1795 return ki18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1796}
1797// <<<<< End of context-plural calls with domain
1798
1799// >>>>> Markup-aware basic calls
1800// Autogenerated; contact maintainer for batch changes.
1801inline QString xi18n(const char *text)
1802{
1803 return kxi18n(text).toString();
1804}
1805template<typename A1>
1806inline QString xi18n(const char *text, const A1 &a1)
1807{
1808 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1809 return kxi18n(text).subs(a1).toString();
1810}
1811template<typename A1, typename A2>
1812inline QString xi18n(const char *text, const A1 &a1, const A2 &a2)
1813{
1814 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1815 return kxi18n(text).subs(a1).subs(a2).toString();
1816}
1817template<typename A1, typename A2, typename A3>
1818inline QString xi18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
1819{
1820 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1821 return kxi18n(text).subs(a1).subs(a2).subs(a3).toString();
1822}
1823template<typename A1, typename A2, typename A3, typename A4>
1824inline QString xi18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1825{
1826 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1827 return kxi18n(text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1828}
1829template<typename A1, typename A2, typename A3, typename A4, typename A5>
1830inline QString xi18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1831{
1832 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1833 return kxi18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1834}
1835template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1836inline QString xi18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1837{
1838 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1839 return kxi18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1840}
1841template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1842inline QString xi18n(const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
1843{
1844 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1845 return kxi18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1846}
1847template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1848inline QString xi18n(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)
1849{
1850 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1851 return kxi18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1852}
1853template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1854inline QString
1855xi18n(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)
1856{
1857 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
1858 return kxi18n(text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1859}
1860// <<<<<<< End of markup-aware basic calls
1861
1862// >>>>> Markup-aware context calls
1863// Autogenerated; contact maintainer for batch changes.
1864inline QString xi18nc(const char *context, const char *text)
1865{
1866 return kxi18nc(context, text).toString();
1867}
1868template<typename A1>
1869inline QString xi18nc(const char *context, const char *text, const A1 &a1)
1870{
1871 return kxi18nc(context, text).subs(a1).toString();
1872}
1873template<typename A1, typename A2>
1874inline QString xi18nc(const char *context, const char *text, const A1 &a1, const A2 &a2)
1875{
1876 return kxi18nc(context, text).subs(a1).subs(a2).toString();
1877}
1878template<typename A1, typename A2, typename A3>
1879inline QString xi18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
1880{
1881 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).toString();
1882}
1883template<typename A1, typename A2, typename A3, typename A4>
1884inline QString xi18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1885{
1886 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1887}
1888template<typename A1, typename A2, typename A3, typename A4, typename A5>
1889inline QString xi18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1890{
1891 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1892}
1893template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1894inline QString xi18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1895{
1896 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1897}
1898template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1899inline QString xi18nc(const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
1900{
1901 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1902}
1903template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1904inline QString
1905xi18nc(const char *context, 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)
1906{
1907 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1908}
1909template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1910inline QString xi18nc(const char *context,
1911 const char *text,
1912 const A1 &a1,
1913 const A2 &a2,
1914 const A3 &a3,
1915 const A4 &a4,
1916 const A5 &a5,
1917 const A6 &a6,
1918 const A7 &a7,
1919 const A8 &a8,
1920 const A9 &a9)
1921{
1922 return kxi18nc(context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1923}
1924// <<<<< End of markup-aware context calls
1925
1926// >>>>> Markup-aware plural calls
1927// Autogenerated; contact maintainer for batch changes.
1928template<typename A1>
1929inline QString xi18np(const char *singular, const char *plural, const A1 &a1)
1930{
1931 return kxi18np(singular, plural).subs(a1).toString();
1932}
1933template<typename A1, typename A2>
1934inline QString xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2)
1935{
1936 return kxi18np(singular, plural).subs(a1).subs(a2).toString();
1937}
1938template<typename A1, typename A2, typename A3>
1939inline QString xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
1940{
1941 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).toString();
1942}
1943template<typename A1, typename A2, typename A3, typename A4>
1944inline QString xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
1945{
1946 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
1947}
1948template<typename A1, typename A2, typename A3, typename A4, typename A5>
1949inline QString xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
1950{
1951 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
1952}
1953template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
1954inline QString xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
1955{
1956 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
1957}
1958template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
1959inline QString
1960xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
1961{
1962 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
1963}
1964template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
1965inline QString
1966xi18np(const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
1967{
1968 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
1969}
1970template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
1971inline QString xi18np(const char *singular,
1972 const char *plural,
1973 const A1 &a1,
1974 const A2 &a2,
1975 const A3 &a3,
1976 const A4 &a4,
1977 const A5 &a5,
1978 const A6 &a6,
1979 const A7 &a7,
1980 const A8 &a8,
1981 const A9 &a9)
1982{
1983 return kxi18np(singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
1984}
1985// <<<<< End of markup-aware plural calls
1986
1987// >>>>> Markup-aware context-plural calls
1988// Autogenerated; contact maintainer for batch changes.
1989template<typename A1>
1990inline QString xi18ncp(const char *context, const char *singular, const char *plural, const A1 &a1)
1991{
1992 return kxi18ncp(context, singular, plural).subs(a1).toString();
1993}
1994template<typename A1, typename A2>
1995inline QString xi18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2)
1996{
1997 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).toString();
1998}
1999template<typename A1, typename A2, typename A3>
2000inline QString xi18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
2001{
2002 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).toString();
2003}
2004template<typename A1, typename A2, typename A3, typename A4>
2005inline QString xi18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
2006{
2007 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
2008}
2009template<typename A1, typename A2, typename A3, typename A4, typename A5>
2010inline QString xi18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
2011{
2012 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
2013}
2014template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
2015inline QString
2016xi18ncp(const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
2017{
2018 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
2019}
2020template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
2021inline QString xi18ncp(const char *context,
2022 const char *singular,
2023 const char *plural,
2024 const A1 &a1,
2025 const A2 &a2,
2026 const A3 &a3,
2027 const A4 &a4,
2028 const A5 &a5,
2029 const A6 &a6,
2030 const A7 &a7)
2031{
2032 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
2033}
2034template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
2035inline QString xi18ncp(const char *context,
2036 const char *singular,
2037 const char *plural,
2038 const A1 &a1,
2039 const A2 &a2,
2040 const A3 &a3,
2041 const A4 &a4,
2042 const A5 &a5,
2043 const A6 &a6,
2044 const A7 &a7,
2045 const A8 &a8)
2046{
2047 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
2048}
2049template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
2050inline QString xi18ncp(const char *context,
2051 const char *singular,
2052 const char *plural,
2053 const A1 &a1,
2054 const A2 &a2,
2055 const A3 &a3,
2056 const A4 &a4,
2057 const A5 &a5,
2058 const A6 &a6,
2059 const A7 &a7,
2060 const A8 &a8,
2061 const A9 &a9)
2062{
2063 return kxi18ncp(context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
2064}
2065// <<<<< End of markup-aware context-plural calls
2066
2067// >>>>> Markup-aware basic calls with domain
2068// Autogenerated; contact maintainer for batch changes.
2069inline QString xi18nd(const char *domain, const char *text)
2070{
2071 return kxi18nd(domain, text).toString();
2072}
2073template<typename A1>
2074inline QString xi18nd(const char *domain, const char *text, const A1 &a1)
2075{
2076 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2077 return kxi18nd(domain, text).subs(a1).toString();
2078}
2079template<typename A1, typename A2>
2080inline QString xi18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2)
2081{
2082 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2083 return kxi18nd(domain, text).subs(a1).subs(a2).toString();
2084}
2085template<typename A1, typename A2, typename A3>
2086inline QString xi18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
2087{
2088 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2089 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).toString();
2090}
2091template<typename A1, typename A2, typename A3, typename A4>
2092inline QString xi18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
2093{
2094 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2095 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
2096}
2097template<typename A1, typename A2, typename A3, typename A4, typename A5>
2098inline QString xi18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
2099{
2100 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2101 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
2102}
2103template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
2104inline QString xi18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
2105{
2106 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2107 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
2108}
2109template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
2110inline QString xi18nd(const char *domain, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
2111{
2112 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2113 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
2114}
2115template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
2116inline QString
2117xi18nd(const char *domain, 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)
2118{
2119 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2120 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
2121}
2122template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
2123inline QString xi18nd(const char *domain,
2124 const char *text,
2125 const A1 &a1,
2126 const A2 &a2,
2127 const A3 &a3,
2128 const A4 &a4,
2129 const A5 &a5,
2130 const A6 &a6,
2131 const A7 &a7,
2132 const A8 &a8,
2133 const A9 &a9)
2134{
2135 STATIC_ASSERT_NOT_LITERAL_STRING(A1)
2136 return kxi18nd(domain, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
2137}
2138// <<<<<<< End of markup-aware basic calls with domain
2139
2140// >>>>> Markup-aware context calls with domain
2141// Autogenerated; contact maintainer for batch changes.
2142inline QString xi18ndc(const char *domain, const char *context, const char *text)
2143{
2144 return kxi18ndc(domain, context, text).toString();
2145}
2146template<typename A1>
2147inline QString xi18ndc(const char *domain, const char *context, const char *text, const A1 &a1)
2148{
2149 return kxi18ndc(domain, context, text).subs(a1).toString();
2150}
2151template<typename A1, typename A2>
2152inline QString xi18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2)
2153{
2154 return kxi18ndc(domain, context, text).subs(a1).subs(a2).toString();
2155}
2156template<typename A1, typename A2, typename A3>
2157inline QString xi18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3)
2158{
2159 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).toString();
2160}
2161template<typename A1, typename A2, typename A3, typename A4>
2162inline QString xi18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
2163{
2164 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).toString();
2165}
2166template<typename A1, typename A2, typename A3, typename A4, typename A5>
2167inline QString xi18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
2168{
2169 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
2170}
2171template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
2172inline QString
2173xi18ndc(const char *domain, const char *context, const char *text, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
2174{
2175 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
2176}
2177template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
2178inline QString xi18ndc(const char *domain,
2179 const char *context,
2180 const char *text,
2181 const A1 &a1,
2182 const A2 &a2,
2183 const A3 &a3,
2184 const A4 &a4,
2185 const A5 &a5,
2186 const A6 &a6,
2187 const A7 &a7)
2188{
2189 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
2190}
2191template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
2192inline QString xi18ndc(const char *domain,
2193 const char *context,
2194 const char *text,
2195 const A1 &a1,
2196 const A2 &a2,
2197 const A3 &a3,
2198 const A4 &a4,
2199 const A5 &a5,
2200 const A6 &a6,
2201 const A7 &a7,
2202 const A8 &a8)
2203{
2204 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
2205}
2206template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
2207inline QString xi18ndc(const char *domain,
2208 const char *context,
2209 const char *text,
2210 const A1 &a1,
2211 const A2 &a2,
2212 const A3 &a3,
2213 const A4 &a4,
2214 const A5 &a5,
2215 const A6 &a6,
2216 const A7 &a7,
2217 const A8 &a8,
2218 const A9 &a9)
2219{
2220 return kxi18ndc(domain, context, text).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
2221}
2222// <<<<< End of markup-aware context calls with domain
2223
2224// >>>>> Markup-aware plural calls with domain
2225// Autogenerated; contact maintainer for batch changes.
2226template<typename A1>
2227inline QString xi18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1)
2228{
2229 return kxi18ndp(domain, singular, plural).subs(a1).toString();
2230}
2231template<typename A1, typename A2>
2232inline QString xi18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2)
2233{
2234 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).toString();
2235}
2236template<typename A1, typename A2, typename A3>
2237inline QString xi18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
2238{
2239 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).toString();
2240}
2241template<typename A1, typename A2, typename A3, typename A4>
2242inline QString xi18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
2243{
2244 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
2245}
2246template<typename A1, typename A2, typename A3, typename A4, typename A5>
2247inline QString xi18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
2248{
2249 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
2250}
2251template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
2252inline QString
2253xi18ndp(const char *domain, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
2254{
2255 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
2256}
2257template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
2258inline QString xi18ndp(const char *domain,
2259 const char *singular,
2260 const char *plural,
2261 const A1 &a1,
2262 const A2 &a2,
2263 const A3 &a3,
2264 const A4 &a4,
2265 const A5 &a5,
2266 const A6 &a6,
2267 const A7 &a7)
2268{
2269 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
2270}
2271template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
2272inline QString xi18ndp(const char *domain,
2273 const char *singular,
2274 const char *plural,
2275 const A1 &a1,
2276 const A2 &a2,
2277 const A3 &a3,
2278 const A4 &a4,
2279 const A5 &a5,
2280 const A6 &a6,
2281 const A7 &a7,
2282 const A8 &a8)
2283{
2284 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
2285}
2286template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
2287inline QString xi18ndp(const char *domain,
2288 const char *singular,
2289 const char *plural,
2290 const A1 &a1,
2291 const A2 &a2,
2292 const A3 &a3,
2293 const A4 &a4,
2294 const A5 &a5,
2295 const A6 &a6,
2296 const A7 &a7,
2297 const A8 &a8,
2298 const A9 &a9)
2299{
2300 return kxi18ndp(domain, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
2301}
2302// <<<<< End of markup-aware plural calls with domain
2303
2304// >>>>> Markup-aware context-plural calls with domain
2305// Autogenerated; contact maintainer for batch changes.
2306template<typename A1>
2307inline QString xi18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1)
2308{
2309 return kxi18ndcp(domain, context, singular, plural).subs(a1).toString();
2310}
2311template<typename A1, typename A2>
2312inline QString xi18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2)
2313{
2314 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).toString();
2315}
2316template<typename A1, typename A2, typename A3>
2317inline QString xi18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3)
2318{
2319 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).toString();
2320}
2321template<typename A1, typename A2, typename A3, typename A4>
2322inline QString
2323xi18ndcp(const char *domain, const char *context, const char *singular, const char *plural, const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
2324{
2325 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).toString();
2326}
2327template<typename A1, typename A2, typename A3, typename A4, typename A5>
2328inline QString xi18ndcp(const char *domain,
2329 const char *context,
2330 const char *singular,
2331 const char *plural,
2332 const A1 &a1,
2333 const A2 &a2,
2334 const A3 &a3,
2335 const A4 &a4,
2336 const A5 &a5)
2337{
2338 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).toString();
2339}
2340template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
2341inline QString xi18ndcp(const char *domain,
2342 const char *context,
2343 const char *singular,
2344 const char *plural,
2345 const A1 &a1,
2346 const A2 &a2,
2347 const A3 &a3,
2348 const A4 &a4,
2349 const A5 &a5,
2350 const A6 &a6)
2351{
2352 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).toString();
2353}
2354template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
2355inline QString xi18ndcp(const char *domain,
2356 const char *context,
2357 const char *singular,
2358 const char *plural,
2359 const A1 &a1,
2360 const A2 &a2,
2361 const A3 &a3,
2362 const A4 &a4,
2363 const A5 &a5,
2364 const A6 &a6,
2365 const A7 &a7)
2366{
2367 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).toString();
2368}
2369template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
2370inline QString xi18ndcp(const char *domain,
2371 const char *context,
2372 const char *singular,
2373 const char *plural,
2374 const A1 &a1,
2375 const A2 &a2,
2376 const A3 &a3,
2377 const A4 &a4,
2378 const A5 &a5,
2379 const A6 &a6,
2380 const A7 &a7,
2381 const A8 &a8)
2382{
2383 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).toString();
2384}
2385template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
2386inline QString xi18ndcp(const char *domain,
2387 const char *context,
2388 const char *singular,
2389 const char *plural,
2390 const A1 &a1,
2391 const A2 &a2,
2392 const A3 &a3,
2393 const A4 &a4,
2394 const A5 &a5,
2395 const A6 &a6,
2396 const A7 &a7,
2397 const A8 &a8,
2398 const A9 &a9)
2399{
2400 return kxi18ndcp(domain, context, singular, plural).subs(a1).subs(a2).subs(a3).subs(a4).subs(a5).subs(a6).subs(a7).subs(a8).subs(a9).toString();
2401}
2402// <<<<< End of markup-aware context-plural calls with domain
2403
2404#endif // Q_QDOC
2405
2406#endif // KLOCALIZEDSTRING_H
2407
2408#ifndef Q_QDOC
2409
2410// Outside of include guards, to be able to map and unmap domains
2411// by successive inclusions of this header
2412// preceded with different definitions of TRANSLATION_DOMAIN.
2413#ifdef TRANSLATION_DOMAIN
2414#define i18n(...) i18nd(TRANSLATION_DOMAIN, __VA_ARGS__)
2415#define i18nc(...) i18ndc(TRANSLATION_DOMAIN, __VA_ARGS__)
2416#define i18np(...) i18ndp(TRANSLATION_DOMAIN, __VA_ARGS__)
2417#define i18ncp(...) i18ndcp(TRANSLATION_DOMAIN, __VA_ARGS__)
2418#define ki18n(...) ki18nd(TRANSLATION_DOMAIN, __VA_ARGS__)
2419#define ki18nc(...) ki18ndc(TRANSLATION_DOMAIN, __VA_ARGS__)
2420#define ki18np(...) ki18ndp(TRANSLATION_DOMAIN, __VA_ARGS__)
2421#define ki18ncp(...) ki18ndcp(TRANSLATION_DOMAIN, __VA_ARGS__)
2422#define tr2i18n(...) tr2i18nd(TRANSLATION_DOMAIN, __VA_ARGS__)
2423#define xi18n(...) xi18nd(TRANSLATION_DOMAIN, __VA_ARGS__)
2424#define xi18nc(...) xi18ndc(TRANSLATION_DOMAIN, __VA_ARGS__)
2425#define xi18np(...) xi18ndp(TRANSLATION_DOMAIN, __VA_ARGS__)
2426#define xi18ncp(...) xi18ndcp(TRANSLATION_DOMAIN, __VA_ARGS__)
2427#define kxi18n(...) kxi18nd(TRANSLATION_DOMAIN, __VA_ARGS__)
2428#define kxi18nc(...) kxi18ndc(TRANSLATION_DOMAIN, __VA_ARGS__)
2429#define kxi18np(...) kxi18ndp(TRANSLATION_DOMAIN, __VA_ARGS__)
2430#define kxi18ncp(...) kxi18ndcp(TRANSLATION_DOMAIN, __VA_ARGS__)
2431#define tr2xi18n(...) tr2xi18nd(TRANSLATION_DOMAIN, __VA_ARGS__)
2432#else
2433#undef i18n
2434#undef i18nc
2435#undef i18np
2436#undef i18ncp
2437#undef ki18n
2438#undef ki18nc
2439#undef ki18np
2440#undef ki18ncp
2441#undef tr2i18n
2442#undef xi18n
2443#undef xi18nc
2444#undef xi18np
2445#undef xi18ncp
2446#undef kxi18n
2447#undef kxi18nc
2448#undef kxi18np
2449#undef kxi18ncp
2450#undef tr2xi18n
2451#endif
2452
2453#endif // Q_QDOC
2454

source code of ki18n/src/i18n/klocalizedstring.h