Skip to content

Commit

Permalink
Use a separate class for sky translation
Browse files Browse the repository at this point in the history
  • Loading branch information
10110111 committed Jan 19, 2024
1 parent 0301e8b commit 9375ad6
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/core/StelLocaleMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ void StelLocaleMgr::loadSkyTranslator()
// Update the translator with new locale name
const auto cultureId = StelApp::getInstance().getSkyCultureMgr().getCurrentSkyCultureID();
delete skyTranslator;
skyTranslator = new StelTranslator("stellarium-skycultures-"+cultureId, planetaryFeaturesTranslator->getTrueLocaleName());
skyTranslator = new StelSkyTranslator(cultureId, planetaryFeaturesTranslator->getTrueLocaleName());
qDebug().noquote() << "Sky language:" << skyTranslator->getTrueLocaleName();
}

Expand Down
47 changes: 36 additions & 11 deletions src/core/StelTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,7 @@ StelTranslator::StelTranslator(const QString& adomain, const QString& alangName)
langName(alangName)
{
translator = new QTranslator();
const char skyCulturePrefix[] = "stellarium-skycultures-";
QString path;
if (adomain.startsWith(skyCulturePrefix))
{
const auto culture = adomain.mid(sizeof skyCulturePrefix - 1);
path = StelFileMgr::getInstallationDir() + "/skycultures/" + culture + "/translations/" + getTrueLocaleName()+".qm";
}
else
{
path = StelFileMgr::getLocaleDir()+"/"+adomain+"/"+getTrueLocaleName()+".qm";
}
const auto path = StelFileMgr::getLocaleDir()+"/"+adomain+"/"+getTrueLocaleName()+".qm";
const bool res = translator->load(path);
if (!res)
qWarning() << "Couldn't load translations for language " << getTrueLocaleName() << "in section" << adomain;
Expand All @@ -65,6 +55,11 @@ StelTranslator::~StelTranslator()
translator = Q_NULLPTR;
}

bool StelTranslator::isEmpty() const
{
return translator->isEmpty();
}

QString StelTranslator::qtranslate(const QString& s, const QString& c) const
{
if (s.isEmpty())
Expand Down Expand Up @@ -211,3 +206,33 @@ void StelTranslator::initIso639_1LanguageCodes(const QString& fileName)
iso639codes.insert(fields.at(0), fields.at(2));
}
}

static constexpr char skyCulturePrefix[] = "stellarium-skycultures-";
StelSkyTranslator::StelSkyTranslator(const QString& skyCultureId, const QString& langName)
: commonSkyTranslator("stellarium-skycultures", langName)
{
domain = skyCulturePrefix + skyCultureId;
this->langName = langName;
translator = new QTranslator();

const auto path = StelFileMgr::getInstallationDir() + "/skycultures/" + skyCultureId + "/translations/" + getTrueLocaleName()+".qm";
const bool res = translator->load(path);
if (!res)
qWarning() << "Couldn't load sky translations for language" << getTrueLocaleName() << "in sky culture" << skyCultureId;
if (translator->isEmpty())
qWarning() << "Empty translation file for language " << getTrueLocaleName() << "in sky culture" << skyCultureId;
if (commonSkyTranslator.isEmpty())
qWarning() << "Empty skyculture-independent translation file for language " << getTrueLocaleName() << "in sky culture" << skyCultureId;
}

QString StelSkyTranslator::tryQtranslate(const QString& s, const QString& c) const
{
const auto res = StelTranslator::tryQtranslate(s, c);
if (!res.isEmpty()) return res;
return commonSkyTranslator.tryQtranslate(s, c);
}

bool StelSkyTranslator::isEmpty() const
{
return StelTranslator::isEmpty() && commonSkyTranslator.isEmpty();
}
37 changes: 27 additions & 10 deletions src/core/StelTranslator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ class StelTranslator
StelTranslator(const QString& adomain, const QString& alangName);

~StelTranslator();

//! Checks whether any translations have been loaded
virtual bool isEmpty() const;

//! Translate input message and return it as a QString.
//! If the string is not translated in the current locale, the input string is returned unchanged.
Expand All @@ -77,7 +80,7 @@ class StelTranslator
//! @param s input string in english.
//! @param c disambiguation string (gettext "context" string).
//! @return The translated QString
QString tryQtranslate(const QString& s, const QString& c = QString()) const;
virtual QString tryQtranslate(const QString& s, const QString& c = QString()) const;

//! Get true translator locale name. Actual locale, never "system".
//! @return Locale name e.g "fr_FR"
Expand Down Expand Up @@ -106,6 +109,18 @@ class StelTranslator
//! @param fileName file containing the list of language codes
static void init(const QString& fileName);

protected:
StelTranslator() = default;

//! The domain name
QString domain;

//! The two letter string defining the current language name
QString langName;

//! QTranslator instance
class QTranslator* translator = nullptr;

private:
StelTranslator(const StelTranslator& );
const StelTranslator& operator=(const StelTranslator&);
Expand All @@ -117,15 +132,6 @@ class StelTranslator
//! Get available language codes from passed locales directory
static QStringList getAvailableIso639_1Codes(const QString& localeDir="");

//! The domain name
QString domain;

//! The two letter string defining the current language name
QString langName;

//! QTranslator instance
class QTranslator* translator;

//! Try to determine system language from system configuration
static void initSystemLanguage(void);

Expand All @@ -136,5 +142,16 @@ class StelTranslator
static QMap<QString, QString> iso639codes;
};

class StelSkyTranslator : public StelTranslator
{
public:
StelSkyTranslator(const QString& skyCultureId, const QString& langName);
QString tryQtranslate(const QString& s, const QString& c = QString()) const override;
bool isEmpty() const override;
private:
//! Used as a skyculture-independent fallback when current sky culture doesn't have a translation
StelTranslator commonSkyTranslator;
};

#endif // STELTRANSLATOR_HPP

0 comments on commit 9375ad6

Please sign in to comment.