mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-23 06:44:38 +01:00
Use OpenRCT2 language ID in SetString, avoid mixups
This commit is contained in:
@@ -154,7 +154,7 @@ void language_close_all()
|
||||
constexpr rct_string_id NONSTEX_BASE_STRING_ID = 3463;
|
||||
constexpr uint16 MAX_OBJECT_CACHED_STRINGS = 2048;
|
||||
|
||||
static wchar_t convert_specific_language_character_to_unicode(sint32 languageId, wchar_t codepoint)
|
||||
static wchar_t convert_specific_language_character_to_unicode(RCT2LanguageId languageId, wchar_t codepoint)
|
||||
{
|
||||
switch (languageId) {
|
||||
case RCT2_LANGUAGE_ID_KOREAN:
|
||||
@@ -168,7 +168,7 @@ static wchar_t convert_specific_language_character_to_unicode(sint32 languageId,
|
||||
}
|
||||
}
|
||||
|
||||
static utf8 * convert_multibyte_charset(const char * src, size_t srcMaxSize, sint32 languageId)
|
||||
static utf8 * convert_multibyte_charset(const char * src, size_t srcMaxSize, RCT2LanguageId languageId)
|
||||
{
|
||||
constexpr char CODEPOINT_DOUBLEBYTE = (char)(uint8)0xFF;
|
||||
|
||||
@@ -200,7 +200,7 @@ static utf8 * convert_multibyte_charset(const char * src, size_t srcMaxSize, sin
|
||||
return sb.StealString();
|
||||
}
|
||||
|
||||
static bool rct2_language_is_multibyte_charset(sint32 languageId)
|
||||
static bool rct2_language_is_multibyte_charset(RCT2LanguageId languageId)
|
||||
{
|
||||
switch (languageId) {
|
||||
case RCT2_LANGUAGE_ID_KOREAN:
|
||||
@@ -213,7 +213,7 @@ static bool rct2_language_is_multibyte_charset(sint32 languageId)
|
||||
}
|
||||
}
|
||||
|
||||
utf8 *rct2_language_string_to_utf8(const char *src, size_t srcSize, sint32 languageId)
|
||||
utf8 * rct2_language_string_to_utf8(const char *src, size_t srcSize, RCT2LanguageId languageId)
|
||||
{
|
||||
if (rct2_language_is_multibyte_charset(languageId))
|
||||
{
|
||||
|
||||
@@ -20,26 +20,6 @@
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
enum
|
||||
{
|
||||
RCT2_LANGUAGE_ID_ENGLISH_UK,
|
||||
RCT2_LANGUAGE_ID_ENGLISH_US,
|
||||
RCT2_LANGUAGE_ID_FRENCH,
|
||||
RCT2_LANGUAGE_ID_GERMAN,
|
||||
RCT2_LANGUAGE_ID_SPANISH,
|
||||
RCT2_LANGUAGE_ID_ITALIAN,
|
||||
RCT2_LANGUAGE_ID_DUTCH,
|
||||
RCT2_LANGUAGE_ID_SWEDISH,
|
||||
RCT2_LANGUAGE_ID_JAPANESE,
|
||||
RCT2_LANGUAGE_ID_KOREAN,
|
||||
RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED,
|
||||
RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL,
|
||||
RCT2_LANGUAGE_ID_12,
|
||||
RCT2_LANGUAGE_ID_PORTUGUESE,
|
||||
RCT2_LANGUAGE_ID_BLANK = 254,
|
||||
RCT2_LANGUAGE_ID_END = 255
|
||||
};
|
||||
|
||||
interface ILanguagePack
|
||||
{
|
||||
virtual ~ILanguagePack() = default;
|
||||
|
||||
@@ -46,6 +46,26 @@ enum {
|
||||
LANGUAGE_COUNT
|
||||
};
|
||||
|
||||
typedef enum RCT2LanguageId
|
||||
{
|
||||
RCT2_LANGUAGE_ID_ENGLISH_UK,
|
||||
RCT2_LANGUAGE_ID_ENGLISH_US,
|
||||
RCT2_LANGUAGE_ID_FRENCH,
|
||||
RCT2_LANGUAGE_ID_GERMAN,
|
||||
RCT2_LANGUAGE_ID_SPANISH,
|
||||
RCT2_LANGUAGE_ID_ITALIAN,
|
||||
RCT2_LANGUAGE_ID_DUTCH,
|
||||
RCT2_LANGUAGE_ID_SWEDISH,
|
||||
RCT2_LANGUAGE_ID_JAPANESE,
|
||||
RCT2_LANGUAGE_ID_KOREAN,
|
||||
RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED,
|
||||
RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL,
|
||||
RCT2_LANGUAGE_ID_12,
|
||||
RCT2_LANGUAGE_ID_PORTUGUESE,
|
||||
RCT2_LANGUAGE_ID_BLANK = 254,
|
||||
RCT2_LANGUAGE_ID_END = 255
|
||||
} RCT2LanguageId;
|
||||
|
||||
#define FONT_OPENRCT2_SPRITE NULL
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -61,7 +81,7 @@ typedef struct language_descriptor {
|
||||
#else
|
||||
void * font_family;
|
||||
#endif
|
||||
uint8 rct2_original_id;
|
||||
RCT2LanguageId rct2_original_id;
|
||||
} language_descriptor;
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -93,7 +113,7 @@ sint32 utf8_length(const utf8 *text);
|
||||
wchar_t *utf8_to_widechar(const utf8 *src);
|
||||
utf8 *widechar_to_utf8(const wchar_t *src);
|
||||
|
||||
utf8 *rct2_language_string_to_utf8(const char *src, size_t srcSize, sint32 languageId);
|
||||
utf8 *rct2_language_string_to_utf8(const char *src, size_t srcSize, RCT2LanguageId languageId);
|
||||
bool language_get_localised_scenario_strings(const utf8 *scenarioFilename, rct_string_id *outStringIds);
|
||||
rct_string_id language_allocate_object_string(const utf8 * target);
|
||||
void language_free_object_string(rct_string_id stringId);
|
||||
|
||||
@@ -22,6 +22,24 @@
|
||||
#include "Object.h"
|
||||
#include "StringTable.h"
|
||||
|
||||
static const uint8 RCT2ToOpenRCT2LanguageId[] =
|
||||
{
|
||||
LANGUAGE_ENGLISH_UK,
|
||||
LANGUAGE_ENGLISH_US,
|
||||
LANGUAGE_FRENCH,
|
||||
LANGUAGE_GERMAN,
|
||||
LANGUAGE_SPANISH,
|
||||
LANGUAGE_ITALIAN,
|
||||
LANGUAGE_DUTCH,
|
||||
LANGUAGE_SWEDISH,
|
||||
LANGUAGE_JAPANESE,
|
||||
LANGUAGE_KOREAN,
|
||||
LANGUAGE_CHINESE_SIMPLIFIED,
|
||||
LANGUAGE_CHINESE_TRADITIONAL,
|
||||
LANGUAGE_UNDEFINED,
|
||||
LANGUAGE_PORTUGUESE_BR,
|
||||
};
|
||||
|
||||
static bool StringIsBlank(utf8 * str)
|
||||
{
|
||||
for (utf8 * ch = str; *ch != '\0'; ch++)
|
||||
@@ -46,19 +64,23 @@ void StringTable::Read(IReadObjectContext * context, IStream * stream, uint8 id)
|
||||
{
|
||||
try
|
||||
{
|
||||
uint8 languageId;
|
||||
while ((languageId = stream->ReadValue<uint8>()) != RCT2_LANGUAGE_ID_END)
|
||||
RCT2LanguageId rct2LanguageId;
|
||||
while ((rct2LanguageId = (RCT2LanguageId)stream->ReadValue<uint8>()) != RCT2_LANGUAGE_ID_END)
|
||||
{
|
||||
uint8 languageId =
|
||||
(rct2LanguageId <= RCT2_LANGUAGE_ID_PORTUGUESE) ?
|
||||
RCT2ToOpenRCT2LanguageId[rct2LanguageId] :
|
||||
LANGUAGE_UNDEFINED;
|
||||
StringTableEntry entry;
|
||||
entry.Id = id;
|
||||
entry.LanguageId = languageId;
|
||||
|
||||
std::string stringAsWin1252 = stream->ReadStdString();
|
||||
utf8 * stringAsUtf8 = rct2_language_string_to_utf8(stringAsWin1252.c_str(), stringAsWin1252.size(), languageId);
|
||||
utf8 * stringAsUtf8 = rct2_language_string_to_utf8(stringAsWin1252.c_str(), stringAsWin1252.size(), rct2LanguageId);
|
||||
|
||||
if (StringIsBlank(stringAsUtf8))
|
||||
{
|
||||
entry.LanguageId = RCT2_LANGUAGE_ID_BLANK;
|
||||
entry.LanguageId = LANGUAGE_UNDEFINED;
|
||||
}
|
||||
String::Trim(stringAsUtf8);
|
||||
|
||||
@@ -97,21 +119,20 @@ void StringTable::Sort()
|
||||
return _strcmpi(a.Text, b.Text) < 0;
|
||||
}
|
||||
|
||||
uint8 currentLanguage = LanguagesDescriptors[gCurrentLanguage].rct2_original_id;
|
||||
if (a.LanguageId == currentLanguage)
|
||||
if (a.LanguageId == gCurrentLanguage)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (b.LanguageId == currentLanguage)
|
||||
if (b.LanguageId == gCurrentLanguage)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (a.LanguageId == RCT2_LANGUAGE_ID_ENGLISH_UK)
|
||||
if (a.LanguageId == LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (b.LanguageId == RCT2_LANGUAGE_ID_ENGLISH_UK)
|
||||
if (b.LanguageId == LANGUAGE_ENGLISH_UK)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user