1313#include " ../../vendor/tinygettext/log.hpp"
1414#define MTA_LOCALE_DIR " MTA/locale/"
1515#define MTA_LOCALE_TEXTDOMAIN " client"
16+ // TRANSLATORS: Replace with your language native name
17+ #define NATIVE_LANGUAGE_NAME _td (" English" )
1618
17- CLocalization::CLocalization (SString strLocale, SString strLocalePath)
19+ CLocalization::CLocalization(const SString& strLocale, const SString& strLocalePath)
1820{
19- strLocalePath = strLocalePath.empty () ? CalcMTASAPath (MTA_LOCALE_DIR) : strLocalePath;
20-
21- // Initialize our language
22- if (strLocale.empty () && !CVARS_GET (" locale" , strLocale))
23- strLocale = " en_US" ;
24-
25- WriteDebugEvent (SString (" CLocalization::CLocalization Localization set to '%s'" , strLocale.c_str ()));
26-
2721 // Set log callbacks so we can record problems
2822 Log::set_log_info_callback (NULL );
2923 Log::set_log_warning_callback (LogCallback);
3024 Log::set_log_error_callback (LogCallback);
3125
32- // Grab the nearest language based upon our setting, or revert to en_US
26+ // Setup our dictionary manager
27+ m_DictManager.add_directory (strLocalePath.empty () ? CalcMTASAPath (MTA_LOCALE_DIR) : strLocalePath);
28+
29+ // Initialize our language
30+ SetCurrentLanguageFromLocale (strLocale);
31+ }
32+
33+ CLocalization::~CLocalization (void )
34+ {
35+ for (auto iter : m_LanguageMap)
36+ {
37+ delete iter.second ;
38+ }
39+ }
40+
41+ //
42+ // Ensure supplied locale is valid. Uses settings if input is empty
43+ //
44+ SString CLocalization::ValidateLocale (SString strLocale)
45+ {
46+ if (strLocale.empty () && !CVARS_GET (" locale" , strLocale))
47+ strLocale = " en_US" ;
3348 Language Lang = Language::from_name (strLocale);
3449 Lang = Lang ? Lang : Language::from_name (" en_US" );
50+ return Lang.str ();
51+ }
52+
53+ //
54+ // Switch current language to supplied locale
55+ //
56+ void CLocalization::SetCurrentLanguage (SString strLocale)
57+ {
58+ strLocale = ValidateLocale (strLocale);
59+ WriteDebugEvent (SString (" Localization set to '%s'" , strLocale.c_str ()));
3560
3661 // Update our locale setting with full country code, now that we've matched it
37- strLocale = Lang.str ();
3862 if (g_pCore)
3963 CVARS_SET (" locale" , strLocale);
4064
41- // Setup our dictionary manager
42- m_DictManager.add_directory (strLocalePath);
43-
44- // Grab our translation dictionary from this dir
45- m_CurrentDict = m_DictManager.get_dictionary (Lang, MTA_LOCALE_TEXTDOMAIN);
65+ m_pCurrentLang = GetLanguage (strLocale);
66+ }
4667
47- m_pCurrentLang = new CLanguage (m_CurrentDict, strLocale, Lang.get_name ());
68+ CLanguage* CLocalization::GetLanguage (SString strLocale)
69+ {
70+ strLocale = ValidateLocale (strLocale);
71+ CLanguage* pLanguage = MapFindRef (m_LanguageMap, strLocale);
72+ if (!pLanguage)
73+ {
74+ Language Lang = Language::from_name (strLocale);
75+ Lang = Lang ? Lang : Language::from_name (" en_US" );
76+ pLanguage = new CLanguage (m_DictManager.get_dictionary (Lang, MTA_LOCALE_TEXTDOMAIN), Lang.str (), Lang.get_name ());
77+ MapSet (m_LanguageMap, strLocale, pLanguage);
78+ }
79+ return pLanguage;
4880}
4981
50- CLocalization::~CLocalization (void )
82+ //
83+ // Get translated language name
84+ //
85+ SString CLocalization::GetLanguageNativeName (const SString& strLocale)
5186{
52- delete m_pCurrentLang;
87+ SString strNativeName = GetLanguage (strLocale)->Translate (NATIVE_LANGUAGE_NAME);
88+ if (strNativeName == " English" )
89+ {
90+ // If native name not available, use English version
91+ strNativeName = GetLanguage (strLocale)->GetName ();
92+ }
93+ return strNativeName;
5394}
5495
5596SString CLocalization::Translate (const SString& strMessage)
@@ -74,7 +115,7 @@ SString CLocalization::TranslatePluralWithContext(const SString& strContext, con
74115
75116SString CLocalization::GetTranslators ()
76117{
77- std::map<std::string, std::string> metaData = m_CurrentDict .get_metadata ();
118+ std::map<std::string, std::string> metaData = m_pCurrentLang-> GetDictionary () .get_metadata ();
78119 if (metaData.find (" Translators" ) != metaData.end ())
79120 {
80121 SString strTranslatorsList = metaData[" Translators" ];
@@ -115,7 +156,7 @@ SString CLocalization::GetLanguageName(void)
115156// Get the file directory of the current language
116157SString CLocalization::GetLanguageDirectory (void )
117158{
118- SString strFullPath = m_CurrentDict .get_filepath ();
159+ SString strFullPath = m_pCurrentLang-> GetDictionary () .get_filepath ();
119160
120161 // Replace all backslashes with forward slashes
121162 int idx = 0 ;
0 commit comments