1
0
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:
Michael Steenbeek
2017-12-11 19:29:25 +01:00
parent e9c429e9ee
commit 2b2e617086
4 changed files with 56 additions and 35 deletions

View File

@@ -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))
{

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}