@@ -25,6 +25,8 @@ struct NativeLanguageName
25
25
26
26
CLocalization::CLocalization (const SString& strLocale, const SString& strLocalePath)
27
27
{
28
+ m_pCurrentLang = NULL ;
29
+
28
30
// Set log callbacks so we can record problems
29
31
Log::set_log_info_callback (NULL );
30
32
Log::set_log_warning_callback (LogCallback);
@@ -102,8 +104,22 @@ CLanguage* CLocalization::GetLanguage(SString strLocale)
102
104
{
103
105
Language Lang = Language::from_name (strLocale);
104
106
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
+ }
107
123
}
108
124
return pLanguage;
109
125
}
@@ -124,38 +140,57 @@ SString CLocalization::GetLanguageNativeName(SString strLocale)
124
140
return iter->name ;
125
141
126
142
// 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);
128
148
if (strNativeName == " English" && strLocale != " en_US" )
129
149
{
130
150
// If native name not available, use English version
131
- strNativeName = GetLanguage (strLocale) ->GetName ();
151
+ strNativeName = pLanguage ->GetName ();
132
152
}
133
153
134
154
return strNativeName;
135
155
}
136
156
137
157
SString CLocalization::Translate (const SString& strMessage)
138
158
{
159
+ if (!m_pCurrentLang)
160
+ return strMessage;
161
+
139
162
return m_pCurrentLang->Translate (strMessage);
140
163
}
141
164
142
165
SString CLocalization::TranslateWithContext (const SString& strContext, const SString& strMessage)
143
166
{
167
+ if (!m_pCurrentLang)
168
+ return strMessage;
169
+
144
170
return m_pCurrentLang->TranslateWithContext (strContext, strMessage);
145
171
}
146
172
147
173
SString CLocalization::TranslatePlural (const SString& strSingular, const SString& strPlural, const int iNum)
148
174
{
175
+ if (!m_pCurrentLang)
176
+ return (iNum == 1 ? strSingular : strPlural);
177
+
149
178
return m_pCurrentLang->TranslatePlural (strSingular, strPlural, iNum);
150
179
}
151
180
152
181
SString CLocalization::TranslatePluralWithContext (const SString& strContext, const SString& strSingular, const SString& strPlural, int iNum)
153
182
{
183
+ if (!m_pCurrentLang)
184
+ return (iNum == 1 ? strSingular : strPlural);
185
+
154
186
return m_pCurrentLang->TranslatePluralWithContext (strContext, strSingular, strPlural, iNum);
155
187
}
156
188
157
189
SString CLocalization::GetTranslators ()
158
190
{
191
+ if (!m_pCurrentLang)
192
+ return " " ;
193
+
159
194
std::map<std::string, std::string> metaData = m_pCurrentLang->GetDictionary ().get_metadata ();
160
195
if (metaData.find (" Translators" ) != metaData.end ())
161
196
{
@@ -187,18 +222,21 @@ bool CLocalization::IsLocalized()
187
222
188
223
SString CLocalization::GetLanguageCode ()
189
224
{
190
- return m_pCurrentLang->GetCode ();
225
+ return m_pCurrentLang ? m_pCurrentLang ->GetCode () : SString ();
191
226
}
192
227
193
228
SString CLocalization::GetLanguageName ()
194
229
{
195
- return m_pCurrentLang->GetName ();
230
+ return m_pCurrentLang ? m_pCurrentLang ->GetName () : SString ();
196
231
}
197
232
198
233
// Get the file directory of the current language
199
234
SString CLocalization::GetLanguageDirectory (CLanguage* pLanguage)
200
235
{
201
236
CLanguage* pSelectLang = pLanguage != nullptr ? pLanguage : m_pCurrentLang;
237
+ if (!pSelectLang)
238
+ return SString ();
239
+
202
240
SString strFullPath = pSelectLang->GetDictionary ().get_filepath ();
203
241
204
242
// Replace all backslashes with forward slashes
0 commit comments