diff options
author | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
---|---|---|
committer | jmpoep <OriginalEntryPoint@qq.com> | 2023-12-07 16:51:07 +0800 |
commit | 28008a746a31abb7909dd86cb0cd413ac8943b0b (patch) | |
tree | a30b74b8cad548048c3c1551d652828ab76fa9bd /core/lang.cc | |
download | vmprotect-3.5.1-master.tar vmprotect-3.5.1-master.tar.gz vmprotect-3.5.1-master.tar.bz2 vmprotect-3.5.1-master.zip |
Diffstat (limited to 'core/lang.cc')
-rw-r--r-- | core/lang.cc | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/core/lang.cc b/core/lang.cc new file mode 100644 index 0000000..b7738cc --- /dev/null +++ b/core/lang.cc @@ -0,0 +1,122 @@ +#include "objects.h" +#include "inifile.h" +#include "osutils.h" +#include "lang.h" + +LangStringList language; + +/** + * Language + */ + +Language::Language(LanguageManager *owner, std::string id, const std::string &file_name) + : IObject(), owner_(owner), id_(id), file_name_(file_name) +{ + name_ = os::GetLocaleName(id_.c_str()); +} + +Language::~Language() +{ + if (owner_) + owner_->RemoveObject(this); +} + +/** + * LanguageManager + */ + +LanguageManager::LanguageManager() + : ObjectList<Language>() +{ + std::string path = os::GetExecutablePath(); + std::vector<std::string> lang_files = os::FindFiles(os::CombinePaths(path.c_str(), "langs").c_str(), "*.lng"); + for (size_t i = 0; i < lang_files.size(); i++) { + Add(lang_files[i]); + } + if (!GetLanguageById(default_language())) + InsertObject(0, new Language(this, default_language(), "")); +} + +void LanguageManager::Add(const std::string &file_name) +{ + std::string id = os::ChangeFileExt(os::ExtractFileName(file_name.c_str()).c_str(), ""); + + Language *lang = new Language(this, id, file_name); + AddObject(lang); +} + +void LanguageManager::set_language(const std::string &id) +{ + Language *lang = GetLanguageById(id); + if (!lang) + return; + + if (lang->file_name().empty()) + language.use_defaults(); + else + language.ReadFromFile(lang->file_name().c_str()); +} + +Language *LanguageManager::GetLanguageById(const std::string &id) const +{ + for (size_t i = 0; i < count(); i++) { + Language *lang = item(i); + if (lang->id() == id) + return lang; + } + return NULL; +} + +/** + * LangStringList + */ + +std::string replace_escape_chars(const char *str) +{ + std::string res; + while (*str) { + if (*str == '\\' && *(str + 1) == 'n') { + res += '\n'; + str++; + } else { + res += *str; + } + str++; + } + return res; +} + +LangStringList::LangStringList() +{ + #include "lang_def.inc" + use_defaults(); +} + +void LangStringList::use_defaults() +{ + for (size_t j = 0; j < lsCNT; j++) { + values_[j] = default_values_[j]; + } +} + +void LangStringList::ReadFromFile(const char *file_name) +{ + IniFile ini_file(file_name); + ReadFromIni(ini_file); +} + +void LangStringList::ReadFromIni(IIniFile &file) +{ +#include "lang_info.inc" //key_info.id is unnecessary but informative + for (size_t j = 0; j < _countof(key_info); j++) { + values_[j] = replace_escape_chars(file.ReadString("Main", key_info[j].name, default_values_[j].c_str()).c_str()); + } +} + +std::string LangStringList::operator[](LangString id) const +{ + assert(id != lsCNT); + if (id == lsCNT) + return std::string(); + return values_[id]; +}
\ No newline at end of file |