@@ -25,6 +25,8 @@ struct NativeLanguageName
2525
2626CLocalization::CLocalization (const SString& strLocale, const SString& strLocalePath)
2727{
28+ m_pCurrentLang = NULL ;
29+
2830 // Set log callbacks so we can record problems
2931 Log::set_log_info_callback (NULL );
3032 Log::set_log_warning_callback (LogCallback);
@@ -102,8 +104,22 @@ CLanguage* CLocalization::GetLanguage(SString strLocale)
102104 {
103105 Language Lang = Language::from_name (strLocale);
104106 Lang = Lang ? Lang : Language::from_name (" en_US" );
105- pLanguage = new CLanguage (m_DictManager.get_dictionary (Lang, MTA_LOCALE_TEXTDOMAIN), Lang.str (), Lang.get_name ());
106- MapSet (m_LanguageMap, strLocale, pLanguage);
107+
108+ try
109+ {
110+ pLanguage = new CLanguage (m_DictManager.get_dictionary (Lang, MTA_LOCALE_TEXTDOMAIN), Lang.str (), Lang.get_name ());
111+ MapSet (m_LanguageMap, strLocale, pLanguage);
112+ }
113+ catch (const std::exception& ex)
114+ {
115+ WriteDebugEvent (SString (" Localization failed to load dictionary for '%s': %s" , strLocale.c_str (), ex.what ()));
116+ return (strLocale != " en_US" ) ? GetLanguage (" en_US" ) : nullptr ;
117+ }
118+ catch (...)
119+ {
120+ WriteDebugEvent (SString (" Localization failed to load dictionary for '%s': unknown error" , strLocale.c_str ()));
121+ return (strLocale != " en_US" ) ? GetLanguage (" en_US" ) : nullptr ;
122+ }
107123 }
108124 return pLanguage;
109125}
@@ -124,38 +140,57 @@ SString CLocalization::GetLanguageNativeName(SString strLocale)
124140 return iter->name ;
125141
126142 // If not found, we fall back to the loading the language file and using the name from there.
127- SString strNativeName = GetLanguage (strLocale)->Translate (NATIVE_LANGUAGE_NAME);
143+ CLanguage* pLanguage = GetLanguage (strLocale);
144+ if (!pLanguage)
145+ return SString ();
146+
147+ SString strNativeName = pLanguage->Translate (NATIVE_LANGUAGE_NAME);
128148 if (strNativeName == " English" && strLocale != " en_US" )
129149 {
130150 // If native name not available, use English version
131- strNativeName = GetLanguage (strLocale) ->GetName ();
151+ strNativeName = pLanguage ->GetName ();
132152 }
133153
134154 return strNativeName;
135155}
136156
137157SString CLocalization::Translate (const SString& strMessage)
138158{
159+ if (!m_pCurrentLang)
160+ return strMessage;
161+
139162 return m_pCurrentLang->Translate (strMessage);
140163}
141164
142165SString CLocalization::TranslateWithContext (const SString& strContext, const SString& strMessage)
143166{
167+ if (!m_pCurrentLang)
168+ return strMessage;
169+
144170 return m_pCurrentLang->TranslateWithContext (strContext, strMessage);
145171}
146172
147173SString CLocalization::TranslatePlural (const SString& strSingular, const SString& strPlural, const int iNum)
148174{
175+ if (!m_pCurrentLang)
176+ return (iNum == 1 ? strSingular : strPlural);
177+
149178 return m_pCurrentLang->TranslatePlural (strSingular, strPlural, iNum);
150179}
151180
152181SString CLocalization::TranslatePluralWithContext (const SString& strContext, const SString& strSingular, const SString& strPlural, int iNum)
153182{
183+ if (!m_pCurrentLang)
184+ return (iNum == 1 ? strSingular : strPlural);
185+
154186 return m_pCurrentLang->TranslatePluralWithContext (strContext, strSingular, strPlural, iNum);
155187}
156188
157189SString CLocalization::GetTranslators ()
158190{
191+ if (!m_pCurrentLang)
192+ return " " ;
193+
159194 std::map<std::string, std::string> metaData = m_pCurrentLang->GetDictionary ().get_metadata ();
160195 if (metaData.find (" Translators" ) != metaData.end ())
161196 {
@@ -187,18 +222,21 @@ bool CLocalization::IsLocalized()
187222
188223SString CLocalization::GetLanguageCode ()
189224{
190- return m_pCurrentLang->GetCode ();
225+ return m_pCurrentLang ? m_pCurrentLang ->GetCode () : SString ();
191226}
192227
193228SString CLocalization::GetLanguageName ()
194229{
195- return m_pCurrentLang->GetName ();
230+ return m_pCurrentLang ? m_pCurrentLang ->GetName () : SString ();
196231}
197232
198233// Get the file directory of the current language
199234SString CLocalization::GetLanguageDirectory (CLanguage* pLanguage)
200235{
201236 CLanguage* pSelectLang = pLanguage != nullptr ? pLanguage : m_pCurrentLang;
237+ if (!pSelectLang)
238+ return SString ();
239+
202240 SString strFullPath = pSelectLang->GetDictionary ().get_filepath ();
203241
204242 // Replace all backslashes with forward slashes
0 commit comments