changed: removed Languages::Land enum

now we set the languages in the config file: option locale_files, sample:
  locale_files = ( en, pl )
it represents the name of locale files (those from locale_dir directory)
renamed config option: locale to locale_default


git-svn-id: svn://ttmath.org/publicrep/winix/trunk@722 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2011-02-24 17:06:12 +00:00
parent 15487b347f
commit ba63c8c661
18 changed files with 268 additions and 179 deletions

View File

@@ -2,42 +2,46 @@
* This file is a part of Winix
* and is not publicly distributed
*
* Copyright (c) 2010, Tomasz Sowa
* Copyright (c) 2010-2011, Tomasz Sowa
* All rights reserved.
*
*/
#include "locale.h"
#include "core/log.h"
#include "utf8.h"
Locale::Locale()
{
loc_tab.resize(lang_unknown);
default_lang = lang_en;
current_lang = lang_en;
locale_files.push_back(L"en");
loc_tab.resize(locale_files.size());
default_lang = 0;
current_lang = 0;
input_as_utf8 = false;
}
void Locale::AddLocale(Lang lang)
void Locale::SetLocaleFiles(const std::vector<std::wstring> & files)
{
ConfParser::TableSingle::iterator i = loc_parser.table_single.begin();
locale_files = files;
for( ; i != loc_parser.table_single.end() ; ++i)
loc_tab[lang][i->first] = i->second;
if( locale_files.empty() )
locale_files.push_back(L"en");
loc_tab.resize(locale_files.size());
}
void Locale::ReadFile(const char * dir, const char * dir_def, Lang lang, const char * file)
void Locale::ReadFile(const char * dir, const char * dir_def, size_t lang, const char * file)
{
if( static_cast<size_t>(lang) >= loc_tab.size() )
{
// ops, something wrong
if( lang >= loc_tab.size() )
return;
}
loc_tab[lang].clear();
bool read = false;
@@ -53,13 +57,13 @@ void Locale::ReadFile(const char * dir, const char * dir_def, Lang lang, const c
}
bool Locale::ReadFile(const char * dir, Lang lang, const char * file)
bool Locale::ReadFile(const char * dir, size_t lang, const char * file)
{
bool read = false;
file_name = dir;
file_name += '/';
file_name += file;
file_name += file; // !! dodac sprawdzenie poprawnosci nazwy pliku (czy nie zawiera specjalnych znakow)
loc_parser.SplitSingle(true);
loc_parser.UTF8(input_as_utf8);
@@ -75,6 +79,16 @@ return read;
}
void Locale::AddLocale(size_t lang)
{
ConfParser::TableSingle::iterator i = loc_parser.table_single.begin();
for( ; i != loc_parser.table_single.end() ; ++i)
loc_tab[lang][i->first] = i->second;
}
void Locale::ReadSubstTable(const char * dir, const char * dir_def)
{
bool read = false;
@@ -119,8 +133,11 @@ return read;
void Locale::Read(const char * dir, const char * dir_def)
{
ReadFile(dir, dir_def, lang_pl, "pl");
ReadFile(dir, dir_def, lang_en, "en");
for(size_t i=0 ; i<locale_files.size() ; ++i)
{
Ezc::WideToUTF8(locale_files[i], locale_filea);
ReadFile(dir, dir_def, i, locale_filea.c_str());
}
ReadSubstTable(dir, dir_def);
@@ -140,7 +157,7 @@ void Locale::Read(const std::string & dir, const std::string & dir_def)
void Locale::Read(const wchar_t * dir, const wchar_t * dir_def)
{
AssignString(dir, adir1);
Ezc::WideToUTF8(dir, adir1);
if( !dir_def )
{
@@ -148,7 +165,7 @@ void Locale::Read(const wchar_t * dir, const wchar_t * dir_def)
}
else
{
AssignString(dir_def, adir2);
Ezc::WideToUTF8(dir_def, adir2);
Read(adir1.c_str(), adir2.c_str());
}
}
@@ -156,28 +173,57 @@ void Locale::Read(const wchar_t * dir, const wchar_t * dir_def)
void Locale::Read(const std::wstring & dir, const std::wstring & dir_def)
{
Read(dir.c_str(), dir_def.c_str());
if( dir_def.empty() )
Read(dir.c_str());
else
Read(dir.c_str(), dir_def.c_str());
}
void Locale::SetLang(Lang lang)
void Locale::SetLang(size_t lang)
{
current_lang = lang;
if( current_lang >= loc_tab.size() )
current_lang = loc_tab.size() - 1;
}
Locale::Lang Locale::GetLang()
size_t Locale::GetLang() const
{
return current_lang;
}
void Locale::SetLangDef(Lang lang)
void Locale::SetLangDef(size_t lang)
{
default_lang = lang_en;
default_lang = lang;
if( default_lang >= loc_tab.size() )
default_lang = loc_tab.size() - 1;
}
size_t Locale::GetLangDef() const
{
return default_lang;
}
bool Locale::IsKey(const wchar_t * key)
{
key_str = key;
return IsKey(key_str);
}
bool Locale::IsKey(const wchar_t * key, size_t lang)
{
key_str = key;
return IsKey(key_str, lang);
}
bool Locale::IsKey(const std::wstring & key) const
{
@@ -185,15 +231,12 @@ bool Locale::IsKey(const std::wstring & key) const
}
bool Locale::IsKey(const std::wstring & key, Lang lang) const
bool Locale::IsKey(const std::wstring & key, size_t lang) const
{
if( static_cast<size_t>(lang) >= loc_tab.size() )
{
// ops, something wrong
if( lang >= loc_tab.size() )
return false;
}
// looking in the lang language
// looking in the 'lang' language
ConfParser::TableSingle::const_iterator i = loc_tab[lang].find(key);
if( i != loc_tab[lang].end() )
@@ -203,11 +246,8 @@ bool Locale::IsKey(const std::wstring & key, Lang lang) const
return false;
if( static_cast<size_t>(default_lang) >= loc_tab.size() )
{
// ops, something wrong
if( default_lang >= loc_tab.size() )
return false;
}
// looking in a default language
i = loc_tab[default_lang].find(key);
@@ -220,6 +260,21 @@ bool Locale::IsKey(const std::wstring & key, Lang lang) const
}
const std::wstring & Locale::Get(const wchar_t * key)
{
key_str = key;
return Get(key_str);
}
const std::wstring & Locale::Get(const wchar_t * key, size_t lang)
{
key_str = key;
return Get(key_str, lang);
}
const std::wstring & Locale::Get(const std::wstring & key) const
{
return Get(key, current_lang);
@@ -227,15 +282,12 @@ const std::wstring & Locale::Get(const std::wstring & key) const
const std::wstring & Locale::Get(const std::wstring & key, Lang lang) const
const std::wstring & Locale::Get(const std::wstring & key, size_t lang) const
{
if( static_cast<size_t>(lang) >= loc_tab.size() )
{
// ops, something wrong
if( lang >= loc_tab.size() )
return empty;
}
// looking in the lang language
// looking in the 'lang' language
ConfParser::TableSingle::const_iterator i = loc_tab[lang].find(key);
if( i != loc_tab[lang].end() )
@@ -245,11 +297,8 @@ const std::wstring & Locale::Get(const std::wstring & key, Lang lang) const
return empty;
if( static_cast<size_t>(default_lang) >= loc_tab.size() )
{
// ops, something wrong
if( default_lang >= loc_tab.size() )
return empty;
}
// looking in a default language
i = loc_tab[default_lang].find(key);
@@ -262,44 +311,29 @@ const std::wstring & Locale::Get(const std::wstring & key, Lang lang) const
}
Locale::Lang Locale::StrToLang(const std::wstring & str)
size_t Locale::FileNameToLang(const std::wstring & str) const
{
if( str == L"en" )
return lang_en;
else
if( str == L"pl" )
return lang_pl;
return lang_unknown;
}
const wchar_t * Locale::LangToStr(Lang lang)
{
static wchar_t buffer[30];
size_t buffer_len = sizeof(buffer) / sizeof(wchar_t);
switch(lang)
for(size_t i=0 ; i<locale_files.size() ; ++i)
{
case lang_en:
swprintf(buffer, buffer_len, L"en");
break;
case lang_pl:
swprintf(buffer, buffer_len, L"pl");
break;
default:
swprintf(buffer, buffer_len, L"unknown");
if( locale_files[i] == str )
return i;
}
return buffer;
// we have at least one item "en"
return 0;
}
const std::wstring & Locale::LangToFileName(size_t lang) const
{
if( lang >=locale_files.size() )
return empty;
return locale_files[lang];
}
size_t Locale::Size()
{
return loc_tab.size();