From 6d9ccee95dd99fecda3a6ba62c2768b4d39f69e5 Mon Sep 17 00:00:00 2001 From: Magnus Auvinen Date: Sat, 13 Jun 2009 16:54:04 +0000 Subject: base for the localization system --- src/game/localization.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/game/localization.cpp (limited to 'src/game/localization.cpp') diff --git a/src/game/localization.cpp b/src/game/localization.cpp new file mode 100644 index 00000000..cfc659f5 --- /dev/null +++ b/src/game/localization.cpp @@ -0,0 +1,56 @@ + +#include "localization.hpp" + +static unsigned str_hash(const char *str) +{ + unsigned hash = 5381; + for(; *str; str++) + hash = ((hash << 5) + hash) + (*str); /* hash * 33 + c */ + return hash; +} + +const char *localize(const char *str) +{ + const char *new_str = localization.find_string(str_hash(str)); + //dbg_msg("", "no localization for '%s'", str); + return new_str ? new_str : str; +} + +LOC_CONSTSTRING::LOC_CONSTSTRING(const char *str) +{ + default_str = str; + hash = str_hash(default_str); + version = -1; +} + +void LOC_CONSTSTRING::reload() +{ + version = localization.version(); + const char *new_str = localization.find_string(hash); + current_str = new_str; + if(!current_str) + current_str = default_str; +} + +LOCALIZATIONDATABASE::LOCALIZATIONDATABASE() +{ + current_version = 0; +} + +void LOCALIZATIONDATABASE::add_string(const char *org_str, const char *new_str) +{ + STRING s; + s.hash = str_hash(org_str); + s.replacement = new_str; + strings.add(s); + + current_version++; +} + +const char *LOCALIZATIONDATABASE::find_string(unsigned hash) +{ + array::range r = ::find(strings.all(), hash); + if(r.empty()) + return 0; + return r.front().replacement; +} -- cgit 1.4.1