Skip to content

Commit b0d3fda

Browse files
committed
Added native language names
1 parent da5f801 commit b0d3fda

File tree

6 files changed

+81
-36
lines changed

6 files changed

+81
-36
lines changed

Client/core/CGUI.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,7 @@ void CLocalGUI::ChangeLocale(const char* szName)
107107
CClientVariables* cvars = CCore::GetSingleton().GetCVars();
108108
m_LastSettingsRevision = cvars->GetRevision();
109109

110-
// Don't delete old Localization as it crashes
111-
g_pLocalization = new CLocalization;
110+
g_pLocalization->SetCurrentLanguage();
112111
m_LastLocaleName = szName;
113112

114113
if (guiWasLoaded)
@@ -241,7 +240,7 @@ void CLocalGUI::DoPulse(void)
241240
}
242241
else
243242
{
244-
// Do actual local change
243+
// Do actual locale change
245244
m_LocaleChangeCounter = 0;
246245
CCore::GetSingleton().RemoveMessageBox();
247246

Client/core/CLanguage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "StdInc.h"
1313
#include "po_parser.hpp"
1414

15-
CLanguage::CLanguage(Dictionary Dict, const SString& strLocale, const SString& strLangName)
15+
CLanguage::CLanguage(const Dictionary& Dict, const SString& strLocale, const SString& strLangName)
1616
{
1717
m_Dict = Dict;
1818
m_strCode = strLocale;

Client/core/CLanguage.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ using namespace tinygettext;
1717
class CLanguage
1818
{
1919
public:
20-
CLanguage(Dictionary Dict, const SString& strLocale = "", const SString& strLangName = "");
20+
CLanguage(const Dictionary& Dict, const SString& strLocale = "", const SString& strLangName = "");
2121
CLanguage(const SString& strPOPath);
2222
~CLanguage(void);
2323

@@ -26,8 +26,9 @@ class CLanguage
2626
SString TranslatePlural(const SString& strSingular, const SString& strPlural, int iNum);
2727
SString TranslatePluralWithContext(const SString& strContext, const SString& strSingular, const SString& strPlural, int iNum);
2828

29-
SString GetCode(void) { return m_strCode; }
30-
SString GetName(void) { return m_strName; }
29+
SString GetCode(void) { return m_strCode; }
30+
SString GetName(void) { return m_strName; }
31+
Dictionary& GetDictionary(void) { return m_Dict; }
3132

3233
private:
3334
Dictionary m_Dict;

Client/core/CLocalization.cpp

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,84 @@
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

5596
SString CLocalization::Translate(const SString& strMessage)
@@ -74,7 +115,7 @@ SString CLocalization::TranslatePluralWithContext(const SString& strContext, con
74115

75116
SString 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
116157
SString 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;

Client/core/CLocalization.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ using namespace tinygettext;
2020
class CLocalization : public CLocalizationInterface
2121
{
2222
public:
23-
CLocalization(SString strLocale = "", SString strLocalePath = "");
23+
CLocalization(const SString& strLocale = "", const SString& strLocalePath = "");
2424
~CLocalization(void);
2525

2626
SString Translate(const SString& strMessage);
@@ -34,14 +34,17 @@ class CLocalization : public CLocalizationInterface
3434
SString GetLanguageDirectory(void);
3535
SString GetLanguageCode(void);
3636
SString GetLanguageName(void);
37+
SString ValidateLocale(SString strLocale);
38+
void SetCurrentLanguage(SString strLocale = "");
39+
CLanguage* GetLanguage(SString strLocale);
40+
SString GetLanguageNativeName(const SString& strLocale);
3741

3842
static void LogCallback(const std::string& str);
3943

4044
private:
41-
Dictionary m_CurrentDict;
42-
DictionaryManager m_DictManager;
43-
44-
CLanguage* m_pCurrentLang;
45+
DictionaryManager m_DictManager;
46+
std::map<SString, CLanguage*> m_LanguageMap;
47+
CLanguage* m_pCurrentLang;
4548
};
4649

47-
#endif
50+
#endif

Client/core/CSettings.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,7 +1939,8 @@ void CSettings::CreateInterfaceTabGUI(void)
19391939

19401940
for (const auto& language : availableLanguagesMap)
19411941
{
1942-
m_pInterfaceLanguageSelector->AddItem(language.first)->SetData(language.second);
1942+
SString strLanguageName = g_pLocalization->GetLanguageNativeName(language.second);
1943+
m_pInterfaceLanguageSelector->AddItem(strLanguageName)->SetData(language.second);
19431944
}
19441945

19451946
// Skin
@@ -4051,7 +4052,7 @@ bool CSettings::OnMasterVolumeChanged(CGUIElement* pElement)
40514052
{
40524053
int iVolume = m_pAudioMasterVolume->GetScrollPosition() * 100.0f;
40534054
m_pLabelMasterVolumeValue->SetText(SString("%i%%", iVolume).c_str());
4054-
4055+
40554056
CVARS_SET("mastervolume", m_pAudioMasterVolume->GetScrollPosition());
40564057

40574058
OnRadioVolumeChanged(nullptr);

0 commit comments

Comments
 (0)