1/*
2 SPDX-FileCopyrightText: 2008 Chusslove Illich <caslav.ilic@gmx.net>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6#ifndef FONTHELPERS_P_H
7#define FONTHELPERS_P_H
8
9// i18n-related helpers for fonts, common to KFont* widgets.
10
11#include <QCoreApplication>
12#include <QString>
13#include <QStringList>
14
15#include <map>
16
17#ifdef NEVERDEFINE // never true
18// Font names up for translation, listed for extraction.
19
20//: Generic sans serif font presented in font choosers. When selected,
21//: the system will choose a real font, mandated by distro settings.
22QT_TRANSLATE_NOOP3("FontHelpers", "Sans Serif", "@item Font name");
23//: Generic serif font presented in font choosers. When selected,
24//: the system will choose a real font, mandated by distro settings.
25QT_TRANSLATE_NOOP3("FontHelpers", "Serif", "@item Font name");
26//: Generic monospace font presented in font choosers. When selected,
27//: the system will choose a real font, mandated by distro settings.
28QT_TRANSLATE_NOOP3("FontHelpers", "Monospace", "@item Font name");
29
30#endif
31
32/*
33 * Split the compound raw font name into family and foundry.
34 *
35 * name the raw font name reported by Qt
36 * family the storage for family name
37 * foundry the storage for foundry name
38 */
39inline void splitFontString(QStringView name, QString *family, QString *foundry = nullptr)
40{
41 int p1 = name.indexOf(c: QLatin1Char('['));
42 if (p1 < 0) {
43 if (family) {
44 *family = name.trimmed().toString();
45 }
46 if (foundry) {
47 foundry->clear();
48 }
49 } else {
50 int p2 = name.indexOf(c: QLatin1Char(']'), from: p1);
51 p2 = p2 > p1 ? p2 : name.length();
52 if (family) {
53 *family = name.left(n: p1).trimmed().toString();
54 }
55 if (foundry) {
56 *foundry = name.mid(pos: p1 + 1, n: p2 - p1 - 1).trimmed().toString();
57 }
58 }
59}
60
61/*!
62 * @internal
63 *
64 * Translate the font name for the user.
65 * Primarily for generic fonts like Serif, Sans-Serif, etc.
66 *
67 * \a name the raw font name reported by Qt
68 * @return translated font name
69 */
70inline QString translateFontName(QStringView name)
71{
72 QString family;
73 QString foundry;
74 splitFontString(name, family: &family, foundry: &foundry);
75
76 // Obtain any regular translations for the family and foundry.
77 QString trFamily = QCoreApplication::translate(context: "FontHelpers", key: family.toUtf8().constData(), disambiguation: "@item Font name");
78 QString trFoundry = foundry;
79 if (!foundry.isEmpty()) {
80 trFoundry = QCoreApplication::translate(context: "FontHelpers", key: foundry.toUtf8().constData(), disambiguation: "@item Font foundry");
81 }
82
83 // Assemble full translation.
84 QString trfont;
85 if (foundry.isEmpty()) {
86 // i18n: Filter by which the translators can translate, or otherwise
87 // operate on the font names not put up for regular translation.
88 trfont = QCoreApplication::translate(context: "FontHelpers", key: "%1", disambiguation: "@item Font name").arg(a: trFamily);
89 } else {
90 // i18n: Filter by which the translators can translate, or otherwise
91 // operate on the font names not put up for regular translation.
92 trfont = QCoreApplication::translate(context: "FontHelpers", key: "%1 [%2]", disambiguation: "@item Font name [foundry]").arg(args&: trFamily, args&: trFoundry);
93 }
94 return trfont;
95}
96
97static bool fontFamilyCompare(const QString &a, const QString &b)
98{
99 return QString::localeAwareCompare(s1: a, s2: b) < 0;
100}
101
102using FontFamiliesMap = std::map<QString, QString, decltype(fontFamilyCompare) *>;
103
104/*!
105 * @internal
106 *
107 * Compose locale-aware sorted list of translated font names,
108 * with generic fonts handled in a special way.
109 * The mapping of translated to raw names can be reported too if required.
110 *
111 * \a names raw font names as reported by Qt
112 * \a trToRawNames storage for mapping of translated to raw names
113 * @return sorted list of translated font names
114 */
115inline FontFamiliesMap translateFontNameList(const QStringList &names)
116{
117 FontFamiliesMap trMap(fontFamilyCompare);
118
119 for (const QString &fName : names) {
120 trMap.insert(x: {translateFontName(name: fName), fName});
121 }
122
123 return trMap;
124}
125
126#endif
127

source code of kwidgetsaddons/src/fonthelpers_p.h