Skip to content

Commit 49ba658

Browse files
committed
Addendum #2 to 86ad47c & dc0fb96
1 parent 2a9726d commit 49ba658

File tree

1 file changed

+44
-6
lines changed

1 file changed

+44
-6
lines changed

Client/core/CLocalization.cpp

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ struct NativeLanguageName
2525

2626
CLocalization::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

137157
SString CLocalization::Translate(const SString& strMessage)
138158
{
159+
if (!m_pCurrentLang)
160+
return strMessage;
161+
139162
return m_pCurrentLang->Translate(strMessage);
140163
}
141164

142165
SString 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

147173
SString 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

152181
SString 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

157189
SString 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

188223
SString CLocalization::GetLanguageCode()
189224
{
190-
return m_pCurrentLang->GetCode();
225+
return m_pCurrentLang ? m_pCurrentLang->GetCode() : SString();
191226
}
192227

193228
SString 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
199234
SString 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

Comments
 (0)