From c0fa36b9a1ee49f2f7c5899f4890b5118ba154a8 Mon Sep 17 00:00:00 2001 From: Fyren Date: Wed, 25 May 2011 21:10:18 -0400 Subject: [PATCH] Added support for language aliases (bug 4858, r=dvander). --- core/logic/Translator.cpp | 66 ++++++++++++++++++++++++++------------- core/logic/Translator.h | 3 +- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/core/logic/Translator.cpp b/core/logic/Translator.cpp index a3270bf9..5106b269 100644 --- a/core/logic/Translator.cpp +++ b/core/logic/Translator.cpp @@ -776,26 +776,25 @@ bool Translator::GetLanguageByCode(const char *code, unsigned int *index) bool Translator::GetLanguageByName(const char *name, unsigned int *index) { - CVector::iterator iter; - unsigned int id = 0; - - for (iter=m_Languages.begin(); iter!=m_Languages.end(); iter++, id++) + char lower[256]; + size_t len = strlen(name); + if (len > 255) len = 255; + for (size_t i = 0; i < len; i++) { - if (strcasecmp(m_pStringTab->GetString((*iter)->m_FullName), name) == 0) - { - break; - } + if (name[i] >= 'A' && name[i] <= 'Z') + lower[i] = tolower(name[i]); + else + lower[i] = name[i]; } + lower[len] = '\0'; - if (iter == m_Languages.end()) - { + unsigned int *pIndex; + + if ((pIndex = m_LAliases.retrieve(lower)) == NULL) return false; - } if (index) - { - *index = id; - } + *index = *pIndex; return true; } @@ -834,6 +833,7 @@ void Translator::RebuildLanguageDatabase(const char *lang_header_file) { /* Erase everything we have */ m_LCodeLookup.clear(); + m_LAliases.clear(); m_pStringTab->Reset(); for (size_t i=0; i 255) len = 255; + for (size_t i = 0; i < len; i++) + { + if (description[i] >= 'A' && description[i] <= 'Z') + lower[i] = tolower(description[i]); + else + lower[i] = description[i]; + } + lower[len] = '\0'; + + if (m_LAliases.retrieve(lower)) return false; - Language *pLanguage = new Language; - unsigned int idx = m_Languages.size(); + unsigned int idx; + if (unsigned int *pIdx = m_LCodeLookup.retrieve(langcode)) + { + idx = *pIdx; + } + else + { + Language *pLanguage = new Language; + idx = m_Languages.size(); - smcore.Format(pLanguage->m_code2, sizeof(pLanguage->m_code2), "%s", langcode); - pLanguage->m_FullName = m_pStringTab->AddString(description); + smcore.Format(pLanguage->m_code2, sizeof(pLanguage->m_code2), "%s", langcode); + pLanguage->m_CanonicalName = m_pStringTab->AddString(lower); - m_LCodeLookup.insert(langcode, idx); + m_LCodeLookup.insert(langcode, idx); - m_Languages.push_back(pLanguage); + m_Languages.push_back(pLanguage); + } + + m_LAliases.insert(lower, idx); return true; } @@ -981,7 +1003,7 @@ bool Translator::GetLanguageInfo(unsigned int number, const char **code, const c } if (name) { - *name = m_pStringTab->GetString(l->m_FullName); + *name = m_pStringTab->GetString(l->m_CanonicalName); } return true; diff --git a/core/logic/Translator.h b/core/logic/Translator.h index 4c2275f5..ccb4001f 100644 --- a/core/logic/Translator.h +++ b/core/logic/Translator.h @@ -55,7 +55,7 @@ enum PhraseParseState struct Language { char m_code2[4]; - int m_FullName; + int m_CanonicalName; }; class CPhraseFile : @@ -153,6 +153,7 @@ private: CVector m_Files; BaseStringTable *m_pStringTab; KTrie m_LCodeLookup; + KTrie m_LAliases; bool m_InLanguageSection; String m_CustomError; unsigned int m_ServerLang;