diff options
author | 2016-02-21 14:50:24 +0100 | |
---|---|---|
committer | 2016-02-21 14:50:24 +0100 | |
commit | bf4640c309c655c6cb7bc5b9bbab5c03029ccd86 (patch) | |
tree | c50f6f204d34c7a1888ab41cdf6c5250ffe7b8af /src/emu/language.cpp | |
parent | cc24a339d8c0517259084b5c178d784626ba965c (diff) | |
parent | a0ba40749d98488dafb84d365e4a6e44a4c01f84 (diff) |
Merge remote-tracking branch 'refs/remotes/mamedev/master'
Resolved Conflicts:
- src/osd/modules/render/d3d/d3dhlsl.cpp
- src/osd/modules/render/d3d/d3dhlsl.h
- src/osd/modules/render/drawd3d.cpp
- src/osd/modules/render/drawd3d.h
- src/osd/windows/winmain.cpp
Diffstat (limited to 'src/emu/language.cpp')
-rw-r--r-- | src/emu/language.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/emu/language.cpp b/src/emu/language.cpp new file mode 100644 index 00000000000..e5e224b891c --- /dev/null +++ b/src/emu/language.cpp @@ -0,0 +1,76 @@ +// license:BSD-3-Clause +// copyright-holders:Miodrag Milanovic +/*************************************************************************** + + language.cpp + + Multi-language support. + +***************************************************************************/ + +#include "emu.h" + +static std::unordered_map<std::string, std::string> g_translation; + +const char *lang_translate(const char *word) +{ + if (g_translation.find(word) == g_translation.end()) + { + return word; + } + return g_translation[word].c_str(); +} + +const UINT32 MO_MAGIC = 0x950412de; +const UINT32 MO_MAGIC_REVERSED = 0xde120495; + +inline UINT32 endianchange(UINT32 value) { + UINT32 b0 = (value >> 0) & 0xff; + UINT32 b1 = (value >> 8) & 0xff; + UINT32 b2 = (value >> 16) & 0xff; + UINT32 b3 = (value >> 24) & 0xff; + + return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3; +} + +void load_translation(emu_options &m_options) +{ + g_translation.clear(); + emu_file file(m_options.language_path(), OPEN_FLAG_READ); + auto name = std::string(m_options.language()); + strreplace(name, " ", "_"); + if (file.open(name.c_str(), PATH_SEPARATOR "strings.mo") == FILERR_NONE) + { + UINT64 size = file.size(); + UINT32 *buffer = global_alloc_array(UINT32, size / 4 + 1); + file.read(buffer, size); + file.close(); + + if (buffer[0] != MO_MAGIC && buffer[0] != MO_MAGIC_REVERSED) + { + global_free_array(buffer); + return; + } + if (buffer[0] == MO_MAGIC_REVERSED) + { + for (auto i = 0; i < (size / 4) + 1; ++i) + { + buffer[i] = endianchange(buffer[i]); + } + } + + UINT32 number_of_strings = buffer[2]; + UINT32 original_table_offset = buffer[3] >> 2; + UINT32 translation_table_offset = buffer[4] >> 2; + + const char *data = reinterpret_cast<const char*>(buffer); + + for (auto i = 1; i < number_of_strings; ++i) + { + std::string original = (const char *)data + buffer[original_table_offset + 2 * i + 1]; + std::string translation = (const char *)data + buffer[translation_table_offset + 2 * i + 1]; + g_translation.insert(std::pair<std::string, std::string>(original, translation)); + } + global_free_array(buffer); + } +}
\ No newline at end of file |