(svn r16129) -Feature-ish: configurable digit group separator per language with user override.

pull/155/head
rubidium 15 years ago
parent 90879b0da5
commit ca04dc1916

@ -15,35 +15,35 @@
* | | Euro year | | | name
* | | | | | | | */
static const CurrencySpec origin_currency_specs[NUM_CURRENCY] = {
{ 1, ',', CF_NOEURO, "\xC2\xA3", "", 0, STR_CURR_GBP }, ///< british pounds
{ 2, ',', CF_NOEURO, "$", "", 0, STR_CURR_USD }, ///< us dollars
{ 2, ',', CF_ISEURO, "\xE2\x82\xAC", "", 0, STR_CURR_EUR }, ///< Euro
{ 220, ',', CF_NOEURO, "\xC2\xA5", "", 0, STR_CURR_YEN }, ///< yen
{ 20, ',', 2002, "", " S.", 1, STR_CURR_ATS }, ///< austrian schilling
{ 59, ',', 2002, "BEF ", "", 0, STR_CURR_BEF }, ///< belgian franc
{ 2, ',', CF_NOEURO, "CHF ", "", 0, STR_CURR_CHF }, ///< swiss franc
{ 41, ',', CF_NOEURO, "", " K\xC4\x8D", 1, STR_CURR_CZK }, ///< czech koruna
{ 3, '.', 2002, "DM ", "", 0, STR_CURR_DEM }, ///< deutsche mark
{ 11, '.', CF_NOEURO, "", " kr", 1, STR_CURR_DKK }, ///< danish krone
{ 245, '.', 2002, "Pts ", "", 0, STR_CURR_ESP }, ///< spanish pesetas
{ 9, ',', 2002, "", " mk", 1, STR_CURR_FIM }, ///< finnish markka
{ 10, '.', 2002, "FF ", "", 0, STR_CURR_FRF }, ///< french francs
{ 500, ',', 2002, "", "Dr.", 1, STR_CURR_GRD }, ///< greek drachma
{ 378, ',', CF_NOEURO, "", " Ft", 1, STR_CURR_HUF }, ///< hungarian forint
{ 130, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_ISK }, ///< icelandic krona
{ 2850, ',', 2002, "", " L.", 1, STR_CURR_ITL }, ///< italian lira
{ 3, ',', 2002, "NLG ", "", 0, STR_CURR_NLG }, ///< dutch gulden
{ 12, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_NOK }, ///< norwegian krone
{ 6, ' ', CF_NOEURO, "", " zl", 1, STR_CURR_PLN }, ///< polish zloty
{ 5, '.', CF_NOEURO, "", " Lei", 1, STR_CURR_RON }, ///< romanian Lei
{ 50, ' ', CF_NOEURO, "", " p", 1, STR_CURR_RUR }, ///< russian rouble
{ 352, '.', 2007, "", " SIT", 1, STR_CURR_SIT }, ///< slovenian tolar
{ 13, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_SEK }, ///< swedish krona
{ 3, '.', CF_NOEURO, "", " TL", 1, STR_CURR_TRY }, ///< turkish lira
{ 52, ',', 2009, "", " Sk", 1, STR_CURR_SKK }, ///< slovak koruna
{ 4, ',', CF_NOEURO, "R$ ", "", 0, STR_CURR_BRL }, ///< brazil real
{ 20, '.', CF_NOEURO, "", " EEK", 1, STR_CURR_EEK }, ///< estonian krooni
{ 1, ' ', CF_NOEURO, "", "", 2, STR_CURR_CUSTOM }, ///< custom currency
{ 1, '\0', CF_NOEURO, "\xC2\xA3", "", 0, STR_CURR_GBP }, ///< british pounds
{ 2, '\0', CF_NOEURO, "$", "", 0, STR_CURR_USD }, ///< us dollars
{ 2, '\0', CF_ISEURO, "\xE2\x82\xAC", "", 0, STR_CURR_EUR }, ///< Euro
{ 220, '\0', CF_NOEURO, "\xC2\xA5", "", 0, STR_CURR_YEN }, ///< yen
{ 20, '\0', 2002, "", " S.", 1, STR_CURR_ATS }, ///< austrian schilling
{ 59, '\0', 2002, "BEF ", "", 0, STR_CURR_BEF }, ///< belgian franc
{ 2, '\0', CF_NOEURO, "CHF ", "", 0, STR_CURR_CHF }, ///< swiss franc
{ 41, '\0', CF_NOEURO, "", " K\xC4\x8D", 1, STR_CURR_CZK }, ///< czech koruna
{ 3, '\0', 2002, "DM ", "", 0, STR_CURR_DEM }, ///< deutsche mark
{ 11, '\0', CF_NOEURO, "", " kr", 1, STR_CURR_DKK }, ///< danish krone
{ 245, '\0', 2002, "Pts ", "", 0, STR_CURR_ESP }, ///< spanish pesetas
{ 9, '\0', 2002, "", " mk", 1, STR_CURR_FIM }, ///< finnish markka
{ 10, '\0', 2002, "FF ", "", 0, STR_CURR_FRF }, ///< french francs
{ 500, '\0', 2002, "", "Dr.", 1, STR_CURR_GRD }, ///< greek drachma
{ 378, '\0', CF_NOEURO, "", " Ft", 1, STR_CURR_HUF }, ///< hungarian forint
{ 130, '\0', CF_NOEURO, "", " Kr", 1, STR_CURR_ISK }, ///< icelandic krona
{ 2850, '\0', 2002, "", " L.", 1, STR_CURR_ITL }, ///< italian lira
{ 3, '\0', 2002, "NLG ", "", 0, STR_CURR_NLG }, ///< dutch gulden
{ 12, '\0', CF_NOEURO, "", " Kr", 1, STR_CURR_NOK }, ///< norwegian krone
{ 6, '\0', CF_NOEURO, "", " zl", 1, STR_CURR_PLN }, ///< polish zloty
{ 5, '\0', CF_NOEURO, "", " Lei", 1, STR_CURR_RON }, ///< romanian Lei
{ 50, '\0', CF_NOEURO, "", " p", 1, STR_CURR_RUR }, ///< russian rouble
{ 352, '\0', 2007, "", " SIT", 1, STR_CURR_SIT }, ///< slovenian tolar
{ 13, '\0', CF_NOEURO, "", " Kr", 1, STR_CURR_SEK }, ///< swedish krona
{ 3, '\0', CF_NOEURO, "", " TL", 1, STR_CURR_TRY }, ///< turkish lira
{ 52, '\0', 2009, "", " Sk", 1, STR_CURR_SKK }, ///< slovak koruna
{ 4, '\0', CF_NOEURO, "R$ ", "", 0, STR_CURR_BRL }, ///< brazil real
{ 20, '\0', CF_NOEURO, "", " EEK", 1, STR_CURR_EEK }, ///< estonian krooni
{ 1, '\0', CF_NOEURO, "", "", 2, STR_CURR_CUSTOM }, ///< custom currency
};
/* Array of currencies used by the system */

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender male
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x14
##plural 1
##textdir rtl
##digitsep ٬
##digitsepcur ٬
#

@ -6,6 +6,8 @@
##plural 2
##textdir ltr
##gender m f
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case m f n p
##gender m f n p
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x22
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case nom gen dat aku vok lok ins
##gender male female middle
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case nom gen dat acc voc loc ins big small
##gender m f n
##digitsep {NBSP}
##digitsepcur {NBSP}
#

@ -5,6 +5,8 @@
##grflangid 0x2d
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x1f
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x01
##plural 0
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -5,6 +5,8 @@
##grflangid 0x00
##plural 0
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##case n
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##case g in
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x35
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 2
##textdir ltr
##gender m m2 f
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender m f n
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender m w n p
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 2
##textdir rtl
##gender m f
##digitsep ,
##digitsepcur ,
#

@ -6,6 +6,8 @@
##plural 2
##textdir ltr
##case t ba
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender karlkyn kvenkyn hvorugkyn
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x5a
##plural 1
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case ms mp fs fp
##gender m f
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x39
##plural 1
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -6,6 +6,8 @@
##plural 1
##textdir ltr
##gender m f
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case kas
##gender m f
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case kas ko kam ka kuo kur kreip
##gender vyr mot
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x23
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x2f
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender masculine feminine neuter
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x01
##plural 0
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -7,6 +7,8 @@
##textdir ltr
##case d c b n m w
##gender m f n
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x36
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x28
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case m f n p
##gender m f n p
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x56
##plural 1
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -7,6 +7,8 @@
##textdir ltr
##case g
##gender m z s
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 8
##textdir ltr
##case r d t
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender masculino femenino
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x2e
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x0c
##plural 1
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -5,6 +5,8 @@
##grflangid 0x3e
##plural 1
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -7,6 +7,8 @@
##textdir ltr
##case r d z
##gender m f s mn
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x32
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -6,6 +6,8 @@
##plural 0
##textdir ltr
##gender m f n
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x06
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x26
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x3c
##plural 0
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -5,6 +5,8 @@
##grflangid 0x62
##plural 0
##textdir rtl
##digitsep ٬
##digitsepcur ٬
#

@ -7,6 +7,8 @@
##textdir ltr
##case nom big gen dat aku vok lok ins
##gender muški ženski srednji
##digitsep .
##digitsepcur .
#

@ -5,6 +5,8 @@
##grflangid 0x42
##plural 1
##textdir ltr
##digitsep ,
##digitsepcur ,
#

@ -6,6 +6,8 @@
##plural 0
##textdir rtl
##gender m f
##digitsep ٬
##digitsepcur ٬
#

@ -5,6 +5,8 @@
##grflangid 0x0f
##plural 0
##textdir ltr
##digitsep .
##digitsepcur .
#

@ -40,7 +40,7 @@
#include "saveload_internal.h"
extern const uint16 SAVEGAME_VERSION = 117;
extern const uint16 SAVEGAME_VERSION = 118;
SavegameType _savegame_type; ///< type of savegame we are loading

@ -104,6 +104,8 @@ struct GUISettings {
struct LocaleSettings {
byte currency; ///< currency we currently use
byte units; ///< unit system we show everything
char *digit_group_separator; ///< thousand separator for non-currencies
char *digit_group_separator_currency; ///< thousand separator for currencies
};
/** All settings related to the network. */

@ -71,6 +71,8 @@ static int _next_string_id;
static uint32 _hash;
static char _lang_name[32], _lang_ownname[32], _lang_isocode[16];
static char _lang_digit_group_separator[8];
static char _lang_digit_group_separator_currency[8];
static byte _lang_pluralform;
static byte _lang_textdir;
static uint16 _lang_winlangid;
@ -526,6 +528,12 @@ static void HandlePragma(char *str)
} else {
error("Invalid textdir %s", str + 8);
}
} else if (!memcmp(str, "digitsep ", 9)) {
str += 9;
strecpy(_lang_digit_group_separator, strcmp(str, "{NBSP}") == 0 ? "\xC2\xA0" : str, lastof(_lang_digit_group_separator));
} else if (!memcmp(str, "digitsepcur ", 12)) {
str += 12;
strecpy(_lang_digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? "\xC2\xA0" : str, lastof(_lang_digit_group_separator_currency));
} else if (!memcmp(str, "winlangid ", 10)) {
const char *buf = str + 10;
long langid = strtol(buf, NULL, 16);
@ -802,6 +810,8 @@ static void ParseFile(const char *file, bool english)
/* For each new file we parse, reset the genders, and language codes */
_numgenders = 0;
_lang_name[0] = _lang_ownname[0] = _lang_isocode[0] = '\0';
strecpy(_lang_digit_group_separator, ",", lastof(_lang_digit_group_separator));
strecpy(_lang_digit_group_separator_currency, ",", lastof(_lang_digit_group_separator_currency));
_lang_textdir = TD_LTR;
_lang_winlangid = 0x0000; // neutral language code
_lang_newgrflangid = 0; // standard english
@ -1059,6 +1069,8 @@ static void WriteLangfile(const char *filename)
strecpy(hdr.name, _lang_name, lastof(hdr.name));
strecpy(hdr.own_name, _lang_ownname, lastof(hdr.own_name));
strecpy(hdr.isocode, _lang_isocode, lastof(hdr.isocode));
strecpy(hdr.digit_group_separator, _lang_digit_group_separator, lastof(hdr.digit_group_separator));
strecpy(hdr.digit_group_separator_currency, _lang_digit_group_separator_currency, lastof(hdr.digit_group_separator_currency));
fwrite(&hdr, sizeof(hdr), 1, f);

@ -5,15 +5,21 @@
#ifndef STRGEN_H
#define STRGEN_H
/** Header of a language file. */
struct LanguagePackHeader {
uint32 ident; // 32-bits identifier
uint32 version; // 32-bits of auto generated version info which is basically a hash of strings.h
char name[32]; // the international name of this language
char own_name[32]; // the localized name of this language
char isocode[16]; // the ISO code for the language (not country code)
uint16 offsets[32]; // the offsets
byte plural_form; // plural form index
byte text_dir; // default direction of the text
uint32 ident; ///< 32-bits identifier
uint32 version; ///< 32-bits of auto generated version info which is basically a hash of strings.h
char name[32]; ///< the international name of this language
char own_name[32]; ///< the localized name of this language
char isocode[16]; ///< the ISO code for the language (not country code)
uint16 offsets[32]; ///< the offsets
/** Thousand separator used for anything not currencies */
char digit_group_separator[8];
/** Thousand separator used for currencies */
char digit_group_separator_currency[8];
byte plural_form; ///< plural form index
byte text_dir; ///< default direction of the text
/**
* Windows language ID:
* Windows cannot and will not convert isocodes to something it can use to
@ -22,9 +28,9 @@ struct LanguagePackHeader {
* what language it is in "Windows". The ID is the 'locale identifier' on:
* http://msdn.microsoft.com/en-us/library/ms776294.aspx
*/
uint16 winlangid; // windows language id
uint8 newgrflangid; // newgrf language id
byte pad[3]; // pad header to be a multiple of 4
uint16 winlangid; ///< windows language id
uint8 newgrflangid; ///< newgrf language id
byte pad[3]; ///< pad header to be a multiple of 4
};
assert_compile(sizeof(LanguagePackHeader) % 4 == 0);

@ -217,7 +217,9 @@ static char *FormatNumber(char *buff, int64 number, const char *last, const char
static char *FormatCommaNumber(char *buff, int64 number, const char *last)
{
return FormatNumber(buff, number, last, ",");
const char *separator = _settings_game.locale.digit_group_separator;
if (separator == NULL) separator = _langpack->digit_group_separator;
return FormatNumber(buff, number, last, separator);
}
static char *FormatNoCommaNumber(char *buff, int64 number, const char *last)
@ -333,8 +335,13 @@ static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, Money n
}
}
char sep[2] = { spec->separator, '\0' };
buff = FormatNumber(buff, number, last, sep);
const char *separator = _settings_game.locale.digit_group_separator_currency;
if (separator == NULL && _currency->separator != '\0') {
static char sep[] = { _currency->separator, '\0' };
separator = sep;
}
if (separator == NULL) separator = _langpack->digit_group_separator_currency;
buff = FormatNumber(buff, number, last, separator);
buff = strecpy(buff, multiplier, last);
/* Add suffix part, folowing symbol_pos specification.

@ -510,6 +510,8 @@ const SettingDesc _settings[] = {
SDT_CONDOMANY(GameSettings, locale.currency, SLE_UINT8, 97, SL_MAX_VERSION, N, 0, 0, CUSTOM_CURRENCY_ID, _locale_currencies, STR_NULL, NULL, NULL),
SDT_CONDOMANY(GameSettings, locale.units, SLE_UINT8, 97, SL_MAX_VERSION, N, 0, 1, 2, _locale_units, STR_NULL, NULL, NULL),
SDT_CONDSTR(GameSettings, locale.digit_group_separator, SLE_STRQ,118, SL_MAX_VERSION, N, NULL, STR_NULL, NULL, NULL),
SDT_CONDSTR(GameSettings, locale.digit_group_separator_currency, SLE_STRQ,118, SL_MAX_VERSION, N, NULL, STR_NULL, NULL, NULL),
/***************************************************************************/
/* Unsaved setting variables. */

Loading…
Cancel
Save