File indexing completed on 2024-04-28 11:31:05
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2009 Torsten Rahn <tackat@kde.org> 0004 // SPDX-FileCopyrightText: 2015 Ilya Kowalewski <illya.kovalevskyy@gmail.com> 0005 // 0006 0007 #include "MarbleLocale.h" 0008 #include "MarbleLocale_p.h" 0009 #include "MarbleGlobal.h" 0010 #include "MarbleDebug.h" 0011 0012 // Qt 0013 #include <QLocale> 0014 0015 0016 namespace Marble 0017 { 0018 0019 MarbleLocalePrivate::MarbleLocalePrivate() 0020 : m_measurementSystem( MarbleLocale::MetricSystem ) 0021 { 0022 } 0023 0024 MarbleLocalePrivate::~MarbleLocalePrivate() 0025 { 0026 } 0027 0028 MarbleLocale::MarbleLocale() 0029 : d ( new MarbleLocalePrivate ) 0030 { 0031 } 0032 0033 MarbleLocale::~MarbleLocale() 0034 { 0035 delete d; 0036 } 0037 0038 void MarbleLocale::setMeasurementSystem( MarbleLocale::MeasurementSystem measurementSystem ) 0039 { 0040 d->m_measurementSystem = measurementSystem; 0041 } 0042 0043 MarbleLocale::MeasurementSystem MarbleLocale::measurementSystem() const 0044 { 0045 return d->m_measurementSystem; 0046 } 0047 0048 void MarbleLocale::meterToTargetUnit(qreal meters, MeasurementSystem targetSystem, 0049 qreal &targetValue, MeasureUnit &targetUnit) 0050 { 0051 targetValue = meters; 0052 0053 switch (targetSystem) { 0054 case MetricSystem: { 0055 if (targetValue > 1000.0) { 0056 targetValue *= METER2KM; 0057 targetUnit = Kilometer; 0058 break; 0059 } 0060 0061 if (targetValue < 1.0 && targetValue >= 0.01) { 0062 targetValue *= M2CM; 0063 targetUnit = Centimeter; 0064 break; 0065 } 0066 0067 if (targetValue < 0.01) { 0068 targetValue *= M2MM; 0069 targetUnit = Milimeter; 0070 break; 0071 } 0072 0073 targetUnit = Meter; 0074 break; 0075 } 0076 0077 case ImperialSystem: { 0078 // meters into feet 0079 qreal ftValue = targetValue * M2FT; 0080 0081 if (ftValue < 1) { 0082 targetValue *= M2IN; 0083 targetUnit = Inch; 0084 break; 0085 } 0086 0087 if (ftValue >= 3 && ftValue < 5280.0) { 0088 targetValue *= M2YD; 0089 targetUnit = Yard; 0090 break; 0091 } 0092 0093 if (ftValue >= 5280.0) { 0094 targetValue *= METER2KM * KM2MI; 0095 targetUnit = Mile; 0096 break; 0097 } 0098 0099 targetValue *= M2FT; 0100 targetUnit = Foot; 0101 break; 0102 } 0103 0104 case NauticalSystem: { 0105 targetValue *= METER2KM * KM2NM; 0106 targetUnit = NauticalMile; 0107 break; 0108 } 0109 0110 default: 0111 qWarning() << "Unknown measurement system!"; 0112 } 0113 } 0114 0115 QString MarbleLocale::unitAbbreviation(MeasureUnit unit) 0116 { 0117 switch (unit) { 0118 case Meter: 0119 return QObject::tr("m", "means meter"); 0120 case Milimeter: 0121 return QObject::tr("mm", "means milimeters"); 0122 case Kilometer: 0123 return QObject::tr("km", "means kilometers"); 0124 case Centimeter: 0125 return QObject::tr("cm", "means centimeters"); 0126 case Foot: 0127 return QObject::tr("ft", "means feet"); 0128 case Inch: 0129 return QObject::tr("in", "means inches"); 0130 case Yard: 0131 return QObject::tr("yd", "means yards"); 0132 case Mile: 0133 return QObject::tr("mi", "means miles"); 0134 case NauticalMile: 0135 return QObject::tr("nm", "means nautical miles"); 0136 default: 0137 return ""; 0138 } 0139 } 0140 0141 QString MarbleLocale::languageCode() 0142 { 0143 const QString lang = QLocale::system().name(); 0144 QString code; 0145 0146 int index = lang.indexOf(QLatin1Char('_')); 0147 if (lang == QLatin1String("C")) { 0148 code = "en"; 0149 } 0150 else if ( index != -1 ) { 0151 code = lang.left ( index ); 0152 } 0153 else { 0154 index = lang.indexOf(QLatin1Char('@')); 0155 if ( index != -1 ) 0156 code = lang.left ( index ); 0157 else 0158 code = lang; 0159 } 0160 0161 return code; 0162 } 0163 0164 }