1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-10 09:32:29 +01:00

implement utf8, part 7

This commit is contained in:
IntelOrca
2015-07-27 15:12:36 +01:00
parent d6a7025a3a
commit f14187f89d
6 changed files with 13753 additions and 10 deletions

View File

@@ -4,13 +4,15 @@
<LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommand>$(TargetDir)\openrct2.exe</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>"C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6"</LocalDebuggerCommandArguments>
<LocalDebuggerCommandArguments>
</LocalDebuggerCommandArguments>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release with Tests|Win32'">
<LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommand>$(TargetDir)\openrct2.exe</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>"C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6"</LocalDebuggerCommandArguments>
<LocalDebuggerCommandArguments>
</LocalDebuggerCommandArguments>
</PropertyGroup>
<PropertyGroup>
<ShowAllFiles>false</ShowAllFiles>
@@ -19,6 +21,7 @@
<LocalDebuggerCommand>$(TargetDir)\openrct2.exe</LocalDebuggerCommand>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerWorkingDirectory>$(TargetDir)</LocalDebuggerWorkingDirectory>
<LocalDebuggerCommandArguments>"C:\Program Files (x86)\Infogrames\RollerCoaster Tycoon 2\Scenarios\Electric Fields.SC6"</LocalDebuggerCommandArguments>
<LocalDebuggerCommandArguments>
</LocalDebuggerCommandArguments>
</PropertyGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -44,8 +44,8 @@ enum {
RCT2_LANGUAGE_ID_SWEDISH,
RCT2_LANGUAGE_ID_8,
RCT2_LANGUAGE_ID_KOREAN,
RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL,
RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED,
RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL,
RCT2_LANGUAGE_ID_12,
RCT2_LANGUAGE_ID_PORTUGESE,
RCT2_LANGUAGE_ID_END = 255
@@ -65,6 +65,7 @@ const language_descriptor LanguagesDescriptors[LANGUAGE_COUNT] = {
{ "it-IT", "Italian", "Italiano", "italian", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_ITALIAN }, // LANGUAGE_ITALIAN
{ "pt-BR", "Portuguese (BR)", "Portug\xC3\xAAs (BR)", "portuguese_br", FONT_OPENRCT2_SPRITE, RCT2_LANGUAGE_ID_PORTUGESE }, // LANGUAGE_PORTUGUESE_BR
{ "zh-Hant", "Chinese (Traditional)", "Chinese (Traditional)", "chinese_traditional", "msjh.ttc", RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL }, // LANGUAGE_CHINESE_TRADITIONAL
// { "kr-KR", "Korean", "Korean", "english_uk", "malgun.ttf", RCT2_LANGUAGE_ID_KOREAN }, // LANGUAGE_KOREAN
};
int gCurrentLanguage = LANGUAGE_UNDEFINED;
@@ -376,7 +377,21 @@ void utf8_trim_string(utf8 *text)
*last = 0;
}
static utf8 *convert_multibyte_charset(const char *src)
static wchar_t convert_specific_language_character_to_unicode(int languageId, wchar_t codepoint)
{
switch (languageId) {
case RCT2_LANGUAGE_ID_KOREAN:
return codepoint;
case RCT2_LANGUAGE_ID_CHINESE_TRADITIONAL:
return encoding_convert_big5_to_unicode(codepoint);
case RCT2_LANGUAGE_ID_CHINESE_SIMPLIFIED:
return encoding_convert_gb2312_to_unicode(codepoint);
default:
return codepoint;
}
}
static utf8 *convert_multibyte_charset(const char *src, int languageId)
{
int reservedLength = (strlen(src) * 4) + 1;
utf8 *buffer = malloc(reservedLength);
@@ -388,7 +403,7 @@ static utf8 *convert_multibyte_charset(const char *src)
uint8 b = *ch++;
uint16 codepoint = (a << 8) | b;
codepoint = encoding_convert_gb2312_to_unicode(codepoint - 0x8080);
codepoint = convert_specific_language_character_to_unicode(languageId, codepoint);
dst = utf8_write_codepoint(dst, codepoint);
} else {
*dst++ = *ch++;
@@ -397,6 +412,7 @@ static utf8 *convert_multibyte_charset(const char *src)
*dst++ = 0;
int actualLength = dst - buffer;
buffer = realloc(buffer, actualLength);
return buffer;
}
@@ -480,7 +496,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/
free(*cacheString);
}
if (rct2_language_is_multibyte_charset(chosenLanguageId)) {
*cacheString = convert_multibyte_charset(pString);
*cacheString = convert_multibyte_charset(pString, chosenLanguageId);
} else {
*cacheString = win1252_to_utf8_alloc(pString);
}
@@ -503,7 +519,7 @@ rct_string_id object_get_localised_text(uint8_t** pStringTable/*ebp*/, int type/
free(*cacheString);
}
if (rct2_language_is_multibyte_charset(chosenLanguageId)) {
*cacheString = convert_multibyte_charset(pString);
*cacheString = convert_multibyte_charset(pString, chosenLanguageId);
} else {
*cacheString = win1252_to_utf8_alloc(pString);
}

View File

@@ -37,6 +37,7 @@ enum {
LANGUAGE_ITALIAN,
LANGUAGE_PORTUGUESE_BR,
LANGUAGE_CHINESE_TRADITIONAL,
// LANGUAGE_KOREAN,
LANGUAGE_COUNT
};

View File

@@ -800,7 +800,7 @@ void generate_string_file()
utf8 *get_string_end(utf8 *text)
{
int codepoint;
const utf8 *ch = text;
utf8 *ch = text;
while ((codepoint = utf8_get_next(ch, &ch)) != 0) {
if (utf8_is_format_code(codepoint)) {

View File

@@ -47,6 +47,7 @@ utf8 *win1252_to_utf8_alloc(const char *src);
int win1252_to_utf8(utf8string dst, const char *src, int maxBufferLength);
wchar_t encoding_convert_gb2312_to_unicode(wchar_t gb2312);
wchar_t encoding_convert_big5_to_unicode(wchar_t big5);
#define MAX_USER_STRINGS 1024
#define USER_STRING_MAX_LENGTH 32