File indexing completed on 2024-04-14 03:47:52

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 }