File indexing completed on 2024-05-12 04:42:08
0001 /* 0002 SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef KOSMINDOORMAP_LOCALIZATION_P_H 0008 #define KOSMINDOORMAP_LOCALIZATION_P_H 0009 0010 #include "localization.h" 0011 0012 #include <KLocalizedString> 0013 #include <KLazyLocalizedString> 0014 0015 #include <QCoreApplication> 0016 #include <QLocale> 0017 0018 #include <cstring> 0019 #include <iterator> 0020 0021 namespace KOSMIndoorMap { 0022 0023 struct ValueMapEntry 0024 { 0025 const char *keyName; 0026 const KLazyLocalizedString label; 0027 }; 0028 0029 template <typename MapEntry, std::size_t N> 0030 inline constexpr bool isSortedLookupTable(const MapEntry(&map)[N]) 0031 { 0032 #if __cplusplus > 201703L && defined(__GNUC__) && !defined(__clang__) 0033 return std::is_sorted(std::begin(map), std::end(map), [](const auto &lhs, const auto &rhs) { 0034 return std::strcmp(lhs.keyName, rhs.keyName) < 0; 0035 }); 0036 #else 0037 Q_UNUSED(map); 0038 return true; 0039 #endif 0040 } 0041 0042 template <typename MapEntry, std::size_t N> 0043 inline QString translateValue(const char *keyName, const MapEntry(&map)[N], Localization::TranslationOption opt = Localization::ReturnUnknownKey) 0044 { 0045 const auto it = std::lower_bound(std::begin(map), std::end(map), keyName, [](const auto &lhs, auto rhs) { 0046 return std::strcmp(lhs.keyName, rhs) < 0; 0047 }); 0048 if (it == std::end(map) || std::strcmp((*it).keyName, keyName) != 0) { 0049 return opt == Localization::ReturnUnknownKey ? QString::fromUtf8(keyName) : QString(); 0050 } 0051 0052 return (*it).label.toString(); 0053 } 0054 0055 template <typename MapEntry, std::size_t N> 0056 inline bool hasTranslatedValue(const char *value, const MapEntry(&map)[N]) 0057 { 0058 const auto it = std::lower_bound(std::begin(map), std::end(map), value, [](const auto &lhs, auto rhs) { 0059 return std::strcmp(lhs.keyName, rhs) < 0; 0060 }); 0061 return it != std::end(map) && std::strcmp((*it).keyName, value) == 0; 0062 } 0063 0064 template <typename MapEntry, std::size_t N> 0065 inline QString translateValues(const QByteArray &values, const MapEntry(&map)[N], Localization::TranslationOption opt = Localization::ReturnUnknownKey) 0066 { 0067 const auto l = values.split(';'); 0068 QStringList out; 0069 out.reserve(l.size()); 0070 for (const auto &value : l) { 0071 const auto s = translateValue(value.constData(), map, opt); 0072 if (!s.isEmpty() && !out.contains(s)) { 0073 out.push_back(s); 0074 } 0075 } 0076 return QLocale().createSeparatedList(out); 0077 } 0078 0079 } 0080 0081 #endif