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 * @internal
34 *
35 * Split the compound raw font name into family and foundry.
36 *
37 * @param name the raw font name reported by Qt
38 * @param family the storage for family name
39 * @param foundry the storage for foundry name
40 */
41inline void splitFontString(QStringView name, QString *family, QString *foundry = nullptr)
42{
43 int p1 = name.indexOf(c: QLatin1Char('['));
44 if (p1 < 0) {
45 if (family) {
46 *family = name.trimmed().toString();
47 }
48 if (foundry) {
49 foundry->clear();
50 }
51 } else {
52 int p2 = name.indexOf(c: QLatin1Char(']'), from: p1);
53 p2 = p2 > p1 ? p2 : name.length();
54 if (family) {
55 *family = name.left(n: p1).trimmed().toString();
56 }
57 if (foundry) {
58 *foundry = name.mid(pos: p1 + 1, n: p2 - p1 - 1).trimmed().toString();
59 }
60 }
61}
62
63/**
64 * @internal
65 *
66 * Translate the font name for the user.
67 * Primarily for generic fonts like Serif, Sans-Serif, etc.
68 *
69 * @param name the raw font name reported by Qt
70 * @return translated font name
71 */
72inline QString translateFontName(QStringView name)
73{
74 QString family;
75 QString foundry;
76 splitFontString(name, family: &family, foundry: &foundry);
77
78 // Obtain any regular translations for the family and foundry.
79 QString trFamily = QCoreApplication::translate(context: "FontHelpers", key: family.toUtf8().constData(), disambiguation: "@item Font name");
80 QString trFoundry = foundry;
81 if (!foundry.isEmpty()) {
82 trFoundry = QCoreApplication::translate(context: "FontHelpers", key: foundry.toUtf8().constData(), disambiguation: "@item Font foundry");
83 }
84
85 // Assemble full translation.
86 QString trfont;
87 if (foundry.isEmpty()) {
88 // i18n: Filter by which the translators can translate, or otherwise
89 // operate on the font names not put up for regular translation.
90 trfont = QCoreApplication::translate(context: "FontHelpers", key: "%1", disambiguation: "@item Font name").arg(a: trFamily);
91 } else {
92 // i18n: Filter by which the translators can translate, or otherwise
93 // operate on the font names not put up for regular translation.
94 trfont = QCoreApplication::translate(context: "FontHelpers", key: "%1 [%2]", disambiguation: "@item Font name [foundry]").arg(args&: trFamily, args&: trFoundry);
95 }
96 return trfont;
97}
98
99static bool fontFamilyCompare(const QString &a, const QString &b)
100{
101 return QString::localeAwareCompare(s1: a, s2: b) < 0;
102}
103
104using FontFamiliesMap = std::map<QString, QString, decltype(fontFamilyCompare) *>;
105
106/**
107 * @internal
108 *
109 * Compose locale-aware sorted list of translated font names,
110 * with generic fonts handled in a special way.
111 * The mapping of translated to raw names can be reported too if required.
112 *
113 * @param names raw font names as reported by Qt
114 * @param trToRawNames storage for mapping of translated to raw names
115 * @return sorted list of translated font names
116 */
117inline FontFamiliesMap translateFontNameList(const QStringList &names)
118{
119 FontFamiliesMap trMap(fontFamilyCompare);
120
121 for (const QString &fName : names) {
122 trMap.insert(x: {translateFontName(name: fName), fName});
123 }
124
125 return trMap;
126}
127
128#endif
129

source code of kwidgetsaddons/src/fonthelpers_p.h