/* * 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::Table::iterator i = loc_parser.table.begin(); for( ; i != loc_parser.table.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(lang) >= loc_tab.size() ) { // ops, something wrong return; } loc_tab[lang].clear(); bool read = false; if( dir_def ) { file_name = dir_def; file_name += '/'; file_name += file; if( loc_parser.Parse(file_name.c_str()) == ConfParser::ok ) { read = true; AddLocale(lang); log << log3 << "Locale: read locale from: " << file_name << logend; } } if( dir ) { file_name = dir; file_name += '/'; file_name += file; if( loc_parser.Parse(file_name.c_str()) == ConfParser::ok ) { read = true; AddLocale(lang); log << log3 << "Locale: read locale from: " << file_name << logend; } } if( !read ) log << log1 << "Locale: cant open file for locale: " << file << logend; } 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(lang) >= loc_tab.size() ) { // ops, something wrong return false; } // looking in the lang language ConfParser::Table::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(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(lang) >= loc_tab.size() ) { // ops, something wrong return empty; } // looking in the lang language ConfParser::Table::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(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(); }