Index: boden/grund.cc =================================================================== --- boden/grund.cc (revision 8320) +++ boden/grund.cc (working copy) @@ -228,13 +228,29 @@ if(file->is_saving()) { const char *text = get_text(); - file->rdwr_str(text); + if( text && file->get_version()<120006 ) { + //convert ISO to UTF codepage, hoping for the best (will fail with czech) + const char *text2 = translator::dup_utf8_to_native(text,world()->get_settings().get_saved_name_language_code_id()); + file->rdwr_str(text2); + guarded_free(const_cast(text2)); + } + else { + file->rdwr_str(text); + } } else { const char *text = 0; file->rdwr_str(text); if(text) { - set_text(text); + if( file->get_version()<120006 ) { + //convert ISO to UTF codepage, hoping for the best (will fail with czech) + const char *text2 = translator::dup_native_to_utf8(text,world()->get_settings().get_saved_name_language_code_id()); + set_text( text2 ); + guarded_free(const_cast(text2)); + } + else { + set_text(text); + } guarded_free(const_cast(text)); } } Index: dataobj/settings.cc =================================================================== --- dataobj/settings.cc (revision 8320) +++ dataobj/settings.cc (working copy) @@ -548,6 +548,9 @@ // name of stops file->rdwr_str(language_code_names, lengthof(language_code_names) ); + if( file->is_loading() ) { + saved_name_language_code_id = translator::get_language(language_code_names); + } // restore AI state for( int i=0; i<15; i++ ) { @@ -643,6 +646,9 @@ else { // name of stops set_name_language_iso( env_t::language_iso ); + if( file->is_loading() ) { + saved_name_language_code_id = translator::get_language(env_t::language_iso); + } // default AIs active for( int i=0; i0 ) { Index: dataobj/settings.h =================================================================== --- dataobj/settings.h (revision 8320) +++ dataobj/settings.h (working copy) @@ -229,6 +229,7 @@ // names of the stations ... char language_code_names[4]; + int saved_name_language_code_id; // true, if the different capacities (passengers/mail/freight) are counted separately bool separate_halt_capacities; @@ -470,11 +471,8 @@ uint16 get_pak_diagonal_multiplier() const { return pak_diagonal_multiplier; } int get_name_language_id() const; - void set_name_language_iso( const char *iso ) { - language_code_names[0] = iso[0]; - language_code_names[1] = iso[1]; - language_code_names[2] = 0; - } + int get_saved_name_language_code_id() const { return saved_name_language_code_id; } + void set_name_language_iso( const char *iso ); void set_player_active(uint8 i, bool b) { player_active[i] = b; } void set_player_type(uint8 i, uint8 t) { player_type[i] = t; } Index: dataobj/translator.cc =================================================================== --- dataobj/translator.cc (revision 8320) +++ dataobj/translator.cc (working copy) @@ -129,6 +129,7 @@ static inline int is_cont_char(utf8 c) { return (c & 0xC0) == 0x80; } + // recodes string to put them into the tables static char *recode(const char *src, bool translate_from_utf, bool translate_to_utf, bool is_latin2 ) { @@ -194,6 +195,33 @@ + +const char *translator::dup_native_to_utf8( const char *str, int lang_id ) +{ + if( lang_id==-1 ) { + return strdup(str); + } + if( langs[lang_id].is_utf8_based ) { + return strdup(str); + } + return recode( str, false, true, langs[lang_id].is_latin2_based ); +} + + + +const char *translator::dup_utf8_to_native( const char *str, int lang_id ) +{ + if( lang_id==-1 ) { + return strdup(str); + } + if( langs[lang_id].is_utf8_based ) { + return strdup(str); + } + return recode( str, true, false, langs[lang_id].is_latin2_based ); +} + + + /* needed for loading city names */ static char pakset_path[256]; @@ -354,6 +382,7 @@ if( !file_is_utf ) { // find out the font if not unicode (and skip it) + langs[single_instance.lang_count].is_utf8_based = false; while( !feof(file) ) { fgets_line( buffer1, sizeof(buffer1), file ); if( buffer1[0] == '#' ) { @@ -372,6 +401,7 @@ else { // since it is anyway UTF8 langs[single_instance.lang_count].is_latin2_based = false; + langs[single_instance.lang_count].is_utf8_based = true; } //load up translations, putting them into Index: dataobj/translator.h =================================================================== --- dataobj/translator.h (revision 8320) +++ dataobj/translator.h (working copy) @@ -54,6 +54,7 @@ const char *iso; const char *iso_base; bool is_latin2_based; + bool is_utf8_based; uint8 eclipse_width; }; @@ -116,6 +117,9 @@ static const char *translate(const char* str); static const char *translate(const char* str, int lang); + static const char *dup_native_to_utf8( const char *str, int lang_id ); + static const char *dup_utf8_to_native( const char *str, int lang_id ); + /** * @return replacement info for almost any object within the game */