From 9dd9b8ec7415243b098da0a7c04a79bccc75788e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 23 Jun 2023 00:11:11 +0100 Subject: [PATCH] Fix #11054: Prevent translation of currency codes. Most languages stick with the 3-letter latin currency codes in the name string, however some translations are... clever... and use the currency symbol instead. Whilst this may look nice, it can cause issues with fonts as some scripts have a specific limited set of fonts which do not include these symbols. Instead, hard code the currency code list and add it when drawing the currency name. --- src/currency.cpp | 112 ++++++++++++++++++------------------------- src/currency.h | 6 +-- src/lang/english.txt | 84 ++++++++++++++++---------------- src/newgrf.cpp | 1 + src/settings_gui.cpp | 26 ++++++++-- 5 files changed, 114 insertions(+), 115 deletions(-) diff --git a/src/currency.cpp b/src/currency.cpp index c3e18b2ae9..f51ed30261 100644 --- a/src/currency.cpp +++ b/src/currency.cpp @@ -21,54 +21,54 @@ #include "safeguards.h" - /* exchange rate prefix symbol_pos - * | separator | postfix | - * | | Euro year | | | name - * | | | | | | | */ + /* exchange rate prefix code + * | separator | postfix | symbol_pos + * | | Euro year | | | | name + * | | | | | | | | */ /** The original currency specifications. */ static const CurrencySpec origin_currency_specs[CURRENCY_END] = { - { 1, "", CF_NOEURO, u8"\u00a3", "", 0, STR_GAME_OPTIONS_CURRENCY_GBP }, ///< british pound - { 2, "", CF_NOEURO, "$", "", 0, STR_GAME_OPTIONS_CURRENCY_USD }, ///< american dollar - { 2, "", CF_ISEURO, u8"\u20ac", "", 0, STR_GAME_OPTIONS_CURRENCY_EUR }, ///< euro - { 220, "", CF_NOEURO, u8"\u00a5", "", 0, STR_GAME_OPTIONS_CURRENCY_JPY }, ///< japanese yen - { 27, "", 2002, "", NBSP "S.", 1, STR_GAME_OPTIONS_CURRENCY_ATS }, ///< austrian schilling - { 81, "", 2002, "BEF" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_BEF }, ///< belgian franc - { 2, "", CF_NOEURO, "CHF" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_CHF }, ///< swiss franc - { 41, "", CF_NOEURO, "", NBSP u8"K\u010d", 1, STR_GAME_OPTIONS_CURRENCY_CZK }, ///< czech koruna - { 4, "", 2002, "DM" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_DEM }, ///< deutsche mark - { 11, "", CF_NOEURO, "", NBSP "kr", 1, STR_GAME_OPTIONS_CURRENCY_DKK }, ///< danish krone - { 333, "", 2002, "Pts" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_ESP }, ///< spanish peseta - { 12, "", 2002, "", NBSP "mk", 1, STR_GAME_OPTIONS_CURRENCY_FIM }, ///< finnish markka - { 13, "", 2002, "FF" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_FRF }, ///< french franc - { 681, "", 2002, "", "Dr.", 1, STR_GAME_OPTIONS_CURRENCY_GRD }, ///< greek drachma - { 378, "", CF_NOEURO, "", NBSP "Ft", 1, STR_GAME_OPTIONS_CURRENCY_HUF }, ///< hungarian forint - { 130, "", CF_NOEURO, "", NBSP "Kr", 1, STR_GAME_OPTIONS_CURRENCY_ISK }, ///< icelandic krona - { 3873, "", 2002, "", NBSP "L.", 1, STR_GAME_OPTIONS_CURRENCY_ITL }, ///< italian lira - { 4, "", 2002, "NLG" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_NLG }, ///< dutch gulden - { 12, "", CF_NOEURO, "", NBSP "Kr", 1, STR_GAME_OPTIONS_CURRENCY_NOK }, ///< norwegian krone - { 6, "", CF_NOEURO, "", NBSP u8"z\u0142", 1, STR_GAME_OPTIONS_CURRENCY_PLN }, ///< polish zloty - { 5, "", CF_NOEURO, "", NBSP "Lei", 1, STR_GAME_OPTIONS_CURRENCY_RON }, ///< romanian leu - { 50, "", CF_NOEURO, "", NBSP "p", 1, STR_GAME_OPTIONS_CURRENCY_RUR }, ///< russian rouble - { 479, "", 2007, "", NBSP "SIT", 1, STR_GAME_OPTIONS_CURRENCY_SIT }, ///< slovenian tolar - { 13, "", CF_NOEURO, "", NBSP "Kr", 1, STR_GAME_OPTIONS_CURRENCY_SEK }, ///< swedish krona - { 3, "", CF_NOEURO, "", NBSP "TL", 1, STR_GAME_OPTIONS_CURRENCY_TRY }, ///< turkish lira - { 60, "", 2009, "", NBSP "Sk", 1, STR_GAME_OPTIONS_CURRENCY_SKK }, ///< slovak koruna - { 4, "", CF_NOEURO, "R$" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_BRL }, ///< brazil real - { 31, "", 2011, "", NBSP "EEK", 1, STR_GAME_OPTIONS_CURRENCY_EEK }, ///< estonian krooni - { 4, "", 2015, "", NBSP "Lt", 1, STR_GAME_OPTIONS_CURRENCY_LTL }, ///< lithuanian litas - { 1850, "", CF_NOEURO, u8"\u20a9", "", 0, STR_GAME_OPTIONS_CURRENCY_KRW }, ///< south korean won - { 13, "", CF_NOEURO, "R" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_ZAR }, ///< south african rand - { 1, "", CF_NOEURO, "", "", 2, STR_GAME_OPTIONS_CURRENCY_CUSTOM }, ///< custom currency (add further languages below) - { 3, "", CF_NOEURO, "", NBSP "GEL", 1, STR_GAME_OPTIONS_CURRENCY_GEL }, ///< Georgian Lari - { 4901, "", CF_NOEURO, "", NBSP "Rls", 1, STR_GAME_OPTIONS_CURRENCY_IRR }, ///< Iranian Rial - { 80, "", CF_NOEURO, "", NBSP "rub", 1, STR_GAME_OPTIONS_CURRENCY_RUB }, ///< New Russian Ruble - { 24, "", CF_NOEURO, "$", "", 0, STR_GAME_OPTIONS_CURRENCY_MXN }, ///< Mexican peso - { 40, "", CF_NOEURO, "NTD" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_NTD }, ///< new taiwan dollar - { 8, "", CF_NOEURO, u8"\u00a5", "", 0, STR_GAME_OPTIONS_CURRENCY_CNY }, ///< chinese renminbi - { 10, "", CF_NOEURO, "HKD" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_HKD }, ///< hong kong dollar - { 90, "", CF_NOEURO, u8"\u20b9", "", 0, STR_GAME_OPTIONS_CURRENCY_INR }, ///< Indian Rupee - { 19, "", CF_NOEURO, "Rp", "", 0, STR_GAME_OPTIONS_CURRENCY_IDR }, ///< Indonesian Rupiah - { 5, "", CF_NOEURO, "RM", "", 0, STR_GAME_OPTIONS_CURRENCY_MYR }, ///< Malaysian Ringgit + { 1, "", CF_NOEURO, u8"\u00a3", "", "GBP", 0, STR_GAME_OPTIONS_CURRENCY_GBP }, ///< british pound + { 2, "", CF_NOEURO, "$", "", "USD", 0, STR_GAME_OPTIONS_CURRENCY_USD }, ///< american dollar + { 2, "", CF_ISEURO, u8"\u20ac", "", "EUR", 0, STR_GAME_OPTIONS_CURRENCY_EUR }, ///< euro + { 220, "", CF_NOEURO, u8"\u00a5", "", "JPY", 0, STR_GAME_OPTIONS_CURRENCY_JPY }, ///< japanese yen + { 27, "", 2002, "", NBSP "S.", "ATS", 1, STR_GAME_OPTIONS_CURRENCY_ATS }, ///< austrian schilling + { 81, "", 2002, "BEF" NBSP, "", "BEF", 0, STR_GAME_OPTIONS_CURRENCY_BEF }, ///< belgian franc + { 2, "", CF_NOEURO, "CHF" NBSP, "", "CHF", 0, STR_GAME_OPTIONS_CURRENCY_CHF }, ///< swiss franc + { 41, "", CF_NOEURO, "", NBSP u8"K\u010d", "CZK", 1, STR_GAME_OPTIONS_CURRENCY_CZK }, ///< czech koruna + { 4, "", 2002, "DM" NBSP, "", "DEM", 0, STR_GAME_OPTIONS_CURRENCY_DEM }, ///< deutsche mark + { 11, "", CF_NOEURO, "", NBSP "kr", "DKK", 1, STR_GAME_OPTIONS_CURRENCY_DKK }, ///< danish krone + { 333, "", 2002, "Pts" NBSP, "", "ESP", 0, STR_GAME_OPTIONS_CURRENCY_ESP }, ///< spanish peseta + { 12, "", 2002, "", NBSP "mk", "FIM", 1, STR_GAME_OPTIONS_CURRENCY_FIM }, ///< finnish markka + { 13, "", 2002, "FF" NBSP, "", "FRF", 0, STR_GAME_OPTIONS_CURRENCY_FRF }, ///< french franc + { 681, "", 2002, "", "Dr.", "GRD", 1, STR_GAME_OPTIONS_CURRENCY_GRD }, ///< greek drachma + { 378, "", CF_NOEURO, "", NBSP "Ft", "HUF", 1, STR_GAME_OPTIONS_CURRENCY_HUF }, ///< hungarian forint + { 130, "", CF_NOEURO, "", NBSP "Kr", "ISK", 1, STR_GAME_OPTIONS_CURRENCY_ISK }, ///< icelandic krona + { 3873, "", 2002, "", NBSP "L.", "ITL", 1, STR_GAME_OPTIONS_CURRENCY_ITL }, ///< italian lira + { 4, "", 2002, "NLG" NBSP, "", "NLG", 0, STR_GAME_OPTIONS_CURRENCY_NLG }, ///< dutch gulden + { 12, "", CF_NOEURO, "", NBSP "Kr", "NOK", 1, STR_GAME_OPTIONS_CURRENCY_NOK }, ///< norwegian krone + { 6, "", CF_NOEURO, "", NBSP u8"z\u0142", "PLN", 1, STR_GAME_OPTIONS_CURRENCY_PLN }, ///< polish zloty + { 5, "", CF_NOEURO, "", NBSP "Lei", "RON", 1, STR_GAME_OPTIONS_CURRENCY_RON }, ///< romanian leu + { 50, "", CF_NOEURO, "", NBSP "p", "RUR", 1, STR_GAME_OPTIONS_CURRENCY_RUR }, ///< russian rouble + { 479, "", 2007, "", NBSP "SIT", "SIT", 1, STR_GAME_OPTIONS_CURRENCY_SIT }, ///< slovenian tolar + { 13, "", CF_NOEURO, "", NBSP "Kr", "SEK", 1, STR_GAME_OPTIONS_CURRENCY_SEK }, ///< swedish krona + { 3, "", CF_NOEURO, "", NBSP "TL", "TRY", 1, STR_GAME_OPTIONS_CURRENCY_TRY }, ///< turkish lira + { 60, "", 2009, "", NBSP "Sk", "SKK", 1, STR_GAME_OPTIONS_CURRENCY_SKK }, ///< slovak koruna + { 4, "", CF_NOEURO, "R$" NBSP, "", "BRL", 0, STR_GAME_OPTIONS_CURRENCY_BRL }, ///< brazil real + { 31, "", 2011, "", NBSP "EEK", "EEK", 1, STR_GAME_OPTIONS_CURRENCY_EEK }, ///< estonian krooni + { 4, "", 2015, "", NBSP "Lt", "LTL", 1, STR_GAME_OPTIONS_CURRENCY_LTL }, ///< lithuanian litas + { 1850, "", CF_NOEURO, u8"\u20a9", "", "KRW", 0, STR_GAME_OPTIONS_CURRENCY_KRW }, ///< south korean won + { 13, "", CF_NOEURO, "R" NBSP, "", "ZAR", 0, STR_GAME_OPTIONS_CURRENCY_ZAR }, ///< south african rand + { 1, "", CF_NOEURO, "", "", "", 2, STR_GAME_OPTIONS_CURRENCY_CUSTOM }, ///< custom currency (add further languages below) + { 3, "", CF_NOEURO, "", NBSP "GEL", "GEL", 1, STR_GAME_OPTIONS_CURRENCY_GEL }, ///< Georgian Lari + { 4901, "", CF_NOEURO, "", NBSP "Rls", "IRR", 1, STR_GAME_OPTIONS_CURRENCY_IRR }, ///< Iranian Rial + { 80, "", CF_NOEURO, "", NBSP "rub", "RUB", 1, STR_GAME_OPTIONS_CURRENCY_RUB }, ///< New Russian Ruble + { 24, "", CF_NOEURO, "$", "", "MXN", 0, STR_GAME_OPTIONS_CURRENCY_MXN }, ///< Mexican peso + { 40, "", CF_NOEURO, "NTD" NBSP, "", "NTD", 0, STR_GAME_OPTIONS_CURRENCY_NTD }, ///< new taiwan dollar + { 8, "", CF_NOEURO, u8"\u00a5", "", "CNY", 0, STR_GAME_OPTIONS_CURRENCY_CNY }, ///< chinese renminbi + { 10, "", CF_NOEURO, "HKD" NBSP, "", "HKD", 0, STR_GAME_OPTIONS_CURRENCY_HKD }, ///< hong kong dollar + { 90, "", CF_NOEURO, u8"\u20b9", "", "INR", 0, STR_GAME_OPTIONS_CURRENCY_INR }, ///< Indian Rupee + { 19, "", CF_NOEURO, "Rp", "", "IDR", 0, STR_GAME_OPTIONS_CURRENCY_IDR }, ///< Indonesian Rupiah + { 5, "", CF_NOEURO, "RM", "", "MYR", 0, STR_GAME_OPTIONS_CURRENCY_MYR }, ///< Malaysian Ringgit }; /** Array of currencies used by the system */ @@ -162,23 +162,3 @@ void ResetCurrencies(bool preserve_custom) _currency_specs[i] = origin_currency_specs[i]; } } - -/** - * Build a list of currency names StringIDs to use in a dropdown list - * @return Pointer to a (static) array of StringIDs - */ -StringID *BuildCurrencyDropdown() -{ - /* Allow room for all currencies, plus a terminator entry */ - static StringID names[CURRENCY_END + 1]; - uint i; - - /* Add each name */ - for (i = 0; i < CURRENCY_END; i++) { - names[i] = _currency_specs[i].name; - } - /* Terminate the list */ - names[i] = INVALID_STRING_ID; - - return names; -} diff --git a/src/currency.h b/src/currency.h index 98ccbb2fca..098f3caca2 100644 --- a/src/currency.h +++ b/src/currency.h @@ -75,6 +75,7 @@ struct CurrencySpec { TimerGameCalendar::Year to_euro; ///< Year of switching to the Euro. May also be #CF_NOEURO or #CF_ISEURO. std::string prefix; ///< Prefix to apply when formatting money in this currency. std::string suffix; ///< Suffix to apply when formatting money in this currency. + std::string code; ///< 3 letter untranslated code to identify the currency. /** * The currency symbol is represented by two possible values, prefix and suffix * Usage of one or the other is determined by #symbol_pos. @@ -89,8 +90,8 @@ struct CurrencySpec { CurrencySpec() = default; - CurrencySpec(uint16 rate, const char *separator, TimerGameCalendar::Year to_euro, const char *prefix, const char *suffix, byte symbol_pos, StringID name) : - rate(rate), separator(separator), to_euro(to_euro), prefix(prefix), suffix(suffix), symbol_pos(symbol_pos), name(name) + CurrencySpec(uint16 rate, const char *separator, TimerGameCalendar::Year to_euro, const char *prefix, const char *suffix, const char *code, byte symbol_pos, StringID name) : + rate(rate), separator(separator), to_euro(to_euro), prefix(prefix), suffix(suffix), code(code), symbol_pos(symbol_pos), name(name) { } }; @@ -103,7 +104,6 @@ extern CurrencySpec _currency_specs[CURRENCY_END]; uint64 GetMaskOfAllowedCurrencies(); void ResetCurrencies(bool preserve_custom = true); -StringID *BuildCurrencyDropdown(); byte GetNewgrfCurrencyIdConverted(byte grfcurr_id); #endif /* CURRENCY_H */ diff --git a/src/lang/english.txt b/src/lang/english.txt index 90668a13cf..8ef9cca353 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -951,49 +951,51 @@ STR_GAME_OPTIONS_VOLUME_100 :100% STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Currency units STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Currency units selection +STR_GAME_OPTIONS_CURRENCY_CODE :{STRING} ({RAW_STRING}) + ###length 42 -STR_GAME_OPTIONS_CURRENCY_GBP :British Pound (GBP) -STR_GAME_OPTIONS_CURRENCY_USD :American Dollar (USD) -STR_GAME_OPTIONS_CURRENCY_EUR :Euro (EUR) -STR_GAME_OPTIONS_CURRENCY_JPY :Japanese Yen (JPY) -STR_GAME_OPTIONS_CURRENCY_ATS :Austrian Shilling (ATS) -STR_GAME_OPTIONS_CURRENCY_BEF :Belgian Franc (BEF) -STR_GAME_OPTIONS_CURRENCY_CHF :Swiss Franc (CHF) -STR_GAME_OPTIONS_CURRENCY_CZK :Czech Koruna (CZK) -STR_GAME_OPTIONS_CURRENCY_DEM :Deutschmark (DEM) -STR_GAME_OPTIONS_CURRENCY_DKK :Danish Krone (DKK) -STR_GAME_OPTIONS_CURRENCY_ESP :Spanish Peseta (ESP) -STR_GAME_OPTIONS_CURRENCY_FIM :Finnish Markka (FIM) -STR_GAME_OPTIONS_CURRENCY_FRF :French Franc (FRF) -STR_GAME_OPTIONS_CURRENCY_GRD :Greek Drachma (GRD) -STR_GAME_OPTIONS_CURRENCY_HUF :Hungarian Forint (HUF) -STR_GAME_OPTIONS_CURRENCY_ISK :Icelandic Krona (ISK) -STR_GAME_OPTIONS_CURRENCY_ITL :Italian Lira (ITL) -STR_GAME_OPTIONS_CURRENCY_NLG :Dutch Guilder (NLG) -STR_GAME_OPTIONS_CURRENCY_NOK :Norwegian Krone (NOK) -STR_GAME_OPTIONS_CURRENCY_PLN :Polish Złoty (PLN) -STR_GAME_OPTIONS_CURRENCY_RON :Romanian Leu (RON) -STR_GAME_OPTIONS_CURRENCY_RUR :Russian Rubles (RUR) -STR_GAME_OPTIONS_CURRENCY_SIT :Slovenian Tolar (SIT) -STR_GAME_OPTIONS_CURRENCY_SEK :Swedish Krona (SEK) -STR_GAME_OPTIONS_CURRENCY_TRY :Turkish Lira (TRY) -STR_GAME_OPTIONS_CURRENCY_SKK :Slovak Koruna (SKK) -STR_GAME_OPTIONS_CURRENCY_BRL :Brazilian Real (BRL) -STR_GAME_OPTIONS_CURRENCY_EEK :Estonian Krooni (EEK) -STR_GAME_OPTIONS_CURRENCY_LTL :Lithuanian Litas (LTL) -STR_GAME_OPTIONS_CURRENCY_KRW :South Korean Won (KRW) -STR_GAME_OPTIONS_CURRENCY_ZAR :South African Rand (ZAR) +STR_GAME_OPTIONS_CURRENCY_GBP :British Pound +STR_GAME_OPTIONS_CURRENCY_USD :American Dollar +STR_GAME_OPTIONS_CURRENCY_EUR :Euro +STR_GAME_OPTIONS_CURRENCY_JPY :Japanese Yen +STR_GAME_OPTIONS_CURRENCY_ATS :Austrian Shilling +STR_GAME_OPTIONS_CURRENCY_BEF :Belgian Franc +STR_GAME_OPTIONS_CURRENCY_CHF :Swiss Franc +STR_GAME_OPTIONS_CURRENCY_CZK :Czech Koruna +STR_GAME_OPTIONS_CURRENCY_DEM :Deutschmark +STR_GAME_OPTIONS_CURRENCY_DKK :Danish Krone +STR_GAME_OPTIONS_CURRENCY_ESP :Spanish Peseta +STR_GAME_OPTIONS_CURRENCY_FIM :Finnish Markka +STR_GAME_OPTIONS_CURRENCY_FRF :French Franc +STR_GAME_OPTIONS_CURRENCY_GRD :Greek Drachma +STR_GAME_OPTIONS_CURRENCY_HUF :Hungarian Forint +STR_GAME_OPTIONS_CURRENCY_ISK :Icelandic Krona +STR_GAME_OPTIONS_CURRENCY_ITL :Italian Lira +STR_GAME_OPTIONS_CURRENCY_NLG :Dutch Guilder +STR_GAME_OPTIONS_CURRENCY_NOK :Norwegian Krone +STR_GAME_OPTIONS_CURRENCY_PLN :Polish Złoty +STR_GAME_OPTIONS_CURRENCY_RON :Romanian Leu +STR_GAME_OPTIONS_CURRENCY_RUR :Russian Rubles +STR_GAME_OPTIONS_CURRENCY_SIT :Slovenian Tolar +STR_GAME_OPTIONS_CURRENCY_SEK :Swedish Krona +STR_GAME_OPTIONS_CURRENCY_TRY :Turkish Lira +STR_GAME_OPTIONS_CURRENCY_SKK :Slovak Koruna +STR_GAME_OPTIONS_CURRENCY_BRL :Brazilian Real +STR_GAME_OPTIONS_CURRENCY_EEK :Estonian Krooni +STR_GAME_OPTIONS_CURRENCY_LTL :Lithuanian Litas +STR_GAME_OPTIONS_CURRENCY_KRW :South Korean Won +STR_GAME_OPTIONS_CURRENCY_ZAR :South African Rand STR_GAME_OPTIONS_CURRENCY_CUSTOM :Custom... -STR_GAME_OPTIONS_CURRENCY_GEL :Georgian Lari (GEL) -STR_GAME_OPTIONS_CURRENCY_IRR :Iranian Rial (IRR) -STR_GAME_OPTIONS_CURRENCY_RUB :New Russian Ruble (RUB) -STR_GAME_OPTIONS_CURRENCY_MXN :Mexican Peso (MXN) -STR_GAME_OPTIONS_CURRENCY_NTD :New Taiwan Dollar (NTD) -STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminbi (CNY) -STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar (HKD) -STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee (INR) -STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah (IDR) -STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit (MYR) +STR_GAME_OPTIONS_CURRENCY_GEL :Georgian Lari +STR_GAME_OPTIONS_CURRENCY_IRR :Iranian Rial +STR_GAME_OPTIONS_CURRENCY_RUB :New Russian Ruble +STR_GAME_OPTIONS_CURRENCY_MXN :Mexican Peso +STR_GAME_OPTIONS_CURRENCY_NTD :New Taiwan Dollar +STR_GAME_OPTIONS_CURRENCY_CNY :Chinese Renminbi +STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Dollar +STR_GAME_OPTIONS_CURRENCY_INR :Indian Rupee +STR_GAME_OPTIONS_CURRENCY_IDR :Indonesian Rupiah +STR_GAME_OPTIONS_CURRENCY_MYR :Malaysian Ringgit STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Autosave STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Select interval between automatic game saves diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 13511b72ae..d17999e2ff 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2710,6 +2710,7 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, By if ((newone != STR_UNDEFINED) && (curidx < CURRENCY_END)) { _currency_specs[curidx].name = newone; + _currency_specs[curidx].code.clear(); } break; } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 06fa9d741b..48b5e52518 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -216,13 +216,19 @@ struct GameOptionsWindow : Window { switch (widget) { case WID_GO_CURRENCY_DROPDOWN: { // Setup currencies dropdown *selected_index = this->opt->locale.currency; - StringID *items = BuildCurrencyDropdown(); uint64 disabled = _game_mode == GM_MENU ? 0LL : ~GetMaskOfAllowedCurrencies(); /* Add non-custom currencies; sorted naturally */ - for (uint i = 0; i < CURRENCY_END; items++, i++) { + for (const CurrencySpec ¤cy : _currency_specs) { + int i = ¤cy - _currency_specs; if (i == CURRENCY_CUSTOM) continue; - list.emplace_back(new DropDownListStringItem(*items, i, HasBit(disabled, i))); + if (currency.code.empty()) { + list.emplace_back(new DropDownListStringItem(currency.name, i, HasBit(disabled, i))); + } else { + SetDParam(0, currency.name); + SetDParamStr(1, currency.code); + list.emplace_back(new DropDownListStringItem(STR_GAME_OPTIONS_CURRENCY_CODE, i, HasBit(disabled, i))); + } } std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc); @@ -303,7 +309,17 @@ struct GameOptionsWindow : Window { void SetStringParameters(int widget) const override { switch (widget) { - case WID_GO_CURRENCY_DROPDOWN: SetDParam(0, _currency_specs[this->opt->locale.currency].name); break; + case WID_GO_CURRENCY_DROPDOWN: { + const CurrencySpec ¤cy = _currency_specs[this->opt->locale.currency]; + if (currency.code.empty()) { + SetDParam(0, currency.name); + } else { + SetDParam(0, STR_GAME_OPTIONS_CURRENCY_CODE); + SetDParam(1, currency.name); + SetDParamStr(2, currency.code); + } + break; + } case WID_GO_AUTOSAVE_DROPDOWN: SetDParam(0, _autosave_dropdown[_settings_client.gui.autosave]); break; case WID_GO_LANG_DROPDOWN: SetDParamStr(0, _current_language->own_name); break; case WID_GO_BASE_GRF_DROPDOWN: SetDParamStr(0, BaseGraphics::GetUsedSet()->name); break; @@ -763,7 +779,7 @@ static const NWidgetPart _nested_game_options_widgets[] = { EndContainer(), NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME, STR_NULL), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_CURRENCY_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_JUST_STRING, STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP), SetFill(1, 0), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_CURRENCY_DROPDOWN), SetMinimalSize(100, 12), SetDataTip(STR_JUST_STRING2, STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP), SetFill(1, 0), EndContainer(), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_GO_SURVEY_SEL),