235 lines
3.7 KiB
C++
Executable File
235 lines
3.7 KiB
C++
Executable File
/*
|
|
* This file is a part of Winix
|
|
* and is not publicly distributed
|
|
*
|
|
* Copyright (c) 2010, Tomasz Sowa
|
|
* All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#include "locale.h"
|
|
#include "log.h"
|
|
|
|
|
|
Locale::Locale()
|
|
{
|
|
loc_tab.resize(lang_unknown);
|
|
default_lang = lang_en;
|
|
current_lang = lang_en;
|
|
}
|
|
|
|
|
|
|
|
void Locale::AddLocale(Lang 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::ReadFile(const char * dir, const char * dir_def, Lang lang, const char * file)
|
|
{
|
|
if( static_cast<size_t>(lang) >= loc_tab.size() )
|
|
{
|
|
// ops, something wrong
|
|
return;
|
|
}
|
|
|
|
loc_tab[lang].clear();
|
|
bool read = false;
|
|
|
|
if( dir_def && ReadFile(dir_def, lang, file) )
|
|
read = true;
|
|
|
|
if( dir && ReadFile(dir, lang, file) )
|
|
read = true;
|
|
|
|
if( !read )
|
|
log << log1 << "Locale: can't open locale's file: " << file << logend;
|
|
}
|
|
|
|
|
|
bool Locale::ReadFile(const char * dir, Lang lang, const char * file)
|
|
{
|
|
bool read = false;
|
|
|
|
file_name = dir;
|
|
file_name += '/';
|
|
file_name += file;
|
|
|
|
loc_parser.SplitSingle(true);
|
|
|
|
if( loc_parser.Parse(file_name) == ConfParser::ok )
|
|
{
|
|
read = true;
|
|
AddLocale(lang);
|
|
log << log3 << "Locale: read locale from: " << file_name << logend;
|
|
}
|
|
|
|
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");
|
|
}
|
|
|
|
|
|
void Locale::Read(const std::string & dir, const std::string & dir_def)
|
|
{
|
|
if( dir_def.empty() )
|
|
Read(dir.c_str());
|
|
else
|
|
Read(dir.c_str(), dir_def.c_str());
|
|
}
|
|
|
|
|
|
void Locale::SetLang(Lang lang)
|
|
{
|
|
current_lang = lang;
|
|
}
|
|
|
|
|
|
Locale::Lang Locale::GetLang()
|
|
{
|
|
return current_lang;
|
|
}
|
|
|
|
|
|
|
|
void Locale::SetLangDef(Lang lang)
|
|
{
|
|
default_lang = lang_en;
|
|
}
|
|
|
|
|
|
bool Locale::IsKey(const std::string & key) const
|
|
{
|
|
return IsKey(key, current_lang);
|
|
}
|
|
|
|
|
|
bool Locale::IsKey(const std::string & key, Lang lang) const
|
|
{
|
|
if( static_cast<size_t>(lang) >= loc_tab.size() )
|
|
{
|
|
// ops, something wrong
|
|
return false;
|
|
}
|
|
|
|
// looking in the lang language
|
|
ConfParser::TableSingle::const_iterator i = loc_tab[lang].find(key);
|
|
|
|
if( i != loc_tab[lang].end() )
|
|
return true;
|
|
|
|
if( lang == default_lang )
|
|
return false;
|
|
|
|
|
|
if( static_cast<size_t>(default_lang) >= loc_tab.size() )
|
|
{
|
|
// ops, something wrong
|
|
return false;
|
|
}
|
|
|
|
// looking in a default language
|
|
i = loc_tab[default_lang].find(key);
|
|
|
|
if( i != loc_tab[default_lang].end() )
|
|
return true;
|
|
|
|
// there is no such a key
|
|
return false;
|
|
}
|
|
|
|
|
|
const std::string & Locale::Get(const std::string & key) const
|
|
{
|
|
return Get(key, current_lang);
|
|
}
|
|
|
|
|
|
|
|
const std::string & Locale::Get(const std::string & key, Lang lang) const
|
|
{
|
|
if( static_cast<size_t>(lang) >= loc_tab.size() )
|
|
{
|
|
// ops, something wrong
|
|
return empty;
|
|
}
|
|
|
|
// looking in the lang language
|
|
ConfParser::TableSingle::const_iterator i = loc_tab[lang].find(key);
|
|
|
|
if( i != loc_tab[lang].end() )
|
|
return i->second;
|
|
|
|
if( lang == default_lang )
|
|
return empty;
|
|
|
|
|
|
if( static_cast<size_t>(default_lang) >= loc_tab.size() )
|
|
{
|
|
// ops, something wrong
|
|
return empty;
|
|
}
|
|
|
|
// looking in a default language
|
|
i = loc_tab[default_lang].find(key);
|
|
|
|
if( i != loc_tab[default_lang].end() )
|
|
return i->second;
|
|
|
|
// there is no such a key
|
|
return empty;
|
|
}
|
|
|
|
|
|
Locale::Lang Locale::StrToLang(const std::string & str)
|
|
{
|
|
if( str == "en" )
|
|
return lang_en;
|
|
else
|
|
if( str == "pl" )
|
|
return lang_pl;
|
|
|
|
return lang_unknown;
|
|
}
|
|
|
|
|
|
|
|
const char * Locale::LangToStr(Lang lang)
|
|
{
|
|
static char buffer[30];
|
|
|
|
switch(lang)
|
|
{
|
|
case lang_en:
|
|
sprintf(buffer, "en");
|
|
break;
|
|
|
|
case lang_pl:
|
|
sprintf(buffer, "pl");
|
|
break;
|
|
|
|
default:
|
|
sprintf(buffer, "unknown");
|
|
}
|
|
|
|
|
|
return buffer;
|
|
}
|
|
|
|
|
|
|
|
size_t Locale::Size()
|
|
{
|
|
return loc_tab.size();
|
|
}
|