From 5dec9be2e9864d70f1a137bdaf5ba90f6708cd4e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 10 Jul 2021 11:34:04 -0700 Subject: [PATCH] AGS: Skeleton for converting UTF-8 translation keys to ASCII From upstream e04f86a91b248f598fccf04369e0874393a9a45d Upstream uses locale, but since that isn't available to a ScummVM engine, for now it's just a skeleton implementation --- engines/ags/engine/ac/translation.cpp | 24 ++++++++++++++++++++++++ engines/ags/globals.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/engines/ags/engine/ac/translation.cpp b/engines/ags/engine/ac/translation.cpp index e91e250d076..7cd27a2bc8f 100644 --- a/engines/ags/engine/ac/translation.cpp +++ b/engines/ags/engine/ac/translation.cpp @@ -20,6 +20,7 @@ * */ +#include "common/language.h" #include "ags/engine/ac/asset_helper.h" #include "ags/shared/ac/common.h" #include "ags/engine/ac/game_setup.h" @@ -40,6 +41,13 @@ namespace AGS3 { using namespace AGS::Shared; +// TODO: Since ScummVM can't use uconvert, this is a dummy implementation for now +const char *convert_utf8_to_ascii(const char *mbstr, const char *loc_name) { + _G(mbbuf).resize(strlen(mbstr) + 1); + strcpy(&_G(mbbuf)[0], mbstr); + return &_G(mbbuf)[0]; +} + void close_translation() { _GP(transtree).clear(); _GP(trans) = Translation(); @@ -111,6 +119,22 @@ bool init_translation(const String &lang, const String &fallback_lang, bool quit else set_uformat(U_ASCII); + // Mixed encoding support: + // original text unfortunately may contain extended ASCII chars (> 127); + // if translation is UTF-8 but game is extended ASCII, then the translation + // dictionary keys won't match. + // With that assumption we must convert dictionary keys into ASCII using + // provided locale hint. + String key_enc = _GP(trans).StrOptions["gameencoding"]; + if (!key_enc.IsEmpty()) { + StringMap conv_map; + for (const auto &item : _GP(trans).Dict) { + String key = convert_utf8_to_ascii(item._key.GetCStr(), key_enc.GetCStr()); + conv_map.insert(std::make_pair(key, item._value)); + } + _GP(trans).Dict = conv_map; + } + Debug::Printf("Translation initialized: %s", _G(trans_filename).GetCStr()); return true; } diff --git a/engines/ags/globals.h b/engines/ags/globals.h index 0f9d6f6dc74..12e07cd071b 100644 --- a/engines/ags/globals.h +++ b/engines/ags/globals.h @@ -1319,6 +1319,8 @@ public: String _trans_name, _trans_filename; long _lang_offs_start = 0; char _transFileName[MAX_PATH] = { 0 }; + std::vector _wcsbuf; // widechar buffer + std::vector _mbbuf; // utf8 buffer /**@}*/