kodi
LangInfo.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "settings/lib/ISettingCallback.h"
12 #include "settings/lib/ISettingsHandler.h"
13 #include "utils/GlobalsHandling.h"
14 #include "utils/Locale.h"
15 #include "utils/Speed.h"
16 #include "utils/Temperature.h"
17 
18 #include <locale>
19 #include <map>
20 #include <memory>
21 #include <set>
22 #include <string>
23 #include <utility>
24 #include <vector>
25 
26 #ifdef TARGET_WINDOWS
27 #ifdef GetDateFormat
28 #undef GetDateFormat
29 #endif // GetDateFormat
30 #ifdef GetTimeFormat
31 #undef GetTimeFormat
32 #endif // GetTimeFormat
33 #endif // TARGET_WINDOWS
34 
35 class TiXmlNode;
36 struct StringSettingOption;
37 
38 namespace ADDON
39 {
40  class CLanguageResource;
41 }
42 typedef std::shared_ptr<ADDON::CLanguageResource> LanguageResourcePtr;
43 
44 typedef enum MeridiemSymbol
45 {
46  MeridiemSymbolPM = 0,
47  MeridiemSymbolAM
48 } MeridiemSymbol;
49 
51 {
52 public:
53  CLangInfo();
54  ~CLangInfo() override;
55 
56  // implementation of ISettingCallback
57  void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override;
58 
59  // implementation of ISettingsHandler
60  void OnSettingsLoaded() override;
61 
62  /*
63  * \brief Get language codes list of the installed language addons.
64  * \param languages [OUT] The list of languages (language code, name).
65  */
66  static void GetAddonsLanguageCodes(std::map<std::string, std::string>& languages);
67 
74  LanguageResourcePtr GetLanguageAddon(const std::string& locale = "") const;
75 
76  std::string GetGuiCharSet() const;
77  std::string GetSubtitleCharSet() const;
78 
79  // three char language code (not win32 specific)
80  const std::string& GetLanguageCode() const { return m_languageCodeGeneral; }
81 
88  static std::string ConvertEnglishNameToAddonLocale(const std::string& langName);
89 
95  std::string GetEnglishLanguageName(const std::string& locale = "") const;
96 
104  bool SetLanguage(std::string strLanguage = "", bool reloadServices = true);
105 
106  const std::string& GetAudioLanguage() const;
107  // language can either be a two char language code as defined in ISO639
108  // or a three char language code
109  // or a language name in english (as used by XBMC)
110  void SetAudioLanguage(const std::string& language);
111 
112  // three char language code (not win32 specific)
113  const std::string& GetSubtitleLanguage() const;
114  // language can either be a two char language code as defined in ISO639
115  // or a three char language code
116  // or a language name in english (as used by XBMC)
117  void SetSubtitleLanguage(const std::string& language);
118 
119  const std::string GetDVDMenuLanguage() const;
120  const std::string GetDVDAudioLanguage() const;
121  const std::string GetDVDSubtitleLanguage() const;
122  const std::string& GetTimeZone() const;
123 
124  const std::string& GetRegionLocale() const;
125 
126  const std::locale& GetOriginalLocale() const;
127 
131  const CLocale& GetLocale() const;
132 
136  const std::locale& GetSystemLocale() const { return m_systemLocale; }
137 
138  bool ForceUnicodeFont() const { return m_forceUnicodeFont; }
139 
140  const std::string& GetDateFormat(bool bLongDate = false) const;
141  void SetDateFormat(const std::string& dateFormat, bool bLongDate = false);
142  const std::string& GetShortDateFormat() const;
143  void SetShortDateFormat(const std::string& shortDateFormat);
144  const std::string& GetLongDateFormat() const;
145  void SetLongDateFormat(const std::string& longDateFormat);
146 
147  const std::string& GetTimeFormat() const;
148  void SetTimeFormat(const std::string& timeFormat);
149  bool Use24HourClock() const;
150  void Set24HourClock(bool use24HourClock);
151  void Set24HourClock(const std::string& str24HourClock);
152  const std::string& GetMeridiemSymbol(MeridiemSymbol symbol) const;
153  static const std::string& MeridiemSymbolToString(MeridiemSymbol symbol);
154 
155  CTemperature::Unit GetTemperatureUnit() const;
156  void SetTemperatureUnit(CTemperature::Unit temperatureUnit);
157  void SetTemperatureUnit(const std::string& temperatureUnit);
158  const std::string& GetTemperatureUnitString() const;
159  static const std::string& GetTemperatureUnitString(CTemperature::Unit temperatureUnit);
160  std::string GetTemperatureAsString(const CTemperature& temperature) const;
161 
162  CSpeed::Unit GetSpeedUnit() const;
163  void SetSpeedUnit(CSpeed::Unit speedUnit);
164  void SetSpeedUnit(const std::string& speedUnit);
165  const std::string& GetSpeedUnitString() const;
166  static const std::string& GetSpeedUnitString(CSpeed::Unit speedUnit);
167  std::string GetSpeedAsString(const CSpeed& speed) const;
168 
169  void GetRegionNames(std::vector<std::string>& array);
170  void SetCurrentRegion(const std::string& strName);
171  const std::string& GetCurrentRegion() const;
172 
173  std::set<std::string> GetSortTokens() const;
174 
175  static std::string GetLanguagePath() { return "resource://"; }
176  static std::string GetLanguagePath(const std::string &language);
177  static std::string GetLanguageInfoPath(const std::string &language);
178  bool UseLocaleCollation();
179 
180  static void LoadTokens(const TiXmlNode* pTokens, std::set<std::string>& vecTokens);
181 
182  static void SettingOptionsLanguageNamesFiller(const std::shared_ptr<const CSetting>& setting,
183  std::vector<StringSettingOption>& list,
184  std::string& current,
185  void* data);
186  static void SettingOptionsAudioStreamLanguagesFiller(
187  const std::shared_ptr<const CSetting>& setting,
188  std::vector<StringSettingOption>& list,
189  std::string& current,
190  void* data);
191  static void SettingOptionsSubtitleStreamLanguagesFiller(
192  const std::shared_ptr<const CSetting>& setting,
193  std::vector<StringSettingOption>& list,
194  std::string& current,
195  void* data);
196  static void SettingOptionsSubtitleDownloadlanguagesFiller(
197  const std::shared_ptr<const CSetting>& setting,
198  std::vector<StringSettingOption>& list,
199  std::string& current,
200  void* data);
201  static void SettingOptionsISO6391LanguagesFiller(const std::shared_ptr<const CSetting>& setting,
202  std::vector<StringSettingOption>& list,
203  std::string& current,
204  void* data);
205  static void SettingOptionsRegionsFiller(const std::shared_ptr<const CSetting>& setting,
206  std::vector<StringSettingOption>& list,
207  std::string& current,
208  void* data);
209  static void SettingOptionsShortDateFormatsFiller(const std::shared_ptr<const CSetting>& setting,
210  std::vector<StringSettingOption>& list,
211  std::string& current,
212  void* data);
213  static void SettingOptionsLongDateFormatsFiller(const std::shared_ptr<const CSetting>& setting,
214  std::vector<StringSettingOption>& list,
215  std::string& current,
216  void* data);
217  static void SettingOptionsTimeFormatsFiller(const std::shared_ptr<const CSetting>& setting,
218  std::vector<StringSettingOption>& list,
219  std::string& current,
220  void* data);
221  static void SettingOptions24HourClockFormatsFiller(const std::shared_ptr<const CSetting>& setting,
222  std::vector<StringSettingOption>& list,
223  std::string& current,
224  void* data);
225  static void SettingOptionsTemperatureUnitsFiller(const std::shared_ptr<const CSetting>& setting,
226  std::vector<StringSettingOption>& list,
227  std::string& current,
228  void* data);
229  static void SettingOptionsSpeedUnitsFiller(const std::shared_ptr<const CSetting>& setting,
230  std::vector<StringSettingOption>& list,
231  std::string& current,
232  void* data);
233 
234 protected:
235  void SetDefaults();
236  bool Load(const std::string& strLanguage);
237 
238  static bool DetermineUse24HourClockFromTimeFormat(const std::string& timeFormat);
239  static bool DetermineUseMeridiemFromTimeFormat(const std::string& timeFormat);
240  static std::string PrepareTimeFormat(const std::string& timeFormat, bool use24HourClock);
241  static void AddLanguages(std::vector<StringSettingOption> &list);
242 
243  class CRegion final
244  {
245  public:
246  CRegion();
247  void SetDefaults();
248  void SetTemperatureUnit(const std::string& strUnit);
249  void SetSpeedUnit(const std::string& strUnit);
250  void SetTimeZone(const std::string& strTimeZone);
251 
252  class custom_numpunct : public std::numpunct<char>
253  {
254  public:
255  custom_numpunct(const char decimal_point, const char thousands_sep, const std::string& grouping)
256  : cDecimalPoint(decimal_point), cThousandsSep(thousands_sep), sGroup(grouping) {}
257  protected:
258  char do_decimal_point() const override { return cDecimalPoint; }
259  char do_thousands_sep() const override { return cThousandsSep; }
260  std::string do_grouping() const override { return sGroup; }
261  private:
262  const char cDecimalPoint;
263  const char cThousandsSep;
264  const std::string sGroup;
265  };
266 
272  void SetGlobalLocale();
273  std::string m_strLangLocaleName;
274  std::string m_strLangLocaleCodeTwoChar;
275  std::string m_strRegionLocaleName;
276  std::string m_strName;
277  std::string m_strDateFormatLong;
278  std::string m_strDateFormatShort;
279  std::string m_strTimeFormat;
280  std::string m_strMeridiemSymbols[2];
281  std::string m_strTimeZone;
282  std::string m_strGrouping;
283  char m_cDecimalSep;
284  char m_cThousandsSep;
285 
286  CTemperature::Unit m_tempUnit;
287  CSpeed::Unit m_speedUnit;
288  };
289 
290 
291  typedef std::map<std::string, CRegion> MAPREGIONS;
292  typedef std::map<std::string, CRegion>::iterator ITMAPREGIONS;
293  typedef std::pair<std::string, CRegion> PAIR_REGIONS;
294  MAPREGIONS m_regions;
295  CRegion* m_currentRegion; // points to the current region
296  CRegion m_defaultRegion; // default, will be used if no region available via langinfo.xml
297  std::locale m_systemLocale; // current locale, matching GUI settings
298  std::locale m_originalLocale; // original locale, without changes of collate
299  int m_collationtype;
300  LanguageResourcePtr m_languageAddon;
301 
302  std::string m_strGuiCharSet;
303  bool m_forceUnicodeFont;
304  std::string m_strSubtitleCharSet;
305  std::string m_strDVDMenuLanguage;
306  std::string m_strDVDAudioLanguage;
307  std::string m_strDVDSubtitleLanguage;
308  std::set<std::string> m_sortTokens;
309 
310  std::string m_shortDateFormat;
311  std::string m_longDateFormat;
312  std::string m_timeFormat;
313  bool m_use24HourClock;
314  CTemperature::Unit m_temperatureUnit;
315  CSpeed::Unit m_speedUnit;
316 
317  std::string m_audioLanguage;
318  std::string m_subtitleLanguage;
319  // this is the general (not win32-specific) three char language code
320  std::string m_languageCodeGeneral;
321 };
322 
323 
324 XBMC_GLOBAL_REF(CLangInfo, g_langInfo);
325 #define g_langInfo XBMC_GLOBAL_USE(CLangInfo)
Definition: ISettingCallback.h:16
const std::locale & GetSystemLocale() const
Returns the system&#39;s current locale.
Definition: LangInfo.h:136
Definition: SettingDefinitions.h:85
Definition: Temperature.h:15
Interface defining methods being called by the settings system if an action is performed on multiple/...
Definition: ISettingsHandler.h:16
Definition: LangInfo.h:252
Definition: LangInfo.h:243
Definition: Addon.cpp:39
Definition: Speed.h:15
Definition: LangInfo.h:50
Class representing a full locale of the form [language[_territory][.codeset][@modifier]].
Definition: Locale.h:18