aboutsummaryrefslogtreecommitdiff
path: root/core/lang.cc
diff options
context:
space:
mode:
authorjmpoep <OriginalEntryPoint@qq.com>2023-12-07 16:51:07 +0800
committerjmpoep <OriginalEntryPoint@qq.com>2023-12-07 16:51:07 +0800
commit28008a746a31abb7909dd86cb0cd413ac8943b0b (patch)
treea30b74b8cad548048c3c1551d652828ab76fa9bd /core/lang.cc
downloadvmprotect-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
first commitHEADmaster
Diffstat (limited to 'core/lang.cc')
-rw-r--r--core/lang.cc122
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