Skip to content

Commit

Permalink
Add support for loading new sky culture format translators in StelLoc…
Browse files Browse the repository at this point in the history
…aleMgr
  • Loading branch information
10110111 committed Feb 15, 2025
1 parent b2913c6 commit 9a810ce
Show file tree
Hide file tree
Showing 7 changed files with 137 additions and 12 deletions.
1 change: 1 addition & 0 deletions po/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )
ADD_SUBDIRECTORY(stellarium)
ADD_SUBDIRECTORY(stellarium-sky)
ADD_SUBDIRECTORY(stellarium-skycultures)
ADD_SUBDIRECTORY(stellarium-skycultures-descriptions)
ADD_SUBDIRECTORY(stellarium-planetary-features)
IF(ENABLE_SCRIPTING)
ADD_SUBDIRECTORY(stellarium-scripts)
Expand Down
36 changes: 36 additions & 0 deletions po/stellarium-skycultures-descriptions/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
FILE(GLOB poscfiles RELATIVE "${CMAKE_SOURCE_DIR}/po/stellarium-skycultures-descriptions/" "*.po")
LIST(SORT poscfiles)
STRING(REGEX REPLACE ".po" "" outposcfiles "${poscfiles}")

# This is a copy of the implementation of GETTEXT_CREATE_TRANSLATIONS, but
# without updating the .po or .pot files, because they are made by an external
# script from a separate repository.
set(_domain stellarium-skycultures-descriptions)

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/translations/${_domain})

SET(_gmoFiles)

SET(_addToAll "ALL")

FOREACH (_lang ${outposcfiles})
GET_FILENAME_COMPONENT(_absFile ${_lang}.po ABSOLUTE)
FILE(RELATIVE_PATH _relFile ${PROJECT_SOURCE_DIR} ${_absFile})
SET(_gmoFile ${CMAKE_BINARY_DIR}/translations/${_domain}/${_lang}.qm)

# Convert a PO file into a qm file.
ADD_CUSTOM_COMMAND(
OUTPUT ${_gmoFile}
COMMAND ${lconvert_executable} -i ${_absFile} -o ${_gmoFile}
DEPENDS ${_absFile}
)

INSTALL(FILES ${_gmoFile} DESTINATION ${SDATALOC}/translations/${_domain}/)
SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
ENDFOREACH (_lang)

# Create the .qm files when building the "translations-<DOMAIN>" and
# "translations" targets.
ADD_CUSTOM_TARGET(translations-${_domain} ${_addToAll} DEPENDS ${_gmoFiles})
ADD_DEPENDENCIES(translations translations-${_domain})
SET_TARGET_PROPERTIES(translations-${_domain} PROPERTIES FOLDER "po")
32 changes: 32 additions & 0 deletions po/stellarium-skycultures/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,35 @@ FILE(GLOB poscfiles RELATIVE "${CMAKE_SOURCE_DIR}/po/stellarium-skycultures/" "*
LIST(SORT poscfiles)
STRING(REGEX REPLACE ".po" "" outposcfiles "${poscfiles}")

# This is a copy of the implementation of GETTEXT_CREATE_TRANSLATIONS, but
# without updating the .po or .pot files, because they are made by an external
# script from a separate repository.
set(_domain stellarium-skycultures)

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/translations/${_domain})

SET(_gmoFiles)

SET(_addToAll "ALL")

FOREACH (_lang ${outposcfiles})
GET_FILENAME_COMPONENT(_absFile ${_lang}.po ABSOLUTE)
FILE(RELATIVE_PATH _relFile ${PROJECT_SOURCE_DIR} ${_absFile})
SET(_gmoFile ${CMAKE_BINARY_DIR}/translations/${_domain}/${_lang}.qm)

# Convert a PO file into a qm file.
ADD_CUSTOM_COMMAND(
OUTPUT ${_gmoFile}
COMMAND ${lconvert_executable} -i ${_absFile} -o ${_gmoFile}
DEPENDS ${_absFile}
)

INSTALL(FILES ${_gmoFile} DESTINATION ${SDATALOC}/translations/${_domain}/)
SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
ENDFOREACH (_lang)

# Create the .qm files when building the "translations-<DOMAIN>" and
# "translations" targets.
ADD_CUSTOM_TARGET(translations-${_domain} ${_addToAll} DEPENDS ${_gmoFiles})
ADD_DEPENDENCIES(translations translations-${_domain})
SET_TARGET_PROPERTIES(translations-${_domain} PROPERTIES FOLDER "po")
12 changes: 11 additions & 1 deletion src/core/StelLocaleMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "StelLocaleMgr.hpp"
#include "StelApp.hpp"
#include "StelUtils.hpp"
#include "StelSkyCultureMgr.hpp"

#include <QLocale>
#include <QDebug>
Expand Down Expand Up @@ -70,6 +71,10 @@ void StelLocaleMgr::setAppLanguage(const QString& newAppLanguageName, bool refre
scriptsTranslator.reset(new StelTranslator("stellarium-scripts", newAppLanguageName));
qDebug().noquote() << "Scripts language:" << scriptsTranslator->getTrueLocaleName();

// Update the translator with new locale name
skyCultureDescriptionsTranslator.reset(new StelTranslator("stellarium-skycultures-descriptions", newAppLanguageName));
qDebug().noquote() << "Sky culture description language:" << skyCultureDescriptionsTranslator->getTrueLocaleName();

createNameLists();
if (refreshAll)
StelApp::getInstance().updateI18n();
Expand All @@ -86,7 +91,7 @@ bool StelLocaleMgr::isAppRTL() const
void StelLocaleMgr::setSkyLanguage(const QString& newSkyLanguageName, bool refreshAll)
{
// Update the translator with new locale name
skyTranslator.reset(new StelTranslator("stellarium-skycultures", newSkyLanguageName));
skyTranslator.reset(new StelSkyTranslator(newSkyLanguageName));
qDebug().noquote() << "Sky language:" << skyTranslator->getTrueLocaleName();

// Update the translator with new locale name
Expand Down Expand Up @@ -131,6 +136,11 @@ const StelTranslator& StelLocaleMgr::getScriptsTranslator() const
return *scriptsTranslator;
}

const StelTranslator& StelLocaleMgr::getSkyCultureDescriptionsTranslator() const
{
return *skyCultureDescriptionsTranslator;
}

// Return the time in ISO 8601 format that is : %Y-%m-%d %H:%M:%S
QString StelLocaleMgr::getISO8601TimeLocal(double JD, double utcOffsetHrs) const
{
Expand Down
4 changes: 4 additions & 0 deletions src/core/StelLocaleMgr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ class StelLocaleMgr
//! Get a reference to the StelTranslator object currently used for scripts.
const StelTranslator &getScriptsTranslator() const;

//! Get a reference to the StelTranslator object currently used for sky cultures descriptions.
const StelTranslator &getSkyCultureDescriptionsTranslator() const;

//! Get the type (RTL or LTR) of language currently used for sky objects
bool isSkyRTL() const;

Expand Down Expand Up @@ -179,6 +182,7 @@ class StelLocaleMgr
std::unique_ptr<StelTranslator> skyTranslator;
std::unique_ptr<StelTranslator> planetaryFeaturesTranslator;
std::unique_ptr<StelTranslator> scriptsTranslator;
std::unique_ptr<StelTranslator> skyCultureDescriptionsTranslator;
StelCore* core;

// Date and time variables
Expand Down
25 changes: 25 additions & 0 deletions src/core/StelTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,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 @@ -202,3 +207,23 @@ void StelTranslator::initIso639_1LanguageCodes(const QString& fileName)
iso639codes.insert(fields.at(0), fields.at(2));
}
}

StelSkyTranslator::StelSkyTranslator(const QString& langName)
: StelTranslator("stellarium-skycultures", langName)
, commonSkyTranslator("stellarium-sky", langName)
{
if (commonSkyTranslator.isEmpty())
qWarning() << "Empty skyculture-independent translation file for language " << getTrueLocaleName();
}

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();
}
39 changes: 28 additions & 11 deletions src/core/StelTranslator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ class StelTranslator
//! @param alangName The C locale name or language name like "fr" or "fr_FR". If string is "" or "system" it will use the system locale.
StelTranslator(const QString& adomain, const QString& alangName);

~StelTranslator();
virtual ~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& 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 9a810ce

Please sign in to comment.