diff --git a/COMPILING.md b/COMPILING.md index 1037ecc609..c9f669bce8 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -71,7 +71,7 @@ that comes with vcpkg. After that, you can run something similar to this: ```powershell mkdir build cd build -cmake.exe .. -G'Visual Studio 16 2019' -DCMAKE_TOOLCHAIN_FILE="\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows-static" +cmake.exe .. -G"Visual Studio 16 2019" -DCMAKE_TOOLCHAIN_FILE="\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows-static" ``` Change `` to where you have installed vcpkg. After this diff --git a/README.md b/README.md index be141e0795..de0da1c951 100644 --- a/README.md +++ b/README.md @@ -429,9 +429,9 @@ For some platforms, you will need to refer to [the installation guide](https://w The free data files, split into OpenGFX for graphics, OpenSFX for sounds and OpenMSX for music can be found at: -- https://www.openttd.org/downloads/opengfx-releases/ for OpenGFX -- https://www.openttd.org/downloads/opensfx-releases/ for OpenSFX -- https://www.openttd.org/downloads/openmsx-releases/ for OpenMSX +- https://www.openttd.org/downloads/opengfx-releases/latest for OpenGFX +- https://www.openttd.org/downloads/opensfx-releases/latest for OpenSFX +- https://www.openttd.org/downloads/openmsx-releases/latest for OpenMSX Please follow the readme of these packages about the installation procedure. The Windows installer can optionally download and install these packages. diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake index ad67a3940a..56d9c475b0 100644 --- a/cmake/CompileFlags.cmake +++ b/cmake/CompileFlags.cmake @@ -45,6 +45,11 @@ macro(compile_flags) add_link_options( "$<$>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0 ) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + add_link_options( + "$<$:-Wl,--disable-dynamicbase,--disable-high-entropy-va,--default-image-base-low>" # ASLR somehow breaks linking for x64 Debug builds + ) + endif() endif() # Prepare a generator that checks if we are not a debug, and don't have asserts diff --git a/src/gfx.cpp b/src/gfx.cpp index 56b0635508..eebf8f7fb6 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -24,6 +24,7 @@ #include "window_gui.h" #include "framerate_type.h" #include "transparency.h" +#include "core/backup_type.hpp" #include "table/palettes.h" #include "table/string_colours.h" @@ -1215,39 +1216,58 @@ static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mo * Draws a sprite to a new RGBA buffer (see Colour union) instead of drawing to the screen. * * @param spriteId The sprite to draw. + * @param zoom The zoom level at which to draw the sprites. * @return Pixel buffer, or nullptr if an 8bpp blitter is being used. */ -std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId) +std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zoom) { + /* Invalid zoom level requested? */ + if (zoom < _settings_client.gui.zoom_min || zoom > _settings_client.gui.zoom_max) return nullptr; + Blitter *blitter = BlitterFactory::GetCurrentBlitter(); - if (!blitter->Is32BppSupported()) return nullptr; + if (blitter->GetScreenDepth() != 8 && blitter->GetScreenDepth() != 32) return nullptr; /* Gather information about the sprite to write, reserve memory */ const SpriteID real_sprite = GB(spriteId, 0, SPRITE_WIDTH); const Sprite *sprite = GetSprite(real_sprite, ST_NORMAL); - std::unique_ptr result(new uint32[sprite->width * sprite->height]); + Dimension dim = GetSpriteSize(real_sprite, nullptr, zoom); + std::unique_ptr result(new uint32[dim.width * dim.height]); + /* Set buffer to fully transparent. */ + MemSetT(result.get(), 0, dim.width * dim.height); /* Prepare new DrawPixelInfo - Normally this would be the screen but we want to draw to another buffer here. * Normally, pitch would be scaled screen width, but in our case our "screen" is only the sprite width wide. */ DrawPixelInfo dpi; dpi.dst_ptr = result.get(); - dpi.pitch = sprite->width; + dpi.pitch = dim.width; dpi.left = 0; dpi.top = 0; - dpi.width = sprite->width; - dpi.height = sprite->height; - dpi.zoom = ZOOM_LVL_NORMAL; + dpi.width = dim.width; + dpi.height = dim.height; + dpi.zoom = zoom; + + /* If the current blitter is a paletted blitter, we have to render to an extra buffer and resolve the palette later. */ + std::unique_ptr pal_buffer{}; + if (blitter->GetScreenDepth() == 8) { + pal_buffer.reset(new byte[dim.width * dim.height]); + MemSetT(pal_buffer.get(), 0, dim.width * dim.height); - /* Zero out the allocated memory, there may be garbage present. */ - uint32 *writeHead = (uint32*)result.get(); - for (int i = 0; i < sprite->width * sprite->height; i++) { - writeHead[i] = 0; + dpi.dst_ptr = pal_buffer.get(); } /* Temporarily disable screen animations while blitting - This prevents 40bpp_anim from writing to the animation buffer. */ - _screen_disable_anim = true; - GfxBlitter<1, false>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, ZOOM_LVL_NORMAL, &dpi); - _screen_disable_anim = false; + Backup disable_anim(_screen_disable_anim, true, FILE_LINE); + GfxBlitter<1, true>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, zoom, &dpi); + disable_anim.Restore(); + + if (blitter->GetScreenDepth() == 8) { + /* Resolve palette. */ + uint32 *dst = result.get(); + const byte *src = pal_buffer.get(); + for (size_t i = 0; i < dim.height * dim.width; ++i) { + *dst++ = _cur_palette.palette[*src++].data; + } + } return result; } diff --git a/src/gfx_func.h b/src/gfx_func.h index fba26984da..ead2ff8e1c 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -92,7 +92,7 @@ void RedrawScreenRect(int left, int top, int right, int bottom); Dimension GetSpriteSize(SpriteID sprid, Point *offset = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI); void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr); void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI); -std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId); +std::unique_ptr DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zoom = ZOOM_LVL_GUI); int DrawString(int left, int right, int top, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL); int DrawString(int left, int right, int top, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL); diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 9dc8c7e31b..50f1bfcbc7 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1750,6 +1750,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Exibe um jornal STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Acidentes / desastres: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Exibir jornal quando acidentes ou desastres acontecem +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Acidentes de veículos dos competidores: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Mostrar um jornal sobre os acidentes de veículos dos competidores STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informações da empresa: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Exibe um jornal quando uma companhia é aberta, ou quando estão próximas da bancarrota diff --git a/src/lang/czech.txt b/src/lang/czech.txt index b74135b91c..60be9b9d5e 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1996,6 +1996,7 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Zobrazovat novi STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Nehody a katastrofy: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Zobrazovat noviny o nehodách a katastrofách +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Nehody konkurenčních vozidel: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informace o společnosti: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Zobrazovat noviny když společnost začne nebo hrozí krach @@ -2617,6 +2618,7 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Prostř STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Velikost mapy: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Verze hry na serveru: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Adresa serveru: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Zvací kód: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Počáteční datum: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Současné datum: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Herní skript: {WHITE}{STRING} (v{NUM}) @@ -2642,7 +2644,7 @@ STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Spustit STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}Spustit vlastní server STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}Zadej své jméno -STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Zadej adresu serveru nebo kód pozvánky +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}Zadej adresu serveru nebo zvací kód # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}Začít novou hru @@ -2698,8 +2700,8 @@ STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Upravte STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Název serveru STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Viditelnost STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Zda mohou ostatní hráči vidět váš server ve veřejném seznamu -STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Pozvánkový kód -STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Kód pozvánky, který mohou ostatní hráči použít k připojení k tomuto serveru. +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE :{BLACK}Zvací kód +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}Zvací kód, který mohou ostatní hráči použít k připojení k tomuto serveru. STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}Typ spojení STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Jestli a jak může být tvůj server dostupný pro ostatní STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Hráč @@ -3037,6 +3039,7 @@ STR_STATION_CLASS_WAYP :Směrování # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Výběr návěstidel +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Zobrazit dokonalejší návěstidla STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Obyčejné návěstidlo (semafor){}Návěstidla jsou nutná, aby nedocházelo ke srážkám vlaků na tratích, kde jezdí více než jeden vlak STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Vjezdové návěstidlo (semafor){}Svítí zeleně do té doby, kdy v následujícím úseku trati je alespoň jedno další svítící zeleně. Jinak svítí červeně STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Výjezdové návěstidlo (semafor){}Chová se stejně jako obyčejné, ale je nezbytné nastavit správnou barvu vjezdových a kombinovaných pre-signálů diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 7237600c9a..648382c2e6 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -850,7 +850,7 @@ STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLAC STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}Nova {STRING} asentada preto de {TOWN}! STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLACK}{STRING} anuncia o seu peche inminente! -STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}Problemas de subministración en {STRING} provocan que anuncie o seu peche inminente! +STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}Problemas de abastecemento en {STRING} provocan que anuncie o seu peche inminente! STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}A falta de árbores cercanos provoca que {STRING} anuncie o peche inminente! STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}Unión Económica e Monetaria Europea!{}{}O Euro introdúcese como a única moeda para as transaccións diarias no teu país! @@ -2622,7 +2622,7 @@ STR_STATION_BUILD_COVERAGE_ON :{BLACK}On STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP :{BLACK}Non resalta-la área de cobertura do sitio proposto STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP :{BLACK}Resalta-la área de cobertura do sitio proposto STR_STATION_BUILD_ACCEPTS_CARGO :{BLACK}Acepta: {GOLD}{CARGO_LIST} -STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Suministros: {GOLD}{CARGO_LIST} +STR_STATION_BUILD_SUPPLIES_CARGO :{BLACK}Abastecementos: {GOLD}{CARGO_LIST} # Join station window STR_JOIN_STATION_CAPTION :{WHITE}Unir estación @@ -3559,7 +3559,7 @@ STR_STATION_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Puntuacións: STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Mostra-las puntuacións da estación -STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Suministro mensual e puntuación local: +STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Abastecemento mensual e puntuación local: STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%) STR_STATION_VIEW_GROUP :{BLACK}Agrupar por @@ -5116,7 +5116,7 @@ STR_INDUSTRY_NAME_DIAMOND_MINE :Mina de diamant STR_INDUSTRY_NAME_IRON_ORE_MINE :Mina de ferro STR_INDUSTRY_NAME_FRUIT_PLANTATION :Plantación de froita STR_INDUSTRY_NAME_RUBBER_PLANTATION :Plantación de sobreiras -STR_INDUSTRY_NAME_WATER_SUPPLY :Subministro de auga +STR_INDUSTRY_NAME_WATER_SUPPLY :Abastecemento de auga STR_INDUSTRY_NAME_WATER_TOWER :Torre de auga STR_INDUSTRY_NAME_FACTORY_2 :Fábrica STR_INDUSTRY_NAME_FARM_2 :Granxa diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 294fc433e9..0a073879bb 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1813,6 +1813,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Újság megjele STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Balesetek / természeti csapások: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Újság megjelenítése balesetek vagy katasztrófák bekövetkezésekor +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Konkurens vállalatok járműveinek balesetei: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Újság megjelenítése, ha valamelyik konkurens vállalat egy járműve balesetet szenved STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Vállalati információk: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Újság megjelenítése amikor egy új cég alapul vagy csődközelbe kerül @@ -2328,6 +2330,7 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Tájtí STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}A térkép nagysága: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Szerver verzió: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}A szerver címe: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Meghívókód: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Kezdési dátum: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Jelenlegi dátum: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Játékszkript: {WHITE}{STRING} (v{NUM}) @@ -2743,7 +2746,8 @@ STR_STATION_CLASS_DFLT :Alapértelmezet STR_STATION_CLASS_WAYP :Ellenőrző pontok # Signal window -STR_BUILD_SIGNAL_CAPTION :{WHITE}Jelző választó +STR_BUILD_SIGNAL_CAPTION :{WHITE}Jelzőválasztó +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Mutassa vagy ne mutassa az összes jelzőtípust STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Normál jelző (alak){}A legegyszerűbb jelzőtípus, az előtte lévő jelzőblokkba egyszerre csak egy vonatot enged tartózkodni STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Bejárati jelző (alak){}Mindaddig szabad, amíg van legalább egy szabad kijárati jelző az utána következő szakaszon. Egyébként Megálljt jelez STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Kijárati jelző (alak){}Ugyanúgy viselkedik mint a normál jelző, de megléte elengedhetetlenül szükséges a bejárati- és a kombinált jelzők működéséhez diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 833d3a689d..f08d3c0dae 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -209,7 +209,7 @@ STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA}{NBSP}tona -STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}{P "th" "th" "th" "dt" "th"}ona +STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}{P "th" "th" "th" "dt" "t"}ona STR_UNITS_WEIGHT_LONG_SI :{COMMA}{NBSP}kg STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}{NBSP}gal @@ -860,7 +860,7 @@ STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL :{BIG_FONT}{BLAC STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_COAL :{BIG_FONT}{BLACK}Aimsítear síog ghuail nua ag {INDUSTRY}!{}Meastar go dtiocfaidh méadú faoi dhó ar tháirgeadh! STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_OIL :{BIG_FONT}{BLACK}Aimsítear stoc ola nua ag {INDUSTRY}!{}Meastar go dtiocfaidh méadú faoi dhó ar tháirgeadh! STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM :{BIG_FONT}{BLACK}Meastar go dtiocfaidh méadú faoi dhó ar tháirgeadh ag {INDUSTRY} mar gheall ar feabhsuithe sna modhanna feirmeoireachta! -STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH :{BIG_FONT}{BLACK}Tagann méadú ar tháirgeadh {STRING} ag {INDUSTRY} de {COMMA}%! +STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH :{BIG_FONT}{BLACK}Tháing méadú {2:COMMA}% ar tháirgeadh '{0:STRING}' ag {1:INDUSTRY}! STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL :{BIG_FONT}{BLACK}Tagann laghdú 50% ar tháirgeadh ag {INDUSTRY} STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}Déantar robach de bharr inmhíolú feithidí ag {INDUSTRY}!{}Lagdhú 50% ar tháirgeadh STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK}Tagann laghdú ar tháirgeadh {STRING} ag {INDUSTRY} de {COMMA}%! @@ -1036,7 +1036,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Roghnaig STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(uath-aimsiú) STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Gnáth STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Méid dúbailte -STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Méid cheathrúil +STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Méid 4x STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Méid na clófhoirne STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Roghnaigh méid na clófhoirne don chomhéadan a úsáidfear @@ -1744,6 +1744,7 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Taispeáin nuac STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Timpistí / tubaistí: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Taispeáin nuachtán nuair a thiteann timpistí nó tubaistí amach +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Timpistí de chuid fheithiclí na n-iomaitheoirí: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Faisnéis cuideachta: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Taispeáin nuachtán nuair a thosaíonn cuideachta nua, nó nuair atá cuideachta i mbaol féimheachta @@ -2257,6 +2258,7 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Tírdhr STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Méid na léarscáile: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Leagan an fhreastalaí: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Seoladh an fhreastalaí: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Cód an chuiridh: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Dáta tosaigh: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Dáta reatha: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Script Cluiche: {WHITE}{STRING} (v{NUM}) diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 1842e7adb0..e50773cffe 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -334,6 +334,7 @@ STR_GROUP_BY_NONE :Nessuno STR_GROUP_BY_SHARED_ORDERS :Ordini condivisi # Order button in shared orders vehicle list +STR_GOTO_ORDER_VIEW :{BLACK}Ordini # Tooltips for the main toolbar ###length 31 @@ -800,6 +801,7 @@ STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * I STR_STATUSBAR_AUTOSAVE :{RED}SALVATAGGIO AUTOMATICO STR_STATUSBAR_SAVING_GAME :{RED}* * SALVATAGGIO PARTITA * * +STR_STATUSBAR_SPECTATOR :{WHITE}(spettatore) # News message history STR_MESSAGE_HISTORY :{WHITE}Cronologia messaggi @@ -1487,6 +1489,7 @@ STR_CONFIG_SETTING_SNOW_COVERAGE :Aree innevate: STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Aree desertiche: {STRING} +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Regola la quantità approssimativa di deserto nei paesaggi tropicali. Il deserto influenza anche la generazione di industrie. Usato esclusivamente durante la generazione della mappa STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregolarità del terreno: {STRING} @@ -1755,6 +1758,7 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Mostra un giorn STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Incidenti / disastri: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Mostra un giornale quando si verificano incidenti o disastri +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Incidenti dei veicoli dell'avversario: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informazioni sulla compagnia: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Mostra un giornale quando una compagnia viene lanciata, o quando rischia il fallimento @@ -1838,6 +1842,7 @@ STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :Solo segnali a STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :Tutti ###length 2 +STR_CONFIG_SETTING_SIGNAL_GUI_MODE_ALL_CYCLE_PATH :Tutti i segnali STR_CONFIG_SETTING_TOWN_LAYOUT :Disposizione delle strade per le nuove città: {STRING} STR_CONFIG_SETTING_TOWN_LAYOUT_HELPTEXT :Orgnalizzazione della rete stradale delle città @@ -2340,6 +2345,8 @@ STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP :{BLACK}Se e com STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Giocatore STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Il nome del tuo personaggio STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP : {BLACK}Modifica il nome del tuo personaggio +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :Nome del tuo personaggio +STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}Invia un messaggio a questo giocatore STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Manda un messaggio a tutti gli spettatori STR_NETWORK_CLIENT_LIST_SPECTATORS :Spettatori STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Crea una nuova compagnia e controllala @@ -2469,6 +2476,7 @@ STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Il serve STR_NETWORK_MESSAGE_KICKED :*** {STRING} è stato espulso. Motivo: ({STRING}) STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}Registrazione al server fallita +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}Il tuo server non permette connessioni remote STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}Altri giocatori non saranno in grado di connettersi al tuo server # Content downloading window @@ -3104,6 +3112,8 @@ STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Numero c STR_MAPGEN_DATE :{BLACK}Data: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Numero industrie: STR_MAPGEN_HEIGHTMAP_HEIGHT :{WHITE}Picco massimo: +STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Aumenta la massima altezza del picco più alto sulla mappa di uno +STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Diminuisci la massima altezza del picco più alto sulla mappa di uno STR_MAPGEN_SNOW_COVERAGE :{BLACK}Aree innevate: STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Aumenta la copertura della neve del dieci per cento STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Diminuisci la copertura della neve del dieci per cento @@ -3280,6 +3290,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}Attenzione STR_NEWGRF_ERROR_MSG_ERROR :{RED}Errore: {SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}Errore irreversibile: {SILVER}{STRING} STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Si è verificato un errore irreversibile nel NewGRF:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}Si è verificato un errore in un NewGRF:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} non funziona con la versione di TTDPatch riferita da OpenTTD STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} è per la versione {STRING} di TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} è progettato per essere usato con {STRING} @@ -4117,6 +4128,7 @@ STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Manuten STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}Impossibile raggiungere {STATION}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}Impossibile raggiungere {WAYPOINT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}Impossibile raggiungere {DEPOT}, {VELOCITY} # Vehicle stopped/started animations ###length 2 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 27070bd6cb..926f2c58bb 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1752,6 +1752,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Vise nyhetsoppd STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Ulykker / katastrofer: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Vise nyhetsoppdatering når ulykker eller katastrofer inntreffer +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Ulykker med konkurrentens kjøretøy: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Vis en avis om havarerte kjøretøy for konkurrenter STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Firmainformasjon: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Vise nyhetsoppdatering når nye selskaper starter opp, eller når selskaper er konkurstruet @@ -2267,6 +2269,7 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Landska STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Kartstørrelse: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Tjenerversjon: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Tjeneradresse: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Invitasjonskode: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Startdato: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Nettverksdato: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Spillskript: {WHITE}{STRING} (v{NUM}) @@ -2684,6 +2687,7 @@ STR_STATION_CLASS_WAYP :Kontrollpunkter # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Signalvalg +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Veksle mellom visning av avanserte signaltyper STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Blokksignal (vingesignal){}Dette er den enkleste typen av signaler som tillater kun ett tog å kjøre om gangen. STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Inngangssignal (vingesignal){}Grønt så lenge det er ett eller flere grønne utgangssignal fra etterfølgende sporseksjon. Ellers rødt. STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Utgangssignal (vingesignal){}Oppfører seg på samme måte som et blokksignal, men er nødvendig for å utløse riktig farge på inngangs- og kombinasjons-forsignaler. diff --git a/src/lang/polish.txt b/src/lang/polish.txt index cd0d529349..701ac70e3d 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2129,6 +2129,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Wyświetl wiado STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Wypadki / klęski: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Wyświetl wiadomość w gazecie kiedy zdarzy się wypadek lub nastąpi katastrofa +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Wypadki pojazdów konkurentów: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Wyświetl wiadomość w gazecie o rozbitych pojazdach konkurentów STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Informacja firmy: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Wyświetl wiadomość w gazecie kiedy powstaje nowa firma lub kiedy istniejącym firmom grozi bankructwo diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 4a9bd93de5..655d33317d 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1749,6 +1749,7 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Visa nyhetstidn STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Olyckor / katastrofer: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Visa nyhetstidning när olyckor eller katastrofer inträffar +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Olyckor med konkurrenters fordon: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Företagsinformation: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Visa nyhetstidning när nya företag startar upp eller när ett befintligt företag riskerar att gå bankrupt diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 3c5ef7fce2..eaf21620be 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -188,6 +188,7 @@ STR_COLOUR_ORANGE :橙 STR_COLOUR_BROWN :棕 STR_COLOUR_GREY :灰 STR_COLOUR_WHITE :白 +STR_COLOUR_RANDOM :隨機 # Units used in OpenTTD STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}英里/小時 @@ -268,6 +269,7 @@ STR_SHOW_HIDDEN_ENGINES_VEHICLE_AIRCRAFT_TOOLTIP :{BLACK}如啟 STR_BUTTON_DEFAULT :{BLACK}預設值 STR_BUTTON_CANCEL :{BLACK}取消 STR_BUTTON_OK :{BLACK}確定 +STR_WARNING_PASSWORD_SECURITY :{YELLOW}警告: 伺服器管理者可能可以閱讀在此處輸入的任何文字訊息 # On screen keyboard window STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ . @@ -317,9 +319,13 @@ STR_SORT_BY_RANGE :範圍 STR_SORT_BY_POPULATION :人口 STR_SORT_BY_RATING :評價 STR_SORT_BY_NUM_VEHICLES :車輛數量 +STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :去年總盈利 +STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :今年總盈利 +STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :去年平均盈利 # Group by options for vehicle list STR_GROUP_BY_NONE :無 +STR_GROUP_BY_SHARED_ORDERS :共享指令 # Order button in shared orders vehicle list @@ -368,6 +374,7 @@ 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}植樹。按 Shift 可切換種植/顯示預估的種植費用 STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}放置標誌 STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}放置物件。按 Shift 可切換興建/顯示預估的興建費用 @@ -782,6 +789,7 @@ STR_STATUSBAR_PAUSED :{YELLOW}* * STR_STATUSBAR_AUTOSAVE :{RED}自動儲存 STR_STATUSBAR_SAVING_GAME :{RED}* * 遊戲儲存中 * * +STR_STATUSBAR_SPECTATOR :{WHITE}旁觀者 # News message history STR_MESSAGE_HISTORY :{WHITE}訊息記錄 @@ -883,7 +891,12 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION 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} 的公司將得到地方政府補助{NUM}年! ###length 4 +STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務可在往後{NUM}年收到額外 50% 的運費補助! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務可在往後{NUM}年收到雙倍運費補助! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務可在往後{NUM}年收到三倍運費補助! +STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}{STRING} 獲得補助!{}{}將 {STRING} 從 {STRING} 運到 {STRING} 的服務可在往後{NUM}年收到四倍運費補助! STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}{TOWN} 交通大亂!{}{}{STRING} 出資的道路重建計劃為用路人帶來六個月的惡夢! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}運輸大亨! @@ -923,7 +936,7 @@ STR_GAME_OPTIONS_CURRENCY_NLG :荷蘭盾 (NLG) STR_GAME_OPTIONS_CURRENCY_NOK :挪威克朗 (NOK) STR_GAME_OPTIONS_CURRENCY_PLN :波蘭茲羅提 (PLN) STR_GAME_OPTIONS_CURRENCY_RON :羅馬尼亞列伊 (RON) -STR_GAME_OPTIONS_CURRENCY_RUR :俄羅斯盧布 (RUR) +STR_GAME_OPTIONS_CURRENCY_RUR :俄羅斯舊盧布 (RUR) STR_GAME_OPTIONS_CURRENCY_SIT :斯洛文尼亞托拉 (SIT) STR_GAME_OPTIONS_CURRENCY_SEK :瑞典克朗 (SEK) STR_GAME_OPTIONS_CURRENCY_TRY :土耳其里拉 (TRY) @@ -936,13 +949,17 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :南非蘭特 (Z STR_GAME_OPTIONS_CURRENCY_CUSTOM :自訂... STR_GAME_OPTIONS_CURRENCY_GEL :喬治亞拉里 (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :伊朗里亞爾 (IRR) +STR_GAME_OPTIONS_CURRENCY_RUB :俄羅斯盧布 (RUB) +STR_GAME_OPTIONS_CURRENCY_CNY :中國人民幣(CNY) STR_GAME_OPTIONS_CURRENCY_HKD :港幣 (HKD) +STR_GAME_OPTIONS_CURRENCY_INR :印度盧比(INR) +STR_GAME_OPTIONS_CURRENCY_IDR :印尼盾 (IDR) ###length 2 STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :靠左行駛 STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :靠右行駛 -STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}市鎮名稱 +STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}市鎮名稱: STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}選擇市鎮命名風格 ###length 21 @@ -989,8 +1006,13 @@ STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}勾選 STR_GAME_OPTIONS_RESOLUTION :{BLACK}螢幕解析度 STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}選擇螢幕解析度 STR_GAME_OPTIONS_RESOLUTION_OTHER :其它 +STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM} +STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}硬體加速 +STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}勾選此方框以允許OpenTTD嘗試使用硬體加速。設定將會在遊戲重新啟動後套用 +STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync +STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}勾選此方框以啟用V-SYNC。此項設定將會在遊戲重啟後套用。只有在硬體加速存在時可用 STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}介面大小 STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}選擇使用的介面元素大小 @@ -1000,8 +1022,13 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :兩倍大小 STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :四倍大小 +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(自動偵測) +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :兩倍大小 +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :四倍大小 +STR_GAME_OPTIONS_GRAPHICS :{BLACK}圖形 +STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz STR_GAME_OPTIONS_BASE_GRF :{BLACK}基本圖形集 STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}選擇要使用的基本圖形集 @@ -1103,6 +1130,7 @@ STR_TERRAIN_TYPE_FLAT :平坦 STR_TERRAIN_TYPE_HILLY :丘陵 STR_TERRAIN_TYPE_MOUNTAINOUS :高山 STR_TERRAIN_TYPE_ALPINIST :多山 +STR_TERRAIN_TYPE_CUSTOM :自訂高度 STR_TERRAIN_TYPE_CUSTOM_VALUE :自訂高度({NUM}) ###length 3 @@ -1117,6 +1145,7 @@ STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}顯示 STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}篩選字串: STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}展開所有選項 STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}折疊所有選項 +STR_CONFIG_SETTING_RESET_ALL :{BLACK}重設所有數值 STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(沒有適用的解釋) STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}預設值: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE :{LTBLUE}設定種類: {ORANGE}{STRING} @@ -1125,6 +1154,7 @@ STR_CONFIG_SETTING_TYPE_GAME_MENU :遊戲設定 ( STR_CONFIG_SETTING_TYPE_GAME_INGAME :遊戲設定 (存檔時保存;僅影響現時開啟的遊戲) STR_CONFIG_SETTING_TYPE_COMPANY_MENU :公司設定 (存檔時保存;僅在往後建立的新遊戲生效) STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :公司設定 (存檔時保存;僅影響您正在控制的公司) +STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}此操作將會還原所有遊戲設定至預設狀態{}你確定要進行此操作嗎? STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}篩選設定: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}適用範圍: @@ -1187,8 +1217,10 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :控制維修不 STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :補助倍率: {STRING} STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :設定獲補助服務的總利潤金額相對原有利潤的倍率 +STR_CONFIG_SETTING_SUBSIDY_DURATION :補助持續時間: {STRING} ###setting-zero-is-special +STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :沒有補貼 STR_CONFIG_SETTING_CONSTRUCTION_COSTS :建造成本: {STRING} STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :設定建造和購買物件的成本水平 @@ -1205,8 +1237,10 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :切換那些有 STR_CONFIG_SETTING_CITY_APPROVAL :地方政府對地區結構重組的態度: {STRING} STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :選擇公司所製造的噪音和環境傷害對其在市鎮的評比及未來的建設行動會造成多大影響 +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :地圖高度限制: {STRING} +STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM} ###setting-zero-is-special -STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}您不能把地圖的最高高度設成此值。至少有一座山比這個高度更高。 +STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}您不能把地圖的最大高度限制設成此值。至少有一座山比這個高度更高。 STR_CONFIG_SETTING_AUTOSLOPE :允許在建築物或軌道底下改變地形斜度 (autoslope):{STRING} STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :可以在建築物或軌道底下改變地形而不需移除它們 @@ -1335,6 +1369,7 @@ STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}當有 STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :基礎建設維護: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :如啟用此選項,基礎建設會產生維護成本。該成本的增長會根據公司基礎建設的規模而加倍增大,因此該設定對大公司的影響比對小公司更大 +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :選擇公司的初始顏色 STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :機場永不過期:{STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :如啟用此選項,所有機場一經面世,就永遠可以選擇建設 @@ -1406,6 +1441,7 @@ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :雪線高度: STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :此設定控制在「寒帶」地圖中雪地開始出現的高度。除了外觀的不同外,雪地也會影響工業設施的分佈以及市鎮成長的條件 +STR_CONFIG_SETTING_DESERT_COVERAGE :沙漠覆蓋率: {STRING} STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :地形起伏度 (只適用於 TerraGenesis):{STRING} @@ -1459,6 +1495,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :暗綠 STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :紫 ###length 4 +STR_CONFIG_SETTING_SCROLLMODE_RMB :使用右鍵移動地圖 STR_CONFIG_SETTING_SCROLLMODE_LMB :使用左鍵移動地圖 STR_CONFIG_SETTING_SMOOTH_SCROLLING :視野平滑移動:{STRING} @@ -1495,7 +1532,9 @@ STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :雙撳 STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :單撳 (選定輸入方塊時) STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK :單撳 (立刻) +STR_CONFIG_SETTING_USE_RELAY_SERVICE :使用中繼服務: {STRING} ###length 3 +STR_CONFIG_SETTING_USE_RELAY_SERVICE_ALLOW :允許 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :右鍵模擬:{STRING} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_HELPTEXT :選擇模擬右撳鼠鍵的方法 @@ -1504,6 +1543,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command 鍵 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Control 鍵 STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :無 +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :右鍵關閉視窗: {STRING} +STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :在視窗內以右鍵點擊可關閉視窗。可用右鍵關閉工具提示 STR_CONFIG_SETTING_AUTOSAVE :自動儲存: {STRING} STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :選擇自動存檔的週期 @@ -1557,8 +1598,12 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :設定是否在 STR_CONFIG_SETTING_EXPENSES_LAYOUT :將公司財務視窗的收支分組顯示:{STRING} STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :決定是否將公司財務視窗內的收支項目分組顯示 +STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :在鋪設軌道時自動移除號誌: {STRING} +STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :自動移除軌道鋪設路徑上的號誌。請注意:本設定有導致火車事故的潛在風險 +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% 正常遊戲速度 ###setting-zero-is-special +STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :無限制(以電腦可行的最快速度) STR_CONFIG_SETTING_SOUND_TICKER :新聞提示: {STRING} STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :總結新訊息時播放音效 @@ -1654,6 +1699,7 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :當對手設立 STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :事故/災難: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :當事故或災難發生時顯示報紙訊息 +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :顯示有關對手公司事故運具的報紙 STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :公司資訊: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :當一所公司開始營業或倒閉破產時顯示報紙訊息 @@ -1705,10 +1751,12 @@ STR_CONFIG_SETTING_ENDING_YEAR_ZERO :永不 ###length 3 STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :原版 +STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :平滑 STR_CONFIG_SETTING_ALLOW_SHARES :允許購買其它公司的股票:{STRING} STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :啟用此選項以容許公司買賣股票。一所公司必須達到一定的年齡方能買賣股票 +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :設定容許公司買賣股票的最小年齡 STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :轉運服務所得的收入百分比: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :設定進行轉運的運輸工具在卸載被轉運的貨物時,獲得的收入佔貨物總收入的百分比。此選項讓玩家更有效地控制收入分配方式 @@ -1723,11 +1771,12 @@ STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :自動在指定 STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE_HELPTEXT :設定使用燈號號誌的年份。在遊戲進行到那一年之前,系統會預設豎立懸臂號誌 STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES :按住 Ctrl 點選號誌時要切換的號誌種類:{STRING} -STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :選擇可透過 Ctrl+單撳 更換的號誌類型 +STR_CONFIG_SETTING_CYCLE_SIGNAL_TYPES_HELPTEXT :選擇可透過 Ctrl+點擊 更換的號誌類型 ###length 2 STR_CONFIG_SETTING_CYCLE_SIGNAL_PBS :僅限路徑號誌 -STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :所有號誌 +STR_CONFIG_SETTING_CYCLE_SIGNAL_ALL :所有可見的號誌 +STR_CONFIG_SETTING_SIGNAL_GUI_MODE :顯示號誌類型: {STRING} ###length 2 STR_CONFIG_SETTING_SIGNAL_GUI_MODE_PATH :僅限路徑號誌 @@ -1755,11 +1804,13 @@ STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :禁止 STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :允許 STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :允許,可自訂市鎮道路配置 +STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :貨物的產出速度取決於城市中的房屋,與城市的總人口數相關。{}二次方: 兩倍人口的都市產出四倍量的貨物{}線性: 兩倍人口的都市產出兩倍量的貨物 ###length 2 STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :遊戲中產生樹木的地點:{STRING} STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :控制遊戲內是否隨意種植樹木。此選項可能會影響一些依賴樹木的工業 (例如熱帶氣候的伐木場) ###length 4 +STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :在任意地點皆可生長與擴散 STR_CONFIG_SETTING_TOOLBAR_POS :主工具列位置:{STRING} STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :設定主工具列在螢幕頂部的位置 @@ -1902,6 +1953,7 @@ STR_CONFIG_SETTING_ENVIRONMENT_INDUSTRIES :{ORANGE}工業 STR_CONFIG_SETTING_ENVIRONMENT_CARGODIST :{ORANGE}貨物分配 STR_CONFIG_SETTING_AI :{ORANGE}競爭對手 STR_CONFIG_SETTING_AI_NPC :{ORANGE}電腦玩家 +STR_CONFIG_SETTING_NETWORK :{ORANGE}網路 STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :列車的路徑搜尋方式:{STRING} STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS_HELPTEXT :設定列車使用的路徑搜尋方式 @@ -1938,6 +1990,7 @@ STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}記憶 STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}無法編配{BYTES}作為子畫面快取。子畫面快取的大小已降至{BYTES}。OpenTTD的效能會受到影響。請嘗試停用32bpp圖形及/或減少放大倍數,以減低記憶體要求 # Video initalization errors +STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}...找不到相容的顯示卡裝置,硬體加速已被停用 # Intro window STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} @@ -1981,6 +2034,7 @@ STR_INTRO_TRANSLATION :{BLACK}此段 # Quit window STR_QUIT_CAPTION :{WHITE}離開 +STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}您確定要關閉OperTTD嗎? STR_QUIT_YES :{BLACK}是 STR_QUIT_NO :{BLACK}否 @@ -1992,6 +2046,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}你確 # Cheat window STR_CHEATS :{WHITE}作弊 STR_CHEATS_TOOLTIP :{BLACK}方塊被勾選代表您用過這個密技 +STR_CHEATS_NOTE :{BLACK}請注意:任何修改這些設定的操作將會被記錄於遊戲存檔中 STR_CHEAT_MONEY :{LTBLUE}增加金錢:{CURRENCY_LONG} STR_CHEAT_CHANGE_COMPANY :{LTBLUE}切換玩家操控的公司:{ORANGE}{COMMA} STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}神奇推土機 (可摧毀工業、無法移除的物件):{ORANGE}{STRING} @@ -2106,6 +2161,8 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}改變 # Matches ServerGameType ###length 3 +STR_NETWORK_SERVER_VISIBILITY_PUBLIC :公開 +STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY :僅限邀請加入 # Network server list STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}多人遊戲 @@ -2136,12 +2193,14 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}場景 STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}地圖大小:{WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}伺服器版本:{WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}伺服器位址:{WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}邀請碼: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}開始日期:{WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}目前日期:{WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}遊戲腳本:{WHITE}{STRING} (v{NUM}) STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}受密碼保護! STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}伺服器離線 STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}伺服器已滿 +STR_NETWORK_SERVER_LIST_SERVER_TOO_OLD :{SILVER}伺服器太舊 STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}版本不符 STR_NETWORK_SERVER_LIST_GRF_MISMATCH :{SILVER}NEWGRF 不符合 @@ -2157,6 +2216,7 @@ STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}起動 STR_NETWORK_SERVER_LIST_START_SERVER_TOOLTIP :{BLACK}起動您自己的伺服器 STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE :{BLACK}輸入您的名稱 +STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS :{BLACK}輸入伺服器位址或邀請碼 # Start new multiplayer server STR_NETWORK_START_SERVER_CAPTION :{WHITE}開始新的多人遊戲 @@ -2166,6 +2226,8 @@ 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_TOOLTIP :{BLACK}其他玩家是否能在公開列表中看到你的伺服器 STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} 玩家 STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}用戶端上限: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}選擇連線人數上限,但不是每個名額都要有人連線 @@ -2199,21 +2261,45 @@ STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}公司 # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :用戶端清單 -STR_NETWORK_COMPANY_LIST_SPECTATE :旁觀者 +STR_NETWORK_COMPANY_LIST_SPECTATE :旁觀 # Network client list 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_QUERY_CAPTION :伺服器名稱 STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}可見性 +STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :其他玩家是否能在公開列表中看到你的伺服器 +STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP :{BLACK}其他玩家可使用以進入伺服器的邀請碼 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE :{BLACK}連線類型 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}名稱 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}編輯玩家名稱 +STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :你的玩家名稱 +STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}加入此公司 +STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}傳送訊息給此玩家 +STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}傳送訊息給所有旁觀者 +STR_NETWORK_CLIENT_LIST_SPECTATORS :旁觀者 +STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}創立並加入一個新公司 # Matches ConnectionType ###length 5 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_ISOLATED :{RED}遠端玩家無法連線 +STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_DIRECT :{BLACK}公開 STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :踢出 +STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :停權 +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :刪除 +STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :密碼解鎖 +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}你確定要踢出玩家: '{STRING}'嗎? +STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}你確定要將玩家 '{STRING}' 列入黑名單嗎? STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}你確定要刪除「{COMPANY}」公司嗎? +STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}你確定要重設 '{COMPANY}'的公司密碼嗎? +STR_NETWORK_ASK_RELAY_CAPTION :{WHITE}是否使用中繼伺服器? +STR_NETWORK_ASK_RELAY_NO :{BLACK}否 +STR_NETWORK_ASK_RELAY_YES_ONCE :{BLACK}是,僅此一次 +STR_NETWORK_ASK_RELAY_YES_ALWAYS :{BLACK}是,且不再詢問 STR_NETWORK_SPECTATORS :旁觀者 @@ -2242,6 +2328,7 @@ STR_NETWORK_CHAT_TO_COMPANY :[團隊] 給 {S STR_NETWORK_CHAT_CLIENT :[私人] {STRING}:{WHITE}{STRING} STR_NETWORK_CHAT_TO_CLIENT :[私人] 給 {STRING}:{WHITE}{STRING} STR_NETWORK_CHAT_ALL :[全員] {STRING}:{WHITE}{STRING} +STR_NETWORK_CHAT_EXTERNAL :[{3:STRING}] {0:STRING}: {WHITE}{1:STRING} STR_NETWORK_CHAT_OSKTITLE :{BLACK}輸入要聊天的文字 # Network messages @@ -2265,6 +2352,7 @@ STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}你輸 STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}您的電腦可能較慢,未能跟上伺服器的速度 STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}您的電腦花了太多時間下載地圖 STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}您的電腦花了太多時間嘗試加入這個伺服器 +STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}你的玩家名稱是無效的 STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}可能發生連線中斷 STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION :{WHITE}最後 {NUM} 秒沒有資料從伺服器過來 @@ -2290,6 +2378,7 @@ STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :未能及時取 STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :一般逾時狀況 STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :下載地圖需時太長 STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :處理地圖需時太長 +STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME :無效的使用者端名稱 # Network related errors STR_NETWORK_SERVER_MESSAGE :*** {1:STRING} @@ -2306,6 +2395,7 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :玩家數量 STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :連線用戶端中 STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :手動 STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :遊戲腳本 +STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :等待連結圖更新 STR_NETWORK_MESSAGE_CLIENT_LEAVING :離開中 STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} 已加入遊戲 @@ -2315,10 +2405,15 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} 已建立新公司 (#{2:NUM}) STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} 已離開遊戲 ({2:STRING}) STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} 已修改其名稱為 {STRING} +STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} 付給{1:STRING} {2:CURRENCY_LONG} STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}伺服器關閉連線 STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}伺服器重新啟動中...{}請稍候... STR_NETWORK_MESSAGE_KICKED :*** {STRING} 已被踢出。原因:({STRING}) +STR_NETWORK_ERROR_COORDINATOR_REGISTRATION_FAILED :{WHITE}伺服器註冊失敗 +STR_NETWORK_ERROR_COORDINATOR_REUSE_OF_INVITE_CODE :{WHITE}已有另一個伺服器以同樣的邀請碼進行註冊。點擊"本地"以改變遊戲模式 +STR_NETWORK_ERROR_COORDINATOR_ISOLATED :{WHITE}你的伺服器不接受遠端連線 +STR_NETWORK_ERROR_COORDINATOR_ISOLATED_DETAIL :{WHITE}其他玩家將無法連線到你的伺服器 # Content downloading window STR_CONTENT_TITLE :{WHITE}內容下載中 @@ -2396,6 +2491,7 @@ STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}是, STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}否,離開 OpenTTD STR_MISSING_GRAPHICS_ERROR_TITLE :{WHITE}下載失敗 +STR_MISSING_GRAPHICS_ERROR :{BLACK}圖形下載失敗{}請手動下載圖形 STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}離開 OpenTTD # Transparency settings window @@ -2416,6 +2512,7 @@ STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}貨物 STR_LINKGRAPH_LEGEND_ALL :{BLACK}全部 STR_LINKGRAPH_LEGEND_NONE :{BLACK}無 STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}選擇所顯示的公司 +STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}未使用 @@ -2634,6 +2731,8 @@ STR_TREES_RANDOM_TYPE :{BLACK}隨機 STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}種植隨機種類樹木。按 Shift 可切換種植/顯示預估的種植費用 STR_TREES_RANDOM_TREES_BUTTON :{BLACK}隨機樹種 STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}在場景中隨機植樹 +STR_TREES_MODE_NORMAL_BUTTON :{BLACK}正常 +STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}框選一片區域以種植小規模的森林 STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}森林 # Land generation window (SE) @@ -2687,11 +2786,15 @@ STR_FUND_INDUSTRY_CAPTION :{WHITE}投資 STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}從清單中選擇合適的工業 STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :隨機產生多個工業 STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}以隨機分佈的工業佈滿地圖 +STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}隨機產生工業 STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}你確定要新建大量隨機工業嗎? STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}費用:{YELLOW}{CURRENCY_LONG} STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}探勘 STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}設立 STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}設立 +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}移除所有工業 +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}移除地圖上所有工業 +STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}移除所有工業 # Industry cargoes window STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}{STRING} 工業的產業鍊 @@ -2732,8 +2835,11 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}機場 STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF:{LTBLUE}{STRING} STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}接收貨物:{LTBLUE} STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING}) +STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}鐵軌種類: {LTBLUE}{STRING} +STR_LANG_AREA_INFORMATION_ROAD_TYPE :{BLACK}道路類型: {LTBLUE}{STRING} STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}軌道速限:{LTBLUE}{VELOCITY} STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}道路速限:{LTBLUE}{VELOCITY} +STR_LANG_AREA_INFORMATION_TRAM_SPEED_LIMIT :{BLACK}有軌電車速限: {LTBLUE}{VELOCITY} # Description of land area of different tiles STR_LAI_CLEAR_DESCRIPTION_ROCKS :石頭 @@ -2834,18 +2940,30 @@ STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD # Framerate display window STR_FRAMERATE_CAPTION :{WHITE}幀率 +STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) +STR_FRAMERATE_RATE_GAMELOOP :{BLACK}模擬速度: {STRING} +STR_FRAMERATE_RATE_BLITTER :{BLACK}畫面幀數: {STRING} +STR_FRAMERATE_AVERAGE :{WHITE}平均 STR_FRAMERATE_MEMORYUSE :{WHITE}記憶體 STR_FRAMERATE_DATA_POINTS :{BLACK}數據基於 {COMMA} 個採樣 STR_FRAMERATE_MS_BAD :{RED}{DECIMAL} 毫秒 +STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL} 幀/秒 +STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL} 幀/秒 STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES} ###length 15 +STR_FRAMERATE_VIDEO :{BLACK}影像輸出 +STR_FRAMERATE_SOUND :{BLACK}混音: STR_FRAMERATE_GAMESCRIPT :{BLACK} 遊戲腳本: STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ###length 15 STR_FRAMETIME_CAPTION_GL_LANDSCAPE :世界刻 +STR_FRAMETIME_CAPTION_DRAWING :圖形彩現 +STR_FRAMETIME_CAPTION_VIDEO :影像輸出 +STR_FRAMETIME_CAPTION_SOUND :混音 STR_FRAMETIME_CAPTION_ALLSCRIPTS :GS/AI 腳本總計 +STR_FRAMETIME_CAPTION_GAMESCRIPT :遊戲腳本 STR_FRAMETIME_CAPTION_AI :AI {NUM} {STRING} @@ -2871,6 +2989,7 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}遊戲 STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}沒有可用的資訊 STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:{WHITE}{STRING} +STR_SAVELOAD_FILTER_TITLE :{BLACK}篩選字串: STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}覆蓋檔案 STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}你確定要覆蓋現有存檔嗎? STR_SAVELOAD_DIRECTORY :{STRING} (路徑) @@ -2885,7 +3004,11 @@ STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}市鎮數量: STR_MAPGEN_DATE :{BLACK}日期: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工業數量: +STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}將地圖上最高峰的最大高度減少1 +STR_MAPGEN_SNOW_COVERAGE :{BLACK}雪地覆蓋率: +STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}將雪地覆蓋率提高10% STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}% +STR_MAPGEN_DESERT_COVERAGE :{BLACK}沙漠覆蓋率: STR_MAPGEN_DESERT_COVERAGE_UP :{BLACK}將沙漠覆蓋率提高10% STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}雪線高度: @@ -2916,6 +3039,8 @@ STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度 STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}大小: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} +STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT :{WHITE}雪地覆蓋率 (%) +STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT :{WHITE}沙漠覆蓋率 (以百分比%計算) STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}修改雪線高度 STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}修改開始年份 @@ -3051,6 +3176,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}警告:{ STR_NEWGRF_ERROR_MSG_ERROR :{RED}錯誤:{SILVER}{STRING} STR_NEWGRF_ERROR_MSG_FATAL :{RED}嚴重錯誤:{SILVER}{STRING} STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}發生嚴重 NewGRF 錯誤的處理方式:{}{STRING} +STR_NEWGRF_ERROR_POPUP :{WHITE}發生NewGRF錯誤:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} 跟由 OpenTTD 回報的 TTDPatch 版本不合 STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} 只適合用於 TTD 版本 {STRING} STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} 必須跟 {STRING} 一起使用 @@ -3142,6 +3268,7 @@ STR_TOWN_POPULATION :{BLACK}世界 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_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} 必須是冬天 @@ -3166,6 +3293,7 @@ STR_TOWN_VIEW_RENAME_TOWN_BUTTON :重新命名市 # Town local authority window STR_LOCAL_AUTHORITY_CAPTION :{WHITE}{TOWN} 地方政府 +STR_LOCAL_AUTHORITY_ZONE_TOOLTIP :{BLACK}顯示地方政府轄區 STR_LOCAL_AUTHORITY_COMPANY_RATINGS :{BLACK}運輸公司評比: STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}:{ORANGE}{STRING} STR_LOCAL_AUTHORITY_ACTIONS_TITLE :{BLACK}可辦理的工作: @@ -3196,7 +3324,10 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}冒著 # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} 遊戲目標 STR_GOALS_SPECTATOR_CAPTION :{WHITE}全局目標 +STR_GOALS_SPECTATOR :全局目標 +STR_GOALS_GLOBAL_BUTTON :{BLACK}全局 STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}顯示全局目標 +STR_GOALS_COMPANY_BUTTON :{BLACK}公司 STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- 當前無目標 - STR_GOALS_PROGRESS :{ORANGE}{STRING} @@ -3204,10 +3335,10 @@ STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING} STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}點選目標以將有關工業 / 市鎮或方格置於畫面中央。按下 Ctrl 鍵並點選目標以開啟一個以有關工業 / 市鎮或方格為中心的新視野 # Goal question window -STR_GOAL_QUESTION_CAPTION_QUESTION :問題 -STR_GOAL_QUESTION_CAPTION_INFORMATION :資訊 -STR_GOAL_QUESTION_CAPTION_WARNING :警告 -STR_GOAL_QUESTION_CAPTION_ERROR :錯誤 +STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}問題 +STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}資訊 +STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}警告 +STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}錯誤 # Goal Question button list ###length 18 @@ -3399,6 +3530,7 @@ STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}以公 STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}詳情 STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}顯示基礎建設數目的詳細資料 STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}給錢 +STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}將資金給予此公司 STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}新臉孔 STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}選擇總經理的新臉孔 @@ -3435,9 +3567,12 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL :{WHITE}每年{C # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}工業 STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- 無 - +STR_INDUSTRY_DIRECTORY_ITEM_INFO :{BLACK}{CARGO_LONG}{STRING}{YELLOW} (運送了{COMMA}%){BLACK} STR_INDUSTRY_DIRECTORY_ITEM_NOPROD :{ORANGE}{INDUSTRY} STR_INDUSTRY_DIRECTORY_ITEM_PROD1 :{ORANGE}{INDUSTRY} {STRING} +STR_INDUSTRY_DIRECTORY_ITEM_PROD3 :{ORANGE}{INDUSTRY} {STRING}, {STRING}, {STRING} STR_INDUSTRY_DIRECTORY_LIST_CAPTION :{BLACK}工業名稱 - 點選名稱可將工業置於畫面中央。 按住 Ctrl 點選可於工業位置開啟新視窗視野 +STR_INDUSTRY_DIRECTORY_ACCEPTED_CARGO_FILTER :{BLACK}接受貨物: {SILVER}{STRING} STR_INDUSTRY_DIRECTORY_FILTER_ALL_TYPES :所有貨物種類 STR_INDUSTRY_DIRECTORY_FILTER_NONE :無 @@ -3452,6 +3587,8 @@ STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}該工 STR_INDUSTRY_VIEW_REQUIRES_N_CARGO :{BLACK}需要: {YELLOW}{STRING}{STRING} STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :,{STRING}{STRING} +STR_INDUSTRY_VIEW_REQUIRES :{BLACK}需要: +STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} STR_CONFIG_GAME_PRODUCTION :{WHITE}修改產量 (以 8 為倍數增減,最大為 2040) STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}變更產出等級 (百分比,最高可到800%) @@ -3505,12 +3642,13 @@ STR_GROUP_DEFAULT_ROAD_VEHICLES :未分組的車 STR_GROUP_DEFAULT_SHIPS :未分組的船舶 STR_GROUP_DEFAULT_AIRCRAFTS :未分組的飛機 +STR_GROUP_COUNT_WITH_SUBGROUP :{TINY_FONT}{COMMA} (+{COMMA}) STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}群組 - 點選群組以顯示其中的運輸工具清單。拖曳群組標籤以排列群組的次序和層級。 STR_GROUP_CREATE_TOOLTIP :{BLACK}點選可建立群組 STR_GROUP_DELETE_TOOLTIP :{BLACK}移除所選群組 STR_GROUP_RENAME_TOOLTIP :{BLACK}重新命名群組 -STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}點選可保護此群組排除在全域自動替換設定之外 +STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}點選可保護此群組排除在全域自動替換設定之外。按住 Ctrl 鍵點選以套用至所有子群組 STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}刪除群組 STR_GROUP_DELETE_QUERY_TEXT :{WHITE}您是否決定刪除此群組及其所有子群組? @@ -3521,6 +3659,9 @@ STR_GROUP_REMOVE_ALL_VEHICLES :移去所有運 STR_GROUP_RENAME_CAPTION :{BLACK}重新命名群組 STR_GROUP_PROFIT_THIS_YEAR :今年盈利: +STR_GROUP_PROFIT_LAST_YEAR :去年盈利: +STR_GROUP_OCCUPANCY :目前使用率: +STR_GROUP_OCCUPANCY_VALUE :{NUM}% # Build vehicle window ###length 4 @@ -3530,10 +3671,12 @@ STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :新購單軌車 STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :新購磁浮車輛 STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :新購車輛 +STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :新的電車運具 # Vehicle availability ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :新購鐵路列車 +STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :新購車輛 STR_BUY_VEHICLE_SHIP_CAPTION :新購船舶 STR_BUY_VEHICLE_AIRCRAFT_CAPTION :新購飛機 @@ -3549,12 +3692,15 @@ STR_PURCHASE_INFO_REFITTABLE :(可改裝) STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}設計年份:{GOLD}{NUM}{BLACK} 使用年限:{GOLD}{COMMA} 年 STR_PURCHASE_INFO_RELIABILITY :{BLACK}最大可靠度:{GOLD}{COMMA}% STR_PURCHASE_INFO_COST :{BLACK}費用:{GOLD}{CURRENCY_LONG} +STR_PURCHASE_INFO_COST_REFIT :{BLACK}費用: {GOLD}{CURRENCY_LONG}{BLACK} (改裝費用: {GOLD}{CURRENCY_LONG}{BLACK}) STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}載重:{GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT}) STR_PURCHASE_INFO_COST_SPEED :{BLACK}費用:{GOLD}{CURRENCY_LONG}{BLACK} 速度:{GOLD}{VELOCITY} +STR_PURCHASE_INFO_COST_REFIT_SPEED :{BLACK}費用: {GOLD}{CURRENCY_LONG}{BLACK} (改裝費用: {GOLD}{CURRENCY_LONG}{BLACK}) 速度: {GOLD}{VELOCITY} STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}容量:{GOLD}{CARGO_LONG},{CARGO_LONG} STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}動力車廂:{GOLD}+{POWER}{BLACK} 載重:{GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}可改裝成:{GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :所有貨物種類 +STR_PURCHASE_INFO_NONE :無 STR_PURCHASE_INFO_ALL_BUT :所有貨物({CARGO_LIST}除外) STR_PURCHASE_INFO_MAX_TE :{BLACK}最大牽引力:{GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}範圍: {GOLD}{COMMA} 方格 @@ -3583,6 +3729,8 @@ STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}購買 STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}購買選定的飛機。按住 Shift 點選則只會顯示預估的購買費用 ###length VEHICLE_TYPES +STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}購買並改裝選定的車輛。按住 Shift 點選則只會顯示預估的購買費用 +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}購買並改裝選定的船舶。按住 Shift 點選則只會顯示預估的購買費用 STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}購買並改裝選定的飛機。按住 Shift 點選則只會顯示預估的購買費用 ###length VEHICLE_TYPES @@ -3716,6 +3864,7 @@ STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :單軌機車頭 STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :磁浮機車頭 STR_ENGINE_PREVIEW_ROAD_VEHICLE :車輛 +STR_ENGINE_PREVIEW_TRAM_VEHICLE :有軌電車運具 STR_ENGINE_PREVIEW_AIRCRAFT :飛機 STR_ENGINE_PREVIEW_SHIP :船舶 @@ -3723,6 +3872,8 @@ STR_ENGINE_PREVIEW_SHIP :船舶 STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}費用:{CURRENCY_LONG} 載重:{WEIGHT_SHORT}{}速度:{VELOCITY} 功率:{POWER}{}營運成本:{CURRENCY_LONG} / 年{}容量:{CARGO_LONG} STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}費用:{CURRENCY_LONG} 載重:{WEIGHT_SHORT}{}速度:{VELOCITY} 功率:{POWER} 最大牽引力:{6:FORCE}{}營運成本:{4:CURRENCY_LONG}/年{}容量:{5:CARGO_LONG} STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}費用:{CURRENCY_LONG} 最高速度:{VELOCITY}{}容量:{CARGO_LONG}{}營運成本:{CURRENCY_LONG}/年 +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}費用: {CURRENCY_LONG} 最高速度: {VELOCITY}{}航空運具型號: {STRING}{}容量: {CARGO_LONG}{}營運成本: {CURRENCY_LONG}/年 +STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}費用: {CURRENCY_LONG} 最高速度: {VELOCITY}{}航空運具型號: {STRING} 距離: {COMMA} 格{}容量: {CARGO_LONG}, {CARGO_LONG}{}營運成本: {CURRENCY_LONG}/年 # Autoreplace window STR_REPLACE_VEHICLES_WHITE :{WHITE}替換 {STRING} - {STRING} @@ -3754,6 +3905,7 @@ STR_REPLACE_HELP_STOP_BUTTON :{BLACK}按下 STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}在車頭及車廂替換畫面間切換。 STR_REPLACE_ENGINES :車頭 STR_REPLACE_WAGONS :車廂 +STR_REPLACE_ALL_RAILTYPE :所有的軌道運具 STR_REPLACE_ALL_ROADTYPE :所有公路車輛 ###length 2 @@ -3767,13 +3919,17 @@ STR_REPLACE_MONORAIL_VEHICLES :單軌列車 STR_REPLACE_MAGLEV_VEHICLES :磁浮列車 STR_REPLACE_ROAD_VEHICLES :車輛 +STR_REPLACE_TRAM_VEHICLES :有軌電車運具 +STR_REPLACE_REMOVE_WAGON :{BLACK}移除車廂({STRING}): {ORANGE}{STRING} STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}如果替換後的車廂較長的話,讓自動替換功能移除多餘的車廂 (從頭開始) 以便維持列車長度 +STR_REPLACE_REMOVE_WAGON_GROUP_HELP :{STRING}. 按住Ctrl並點擊以套用到所有子群組 # Vehicle view STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE} ###length VEHICLE_TYPES +STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}將飛機置於畫面中央。雙擊將會使視野跟隨飛機。 按住 Ctrl 點選可於飛機位置開啟新視窗視野 ###length VEHICLE_TYPES STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}將列車送回機廠,按住 CTRL 點選機廠則僅做維護 @@ -3810,6 +3966,9 @@ STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}顯示 STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}顯示飛機詳細資料 ###length VEHICLE_TYPES +STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}目前列車狀態 - 點擊以停止/起動運具 +STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}目前列車狀態 - 點擊以停止/起動運具 +STR_VEHICLE_VIEW_SHIP_STATE_STATUS_STOP_TOOLTIP :{BLACK}目前船舶狀態 - 點擊以停止/起動運具 # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}正在裝卸貨物 @@ -3854,6 +4013,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} 年 ({C STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} 年 ({COMMA}) STR_VEHICLE_INFO_MAX_SPEED :{BLACK}最高速度:{LTBLUE}{VELOCITY} +STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}最大速度: {LTBLUE}{VELOCITY} {BLACK}空中運具型號: {LTBLUE}{STRING} +STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}最高速度: {LTBLUE}{VELOCITY} {BLACK}航空運具型號: {LTBLUE}{STRING} {BLACK}距離: {LTBLUE}{COMMA} 格 STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}載重:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最高速度:{LTBLUE}{VELOCITY} STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}載重:{LTBLUE}{WEIGHT_SHORT} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 最高速度:{LTBLUE}{VELOCITY} {BLACK}最大牽引力:{LTBLUE}{FORCE} @@ -3992,6 +4153,7 @@ STR_ORDER_CONDITIONAL_AGE :年齡 (年) STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :需要維護 STR_ORDER_CONDITIONAL_UNCONDITIONALLY :總是 STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :剩餘年限 (年) +STR_ORDER_CONDITIONAL_MAX_RELIABILITY :最大可靠度 ###next-name-looks-similar STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}運輸工具相關數字與指定數值比對的條件 @@ -4227,6 +4389,9 @@ STR_AI_LIST_ACCEPT_TOOLTIP :{BLACK}選擇 STR_AI_LIST_CANCEL :{BLACK}取消 STR_AI_LIST_CANCEL_TOOLTIP :{BLACK}不改變腳本 +STR_SCREENSHOT_CAPTION :{WHITE}螢幕截圖 +STR_SCREENSHOT_DEFAULTZOOM_SCREENSHOT :{BLACK}預設視野截圖 +STR_SCREENSHOT_WORLD_SCREENSHOT :{BLACK}截圖整張地圖 # AI Parameters STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} 參數 @@ -4287,6 +4452,7 @@ STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :該存檔是由 STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :檔案無法讀取 STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :檔案無法寫入 STR_GAME_SAVELOAD_ERROR_DATA_INTEGRITY_CHECK_FAILED :資料完整性檢查失敗 +STR_GAME_SAVELOAD_ERROR_PATCHPACK :該存檔是由被修改過的遊戲所產生 STR_GAME_SAVELOAD_NOT_AVAILABLE :<無法使用> STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}此存檔版本不支援路面電車,已移除所有路面電車 @@ -4367,6 +4533,7 @@ STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... 不 STR_ERROR_CURRENCY_REQUIRED :{WHITE}... 需要 {CURRENCY_LONG} STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}無法償還貸款... STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}無法把貸款的錢流通出去... +STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}無法將資金給予此公司... STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}無法購買公司... STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}無法興建公司總部... STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}無法購買這間公司的股份... @@ -4493,6 +4660,7 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :錯誤的機廠 STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} 將在替換後過長 STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}無自動替換/翻新的規則可套用 STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(金錢限制) +STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}新的運具無法運輸 {STRING} # Rail construction errors STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}不合理的軌道組合 @@ -4520,6 +4688,9 @@ STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}不能 STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}無法移除此處的電車軌... STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... 這裡沒有道路 STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}... 這裡沒有電車軌 +STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}無法轉換此處的道路類型... +STR_ERROR_NO_SUITABLE_ROAD :{WHITE}沒有適合的道路 +STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}沒有合適的電車軌道 # Waterway construction errors STR_ERROR_CAN_T_BUILD_CANALS :{WHITE}無法在此興建運河... @@ -4694,6 +4865,8 @@ STR_BASESOUNDS_DOS_DESCRIPTION :原版 Transpor STR_BASESOUNDS_WIN_DESCRIPTION :原版 Transport Tycoon Deluxe Windows 版的音效。 STR_BASESOUNDS_NONE_DESCRIPTION :不含任何音效的音效集。 STR_BASEMUSIC_WIN_DESCRIPTION :原版 Transport Tycoon Deluxe Windows 版的音樂。 +STR_BASEMUSIC_DOS_DESCRIPTION :原版 Transport Tycoon Deluxe DOS 版的音樂。 +STR_BASEMUSIC_TTO_DESCRIPTION :原版 Transport Tycoon (Original/World Editor) DOS 版的音樂。 STR_BASEMUSIC_NONE_DESCRIPTION :不含任何音樂的音樂集。 STR_TRADITIONAL_TRAIN_NAME :列車 {COMMA} @@ -5095,6 +5268,7 @@ STR_FORMAT_DATE_ISO :{2:NUM}-{1:STRI STR_FORMAT_COMPANY_NUM :(公司 {COMMA}) STR_FORMAT_GROUP_NAME :群組 {COMMA} +STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA} STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING} ###length 2 diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 6944152a84..9149cd9f39 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2353,8 +2353,8 @@ void AgeVehicle(Vehicle *v) SetWindowDirty(WC_VEHICLE_DETAILS, v->index); - /* Don't warn about non-primary or not ours vehicles or vehicles that are crashed */ - if (v->Previous() != nullptr || v->owner != _local_company || (v->vehstatus & VS_CRASHED) != 0) return; + /* Don't warn about vehicles which are non-primary (e.g., part of an articulated vehicle), don't belong to us, are crashed, or are stopped */ + if (v->Previous() != nullptr || v->owner != _local_company || (v->vehstatus & VS_CRASHED) != 0 || (v->vehstatus & VS_STOPPED) != 0) return; const Company *c = Company::Get(v->owner); /* Don't warn if a renew is active */ diff --git a/src/video/cocoa/cocoa_ogl.mm b/src/video/cocoa/cocoa_ogl.mm index af9839a1c5..0bc1f8a322 100644 --- a/src/video/cocoa/cocoa_ogl.mm +++ b/src/video/cocoa/cocoa_ogl.mm @@ -232,11 +232,15 @@ void VideoDriver_CocoaOpenGL::Stop() void VideoDriver_CocoaOpenGL::PopulateSystemSprites() { + VideoDriver_Cocoa::PopulateSystemSprites(); + OpenGLBackend::Get()->PopulateCursorCache(); } void VideoDriver_CocoaOpenGL::ClearSystemSprites() { + VideoDriver_Cocoa::ClearSystemSprites(); + CGLSetCurrentContext(this->gl_context); OpenGLBackend::Get()->ClearCursorCache(); } diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index 3d3db5454c..3fe79ac905 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -22,7 +22,8 @@ extern bool _cocoa_video_started; class VideoDriver_Cocoa : public VideoDriver { private: - Dimension orig_res; ///< Saved window size for non-fullscreen mode. + Dimension orig_res; ///< Saved window size for non-fullscreen mode. + bool refresh_sys_sprites; ///< System sprites need refreshing. public: bool setup; ///< Window is currently being created. @@ -45,6 +46,9 @@ public: bool ChangeResolution(int w, int h) override; bool ToggleFullscreen(bool fullscreen) override; + void ClearSystemSprites() override; + void PopulateSystemSprites() override; + void EditBoxLostFocus() override; std::vector GetListOfMonitorRefreshRates() override; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 1c70d5313a..c1ddeff4c3 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -98,6 +98,8 @@ VideoDriver_Cocoa::VideoDriver_Cocoa() this->setup = false; this->buffer_locked = false; + this->refresh_sys_sprites = true; + this->window = nil; this->cocoaview = nil; this->delegate = nil; @@ -220,6 +222,19 @@ bool VideoDriver_Cocoa::ToggleFullscreen(bool full_screen) return false; } +void VideoDriver_Cocoa::ClearSystemSprites() +{ + this->refresh_sys_sprites = true; +} + +void VideoDriver_Cocoa::PopulateSystemSprites() +{ + if (this->refresh_sys_sprites && this->window != nil) { + [ this->window refreshSystemSprites ]; + this->refresh_sys_sprites = false; + } +} + /** * Callback invoked after the blitter was changed. * @return True if no error. diff --git a/src/video/cocoa/cocoa_wnd.h b/src/video/cocoa/cocoa_wnd.h index 0b5c51b994..94bff1e1f8 100644 --- a/src/video/cocoa/cocoa_wnd.h +++ b/src/video/cocoa/cocoa_wnd.h @@ -11,8 +11,10 @@ #define COCOA_WND_H #import -#include "toolbar_gui.h" -#include "table/sprites.h" + +#ifdef MAC_OS_X_VERSION_10_12_2 +# define HAVE_TOUCHBAR_SUPPORT +#endif class VideoDriver_Cocoa; @@ -30,70 +32,17 @@ extern NSString *OTTDMainLaunchGameEngine; + (NSCursor *) clearCocoaCursor; @end -#ifdef HAVE_OSX_1015_SDK -/* 9 items can be displayed on the touch bar when using default buttons. */ -static NSArray *touchBarButtonIdentifiers = @[ - @"openttd.pause", - @"openttd.fastforward", - @"openttd.zoom_in", - @"openttd.zoom_out", - @"openttd.build_rail", - @"openttd.build_road", - @"openttd.build_tram", - @"openttd.build_docks", - @"openttd.build_airport", - NSTouchBarItemIdentifierOtherItemsProxy -]; - -static NSDictionary *touchBarButtonSprites = @{ - @"openttd.pause": [NSNumber numberWithInt:SPR_IMG_PAUSE], - @"openttd.fastforward": [NSNumber numberWithInt:SPR_IMG_FASTFORWARD], - @"openttd.zoom_in": [NSNumber numberWithInt:SPR_IMG_ZOOMIN], - @"openttd.zoom_out": [NSNumber numberWithInt:SPR_IMG_ZOOMOUT], - @"openttd.build_rail": [NSNumber numberWithInt:SPR_IMG_BUILDRAIL], - @"openttd.build_road": [NSNumber numberWithInt:SPR_IMG_BUILDROAD], - @"openttd.build_tram": [NSNumber numberWithInt:SPR_IMG_BUILDTRAMS], - @"openttd.build_docks": [NSNumber numberWithInt:SPR_IMG_BUILDWATER], - @"openttd.build_airport": [NSNumber numberWithInt:SPR_IMG_BUILDAIR], -}; - -static NSDictionary *touchBarButtonActions = @{ - @"openttd.pause": [NSNumber numberWithInt:MTHK_PAUSE], - @"openttd.fastforward": [NSNumber numberWithInt:MTHK_FASTFORWARD], - @"openttd.zoom_in": [NSNumber numberWithInt:MTHK_ZOOM_IN], - @"openttd.zoom_out": [NSNumber numberWithInt:MTHK_ZOOM_OUT], - @"openttd.build_rail": [NSNumber numberWithInt:MTHK_BUILD_RAIL], - @"openttd.build_road": [NSNumber numberWithInt:MTHK_BUILD_ROAD], - @"openttd.build_tram": [NSNumber numberWithInt:MTHK_BUILD_TRAM], - @"openttd.build_docks": [NSNumber numberWithInt:MTHK_BUILD_DOCKS], - @"openttd.build_airport": [NSNumber numberWithInt:MTHK_BUILD_AIRPORT], -}; - -static NSDictionary *touchBarFallbackText = @{ - @"openttd.pause": @"Pause", - @"openttd.fastforward": @"Fast Forward", - @"openttd.zoom_in": @"Zoom In", - @"openttd.zoom_out": @"Zoom Out", - @"openttd.build_rail": @"Rail", - @"openttd.build_road": @"Road", - @"openttd.build_tram": @"Tram", - @"openttd.build_docks": @"Docks", - @"openttd.build_airport": @"Airport", -}; -#endif - /** Subclass of NSWindow to cater our special needs */ -#ifdef HAVE_OSX_1015_SDK -@interface OTTD_CocoaWindow : NSWindow -@property (strong) NSSet *touchbarItems; -- (NSImage*)generateImage:(int)spriteId; -#else @interface OTTD_CocoaWindow : NSWindow +#ifdef HAVE_TOUCHBAR_SUPPORT + #endif - (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv; - (void)setFrame:(NSRect)frameRect display:(BOOL)flag; + +- (void)refreshSystemSprites; @end /** Subclass of NSView to support mouse awareness and text input. */ diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index ae5fcef5ce..f0f11e486e 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -32,7 +32,11 @@ #include "../../gfx_func.h" #include "../../window_func.h" #include "../../window_gui.h" -#include "spritecache.h" +#include "../../spritecache.h" +#include "../../toolbar_gui.h" +#include + +#include "table/sprites.h" /* Table data for key mapping. */ #include "cocoa_keys.h" @@ -56,6 +60,31 @@ * Read http://developer.apple.com/releasenotes/Cocoa/Objective-C++.html for more information. */ +#ifdef HAVE_TOUCHBAR_SUPPORT +struct TouchBarButton { + NSTouchBarItemIdentifier key; + SpriteID sprite; + MainToolbarHotkeys hotkey; + NSString *fallback_text; + + bool operator ==(const NSTouchBarItemIdentifier other) const { return this->key == other; } +}; + +/* 9 items can be displayed on the touch bar when using default buttons. */ +static const std::array _touchbar_buttons{{ + { @"openttd.pause", SPR_IMG_PAUSE, MTHK_PAUSE, @"Pause" }, + { @"openttd.fastforward", SPR_IMG_FASTFORWARD, MTHK_FASTFORWARD, @"Fast Forward" }, + { @"openttd.zoom_in", SPR_IMG_ZOOMIN, MTHK_ZOOM_IN, @"Zoom In" }, + { @"openttd.zoom_out", SPR_IMG_ZOOMOUT, MTHK_ZOOM_OUT, @"Zoom Out" }, + { @"openttd.build_rail", SPR_IMG_BUILDRAIL, MTHK_BUILD_RAIL, @"Rail" }, + { @"openttd.build_road", SPR_IMG_BUILDROAD, MTHK_BUILD_ROAD, @"Road" }, + { @"openttd.build_tram", SPR_IMG_BUILDTRAMS, MTHK_BUILD_TRAM, @"Tram" }, + { @"openttd.build_docks", SPR_IMG_BUILDWATER, MTHK_BUILD_DOCKS, @"Docks" }, + { @"openttd.build_airport", SPR_IMG_BUILDAIR, MTHK_BUILD_AIRPORT, @"Airport" } +}}; + +#endif + bool _allow_hidpi_window = true; // Referenced from table/misc_settings.ini @interface OTTDMain : NSObject @@ -132,6 +161,37 @@ static std::vector NSStringToUTF32(NSString *s) return unicode_str; } +static void CGDataFreeCallback(void *, const void *data, size_t) +{ + delete[] (const uint32 *)data; +} + +/** + * Render an OTTD sprite to a Cocoa image. + * @param sprite_id Sprite to make a NSImage from. + * @param zoom Zoom level to render the sprite in. + * @return Autorelease'd image or nullptr on any error. + */ +static NSImage *NSImageFromSprite(SpriteID sprite_id, ZoomLevel zoom) +{ + if (!SpriteExists(sprite_id)) return nullptr; + + /* Fetch the sprite and create a new bitmap */ + Dimension dim = GetSpriteSize(sprite_id, nullptr, zoom); + std::unique_ptr buffer = DrawSpriteToRgbaBuffer(sprite_id, zoom); + if (!buffer) return nullptr; // Failed to blit sprite for some reason. + + CFAutoRelease data(CGDataProviderCreateWithData(nullptr, buffer.release(), dim.width * dim.height * 4, &CGDataFreeCallback)); + if (!data) return nullptr; + + CGBitmapInfo info = kCGImageAlphaFirst | kCGBitmapByteOrder32Host; + CFAutoRelease color_space(CGColorSpaceCreateWithName(kCGColorSpaceSRGB)); + CFAutoRelease bitmap(CGImageCreate(dim.width, dim.height, 8, 32, dim.width * 4, color_space.get(), info, data.get(), nullptr, false, kCGRenderingIntentDefault)); + if (!bitmap) return nullptr; + + return [ [ [ NSImage alloc ] initWithCGImage:bitmap.get() size:NSZeroSize ] autorelease ]; +} + /** * The main class of the application, the application's delegate. @@ -383,6 +443,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel @implementation OTTD_CocoaWindow { VideoDriver_Cocoa *driver; + bool touchbar_created; } /** @@ -392,6 +453,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel { if (self = [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ]) { self->driver = drv; + self->touchbar_created = false; [ self setContentMinSize:NSMakeSize(64.0f, 64.0f) ]; @@ -405,95 +467,91 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel return self; } -#ifdef HAVE_OSX_1015_SDK +/** + * Define the rectangle we draw our window in + */ +- (void)setFrame:(NSRect)frameRect display:(BOOL)flag +{ + [ super setFrame:frameRect display:flag ]; + + driver->AllocateBackingStore(); +} + +#ifdef HAVE_TOUCHBAR_SUPPORT - (void)touchBarButtonAction:(id)sender { - if (@available(macOS 10.15, *)) { - NSButtonTouchBarItem *btn = (NSButtonTouchBarItem *)sender; - NSNumber *hotkeyIndex = [ touchBarButtonActions objectForKey:btn.identifier ]; - HandleToolbarHotkey(hotkeyIndex.intValue); + NSButton *btn = (NSButton *)sender; + if (auto item = std::find(_touchbar_buttons.cbegin(), _touchbar_buttons.cend(), (NSTouchBarItemIdentifier)btn.identifier); item != _touchbar_buttons.cend()) { + HandleToolbarHotkey(item->hotkey); } } -#pragma mark NSTouchBarProvider - (nullable NSTouchBar *)makeTouchBar { + /* Make button identifier array. */ + NSMutableArray *button_ids = [ [ NSMutableArray alloc ] init ]; + for (const auto &button : _touchbar_buttons) { + [ button_ids addObject:button.key ]; + } + [ button_ids addObject:NSTouchBarItemIdentifierOtherItemsProxy ]; + NSTouchBar *bar = [ [ NSTouchBar alloc ] init ]; bar.delegate = self; - bar.defaultItemIdentifiers = touchBarButtonIdentifiers; + bar.defaultItemIdentifiers = button_ids; + [ button_ids release ]; + + self->touchbar_created = true; return bar; } --(NSImage *)generateImage:(int)spriteId +- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier { - if (!SpriteExists(spriteId)) { - return nullptr; - } + auto item = std::find(_touchbar_buttons.cbegin(), _touchbar_buttons.cend(), identifier); + assert(item != _touchbar_buttons.cend()); - /* Fetch the sprite and create a new bitmap */ - const Sprite *fullspr = GetSprite(spriteId, ST_NORMAL); - const std::unique_ptr buffer = DrawSpriteToRgbaBuffer(spriteId); - if (!buffer) { - return nullptr; // failed to blit sprite or we're using an 8bpp blitter. - } + NSButton *button = [ NSButton buttonWithTitle:item->fallback_text target:self action:@selector(touchBarButtonAction:) ]; + button.identifier = identifier; + button.imageScaling = NSImageScaleProportionallyDown; - NSBitmapImageRep *bitmap = [ [ NSBitmapImageRep alloc ] initWithBitmapDataPlanes:nil pixelsWide:fullspr->width pixelsHigh:fullspr->height bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSCalibratedRGBColorSpace bytesPerRow:0 bitsPerPixel:0 ]; + NSCustomTouchBarItem *tb_item = [ [ NSCustomTouchBarItem alloc] initWithIdentifier:identifier ]; + tb_item.view = button; + return tb_item; +} - /* Copy the sprite to the NSBitmapImageRep image buffer */ - const Colour *src = (const Colour *)buffer.get(); - for (int y = 0; y < fullspr->height; y++) { - for (int x = 0; x < fullspr->width; x++) { - NSUInteger pixel[4]; - pixel[0] = src->r; - pixel[1] = src->g; - pixel[2] = src->b; - pixel[3] = src->a; - [ bitmap setPixel:pixel atX:x y:y ]; +#endif /* HAVE_TOUCHBAR_SUPPORT */ - src += 1; - } - } +- (void)refreshSystemSprites +{ +#ifdef HAVE_TOUCHBAR_SUPPORT + if (!self->touchbar_created || ![ self respondsToSelector:@selector(touchBar) ] || self.touchBar == nil) return; - /* Finally, convert the NSBitmapImageRep we created to a NSimage we can put on the button and clean up. */ - NSImage *outImage = [ [ NSImage alloc ] initWithSize:NSMakeSize(fullspr->width, fullspr->height) ]; - [ outImage addRepresentation:bitmap ]; - [ bitmap release ]; + /* Re-create button images from OTTD sprites. */ + for (NSTouchBarItemIdentifier ident in self.touchBar.itemIdentifiers) { + auto item = std::find(_touchbar_buttons.cbegin(), _touchbar_buttons.cend(), ident); + if (item == _touchbar_buttons.cend()) continue; - return outImage; -} + NSCustomTouchBarItem *tb_item = [ self.touchBar itemForIdentifier:ident ]; + NSButton *button = tb_item.view; -#pragma mark NSTouchBarDelegate -- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier -{ - if (@available(macOS 10.15, *)) { - NSButtonTouchBarItem *button = [ [ NSButtonTouchBarItem alloc ] initWithIdentifier:identifier ]; - button.target = self; - button.action = @selector(touchBarButtonAction:); + NSImage *image = NSImageFromSprite(item->sprite, _settings_client.gui.zoom_min); + if (image != nil) { + /* Human Interface Guidelines: Maximum touch bar glyph size 22 pt. */ + CGFloat max_dim = std::max(image.size.width, image.size.height); + if (max_dim > 0.0) { + CGFloat scale = 22.0 / max_dim; + image.size = NSMakeSize(image.size.width * scale, image.size.height * scale); + } - NSNumber *num = touchBarButtonSprites[identifier]; - NSImage *generatedImage = [ self generateImage:num.unsignedIntValue ]; - if (generatedImage != nullptr) { - button.image = generatedImage; + button.image = image; + button.imagePosition = NSImageOnly; } else { - button.title = NSLocalizedString(touchBarFallbackText[identifier], @""); + button.image = nil; + button.imagePosition = NSNoImage; } - return button; - } else { - return nullptr; } -} -#endif - -/** - * Define the rectangle we draw our window in - */ -- (void)setFrame:(NSRect)frameRect display:(BOOL)flag -{ - [ super setFrame:frameRect display:flag ]; - - driver->AllocateBackingStore(); +#endif /* HAVE_TOUCHBAR_SUPPORT */ } @end