diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/LangInfo.h | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/LangInfo.h')
-rw-r--r-- | xbmc/LangInfo.h | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/xbmc/LangInfo.h b/xbmc/LangInfo.h new file mode 100644 index 0000000..1f6bc34 --- /dev/null +++ b/xbmc/LangInfo.h @@ -0,0 +1,325 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "settings/lib/ISettingCallback.h" +#include "settings/lib/ISettingsHandler.h" +#include "utils/GlobalsHandling.h" +#include "utils/Locale.h" +#include "utils/Speed.h" +#include "utils/Temperature.h" + +#include <locale> +#include <map> +#include <memory> +#include <set> +#include <string> +#include <utility> +#include <vector> + +#ifdef TARGET_WINDOWS +#ifdef GetDateFormat +#undef GetDateFormat +#endif // GetDateFormat +#ifdef GetTimeFormat +#undef GetTimeFormat +#endif // GetTimeFormat +#endif // TARGET_WINDOWS + +class TiXmlNode; +struct StringSettingOption; + +namespace ADDON +{ + class CLanguageResource; +} +typedef std::shared_ptr<ADDON::CLanguageResource> LanguageResourcePtr; + +typedef enum MeridiemSymbol +{ + MeridiemSymbolPM = 0, + MeridiemSymbolAM +} MeridiemSymbol; + +class CLangInfo : public ISettingCallback, public ISettingsHandler +{ +public: + CLangInfo(); + ~CLangInfo() override; + + // implementation of ISettingCallback + void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override; + + // implementation of ISettingsHandler + void OnSettingsLoaded() override; + + /* + * \brief Get language codes list of the installed language addons. + * \param languages [OUT] The list of languages (language code, name). + */ + static void GetAddonsLanguageCodes(std::map<std::string, std::string>& languages); + + /*! + \brief Returns the language addon for the given locale (or the current one). + + \param locale (optional) Locale of the language (current if empty) + \return Language addon for the given locale or NULL if the locale is invalid. + */ + LanguageResourcePtr GetLanguageAddon(const std::string& locale = "") const; + + std::string GetGuiCharSet() const; + std::string GetSubtitleCharSet() const; + + // three char language code (not win32 specific) + const std::string& GetLanguageCode() const { return m_languageCodeGeneral; } + + /*! + * \brief Convert an english language name to an addon locale, + * by searching in the installed language addons. + * \param langName [IN] The english language name + * \return The locale for the given english name, or empty if not found + */ + static std::string ConvertEnglishNameToAddonLocale(const std::string& langName); + + /*! + * \brief Get the english language name from given locale, + * by searching in the installed language addons. + * \param locale [OPT] Locale of the language (current if empty) + */ + std::string GetEnglishLanguageName(const std::string& locale = "") const; + + /*! + \brief Sets and loads the given (or configured) language, its details and strings. + + \param strLanguage (optional) Language to be loaded. + \param reloadServices (optional) Whether to reload services relying on localization. + \return True if the language has been successfully loaded, false otherwise. + */ + bool SetLanguage(std::string strLanguage = "", bool reloadServices = true); + + const std::string& GetAudioLanguage() const; + // language can either be a two char language code as defined in ISO639 + // or a three char language code + // or a language name in english (as used by XBMC) + void SetAudioLanguage(const std::string& language); + + // three char language code (not win32 specific) + const std::string& GetSubtitleLanguage() const; + // language can either be a two char language code as defined in ISO639 + // or a three char language code + // or a language name in english (as used by XBMC) + void SetSubtitleLanguage(const std::string& language); + + const std::string GetDVDMenuLanguage() const; + const std::string GetDVDAudioLanguage() const; + const std::string GetDVDSubtitleLanguage() const; + const std::string& GetTimeZone() const; + + const std::string& GetRegionLocale() const; + + const std::locale& GetOriginalLocale() const; + + /*! + \brief Returns the full locale of the current language. + */ + const CLocale& GetLocale() const; + + /*! + \brief Returns the system's current locale. + */ + const std::locale& GetSystemLocale() const { return m_systemLocale; } + + bool ForceUnicodeFont() const { return m_forceUnicodeFont; } + + const std::string& GetDateFormat(bool bLongDate = false) const; + void SetDateFormat(const std::string& dateFormat, bool bLongDate = false); + const std::string& GetShortDateFormat() const; + void SetShortDateFormat(const std::string& shortDateFormat); + const std::string& GetLongDateFormat() const; + void SetLongDateFormat(const std::string& longDateFormat); + + const std::string& GetTimeFormat() const; + void SetTimeFormat(const std::string& timeFormat); + bool Use24HourClock() const; + void Set24HourClock(bool use24HourClock); + void Set24HourClock(const std::string& str24HourClock); + const std::string& GetMeridiemSymbol(MeridiemSymbol symbol) const; + static const std::string& MeridiemSymbolToString(MeridiemSymbol symbol); + + CTemperature::Unit GetTemperatureUnit() const; + void SetTemperatureUnit(CTemperature::Unit temperatureUnit); + void SetTemperatureUnit(const std::string& temperatureUnit); + const std::string& GetTemperatureUnitString() const; + static const std::string& GetTemperatureUnitString(CTemperature::Unit temperatureUnit); + std::string GetTemperatureAsString(const CTemperature& temperature) const; + + CSpeed::Unit GetSpeedUnit() const; + void SetSpeedUnit(CSpeed::Unit speedUnit); + void SetSpeedUnit(const std::string& speedUnit); + const std::string& GetSpeedUnitString() const; + static const std::string& GetSpeedUnitString(CSpeed::Unit speedUnit); + std::string GetSpeedAsString(const CSpeed& speed) const; + + void GetRegionNames(std::vector<std::string>& array); + void SetCurrentRegion(const std::string& strName); + const std::string& GetCurrentRegion() const; + + std::set<std::string> GetSortTokens() const; + + static std::string GetLanguagePath() { return "resource://"; } + static std::string GetLanguagePath(const std::string &language); + static std::string GetLanguageInfoPath(const std::string &language); + bool UseLocaleCollation(); + + static void LoadTokens(const TiXmlNode* pTokens, std::set<std::string>& vecTokens); + + static void SettingOptionsLanguageNamesFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsAudioStreamLanguagesFiller( + const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsSubtitleStreamLanguagesFiller( + const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsSubtitleDownloadlanguagesFiller( + const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsISO6391LanguagesFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsRegionsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsShortDateFormatsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsLongDateFormatsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsTimeFormatsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptions24HourClockFormatsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsTemperatureUnitsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + static void SettingOptionsSpeedUnitsFiller(const std::shared_ptr<const CSetting>& setting, + std::vector<StringSettingOption>& list, + std::string& current, + void* data); + +protected: + void SetDefaults(); + bool Load(const std::string& strLanguage); + + static bool DetermineUse24HourClockFromTimeFormat(const std::string& timeFormat); + static bool DetermineUseMeridiemFromTimeFormat(const std::string& timeFormat); + static std::string PrepareTimeFormat(const std::string& timeFormat, bool use24HourClock); + static void AddLanguages(std::vector<StringSettingOption> &list); + + class CRegion final + { + public: + CRegion(); + void SetDefaults(); + void SetTemperatureUnit(const std::string& strUnit); + void SetSpeedUnit(const std::string& strUnit); + void SetTimeZone(const std::string& strTimeZone); + + class custom_numpunct : public std::numpunct<char> + { + public: + custom_numpunct(const char decimal_point, const char thousands_sep, const std::string& grouping) + : cDecimalPoint(decimal_point), cThousandsSep(thousands_sep), sGroup(grouping) {} + protected: + char do_decimal_point() const override { return cDecimalPoint; } + char do_thousands_sep() const override { return cThousandsSep; } + std::string do_grouping() const override { return sGroup; } + private: + const char cDecimalPoint; + const char cThousandsSep; + const std::string sGroup; + }; + + /*! \brief Set the locale associated with this region global. + + Set the locale associated with this region global. This affects string + sorting & transformations. + */ + void SetGlobalLocale(); + std::string m_strLangLocaleName; + std::string m_strLangLocaleCodeTwoChar; + std::string m_strRegionLocaleName; + std::string m_strName; + std::string m_strDateFormatLong; + std::string m_strDateFormatShort; + std::string m_strTimeFormat; + std::string m_strMeridiemSymbols[2]; + std::string m_strTimeZone; + std::string m_strGrouping; + char m_cDecimalSep; + char m_cThousandsSep; + + CTemperature::Unit m_tempUnit; + CSpeed::Unit m_speedUnit; + }; + + + typedef std::map<std::string, CRegion> MAPREGIONS; + typedef std::map<std::string, CRegion>::iterator ITMAPREGIONS; + typedef std::pair<std::string, CRegion> PAIR_REGIONS; + MAPREGIONS m_regions; + CRegion* m_currentRegion; // points to the current region + CRegion m_defaultRegion; // default, will be used if no region available via langinfo.xml + std::locale m_systemLocale; // current locale, matching GUI settings + std::locale m_originalLocale; // original locale, without changes of collate + int m_collationtype; + LanguageResourcePtr m_languageAddon; + + std::string m_strGuiCharSet; + bool m_forceUnicodeFont; + std::string m_strSubtitleCharSet; + std::string m_strDVDMenuLanguage; + std::string m_strDVDAudioLanguage; + std::string m_strDVDSubtitleLanguage; + std::set<std::string> m_sortTokens; + + std::string m_shortDateFormat; + std::string m_longDateFormat; + std::string m_timeFormat; + bool m_use24HourClock; + CTemperature::Unit m_temperatureUnit; + CSpeed::Unit m_speedUnit; + + std::string m_audioLanguage; + std::string m_subtitleLanguage; + // this is the general (not win32-specific) three char language code + std::string m_languageCodeGeneral; +}; + + +XBMC_GLOBAL_REF(CLangInfo, g_langInfo); +#define g_langInfo XBMC_GLOBAL_USE(CLangInfo) |