From 56b0eac2e9b912ec67812e590d5d1a6506a30c6f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Jul 2024 00:05:42 +0100 Subject: [PATCH 01/41] Codechange: Use std::span/std::string_view for strecpy. (#12848) This avoids needing to manually pass the last character of the destination buffer, and allows use of standard library functions. --- src/strgen/strgen.cpp | 16 ++++++++-------- src/strgen/strgen_base.cpp | 6 +++--- src/string.cpp | 25 +++++++++---------------- src/string_func.h | 2 +- 4 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index 63f5c02b4d..0c5e1dfa3f 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -108,11 +108,11 @@ void FileStringReader::HandlePragma(char *str) if (!memcmp(str, "id ", 3)) { this->data.next_string_id = std::strtoul(str + 3, nullptr, 0); } else if (!memcmp(str, "name ", 5)) { - strecpy(_lang.name, str + 5, lastof(_lang.name)); + strecpy(_lang.name, str + 5); } else if (!memcmp(str, "ownname ", 8)) { - strecpy(_lang.own_name, str + 8, lastof(_lang.own_name)); + strecpy(_lang.own_name, str + 8); } else if (!memcmp(str, "isocode ", 8)) { - strecpy(_lang.isocode, str + 8, lastof(_lang.isocode)); + strecpy(_lang.isocode, str + 8); } else if (!memcmp(str, "textdir ", 8)) { if (!memcmp(str + 8, "ltr", 3)) { _lang.text_dir = TD_LTR; @@ -123,13 +123,13 @@ void FileStringReader::HandlePragma(char *str) } } else if (!memcmp(str, "digitsep ", 9)) { str += 9; - strecpy(_lang.digit_group_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_group_separator)); + strecpy(_lang.digit_group_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str); } else if (!memcmp(str, "digitsepcur ", 12)) { str += 12; - strecpy(_lang.digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_group_separator_currency)); + strecpy(_lang.digit_group_separator_currency, strcmp(str, "{NBSP}") == 0 ? NBSP : str); } else if (!memcmp(str, "decimalsep ", 11)) { str += 11; - strecpy(_lang.digit_decimal_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str, lastof(_lang.digit_decimal_separator)); + strecpy(_lang.digit_decimal_separator, strcmp(str, "{NBSP}") == 0 ? NBSP : str); } else if (!memcmp(str, "winlangid ", 10)) { const char *buf = str + 10; long langid = std::strtol(buf, nullptr, 16); @@ -153,7 +153,7 @@ void FileStringReader::HandlePragma(char *str) if (s == nullptr) break; if (_lang.num_genders >= MAX_NUM_GENDERS) FatalError("Too many genders, max {}", MAX_NUM_GENDERS); - strecpy(_lang.genders[_lang.num_genders], s, lastof(_lang.genders[_lang.num_genders])); + strecpy(_lang.genders[_lang.num_genders], s); _lang.num_genders++; } } else if (!memcmp(str, "case ", 5)) { @@ -165,7 +165,7 @@ void FileStringReader::HandlePragma(char *str) if (s == nullptr) break; if (_lang.num_cases >= MAX_NUM_CASES) FatalError("Too many cases, max {}", MAX_NUM_CASES); - strecpy(_lang.cases[_lang.num_cases], s, lastof(_lang.cases[_lang.num_cases])); + strecpy(_lang.cases[_lang.num_cases], s); _lang.num_cases++; } } else { diff --git a/src/strgen/strgen_base.cpp b/src/strgen/strgen_base.cpp index e05c324e2d..cfb603ed55 100644 --- a/src/strgen/strgen_base.cpp +++ b/src/strgen/strgen_base.cpp @@ -756,9 +756,9 @@ void StringReader::ParseFile() /* For each new file we parse, reset the genders, and language codes. */ MemSetT(&_lang, 0); - strecpy(_lang.digit_group_separator, ",", lastof(_lang.digit_group_separator)); - strecpy(_lang.digit_group_separator_currency, ",", lastof(_lang.digit_group_separator_currency)); - strecpy(_lang.digit_decimal_separator, ".", lastof(_lang.digit_decimal_separator)); + strecpy(_lang.digit_group_separator, ","); + strecpy(_lang.digit_group_separator_currency, ","); + strecpy(_lang.digit_decimal_separator, "."); _cur_line = 1; while (this->data.next_string_id < this->data.max_strings) { diff --git a/src/string.cpp b/src/string.cpp index 0174213d00..727fd80681 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -50,34 +50,27 @@ * Copies characters from one buffer to another. * * Copies the source string to the destination buffer with respect of the - * terminating null-character and the last pointer to the last element in - * the destination buffer. If the last pointer is set to nullptr no boundary - * check is performed. + * terminating null-character and the size of the destination buffer. * - * @note usage: strecpy(dst, src, lastof(dst)); - * @note lastof() applies only to fixed size arrays + * @note usage: strecpy(dst, src); * * @param dst The destination buffer * @param src The buffer containing the string to copy - * @param last The pointer to the last element of the destination buffer - * @return The pointer to the terminating null-character in the destination buffer */ -char *strecpy(char *dst, const char *src, const char *last) +void strecpy(std::span dst, std::string_view src) { - assert(dst <= last); - while (dst != last && *src != '\0') { - *dst++ = *src++; - } - *dst = '\0'; - - if (dst == last && *src != '\0') { + /* Ensure source string fits with NUL terminator; dst must be at least 1 character longer than src. */ + if (std::empty(dst) || std::size(src) >= std::size(dst) - 1U) { #if defined(STRGEN) || defined(SETTINGSGEN) FatalError("String too long for destination buffer"); #else /* STRGEN || SETTINGSGEN */ Debug(misc, 0, "String too long for destination buffer"); + src = src.substr(0, std::size(dst) - 1U); #endif /* STRGEN || SETTINGSGEN */ } - return dst; + + auto it = std::copy(std::begin(src), std::end(src), std::begin(dst)); + *it = '\0'; } /** diff --git a/src/string_func.h b/src/string_func.h index 7567cedd17..eda01a566d 100644 --- a/src/string_func.h +++ b/src/string_func.h @@ -17,7 +17,7 @@ #include "core/bitmath_func.hpp" #include "string_type.h" -char *strecpy(char *dst, const char *src, const char *last) NOACCESS(3); +void strecpy(std::span dst, std::string_view src); std::string FormatArrayAsHex(std::span data); From 100dd7b6d131060ff4dc24d2d4f3b963677b5e96 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Jul 2024 17:07:40 +0100 Subject: [PATCH 02/41] Codechange: Use find_if to get default writeable saveload format. (#12849) * Codechange: Use find_if to get default writeable savegame format. This removes the last of lastof, and so the lastof macro is removed. --- src/saveload/saveload.cpp | 23 ++++++++++++----------- src/stdafx.h | 8 -------- src/toolbar_gui.cpp | 2 +- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 6155e3723d..34589f8dfd 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2680,14 +2680,15 @@ static const SaveLoadFormat _saveload_formats[] = { * uncompressed, or another type * @param full_name Name of the savegame format. If empty it picks the first available one * @param compression_level Output for telling what compression level we want. - * @return Pointer to SaveLoadFormat struct giving all characteristics of this type of savegame + * @return Reference to SaveLoadFormat struct giving all characteristics of this type of savegame */ -static const SaveLoadFormat *GetSavegameFormat(const std::string &full_name, uint8_t *compression_level) +static const SaveLoadFormat &GetSavegameFormat(const std::string &full_name, uint8_t *compression_level) { - const SaveLoadFormat *def = lastof(_saveload_formats); + /* Find default savegame format, the highest one with which files can be written. */ + auto it = std::find_if(std::rbegin(_saveload_formats), std::rend(_saveload_formats), [](const auto &slf) { return slf.init_write != nullptr; }); + if (it == std::rend(_saveload_formats)) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "no writeable savegame formats"); - /* find default savegame format, the highest one with which files can be written */ - while (!def->init_write) def--; + const SaveLoadFormat &def = *it; if (!full_name.empty()) { /* Get the ":..." of the compression level out of the way */ @@ -2711,15 +2712,15 @@ static const SaveLoadFormat *GetSavegameFormat(const std::string &full_name, uin *compression_level = level; } } - return &slf; + return slf; } } SetDParamStr(0, name); - SetDParamStr(1, def->name); + SetDParamStr(1, def.name); ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM, WL_CRITICAL); } - *compression_level = def->default_compression; + *compression_level = def.default_compression; return def; } @@ -2805,13 +2806,13 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded) { try { uint8_t compression; - const SaveLoadFormat *fmt = GetSavegameFormat(_savegame_format, &compression); + const SaveLoadFormat &fmt = GetSavegameFormat(_savegame_format, &compression); /* We have written our stuff to memory, now write it to file! */ - uint32_t hdr[2] = { fmt->tag, TO_BE32(SAVEGAME_VERSION << 16) }; + uint32_t hdr[2] = { fmt.tag, TO_BE32(SAVEGAME_VERSION << 16) }; _sl.sf->Write((uint8_t*)hdr, sizeof(hdr)); - _sl.sf = fmt->init_write(_sl.sf, compression); + _sl.sf = fmt.init_write(_sl.sf, compression); _sl.dumper->Flush(_sl.sf); ClearSaveLoadState(); diff --git a/src/stdafx.h b/src/stdafx.h index 3081beafe5..b006c8c471 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -285,14 +285,6 @@ char (&ArraySizeHelper(T (&array)[N]))[N]; */ #define lengthof(array) (sizeof(ArraySizeHelper(array))) -/** - * Get the last element of an fixed size array. - * - * @param x The pointer to the first element of the array - * @return The pointer to the last element of the array - */ -#define lastof(x) (&x[lengthof(x) - 1]) - /** * Gets the size of a variable within a class. * @param base The class the variable is in. diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index d9494b4fa4..c1aa2ff267 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -1420,7 +1420,7 @@ public: uint spacer_i = 0; uint button_i = 0; - /* Index into the arrangement indices. The macro lastof cannot be used here! */ + /* Index into the arrangement indices. */ const WidgetID *slotp = rtl ? &arrangement[arrangable_count - 1] : arrangement; for (uint i = 0; i < arrangable_count; i++) { uint slot = lookup[*slotp]; From b4bcb330c794cae1f8fee7659d574abded18d790 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Jul 2024 18:57:47 +0100 Subject: [PATCH 03/41] Codechange: Replace GetSavegameFormat's compression output pointer with std::pair return. (#12850) This avoids using an unchecked pointer as an out-parameter. --- src/saveload/saveload.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 34589f8dfd..7f04432298 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2679,10 +2679,9 @@ static const SaveLoadFormat _saveload_formats[] = { * Return the savegameformat of the game. Whether it was created with ZLIB compression * uncompressed, or another type * @param full_name Name of the savegame format. If empty it picks the first available one - * @param compression_level Output for telling what compression level we want. - * @return Reference to SaveLoadFormat struct giving all characteristics of this type of savegame + * @return Pair containing reference to SaveLoadFormat struct giving all characteristics of this type of savegame, and a compression level to use. */ -static const SaveLoadFormat &GetSavegameFormat(const std::string &full_name, uint8_t *compression_level) +static std::pair GetSavegameFormat(const std::string &full_name) { /* Find default savegame format, the highest one with which files can be written. */ auto it = std::find_if(std::rbegin(_saveload_formats), std::rend(_saveload_formats), [](const auto &slf) { return slf.init_write != nullptr; }); @@ -2698,7 +2697,6 @@ static const SaveLoadFormat &GetSavegameFormat(const std::string &full_name, uin for (const auto &slf : _saveload_formats) { if (slf.init_write != nullptr && name.compare(slf.name) == 0) { - *compression_level = slf.default_compression; if (has_comp_level) { const std::string complevel(full_name, separator + 1); @@ -2709,10 +2707,10 @@ static const SaveLoadFormat &GetSavegameFormat(const std::string &full_name, uin SetDParamStr(0, complevel); ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL, WL_CRITICAL); } else { - *compression_level = level; + return {slf, ClampTo(level)}; } } - return slf; + return {slf, slf.default_compression}; } } @@ -2720,8 +2718,7 @@ static const SaveLoadFormat &GetSavegameFormat(const std::string &full_name, uin SetDParamStr(1, def.name); ShowErrorMessage(STR_CONFIG_ERROR, STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM, WL_CRITICAL); } - *compression_level = def.default_compression; - return def; + return {def, def.default_compression}; } /* actual loader/saver function */ @@ -2805,8 +2802,7 @@ static void SaveFileError() static SaveOrLoadResult SaveFileToDisk(bool threaded) { try { - uint8_t compression; - const SaveLoadFormat &fmt = GetSavegameFormat(_savegame_format, &compression); + auto [fmt, compression] = GetSavegameFormat(_savegame_format); /* We have written our stuff to memory, now write it to file! */ uint32_t hdr[2] = { fmt.tag, TO_BE32(SAVEGAME_VERSION << 16) }; From 60c3913a99f46d2277ec4c6c8133de0615af8144 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Jul 2024 10:41:28 +0100 Subject: [PATCH 04/41] Codechange: Use range-for and std::size with _plural_forms. (#12852) This removes indexed array access and use of `lengthof()` macro. --- src/strgen/strgen.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strgen/strgen.cpp b/src/strgen/strgen.cpp index 0c5e1dfa3f..73e7b34f9c 100644 --- a/src/strgen/strgen.cpp +++ b/src/strgen/strgen.cpp @@ -250,8 +250,8 @@ struct HeaderFileWriter : HeaderWriter, FileWriter { { /* Find the plural form with the most amount of cases. */ int max_plural_forms = 0; - for (uint i = 0; i < lengthof(_plural_forms); i++) { - max_plural_forms = std::max(max_plural_forms, _plural_forms[i].plural_count); + for (const auto &pf : _plural_forms) { + max_plural_forms = std::max(max_plural_forms, pf.plural_count); } fmt::print(this->output_stream, @@ -261,7 +261,7 @@ struct HeaderFileWriter : HeaderWriter, FileWriter { "static const uint LANGUAGE_MAX_PLURAL_FORMS = {};\n" "static const uint LANGUAGE_TOTAL_STRINGS = {};\n" "\n", - data.Version(), lengthof(_plural_forms), max_plural_forms, total_strings + data.Version(), std::size(_plural_forms), max_plural_forms, total_strings ); this->output_stream << "#endif /* TABLE_STRINGS_H */\n"; From 93eb27d8df2f130fcd18907e5d8224426fd5c083 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Jul 2024 12:30:14 +0100 Subject: [PATCH 05/41] Codechange: Use reference for always_accepted output parameter of AddAcceptedCargo. (#12854) This parameter should always present (see tile_cmd.h:186), so use a reference to ensure it is. --- src/industry_cmd.cpp | 6 +++--- src/object_cmd.cpp | 6 +++--- src/tile_cmd.h | 4 ++-- src/town_cmd.cpp | 13 ++++++++++--- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index a36676245e..0707ec9c89 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -409,7 +409,7 @@ static Foundation GetFoundation_Industry(TileIndex tile, Slope tileh) return FlatteningFoundation(tileh); } -static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) +static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted) { IndustryGfx gfx = GetIndustryGfx(tile); const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx); @@ -459,13 +459,13 @@ static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, Ca acceptance[a] += cargo_acceptance[i]; /* Maybe set 'always accepted' bit (if it's not set already) */ - if (HasBit(*always_accepted, a)) continue; + if (HasBit(always_accepted, a)) continue; /* Test whether the industry itself accepts the cargo type */ if (ind->IsCargoAccepted(a)) continue; /* If the industry itself doesn't accept this cargo, set 'always accepted' bit */ - SetBit(*always_accepted, a); + SetBit(always_accepted, a); } } diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index c3f926eba8..a1c5e0e9b2 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -617,7 +617,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags) return cost; } -static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) +static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted) { if (!IsObjectType(tile, OBJECT_HQ)) return; @@ -632,7 +632,7 @@ static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, Carg CargoID pass = GetCargoIDByLabel(CT_PASSENGERS); if (IsValidCargoID(pass)) { acceptance[pass] += std::max(1U, level); - SetBit(*always_accepted, pass); + SetBit(always_accepted, pass); } /* Top town building generates 4, HQ can make up to 8. The @@ -642,7 +642,7 @@ static void AddAcceptedCargo_Object(TileIndex tile, CargoArray &acceptance, Carg CargoID mail = GetCargoIDByLabel(CT_MAIL); if (IsValidCargoID(mail)) { acceptance[mail] += std::max(1U, level / 2); - SetBit(*always_accepted, mail); + SetBit(always_accepted, mail); } } diff --git a/src/tile_cmd.h b/src/tile_cmd.h index 01d116e302..88f36fef86 100644 --- a/src/tile_cmd.h +++ b/src/tile_cmd.h @@ -95,7 +95,7 @@ typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags); * @param acceptance Storage destination of the cargo acceptance in 1/8 * @param always_accepted Bitmask of always accepted cargo types */ -typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted); +typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted); /** * Tile callback function signature for obtaining a tile description @@ -184,7 +184,7 @@ inline void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance, CargoTypes AddAcceptedCargoProc *proc = _tile_type_procs[GetTileType(tile)]->add_accepted_cargo_proc; if (proc == nullptr) return; CargoTypes dummy = 0; // use dummy bitmask so there don't need to be several 'always_accepted != nullptr' checks - proc(tile, acceptance, always_accepted == nullptr ? &dummy : always_accepted); + proc(tile, acceptance, always_accepted == nullptr ? dummy : *always_accepted); } inline void AddProducedCargo(TileIndex tile, CargoArray &produced) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index cc8364b0a1..79e9950791 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -771,14 +771,21 @@ static void AddProducedCargo_Town(TileIndex tile, CargoArray &produced) } } -static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes *always_accepted) +/** + * Fill cargo acceptance array and always_accepted mask, if cargo ID is valid. + * @param cargo Cargo type to add. + * @param amount Amount of cargo to add. + * @param[out] acceptance Output array containing amount of cargo accepted. + * @param[out] always_accepted Output mask of accepted cargo types. + */ +static void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, CargoTypes &always_accepted) { if (!IsValidCargoID(cargo) || amount == 0) return; acceptance[cargo] += amount; - SetBit(*always_accepted, cargo); + SetBit(always_accepted, cargo); } -static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoTypes *always_accepted) +static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, CargoTypes &always_accepted) { const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile)); CargoID accepts[lengthof(hs->accepts_cargo)]; From ba0acb87ebd3a50d5a32f6e5415b3d9a3561bb34 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 1 Jul 2024 17:02:36 +0100 Subject: [PATCH 06/41] Fix #12832: Sanitise strings from NewGRF before logging them in Debug output. NewGRF strings may not be UTF-8 encoded, which causes issues on Windows. --- src/newgrf.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index d276cdbba3..f50ccb57d0 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2891,14 +2891,14 @@ static ChangeInfoResult GlobalVarChangeInfo(uint gvid, int numinfo, int prop, By if (prop == 0x13) { map.openttd_id = lang->GetGenderIndex(name.data()); if (map.openttd_id >= MAX_NUM_GENDERS) { - GrfMsg(1, "GlobalVarChangeInfo: Gender name {} is not known, ignoring", name); + GrfMsg(1, "GlobalVarChangeInfo: Gender name {} is not known, ignoring", StrMakeValid(name)); } else { _cur.grffile->language_map[curidx].gender_map.push_back(map); } } else { map.openttd_id = lang->GetCaseIndex(name.data()); if (map.openttd_id >= MAX_NUM_CASES) { - GrfMsg(1, "GlobalVarChangeInfo: Case name {} is not known, ignoring", name); + GrfMsg(1, "GlobalVarChangeInfo: Case name {} is not known, ignoring", StrMakeValid(name)); } else { _cur.grffile->language_map[curidx].case_map.push_back(map); } @@ -6261,7 +6261,7 @@ static void FeatureNewName(ByteReader &buf) for (; id < endid && buf.HasData(); id++) { const std::string_view name = buf.ReadString(); - GrfMsg(8, "FeatureNewName: 0x{:04X} <- {}", id, name); + GrfMsg(8, "FeatureNewName: 0x{:04X} <- {}", id, StrMakeValid(name)); switch (feature) { case GSF_TRAINS: @@ -6985,7 +6985,7 @@ static void ScanInfo(ByteReader &buf) if (grf_version < 2 || grf_version > 8) { SetBit(_cur.grfconfig->flags, GCF_INVALID); - Debug(grf, 0, "{}: NewGRF \"{}\" (GRFID {:08X}) uses GRF version {}, which is incompatible with this version of OpenTTD.", _cur.grfconfig->filename, name, BSWAP32(grfid), grf_version); + Debug(grf, 0, "{}: NewGRF \"{}\" (GRFID {:08X}) uses GRF version {}, which is incompatible with this version of OpenTTD.", _cur.grfconfig->filename, StrMakeValid(name), BSWAP32(grfid), grf_version); } /* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */ @@ -7030,7 +7030,7 @@ static void GRFInfo(ByteReader &buf) _cur.grfconfig->status = _cur.stage < GLS_RESERVE ? GCS_INITIALISED : GCS_ACTIVATED; /* Do swap the GRFID for displaying purposes since people expect that */ - Debug(grf, 1, "GRFInfo: Loaded GRFv{} set {:08X} - {} (palette: {}, version: {})", version, BSWAP32(grfid), name, (_cur.grfconfig->palette & GRFP_USE_MASK) ? "Windows" : "DOS", _cur.grfconfig->version); + Debug(grf, 1, "GRFInfo: Loaded GRFv{} set {:08X} - {} (palette: {}, version: {})", version, BSWAP32(grfid), StrMakeValid(name), (_cur.grfconfig->palette & GRFP_USE_MASK) ? "Windows" : "DOS", _cur.grfconfig->version); } /** @@ -7228,7 +7228,7 @@ static void GRFComment(ByteReader &buf) if (!buf.HasData()) return; std::string_view text = buf.ReadString(); - GrfMsg(2, "GRFComment: {}", text); + GrfMsg(2, "GRFComment: {}", StrMakeValid(text)); } /* Action 0x0D (GLS_SAFETYSCAN) */ From 55acc1b36d6ea10873ecf07e5dc2a10eaf1f5c4a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Mon, 1 Jul 2024 17:35:31 +0100 Subject: [PATCH 07/41] Codechange: Don't format strings passed to GrfMsg unless the message will be used. This makes GrfMsg() behave more like Debug(). --- src/newgrf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/newgrf.h b/src/newgrf.h index f67f802320..e49c22ee5c 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -202,7 +202,7 @@ void ResetNewGRFData(); void ResetPersistentNewGRFData(); void GrfMsgI(int severity, const std::string &msg); -#define GrfMsg(severity, format_string, ...) GrfMsgI(severity, fmt::format(FMT_STRING(format_string), ## __VA_ARGS__)) +#define GrfMsg(severity, format_string, ...) do { if ((severity) == 0 || _debug_grf_level >= (severity)) GrfMsgI(severity, fmt::format(FMT_STRING(format_string), ## __VA_ARGS__)); } while (false) bool GetGlobalVariable(uint8_t param, uint32_t *value, const GRFFile *grffile); From db0ae42d4544ad64c45505ee277a9ae2169bf3d6 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Jul 2024 12:45:35 +0100 Subject: [PATCH 08/41] Codechange: Set base type of spritegroup related enums. This has a small impact on SpriteGroup object sizes. --- src/newgrf_spritegroup.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index cda6f4b3a3..dc60453861 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -33,7 +33,7 @@ inline uint32_t GetRegister(uint i) } /* List of different sprite group types */ -enum SpriteGroupType { +enum SpriteGroupType : uint8_t { SGT_REAL, SGT_DETERMINISTIC, SGT_RANDOMIZED, @@ -94,7 +94,7 @@ protected: }; /* Shared by deterministic and random groups. */ -enum VarSpriteGroupScope { +enum VarSpriteGroupScope : uint8_t { VSG_BEGIN, VSG_SCOPE_SELF = VSG_BEGIN, ///< Resolved object itself @@ -105,19 +105,19 @@ enum VarSpriteGroupScope { }; DECLARE_POSTFIX_INCREMENT(VarSpriteGroupScope) -enum DeterministicSpriteGroupSize { +enum DeterministicSpriteGroupSize : uint8_t { DSG_SIZE_BYTE, DSG_SIZE_WORD, DSG_SIZE_DWORD, }; -enum DeterministicSpriteGroupAdjustType { +enum DeterministicSpriteGroupAdjustType : uint8_t { DSGA_TYPE_NONE, DSGA_TYPE_DIV, DSGA_TYPE_MOD, }; -enum DeterministicSpriteGroupAdjustOperation { +enum DeterministicSpriteGroupAdjustOperation : uint8_t { DSGA_OP_ADD, ///< a + b DSGA_OP_SUB, ///< a - b DSGA_OP_SMIN, ///< (signed) min(a, b) @@ -182,7 +182,7 @@ protected: const SpriteGroup *Resolve(ResolverObject &object) const override; }; -enum RandomizedSpriteGroupCompareMode { +enum RandomizedSpriteGroupCompareMode : uint8_t { RSG_CMP_ANY, RSG_CMP_ALL, }; From 70d63f87b8ac5017963f756905cf9b60bb3b9510 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Jul 2024 12:45:53 +0100 Subject: [PATCH 09/41] Codechange: Re-order ResultSpriteGroup to reduce its size. --- src/newgrf_spritegroup.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index dc60453861..74482b91a6 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -242,13 +242,14 @@ struct ResultSpriteGroup : SpriteGroup { */ ResultSpriteGroup(SpriteID sprite, uint8_t num_sprites) : SpriteGroup(SGT_RESULT), - sprite(sprite), - num_sprites(num_sprites) + num_sprites(num_sprites), + sprite(sprite) { } - SpriteID sprite; uint8_t num_sprites; + SpriteID sprite; + SpriteID GetResult() const override { return this->sprite; } uint8_t GetNumResults() const override { return this->num_sprites; } }; From b090c8e9bdd7ecf2cf37c1ddd337c6435e92933b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Jul 2024 10:23:49 +0100 Subject: [PATCH 10/41] Codechange: Replace default overrides arrays with std::pair and use range-for. This avoids indexed array access and use of lengthof. --- src/newgrf.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index f50ccb57d0..e78d15af51 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -10075,13 +10075,13 @@ void LoadNewGRF(uint load_index, uint num_baseset) } if (stage == GLS_RESERVE) { - static const uint32_t overrides[][2] = { + static const std::pair default_grf_overrides[] = { { 0x44442202, 0x44440111 }, // UKRS addons modifies UKRS { 0x6D620402, 0x6D620401 }, // DBSetXL ECS extension modifies DBSetXL { 0x4D656f20, 0x4D656F17 }, // LV4cut modifies LV4 }; - for (size_t i = 0; i < lengthof(overrides); i++) { - SetNewGRFOverride(BSWAP32(overrides[i][0]), BSWAP32(overrides[i][1])); + for (const auto &grf_override : default_grf_overrides) { + SetNewGRFOverride(BSWAP32(grf_override.first), BSWAP32(grf_override.second)); } } From e22eb89b92bcb7c714a3dc427f429c9fdd3bc2a1 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 10 Jul 2024 20:20:54 +0100 Subject: [PATCH 11/41] Codechange: Call BSWAP32() in the default_grf_overrides initializer. This causes the BSWAP32 calls to happen only on first initialisation (BSWAP32 is not constexpr), instead of every time GRFs are reloaded. --- src/newgrf.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index e78d15af51..3458535b18 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -10076,12 +10076,12 @@ void LoadNewGRF(uint load_index, uint num_baseset) if (stage == GLS_RESERVE) { static const std::pair default_grf_overrides[] = { - { 0x44442202, 0x44440111 }, // UKRS addons modifies UKRS - { 0x6D620402, 0x6D620401 }, // DBSetXL ECS extension modifies DBSetXL - { 0x4D656f20, 0x4D656F17 }, // LV4cut modifies LV4 + { BSWAP32(0x44442202), BSWAP32(0x44440111) }, // UKRS addons modifies UKRS + { BSWAP32(0x6D620402), BSWAP32(0x6D620401) }, // DBSetXL ECS extension modifies DBSetXL + { BSWAP32(0x4D656f20), BSWAP32(0x4D656F17) }, // LV4cut modifies LV4 }; for (const auto &grf_override : default_grf_overrides) { - SetNewGRFOverride(BSWAP32(grf_override.first), BSWAP32(grf_override.second)); + SetNewGRFOverride(grf_override.first, grf_override.second); } } From b37954722bf7d174a9688e42451b7615341b071f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Jul 2024 17:10:27 +0100 Subject: [PATCH 12/41] Codefix: Don't copy path string to itself. When determining base paths on Windows the path is converted to UCS-16, and then copied into the same buffer. --- src/os/windows/win32.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 85bb055bdf..a91b6354e8 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -274,7 +274,7 @@ void DetermineBasePaths(const char *exe) } else { /* Use the folder of the config file as working directory. */ wchar_t config_dir[MAX_PATH]; - wcsncpy(path, convert_to_fs(_config_file, path, lengthof(path)), lengthof(path)); + convert_to_fs(_config_file, path, lengthof(path)); if (!GetFullPathName(path, static_cast(std::size(config_dir)), config_dir, nullptr)) { Debug(misc, 0, "GetFullPathName failed ({})", GetLastError()); _searchpaths[SP_WORKING_DIR].clear(); @@ -292,7 +292,7 @@ void DetermineBasePaths(const char *exe) _searchpaths[SP_BINARY_DIR].clear(); } else { wchar_t exec_dir[MAX_PATH]; - wcsncpy(path, convert_to_fs(exe, path, std::size(path)), std::size(path)); + convert_to_fs(exe, path, std::size(path)); if (!GetFullPathName(path, static_cast(std::size(exec_dir)), exec_dir, nullptr)) { Debug(misc, 0, "GetFullPathName failed ({})", GetLastError()); _searchpaths[SP_BINARY_DIR].clear(); From e2a796dbcdd181ced603a4e6a7fdf236ac31a718 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 9 Jul 2024 17:10:27 +0100 Subject: [PATCH 13/41] Codefix: Potential unterminated string returned from convert_to_fs. Converting from UTF-8 to UTF-16 could have resulted in a buffer overflow if the buffer size was exactly the length of the converted string. Pass string_view/span to convert_from/to_fs instead, and ensure the buffer is terminated. This replaces passing a pointer to the buffer and the buffer size as separate parameters, allowing the compiler to pass both in one parameter. Removes use of `lengthof()`. --- src/music/dmusic.cpp | 2 +- src/music/win32_m.cpp | 2 +- src/os/windows/crashlog_win.cpp | 10 +++---- src/os/windows/font_win32.cpp | 8 +++--- src/os/windows/string_uniscribe.cpp | 2 +- src/os/windows/win32.cpp | 42 +++++++++++++---------------- src/os/windows/win32.h | 4 +-- src/video/win32_v.cpp | 2 +- 8 files changed, 34 insertions(+), 38 deletions(-) diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index c7c2d97642..051588081a 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -1107,7 +1107,7 @@ std::optional MusicDriver_DMusic::Start(const StringList &parm Debug(driver, 1, "Detected DirectMusic ports:"); for (int i = 0; _music->EnumPort(i, &caps) == S_OK; i++) { if (caps.dwClass == DMUS_PC_OUTPUTCLASS) { - Debug(driver, 1, " {}: {}{}", i, convert_from_fs(caps.wszDescription, desc, lengthof(desc)), i == pIdx ? " (selected)" : ""); + Debug(driver, 1, " {}: {}{}", i, convert_from_fs(caps.wszDescription, desc), i == pIdx ? " (selected)" : ""); } } } diff --git a/src/music/win32_m.cpp b/src/music/win32_m.cpp index 886deab2c0..a9553123ed 100644 --- a/src/music/win32_m.cpp +++ b/src/music/win32_m.cpp @@ -383,7 +383,7 @@ std::optional MusicDriver_Win32::Start(const StringList &parm) MIDIOUTCAPS moc{}; if (midiOutGetDevCaps(tryport, &moc, sizeof(moc)) == MMSYSERR_NOERROR) { char tryportname[128]; - convert_from_fs(moc.szPname, tryportname, lengthof(tryportname)); + convert_from_fs(moc.szPname, tryportname); /* Compare requested and detected port name. * If multiple ports have the same name, this will select the last matching port, and the debug output will be confusing. */ diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index b7d830bb8c..111e6a53b7 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -504,14 +504,14 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA crash_desc_buf, crash_desc_buf_length, _crash_desc, - convert_to_fs(CrashLogWindows::current->crashlog_filename, filename_buf + filename_buf_length * 0, filename_buf_length), - convert_to_fs(CrashLogWindows::current->crashdump_filename, filename_buf + filename_buf_length * 1, filename_buf_length), - convert_to_fs(CrashLogWindows::current->savegame_filename, filename_buf + filename_buf_length * 2, filename_buf_length), - convert_to_fs(CrashLogWindows::current->screenshot_filename, filename_buf + filename_buf_length * 3, filename_buf_length) + convert_to_fs(CrashLogWindows::current->crashlog_filename, {filename_buf + filename_buf_length * 0, filename_buf_length}), + convert_to_fs(CrashLogWindows::current->crashdump_filename, {filename_buf + filename_buf_length * 1, filename_buf_length}), + convert_to_fs(CrashLogWindows::current->savegame_filename, {filename_buf + filename_buf_length * 2, filename_buf_length}), + convert_to_fs(CrashLogWindows::current->screenshot_filename, {filename_buf + filename_buf_length * 3, filename_buf_length}) ); SetDlgItemText(wnd, 10, crash_desc_buf); - SetDlgItemText(wnd, 11, convert_to_fs(crashlog_dos_nl, crashlog_buf, crashlog_length)); + SetDlgItemText(wnd, 11, convert_to_fs(crashlog_dos_nl, {crashlog_buf, crashlog_length})); SendDlgItemMessage(wnd, 11, WM_SETFONT, (WPARAM)GetStockObject(ANSI_FIXED_FONT), FALSE); SetWndSize(wnd, -1); } return TRUE; diff --git a/src/os/windows/font_win32.cpp b/src/os/windows/font_win32.cpp index 641d68d3d7..6f021c270a 100644 --- a/src/os/windows/font_win32.cpp +++ b/src/os/windows/font_win32.cpp @@ -67,7 +67,7 @@ static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *logfont, const NEWTEXT if ((metric->ntmFontSig.fsCsb[0] & info->locale.lsCsbSupported[0]) == 0 && (metric->ntmFontSig.fsCsb[1] & info->locale.lsCsbSupported[1]) == 0) return 1; char font_name[MAX_PATH]; - convert_from_fs((const wchar_t *)logfont->elfFullName, font_name, lengthof(font_name)); + convert_from_fs(logfont->elfFullName, font_name); info->callback->SetFontNames(info->settings, font_name, &logfont->elfLogFont); if (info->callback->FindMissingGlyphs()) return 1; @@ -289,12 +289,12 @@ static bool TryLoadFontFromFile(const std::string &font_name, LOGFONT &logfont) /* See if this is an absolute path. */ if (FileExists(font_name)) { - convert_to_fs(font_name, fontPath, lengthof(fontPath)); + convert_to_fs(font_name, fontPath); } else { /* Scan the search-paths to see if it can be found. */ std::string full_font = FioFindFullPath(BASE_DIR, font_name); if (!full_font.empty()) { - convert_to_fs(font_name, fontPath, lengthof(fontPath)); + convert_to_fs(font_name, fontPath); } } @@ -375,7 +375,7 @@ void LoadWin32Font(FontSize fs) if (logfont.lfFaceName[0] == 0) { logfont.lfWeight = strcasestr(font_name, " bold") != nullptr ? FW_BOLD : FW_NORMAL; // Poor man's way to allow selecting bold fonts. - convert_to_fs(font_name, logfont.lfFaceName, lengthof(logfont.lfFaceName)); + convert_to_fs(font_name, logfont.lfFaceName); } LoadWin32Font(fs, logfont, GetFontCacheFontSize(fs), font_name); diff --git a/src/os/windows/string_uniscribe.cpp b/src/os/windows/string_uniscribe.cpp index a3d92c52d6..bcd4295e15 100644 --- a/src/os/windows/string_uniscribe.cpp +++ b/src/os/windows/string_uniscribe.cpp @@ -147,7 +147,7 @@ static HFONT HFontFromFont(Font *font) logfont.lfHeight = font->fc->GetHeight(); logfont.lfWeight = FW_NORMAL; logfont.lfCharSet = DEFAULT_CHARSET; - convert_to_fs(font->fc->GetFontName(), logfont.lfFaceName, lengthof(logfont.lfFaceName)); + convert_to_fs(font->fc->GetFontName(), logfont.lfFaceName); return CreateFontIndirect(&logfont); } diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index a91b6354e8..b86f1941ef 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -225,7 +225,7 @@ char *getcwd(char *buf, size_t size) { wchar_t path[MAX_PATH]; GetCurrentDirectory(MAX_PATH - 1, path); - convert_from_fs(path, buf, size); + convert_from_fs(path, {buf, size}); return buf; } @@ -274,7 +274,7 @@ void DetermineBasePaths(const char *exe) } else { /* Use the folder of the config file as working directory. */ wchar_t config_dir[MAX_PATH]; - convert_to_fs(_config_file, path, lengthof(path)); + convert_to_fs(_config_file, path); if (!GetFullPathName(path, static_cast(std::size(config_dir)), config_dir, nullptr)) { Debug(misc, 0, "GetFullPathName failed ({})", GetLastError()); _searchpaths[SP_WORKING_DIR].clear(); @@ -292,7 +292,7 @@ void DetermineBasePaths(const char *exe) _searchpaths[SP_BINARY_DIR].clear(); } else { wchar_t exec_dir[MAX_PATH]; - convert_to_fs(exe, path, std::size(path)); + convert_to_fs(exe, path); if (!GetFullPathName(path, static_cast(std::size(exec_dir)), exec_dir, nullptr)) { Debug(misc, 0, "GetFullPathName failed ({})", GetLastError()); _searchpaths[SP_BINARY_DIR].clear(); @@ -365,37 +365,33 @@ std::wstring OTTD2FS(const std::string &name) /** * Convert to OpenTTD's encoding from that of the environment in * UNICODE. OpenTTD encoding is UTF8, local is wide. - * @param name pointer to a valid string that will be converted - * @param utf8_buf pointer to a valid buffer that will receive the converted string - * @param buflen length in characters of the receiving buffer - * @return pointer to utf8_buf. If conversion fails the string is of zero-length + * @param src wide string that will be converted + * @param dst_buf span of valid char buffer that will receive the converted string + * @return pointer to dst_buf. If conversion fails the string is of zero-length */ -char *convert_from_fs(const wchar_t *name, char *utf8_buf, size_t buflen) +char *convert_from_fs(const std::wstring_view src, std::span dst_buf) { /* Convert UTF-16 string to UTF-8. */ - int len = WideCharToMultiByte(CP_UTF8, 0, name, -1, utf8_buf, (int)buflen, nullptr, nullptr); - if (len == 0) utf8_buf[0] = '\0'; + int len = WideCharToMultiByte(CP_UTF8, 0, src.data(), static_cast(src.size()), dst_buf.data(), static_cast(dst_buf.size() - 1U), nullptr, nullptr); + dst_buf[len] = '\0'; - return utf8_buf; + return dst_buf.data(); } /** * Convert from OpenTTD's encoding to that of the environment in * UNICODE. OpenTTD encoding is UTF8, local is wide. - * @param name pointer to a valid string that will be converted - * @param system_buf pointer to a valid wide-char buffer that will receive the - * converted string - * @param buflen length in wide characters of the receiving buffer - * @param console_cp convert to the console encoding instead of the normal system encoding. - * @return pointer to system_buf. If conversion fails the string is of zero-length + * @param src string that will be converted + * @param dst_buf span of valid wide-char buffer that will receive the converted string + * @return pointer to dst_buf. If conversion fails the string is of zero-length */ -wchar_t *convert_to_fs(const std::string_view name, wchar_t *system_buf, size_t buflen) +wchar_t *convert_to_fs(const std::string_view src, std::span dst_buf) { - int len = MultiByteToWideChar(CP_UTF8, 0, name.data(), (int)name.size(), system_buf, (int)buflen); - system_buf[len] = '\0'; + int len = MultiByteToWideChar(CP_UTF8, 0, src.data(), static_cast(src.size()), dst_buf.data(), static_cast(dst_buf.size() - 1U)); + dst_buf[len] = '\0'; - return system_buf; + return dst_buf.data(); } /** Determine the current user's locale. */ @@ -472,8 +468,8 @@ int OTTDStringCompare(std::string_view s1, std::string_view s2) } wchar_t s1_buf[512], s2_buf[512]; - convert_to_fs(s1, s1_buf, lengthof(s1_buf)); - convert_to_fs(s2, s2_buf, lengthof(s2_buf)); + convert_to_fs(s1, s1_buf); + convert_to_fs(s2, s2_buf); return CompareString(MAKELCID(_current_language->winlangid, SORT_DEFAULT), NORM_IGNORECASE, s1_buf, -1, s2_buf, -1); } diff --git a/src/os/windows/win32.h b/src/os/windows/win32.h index 4e35241721..a6b3798a1e 100644 --- a/src/os/windows/win32.h +++ b/src/os/windows/win32.h @@ -12,8 +12,8 @@ bool MyShowCursor(bool show, bool toggle = false); -char *convert_from_fs(const wchar_t *name, char *utf8_buf, size_t buflen); -wchar_t *convert_to_fs(const std::string_view name, wchar_t *utf16_buf, size_t buflen); +char *convert_from_fs(const std::wstring_view src, std::span dst_buf); +wchar_t *convert_to_fs(const std::string_view src, std::span dst_buf); void Win32SetCurrentLocaleName(const char *iso_code); int OTTDStringCompare(std::string_view s1, std::string_view s2); diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 315c6e3e4e..8a32b21d0c 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -360,7 +360,7 @@ static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam) if (len > 0) { static char utf8_buf[1024]; - convert_from_fs(str.c_str(), utf8_buf, lengthof(utf8_buf)); + convert_from_fs(str.c_str(), utf8_buf); /* Convert caret position from bytes in the input string to a position in the UTF-8 encoded string. */ LONG caret_bytes = ImmGetCompositionString(hIMC, GCS_CURSORPOS, nullptr, 0); From 58e4643196398add2fc9ece824d34089a6f0e809 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 11 Jul 2024 04:43:17 +0000 Subject: [PATCH 14/41] Update: Translations from eints vietnamese: 4 changes by KhoiCanDev --- src/lang/vietnamese.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 7dfd648ad5..1c8ba7dda2 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -623,14 +623,14 @@ STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLA STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Bỏ toàn bộ STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Hiển thị toàn bộ loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Không hiển thị các loại hàng trên đồ thị tỉ lệ trả tiền của loại hàng -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Bật/tắt đồ thị hàng hóa +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Bật/tắt đồ thị cho hàng hóa này STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Hiện chi tiết đánh giá chỉ số năng suất # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Nút bật biểu đồ công ty -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Click vào đây để bật/tắt thông tin công ty trên biểu đồ +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Click vào đây để bật/tắt biểu đồ của công ty này # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Bảng Tầm Cỡ Công Ty @@ -3592,6 +3592,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Biển h STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Nhập tên của biển hiệu # Town directory window +STR_TOWN_DIRECTORY_CAPTION :{WHITE}Đô Thị ({COMMA} đến {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Không Có - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (đô thị){BLACK} ({COMMA}) @@ -3925,6 +3926,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/chu kỳ # Industry directory +STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Nhà máy ({COMMA} đến {COMMA}) STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Không Có - STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% đã vận chuyển){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} From 6006e832f2f01db2555caa4ebd3c850d69603d60 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 12 Jul 2024 04:42:38 +0000 Subject: [PATCH 15/41] Update: Translations from eints finnish: 6 changes by hpiirai --- src/lang/finnish.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 2cd98d0fe6..cb044b3ea1 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -433,7 +433,7 @@ STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Tallenna skenaa STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Lataa skenaario STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Tallenna korkeuskartta STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Lataa korkeuskartta -STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Sulje skenaariomuokkain +STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Hylkää skenaariomuokkain STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Lopeta @@ -463,7 +463,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Läpinäkyvät STR_FILE_MENU_SAVE_GAME :Tallenna peli STR_FILE_MENU_LOAD_GAME :Lataa peli STR_FILE_MENU_QUIT_GAME :Lopeta peli -STR_FILE_MENU_EXIT :Sulje +STR_FILE_MENU_EXIT :Poistu # Map menu STR_MAP_MENU_MAP_OF_WORLD :Maailmankartta @@ -2186,7 +2186,7 @@ STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF-a STR_INTRO_ONLINE_CONTENT :{BLACK}Tarkista online-sisältö STR_INTRO_AI_SETTINGS :{BLACK}Tekoälyasetukset STR_INTRO_GAMESCRIPT_SETTINGS :{BLACK}Peliskriptiasetukset -STR_INTRO_QUIT :{BLACK}Sulje +STR_INTRO_QUIT :{BLACK}Poistu STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Aloita uusi peli. Ctrl+napsautus ohittaa kartan asetusten valinnan. STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Lataa tallennettu peli @@ -2214,14 +2214,14 @@ STR_INTRO_BASESET :{BLACK}Valitust STR_INTRO_TRANSLATION :{BLACK}Tästä käännöksestä puuttuu {NUM} merkkijono{P "" a}. Auta tekemään OpenTTD:stä parempi ryhtymällä kääntäjäksi. Lisätietoja readme.txt:ssä. # Quit window -STR_QUIT_CAPTION :{WHITE}Sulje +STR_QUIT_CAPTION :{WHITE}Poistu STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Haluatko varmasti poistua OpenTTD:stä? STR_QUIT_YES :{BLACK}Kyllä STR_QUIT_NO :{BLACK}Ei # Abandon game -STR_ABANDON_GAME_CAPTION :{WHITE}Pelin lopetus -STR_ABANDON_GAME_QUERY :{YELLOW}Lopetetaanko peli? +STR_ABANDON_GAME_CAPTION :{WHITE}Hylkää peli +STR_ABANDON_GAME_QUERY :{YELLOW}Haluatko varmasti hylätä tämän pelin? STR_ABANDON_SCENARIO_QUERY :{YELLOW}Haluatko varmasti hylätä tämän skenaarion? # Help window From 65c666cb57aee6e298cab4eece70c752b081f6ee Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 14 Jul 2024 19:30:35 +0100 Subject: [PATCH 16/41] Codechange: Remove unused size field from struct SaveLoad (#12859) --- src/saveload/saveload.cpp | 4 ++-- src/saveload/saveload.h | 9 ++++----- src/saveload/settings_sl.cpp | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index 7f04432298..24eb4aa54d 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1776,7 +1776,7 @@ std::vector SlTableHeader(const SaveLoadTable &slt) } /* We don't know this field, so read to nothing. */ - saveloads.push_back({key, saveload_type, ((VarType)type & SLE_FILE_TYPE_MASK) | SLE_VAR_NULL, 1, SL_MIN_VERSION, SL_MAX_VERSION, 0, nullptr, 0, handler}); + saveloads.push_back({key, saveload_type, ((VarType)type & SLE_FILE_TYPE_MASK) | SLE_VAR_NULL, 1, SL_MIN_VERSION, SL_MAX_VERSION, nullptr, 0, handler}); continue; } @@ -1883,7 +1883,7 @@ std::vector SlCompatTableHeader(const SaveLoadTable &slt, const SaveLo /* In old savegames there can be data we no longer care for. We * skip this by simply reading the amount of bytes indicated and * send those to /dev/null. */ - saveloads.push_back({"", SL_NULL, GetVarFileType(slc.null_type) | SLE_VAR_NULL, slc.null_length, slc.version_from, slc.version_to, 0, nullptr, 0, nullptr}); + saveloads.push_back({"", SL_NULL, GetVarFileType(slc.null_type) | SLE_VAR_NULL, slc.null_length, slc.version_from, slc.version_to, nullptr, 0, nullptr}); } else { auto sld_it = key_lookup.find(slc.name); /* If this branch triggers, it means that an entry in the diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index a820c7c4f1..9149d42711 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -707,7 +707,6 @@ struct SaveLoad { uint16_t length; ///< (Conditional) length of the variable (eg. arrays) (max array size is 65536 elements). SaveLoadVersion version_from; ///< Save/load the variable starting from this savegame version. SaveLoadVersion version_to; ///< Save/load the variable before this savegame version. - size_t size; ///< The sizeof size. SaveLoadAddrProc *address_proc; ///< Callback proc the get the actual variable address in memory. size_t extra_data; ///< Extra data for the callback proc. std::shared_ptr handler; ///< Custom handler for Save/Load procs. @@ -823,7 +822,7 @@ inline constexpr bool SlCheckVarSize(SaveLoadType cmd, VarType type, size_t leng * @note In general, it is better to use one of the SLE_* macros below. */ #define SLE_GENERAL_NAME(cmd, name, base, variable, type, length, from, to, extra) \ - SaveLoad {name, cmd, type, length, from, to, cpp_sizeof(base, variable), [] (void *b, size_t) -> void * { \ + SaveLoad {name, cmd, type, length, from, to, [] (void *b, size_t) -> void * { \ static_assert(SlCheckVarSize(cmd, type, length, sizeof(static_cast(b)->variable))); \ assert(b != nullptr); \ return const_cast(static_cast(std::addressof(static_cast(b)->variable))); \ @@ -1052,7 +1051,7 @@ inline constexpr bool SlCheckVarSize(SaveLoadType cmd, VarType type, size_t leng * @note In general, it is better to use one of the SLEG_* macros below. */ #define SLEG_GENERAL(name, cmd, variable, type, length, from, to, extra) \ - SaveLoad {name, cmd, type, length, from, to, sizeof(variable), [] (void *, size_t) -> void * { \ + SaveLoad {name, cmd, type, length, from, to, [] (void *, size_t) -> void * { \ static_assert(SlCheckVarSize(cmd, type, length, sizeof(variable))); \ return static_cast(std::addressof(variable)); }, extra, nullptr} @@ -1104,7 +1103,7 @@ inline constexpr bool SlCheckVarSize(SaveLoadType cmd, VarType type, size_t leng * @param from First savegame version that has the struct. * @param to Last savegame version that has the struct. */ -#define SLEG_CONDSTRUCT(name, handler, from, to) SaveLoad {name, SL_STRUCT, 0, 0, from, to, 0, nullptr, 0, std::make_shared()} +#define SLEG_CONDSTRUCT(name, handler, from, to) SaveLoad {name, SL_STRUCT, 0, 0, from, to, nullptr, 0, std::make_shared()} /** * Storage of a global reference list in some savegame versions. @@ -1133,7 +1132,7 @@ inline constexpr bool SlCheckVarSize(SaveLoadType cmd, VarType type, size_t leng * @param from First savegame version that has the list. * @param to Last savegame version that has the list. */ -#define SLEG_CONDSTRUCTLIST(name, handler, from, to) SaveLoad {name, SL_STRUCTLIST, 0, 0, from, to, 0, nullptr, 0, std::make_shared()} +#define SLEG_CONDSTRUCTLIST(name, handler, from, to) SaveLoad {name, SL_STRUCTLIST, 0, 0, from, to, nullptr, 0, std::make_shared()} /** * Storage of a global variable in every savegame version. diff --git a/src/saveload/settings_sl.cpp b/src/saveload/settings_sl.cpp index 987344f952..0d09ec4cd9 100644 --- a/src/saveload/settings_sl.cpp +++ b/src/saveload/settings_sl.cpp @@ -84,7 +84,7 @@ static std::vector GetSettingsDesc(const SettingTable &settings, bool if (is_loading && (sd->flags & SF_NO_NETWORK_SYNC) && _networking && !_network_server) { if (IsSavegameVersionBefore(SLV_TABLE_CHUNKS)) { /* We don't want to read this setting, so we do need to skip over it. */ - saveloads.push_back({sd->GetName(), sd->save.cmd, GetVarFileType(sd->save.conv) | SLE_VAR_NULL, sd->save.length, sd->save.version_from, sd->save.version_to, 0, nullptr, 0, nullptr}); + saveloads.push_back({sd->GetName(), sd->save.cmd, GetVarFileType(sd->save.conv) | SLE_VAR_NULL, sd->save.length, sd->save.version_from, sd->save.version_to, nullptr, 0, nullptr}); } continue; } From 1fe11b7b57800fd6fb933e18f734c696d689807c Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 15 Jul 2024 04:43:37 +0000 Subject: [PATCH 17/41] Update: Translations from eints chinese (simplified): 2 changes by WenSimEHRP --- src/lang/simplified_chinese.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 569411e902..ec3b2fbe20 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -4705,8 +4705,8 @@ STR_ORDER_STOP_LOCATION_FAR_END :[远端] STR_ORDER_OUT_OF_RANGE :{RED}(下一个目的地距离过远) STR_ORDER_CONDITIONAL_UNCONDITIONAL :跳至 {COMMA} -STR_ORDER_CONDITIONAL_NUM :跳至 {COMMA} [ 当 {STRING} {STRING} {COMMA} ] -STR_ORDER_CONDITIONAL_TRUE_FALSE :跳至 {COMMA} [ 当 {STRING} {STRING}] +STR_ORDER_CONDITIONAL_NUM :跳至 #{COMMA} [如果{STRING}{STRING}{COMMA}] +STR_ORDER_CONDITIONAL_TRUE_FALSE :跳至 #{COMMA} [如果{STRING}{STRING}] STR_INVALID_ORDER :{RED}(非法的调度计划) From eeed824329b7fe0efd80037c5b25430f363c2c7e Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 16 Jul 2024 04:43:38 +0000 Subject: [PATCH 18/41] Update: Translations from eints norwegian (bokmal): 1 change by eriksorngard chinese (simplified): 1 change by WenSimEHRP german: 13 changes by Wuzzy2 --- src/lang/german.txt | 15 +++++++++++++-- src/lang/norwegian_bokmal.txt | 1 + src/lang/simplified_chinese.txt | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/lang/german.txt b/src/lang/german.txt index 6f46ec849f..093c9ee778 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -624,14 +624,14 @@ STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLA STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}Alle abwählen STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}Zeige alle Frachtarten im Frachtraten-Diagramm an STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}Zeige keine Fracht im Frachtraten-Diagramm an -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Diagrammschalter für Frachttyp ein/aus +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}Diagramm für diesen Frachttyp ein/aus STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Zeige detailierte Leistungsaufschlüsselung # Graph key window STR_GRAPH_KEY_CAPTION :{WHITE}Legende des Firmendiagramms -STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Graph der Firma ein-/ausblenden +STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Graph dieser Firma ein-/ausblenden # Company league window STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Firmentabelle @@ -803,9 +803,11 @@ STR_SMALLMAP_TOWN :{TINY_FONT}{WHI STR_SMALLMAP_DISABLE_ALL :{BLACK}Alles ausblenden STR_SMALLMAP_ENABLE_ALL :{BLACK}Alles einblenden STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Zeige Höhe +STR_SMALLMAP_SHOW_INDUSTRY_NAMES :{BLACK}Industrienamen anzeigen STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Industrien ausblenden STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Industrien einblenden STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Anzeige des Höhenreliefs umschalten +STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRY_NAMES :{BLACK}Industrienamen anzeigen ein/aus STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Zeige kein Eigentum des Unternehmens auf der Karte STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Zeige das ganze Eigentum des Unternehmens auf der Karte STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Zeige keine Frachtarten auf der Karte @@ -2587,6 +2589,7 @@ STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :Falsche Version STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :Name wird bereits verwendet STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :Falsches Spielpasswort STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :nicht auf Erlaubnisliste +STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :keine der angeforderten Authentifizierungsmethoden ist verfügbar STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :Falsche Firmen-ID in DoCommand STR_NETWORK_ERROR_CLIENT_KICKED :vom Server hinausgeworfen STR_NETWORK_ERROR_CLIENT_CHEATER :hat versucht zu mogeln @@ -2885,6 +2888,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Straße STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Straßenbahngleis mit automatischer Wahl der Ausrichtung bauen. Strg+Klick, um Straßenbahngleisabschnitt zu entfernen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Fahrzeugdepot bauen (zum Kauf und zur Wartung von Fahrzeugen benötigt). Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Straßenbahndepot bauen (zum Kauf und zur Wartung von Straßenbahnen benötigt). Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD_TO_WAYPOINT :{BLACK}Wegpunkt auf Straße bauen. Strg+Klick, um einen anderen Wegpunkt zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Wegpunkt auf Straßenbahngleis bauen. Strg+Klick, um einen anderen Wegpunkt zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bushaltestelle bauen. Strg+Klick, um eine andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Straßenbahnhaltestelle bauen. Strg+Klick, um einen andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Lkw-Ladeplatz bauen. Strg+Klick, um eine andere Station zum Verbinden auszuwählen. Außerdem Umschalt drücken, um nur einen Kostenvoranschlag anzuzeigen @@ -3617,6 +3622,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Zum vorh STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Text für dieses Schild eingeben # Town directory window +STR_TOWN_DIRECTORY_CAPTION :{WHITE}Städte ({COMMA} von {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Keine - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Großstadt){BLACK} ({COMMA}) @@ -3950,6 +3956,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/Zyklus # Industry directory +STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industrien ({COMMA} von {COMMA}) STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Keine - STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% transportiert){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} @@ -5091,11 +5098,14 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Grenzt a STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Zu nahe an einem anderen Wegpunkt STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Wegpunkt kann hier nicht gebaut werden ... +STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Straßenwegpunkt kann hier nicht gebaut werden … STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Boje kann hier nicht platziert werden ... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Wegpunktname kann nicht geändert werden ... STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Wegpunkt kann hier nicht entfernt werden ... +STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}Straßenwegpunkt kann hier nicht entfernt werden … STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}Wegpunkt muss erst abgerissen werden +STR_ERROR_MUST_REMOVE_ROADWAYPOINT_FIRST :{WHITE}Straßenwegpunkt muss erst entfernt werden STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... Boje ist im Weg STR_ERROR_BUOY_IS_IN_USE :{WHITE}... Boje wird von einer anderen Firma benutzt! @@ -5343,6 +5353,7 @@ STR_ERROR_NO_STOP_ARTICULATED_VEHICLE :{WHITE}Es gibt STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Dieses Flugzeug kann nicht auf diesen Hubschrauberlandeplatz landen STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Dieser Helikopter kann auf diesen Flughafen nicht landen STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Es gibt keinen Gleiswegpunkt +STR_ERROR_NO_ROAD_WAYPOINT :{WHITE}Es gibt keinen Straßenwegpunkt STR_ERROR_NO_BUOY :{WHITE}Es gibt keine Boje # Timetable related errors diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index cb9e56110e..823850a9d0 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -2590,6 +2590,7 @@ STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :feil versjon STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :navnet er allerede i bruk STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :feil passord STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :ikke på tillattliste +STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :ingen av de ønskede autentiseringsmetodene er tilgjengelige STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :feil selskap i DoCommand STR_NETWORK_ERROR_CLIENT_KICKED :kastet ut av tjeneren STR_NETWORK_ERROR_CLIENT_CHEATER :prøvde å jukse diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index ec3b2fbe20..6d8f64c67b 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -4704,7 +4704,7 @@ STR_ORDER_STOP_LOCATION_FAR_END :[远端] STR_ORDER_OUT_OF_RANGE :{RED}(下一个目的地距离过远) -STR_ORDER_CONDITIONAL_UNCONDITIONAL :跳至 {COMMA} +STR_ORDER_CONDITIONAL_UNCONDITIONAL :跳至 #{COMMA} STR_ORDER_CONDITIONAL_NUM :跳至 #{COMMA} [如果{STRING}{STRING}{COMMA}] STR_ORDER_CONDITIONAL_TRUE_FALSE :跳至 #{COMMA} [如果{STRING}{STRING}] From d67963e61619f93061e13c9a0b4bf3a6b714cbe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Tue, 16 Jul 2024 21:28:29 +0200 Subject: [PATCH 19/41] Add: [Script] Include number of victims in ScriptEventVehicleCrashed (#12861) --- src/aircraft_cmd.cpp | 12 ++++++------ src/disaster_vehicle.cpp | 6 +++--- src/roadveh_cmd.cpp | 16 ++++++++-------- src/script/api/ai_changelog.hpp | 3 +++ src/script/api/game_changelog.hpp | 3 +++ src/script/api/script_event_types.hpp | 13 +++++++++++-- src/train_cmd.cpp | 18 +++++++++--------- src/water_cmd.cpp | 8 ++++---- 8 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 33ab2eba38..44d76650a1 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1322,10 +1322,10 @@ void Aircraft::MarkDirty() uint Aircraft::Crash(bool flooded) { - uint pass = Vehicle::Crash(flooded) + 2; // pilots + uint victims = Vehicle::Crash(flooded) + 2; // pilots this->crashed_counter = flooded ? 9000 : 0; // max 10000, disappear pretty fast when flooded - return pass; + return victims; } /** @@ -1336,8 +1336,8 @@ static void CrashAirplane(Aircraft *v) { CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE); - uint pass = v->Crash(); - SetDParam(0, pass); + uint victims = v->Crash(); + SetDParam(0, victims); v->cargo.Truncate(); v->Next()->cargo.Truncate(); @@ -1351,8 +1351,8 @@ static void CrashAirplane(Aircraft *v) newsitem = STR_NEWS_AIRCRAFT_CRASH; } - AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); - Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING)); + AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING, victims)); + Game::NewEvent(new ScriptEventVehicleCrashed(v->index, vt, st == nullptr ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING, victims)); NewsType newstype = NT_ACCIDENT; if (v->owner != _local_company) { diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index 69ce0319e4..f5b311f835 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -384,13 +384,13 @@ static bool DisasterTick_Ufo(DisasterVehicle *v) if (z <= u->z_pos && (u->vehstatus & VS_HIDDEN) == 0) { v->age++; if (u->crashed_ctr == 0) { - u->Crash(); + uint victims = u->Crash(); u->disaster_vehicle = INVALID_VEHICLE; AddTileNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->tile); - AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO)); - Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO)); + AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO, victims)); + Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO, victims)); } } diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 0cc513bb05..957dda01ca 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -528,9 +528,9 @@ static Vehicle *EnumCheckRoadVehCrashTrain(Vehicle *v, void *data) uint RoadVehicle::Crash(bool flooded) { - uint pass = this->GroundVehicleBase::Crash(flooded); + uint victims = this->GroundVehicleBase::Crash(flooded); if (this->IsFrontEngine()) { - pass += 1; // driver + victims += 1; // driver /* If we're in a drive through road stop we ought to leave it */ if (IsInsideMM(this->state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END)) { @@ -538,18 +538,18 @@ uint RoadVehicle::Crash(bool flooded) } } this->crashed_ctr = flooded ? 2000 : 1; // max 2220, disappear pretty fast when flooded - return pass; + return victims; } static void RoadVehCrash(RoadVehicle *v) { - uint pass = v->Crash(); + uint victims = v->Crash(); - AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING)); - Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING)); + AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING, victims)); + Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_RV_LEVEL_CROSSING, victims)); - SetDParam(0, pass); - StringID newsitem = (pass == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH; + SetDParam(0, victims); + StringID newsitem = (victims == 1) ? STR_NEWS_ROAD_VEHICLE_CRASH_DRIVER : STR_NEWS_ROAD_VEHICLE_CRASH; NewsType newstype = NT_ACCIDENT; if (v->owner != _local_company) { diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index 902e93c547..b07b85c749 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -17,6 +17,9 @@ * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li AIEventVehicleCrashed::GetVictims + * * \b 14.0 * * API additions: diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index c3365eb94c..3967726288 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -17,6 +17,9 @@ * * This version is not yet released. The following changes are not set in stone yet. * + * API additions: + * \li GSEventVehicleCrashed::GetVictims + * * \b 14.0 * * API additions: diff --git a/src/script/api/script_event_types.hpp b/src/script/api/script_event_types.hpp index 8142893d11..776a31ff8d 100644 --- a/src/script/api/script_event_types.hpp +++ b/src/script/api/script_event_types.hpp @@ -38,12 +38,14 @@ public: * @param vehicle The vehicle that crashed. * @param crash_site Where the vehicle crashed. * @param crash_reason The reason why the vehicle crashed. + * @param victims The number of victims caused by the crash. */ - ScriptEventVehicleCrashed(VehicleID vehicle, TileIndex crash_site, CrashReason crash_reason) : + ScriptEventVehicleCrashed(VehicleID vehicle, TileIndex crash_site, CrashReason crash_reason, uint victims) : ScriptEvent(ET_VEHICLE_CRASHED), crash_site(crash_site), vehicle(vehicle), - crash_reason(crash_reason) + crash_reason(crash_reason), + victims(victims) {} #endif /* DOXYGEN_API */ @@ -72,10 +74,17 @@ public: */ CrashReason GetCrashReason() { return this->crash_reason; } + /** + * Get the number of victims + * @return The number of victims + */ + SQInteger GetVictims() { return this->victims; } + private: TileIndex crash_site; ///< The location of the crash. VehicleID vehicle; ///< The crashed vehicle. CrashReason crash_reason; ///< The reason for crashing. + uint victims; ///< The number of victims. }; /** diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 9664204f14..a9fb14ee54 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3086,9 +3086,9 @@ void Train::ReserveTrackUnderConsist() const */ uint Train::Crash(bool flooded) { - uint pass = 0; + uint victims = 0; if (this->IsFrontEngine()) { - pass += 2; // driver + victims += 2; // driver /* Remove the reserved path in front of the train if it is not stuck. * Also clear all reserved tracks the train is currently on. */ @@ -3111,10 +3111,10 @@ uint Train::Crash(bool flooded) HideFillingPercent(&this->fill_percent_te_id); } - pass += this->GroundVehicleBase::Crash(flooded); + victims += this->GroundVehicleBase::Crash(flooded); this->crash_anim_pos = flooded ? 4000 : 1; // max 4440, disappear pretty fast when flooded - return pass; + return victims; } /** @@ -3125,20 +3125,20 @@ uint Train::Crash(bool flooded) */ static uint TrainCrashed(Train *v) { - uint num = 0; + uint victims = 0; /* do not crash train twice */ if (!(v->vehstatus & VS_CRASHED)) { - num = v->Crash(); - AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN)); - Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN)); + victims = v->Crash(); + AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN, victims)); + Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_TRAIN, victims)); } /* Try to re-reserve track under already crashed train too. * Crash() clears the reservation! */ v->ReserveTrackUnderConsist(); - return num; + return victims; } /** Temporary data storage for testing collisions. */ diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 5a0a94d172..c4b01c05ed 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -990,11 +990,11 @@ static void GetTileDesc_Water(TileIndex tile, TileDesc *td) */ static void FloodVehicle(Vehicle *v) { - uint pass = v->Crash(true); + uint victims = v->Crash(true); - AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED)); - Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED)); - SetDParam(0, pass); + AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED, victims)); + Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, ScriptEventVehicleCrashed::CRASH_FLOODED, victims)); + SetDParam(0, victims); AddTileNewsItem(STR_NEWS_DISASTER_FLOOD_VEHICLE, NT_ACCIDENT, v->tile); CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE); if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v); From 891e53c72e4c7c10ba345243e90681df4537aba5 Mon Sep 17 00:00:00 2001 From: Joan Josep Date: Tue, 16 Jul 2024 21:41:04 +0200 Subject: [PATCH 20/41] Codechange: move large switch case to separate function (#12863) --- src/build_vehicle_gui.cpp | 58 +++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 4d9a2ef647..1a985eb64a 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1606,6 +1606,35 @@ struct BuildVehicleWindow : Window { return list; } + void BuildVehicle() + { + EngineID sel_eng = this->sel_engine; + if (sel_eng == INVALID_ENGINE) return; + + CargoID cargo = this->cargo_filter_criteria; + if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES || cargo == CargoFilterCriteria::CF_NONE) cargo = INVALID_CARGO; + if (this->vehicle_type == VEH_TRAIN && RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) { + Command::Post(GetCmdBuildVehMsg(this->vehicle_type), CcBuildWagon, this->window_number, sel_eng, true, cargo, INVALID_CLIENT_ID); + } else { + Command::Post(GetCmdBuildVehMsg(this->vehicle_type), CcBuildPrimaryVehicle, this->window_number, sel_eng, true, cargo, INVALID_CLIENT_ID); + } + + /* Update last used variant in hierarchy and refresh if necessary. */ + bool refresh = false; + EngineID parent = sel_eng; + while (parent != INVALID_ENGINE) { + Engine *e = Engine::Get(parent); + refresh |= (e->display_last_variant != sel_eng); + e->display_last_variant = sel_eng; + parent = e->info.variant_id; + } + + if (refresh) { + InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window + InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well + } + } + void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override { switch (widget) { @@ -1668,34 +1697,9 @@ struct BuildVehicleWindow : Window { break; } - case WID_BV_BUILD: { - EngineID sel_eng = this->sel_engine; - if (sel_eng != INVALID_ENGINE) { - CargoID cargo = this->cargo_filter_criteria; - if (cargo == CargoFilterCriteria::CF_ANY || cargo == CargoFilterCriteria::CF_ENGINES || cargo == CargoFilterCriteria::CF_NONE) cargo = INVALID_CARGO; - if (this->vehicle_type == VEH_TRAIN && RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) { - Command::Post(GetCmdBuildVehMsg(this->vehicle_type), CcBuildWagon, this->window_number, sel_eng, true, cargo, INVALID_CLIENT_ID); - } else { - Command::Post(GetCmdBuildVehMsg(this->vehicle_type), CcBuildPrimaryVehicle, this->window_number, sel_eng, true, cargo, INVALID_CLIENT_ID); - } - - /* Update last used variant in hierarchy and refresh if necessary. */ - bool refresh = false; - EngineID parent = sel_eng; - while (parent != INVALID_ENGINE) { - Engine *e = Engine::Get(parent); - refresh |= (e->display_last_variant != sel_eng); - e->display_last_variant = sel_eng; - parent = e->info.variant_id; - } - if (refresh) { - InvalidateWindowData(WC_REPLACE_VEHICLE, this->vehicle_type, 0); // Update the autoreplace window - InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well - return; - } - } + case WID_BV_BUILD: + this->BuildVehicle(); break; - } case WID_BV_RENAME: { EngineID sel_eng = this->sel_engine; From e69c065d6e0e382910c0038ee021725bbccfefc3 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Jul 2024 11:40:17 +0100 Subject: [PATCH 21/41] Codechange: Use find_if to find waypoint StationSpec when converting old savegames. (#12865) This simplifies an indexed loop. --- src/saveload/waypoint_sl.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index 7745c9b6e5..9dc9de2376 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -86,14 +86,9 @@ void MoveWaypointsToBaseStations() /* As of version 17, we recalculate the custom graphic ID of waypoints * from the GRF ID / station index. */ for (OldWaypoint &wp : _old_waypoints) { - StationClass *stclass = StationClass::Get(STAT_CLASS_WAYP); - for (uint i = 0; i < stclass->GetSpecCount(); i++) { - const StationSpec *statspec = stclass->GetSpec(i); - if (statspec != nullptr && statspec->grf_prop.grffile->grfid == wp.grfid && statspec->grf_prop.local_id == wp.localidx) { - wp.spec = statspec; - break; - } - } + const auto specs = StationClass::Get(STAT_CLASS_WAYP)->Specs(); + auto found = std::find_if(std::begin(specs), std::end(specs), [&wp](const StationSpec *spec) { return spec != nullptr && spec->grf_prop.grffile->grfid == wp.grfid && spec->grf_prop.local_id == wp.localidx; }); + if (found != std::end(specs)) wp.spec = *found; } } From b9c44b29be9f4ba8b1a37d24a93c11e6fa98658a Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Jul 2024 18:16:22 +0100 Subject: [PATCH 22/41] Codechange: Pass AirportSpec instead of index to airport resolver object. (#12866) This avoids retrieving AirportSpec again when it is already available. --- src/newgrf_airport.cpp | 16 ++++++++-------- src/newgrf_airport.h | 10 +++++----- src/newgrf_airporttiles.cpp | 2 +- src/table/newgrf_debug_data.h | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp index 1471f417e2..0d90c0adad 100644 --- a/src/newgrf_airport.cpp +++ b/src/newgrf_airport.cpp @@ -183,7 +183,7 @@ GrfSpecFeature AirportResolverObject::GetFeature() const uint32_t AirportResolverObject::GetDebugID() const { - return AirportSpec::Get(this->airport_scope.airport_id)->grf_prop.local_id; + return this->airport_scope.spec->grf_prop.local_id; } /* virtual */ uint32_t AirportScopeResolver::GetRandomBits() const @@ -236,22 +236,22 @@ TownScopeResolver *AirportResolverObject::GetTown() * Constructor of the airport resolver. * @param tile %Tile for the callback, only valid for airporttile callbacks. * @param st %Station of the airport for which the callback is run, or \c nullptr for build gui. - * @param airport_id Type of airport for which the callback is run. + * @param spec AirportSpec for which the callback is run. * @param layout Layout of the airport to build. * @param callback Callback ID. * @param param1 First parameter (var 10) of the callback. * @param param2 Second parameter (var 18) of the callback. */ -AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, uint8_t airport_id, uint8_t layout, +AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, const AirportSpec *spec, uint8_t layout, CallbackID callback, uint32_t param1, uint32_t param2) - : ResolverObject(AirportSpec::Get(airport_id)->grf_prop.grffile, callback, param1, param2), airport_scope(*this, tile, st, airport_id, layout) + : ResolverObject(spec->grf_prop.grffile, callback, param1, param2), airport_scope(*this, tile, st, spec, layout) { - this->root_spritegroup = AirportSpec::Get(airport_id)->grf_prop.spritegroup[0]; + this->root_spritegroup = spec->grf_prop.spritegroup[0]; } SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout) { - AirportResolverObject object(INVALID_TILE, nullptr, as->GetIndex(), layout); + AirportResolverObject object(INVALID_TILE, nullptr, as, layout); const SpriteGroup *group = object.Resolve(); if (group == nullptr) return as->preview_sprite; @@ -260,7 +260,7 @@ SpriteID GetCustomAirportSprite(const AirportSpec *as, uint8_t layout) uint16_t GetAirportCallback(CallbackID callback, uint32_t param1, uint32_t param2, Station *st, TileIndex tile) { - AirportResolverObject object(tile, st, st->airport.type, st->airport.layout, callback, param1, param2); + AirportResolverObject object(tile, st, AirportSpec::Get(st->airport.type), st->airport.layout, callback, param1, param2); return object.ResolveCallback(); } @@ -273,7 +273,7 @@ uint16_t GetAirportCallback(CallbackID callback, uint32_t param1, uint32_t param */ StringID GetAirportTextCallback(const AirportSpec *as, uint8_t layout, uint16_t callback) { - AirportResolverObject object(INVALID_TILE, nullptr, as->GetIndex(), layout, (CallbackID)callback); + AirportResolverObject object(INVALID_TILE, nullptr, as, layout, (CallbackID)callback); uint16_t cb_res = object.ResolveCallback(); if (cb_res == CALLBACK_FAILED || cb_res == 0x400) return STR_UNDEFINED; if (cb_res > 0x400) { diff --git a/src/newgrf_airport.h b/src/newgrf_airport.h index 5ac58bc72d..3242e482c5 100644 --- a/src/newgrf_airport.h +++ b/src/newgrf_airport.h @@ -149,7 +149,7 @@ void BindAirportSpecs(); /** Resolver for the airport scope. */ struct AirportScopeResolver : public ScopeResolver { struct Station *st; ///< Station of the airport for which the callback is run, or \c nullptr for build gui. - uint8_t airport_id; ///< Type of airport for which the callback is run. + const AirportSpec *spec; ///< AirportSpec for which the callback is run. uint8_t layout; ///< Layout of the airport to build. TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks. @@ -158,11 +158,11 @@ struct AirportScopeResolver : public ScopeResolver { * @param ro Surrounding resolver. * @param tile %Tile for the callback, only valid for airporttile callbacks. * @param st %Station of the airport for which the callback is run, or \c nullptr for build gui. - * @param airport_id Type of airport for which the callback is run. + * @param spec AirportSpec for which the callback is run. * @param layout Layout of the airport to build. */ - AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, uint8_t airport_id, uint8_t layout) - : ScopeResolver(ro), st(st), airport_id(airport_id), layout(layout), tile(tile) + AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, const AirportSpec *spec, uint8_t layout) + : ScopeResolver(ro), st(st), spec(spec), layout(layout), tile(tile) { } @@ -177,7 +177,7 @@ struct AirportResolverObject : public ResolverObject { AirportScopeResolver airport_scope; std::optional town_scope = std::nullopt; ///< The town scope resolver (created on the first call). - AirportResolverObject(TileIndex tile, Station *st, uint8_t airport_id, uint8_t layout, + AirportResolverObject(TileIndex tile, Station *st, const AirportSpec *spec, uint8_t layout, CallbackID callback = CBID_NO_CALLBACK, uint32_t callback_param1 = 0, uint32_t callback_param2 = 0); TownScopeResolver *GetTown(); diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp index a4adf748a8..8cd6123182 100644 --- a/src/newgrf_airporttiles.cpp +++ b/src/newgrf_airporttiles.cpp @@ -216,7 +216,7 @@ AirportTileResolverObject::AirportTileResolverObject(const AirportTileSpec *ats, CallbackID callback, uint32_t callback_param1, uint32_t callback_param2) : ResolverObject(ats->grf_prop.grffile, callback, callback_param1, callback_param2), tiles_scope(*this, ats, tile, st), - airport_scope(*this, tile, st, st != nullptr ? st->airport.type : (uint8_t)AT_DUMMY, st != nullptr ? st->airport.layout : 0) + airport_scope(*this, tile, st, st != nullptr ? AirportSpec::Get(st->airport.type) : nullptr, st != nullptr ? st->airport.layout : 0) { this->root_spritegroup = ats->grf_prop.spritegroup[0]; } diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 1be431a939..e134d182e2 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -548,7 +548,7 @@ class NIHAirport : public NIHelper { uint Resolve(uint index, uint var, uint param, bool &avail) const override { Station *st = Station::Get(index); - AirportResolverObject ro(st->airport.tile, st, st->airport.type, st->airport.layout); + AirportResolverObject ro(st->airport.tile, st, AirportSpec::Get(st->airport.type), st->airport.layout); return ro.GetScope(VSG_SCOPE_SELF)->GetVariable(var, param, avail); } From 2199543fbcf0b9ae4e5a39b917d3942007c2c64e Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Jul 2024 10:04:10 +0100 Subject: [PATCH 23/41] Codechange: Use GetVisibleRangeIterators when drawing airport specs. --- src/airport_gui.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index a09bc82a89..b73ef24901 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -384,13 +384,14 @@ public: case WID_AP_AIRPORT_LIST: { Rect row = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.bevel); Rect text = r.WithHeight(this->line_height).Shrink(WidgetDimensions::scaled.matrix); - AirportClass *apclass = AirportClass::Get(_selected_airport_class); - for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) { - const AirportSpec *as = apclass->GetSpec(i); + const auto specs = AirportClass::Get(_selected_airport_class)->Specs(); + auto [first, last] = this->vscroll->GetVisibleRangeIterators(specs); + for (auto it = first; it != last; ++it) { + const AirportSpec *as = *it; if (!as->IsAvailable()) { GfxFillRect(row, PC_BLACK, FILLRECT_CHECKER); } - DrawString(text, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); + DrawString(text, as->name, (static_cast(as->index) == _selected_airport_index) ? TC_WHITE : TC_BLACK); row = row.Translate(0, this->line_height); text = text.Translate(0, this->line_height); } From 7fb3d1a197d948fca39d621ad4bb3b65d4105da4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Jul 2024 10:04:59 +0100 Subject: [PATCH 24/41] Codechange: Use range-for to iterate airport specs to find first available. --- src/airport_gui.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index b73ef24901..727a8e1f64 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -537,10 +537,9 @@ public: { /* First try to select an airport in the selected class. */ AirportClass *sel_apclass = AirportClass::Get(_selected_airport_class); - for (uint i = 0; i < sel_apclass->GetSpecCount(); i++) { - const AirportSpec *as = sel_apclass->GetSpec(i); + for (const AirportSpec *as : sel_apclass->Specs()) { if (as->IsAvailable()) { - this->SelectOtherAirport(i); + this->SelectOtherAirport(as->index); return; } } From cd739c2c33bf2673792998f0b6d756122df64052 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Jul 2024 22:20:38 +0100 Subject: [PATCH 25/41] Codechange: Replace dropdown's magic 2 with appropriate WidgetDimension. (#12869) --- src/dropdown.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dropdown.cpp b/src/dropdown.cpp index fe3e90eba6..3fde9ef74f 100644 --- a/src/dropdown.cpp +++ b/src/dropdown.cpp @@ -319,11 +319,11 @@ struct DropdownWindow : Window { } this->click_delay = 2; } else { - if (_cursor.pos.y <= this->top + 2) { + if (_cursor.pos.y <= this->top + WidgetDimensions::scaled.dropdownlist.top) { /* Cursor is above the list, set scroll up */ this->scrolling = -1; return; - } else if (_cursor.pos.y >= this->top + this->height - 2) { + } else if (_cursor.pos.y >= this->top + this->height - WidgetDimensions::scaled.dropdownlist.bottom) { /* Cursor is below list, set scroll down */ this->scrolling = 1; return; From 8ed854be58dd9c5ff7e91c0e10551916626179a4 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 18 Jul 2024 04:43:42 +0000 Subject: [PATCH 26/41] Update: Translations from eints chinese (traditional): 28 changes by KogentaSan --- src/lang/traditional_chinese.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 735ff6c4fa..3199255d19 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1051,8 +1051,15 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}選擇 STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}關於基本音樂集的額外資訊 +STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(沒有安裝社交平台擴充功能) +STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}月台︰ +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}擴充功能狀態︰ +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}初始化失敗 +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} 沒運作 +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}擴充功能重複 +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}無效簽署 STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}無法擷取可用的螢幕解析度清單 @@ -1244,6 +1251,7 @@ STR_CONFIG_SETTING_SUBSIDY_DURATION :補助持續時 ###length 2 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :設定發放財政補助的年數。 +STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} ###setting-zero-is-special STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :沒有補貼 @@ -2627,6 +2635,7 @@ STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLA # Linkgraph tooltip STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}回程則有{CARGO_LONG}(可載量之{COMMA}%) +STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}平均運輸時間:{UNITS_DAYS_OR_SECONDS} # Base for station construction window(s) STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}顯示運輸涵蓋範圍 @@ -3458,6 +3467,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}前往 STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}輸入標誌名稱 # Town directory window +STR_TOWN_DIRECTORY_CAPTION :{WHITE}市鎮({COMMA} 座,總共 {COMMA} 座) STR_TOWN_DIRECTORY_NONE :{ORANGE}- 無 - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (城市){BLACK} ({COMMA}) @@ -3475,6 +3485,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} 已運送 STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (仍然需要) STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN}(已運送) +STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}該市鎮每隔 {ORANGE}{UNITS_DAYS_OR_SECONDS}{BLACK}擴張一次 +STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}該市鎮每隔 {ORANGE}{UNITS_DAYS_OR_SECONDS}{BLACK}擴張一次(正接受資助) STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}市鎮{RED}不在{BLACK}成長 STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}市鎮噪音限制:{ORANGE}{COMMA}{BLACK} 最大:{ORANGE}{COMMA} STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}將市鎮置於畫面中央。按住 Ctrl 點選可於市鎮位置開啟新視窗視野 @@ -3562,10 +3574,13 @@ STR_GOAL_QUESTION_BUTTON_CLOSE :關閉 # Subsidies window STR_SUBSIDIES_CAPTION :{WHITE}補助資訊 STR_SUBSIDIES_OFFERED_TITLE :{BLACK}提供補助的運輸服務: +STR_SUBSIDIES_OFFERED_FROM_TO :{ORANGE}將 {STRING} 從 {STRING} 運到 {STRING}{YELLOW}({STRING}) STR_SUBSIDIES_NONE :{ORANGE}- 無 - STR_SUBSIDIES_SUBSIDISED_TITLE :{BLACK}已獲補助的服務: STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}將 {STRING} 從 {STRING} 運到 {STRING}{YELLOW} ({COMPANY}{YELLOW},{STRING}) STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}點選運送服務可將工業/市鎮置於畫面中央。 按住 Ctrl 點選可於工業/市鎮位置開啟新視窗視野 +STR_SUBSIDIES_OFFERED_EXPIRY_DATE :在 {DATE_SHORT} 之前 +STR_SUBSIDIES_OFFERED_EXPIRY_TIME :剩餘時間︰{UNITS_MONTHS_OR_MINUTES} STR_SUBSIDIES_SUBSIDISED_EXPIRY_DATE :直到{DATE_SHORT} STR_SUBSIDIES_SUBSIDISED_EXPIRY_TIME :剩餘{UNITS_MONTHS_OR_MINUTES} @@ -3754,6 +3769,7 @@ STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :總經理姓名 STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :輸入你要給予的金額 STR_BUY_COMPANY_MESSAGE :{WHITE}我們正在找一間運輸公司收購我們的公司。{}{}您想購買 {COMPANY} 付出 {CURRENCY_LONG} 嗎? +STR_BUY_COMPANY_HOSTILE_TAKEOVER :{WHITE}在對 {COMPANY} 敵意收購時,您將會購買其所有的資產,償還其所有的貸款,並且支付其兩年的利潤。{}{}總額預計為 {CURRENCY_LONG}。{}{}您想繼續此項收購嗎? # Company infrastructure window STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION :{WHITE}{COMPANY} 的基礎建設 @@ -3770,6 +3786,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/週期 # Industry directory +STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}工業({COMMA} 座,總共 {COMMA} 座) STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- 無 - STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} (運送了{COMMA}%){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} @@ -3828,6 +3845,8 @@ STR_VEHICLE_LIST_SEND_FOR_SERVICING :送去維護 STR_VEHICLE_LIST_CREATE_GROUP :建立群組 STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}今年盈利:{CURRENCY_LONG} (去年盈利:{CURRENCY_LONG}) STR_VEHICLE_LIST_PROFIT_THIS_PERIOD_LAST_PERIOD :{TINY_FONT}{BLACK}本期盈利:{CURRENCY_LONG}(上期:{CURRENCY_LONG}) +STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}] +STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING} STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :送到機廠 STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :送到車廠 @@ -4270,6 +4289,12 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}容量 STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}轉運潛在收入:{LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}每隔 {LTBLUE}{COMMA}{NBSP}天進行維護{BLACK} 上次維護日期:{LTBLUE}{STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}維護間隔:{LTBLUE}{COMMA}{NBSP}分鐘{BLACK} {STRING} +STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}維護間隔:{LTBLUE}{COMMA}%{BLACK} {STRING} +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}將維護間隔縮減 10 天。 按住 點選可將維護間隔縮減 1 天 +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}將維護間隔縮減 5 分鐘。 按住 點選可將維護間隔縮減 1 分鐘 +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}將維護間隔縮減 10%。 按住 點選可將維護間隔縮減 1% STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}更改檢修週期所用單位 STR_VEHICLE_DETAILS_DEFAULT :預設 @@ -4338,6 +4363,7 @@ STR_ORDERS_TIMETABLE_VIEW_TOOLTIP :{BLACK}切換 STR_ORDERS_LIST_TOOLTIP :{BLACK}指令清單 - 點選可選擇該指令,按住 CTRL 點選可跳到車站位置 STR_ORDER_INDEX :{COMMA}:{NBSP} +STR_ORDER_TEXT :{STRING} {STRING} {STRING} {STRING} STR_ORDERS_END_OF_ORDERS :- - 指令結束 - - STR_ORDERS_END_OF_SHARED_ORDERS :- - 共享指令結束 - - @@ -4692,7 +4718,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}預估 STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}遊戲還在儲存中,{}請稍候! STR_ERROR_AUTOSAVE_FAILED :{WHITE}自動儲存失敗 STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}無法讀取磁碟 +STR_ERROR_GAME_SAVE_FAILED :{WHITE}遊戲儲存失敗…… STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}無法刪除檔案 +STR_ERROR_GAME_LOAD_FAILED :{WHITE}遊戲載入失敗…… STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :內部錯誤:{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :損壞的存檔 - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :該存檔是由較新版本的遊戲所產生 From 97479eb9537485527aaeab11fd80189f5c89f134 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 19 Jul 2024 04:43:26 +0000 Subject: [PATCH 27/41] Update: Translations from eints chinese (traditional): 97 changes by KogentaSan --- src/lang/traditional_chinese.txt | 103 +++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 3199255d19..0f42ef85c4 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -435,6 +435,8 @@ STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :離開編輯器 STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :離開 +STR_SCENEDIT_TOWN_MENU_BUILD_TOWN :生成市鎮 +STR_SCENEDIT_TOWN_MENU_PACE_HOUSE :設置房屋 # Settings menu ###length 16 @@ -531,6 +533,7 @@ STR_ABOUT_MENU_ABOUT_OPENTTD :關於「OpenTT STR_ABOUT_MENU_SPRITE_ALIGNER :子畫面定位工具 STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :切換邊界框 STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :切換骯髒區塊的配色 +STR_ABOUT_MENU_TOGGLE_WIDGET_OUTLINES :切換小工具邊界框 ###length 31 STR_DAY_NUMBER_1ST :1 @@ -659,6 +662,8 @@ STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}總計 ###next-name-looks-similar STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}最後提供服務的車站各部份數量。 每部份車站 (火車站、公車站、機場) 都算在内,就算連在一起亦然 +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}收入最低的車輛的盈利(僅計算超過兩年的車輛) +STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}收入最低的車輛的盈利(僅計算超過兩週期的車輛) STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP :{BLACK}最近三年的單季最低收入 STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP :{BLACK}最近三年的單季最高收入 STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP :{BLACK}前四季運送的貨物量 @@ -890,6 +895,8 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} 應馬上退役並替換新車 STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} 找不到路徑繼續前進 STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} 迷路了 +STR_NEWS_VEHICLE_UNPROFITABLE_YEAR :{WHITE}{VEHICLE} 去年的盈利為 {CURRENCY_LONG} +STR_NEWS_VEHICLE_UNPROFITABLE_PERIOD :{WHITE}{VEHICLE} 上期的盈利為 {CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} 無法前往下一目的地,因為該目的地超出了飛行範圍 STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} 因改裝失敗而停止 @@ -904,7 +911,12 @@ STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}打開 STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}補助過期:{}{}將 {STRING} 從 {STRING} 運到 {STRING} 現在起不再提供補助 STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}補助結束:{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務不再提供補助 +STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}提供補助:{}{}首先將 {STRING} 從 {STRING} 運到 {STRING} 的公司將得到地方政府為期 {UNITS_YEARS_OR_MINUTES} 的補助! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}現在起 {4:UNITS_YEARS_OR_MINUTES} 期間內將 {1:STRING} 從 {2:STRING} 運到 {3:STRING} 的服務可收到額外 50% 的運費補助! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}現在起 {4:UNITS_YEARS_OR_MINUTES} 期間內將 {1:STRING} 從 {2:STRING} 運到 {3:STRING} 的服務可收到雙倍運費補助! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}現在起 {4:UNITS_YEARS_OR_MINUTES} 期間內將 {1:STRING} 從 {2:STRING} 運到 {3:STRING} 的服務可收到三倍運費補助! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}現在起 {4:UNITS_YEARS_OR_MINUTES} 期間內將 {1:STRING} 從 {2:STRING} 運到 {3:STRING} 的服務可收到四倍運費補助! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}運輸大亨! @@ -974,12 +986,14 @@ STR_GAME_OPTIONS_CURRENCY_GEL :喬治亞拉里 STR_GAME_OPTIONS_CURRENCY_IRR :伊朗里亞爾 STR_GAME_OPTIONS_CURRENCY_RUB :俄羅斯盧布 STR_GAME_OPTIONS_CURRENCY_MXN :墨西哥披索 -STR_GAME_OPTIONS_CURRENCY_NTD :新臺幣 (NTD) +STR_GAME_OPTIONS_CURRENCY_NTD :新台幣 STR_GAME_OPTIONS_CURRENCY_CNY :中國人民幣 STR_GAME_OPTIONS_CURRENCY_HKD :港幣 STR_GAME_OPTIONS_CURRENCY_INR :印度盧比 STR_GAME_OPTIONS_CURRENCY_IDR :印尼盾 STR_GAME_OPTIONS_CURRENCY_MYR :馬來西亞令吉 +STR_GAME_OPTIONS_CURRENCY_LVL :拉脫維亞勒斯 +STR_GAME_OPTIONS_CURRENCY_PTE :葡萄牙埃斯庫多 STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}自動存檔 STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}選擇自動存檔頻率 @@ -1026,6 +1040,7 @@ STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}勾選 STR_GAME_OPTIONS_GUI_FONT_AA :{BLACK}反鋸齒字體 STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :{BLACK}勾選此方框以使用反鋸齒字體。 +STR_GAME_OPTIONS_GUI_SCALE_MARK :{DECIMAL}x STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}自動問卷 STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}參與自動問卷 @@ -1050,17 +1065,23 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}基本 STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}選擇要使用的基本音樂集 STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}關於基本音樂集的額外資訊 +STR_GAME_OPTIONS_ONLINE_CONTENT :取得內容 +STR_GAME_OPTIONS_ONLINE_CONTENT_TOOLTIP :檢查及下載最新內容 STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(沒有安裝社交平台擴充功能) STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}月台︰ STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}擴充功能狀態︰ +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}正在運行 STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_FAILED :{RED}初始化失敗 -STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} 沒運作 +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_PLATFORM_NOT_RUNNING :{ORANGE}{STRING} 未運行 +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNLOADED :{RED}未載入 STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_DUPLICATE :{RED}擴充功能重複 +STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_UNSUPPORTED_API :{RED}不支援的版本 STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_INVALID_SIGNATURE :{RED}無效簽署 +STR_BASESET_STATUS :{STRING} {RED}(總共有 {NUM} 項檔案缺少或損毀) STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}無法擷取可用的螢幕解析度清單 STR_ERROR_FULLSCREEN_FAILED :{WHITE}無法切換全螢幕模式 @@ -1073,6 +1094,8 @@ STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}降低 STR_CURRENCY_INCREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}提升自訂幣值對 1 英鎊 (£) 的匯率 STR_CURRENCY_SET_EXCHANGE_RATE_TOOLTIP :{BLACK}設定自訂幣值對 1 英鎊 (£) 的匯率 +STR_CURRENCY_SEPARATOR :{LTBLUE}分隔符號︰{ORANGE}{STRING} +STR_CURRENCY_SET_CUSTOM_CURRENCY_SEPARATOR_TOOLTIP :{BLACK}設定自訂貨幣的分隔符號 STR_CURRENCY_PREFIX :{LTBLUE}前置字:{ORANGE}{STRING} STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}為你的貨幣指定前置字串 @@ -1250,6 +1273,7 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :設定獲補助 STR_CONFIG_SETTING_SUBSIDY_DURATION :補助持續時間:{STRING} ###length 2 STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :設定發放財政補助的年數。 +STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT_PERIODS :設定發放財政補助的期數。 STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{UNITS_YEARS_OR_PERIODS} ###setting-zero-is-special @@ -1439,10 +1463,16 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :如啟用此選 STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :車輛永不過期:{STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :如啟用此選項,所有車輛一經面世,就永遠可以選擇建造。 +STR_CONFIG_SETTING_TIMEKEEPING_UNITS :時間模式︰{STRING} ###length 2 +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :日曆 +STR_CONFIG_SETTING_MINUTES_PER_YEAR :每年分鐘數︰{STRING} +STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :選擇在掛鐘模式下每年所需的時間長度。預設為 12 分鐘;設定為 0 則停止日期變更。增加每年的時長會延遲新車輛、房屋和其他基礎設施的研發時間。此設定不會影響車輛速度或經濟模擬,但通貨膨脹除外。此設定僅在使用掛鐘模式時可用 +STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special +STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0(日期停止) STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% @@ -1696,6 +1726,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :在顯示報紙 ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR :年度結束:{STRING} +STR_CONFIG_SETTING_SOUND_NEW_PERIOD :週期結束︰{STRING} ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :在顯示年終報告時播放音效 @@ -1760,6 +1791,9 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT_HELPTEXT :設定預設的 STR_CONFIG_SETTING_SERVINT_SHIPS :預設的船舶維護作業時距:{STRING} STR_CONFIG_SETTING_SERVINT_SHIPS_HELPTEXT :設定預設的船舶維護作業時距。所有沒有指定維護作業時距的船舶都會使用這個預設值。 ###length 3 +STR_CONFIG_SETTING_SERVINT_VALUE_DAYS :{COMMA}{NBSP}日 +STR_CONFIG_SETTING_SERVINT_VALUE_MINUTES :{COMMA}{NBSP}分鐘 +STR_CONFIG_SETTING_SERVINT_VALUE_PERCENTAGE :{COMMA}{NBSP}% ###setting-zero-is-special STR_CONFIG_SETTING_SERVINT_DISABLED :停用 @@ -2114,6 +2148,7 @@ STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}選擇 STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}顯示遊戲選項 STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}顯示積分排行榜 +STR_INTRO_TOOLTIP_HELP :{BLACK}取得說明和線上資源 STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}顯示設定 STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}顯示 NewGRF 設定 STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}檢查有無最新或可更新的內容可下載 @@ -2141,6 +2176,7 @@ STR_HELP_WINDOW_WEBSITES :{BLACK}網站 STR_HELP_WINDOW_DOCUMENTS :{BLACK}文檔 STR_HELP_WINDOW_README :{BLACK}Readme STR_HELP_WINDOW_CHANGELOG :{BLACK}修訂紀錄 +STR_HELP_WINDOW_KNOWN_BUGS :{BLACK}已知漏洞 STR_HELP_WINDOW_LICENSE :{BLACK}許可協議 STR_HELP_WINDOW_MAIN_WEBSITE :{BLACK}OpenTTD STR_HELP_WINDOW_MANUAL_WIKI :{BLACK}手冊/維基 @@ -2148,7 +2184,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}回報 STR_HELP_WINDOW_COMMUNITY :{BLACK}社區 # Cheat window -STR_CHEATS :{WHITE}作弊 +STR_CHEATS :{WHITE}沙盒選項 STR_CHEAT_MONEY :{LTBLUE}增加金錢:{CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}切換玩家操控的公司:{ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}神奇推土機 (可摧毀工業、無法移除的物件):{ORANGE}{STRING} @@ -2159,6 +2195,7 @@ STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}修改 STR_CHEAT_CHANGE_DATE :{LTBLUE}修改日期:{ORANGE} {DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}變更目前年份 STR_CHEAT_SETUP_PROD :{LTBLUE}允許修改產量:{ORANGE}{STRING} +STR_CHEAT_STATION_RATING :{LTBLUE}車站評價固定為 100%︰{ORANGE}{STRING} # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} 的配色 @@ -2169,10 +2206,14 @@ STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}顯示 STR_LIVERY_SHIP_TOOLTIP :{BLACK}顯示船舶配色 STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}顯示飛機配色 STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}顯示列車群組的配色 +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}顯示公路車輛群組的配色 +STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}顯示飛機群組的配色 STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}選擇所選配色的主色調。如按住 Ctrl 鍵點選色調,則所有配色皆採用此顏色為主色調 STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}選擇所選配色的副色調。如按住 Ctrl 掣點選色調,則所有配色皆採用此顏色為副色調 STR_LIVERY_PANEL_TOOLTIP :{BLACK}選擇要修改的配色,按住 CTRL 可同時選擇多種配色,勾選方框可切換是否使用配色 STR_LIVERY_TRAIN_GROUP_EMPTY :未有設置任何列車群組 +STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :未設立公路車輛群組 +STR_LIVERY_AIRCRAFT_GROUP_EMPTY :未設立飛機群組 ###length 23 STR_LIVERY_DEFAULT :標準配色 @@ -2696,9 +2737,24 @@ STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}選擇 STR_STATION_BUILD_DRAG_DROP :{BLACK}拖放 STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}以拖曳方式興建車站 +STR_PICKER_MODE_ALL :所有 +STR_PICKER_MODE_ALL_TOOLTIP :切換顯示所有種類的項目 +STR_PICKER_MODE_USED :已啟用 +STR_PICKER_MODE_USED_TOOLTIP :切換僅顯示現有的項目 +STR_PICKER_MODE_SAVED :已儲存 +STR_PICKER_MODE_SAVED_TOOLTIP :切換僅顯示已儲存的項目 +STR_PICKER_STATION_CLASS_TOOLTIP :選擇顯示的車站種類 +STR_PICKER_WAYPOINT_CLASS_TOOLTIP :選擇顯示的號誌站種類 +STR_PICKER_HOUSE_CLASS_TOOLTIP :選擇顯示的市鎮區域 +STR_HOUSE_PICKER_CAPTION :房屋選擇 +STR_HOUSE_PICKER_CLASS_ZONE1 :市鎮邊緣 +STR_HOUSE_PICKER_CLASS_ZONE2 :郊區邊緣 +STR_HOUSE_PICKER_CLASS_ZONE3 :遠郊 +STR_HOUSE_PICKER_CLASS_ZONE4 :近郊 +STR_HOUSE_PICKER_CLASS_ZONE5 :市鎮中心 STR_STATION_CLASS_DFLT :預設 STR_STATION_CLASS_DFLT_STATION :預設車站 @@ -3167,6 +3223,7 @@ STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}市鎮 STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}市鎮名稱: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}選擇市鎮命名風格 STR_MAPGEN_DATE :{BLACK}日期: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}選擇開始日期 STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工業數量: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}將地圖上最高峰的最大高度增加1 @@ -3181,6 +3238,7 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}將沙 STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形種類: STR_MAPGEN_SEA_LEVEL :{BLACK}海平面: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}選擇海洋覆蓋率 STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流: STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度: STR_MAPGEN_VARIETY :{BLACK}地形起伏分佈: @@ -3257,8 +3315,11 @@ STR_GENERATION_ABORT_MESSAGE :{YELLOW}您確 STR_GENERATION_PROGRESS :{WHITE}完成 {NUM}% STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM} STR_GENERATION_WORLD_GENERATION :{BLACK}產生世界 +STR_GENERATION_LANDSCAPE_GENERATION :{BLACK}景觀生成 STR_GENERATION_RIVER_GENERATION :{BLACK}產生河流 STR_GENERATION_CLEARING_TILES :{BLACK}產生粗地與岩石區域 +STR_GENERATION_TOWN_GENERATION :{BLACK}市鎮生成 +STR_GENERATION_INDUSTRY_GENERATION :{BLACK}工業生成 STR_GENERATION_OBJECT_GENERATION :{BLACK}無法移動 STR_GENERATION_TREE_GENERATION :{BLACK}產生樹木 STR_GENERATION_SETTINGUP_GAME :{BLACK}設定遊戲 @@ -3330,6 +3391,7 @@ STR_SAVE_PRESET_SAVE :{BLACK}存檔 STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}儲存預設值到選擇的名稱 # NewGRF parameters window +STR_BASEGRF_PARAMETERS_CAPTION :{WHITE}變更基本圖形集參數 STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}變更 NewGRF 參數 STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}關閉 STR_NEWGRF_PARAMETERS_RESET :{BLACK}重設 @@ -3351,6 +3413,9 @@ STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_ROAD_TYPE :道路類型 STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF variable 60+x 參數(16 進位) # Sprite aligner window +STR_SPRITE_ALIGNER_CAPTION_NO_ACTION :{WHITE}對齊中的 Sprite︰({STRING}:{NUM}) +STR_SPRITE_ALIGNER_CAPTION_ACTIONA :{WHITE}對齊中的 Sprite︰Action 0xA,{COMMA} ({STRING}:{NUM}) +STR_SPRITE_ALIGNER_CAPTION_ACTION5 :{WHITE}對齊中的 Sprite︰Action 0x5,種類 {HEX},{COMMA} ({STRING}:{NUM}) STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}下一個子畫面 STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}繼續處理下個正常的子畫面,略過任何虛位/重新著色/文字字型相關的子畫面,並在到達最後的子畫面後,返回第一個子畫面繼續進行處理。 STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}前往子畫面 @@ -3605,6 +3670,8 @@ STR_STATION_LIST_STATION :{YELLOW}{STATIO STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} STR_STATION_LIST_NONE :{YELLOW}- 無 - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}選擇所有設施 +STR_STATION_LIST_CARGO_FILTER_ALL_AND_NO_RATING :所有貨物種類和沒有評價 +STR_STATION_LIST_CARGO_FILTER_ONLY_NO_RATING :無貨物評價 # Station view window STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} @@ -3803,6 +3870,7 @@ STR_INDUSTRY_DIRECTORY_FILTER_NONE :無 # Industry view STR_INDUSTRY_VIEW_CAPTION :{WHITE}{INDUSTRY} STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}上月產量: +STR_INDUSTRY_VIEW_PRODUCTION_LAST_MINUTE_TITLE :{BLACK}上分鐘產量︰ STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (運送了 {COMMA}%) STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}將工業置於畫面中央。按住 Ctrl 點選可於工業位置開啟新視窗視野 STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}產出等級:{YELLOW}{COMMA}% @@ -4292,12 +4360,16 @@ STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}轉運 STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}每隔 {LTBLUE}{COMMA}{NBSP}天進行維護{BLACK} 上次維護日期:{LTBLUE}{STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}維護間隔:{LTBLUE}{COMMA}{NBSP}分鐘{BLACK} {STRING} STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}維護間隔:{LTBLUE}{COMMA}%{BLACK} {STRING} +STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :上次維護︰{LTBLUE}{DATE_LONG} +STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :上次維護︰{LTBLUE}{NUM} 分鐘前 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}將維護間隔縮減 10 天。 按住 點選可將維護間隔縮減 1 天 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}將維護間隔縮減 5 分鐘。 按住 點選可將維護間隔縮減 1 分鐘 STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}將維護間隔縮減 10%。 按住 點選可將維護間隔縮減 1% STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}更改檢修週期所用單位 STR_VEHICLE_DETAILS_DEFAULT :預設 +STR_VEHICLE_DETAILS_DAYS :天 +STR_VEHICLE_DETAILS_MINUTES :分鐘 STR_VEHICLE_DETAILS_PERCENT :百分比 ###length VEHICLE_TYPES @@ -4403,6 +4475,7 @@ STR_ORDER_DROP_HALT_DEPOT :停留 # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}選擇車廠操作 STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}選擇船塢動作 ###next-name-looks-similar @@ -4677,16 +4750,23 @@ STR_AI_SETTINGS_SETTING :{STRING}:{ORA # Textfile window STR_TEXTFILE_JUMPLIST :{WHITE}目錄 +STR_TEXTFILE_JUMPLIST_TOOLTIP :{BLACK}透過此清單快速前往該頁觀看 STR_TEXTFILE_JUMPLIST_ITEM :{WHITE}{STRING} +STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}返回到歷程記錄 +STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}撤銷返回歷程記錄 STR_TEXTFILE_WRAP_TEXT :{WHITE}強迫文字換行 STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}強迫寬於視窗的文字自動換行 -STR_TEXTFILE_VIEW_README :{BLACK}檢視Readme +STR_TEXTFILE_VIEW_README :{BLACK}說明文件 +STR_TEXTFILE_VIEW_README_TOOLTIP :檢視此項目的說明文件 STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}修訂紀錄 +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :檢視此項目的更新日誌 STR_TEXTFILE_VIEW_LICENCE :{BLACK}授權條款 +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :檢視此項目的許可證 ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}{STRING}的 Readme STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}{STRING}的修訂紀錄 STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING}{STRING}的授權條款 +STR_TEXTFILE_SURVEY_RESULT_CAPTION :{WHITE}預覽調查結果 STR_TEXTFILE_GAME_MANUAL_CAPTION :{WHITE}OpenTTD 文檔 '{STRING}' @@ -4718,9 +4798,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}預估 STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}遊戲還在儲存中,{}請稍候! STR_ERROR_AUTOSAVE_FAILED :{WHITE}自動儲存失敗 STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}無法讀取磁碟 -STR_ERROR_GAME_SAVE_FAILED :{WHITE}遊戲儲存失敗…… +STR_ERROR_GAME_SAVE_FAILED :{WHITE}遊戲儲存失敗… STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}無法刪除檔案 -STR_ERROR_GAME_LOAD_FAILED :{WHITE}遊戲載入失敗…… +STR_ERROR_GAME_LOAD_FAILED :{WHITE}遊戲載入失敗… STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :內部錯誤:{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :損壞的存檔 - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :該存檔是由較新版本的遊戲所產生 @@ -4825,6 +4905,7 @@ STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... 地 STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}道路施工中 STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}無法刪除此市鎮...{}市鎮範圍內還有車站或機廠或無法移除的區塊 STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... 市中心沒有適合的空間建造雕像 +STR_ERROR_CAN_T_BUILD_HOUSE :{WHITE}無法興建房屋… # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... 已有太多工業 @@ -4897,10 +4978,12 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}太接 STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}太接近另一個號誌站 STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}無法在此興建列車號誌站... +STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}無法在此興建道路號誌站... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}無法在此放置浮標... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}無法修改號誌站名稱... STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}無法移除列車號誌站... +STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}無法移除道路號誌站... STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}必須先移除鐵路號誌站 STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... 被浮標擋住 STR_ERROR_BUOY_IS_IN_USE :{WHITE}... 浮標正被其他公司使用! @@ -5097,6 +5180,8 @@ STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}請修 STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}未有可用的車輛 STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}在{DATE_SHORT}後開始新遊戲,或使用提供早期車輛的NewGRF +STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL :{WHITE}沒有可用於市鎮建設的道路類型 +STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}請修改您的 NewGRF 設定 # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}無法讓列車通過險阻號誌... @@ -5140,6 +5225,7 @@ STR_ERROR_NO_STOP_ARTICULATED_VEHICLE :{WHITE}沒有 STR_ERROR_AIRPORT_NO_PLANES :{WHITE}這架飛機不能降落在這個直昇機場 STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}這架直昇機不能降落在這個機場 STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}沒有鐵路路點 +STR_ERROR_NO_ROAD_WAYPOINT :{WHITE}沒有道路號誌站 STR_ERROR_NO_BUOY :{WHITE}沒有浮標 # Timetable related errors @@ -5625,6 +5711,10 @@ STR_TOWN_NAME :{TOWN} STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} +STR_CURRENCY_SHORT_KILO :{NBSP}k +STR_CURRENCY_SHORT_MEGA :{NBSP}M +STR_CURRENCY_SHORT_GIGA :{NBSP}B +STR_CURRENCY_SHORT_TERA :{NBSP}T STR_JUST_CARGO :{CARGO_LONG} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} @@ -5642,6 +5732,7 @@ STR_JUST_DATE_ISO :{DATE_ISO} STR_JUST_STRING :{STRING} STR_JUST_STRING1 :{STRING} STR_JUST_STRING2 :{STRING} +STR_JUST_STRING4 :{STRING} STR_JUST_STRING_STRING :{STRING}{STRING} STR_JUST_RAW_STRING :{STRING} STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} From 333e8e590e3ab9ade4d0eb767449d3fd4bee7587 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 19 Jul 2024 19:00:21 +0100 Subject: [PATCH 28/41] Codefix: Don't assume 9 is the widest digit (#12870) Use `SetDParamMaxDigit()` instead of `SetDParam()` with a large number. --- src/framerate_gui.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp index 59325d3653..8292001594 100644 --- a/src/framerate_gui.cpp +++ b/src/framerate_gui.cpp @@ -545,18 +545,18 @@ struct FramerateWindow : Window { switch (widget) { case WID_FRW_RATE_GAMELOOP: SetDParam(0, STR_FRAMERATE_FPS_GOOD); - SetDParam(1, 999999); + SetDParamMaxDigits(1, 6); SetDParam(2, 2); size = GetStringBoundingBox(STR_FRAMERATE_RATE_GAMELOOP); break; case WID_FRW_RATE_DRAWING: SetDParam(0, STR_FRAMERATE_FPS_GOOD); - SetDParam(1, 999999); + SetDParamMaxDigits(1, 6); SetDParam(2, 2); size = GetStringBoundingBox(STR_FRAMERATE_RATE_BLITTER); break; case WID_FRW_RATE_FACTOR: - SetDParam(0, 999999); + SetDParamMaxDigits(0, 6); SetDParam(1, 2); size = GetStringBoundingBox(STR_FRAMERATE_SPEED_FACTOR); break; @@ -585,7 +585,7 @@ struct FramerateWindow : Window { case WID_FRW_TIMES_AVERAGE: case WID_FRW_ALLOCSIZE: { size = GetStringBoundingBox(STR_FRAMERATE_CURRENT + (widget - WID_FRW_TIMES_CURRENT)); - SetDParam(0, 999999); + SetDParamMaxDigits(0, 6); SetDParam(1, 2); Dimension item_size = GetStringBoundingBox(STR_FRAMERATE_MS_GOOD); size.width = std::max(size.width, item_size.width); From 31e2f5a8a071a26ea4f512e2202ddc53162e2b04 Mon Sep 17 00:00:00 2001 From: translators Date: Sun, 21 Jul 2024 04:42:17 +0000 Subject: [PATCH 29/41] Update: Translations from eints swedish: 3 changes by sereneavatar chinese (traditional): 22 changes by KogentaSan --- src/lang/swedish.txt | 4 +++- src/lang/traditional_chinese.txt | 24 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index ca1bb8e380..50de11c818 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1503,7 +1503,7 @@ STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :Kalender STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :Väggklocka STR_CONFIG_SETTING_MINUTES_PER_YEAR :Minuter per år: {STRING} -STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Välj antalet minuter som går i ett kalenderår. Standard är 12 minuter. Sätt till 0 för att stoppa kalendertiden från att ändras. Denna inställning påverkar inte spelets ekonomiska simulering, och är endast tillgänglig för tidhållning medelst väggklocka +STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :Välj antalet minuter som går i ett kalenderår. Standard är 12 minuter. Sätt till 0 för att stoppa kalendertiden från att ändras. Ökning av kalenderårets längd fördröjer introduceringen av fordon, byggnader, och annan infrastruktur. Detta påverkar inte fordonshastigheter eller spelets ekonomiska simulering, med undantag för inflationen. Denna inställning är endast tillgänglig för tidhållning medelst väggklocka STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special @@ -2887,6 +2887,8 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Bygg vä STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Bygg spårvägssektion med Autospårvägläget. Ctrl+Klick för att ta bort spårvägssektion. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Bygg vägfordonsdepå (för köp och service av fordon). Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Bygg spårvagnsdepå (för köp och service av fordon). Håll även in Shift för att endast visa uppskattad kostnad +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD_TO_WAYPOINT :{BLACK}Bygg riktmärke på väg. Ctrl+Klick för att välja ett annat riktmärke att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Bygg riktmärke på spårvagnsräls. Ctrl+Klick för att välja ett annat riktmärke att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Bygg busshållplats. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Bygg passagerarspårvagnsstation. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Bygg laststation. Ctrl+Klick för att välja en annan station att sammanlänka. Håll även in Shift för att endast visa uppskattad kostnad diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 0f42ef85c4..8fa977b219 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -796,6 +796,7 @@ STR_SMALLMAP_SHOW_HEIGHT :{BLACK}顯示 STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}地圖不顯示任何工業 STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}地圖顯示所有工業 STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}切換高度圖顯示 +STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRY_NAMES :{BLACK}切換工業名稱 STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}不要在地圖上顯示公司財產 STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}在地圖上顯示所有公司財產 STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}在地圖上不顯示任何貨物種類 @@ -2113,6 +2114,7 @@ STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}無法 # Video initalization errors STR_VIDEO_DRIVER_ERROR :{WHITE}圖像設定錯誤... STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}...找不到相容的顯示卡裝置,硬體加速已被停用 +STR_VIDEO_DRIVER_ERROR_HARDWARE_ACCELERATION_CRASH :{WHITE}……GPU驅動程式導致遊戲崩潰。硬體加速已停用 # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -2206,13 +2208,15 @@ STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}顯示 STR_LIVERY_SHIP_TOOLTIP :{BLACK}顯示船舶配色 STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}顯示飛機配色 STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}顯示列車群組的配色 -STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}顯示公路車輛群組的配色 +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}顯示車輛群組的配色 +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}顯示船舶群組的配色 STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}顯示飛機群組的配色 STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}選擇所選配色的主色調。如按住 Ctrl 鍵點選色調,則所有配色皆採用此顏色為主色調 STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}選擇所選配色的副色調。如按住 Ctrl 掣點選色調,則所有配色皆採用此顏色為副色調 STR_LIVERY_PANEL_TOOLTIP :{BLACK}選擇要修改的配色,按住 CTRL 可同時選擇多種配色,勾選方框可切換是否使用配色 STR_LIVERY_TRAIN_GROUP_EMPTY :未有設置任何列車群組 STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :未設立公路車輛群組 +STR_LIVERY_SHIP_GROUP_EMPTY :未設立船舶群組 STR_LIVERY_AIRCRAFT_GROUP_EMPTY :未設立飛機群組 ###length 23 @@ -2746,6 +2750,7 @@ STR_PICKER_MODE_SAVED_TOOLTIP :切換僅顯示 STR_PICKER_STATION_CLASS_TOOLTIP :選擇顯示的車站種類 STR_PICKER_WAYPOINT_CLASS_TOOLTIP :選擇顯示的號誌站種類 +STR_PICKER_OBJECT_CLASS_TOOLTIP :選擇顯示的物品種類 STR_PICKER_HOUSE_CLASS_TOOLTIP :選擇顯示的市鎮區域 STR_HOUSE_PICKER_CAPTION :房屋選擇 @@ -3220,11 +3225,13 @@ STR_MAPGEN_MAPSIZE :{BLACK}地圖 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}選擇地圖大小(單位為方格)。實際可供使用的方格數量會比所設定的值略低 STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}市鎮數量: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}選擇市鎮密度,或輸入自訂數字 STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}市鎮名稱: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}選擇市鎮命名風格 STR_MAPGEN_DATE :{BLACK}日期: STR_MAPGEN_DATE_TOOLTIP :{BLACK}選擇開始日期 STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工業數量: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}選擇工業密度,或輸入自訂數字 STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}將地圖上最高峰的最大高度增加1 STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}將地圖上最高峰的最大高度減少1 @@ -3275,6 +3282,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :加泰隆尼亞 # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}地圖邊緣: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}選擇遊戲版圖邊界款式 STR_MAPGEN_NORTHWEST :{BLACK}西北方 STR_MAPGEN_NORTHEAST :{BLACK}東北方 STR_MAPGEN_SOUTHEAST :{BLACK}東南方 @@ -3424,6 +3432,7 @@ STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}上一 STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}繼續處理上一個正常的子畫面,略過任何虛位/重新著色/文字字型相關的子畫面,並在到達第一個子畫面後,返回最後的子畫面繼續進行處理。 STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}顯示目前選取的 sprite。當 sprite 正在描繪時會忽略其定位 STR_SPRITE_ALIGNER_MOVE_TOOLTIP :{BLACK}移動 sprite 到指定的 X 及 Y 座標位移。Ctrl+點擊可以一次移動8個單元格。 +STR_SPRITE_ALIGNER_SPRITE :{STRING}:{NUM} ###length 2 STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}置中位移值 @@ -3671,7 +3680,12 @@ STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOI STR_STATION_LIST_NONE :{YELLOW}- 無 - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}選擇所有設施 STR_STATION_LIST_CARGO_FILTER_ALL_AND_NO_RATING :所有貨物種類和沒有評價 +STR_STATION_LIST_CARGO_FILTER_MULTIPLE :多種貨物類型 +STR_STATION_LIST_CARGO_FILTER_NO_CARGO_TYPES :無貨物種類 STR_STATION_LIST_CARGO_FILTER_ONLY_NO_RATING :無貨物評價 +STR_STATION_LIST_CARGO_FILTER_SELECT_ALL :選擇所有和無評價 +STR_STATION_LIST_CARGO_FILTER_NO_RATING :無貨物評價 +STR_STATION_LIST_CARGO_FILTER_EXPAND :顯示更多… # Station view window STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} @@ -4347,6 +4361,8 @@ STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}載重 STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR :{BLACK}今年盈利:{LTBLUE}{CURRENCY_LONG} (去年盈利:{CURRENCY_LONG}) STR_VEHICLE_INFO_PROFIT_THIS_YEAR_LAST_YEAR_MIN_PERFORMANCE :{BLACK}今年盈利:{LTBLUE}{CURRENCY_LONG} (去年盈利:{CURRENCY_LONG}) {BLACK}最差表現:{LTBLUE}{POWER_TO_WEIGHT} +STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD :{BLACK}本期盈利:{LTBLUE}{CURRENCY_LONG}(上期盈利:{CURRENCY_LONG}) +STR_VEHICLE_INFO_PROFIT_THIS_PERIOD_LAST_PERIOD_MIN_PERFORMANCE :{BLACK}本期盈利:{LTBLUE}{CURRENCY_LONG}(上期盈利:{CURRENCY_LONG}){BLACK}最小功率:{LTBLUE}{POWER_TO_WEIGHT} STR_VEHICLE_INFO_RELIABILITY_BREAKDOWNS :{BLACK}可靠度:{LTBLUE}{COMMA}% {BLACK}上次維護後的故障次數:{LTBLUE}{COMMA} STR_VEHICLE_INFO_BUILT_VALUE :{LTBLUE}{ENGINE} {BLACK}興建於:{LTBLUE}{NUM}{BLACK} 價值:{LTBLUE}{CURRENCY_LONG} @@ -4475,7 +4491,8 @@ STR_ORDER_DROP_HALT_DEPOT :停留 # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES -STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}選擇車廠操作 +STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}選擇車廠動作 +STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}選擇車廠動作 STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}選擇船塢動作 ###next-name-looks-similar @@ -4943,6 +4960,8 @@ STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}無法 STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}鄰接超過一個現有車站/載貨區 STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... 車站範圍太大 +STR_ERROR_STATION_DISALLOWED_NUMBER_TRACKS :{WHITE}……軌數不正確 +STR_ERROR_STATION_DISALLOWED_LENGTH :{WHITE}……月台長度不正確 STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}太多車站/載貨區 STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}太多火車站元件 STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}太多公車站 @@ -5233,6 +5252,7 @@ STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}無法 STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}車輛只能在車站停靠等候 STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}此車輛不會停靠此站 STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... 時刻表並不完整 +STR_ERROR_TIMETABLE_NOT_STARTED :… 時刻表尚未開始 # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... 已有太多標誌 From 4b6e3f86c27bedb1ed2a943c5939fa3d7e72bea6 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Jul 2024 08:18:09 +0100 Subject: [PATCH 30/41] Cleanup: Remove write-only flag_offset member from server list. (#12872) A remnant of language flags, removed from the server list long ago. --- src/network/network_gui.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 9525ececba..bc9f6b6862 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -195,7 +195,6 @@ protected: int lock_offset; ///< Left offset for lock icon. int blot_offset; ///< Left offset for green/yellow/red compatibility icon. - int flag_offset; ///< Left offset for language flag icon. /** * (Re)build the GUI network game list (a.k.a. this->servers) as some @@ -472,7 +471,6 @@ public: { this->lock_offset = ScaleGUITrad(5); this->blot_offset = this->lock_offset + ScaleGUITrad(3) + GetSpriteSize(SPR_LOCK).width; - this->flag_offset = this->blot_offset + ScaleGUITrad(2) + GetSpriteSize(SPR_BLOT).width; } void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override From d85f4b3ebf4c45ff67e23086676354b1372c4534 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Jul 2024 09:19:47 +0100 Subject: [PATCH 31/41] Change: [UI] Use interface scaled sizes for server list. Avoid hardcoded values and use WidgetDimensions to set icon positions. This fits better with non-power-of-2 interface scale. --- src/network/network_gui.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index bc9f6b6862..9a4f961465 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -100,8 +100,6 @@ public: this->Add(std::make_unique(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_YEARS, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP)); leaf = std::make_unique(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NG_INFO, STR_EMPTY, STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP); - leaf->SetMinimalSize(14 + GetSpriteSize(SPR_LOCK, nullptr, ZOOM_LVL_NORMAL).width - + GetSpriteSize(SPR_BLOT, nullptr, ZOOM_LVL_NORMAL).width, 12); leaf->SetFill(0, 1); this->Add(std::move(leaf)); } @@ -193,8 +191,8 @@ protected: QueryString filter_editbox; ///< Editbox for filter on servers. bool searched_internet = false; ///< Did we ever press "Search Internet" button? - int lock_offset; ///< Left offset for lock icon. - int blot_offset; ///< Left offset for green/yellow/red compatibility icon. + Dimension lock; /// Dimension of lock icon. + Dimension blot; /// Dimension of compatibility icon. /** * (Re)build the GUI network game list (a.k.a. this->servers) as some @@ -365,9 +363,8 @@ protected: /* offsets to vertically centre text and icons */ int text_y_offset = (this->resize.step_height - GetCharacterHeight(FS_NORMAL)) / 2 + 1; - int icon_y_offset = (this->resize.step_height - GetSpriteSize(SPR_BLOT).height) / 2; - int lock_y_offset = (this->resize.step_height - GetSpriteSize(SPR_LOCK).height) / 2; + info = info.Shrink(WidgetDimensions::scaled.framerect); name = name.Shrink(WidgetDimensions::scaled.framerect); DrawString(name.left, name.right, y + text_y_offset, cur_item->info.server_name, TC_BLACK); @@ -407,11 +404,18 @@ protected: DrawString(years.left, years.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT, TC_BLACK, SA_HOR_CENTER); } + /* Set top and bottom of info rect to current row. */ + info.top = y; + info.bottom = y + this->resize.step_height - 1; + + bool rtl = _current_text_dir == TD_RTL; + /* draw a lock if the server is password protected */ - if (cur_item->info.use_password) DrawSprite(SPR_LOCK, PAL_NONE, info.left + this->lock_offset, y + lock_y_offset); + if (cur_item->info.use_password) DrawSpriteIgnorePadding(SPR_LOCK, PAL_NONE, info.WithWidth(this->lock.width, rtl), SA_CENTER); /* draw red or green icon, depending on compatibility with server */ - DrawSprite(SPR_BLOT, (cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED)), info.left + this->blot_offset, y + icon_y_offset + 1); + PaletteID pal = cur_item->info.compatible ? PALETTE_TO_GREEN : (cur_item->info.version_compatible ? PALETTE_TO_YELLOW : PALETTE_TO_RED); + DrawSpriteIgnorePadding(SPR_BLOT, pal, info.WithWidth(this->blot.width, !rtl), SA_CENTER); } } @@ -469,8 +473,8 @@ public: void OnInit() override { - this->lock_offset = ScaleGUITrad(5); - this->blot_offset = this->lock_offset + ScaleGUITrad(3) + GetSpriteSize(SPR_LOCK).width; + this->lock = GetScaledSpriteSize(SPR_LOCK); + this->blot = GetScaledSpriteSize(SPR_BLOT); } void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override @@ -516,6 +520,11 @@ public: SetDParamMaxValue(0, 5); size = maxdim(size, GetStringBoundingBox(STR_JUST_INT)); break; + + case WID_NG_INFO: + size.width = this->lock.width + WidgetDimensions::scaled.hsep_normal + this->blot.width + padding.width; + size.height = std::max(this->lock.height, this->blot.height) + padding.height; + break; } } From ba2b14b0757ed10e8eb9d307d29d997d03f38386 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Jul 2024 09:22:02 +0100 Subject: [PATCH 32/41] Change: [UI] Use proper matrix padding for server list test. Text was only positioned correctly at 1x scale due to old pixel-based positioning method. --- src/network/network_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 9a4f961465..991af8450e 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -361,8 +361,8 @@ protected: GfxFillRect(r.Shrink(WidgetDimensions::scaled.bevel), PC_GREY); } - /* offsets to vertically centre text and icons */ - int text_y_offset = (this->resize.step_height - GetCharacterHeight(FS_NORMAL)) / 2 + 1; + /* Offset to vertically position text. */ + int text_y_offset = WidgetDimensions::scaled.matrix.top + (this->resize.step_height - WidgetDimensions::scaled.matrix.Vertical() - GetCharacterHeight(FS_NORMAL)) / 2; info = info.Shrink(WidgetDimensions::scaled.framerect); name = name.Shrink(WidgetDimensions::scaled.framerect); From 8b644f6ee608167c05a749dc22bd08faeafc26ea Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Jul 2024 13:40:54 +0100 Subject: [PATCH 33/41] Codechange: Use GetVisibleRangeIterators to draw script settings. (#12871) --- src/game/game_gui.cpp | 12 +++++------- src/script/script_gui.cpp | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/game/game_gui.cpp b/src/game/game_gui.cpp index 36c9d1b7c7..22461404b0 100644 --- a/src/game/game_gui.cpp +++ b/src/game/game_gui.cpp @@ -178,11 +178,6 @@ struct GSConfigWindow : public Window { break; } case WID_GSC_SETTINGS: { - ScriptConfig *config = this->gs_config; - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - int i = 0; - for (; !this->vscroll->IsVisible(i); i++) it++; - Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); bool rtl = _current_text_dir == TD_RTL; Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); @@ -191,9 +186,11 @@ struct GSConfigWindow : public Window { int y = r.top; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2; - for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) { + + const auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->visible_settings); + for (auto it = first; it != last; ++it) { const ScriptConfigItem &config_item = **it; - int current_value = config->GetSetting((config_item).name); + int current_value = this->gs_config->GetSetting(config_item.name); bool editable = this->IsEditableItem(config_item); StringID str; @@ -212,6 +209,7 @@ struct GSConfigWindow : public Window { DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); } else { + int i = static_cast(std::distance(std::begin(this->visible_settings), it)); if (config_item.complete_labels) { DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); } else { diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index bbe7ae34f3..7663d0aca1 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -356,11 +356,6 @@ struct ScriptSettingsWindow : public Window { { if (widget != WID_SCRS_BACKGROUND) return; - ScriptConfig *config = this->script_config; - VisibleSettingsList::const_iterator it = this->visible_settings.begin(); - int i = 0; - for (; !this->vscroll->IsVisible(i); i++) it++; - Rect ir = r.Shrink(WidgetDimensions::scaled.framerect); bool rtl = _current_text_dir == TD_RTL; Rect br = ir.WithWidth(SETTING_BUTTON_WIDTH, rtl); @@ -369,9 +364,11 @@ struct ScriptSettingsWindow : public Window { int y = r.top; int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2; int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2; - for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) { + + const auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->visible_settings); + for (auto it = first; it != last; ++it) { const ScriptConfigItem &config_item = **it; - int current_value = config->GetSetting((config_item).name); + int current_value = this->script_config->GetSetting(config_item.name); bool editable = this->IsEditableItem(config_item); StringID str; @@ -390,6 +387,7 @@ struct ScriptSettingsWindow : public Window { DrawBoolButton(br.left, y + button_y_offset, current_value != 0, editable); SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON); } else { + int i = static_cast(std::distance(std::begin(this->visible_settings), it)); if (config_item.complete_labels) { DrawDropDownButton(br.left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable); } else { From 4ee45db51b6ae7a03c3b9c06e9ca93ae6388bd3b Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 21 Jul 2024 14:01:29 +0100 Subject: [PATCH 34/41] Change: [UI] Use scaled sprite sizes and correct matrix padding for content list. (#12875) --- src/network/network_content_gui.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index d0f8afbde5..57abe51ca2 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -581,7 +581,7 @@ public: void OnInit() override { - this->checkbox_size = maxdim(maxdim(GetSpriteSize(SPR_BOX_EMPTY), GetSpriteSize(SPR_BOX_CHECKED)), GetSpriteSize(SPR_BLOT)); + this->checkbox_size = maxdim(maxdim(GetScaledSpriteSize(SPR_BOX_EMPTY), GetScaledSpriteSize(SPR_BOX_CHECKED)), GetScaledSpriteSize(SPR_BLOT)); } void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override @@ -644,15 +644,15 @@ public: */ void DrawMatrix(const Rect &r) const { - Rect checkbox = this->GetWidget(WID_NCL_CHECKBOX)->GetCurrentRect(); - Rect name = this->GetWidget(WID_NCL_NAME)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); - Rect type = this->GetWidget(WID_NCL_TYPE)->GetCurrentRect(); + const Rect checkbox = this->GetWidget(WID_NCL_CHECKBOX)->GetCurrentRect(); + const Rect name = this->GetWidget(WID_NCL_NAME)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); + const Rect type = this->GetWidget(WID_NCL_TYPE)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect); /* Fill the matrix with the information */ - int sprite_y_offset = (this->resize.step_height - this->checkbox_size.height) / 2; - int text_y_offset = (this->resize.step_height - GetCharacterHeight(FS_NORMAL)) / 2; + const uint step_height = this->GetWidget(WID_NCL_MATRIX)->resize_y; + const int text_y_offset = WidgetDimensions::scaled.matrix.top + (step_height - WidgetDimensions::scaled.matrix.Vertical() - GetCharacterHeight(FS_NORMAL)) / 2; - Rect mr = r.WithHeight(this->resize.step_height); + Rect mr = r.WithHeight(step_height); auto [first, last] = this->vscroll->GetVisibleRangeIterators(this->content); for (auto iter = first; iter != last; iter++) { const ContentInfo *ci = *iter; @@ -669,13 +669,13 @@ public: case ContentInfo::DOES_NOT_EXIST: sprite = SPR_BLOT; pal = PALETTE_TO_RED; break; default: NOT_REACHED(); } - DrawSprite(sprite, pal, checkbox.left + (sprite == SPR_BLOT ? 3 : 2), mr.top + sprite_y_offset + (sprite == SPR_BLOT ? 0 : 1)); + DrawSpriteIgnorePadding(sprite, pal, {checkbox.left, mr.top, checkbox.right, mr.bottom}, SA_CENTER); StringID str = STR_CONTENT_TYPE_BASE_GRAPHICS + ci->type - CONTENT_TYPE_BASE_GRAPHICS; DrawString(type.left, type.right, mr.top + text_y_offset, str, TC_BLACK, SA_HOR_CENTER); DrawString(name.left, name.right, mr.top + text_y_offset, ci->name, TC_BLACK); - mr = mr.Translate(0, this->resize.step_height); + mr = mr.Translate(0, step_height); } } @@ -1054,13 +1054,13 @@ static constexpr NWidgetPart _nested_network_content_list_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(NWID_VERTICAL), NWidget(NWID_HORIZONTAL), - NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_CHECKBOX), SetMinimalSize(13, 1), SetDataTip(STR_EMPTY, STR_NULL), + NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_CHECKBOX), SetDataTip(STR_EMPTY, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_TYPE), SetDataTip(STR_CONTENT_TYPE_CAPTION, STR_CONTENT_TYPE_CAPTION_TOOLTIP), NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, WID_NCL_NAME), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_CONTENT_NAME_CAPTION, STR_CONTENT_NAME_CAPTION_TOOLTIP), EndContainer(), - NWidget(WWT_MATRIX, COLOUR_LIGHT_BLUE, WID_NCL_MATRIX), SetResize(1, 14), SetFill(1, 1), SetScrollbar(WID_NCL_SCROLLBAR), SetMatrixDataTip(1, 0, STR_CONTENT_MATRIX_TOOLTIP), + NWidget(WWT_MATRIX, COLOUR_LIGHT_BLUE, WID_NCL_MATRIX), SetResize(1, 1), SetFill(1, 1), SetScrollbar(WID_NCL_SCROLLBAR), SetMatrixDataTip(1, 0, STR_CONTENT_MATRIX_TOOLTIP), EndContainer(), NWidget(NWID_VSCROLLBAR, COLOUR_LIGHT_BLUE, WID_NCL_SCROLLBAR), EndContainer(), From da00a62d5981cd81852a9a49f7f0826764725c70 Mon Sep 17 00:00:00 2001 From: Ivan Pravdin <72220773+ivpravdin@users.noreply.github.com> Date: Sun, 21 Jul 2024 13:59:48 -0700 Subject: [PATCH 35/41] Fix #12856, e17c82e: Updating network settings does not invalidate data (#12858) --- src/network/network_client.cpp | 3 ++- src/settings_table.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 001e757193..8b03dc7fde 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -1188,7 +1188,8 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CONFIG_UPDATE(P _network_server_max_companies = p.Recv_uint8(); _network_server_name = p.Recv_string(NETWORK_NAME_LENGTH); - SetWindowClassesDirty(WC_CLIENT_LIST); + + InvalidateWindowData(WC_CLIENT_LIST, 0); Debug(net, 9, "Client::Receive_SERVER_CONFIG_UPDATE(): max_companies={}", _network_server_max_companies); diff --git a/src/settings_table.cpp b/src/settings_table.cpp index 0fd874a38c..9e06fe4e12 100644 --- a/src/settings_table.cpp +++ b/src/settings_table.cpp @@ -572,9 +572,10 @@ static void UpdateClientConfigValues() { NetworkServerUpdateGameInfo(); + InvalidateWindowData(WC_CLIENT_LIST, 0); + if (_network_server) { NetworkServerSendConfigUpdate(); - SetWindowClassesDirty(WC_CLIENT_LIST); } } From b2faa14ab5449a60f890e621ec335db402a39a73 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 22 Jul 2024 04:43:29 +0000 Subject: [PATCH 36/41] Update: Translations from eints chinese (traditional): 57 changes by KogentaSan galician: 1 change by pvillaverde latvian: 17 changes by osprinkis lithuanian: 8 changes by Br0l15 --- src/lang/galician.txt | 1 + src/lang/latvian.txt | 34 ++++++++-------- src/lang/lithuanian.txt | 9 ++++- src/lang/traditional_chinese.txt | 69 ++++++++++++++++++++++++++------ 4 files changed, 83 insertions(+), 30 deletions(-) diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 4043ad6789..0ac5dec798 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -2589,6 +2589,7 @@ STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :revisión erró STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :o nome xa está en uso STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :contrasinal incorrecto STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :non na lista permitida +STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :ningún dos métodos de autenticación solicitados está disponible STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :compañía errónea nun DoCommand STR_NETWORK_ERROR_CLIENT_KICKED :chimpado polo servidor STR_NETWORK_ERROR_CLIENT_CHEATER :intentaba usar unha trampa diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 44cb8d8b60..86e55c6c90 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -192,12 +192,12 @@ STR_COLOUR_WHITE :Balta STR_COLOUR_RANDOM :Nejaušs ###length 17 -STR_COLOUR_SECONDARY_DARK_BLUE :Tumši Zila +STR_COLOUR_SECONDARY_DARK_BLUE :Tumši zila STR_COLOUR_SECONDARY_PALE_GREEN :Gaiši Zaļa STR_COLOUR_SECONDARY_SECONDARY_PINK :Rozā STR_COLOUR_SECONDARY_YELLOW :Dzeltena STR_COLOUR_SECONDARY_RED :Sarkana -STR_COLOUR_SECONDARY_LIGHT_BLUE :Gaiši Zila +STR_COLOUR_SECONDARY_LIGHT_BLUE :Gaiši zila STR_COLOUR_SECONDARY_GREEN :Zaļa STR_COLOUR_SECONDARY_DARK_GREEN :Tumši zaļa STR_COLOUR_SECONDARY_BLUE :Zila @@ -1205,7 +1205,7 @@ STR_TERRAIN_TYPE_CUSTOM_VALUE :Pielāgots augs STR_CITY_APPROVAL_LENIENT :Mīksts STR_CITY_APPROVAL_TOLERANT :iecietīga STR_CITY_APPROVAL_HOSTILE :naidīga -STR_CITY_APPROVAL_PERMISSIVE :Pieļaujoša (nav efekta kompānijas darbībām) +STR_CITY_APPROVAL_PERMISSIVE :Pieļaujoša (neietekmē uzņēmuma darbības) STR_WARNING_NO_SUITABLE_AI :{WHITE}Nav pieejami derīgi MI...{}Jūs varat lejuplādēt dažādus MI, izmantojot sistēmu 'Tiešsaistes saturs' @@ -1450,7 +1450,7 @@ STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Iestatīt lidma STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} STR_CONFIG_SETTING_PLANE_CRASHES :Lidmašīnu avāriju daudzums: {STRING} -STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Iestatīt nejaušu lidaparātu avāriju iespējamību.{}* Lielām lidmašīnām vienmēr ir risks avarēt, kad piezemējas mazās lidostās +STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Iestatīt nejaušu lidaparātu avāriju iespējamību.{}* Lielām lidmašīnām vienmēr ir risks avarēt, kad tās nolaižas mazās lidostās ###length 3 STR_CONFIG_SETTING_PLANE_CRASHES_NONE :Nav* STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :samazināts @@ -2242,7 +2242,7 @@ STR_HELP_WINDOW_BUGTRACKER :{BLACK}Ziņot p STR_HELP_WINDOW_COMMUNITY :{BLACK}Kopiena # Cheat window -STR_CHEATS :{WHITE}Smilškastes Opcijas +STR_CHEATS :{WHITE}Smilškastes opcijas STR_CHEAT_MONEY :{LTBLUE}Palielināt naudas līdzekļus par {CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Spēlēt kā uzņēmumam: {ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Burvju buldozers (nojauc ražotnes, nepārvietojamus objektus): {ORANGE}{STRING} @@ -2808,7 +2808,7 @@ STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Izvēlē STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Platformas garums STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}Izvēlēties dzelzceļa stacijas garumu STR_STATION_BUILD_DRAG_DROP :{BLACK}Vilkt un nomest -STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Būvēt staciju izmantojot "vilkt un nomest" +STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Būvēt staciju, izmantojot "vilkt un nomest" STR_PICKER_MODE_ALL :Visi STR_PICKER_MODE_ALL_TOOLTIP :Pārslēgt visu klašu vienumu rādīšanu @@ -3512,7 +3512,7 @@ STR_SPRITE_ALIGNER_CAPTION_ACTION5 :{WHITE}Gariņu STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Nākamais gariņš STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Pāriet uz nākamo parasto gariņu, izlaižot visus pseido/pārkrāsotos/fonta gariņus STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Iet pie gariņa -STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Iet pie dotā gariņa. Ja tas nav parastais gariņš, tad pāriet pie nākamā +STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Iet pie esošā gariņa. Ja tas nav parastais gariņš, tad pāriet pie nākamā, parastā STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Iepriekšējais gariņš STR_SPRITE_ALIGNER_PREVIOUS_TOOLTIP :{BLACK}Iet pie iepriekšējā parastā gariņa, izlaižot visus pseido/pārkrāsotos/fonta gariņus STR_SPRITE_ALIGNER_SPRITE_TOOLTIP :{BLACK}Atlasītā gariņa attēlojums. To attēlojot, izkārtojums netiek ievērots @@ -3521,7 +3521,7 @@ STR_SPRITE_ALIGNER_SPRITE :{STRING}:{NUM} ###length 2 STR_SPRITE_ALIGNER_CENTRE_OFFSET :{BLACK}Nobīde centrēta -STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Spraits centrēts +STR_SPRITE_ALIGNER_CENTRE_SPRITE :{BLACK}Gariņš ir centrēts STR_SPRITE_ALIGNER_CROSSHAIR :{BLACK}Krustpunkts @@ -3759,7 +3759,7 @@ STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Globāl STR_STORY_BOOK_SPECTATOR :Globālā stāstu grāmata STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :{NUM} lapa -STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Pārlēkt uz konkrētu lapu spiežot to zemāk esošajā sarakstā +STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Pārlēkt uz konkrētu lapu, atlasot to zemāk esošajā sarakstā STR_STORY_BOOK_PREV_PAGE :{BLACK}Iepriekšējā STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Doties uz iepriekšējo lapu STR_STORY_BOOK_NEXT_PAGE :{BLACK}Nākamā @@ -4338,7 +4338,7 @@ STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Parslēg STR_REPLACE_ENGINES :Lokomotīves STR_REPLACE_WAGONS :Vagoni STR_REPLACE_ALL_RAILTYPE :Visi dzelzceļa transporta līdzekļi -STR_REPLACE_ALL_ROADTYPE :Visi ceļu transportlīdzekļi +STR_REPLACE_ALL_ROADTYPE :Visi ceļa transportlīdzekļi ###length 2 STR_REPLACE_HELP_RAILTYPE :{BLACK}Izvēlēties sliežu veidu, kuram vēlaties nomainīt lokomotīves @@ -4757,13 +4757,13 @@ STR_TIMETABLE_START_TOOLTIP :{BLACK}Atlasiet STR_TIMETABLE_START_SECONDS_QUERY :Sekundes līdz grafika sākumam STR_TIMETABLE_CHANGE_TIME :{BLACK}Mainīt laiku -STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainiet laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+klikšķis iestata laiku visiem pasūtījumiem +STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Mainīt laiku, kas nepieciešams iezīmētajam pasūtījumam. Ctrl+klikšķis iestata laiku visiem pasūtījumiem STR_TIMETABLE_CLEAR_TIME :{BLACK}Notīrīt laiku STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma laiku. Ctrl+klikšķis notīra laiku visiem pasūtījumiem STR_TIMETABLE_CHANGE_SPEED :{BLACK}Mainīt ātruma ierobežojumu -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainiet izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis iestata ātrumu visiem pasūtījumiem +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Mainīt izceltā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis iestata ātrumu visiem pasūtījumiem STR_TIMETABLE_CLEAR_SPEED :{BLACK}Nodzēst ātruma ierobežojumu STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Dzēst iezīmētā pasūtījuma maksimālo braukšanas ātrumu. Ctrl+klikšķis notīra ātrumu visiem pasūtījumiem @@ -4819,7 +4819,7 @@ STR_ERROR_AI_DEBUG_SERVER_ONLY :{YELLOW}MI/spē # AI configuration window STR_AI_CONFIG_CAPTION_AI :{WHITE}MI iestatījumi -STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Spēles Skripta Iestatījumi +STR_AI_CONFIG_CAPTION_GAMESCRIPT :{WHITE}Spēles skripta Iestatījumi STR_AI_CONFIG_GAMELIST_TOOLTIP :{BLACK}Spēles skripts, kas tiks ielādēts nākamajā spēlē STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}MI, kas tiks ielādēts nākamajā spēlē STR_AI_CONFIG_HUMAN_PLAYER :Spēlētājs (cilvēks) @@ -4839,7 +4839,7 @@ STR_AI_CONFIG_GAMESCRIPT_PARAM :{SILVER}Paramet STR_AI_CONFIG_AI :{SILVER}MI STR_AI_CONFIG_CHANGE_AI :{BLACK}Izvēlēties MI -STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Izvētaties spēles skriptu +STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}AtlasĪt spēles skriptu STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Ielādēt citu skriptu. Ctrl+klikšķis, lai parādītu visas pieejamās versijas STR_AI_CONFIG_CONFIGURE :{BLACK}Konfigurēt STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Konfigurēt skripta parametrus @@ -4860,7 +4860,7 @@ STR_AI_LIST_CANCEL :{BLACK}Atcelt STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}Nemainīt skriptu STR_SCREENSHOT_CAPTION :{WHITE}Uzņemt ekrānuzņēmumu -STR_SCREENSHOT_SCREENSHOT :{BLACK}Normāls ekrānuzņēmums +STR_SCREENSHOT_SCREENSHOT :{BLACK}Parasts ekrānuzņēmums STR_SCREENSHOT_ZOOMIN_SCREENSHOT :{BLACK}Pilnībā pietuvināts ekrānuzņēmums STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}Noklusējuma tuvinājuma ekrānuzņēmums STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}Visas kartes ekrānuzņēmums @@ -4884,8 +4884,8 @@ STR_TEXTFILE_NAVBACK_TOOLTIP :{BLACK}Atgriezt STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Atgriezties uz priekšu navigācijas vēsturē STR_TEXTFILE_WRAP_TEXT :{WHITE}Aplauzt tekstu STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Aplauzt tekstu logā, lai tas viss iekļautos un nevajadzētu ritināt -STR_TEXTFILE_VIEW_README :{BLACK}Lasi_Mani -STR_TEXTFILE_VIEW_README_TOOLTIP :Skatīt šī satura readme +STR_TEXTFILE_VIEW_README :{BLACK}Lasi_mani +STR_TEXTFILE_VIEW_README_TOOLTIP :Skatīt šī satura failu Lasi_mani STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Izmaiņu žurnāls STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Skatīt šī satura izmaiņu žurnālu STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licence diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 7e131d87fb..e577c6b1c5 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -2425,6 +2425,7 @@ STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Pasirink STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Pasirinkite antrinę spalvą pasirinktai schemai. Spustelėjus laikant nuspaustą Ctrl klavišą, pasirinkta spava bus nustatyta visoms schemoms STR_LIVERY_PANEL_TOOLTIP :{BLACK}Pasirinkite objektą, kurio spalvas norite pakeisti. Spragsint laikant nuspaustą Ctrl klavišą, galėsite pasirinkti iškart kelis objektus. STR_LIVERY_TRAIN_GROUP_EMPTY :Nėra nustatytų traukinių grupių +STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :Nėra sukurtų automobilių grupių STR_LIVERY_SHIP_GROUP_EMPTY :Nėra nustatytų laivų grupių STR_LIVERY_AIRCRAFT_GROUP_EMPTY :Lėktuvų grupės nesudarytos @@ -2922,7 +2923,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Statyti STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Paversti bėgius į kontrolės punktą. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus galima naująjį kontrolės punktą sujungti su jau egzistuojančiu. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Statyti traukinių stotelę. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus galima naująją stotelę sujungti su jau egzistuojančia. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Statyti geležinkelio signalus. Spragtelėjus laikant nuspaustą Ctrl klavišą, bus statomi semaforai.{}Velkant signalai bus statomi vienodais atstumais išilgai tiesios bėgių linijos. Velkant ir laikant nuspaustą Ctrl klavišą, signalai bus automatiškai pastatyti iki artimiausios sankryžos. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos. Šį mygtuką spragtelėjus laikant nuspaustą Ctrl klavišą, nebus atvertas signalų pasirinkimo langas (jeigu toks yra aktyvintas nuostatose) -STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Statyti geležinkelio tiltą. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos +STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Statyti geležinkelio tiltą. Spragtelėkite laikydami Shift klavišą, kad būtų parodomos apytikslės išlaidos STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Statyti geležinkelio tunelį. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Aktyvinti bėgių, signalų, kontrolės punktų ir stotelių šalinimo veikseną. Spragtelėjus stotelę laikant nuspaustą Ctrl klavišą, bus pašalinti ir bėgiai, ne tik stotelės elementas STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Pakeisti geležinkelio bėgių tipą. Spragtelėjus laikant nuspaustą Shift klavišą, bus parodytos numatomos išlaidos @@ -5186,6 +5187,7 @@ STR_ERROR_CAN_T_BUILD_AIRPORT_HERE :{WHITE}Negalima STR_ERROR_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Ribojasi su daugiau nei viena stotele/pakrovimo aikštele STR_ERROR_STATION_TOO_SPREAD_OUT :{WHITE}... stotelė per daug išsiplėtusi +STR_ERROR_STATION_DISALLOWED_NUMBER_TRACKS :{WHITE}... toks kiekis bėgių nėra palaikomas STR_ERROR_TOO_MANY_STATIONS_LOADING :{WHITE}Per daug stotelių STR_ERROR_TOO_MANY_STATION_SPECS :{WHITE}Perdaug traukinių stoties dalių STR_ERROR_TOO_MANY_BUS_STOPS :{WHITE}Per daug autobusų stotelių @@ -5462,6 +5464,9 @@ STR_ERROR_NO_DOCK :{WHITE}Nėra do STR_ERROR_NO_AIRPORT :{WHITE}Nėra jokio oro ar sraigtasparnio uosto STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}Nėra jokių stabdymų su palaikomu keliu (tipu) STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Nėra jokių stabdymų su palaikomu tramvajaus tipu +STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Šis lėktuvas negali nusileisti šiame sraigtasparnių oro uoste +STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Šis sraigtasparnis negali nusileisti šiame oro uoste +STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Nėra geležinkelio tarpinio taško STR_ERROR_NO_BUOY :{WHITE}Nėra plūduro # Timetable related errors @@ -6215,7 +6220,9 @@ STR_VEHICLE_NAME :{VEHICLE} STR_WAYPOINT_NAME :{WAYPOINT} STR_CURRENCY_SHORT_KILO :{NBSP}tūkst. +STR_CURRENCY_SHORT_MEGA :{NBSP}M STR_CURRENCY_SHORT_GIGA :{NBSP}mlrd. +STR_CURRENCY_SHORT_TERA :{NBSP}tr STR_JUST_CARGO :{CARGO_LONG} STR_JUST_RIGHT_ARROW :{RIGHT_ARROW} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 8fa977b219..ff5a66013e 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -330,7 +330,9 @@ STR_SORT_BY_TYPE :種類 STR_SORT_BY_TRANSPORTED :已運送 STR_SORT_BY_NUMBER :編號 STR_SORT_BY_PROFIT_LAST_YEAR :去年盈利 +STR_SORT_BY_PROFIT_LAST_PERIOD :上期盈利 STR_SORT_BY_PROFIT_THIS_YEAR :今年盈利 +STR_SORT_BY_PROFIT_THIS_PERIOD :本期盈利 STR_SORT_BY_AGE :年齡 STR_SORT_BY_RELIABILITY :可靠性 STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :總容量,依貨物種類排序 @@ -445,6 +447,7 @@ STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :設定 STR_SETTINGS_MENU_AI_SETTINGS :AI 設定 STR_SETTINGS_MENU_GAMESCRIPT_SETTINGS :遊戲腳本設定 STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF 設定 +STR_SETTINGS_MENU_SANDBOX_OPTIONS :沙盒選項 STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :透明度選項 STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :顯示市鎮名稱 STR_SETTINGS_MENU_STATION_NAMES_DISPLAYED :顯示車站/機場/碼頭名稱 @@ -661,6 +664,8 @@ STR_PERFORMANCE_DETAIL_LOAN :{BLACK}貸款 STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}總計: ###next-name-looks-similar +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS :{BLACK}去年盈利的車輛數量。包括公路車輛、列車、船舶和飛機 +STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS :{BLACK}上期盈利的車輛數量。包括公路車輛、列車、船舶和飛機 STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP :{BLACK}最後提供服務的車站各部份數量。 每部份車站 (火車站、公車站、機場) 都算在内,就算連在一起亦然 STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS :{BLACK}收入最低的車輛的盈利(僅計算超過兩年的車輛) STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS :{BLACK}收入最低的車輛的盈利(僅計算超過兩週期的車輛) @@ -718,6 +723,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}點擊 STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}點選音樂從目前清單中移除 (僅限「自訂一」或「自訂二」 # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}頂尖公司 STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :商人 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :企業家 @@ -909,6 +915,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}{STRING} STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}打開該運輸工具的群組 +STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST :{WHITE}{STATION}不再接受:{CARGO_LIST} STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}補助過期:{}{}將 {STRING} 從 {STRING} 運到 {STRING} 現在起不再提供補助 STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}補助結束:{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務不再提供補助 @@ -1045,7 +1052,11 @@ STR_GAME_OPTIONS_GUI_SCALE_MARK :{DECIMAL}x STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}自動問卷 STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}參與自動問卷 +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_TOOLTIP :{BLACK}在啟用後,OpenTTD 將在離開遊戲時傳送調查資訊 STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK :{BLACK}關於問卷和隱私 +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_LINK_TOOLTIP :{BLACK}這將會開啟瀏覽器給提供更多自動調查的資訊 +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW :{BLACK}預覽調查結果 +STR_GAME_OPTIONS_PARTICIPATE_SURVEY_PREVIEW_TOOLTIP :{BLACK}顯示目前運行的遊戲調查結果 STR_GAME_OPTIONS_GRAPHICS :{BLACK}圖形 @@ -1071,6 +1082,7 @@ STR_GAME_OPTIONS_ONLINE_CONTENT_TOOLTIP :檢查及下載 STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(沒有安裝社交平台擴充功能) +STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING}) STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}月台︰ STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}擴充功能狀態︰ @@ -1249,6 +1261,7 @@ STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :靠右 STR_CONFIG_SETTING_SECONDS_VALUE :{COMMA}{NBSP}秒 STR_CONFIG_SETTING_INFINITE_MONEY :無限資金: {STRING} +STR_CONFIG_SETTING_INFINITE_MONEY_HELPTEXT :允許無限支出和防止公司倒閉 STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN :最大貸款額:{STRING} STR_CONFIG_SETTING_MAXIMUM_INITIAL_LOAN_HELPTEXT :公司最多可借多少錢(此設定的值排除了通貨膨脹因素)。 @@ -1467,6 +1480,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :如啟用此選 STR_CONFIG_SETTING_TIMEKEEPING_UNITS :時間模式︰{STRING} ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :日曆 +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :掛鐘 STR_CONFIG_SETTING_MINUTES_PER_YEAR :每年分鐘數︰{STRING} STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT :選擇在掛鐘模式下每年所需的時間長度。預設為 12 分鐘;設定為 0 則停止日期變更。增加每年的時長會延遲新車輛、房屋和其他基礎設施的研發時間。此設定不會影響車輛速度或經濟模擬,但通貨膨脹除外。此設定僅在使用掛鐘模式時可用 @@ -1475,6 +1489,10 @@ STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE :{NUM} ###setting-zero-is-special STR_CONFIG_SETTING_MINUTES_PER_YEAR_FROZEN :0(日期停止) +STR_CONFIG_SETTING_TOWN_CARGO_SCALE :市鎮貨物產量規模︰{STRING} +STR_CONFIG_SETTING_TOWN_CARGO_SCALE_HELPTEXT :按此比例增加市鎮貨物產量規模 +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE :工業貨物產量規模︰{STRING} +STR_CONFIG_SETTING_INDUSTRY_CARGO_SCALE_HELPTEXT :按此比例增加工業貨物產量規模 STR_CONFIG_SETTING_CARGO_SCALE_VALUE :{NUM}% STR_CONFIG_SETTING_AUTORENEW_VEHICLE :車輛達到使用年限時自動更新:{STRING} @@ -1991,6 +2009,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :初始城市規 STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :設定遊戲開始時城市的大小 (相對於一般市鎮而言)。 STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :每{STRING}更新貨物分配圖 +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :在貨物分配的重新計算上的費用 {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX :乘客分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :設使有交通路線連接甲、乙兩站。「對稱」指甲站往乙站的乘客數量與乙站往甲站的乘客數量大致相同。「不對稱」指任何一站往另一站的乘客數量皆由系統隨意決定。「手動」指系統不會自動分配乘客的目的地。 @@ -2323,7 +2342,9 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}地圖 STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}遊戲的地圖大小{}點選可以依大小排序 STR_NETWORK_SERVER_LIST_DATE_CAPTION :{BLACK}日期 STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP :{BLACK}目前日期 +STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT :{BLACK}{NUM}{NBSP}小時{NBSP}{NUM}{NBSP}分鐘 STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION :{BLACK}遊戲經過時間 +STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP :{BLACK}已進行遊戲的時間,不計算暫停的時間 STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}語言、伺服器版本等 STR_NETWORK_SERVER_LIST_CLICK_GAME_TO_SELECT :{BLACK}點選清單内的遊戲即可選擇 @@ -2430,6 +2451,7 @@ STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :你的玩家名 STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP :{BLACK}要在此用戶端執行的管理命令 STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP :{BLACK}要在此公司執行的管理命令 STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}加入此公司 +STR_NETWORK_CLIENT_LIST_COMPANY_AUTHORIZE_TOOLTIP :{BLACK}授權此客戶端加入您的公司 STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}傳送訊息給此玩家 STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}傳送訊息給公司中的所有玩家 STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}傳送訊息給所有旁觀者 @@ -2502,6 +2524,7 @@ STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}玩家 STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}伺服器名稱尚未設定。名稱可以在多人遊戲視窗的上方設定。 STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}用戶端的版本與伺服器不符 STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}密碼錯誤 +STR_NETWORK_ERROR_NOT_ON_ALLOW_LIST :{WHITE}你不在允許名單內 STR_NETWORK_ERROR_SERVER_FULL :{WHITE}伺服器已滿 STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}您被伺服器封鎖了 STR_NETWORK_ERROR_KICKED :{WHITE}您被踢出遊戲 @@ -2529,6 +2552,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :收到無效或 STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :版本錯誤 STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :已有人使用相同名稱 STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :密碼錯誤 +STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :已請求的驗證方式均不可用 STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :DoCommand 內含錯誤的 company-id STR_NETWORK_ERROR_CLIENT_KICKED :被伺服器踢除 STR_NETWORK_ERROR_CLIENT_CHEATER :想試著作弊 @@ -2690,6 +2714,8 @@ STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}不顯 STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}顯示設置地點的運輸涵蓋範圍 STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}接受:{GOLD}{CARGO_LIST} STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}供應:{GOLD}{CARGO_LIST} +STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR :{BLACK}維護成本:{GOLD}{CURRENCY_SHORT}/年 +STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD :{BLACK}維護成本:{GOLD}{CURRENCY_SHORT}/週期 # Join station window STR_JOIN_STATION_CAPTION :{WHITE}合併車站 @@ -2750,6 +2776,7 @@ STR_PICKER_MODE_SAVED_TOOLTIP :切換僅顯示 STR_PICKER_STATION_CLASS_TOOLTIP :選擇顯示的車站種類 STR_PICKER_WAYPOINT_CLASS_TOOLTIP :選擇顯示的號誌站種類 +STR_PICKER_ROADSTOP_TRUCK_CLASS_TOOLTIP :選擇顯示的貨車場種類 STR_PICKER_OBJECT_CLASS_TOOLTIP :選擇顯示的物品種類 STR_PICKER_HOUSE_CLASS_TOOLTIP :選擇顯示的市鎮區域 @@ -2826,7 +2853,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}挖掘 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}切換鋪設/移除公路 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}切換鋪設電車軌 STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD :{BLACK}轉換或升級路面類型。按 Shift 鍵可切換鋪設和顯示預估成本。 -STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}轉換/升級電車軌道類型。按 Shift 鍵可切換建築/顯示預估成本。 +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM :{BLACK}轉換或升級電車軌道類型。按住 鍵點選可顯示預估成本。 STR_ROAD_NAME_ROAD :路面 STR_ROAD_NAME_TRAM :電車軌 @@ -3295,6 +3322,7 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}手動 STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度圖旋轉: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度圖名稱: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}高度圖圖像檔案名稱 STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}大小: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} @@ -3553,6 +3581,7 @@ STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN} STR_TOWN_VIEW_CITY_CAPTION :{WHITE}{TOWN} (城市) STR_TOWN_VIEW_POPULATION_HOUSES :{BLACK}人口:{ORANGE}{COMMA}{BLACK} 房屋:{ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_LAST_MONTH_MAX :{BLACK}{CARGO_LIST} 上月:{ORANGE}{COMMA}{BLACK} 最多:{ORANGE}{COMMA} +STR_TOWN_VIEW_CARGO_LAST_MINUTE_MAX :{BLACK}上分鐘出產的{WHITE}{CARGO_LIST}{BLACK}︰{ORANGE}{COMMA}{NBSP}{BLACK}最大產量︰{ORANGE}{COMMA} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH :{BLACK}市鎮成長所需貨物: STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_GENERAL :{RED}需要 {ORANGE}{STRING} STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING}{BLACK} 必須是冬天 @@ -3600,6 +3629,7 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :向地方政府 STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}開始進行小型地方廣告活動,為您的運輸服務吸引更多乘客與貨物。{}使城鎮小範圍內的車站獲得暫時的評分增益。{} {POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}開始進行中型地方廣告活動,為您的運輸服務吸引更多乘客與貨物。{}使城鎮中等範圍內的車站獲得暫時的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}開始進行大型地方廣告活動,為您的運輸服務吸引更多乘客與貨物。{}使城鎮較大範圍內的車站獲得暫時的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}贊助市鎮道路網絡重建。{}這將會使到市鎮的交通阻塞 6 分鐘。{}{POP_COLOUR}費用︰{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}建造雕像紀念您的公司。{}使城鎮範圍內的車站獲得永久的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}出資協助市鎮建造新的商業建築。{}使城鎮獲得暫時性的成長速度增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}冒著被抓到嚴懲的風險,向地方政府行賄以提高評價{}{POP_COLOUR}費用:{CURRENCY_LONG} @@ -4312,6 +4342,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}目前 # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}正在裝卸貨物 STR_VEHICLE_STATUS_LEAVING :{LTBLUE}正在離開 +STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}等候調節班次開車時間 STR_VEHICLE_STATUS_CRASHED :{RED}已撞毀! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}故障 STR_VEHICLE_STATUS_STOPPED :{RED}停止 @@ -4320,16 +4351,17 @@ STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}沒有電 STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}正在等候路徑開放 STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}與下個目的地相距太遠 -STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}正前往 {STATION},{VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:STATION} STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}沒有指令,{VELOCITY} -STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}正前往 {WAYPOINT},{VELOCITY} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正前往 {DEPOT},{VELOCITY} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}正在維護於 {DEPOT},{VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:WAYPOINT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - 正前往 {0:DEPOT} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:DEPOT} 以進行維護 +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_UNBUNCH_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:DEPOT} 以維護和調節班次 -STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}無法前往{STATION}, {VELOCITY} -STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}無法前往{WAYPOINT}, {VELOCITY} -STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{LTBLUE}無法前往{DEPOT}, {VELOCITY} -STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}無法前往{DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}{1:VELOCITY} - 無法前往 {0:STATION} +STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - 無法前往 {0:WAYPOINT} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}{1:VELOCITY} - 無法前往 {0:DEPOT} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - 無法前往 {0:DEPOT} # Vehicle stopped/started animations ###length 2 @@ -4378,9 +4410,12 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_MINUTES :{BLACK}維護 STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}維護間隔:{LTBLUE}{COMMA}%{BLACK} {STRING} STR_VEHICLE_DETAILS_LAST_SERVICE_DATE :上次維護︰{LTBLUE}{DATE_LONG} STR_VEHICLE_DETAILS_LAST_SERVICE_MINUTES_AGO :上次維護︰{LTBLUE}{NUM} 分鐘前 -STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}將維護間隔縮減 10 天。 按住 點選可將維護間隔縮減 1 天 -STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}將維護間隔縮減 5 分鐘。 按住 點選可將維護間隔縮減 1 分鐘 -STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}將維護間隔縮減 10%。 按住 點選可將維護間隔縮減 1% +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}將維護間隔增加 10 天。按住 點選可將維護間隔增加 5 天 +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}將維護間隔增加 5 分鐘。按住 點選可將維護間隔增加 1 分鐘 +STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}將維護間隔增加 10%。 按住 點選可將維護間隔增加 5% +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_DAYS :{BLACK}將維護間隔減少 10 天。 按住 點選可將維護間隔減少 5 天 +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_MINUTES :{BLACK}將維護間隔減少 5 分鐘。 按住 點選可將維護間隔減少 1 分鐘 +STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP_PERCENT :{BLACK}將維護間隔減少 10%。 按住 點選可將維護間隔減少 5% STR_SERVICE_INTERVAL_DROPDOWN_TOOLTIP :{BLACK}更改檢修週期所用單位 STR_VEHICLE_DETAILS_DEFAULT :預設 @@ -4488,12 +4523,14 @@ STR_ORDER_DROP_REFIT_AUTO_ANY :可用貨物 STR_ORDER_DROP_GO_ALWAYS_DEPOT :總是進行 STR_ORDER_DROP_SERVICE_DEPOT :若需要則維護 STR_ORDER_DROP_HALT_DEPOT :停留 +STR_ORDER_DROP_UNBUNCH :自動調節班次 # Depot action tooltips, one per vehicle type ###length VEHICLE_TYPES STR_ORDER_TRAIN_DEPOT_ACTION_TOOLTIP :{BLACK}選擇車廠動作 STR_ORDER_ROAD_DEPOT_ACTION_TOOLTIP :{BLACK}選擇車廠動作 STR_ORDER_SHIP_DEPOT_ACTION_TOOLTIP :{BLACK}選擇船塢動作 +STR_ORDER_HANGAR_ACTION_TOOLTIP :{BLACK}選擇機庫動作 ###next-name-looks-similar STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}跳躍指令依據 @@ -4563,6 +4600,7 @@ STR_ORDER_REFIT_ORDER :(改裝成 {STR STR_ORDER_REFIT_STOP_ORDER :(裝載 {STRING} 並停止) STR_ORDER_STOP_ORDER :(停止) +STR_ORDER_WAIT_TO_UNBUNCH :(等候調節班次) STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(不能使用車站){POP_COLOUR} {STRING} {STATION} {STRING} @@ -5034,6 +5072,11 @@ STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT :{WHITE}找不 STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :錯誤的機廠種類 # Depot unbunching related errors +STR_ERROR_UNBUNCHING_ONLY_ONE_ALLOWED :{WHITE}… 只能有一個自動調節班次指令 +STR_ERROR_UNBUNCHING_NO_FULL_LOAD :{WHITE}… 不能對擁有自動調節班次的車輛使用滿載指令 +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_FULL_LOAD :{WHITE}… 不能對擁有滿載指令的車輛使用自動調節班次 +STR_ERROR_UNBUNCHING_NO_CONDITIONAL :{WHITE}… 不能對擁有自動調節班次的車輛使用條件指令 +STR_ERROR_UNBUNCHING_NO_UNBUNCHING_CONDITIONAL :{WHITE}… 不能對擁有條件指令的車輛使用自動調節班次 # Autoreplace related errors STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} 將在替換後過長 @@ -5201,6 +5244,8 @@ STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}在{DATE STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL :{WHITE}沒有可用於市鎮建設的道路類型 STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}請修改您的 NewGRF 設定 +STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET :{WHITE}目前沒有可用於市鎮建設的道路類型 +STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET_EXPLANATION :{WHITE}在 {DATE_SHORT} 後開啟新遊戲,或使用一款能提供早期市鎮可建設的道路種類的 NewGRF # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}無法讓列車通過險阻號誌... From db36e61807955c896267d6585de0577efd30465d Mon Sep 17 00:00:00 2001 From: David Seifert <16636962+SoapGentoo@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:42:23 +0200 Subject: [PATCH 37/41] Codefix: Compilation with GCC 15 due to missing CRTP usage (#12876) --- src/pathfinder/yapf/yapf_road.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 209b64b52a..82fcba1cf1 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -470,7 +470,7 @@ public: /* set origin (tile, trackdir) */ TileIndex src_tile = v->tile; Trackdir src_td = v->GetVehicleTrackdir(); - if (!HasTrackdir(GetTrackdirBitsForRoad(src_tile, this->IsTram() ? RTT_TRAM : RTT_ROAD), src_td)) { + if (!HasTrackdir(GetTrackdirBitsForRoad(src_tile, Yapf().IsTram() ? RTT_TRAM : RTT_ROAD), src_td)) { /* sometimes the roadveh is not on the road (it resides on non-existing track) * how should we handle that situation? */ return false; From f4e5f1b34d646f8e988883fa0ea9b78bdcff5834 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 23 Jul 2024 04:42:05 +0000 Subject: [PATCH 38/41] Update: Translations from eints chinese (traditional): 35 changes by KogentaSan --- src/lang/traditional_chinese.txt | 41 +++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index ff5a66013e..6a5086fa7c 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -613,8 +613,11 @@ STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}運送 STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}公司效率指標 (最高 1000) STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}公司價值 +STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}最後 72 分鐘 STR_GRAPH_CARGO_PAYMENT_RATES_CAPTION :{WHITE}貨物運費表 +STR_GRAPH_CARGO_PAYMENT_RATES_DAYS :{TINY_FONT}{BLACK}運輸所用天數 +STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS :{TINY_FONT}{BLACK}運輸所用秒數 STR_GRAPH_CARGO_PAYMENT_RATES_TITLE :{TINY_FONT}{BLACK}將 10 單位 (或 10,000 公升) 貨物運送 20 格的費用 STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLACK}全部啟用 STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}全部停用 @@ -799,6 +802,7 @@ STR_SMALLMAP_TOWN :{TINY_FONT}{WHI STR_SMALLMAP_DISABLE_ALL :{BLACK}全部停用 STR_SMALLMAP_ENABLE_ALL :{BLACK}全部打開 STR_SMALLMAP_SHOW_HEIGHT :{BLACK}顯示高度 +STR_SMALLMAP_SHOW_INDUSTRY_NAMES :{BLACK}顯示工業名稱 STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}地圖不顯示任何工業 STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}地圖顯示所有工業 STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}切換高度圖顯示 @@ -926,6 +930,8 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}現在起 {4:UNITS_YEARS_OR_MINUTES} 期間內將 {1:STRING} 從 {2:STRING} 運到 {3:STRING} 的服務可收到三倍運費補助! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}現在起 {4:UNITS_YEARS_OR_MINUTES} 期間內將 {1:STRING} 從 {2:STRING} 運到 {3:STRING} 的服務可收到四倍運費補助! +STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}在{TOWN}內出現交通混亂!{}{}由{STRING}贊助的道路重建計劃將為駕駛者帶來多達 6 個月的阻塞苦楚! +STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}在{TOWN}內出現交通混亂!{}{}由{STRING}贊助的道路重建計劃將為駕駛者帶來多達 6 分鐘的阻塞苦楚! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}運輸大亨! # Extra view window @@ -951,6 +957,7 @@ STR_GAME_OPTIONS_VOLUME :音量 STR_GAME_OPTIONS_SFX_VOLUME :音效 STR_GAME_OPTIONS_MUSIC_VOLUME :音樂 +STR_GAME_OPTIONS_VOLUME_MARK :{NUM}% STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}幣值單位 STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}選擇幣值單位 @@ -1472,7 +1479,10 @@ STR_CONFIG_SETTING_ORDER_REVIEW_ON :所有車輛 STR_CONFIG_SETTING_WARN_INCOME_LESS :當車輛收入為負時發放警告:{STRING} ###length 2 STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :如啟用此選項,系統會為上一年度賺不到錢的車輛顯示訊息。 +STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :如啟用此選項,車輛在一週期內沒有盈利時會顯示訊息 +STR_CONFIG_SETTING_WARN_OLD_VEHICLE :車輛老化時發出警告︰{STRING} +STR_CONFIG_SETTING_WARN_OLD_VEHICLE_HELPTEXT :如啟用此選項,車輛老化的時候會顯示訊息 STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :車輛永不過期:{STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :如啟用此選項,所有車輛一經面世,就永遠可以選擇建造。 @@ -1705,9 +1715,11 @@ STR_CONFIG_SETTING_LOADING_INDICATORS :使用裝載進 STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :選擇是否在車輛裝卸的時候顯示裝載狀況。 STR_CONFIG_SETTING_TIMETABLE_MODE :時刻表使用的時間單位:{STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :選擇車輛時刻表所使用的時間單位 ###length 3 STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :日 STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :秒 +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :刻 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :顯示時刻表排定的到離時間:{STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :在時刻表上顯示預料的到站、出發時間。 @@ -1749,6 +1761,7 @@ STR_CONFIG_SETTING_SOUND_NEW_PERIOD :週期結束︰ ###length 2 STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :在顯示年終報告時播放音效 +STR_CONFIG_SETTING_SOUND_NEW_PERIOD_HELPTEXT :在顯示週期終報告時播放音效 STR_CONFIG_SETTING_SOUND_CONFIRM :建造:{STRING} STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :在成功建造設施或執行其他動作時播放音效。 @@ -2035,12 +2048,14 @@ STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :如果把此值 STR_CONFIG_SETTING_SHORT_PATH_SATURATION :如果最短路徑的飽和度超過{STRING},把貨物改派往容量較大的路徑 STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :貨物分配功能在派送貨物時,會優先使用最短路徑,至其飽和後改用第二短的路徑,如此類推。當所有路徑皆飽和但仍未滿足需求,系統會由容量較大的路徑開始繼續加載貨物。{}由於路徑飽和度難以準確估算,此設定容許您定義一值,使短路徑達至該飽和度後,系統便開始加載容量較大的路徑。{}如果此設定的值少於100%,即使系統高估路徑容量,也不會使過多的貨物滯留車站。 -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :速度單位:{STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :速度單位(陸地):{STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :速度單位(航海):{STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :在界面上以所選擇的單位表示速度。 STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :英制(英里/小時) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :米制(公里/小時) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :國際單位(米/秒) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_DAYS :遊戲單位(格/天) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS_SECS :遊戲單位(格/秒) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :節 STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :車輛功率單位:{STRING} @@ -2091,6 +2106,7 @@ STR_CONFIG_SETTING_ACCOUNTING :財務 STR_CONFIG_SETTING_VEHICLES :車輛 STR_CONFIG_SETTING_VEHICLES_PHYSICS :物理 STR_CONFIG_SETTING_VEHICLES_ROUTING :路線 +STR_CONFIG_SETTING_VEHICLES_ORDERS :調度指令 STR_CONFIG_SETTING_LIMITATIONS :遊戲限制 STR_CONFIG_SETTING_ACCIDENTS :災難/事故 STR_CONFIG_SETTING_GENWORLD :地圖的產生 @@ -2454,8 +2470,8 @@ STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}加入 STR_NETWORK_CLIENT_LIST_COMPANY_AUTHORIZE_TOOLTIP :{BLACK}授權此客戶端加入您的公司 STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}傳送訊息給此玩家 STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}傳送訊息給公司中的所有玩家 -STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}傳送訊息給所有旁觀者 -STR_NETWORK_CLIENT_LIST_SPECTATORS :旁觀者 +STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}傳送訊息給所有觀眾 +STR_NETWORK_CLIENT_LIST_SPECTATORS :觀眾 STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(新公司) STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}創立並加入一個新公司 STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}這是你 @@ -2487,11 +2503,12 @@ STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}是, STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}是,且不再詢問 STR_NETWORK_ASK_SURVEY_CAPTION :是否參與自動問卷? +STR_NETWORK_ASK_SURVEY_PREVIEW :預覽調查結果 STR_NETWORK_ASK_SURVEY_LINK :關於問卷和隱私 STR_NETWORK_ASK_SURVEY_NO :否 STR_NETWORK_ASK_SURVEY_YES :是 -STR_NETWORK_SPECTATORS :旁觀者 +STR_NETWORK_SPECTATORS :觀眾 # Network company info join/password STR_COMPANY_VIEW_JOIN :{BLACK}加入 @@ -2585,7 +2602,7 @@ STR_NETWORK_MESSAGE_CLIENT_LEAVING :離開中 STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} 已加入遊戲 STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {0:STRING} 已加入此遊戲 (用戶端 #{2:NUM}) STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {0:STRING} 已加入公司 #{2:NUM} -STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} 已加入為旁觀者 +STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} 已加入為觀眾 STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {0:STRING} 已建立新公司 (#{2:NUM}) STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {0:STRING} 已離開遊戲 ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} 已修改其名稱為 {STRING} @@ -2688,6 +2705,7 @@ STR_TRANSPARENT_BUILDINGS_TOOLTIP :{BLACK}切換 STR_TRANSPARENT_BRIDGES_TOOLTIP :{BLACK}切換橋樑是否透明。按住 CTRL 點選可鎖定 STR_TRANSPARENT_STRUCTURES_TOOLTIP :{BLACK}切換公用設施是否透明,如燈塔、天線塔等。按住 CTRL 點選可鎖定 STR_TRANSPARENT_CATENARY_TOOLTIP :{BLACK}切換供電線是否透明。按住 CTRL 點選可鎖定 +STR_TRANSPARENT_TEXT_TOOLTIP :{BLACK}切換裝載和盈利的提示是否透明。按住 點選可鎖定 STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}讓物件完全隱藏,而非透明顯示 # Linkgraph legend window @@ -2776,6 +2794,8 @@ STR_PICKER_MODE_SAVED_TOOLTIP :切換僅顯示 STR_PICKER_STATION_CLASS_TOOLTIP :選擇顯示的車站種類 STR_PICKER_WAYPOINT_CLASS_TOOLTIP :選擇顯示的號誌站種類 +STR_PICKER_ROADSTOP_BUS_CLASS_TOOLTIP :選擇顯示的公車站種類 +STR_PICKER_ROADSTOP_BUS_TYPE_TOOLTIP :選擇建設的公車站類型。按住 點選可在儲存項目中新增或刪除 STR_PICKER_ROADSTOP_TRUCK_CLASS_TOOLTIP :選擇顯示的貨車場種類 STR_PICKER_OBJECT_CLASS_TOOLTIP :選擇顯示的物品種類 STR_PICKER_HOUSE_CLASS_TOOLTIP :選擇顯示的市鎮區域 @@ -3277,6 +3297,7 @@ STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流: STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度: STR_MAPGEN_VARIETY :{BLACK}地形起伏分佈: STR_MAPGEN_GENERATE :{WHITE}產生 +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}建立世界和開始進行遊玩 OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF 設定 STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}顯示 NewGRF 設定 STR_MAPGEN_AI_SETTINGS :{BLACK}AI 設定 @@ -3338,6 +3359,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}平地 STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}產生平地 STR_SE_MAPGEN_RANDOM_LAND :{WHITE}隨機產生地形 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}平地高度: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}選擇地面海拔高度 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}將平地高度下移一層 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}將平地高度上移一層 @@ -3731,6 +3753,8 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}評價 STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}顯示車站評價 +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MONTH :{BLACK}每月供應量和本地評價︰ +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE_MINUTE :{BLACK}每分鐘供應量和本地評價︰ STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}群組方式 @@ -3865,6 +3889,7 @@ STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}顯示 STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}給予資金 STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}將資金給予此公司 STR_COMPANY_VIEW_HOSTILE_TAKEOVER_BUTTON :{BLACK}敵意收購 +STR_COMPANY_VIEW_HOSTILE_TAKEOVER_TOOLTIP :{BLACK}對此公司進行敵意收購 STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}新臉孔 STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}選擇總經理的新臉孔 @@ -4678,10 +4703,12 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}此車 STR_TIMETABLE_STATUS_LATE :{BLACK}此車輛目前比表定時間遲 {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}此車輛目前比表定時間早 {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}此時刻表尚未實施 +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}本時刻表將會在 {STRING} 開始 STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}本時刻表將會在{COMMA}秒後開始 STR_TIMETABLE_START :{BLACK}開始時刻表 +STR_TIMETABLE_START_SECONDS_QUERY :距離時刻表開始還有的秒數 STR_TIMETABLE_CHANGE_TIME :{BLACK}修改時刻 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}修改選取指令所需的時間。按住 Ctrl 點選可設定所有指令的時間。 @@ -4738,7 +4765,7 @@ STR_AI_DEBUG_CONTINUE :{BLACK}繼續 STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}取消暫停並繼續 AI STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}檢視此 AI 的除錯輸出資訊 STR_AI_GAME_SCRIPT :{BLACK}遊戲腳本 -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}檢查腳本日誌 +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}檢查遊戲腳本日誌。按住 點選以開啟新視窗 STR_ERROR_AI_NO_AI_FOUND :找不到適合的 AI 可以載入。{}此 AI 是虛擬 AI,沒有任何效果。{}您可以透過「線上內容」系統下載更多 AI。 STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}正在運行中的其中一個 AI 發生錯誤。請打開「AI 除錯」視窗後擷取螢幕圖片,將此問題回報給 AI 作者。 @@ -5042,6 +5069,7 @@ STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}無法 STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}無法移除列車號誌站... STR_ERROR_CAN_T_REMOVE_ROAD_WAYPOINT :{WHITE}無法移除道路號誌站... STR_ERROR_MUST_REMOVE_RAILWAYPOINT_FIRST :{WHITE}必須先移除鐵路號誌站 +STR_ERROR_MUST_REMOVE_ROADWAYPOINT_FIRST :{WHITE}必須先移除道路號誌站 STR_ERROR_BUOY_IN_THE_WAY :{WHITE}... 被浮標擋住 STR_ERROR_BUOY_IS_IN_USE :{WHITE}... 浮標正被其他公司使用! @@ -5743,6 +5771,7 @@ STR_UNKNOWN_STATION :未知車站 STR_DEFAULT_SIGN_NAME :標誌 STR_COMPANY_SOMEONE :某人 +STR_SAVEGAME_DURATION_REALTIME :{NUM} 小時 {NUM} 分鐘 STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} STR_SAVEGAME_NAME_SPECTATOR :旁觀者, {1:STRING} From 1a6655bd1b69e989b849d40cc0a37445daf081d1 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 24 Jul 2024 04:42:02 +0000 Subject: [PATCH 39/41] Update: Translations from eints chinese (traditional): 28 changes by KogentaSan --- src/lang/traditional_chinese.txt | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 6a5086fa7c..5ecc285af1 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -920,6 +920,7 @@ STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}{STRING} STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP :{BLACK}打開該運輸工具的群組 STR_NEWS_STATION_NO_LONGER_ACCEPTS_CARGO_LIST :{WHITE}{STATION}不再接受:{CARGO_LIST} +STR_NEWS_STATION_NOW_ACCEPTS_CARGO_LIST :{WHITE}{STATION}現正接受︰{CARGO_LIST} STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}補助過期:{}{}將 {STRING} 從 {STRING} 運到 {STRING} 現在起不再提供補助 STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}補助結束:{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務不再提供補助 @@ -933,6 +934,8 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLAC STR_NEWS_ROAD_REBUILDING_MONTHS :{BIG_FONT}{BLACK}在{TOWN}內出現交通混亂!{}{}由{STRING}贊助的道路重建計劃將為駕駛者帶來多達 6 個月的阻塞苦楚! STR_NEWS_ROAD_REBUILDING_MINUTES :{BIG_FONT}{BLACK}在{TOWN}內出現交通混亂!{}{}由{STRING}贊助的道路重建計劃將為駕駛者帶來多達 6 分鐘的阻塞苦楚! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}運輸大亨! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MONTHS :{BIG_FONT}{BLACK}{TOWN} 地方政府與 {STRING} 簽署了為期一年的專屬運輸權! +STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION_MINUTES :{BIG_FONT}{BLACK}{TOWN} 地方政府與 {STRING} 簽署了 12 分鐘專屬運輸權! # Extra view window STR_EXTRA_VIEWPORT_TITLE :{WHITE}視野 {COMMA} @@ -1037,8 +1040,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}硬體 STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}勾選此方框以允許OpenTTD嘗試使用硬體加速。設定將會在遊戲重新啟動後套用 STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}修改的設定將會在遊戲重啟後生效 -STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync -STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}勾選此方框以啟用V-SYNC。此項設定將會在遊戲重啟後套用。只有在硬體加速存在時可用 +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}垂直同步 +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}勾選此方框以啟用垂直同步 (V-SYNC)。此項設定將會在遊戲重啟後套用。只有在硬體加速存在時可用 STR_GAME_OPTIONS_VIDEO_DRIVER_INFO :{BLACK}使用中的驅動程式: {STRING} @@ -1090,7 +1093,7 @@ STR_GAME_OPTIONS_ONLINE_CONTENT_TOOLTIP :檢查及下載 STR_GAME_OPTIONS_SOCIAL_PLUGINS_NONE :{LTBLUE}(沒有安裝社交平台擴充功能) STR_GAME_OPTIONS_SOCIAL_PLUGIN_TITLE :{BLACK}{STRING} ({STRING}) -STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}月台︰ +STR_GAME_OPTIONS_SOCIAL_PLUGIN_PLATFORM :{BLACK}平台︰ STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE :{BLACK}擴充功能狀態︰ STR_GAME_OPTIONS_SOCIAL_PLUGIN_STATE_RUNNING :{GREEN}正在運行 @@ -1394,9 +1397,11 @@ STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :路軌右方 ###length 2 STR_CONFIG_SETTING_SHOWFINANCES :於年末顯示財政視窗:{STRING} +STR_CONFIG_SETTING_SHOWFINANCES_PERIOD :於週期末顯示財政視窗︰{STRING} ###length 2 STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :如啟用此選項,財務視窗會在每年年終出現,讓玩家可輕易查察公司的財務狀況。 +STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT_PERIOD :如啟用此選項,財務視窗會在每週期終結後出現,讓玩家可輕易查察公司的財務狀況。 STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :設定指令時預設選擇「直達」指令:{STRING} STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :在正常情況下,車輛會停靠沿途所有車站。如啟用此選項,車輛只會停靠指令上的目的地而跳過沿途的其他車站。請注意:本設定僅改變新指令的產生方式,而且玩家仍可手動更改指令,使車輛停靠沿途其他車站。 @@ -1419,10 +1424,12 @@ STR_CONFIG_SETTING_AUTOSCROLL_EVERY_VIEWPORT :所有視野 STR_CONFIG_SETTING_BRIBE :可向地方政府行賄:{STRING} ###length 2 STR_CONFIG_SETTING_BRIBE_HELPTEXT :容許公司嘗試賄賂地方政府。如果賄賂行為被調查員揭發,公司在往後六個月內無法接觸有關地方政府。 +STR_CONFIG_SETTING_BRIBE_HELPTEXT_MINUTES :容許公司嘗試賄賂地方政府。如果賄賂行為被調查員揭發,公司將在往後 6 分鐘內無法接觸有關地方政府。 STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :允許購買市鎮的專屬運輸權:{STRING} ###length 2 -STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一所公司購買了一個市鎮的一年專屬運輸權,其他公司在該市鎮建造的車站在這一年之內將不會收到任何貨物 (包括乘客)。 +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :如果一所公司購買了一個市鎮的專屬運輸權,其他公司在該市鎮的車站將在十二個月之內不會收到任何貨物與乘客 +STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT_MINUTES :如果一所公司購買了一個市鎮的專屬運輸權,其他公司在該市鎮的車站將在 12 分鐘之內不會收到任何貨物與乘客 STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :容許資助市鎮建設:{STRING} STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :容許公司出資供市鎮建造新樓房。 @@ -1462,6 +1469,7 @@ STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :初始公司顏 STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :選擇公司的初始顏色。 STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY :初始公司副色調:{STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_SECONDARY_HELPTEXT :選擇初始公司副色調,需使用支援副色調的 NewGRF STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :機場永不過期:{STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :如啟用此選項,所有機場一經面世,就永遠可以選擇建設。 @@ -1595,6 +1603,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :靠左行駛 STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :靠右行駛 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :旋轉高度圖:{STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :選擇高度圖的旋轉方向以設立遊戲版圖 ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆時針 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :順時針 @@ -1689,6 +1698,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :在視窗內以 ###length 3 STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO :否 STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES :是 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_YES_EXCEPT_STICKY :是(除已固定的視窗外) STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES :使用 {STRING} 時間格式作為存檔檔名 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_HELPTEXT :在存檔的檔名中使用的日期格式。 @@ -1833,6 +1843,8 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :停用 STR_CONFIG_SETTING_NOSERVICE :如果停用故障,車輛不會進行自動維護:{STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :如啟用此選項,而且車輛設定為不故障,它們將不會進入機廠接受維護。 +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :列車超過車站長度的裝載懲罰︰{STRING} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :啟用後,對於列車超出車站的長度會使到裝載得變得更慢。此設定不會影響尋路 STR_CONFIG_SETTING_WAGONSPEEDLIMITS :開啟列車車廂速限:{STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :如啟用此選項,無動力車廂的限速會影響列車的最高速度。 @@ -1924,6 +1936,7 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :設定使用燈 STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :按住 Ctrl 點選號誌時要切換的號誌種類:{STRING} STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :選擇可以用Ctrl+點擊以替換的號誌類型。 ###length 2 +STR_CONFIG_SETTING_CYCLE_SIGNAL_GROUP :僅限目前信號組 STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :所有可見的號誌 STR_CONFIG_SETTING_SIGNAL_GUI_MODE :顯示號誌類型:{STRING} @@ -2503,6 +2516,7 @@ STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}是, STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}是,且不再詢問 STR_NETWORK_ASK_SURVEY_CAPTION :是否參與自動問卷? +STR_NETWORK_ASK_SURVEY_TEXT :您是否願意參加自動調查?{} OpenTTD 會在離開遊戲時傳送調查資訊。{}您可在任何時候於「遊戲選項」選單裡修改此項設定。 STR_NETWORK_ASK_SURVEY_PREVIEW :預覽調查結果 STR_NETWORK_ASK_SURVEY_LINK :關於問卷和隱私 STR_NETWORK_ASK_SURVEY_NO :否 @@ -2569,6 +2583,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :收到無效或 STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :版本錯誤 STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :已有人使用相同名稱 STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :密碼錯誤 +STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST :不在允許名單內 STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :已請求的驗證方式均不可用 STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :DoCommand 內含錯誤的 company-id STR_NETWORK_ERROR_CLIENT_KICKED :被伺服器踢除 @@ -2721,6 +2736,8 @@ STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLA STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}超載 # Linkgraph tooltip +STR_LINKGRAPH_STATS_TOOLTIP_MONTH :{BLACK}每月有 {CARGO_LONG} 需從 {STATION} 運到 {STATION} (可載量之 {COMMA}%){STRING} +STR_LINKGRAPH_STATS_TOOLTIP_MINUTE :{BLACK}每分鐘有 {CARGO_LONG} 需從 {STATION} 運到 {STATION} (可載量之 {COMMA}%){STRING} STR_LINKGRAPH_STATS_TOOLTIP_RETURN_EXTENSION :{}回程則有{CARGO_LONG}(可載量之{COMMA}%) STR_LINKGRAPH_STATS_TOOLTIP_TIME_EXTENSION :{}平均運輸時間:{UNITS_DAYS_OR_SECONDS} @@ -2793,12 +2810,17 @@ STR_PICKER_MODE_SAVED :已儲存 STR_PICKER_MODE_SAVED_TOOLTIP :切換僅顯示已儲存的項目 STR_PICKER_STATION_CLASS_TOOLTIP :選擇顯示的車站種類 +STR_PICKER_STATION_TYPE_TOOLTIP :選擇建設的車站類型。按住 點選可在儲存項目中新增或刪除 STR_PICKER_WAYPOINT_CLASS_TOOLTIP :選擇顯示的號誌站種類 +STR_PICKER_WAYPOINT_TYPE_TOOLTIP :選擇建設的號誌站類型。按住 點選可在儲存項目中新增或刪除 STR_PICKER_ROADSTOP_BUS_CLASS_TOOLTIP :選擇顯示的公車站種類 STR_PICKER_ROADSTOP_BUS_TYPE_TOOLTIP :選擇建設的公車站類型。按住 點選可在儲存項目中新增或刪除 STR_PICKER_ROADSTOP_TRUCK_CLASS_TOOLTIP :選擇顯示的貨車場種類 +STR_PICKER_ROADSTOP_TRUCK_TYPE_TOOLTIP :選擇建設的貨車場類型。按住 點選可在儲存項目中新增或刪除 STR_PICKER_OBJECT_CLASS_TOOLTIP :選擇顯示的物品種類 +STR_PICKER_OBJECT_TYPE_TOOLTIP :選擇建設的物件類型。按住 點選可在儲存項目中新增或刪除。按住 以對角線選擇區域。按住 可顯示預估成本 STR_PICKER_HOUSE_CLASS_TOOLTIP :選擇顯示的市鎮區域 +STR_PICKER_HOUSE_TYPE_TOOLTIP :選擇建設的房屋類型。按住 點選可在儲存項目中新增或刪除 STR_HOUSE_PICKER_CAPTION :房屋選擇 @@ -3651,6 +3673,7 @@ STR_LOCAL_AUTHORITY_ACTION_BRIBE :向地方政府 STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{PUSH_COLOUR}{YELLOW}開始進行小型地方廣告活動,為您的運輸服務吸引更多乘客與貨物。{}使城鎮小範圍內的車站獲得暫時的評分增益。{} {POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{PUSH_COLOUR}{YELLOW}開始進行中型地方廣告活動,為您的運輸服務吸引更多乘客與貨物。{}使城鎮中等範圍內的車站獲得暫時的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{PUSH_COLOUR}{YELLOW}開始進行大型地方廣告活動,為您的運輸服務吸引更多乘客與貨物。{}使城鎮較大範圍內的車站獲得暫時的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{YELLOW}贊助市鎮道路網絡重建。{}這將會使到市鎮的交通阻塞 6 個月。{}{POP_COLOUR}費用︰{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}贊助市鎮道路網絡重建。{}這將會使到市鎮的交通阻塞 6 分鐘。{}{POP_COLOUR}費用︰{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}建造雕像紀念您的公司。{}使城鎮範圍內的車站獲得永久的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}出資協助市鎮建造新的商業建築。{}使城鎮獲得暫時性的成長速度增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} @@ -4409,6 +4432,7 @@ STR_VEHICLE_DETAILS_AIRCRAFT_RENAME :{BLACK}命名 STR_VEHICLE_INFO_AGE :{COMMA} 年 ({COMMA}) STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} 年 ({COMMA}) STR_VEHICLE_INFO_AGE_RUNNING_COST_YR :{BLACK}年齡:{LTBLUE}{STRING}{BLACK} 營運成本:每年{LTBLUE}{CURRENCY_LONG} +STR_VEHICLE_INFO_AGE_RUNNING_COST_PERIOD :{BLACK}已使用年期︰{LTBLUE}{STRING}{BLACK} 營運成本︰{LTBLUE}{CURRENCY_LONG}/週期 STR_VEHICLE_INFO_MAX_SPEED :{BLACK}最高速度:{LTBLUE}{VELOCITY} STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}最高速度:{LTBLUE}{VELOCITY} {BLACK}飛機型號:{LTBLUE}{STRING} From 44b748a7662cc5c551965d222e3974e84c20ff94 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 25 Jul 2024 04:44:39 +0000 Subject: [PATCH 40/41] Update: Translations from eints hungarian: 33 changes by peti2000 --- src/lang/hungarian.txt | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 8e90afc451..2d936aefc7 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -500,6 +500,8 @@ STR_SCENEDIT_FILE_MENU_QUIT_EDITOR :Pályaszerkeszt STR_SCENEDIT_FILE_MENU_SEPARATOR : STR_SCENEDIT_FILE_MENU_QUIT :Kilépés az OpenTTD-ből +STR_SCENEDIT_TOWN_MENU_BUILD_TOWN :Városok generálása +STR_SCENEDIT_TOWN_MENU_PACE_HOUSE :Házak elhelyezése # Settings menu ###length 16 @@ -1116,6 +1118,7 @@ STR_GAME_OPTIONS_GUI_FONT_SPRITE_TOOLTIP :{BLACK}Jelöld STR_GAME_OPTIONS_GUI_FONT_AA :{BLACK}Betűtípusok simítása STR_GAME_OPTIONS_GUI_FONT_AA_TOOLTIP :{BLACK}Jelöld be ezt, ha lesimított betűket akarsz. +STR_GAME_OPTIONS_GUI_SCALE_MARK :{DECIMAL}x STR_GAME_OPTIONS_PARTICIPATE_SURVEY_FRAME :{BLACK}Automata felmérés STR_GAME_OPTIONS_PARTICIPATE_SURVEY :{BLACK}Részvétel automata felmérésben @@ -1545,6 +1548,8 @@ STR_CONFIG_SETTING_WARN_INCOME_LESS :Figyelmeztetés STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT :Üzenetek megjelenítése azokról a járművekről, melyek nem termeltek profitot egy év alatt STR_CONFIG_SETTING_WARN_INCOME_LESS_HELPTEXT_PERIOD :Üzenetek megjelenítése azokról a járművekről, melyek nem termeltek profitot egy időszakon belül +STR_CONFIG_SETTING_WARN_OLD_VEHICLE :Jelezzen, ha egy jármű elöregedett: {STRING} +STR_CONFIG_SETTING_WARN_OLD_VEHICLE_HELPTEXT :Ha engedélyezve van, a rendszer üzenetet küld, amikor egy jármű elöregszik STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Járművek sosem avulnak el: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Bekapcsolva minden járműmodell örökké elérhető marad bevezetése után @@ -2608,6 +2613,7 @@ STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}A játé STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}A szerver neve nem lett megadva. A szerver nevét az ablak tetején tudod beállítani. STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}A gépeden és a szerveren lévő programnak nem egyezik meg a verziója STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Rossz jelszó +STR_NETWORK_ERROR_NOT_ON_ALLOW_LIST :{WHITE}Nem szerepelsz az engedélyezett felhasználók listáján! STR_NETWORK_ERROR_SERVER_FULL :{WHITE}A szerver tele van STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Ki vagy tiltva erről a szerverről STR_NETWORK_ERROR_KICKED :{WHITE}Ki lettél rúgva a szerverről @@ -2635,6 +2641,7 @@ STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :ismeretlen vagy STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :rossz verzió STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :a név már használva van STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :rossz jelszó +STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE :a kért hitelesítési módok egyike sem elérhető STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :hibás vállalat azonosító (wrong company in DoCommand) STR_NETWORK_ERROR_CLIENT_KICKED :a szerver kirúgott STR_NETWORK_ERROR_CLIENT_CHEATER :csalni próbált @@ -2852,9 +2859,26 @@ STR_STATION_BUILD_PLATFORM_LENGTH_TOOLTIP :{BLACK}A vasút STR_STATION_BUILD_DRAG_DROP :{BLACK}Fogd és dobd STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Állomás építése fogd és dobd módon +STR_PICKER_MODE_ALL :Összes +STR_PICKER_MODE_ALL_TOOLTIP :Kapcsolja be az összes csoport elemeinek megjelenítését +STR_PICKER_MODE_USED :Használt +STR_PICKER_MODE_USED_TOOLTIP :Csak a meglévő elemek megjelenítése +STR_PICKER_MODE_SAVED :Mentve +STR_PICKER_MODE_SAVED_TOOLTIP :Csak a mentett elemek megjelenítése +STR_PICKER_STATION_CLASS_TOOLTIP :Válaszd ki a megjeleníteni kívánt állomástípust +STR_PICKER_STATION_TYPE_TOOLTIP :Válassz ki egy állomástípust az építéshez. Ctrl+kattintás a mentett elemek hozzáadásához vagy eltávolításához +STR_PICKER_ROADSTOP_BUS_CLASS_TOOLTIP :Válaszd ki a megjeleníteni kívánt buszállomás-típust +STR_PICKER_OBJECT_CLASS_TOOLTIP :Válaszd ki a megjelenítendő elemcsoportot +STR_PICKER_OBJECT_TYPE_TOOLTIP :Válaszd ki az építendő elem típusát. Ctrl+kattintás a mentett elemek hozzáadásához vagy eltávolításához. Ctrl+kattintás+húzás a terület átlós kijelöléséhez. Nyomd meg a Shift billentyűt is, ha csak a költségbecslést szeretnéd megjeleníteni +STR_HOUSE_PICKER_CAPTION :Ház kiválasztása +STR_HOUSE_PICKER_CLASS_ZONE1 :Szél +STR_HOUSE_PICKER_CLASS_ZONE2 :Külváros +STR_HOUSE_PICKER_CLASS_ZONE3 :Külső kertváros +STR_HOUSE_PICKER_CLASS_ZONE4 :Belső kertváros +STR_HOUSE_PICKER_CLASS_ZONE5 :Városközpont STR_STATION_CLASS_DFLT :Alapértelmezett STR_STATION_CLASS_DFLT_STATION :Alapértelmezett állomás @@ -2909,6 +2933,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}Közút STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}Villamospálya építése egyszerűsített módon. Ctrl+kattintás a pálya lerombolásához. Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Garázs építése (járművek vételére és karbantartására). Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Villamos remíz építése (járművek megépítésére és javítására). Shift+kattintással csak a becsült költséget jeleníti meg +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}Útpont építése a villamosvonalon. Ctrl+kattintás másik csatlakozási pont kiválasztásához. Nyomd meg a Shift billentyűt is, ha csak a költségbecslést szeretnéd megjeleníteni STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}Buszmegálló építése. Ctrl+kattintással egyesíthető más állomásokkal. Shift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}Villamosmegálló építése. Ctrl+kattintással egyesíthető más állomásokkal. SShift+kattintással csak a becsült költséget jeleníti meg STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}Teherautó-állomás építése. Ctrl+kattintással egyesíthető más állomásokkal. Shift+kattintással csak a becsült költséget jeleníti meg @@ -3638,6 +3663,7 @@ STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Előző STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}Felirat szövegének szerkesztése # Town directory window +STR_TOWN_DIRECTORY_CAPTION :{WHITE}Városok ({COMMA}, {COMMA}) STR_TOWN_DIRECTORY_NONE :{ORANGE}- Nincs - STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ({COMMA}) STR_TOWN_DIRECTORY_CITY :{ORANGE}{TOWN}{YELLOW} (Város){BLACK} ({COMMA}) @@ -3971,6 +3997,7 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENC STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/időszak # Industry directory +STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Gazdasági épületek ({COMMA}, {COMMA}) STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Nincs - STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} ({COMMA}% elszállítva){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} @@ -4930,7 +4957,9 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Becsült STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}A mentés még tart,{}kérlek várd meg a végét! STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatikus mentés sikertelen STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Nem olvasható a meghajtó +STR_ERROR_GAME_SAVE_FAILED :{WHITE}A mentés sikertelen STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Nem sikerült törölni a fájlt +STR_ERROR_GAME_LOAD_FAILED :{WHITE}A betöltés sikertelen STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Belső hiba: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Hibás játékállás-mentés - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :A játékállást újabb verzió mentette el @@ -5035,6 +5064,7 @@ STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... ninc STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Útkarbantartás folyamatban STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Nem törölheted ezt a várost...{}Egy állomás vagy járműtelep hivatkozik a városra, vagy egy városi tulajdonú mező nem eltávolítható STR_ERROR_STATUE_NO_SUITABLE_PLACE :{WHITE}... nincs megfelelő hely egy szobornak a város központjában +STR_ERROR_CAN_T_BUILD_HOUSE :{WHITE}A házépítés nem lehetséges # Industry related errors STR_ERROR_TOO_MANY_INDUSTRIES :{WHITE}... túl sok a gazdasági épület @@ -5107,6 +5137,7 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Több l STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Túl közel van egy másik ellenőrző ponthoz STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Ide nem lehet vonat ellenőrző pontot építeni... +STR_ERROR_CAN_T_BUILD_ROAD_WAYPOINT :{WHITE}Ide nem lehet útpontot építeni... STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nem rakhatsz ide bóját... STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Nem lehet megváltoztatni az ellenőrző pont nevét... @@ -5315,6 +5346,7 @@ STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Indíts STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL :{WHITE}Nincs városban építhető út-típus STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Saját NewGRF konfiguráció módosítása STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET :{WHITE}Még nem érhető el városban építhető úttípus +STR_ERROR_NO_TOWN_ROADTYPES_AVAILABLE_YET_EXPLANATION :{WHITE}Indítson új játékot {DATE_SHORT} után, vagy használjon olyan NewGRF-et, amely korai városépítési úttípusokat biztosít # Specific vehicle errors STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Nem haladhatja meg a vonat a megállj jelzést... @@ -5907,6 +5939,7 @@ STR_JUST_DATE_ISO :{DATE_ISO} STR_JUST_STRING :{STRING} STR_JUST_STRING1 :{STRING} STR_JUST_STRING2 :{STRING} +STR_JUST_STRING4 :{STRING} STR_JUST_STRING_STRING :{STRING}{STRING} STR_JUST_RAW_STRING :{STRING} STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING} From 9965cd91511dc02f3cedcefbe637410a164dd735 Mon Sep 17 00:00:00 2001 From: translators Date: Fri, 26 Jul 2024 04:44:30 +0000 Subject: [PATCH 41/41] Update: Translations from eints chinese (traditional): 46 changes by KogentaSan --- src/lang/traditional_chinese.txt | 81 ++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 5ecc285af1..5d399a1ed5 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -380,7 +380,7 @@ STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}打開 ###length 31 STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}暫停遊戲 STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}快轉遊戲 -STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}選項 +STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}選項和設定 STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}儲存遊戲、放棄遊戲、離開 STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}顯示地圖、額外視窗或標誌清單 STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}顯示市鎮清冊 @@ -399,14 +399,14 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}顯示 STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}顯示公司擁有的飛機。 按住 Ctrl 點選以切換是否顯示群組的清單 STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}拉近場景 STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}拉遠場景 -STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}鋪設鐵軌 -STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}鋪設道路 +STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}鋪設鐵路設施 +STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}鋪設道路設施 STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造電車軌 -STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}興建碼頭 +STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}興建水運設施 STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}興建機場 STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}打開地形工具列、提升/降低地面、 植樹等 STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}顯示音效/背景音樂視窗 -STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}顯示上次訊息/新聞報告、顯示訊息選項 +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}顯示上次訊息、新聞報告、歷史訊息或刪除所有訊息 STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}土地資訊、主控台、腳本調試、截圖、關於 OpenTTD STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}切換工具列 @@ -418,14 +418,14 @@ STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD :{BLACK}將開 STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD :{BLACK}將開始時間往後 1 年 STR_SCENEDIT_TOOLBAR_TOOLTIP_SET_DATE :{BLACK}點選可輸入開始年份 STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}顯示地圖和市鎮清冊 -STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}產生地形 -STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}產生市鎮 -STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}產生工業 -STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}建造道路 +STR_SCENEDIT_TOOLBAR_LANDSCAPE_GENERATION :{BLACK}修改或產生地形 +STR_SCENEDIT_TOOLBAR_TOWN_GENERATION :{BLACK}建立或產生市鎮 +STR_SCENEDIT_TOOLBAR_INDUSTRY_GENERATION :{BLACK}建立或產生工業 +STR_SCENEDIT_TOOLBAR_ROAD_CONSTRUCTION :{BLACK}鋪設道路設施 STR_SCENEDIT_TOOLBAR_TRAM_CONSTRUCTION :{BLACK}鋪設電車軌 STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}植樹。按 Ctrl 以對角線選擇區域。按 Shift 可切換種植/顯示預估的種植費用 STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}放置標誌 -STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}放置物件。按 Ctrl 以對角線選擇區域。按 Shift 可切換興建/顯示預估的興建費用。 +STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}放置物件。按住 以對角線選擇區域。按住 可顯示預估成本。 # Scenario editor file menu ###length 7 @@ -611,7 +611,7 @@ STR_GRAPH_OPERATING_PROFIT_CAPTION :{WHITE}營運 STR_GRAPH_INCOME_CAPTION :{WHITE}收入圖表 STR_GRAPH_CARGO_DELIVERED_CAPTION :{WHITE}運送貨物量 STR_GRAPH_COMPANY_PERFORMANCE_RATINGS_CAPTION :{WHITE}公司效率指標 (最高 1000) -STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}公司價值 +STR_GRAPH_COMPANY_VALUES_CAPTION :{WHITE}公司市值圖表 STR_GRAPH_LAST_72_MINUTES_TIME_LABEL :{TINY_FONT}{BLACK}最後 72 分鐘 @@ -623,7 +623,7 @@ STR_GRAPH_CARGO_ENABLE_ALL :{TINY_FONT}{BLA STR_GRAPH_CARGO_DISABLE_ALL :{TINY_FONT}{BLACK}全部停用 STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL :{BLACK}於貨物運費表顯示所有類型的貨物 STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL :{BLACK}於貨物運費表隱藏所有類型的貨物 -STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}切換貨物圖示開關 +STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO :{BLACK}切換該貨物類型圖示 STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLACK}{STRING} STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}顯示詳細營運評比 @@ -820,7 +820,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * 遊 STR_STATUSBAR_AUTOSAVE :{RED}自動儲存 STR_STATUSBAR_SAVING_GAME :{RED}* * 遊戲儲存中 * * -STR_STATUSBAR_SPECTATOR :{WHITE}旁觀者 +STR_STATUSBAR_SPECTATOR :{WHITE}(觀眾) STR_STATUSBAR_INFINITE_MONEY :{WHITE}(無限) # News message history @@ -1455,6 +1455,7 @@ STR_CONFIG_SETTING_PLANE_CRASHES_REDUCED :減少 STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :正常 STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR :可在競爭對手所有的道路或鐵路上建造平交道:{STRING} +STR_CONFIG_SETTING_CROSSING_WITH_COMPETITOR_HELPTEXT :可在競爭對手擁有的道路或鐵路上建設平交道 STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :可在市鎮所屬道路上建設路邊車站:{STRING} STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD_HELPTEXT :容許在市鎮擁有的道路上建造直通型車站。 @@ -1496,6 +1497,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :車輛永不過 STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :如啟用此選項,所有車輛一經面世,就永遠可以選擇建造。 STR_CONFIG_SETTING_TIMEKEEPING_UNITS :時間模式︰{STRING} +STR_CONFIG_SETTING_TIMEKEEPING_UNITS_HELPTEXT :選擇遊戲的計時模式。請注意此選項無法在遊戲進行時更改。{}{}日曆模式是經典的 OpenTTD 體驗,在此模式中,一年由 12 個月組成,每個月有 28-31 天。{}{}在掛鐘模式中,車輛移動、貨物生產和財務計算等都以分鐘為單位,一分鐘大約等於日曆模式中的一個月,即 30 天。此模式下每 12 分鐘即是日曆模式下的一年。{}{}兩種模式都包含一個用來記錄車輛、房屋和其他基礎設施引入日期的計時器 ###length 2 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_CALENDAR :日曆 STR_CONFIG_SETTING_TIMEKEEPING_UNITS_WALLCLOCK :掛鐘 @@ -1542,7 +1544,7 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :設定圖像上 STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :在購買載具介面的下方顯示 NewGRF 的名稱:{STRING} STR_CONFIG_SETTING_SHOW_NEWGRF_NAME_HELPTEXT :在購買載具介面的中增加一行,顯示所選載具來自哪個 NewGRF。 -STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :在車輛列表中顯示車輛可運載之貨物種類 {STRING} +STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS :在車輛列表中顯示車輛可運載之貨物種類︰{STRING} STR_CONFIG_SETTING_SHOW_CARGO_IN_LISTS_HELPTEXT :如啟用此選項,車輛可運輸的負載量會於車輛列表上方顯示。 STR_CONFIG_SETTING_LANDSCAPE :場景:{STRING} @@ -1630,7 +1632,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :暗綠 STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :紫 STR_CONFIG_SETTING_LINKGRAPH_COLOURS :貨物分配圖配色:{STRING} -STR_CONFIG_SETTING_LINKGRAPH_COLOURS_HELPTEXT :設定貨物分配圖的配色。 +STR_CONFIG_SETTING_LINKGRAPH_COLOURS_HELPTEXT :設定貨物分配圖的配色 ###length 4 STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_RED :綠色到紅色(原版) STR_CONFIG_SETTING_LINKGRAPH_COLOURS_GREEN_TO_BLUE :將綠色換為藍色 @@ -1959,7 +1961,7 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :此選項決定 STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :允許市鎮建設平交道:{STRING} STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :啟用此選項以容許市鎮自行興建平交道。 -STR_CONFIG_SETTING_NOISE_LEVEL :允許市鎮限制機場噪音:{STRING} +STR_CONFIG_SETTING_NOISE_LEVEL :根據噪音水平限制機場建造︰{STRING} STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :如停用此選項,只可在每座市鎮興建最多兩座機場。如啟用此選項,在某市鎮興建機場的數目上限由一個綜合的「噪音係數」決定,該係數本身取決於市鎮的大小、機場大小及與市鎮本身的距離等。 STR_CONFIG_SETTING_TOWN_FOUNDING :於遊戲中興建新市鎮:{STRING} @@ -2035,7 +2037,9 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :初始城市規 STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :設定遊戲開始時城市的大小 (相對於一般市鎮而言)。 STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :每{STRING}更新貨物分配圖 +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :兩次連結圖的重新計算間隔。每次重新計算都會計算圖中的一個部分的計劃。這表示此設定的值 X 並不表示整張圖會每 X 秒更新一次。只有一些部分會被更新。設定的越短,計算它所需的 CPU 時間就越多。設定的時間越長,在新航線上開始時貨物分配所需的時間就越長 STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :在貨物分配的重新計算上的費用 {STRING} +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :重新計算每個連結圖組件的時間。當重新計算開始時,會產生一個線程,允許該線程運行此秒數。設定的越短,線程則越有可能無法按時完成,從而令到遊戲運作延遲。設定時間越長,則在線程變更時再分配所需的時間就會越長 STR_CONFIG_SETTING_DISTRIBUTION_PAX :乘客分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :設使有交通路線連接甲、乙兩站。「對稱」指甲站往乙站的乘客數量與乙站往甲站的乘客數量大致相同。「不對稱」指任何一站往另一站的乘客數量皆由系統隨意決定。「手動」指系統不會自動分配乘客的目的地。 @@ -2268,7 +2272,7 @@ STR_LIVERY_SHIP_GROUP_EMPTY :未設立船舶 STR_LIVERY_AIRCRAFT_GROUP_EMPTY :未設立飛機群組 ###length 23 -STR_LIVERY_DEFAULT :標準配色 +STR_LIVERY_DEFAULT :預設配色 STR_LIVERY_STEAM :蒸汽機車 STR_LIVERY_DIESEL :柴油車頭 STR_LIVERY_ELECTRIC :電力車頭 @@ -2423,7 +2427,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}遊戲 STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}設定密碼 STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}如果您不想讓大眾連線的話,可以用密碼保護遊戲 -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}可見性 +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}可見性︰ STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}其他玩家是否能在公開列表中看到你的伺服器 STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} 玩家 STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}用戶端上限: @@ -2456,11 +2460,11 @@ STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}斷線 STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}伺服器受保護,輸入密碼 # Network company list added strings -STR_NETWORK_COMPANY_LIST_CLIENT_LIST :在線玩家 +STR_NETWORK_COMPANY_LIST_CLIENT_LIST :線上玩家 STR_NETWORK_COMPANY_LIST_SPECTATE :旁觀 # Network client list -STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}在線玩家 +STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}線上玩家 STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}伺服器 STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}名稱 STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}你正在遊玩的伺服器名稱 @@ -2649,7 +2653,7 @@ STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}在與Op STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}您正在離開 OpenTTD! STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}在外部網站下載內容的規則及條款可能跟OpenTTD引用的規則及條款不同。{}您需要參照有關網站以取得在OpenTTD安裝有關內容的資訊。{}您要繼續嗎? STR_CONTENT_FILTER_TITLE :{BLACK}過濾條件 (標籤/名稱): -STR_CONTENT_OPEN_URL :{BLACK}訪問網站 +STR_CONTENT_OPEN_URL :{BLACK}網站 STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}請造訪有關網站以取得此內容 STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}下載 STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}開始下載選擇的內容 @@ -2877,20 +2881,22 @@ STR_BRIDGE_TUBULAR_SILICON :管橋,玻璃 # Road construction toolbar STR_ROAD_TOOLBAR_ROAD_CONSTRUCTION_CAPTION :{WHITE}鋪設道路 STR_ROAD_TOOLBAR_TRAM_CONSTRUCTION_CAPTION :{WHITE}鋪設電車軌 -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}鋪設一段公路。 按住 Ctrl 可切換鋪設/拆除模式。按住 Shift 可切換建設/顯示成本預估。 +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_SECTION :{BLACK}鋪設路段。 按住 可拆除路段。按住 可顯示預估成本 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}興建電車軌。 按住 Ctrl 可切換鋪設/拆除模式。按住 Shift 可切換建設/顯示成本預估。 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}使用自動模式鋪設道路。 按住 Ctrl 可切換鋪設/拆除模式。按住 Shift 可切換建設/顯示成本預估。 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}使用自動模式鋪設輕軌。 按住 Ctrl 可切換鋪設/拆除模式。按住 Shift 可切換建設/顯示成本預估。 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}興建車廠 (用來購置及維護車輛)。按住 Shift 可切換建設/顯示成本預估。 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}興建電車機廠 (用來購置及維護電車)。按 Shift 可切換興建/顯示預估的興建費用 +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_ROAD_TO_WAYPOINT :{BLACK}設立道路號誌站。 按住 點選合併號誌站。按住 點選可顯示成本估算 +STR_ROAD_TOOLBAR_TOOLTIP_CONVERT_TRAM_TO_WAYPOINT :{BLACK}設立電車號誌站。 按住 點選合併號誌站。按住 點選可顯示成本估算 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}興建公車站。按住 Ctrl 可興建相鄰車站,按 Shift 可切換興建/顯示預估的興建費用 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}興建載客電車站。按住 Ctrl 可興建相鄰車站,按 Shift 可切換興建/顯示預估的興建費用 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}興建貨運站。按住 Ctrl 可興建相鄰車站,按 Shift 可切換興建/顯示預估的興建費用 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_CARGO_TRAM_STATION :{BLACK}興建載貨電車站。按住 Ctrl 可興建相鄰車站,按 Shift 可切換興建/顯示預估的興建費用 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_ONE_WAY_ROAD :{BLACK}切換單行道/雙向道 -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}興建公路橋樑。按 Shift 可切換興建/顯示預估的興建費用 +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_BRIDGE :{BLACK}興建公路橋樑。按住 點選可顯示預估費用 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_BRIDGE :{BLACK}架設電車橋樑。按 Shift 可切換建造/顯示預估的建造費用 -STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}挖掘公路隧道。按 Shift 可切換建造/顯示預估的建造費用 +STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_TUNNEL :{BLACK}挖掘道路隧道。按住 點選可顯示預估的建造費用 STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_TUNNEL :{BLACK}挖掘電車隧道。按 Shift 可切換建造/顯示預估的建造費用 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_ROAD :{BLACK}切換鋪設/移除公路 STR_ROAD_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}切換鋪設電車軌 @@ -2925,7 +2931,7 @@ STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}興建 STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}興建碼頭。按住 Ctrl 可興建相鄰車站,按 Shift 可切換興建/顯示預估的興建費用 STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}放置浮標,可用作導航點。按 Shift 可切換放置/顯示預估的放置費用 STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}興建水道橋。按 Shift 可切換興建/顯示預估的興建費用 -STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}劃定水域範圍{}開鑿運河,在海平面上按 CTRL 鍵則會淹沒週遭土地 +STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}修建運河。在海平面上按 點選會淹沒週遭土地 STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}劃出河流範圍。按住Ctrl 以對角線選定區域 # Ship depot construction window @@ -3153,7 +3159,7 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :仙人掌 STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :火車站 STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :機棚 STR_LAI_STATION_DESCRIPTION_AIRPORT :機場 -STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :貨運載貨區 +STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :貨運站 STR_LAI_STATION_DESCRIPTION_BUS_STATION :公車站 STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :船塢 STR_LAI_STATION_DESCRIPTION_BUOY :浮標 @@ -3302,6 +3308,7 @@ STR_MAPGEN_DATE_TOOLTIP :{BLACK}選擇 STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工業數量: STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}選擇工業密度,或輸入自訂數字 STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}選擇遊戲版圖內最高峰的海拔,​​以海平面為基準計算 STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}將地圖上最高峰的最大高度增加1 STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}將地圖上最高峰的最大高度減少1 STR_MAPGEN_SNOW_COVERAGE :{BLACK}雪地覆蓋率: @@ -3367,6 +3374,7 @@ STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度 STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度圖名稱: STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}高度圖圖像檔案名稱 STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}大小: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}高度圖圖像的大小。為了獲得最佳效果,每條邊的長度與闊度應與 OpenTTD 內可用的地圖邊長度匹配,例如 256、512、1024 等 STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}最高峰目標高度 @@ -3677,6 +3685,8 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MONTHS :{PUSH_COLOUR}{Y STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION_MINUTES :{PUSH_COLOUR}{YELLOW}贊助市鎮道路網絡重建。{}這將會使到市鎮的交通阻塞 6 分鐘。{}{POP_COLOUR}費用︰{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{PUSH_COLOUR}{YELLOW}建造雕像紀念您的公司。{}使城鎮範圍內的車站獲得永久的評分增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{PUSH_COLOUR}{YELLOW}出資協助市鎮建造新的商業建築。{}使城鎮獲得暫時性的成長速度增益。{}{POP_COLOUR}費用:{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MONTHS :{PUSH_COLOUR}{YELLOW}購買本市鎮 12 個月的專屬運輸權。{}市政府將不許乘客和貨物使用競爭對手的車站。如競爭對手成功賄賂則本合約將被取消。{}{POP_COLOUR}費用︰{CURRENCY_LONG} +STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT_MINUTES :{PUSH_COLOUR}{YELLOW}購買本市鎮 12 分鐘的專屬運輸權。{}市政府將不許乘客和貨物使用競爭對手的車站。如競爭對手成功賄賂則本合約將被取消。{}{POP_COLOUR}費用︰{CURRENCY_LONG} STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{PUSH_COLOUR}{YELLOW}冒著被抓到嚴懲的風險,向地方政府行賄以提高評價{}{POP_COLOUR}費用:{CURRENCY_LONG} # Goal window @@ -3748,7 +3758,7 @@ STR_STORY_BOOK_INVALID_GOAL_REF :{RED}無效的 # Station list window STR_STATION_LIST_TOOLTIP :{BLACK}車站名稱 - 點選名稱可將車站置於畫面中央。按住 Ctrl 點選可於車站位置開啟新視窗視野 -STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}按住 CTRL 選擇多個項目 +STR_STATION_LIST_USE_CTRL_TO_SELECT_MORE :{BLACK}按住 點選可選擇多個項目 STR_STATION_LIST_CAPTION :{WHITE}{COMPANY} - 車站 {COMMA} 座 STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES} STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT} @@ -3892,7 +3902,7 @@ STR_COMPANY_VIEW_ROAD_VEHICLES :{WHITE}車輛 { STR_COMPANY_VIEW_AIRCRAFT :{WHITE}飛機 {COMMA} 架 STR_COMPANY_VIEW_SHIPS :{WHITE}船舶 {COMMA} 艘 STR_COMPANY_VIEW_VEHICLES_NONE :{WHITE}無 -STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}公司價值:{WHITE}{CURRENCY_LONG} +STR_COMPANY_VIEW_COMPANY_VALUE :{GOLD}公司市值:{WHITE}{CURRENCY_LONG} STR_COMPANY_VIEW_INFRASTRUCTURE :{GOLD}基礎建設: STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL :{WHITE}{COMMA} 鐵路區塊 STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD :{WHITE}{COMMA} 道路區塊 @@ -4394,13 +4404,13 @@ STR_VEHICLE_STATUS_WAITING_UNBUNCHING :{LTBLUE}等候 STR_VEHICLE_STATUS_CRASHED :{RED}已撞毀! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}故障 STR_VEHICLE_STATUS_STOPPED :{RED}停止 -STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}正在停止,{VELOCITY} +STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}{VELOCITY} - 正在停止 STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}沒有電力 STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}正在等候路徑開放 STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}與下個目的地相距太遠 STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:STATION} -STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}沒有指令,{VELOCITY} +STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}{VELOCITY} - 沒有指令 STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:WAYPOINT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}{1:VELOCITY} - 正前往 {0:DEPOT} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}{1:VELOCITY} - 正前往 {0:DEPOT} 以進行維護 @@ -4731,6 +4741,7 @@ STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}本時 STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}本時刻表將會在{COMMA}秒後開始 STR_TIMETABLE_START :{BLACK}開始時刻表 +STR_TIMETABLE_START_TOOLTIP :{BLACK}選擇此時刻表的開始時間。如果已完成排定時刻表的調度指令,則按住 點選會根據這些相應的次序均勻分配共享此調度指令的所有車輛的出發時間 STR_TIMETABLE_START_SECONDS_QUERY :距離時刻表開始還有的秒數 @@ -4741,7 +4752,7 @@ STR_TIMETABLE_CLEAR_TIME :{BLACK}清除 STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}清除目前選定指令所設定的時間。按住 Ctrl 點選可清除所有指令的時間。 STR_TIMETABLE_CHANGE_SPEED :{BLACK}修改速度限制 -STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}修改選取指令所設定的最高速度。按住 Ctrl 點選可設定所有指令的速度。 +STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}修改選取指令所設定的最高速度。按住 點選可設定所有指令的速度。 STR_TIMETABLE_CLEAR_SPEED :{BLACK}清除速度限制 STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}清除選取指令所設定的最高速度。按住 Ctrl 點選可清除所有指令的速度。 @@ -4787,7 +4798,7 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}符合 STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}切換比對 AI 記錄訊息是否與中斷點字串相符時是否要符合大小寫 STR_AI_DEBUG_CONTINUE :{BLACK}繼續 STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}取消暫停並繼續 AI -STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}檢視此 AI 的除錯輸出資訊 +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}檢視此 AI 的除錯輸出資訊。按住 點選可開啟新視窗 STR_AI_GAME_SCRIPT :{BLACK}遊戲腳本 STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}檢查遊戲腳本日誌。按住 點選以開啟新視窗 @@ -5000,7 +5011,7 @@ STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}無法 STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}無法興建公司總部... # Town related errors -STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}無法建立市鎮 +STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}無法建立市鎮… STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}無法修改市鎮名稱... STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}不能在此建造市鎮... STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}無法擴展市鎮... @@ -5332,7 +5343,7 @@ STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... 飛 # Extra messages which go on the third line of errors, explaining why orders failed STR_ERROR_NO_RAIL_STATION :{WHITE}沒有火車站 STR_ERROR_NO_BUS_STATION :{WHITE}沒有公車站 -STR_ERROR_NO_TRUCK_STATION :{WHITE}沒有貨車站 +STR_ERROR_NO_TRUCK_STATION :{WHITE}沒有貨運站 STR_ERROR_NO_DOCK :{WHITE}這裡沒有碼頭 STR_ERROR_NO_AIRPORT :{WHITE}沒有機場/直昇機場 STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}沒有兼容此道路類型的站點 @@ -5797,7 +5808,7 @@ STR_COMPANY_SOMEONE :某人 STR_SAVEGAME_DURATION_REALTIME :{NUM} 小時 {NUM} 分鐘 STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING} -STR_SAVEGAME_NAME_SPECTATOR :旁觀者, {1:STRING} +STR_SAVEGAME_NAME_SPECTATOR :觀眾,{1:STRING} # Viewport strings STR_VIEWPORT_TOWN_POP :{WHITE}{TOWN} ({COMMA})