Merge branch 'v24' into evan-checkout-flow

This commit is contained in:
Drills Kibo
2025-07-28 17:22:47 +02:00
committed by GitHub
144 changed files with 5573 additions and 1394 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ Describe the PR.
- [ ] I process any text displayed to the user through translateText() and I've added it to the en.json file
- [ ] I have added relevant tests to the test directory
- [ ] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced
- [ ] I understand that submitting code with bugs that could have been caught through manual testing blocks releases and new features for all contributors
- [ ] I have read and accepted the CLA agreement (only required once).
## Please put your Discord username so you can be contacted if a bug or regression is found:
+2
View File
@@ -115,6 +115,8 @@ jobs:
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
+1 -1
View File
@@ -36,7 +36,7 @@ jobs:
/- \[x\] I process any text displayed to the user through translateText\(\) and I\'ve added it to the en\.json file/i,
/- \[x\] I have added relevant tests to the test directory/i,
/- \[x\] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced/i,
/- \[x\] I understand that submitting code with bugs that could have been caught through manual testing blocks releases and new features for all contributors/i
/- \[x\] I have read and accepted the CLA agreement \(only required once\)\./i
];
for (const box of requiredBoxes) {
+8
View File
@@ -72,6 +72,8 @@ jobs:
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
@@ -126,6 +128,8 @@ jobs:
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
@@ -180,6 +184,8 @@ jobs:
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
@@ -234,6 +240,8 @@ jobs:
OTEL_ENDPOINT: ${{ secrets.OTEL_ENDPOINT }}
OTEL_PASSWORD: ${{ secrets.OTEL_PASSWORD }}
OTEL_USERNAME: ${{ secrets.OTEL_USERNAME }}
OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }}
OTEL_AUTH_HEADER: ${{ secrets.OTEL_AUTH_HEADER }}
R2_ACCESS_KEY: ${{ secrets.R2_ACCESS_KEY }}
R2_BUCKET: ${{ secrets.R2_BUCKET }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
+2 -2
View File
@@ -1,4 +1,4 @@
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
* @openfrontio/core-contributor
* @openfrontio/review-approver
resources/lang @openfrontio/translation-approver
resources/lang/en.json @openfrontio/core-contributor
resources/lang/en.json @openfrontio/review-approver
+4
View File
@@ -12,9 +12,13 @@ This is a fork/rewrite of WarFront.io. Credit to https://github.com/WarFrontIO.
![CI](https://github.com/openfrontio/OpenFrontIO/actions/workflows/ci.yml/badge.svg)
[![Crowdin](https://badges.crowdin.net/openfront-mls/localized.svg)](https://crowdin.com/project/openfront-mls)
[![CLA assistant](https://cla-assistant.io/readme/badge/openfrontio/OpenFrontIO)](https://cla-assistant.io/openfrontio/OpenFrontIO)
# OpenFront - Licensing
OpenFront Contributor License Agreement (CLA) can be found [here](https://gist.github.com/evanpelle/4c9e0fc2cb73b2b3b3402ca202f56672).
This is to help us transition to AGPL, a stricter open source license. After creating a pull request you will be prompted to sign.
This project uses a multi-licensing approach:
- Code in the `server/` and `core/` directory is licensed under MIT
+2
View File
@@ -181,6 +181,8 @@ SUBDOMAIN=$SUBDOMAIN
OTEL_USERNAME=$OTEL_USERNAME
OTEL_PASSWORD=$OTEL_PASSWORD
OTEL_ENDPOINT=$OTEL_ENDPOINT
OTEL_EXPORTER_OTLP_ENDPOINT=$OTEL_EXPORTER_OTLP_ENDPOINT
OTEL_AUTH_HEADER=$OTEL_AUTH_HEADER
BASIC_AUTH_USER=$BASIC_AUTH_USER
BASIC_AUTH_PASS=$BASIC_AUTH_PASS
EOL
+18 -3
View File
@@ -19,21 +19,36 @@ export default [
pluginJs.configs.recommended,
...tseslint.configs.recommended,
eslintConfigPrettier,
{
languageOptions: {
parserOptions: {
projectService: {
allowDefaultProject: [
"__mocks__/fileMock.js",
"eslint.config.js",
"jest.config.ts",
"postcss.config.js",
"tailwind.config.js",
"webpack.config.js",
],
},
tsconfigRootDir: import.meta.dirname,
},
},
},
{
rules: {
// Disable rules that would fail. The failures should be fixed, and the entries here removed.
"@typescript-eslint/no-empty-object-type": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-require-imports": "off",
"@typescript-eslint/no-unused-expressions": "off",
"@typescript-eslint/no-unused-vars": "off",
"no-case-declarations": "off",
"no-useless-escape": "off",
},
},
{
rules: {
// Enable rules
"@typescript-eslint/prefer-nullish-coalescing": "error",
eqeqeq: "error",
},
},
+148 -12
View File
@@ -24,7 +24,9 @@
"wiki": "Уики"
},
"news": {
"title": "Пусната е версия 23!"
"full_changelog": "Вижте пълния лист с промени",
"github_link": "в ГитХъб",
"title": "Бележки по изданието"
},
"help_modal": {
"hotkeys": "Бързи клавиши",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Рестартиране на графики",
"ui_section": "Потребителски интерфейс на играта",
"ui_leaderboard": "Класация",
"ui_your_team": "Твоят отбор:",
"ui_leaderboard_desc": "Показва най-напредналите играчи в играта и имената им, % притежавана земя, злато и войници. Използването на \"Показване на всички\" показва всички играчи в играта. Ако не искате да виждате класацията, кликнете \"Скриване\".",
"ui_control": "Контролен панел",
"ui_control_desc": "Контролният панел съдържа следните елементи:",
@@ -57,6 +60,7 @@
"ui_options_desc": "Следните елементи могат да бъдат намерени вътре:",
"ui_playeroverlay": "Меню за информация за играча",
"ui_playeroverlay_desc": "Когато мишката ви е върху държава, менюто за информация за играча се показва под \"Опции\". То показва вида играч: човек, нация (по-умен бот) или бот. Отношението на нацията към вас, вариращо от враждебно до приятелско. И отбранителните войски, злато, както и броя на военните кораби и различните сгради, които играчът има.",
"ui_wilderness": "Пустош",
"option_pause": "Поставяне/Премахване на пауза на играта - Налични само в самостоятелна игра.",
"option_timer": "Таймер - Изминалото време от началото на играта.",
"option_exit": "Бутон за изход.",
@@ -86,6 +90,8 @@
"build_desc": "Описание",
"build_city": "Град",
"build_city_desc": "Увеличава максималната Ви популация. Полезно, когато не можете да разширите територията си или сте на път да достигнете лимита на популацията си.",
"build_factory": "Фабрика",
"build_factory_desc": "Създава железопътни линии автоматично с близки структури и периодично пуска влакове.",
"build_defense": "Отбранителен пост",
"build_defense_desc": "Увеличава защитата около близките граници, които показват кариран модел. Атаките от врагове са по-бавни и имат повече жертви.",
"build_port": "Пристанище",
@@ -109,7 +115,8 @@
"icon_ally": "Ръкостискане - Съюзник. Този играч е Ваш съюзник.",
"icon_embargo": "Стоп знак за долар - Ембарго. Този играч е спрял да търгува с вас автоматично или ръчно.",
"icon_request": "Пликче за писмо - молба за съюз. Този играч ви е изпратил молба за съюз.",
"info_enemy_panel": "Информационно меню за врагове"
"info_enemy_panel": "Информационно меню за врагове",
"exit_confirmation": "Сигурен ли си, че искаш да излезеш от играта?"
},
"single_modal": {
"title": "Самостоятелна Игра",
@@ -128,6 +135,7 @@
"map": {
"map": "Карта",
"world": "Свят",
"giantworldmap": "Гигантска световна карта",
"europe": "Европа",
"mena": "МЕНА",
"northamerica": "Северна Америка",
@@ -151,13 +159,17 @@
"falklandislands": "Фолкландски острови",
"baikal": "Байкал",
"halkidiki": "Халкидики",
"giantworldmap": "Гигантска световна карта"
"straitofgibraltar": "Гибралтарски проток",
"italia": "Италия"
},
"map_categories": {
"continental": "Континентално",
"regional": "Регионално",
"fantasy": "Друго"
},
"map_component": {
"loading": "Зареждане..."
},
"private_lobby": {
"title": "Присъединяване към частна игра",
"enter_id": "Въведете ID на частната игра",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Присъединяване към следващата игра",
"waiting": "чакащи играчи",
"teams_Duos": "Дуос (отбори по 2-ма)",
"teams_Trios": "Триос (отбори по 3-ма)",
"teams_Quads": "Куадс (отбори по 4-ма)",
"teams": "{num} отбора"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "Изчакване на играчи...",
"start": "Започване на игра"
},
"team_colors": {
"red": "Червен",
"blue": "Син",
"teal": "Синьо-зелен",
"purple": "Лилав",
"yellow": "Жълт",
"orange": "Оранжев",
"green": "Зелен",
"bot": "Бот"
},
"game_starting_modal": {
"title": "Играта се стартира...",
"desc": "Подготвяне за стартиране на лобито. Моля, изчакайте."
@@ -225,22 +250,36 @@
"sam_launcher": "Противоракетна установка земя-въздух SAM",
"atom_bomb": "Атомна бомба",
"hydrogen_bomb": "Водородна бомба",
"mirv": "МИРВ"
"mirv": "МИРВ",
"factory": "Фабрика"
},
"user_setting": {
"title": "Потребителски настройки",
"tab_basic": "Базови настройки",
"tab_keybinds": "Бързи клавиши",
"dark_mode_label": "🌙 Тъмен режим",
"dark_mode_label": "Тъмен режим",
"dark_mode_desc": "Превключване на изгледа на сайта между светъл и тъмен режим",
"emojis_label": "😊 Емоджита",
"dark_mode_enabled": "Тъмният режим е активиран",
"light_mode_enabled": "Светлият режим е активиран",
"emojis_label": "Емоджита",
"emojis_visible": "Емоджитата са видими",
"emojis_hidden": "Емоджитата са скрити",
"emojis_desc": "Превключване дали емоджита да се показват в игра",
"special_effects_label": "💥 Специални ефекти",
"alert_frame_label": "Предупредително поле",
"alert_frame_desc": "Превключване на предупредителното поле. Когато е активирано, полето ще се показва, когато бъдете предадени.",
"special_effects_label": "Специални ефекти",
"special_effects_desc": "Превключване на специалните ефекти. Деактивиране, за да се увеличи производителността",
"anonymous_names_label": "🥷 Скрити имена",
"special_effects_enabled": "Активирани са специалните ефекти",
"special_effects_disabled": "Деактивирани са специалните ефекти",
"anonymous_names_label": "Скрити имена",
"anonymous_names_desc": "Скриване на истинските имена на играчите с произволни такива на екрана ти.",
"left_click_label": "🖱️ Щтракване на ляв бутон, за да се отвори менюто",
"anonymous_names_enabled": "Анонимните имена са активирани",
"real_names_shown": "Показват са истинските имена",
"left_click_label": "Щтракване на ляв бутон, за да се отвори менюто",
"left_click_desc": "Когато е ВКЛЮЧЕНО, щракването с ляв бутон отваря менюто и атаките се извършват чрез бутона на меч. Когато е ИЗКЛЮЧЕНО, щракването с ляв бутон атакува директно.",
"left_click_menu": "Меню ляв клик",
"left_click_opens_menu": "Левият бутон отваря меню",
"right_click_opens_menu": "Десният бутон отваря меню",
"attack_ratio_label": "⚔️ Съотношение на атака",
"attack_ratio_desc": "Какъв процент от Вашите войници да се изпратят в атака (1–100%)",
"troop_ratio_label": "🪖🛠️ Съотношение на войници и работници",
@@ -262,6 +301,8 @@
"attack_keybinds": "Клавиши за атака",
"boat_attack": "Атака с лодка",
"boat_attack_desc": "Изпраща атака с лодка към плочката под курсора ви.",
"ground_attack": "Земна атака",
"ground_attack_desc": "Изпраща земна атака към плочката под курсора ви.",
"zoom_controls": "Контроли за позиция на камерата",
"zoom_out": "Отдалечаване на камерата",
"zoom_out_desc": "Отдалечаване на камерата от картата",
@@ -279,7 +320,14 @@
"move_right": "Придвижване на камерата надясно",
"move_right_desc": "Придвижване на камерата надясно",
"reset": "Нулиране",
"unbind": "Освобождаване"
"unbind": "Освобождаване",
"on": "Включено",
"off": "Изключено",
"toggle_terrain": "Превключване на терена",
"terrain_enabled": "Изгледът на терена е активиран",
"terrain_disabled": "Изгледът на терена е деактивиран",
"exit_game_label": "Напускане на играта",
"exit_game_info": "Връщане в главното меню"
},
"chat": {
"title": "Бърз чат",
@@ -364,7 +412,8 @@
"warship": "Превзема търговски кораби, унищожава кораби и лодки",
"port": "Изпраща търговски кораби, за да се получава злато",
"defense_post": "Увеличава отбраната на близки граници",
"city": "Увеличава максималната популация"
"city": "Увеличава максималната популация",
"factory": "Създава железопътни линии и пуска влакове"
},
"not_enough_money": "Няма достатъчно пари"
},
@@ -383,6 +432,7 @@
"hide": "Скриване",
"rank": "Позиция",
"player": "Играч",
"team": "Отбор",
"owned": "Притежавано",
"gold": "Злато",
"troops": "Войници"
@@ -402,7 +452,39 @@
"sams": "Противоракетни установки земя-въздух SAM",
"warships": "Бойни кораби",
"health": "Живот",
"attitude": "Становище"
"attitude": "Становище",
"levels": "Нива"
},
"events_display": {
"retreating": "отстъпване",
"boat": "Лодка",
"alliance_request_status": "{name} {status} заявката ти за съюз",
"alliance_accepted": "прие",
"alliance_rejected": "отхвърли",
"duration_second": "1 секунда",
"betrayal_description": "Ти прекрати съюза си с {name}, което те прави ПРЕДАТЕЛ ({malusPercent}% понижаване на защитата ти за {durationText})",
"duration_seconds_plural": "{seconds} секунди",
"betrayed_you": "{name} прекрати съюза си с теб",
"about_to_expire": "Съюзът ти с {name} е на път да изтече!",
"alliance_expired": "Съюзът ти с {name} изтече",
"attack_request": "{name} иска да атакуваш {target}",
"sent_emoji": "Изпратено на {name}: {emoji}",
"renew_alliance": "Изпращане на заявка за подновяване",
"request_alliance": "{name} иска съюз!",
"focus": "Фокусиране",
"accept_alliance": "Приемане",
"reject_alliance": "Отхвърляне",
"alliance_renewed": "Съюзът ти с {name} бе подновен",
"ignore": "Игнориране"
},
"unit_info_modal": {
"structure_info": "Информация за постройката",
"unit_type_unknown": "Неизвестно",
"close": "Затваряне",
"cooldown": "Време за охлаждане",
"type": "Вид",
"upgrade": "Надграждане",
"level": "Ниво"
},
"relation": {
"hostile": "Враждебно",
@@ -433,8 +515,14 @@
"none": "Няма",
"alliances": "Съюзи"
},
"replay_panel": {
"replay_speed": "Скорост на повторението",
"game_speed": "Скорост на играта",
"fastest_game_speed": "макс"
},
"error_modal": {
"crashed": "Играта крашна!",
"connection_error": "Грешка във връзката!",
"paste_discord": "Моля, поставете следното във вашия бъг репорт в Дискорд:",
"copy_clipboard": "Копиране в клипборда",
"copied": "Копирано!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Изберете начална локация"
},
"territory_patterns": {
"title": "Избиране на териториален шаблон",
"purchase": "Купуване",
"blocked": {
"login": "Трябва да сте влезли в профила си, за да получите достъп до този шаблон.",
"purchase": "Закупете този шаблон, за да го отключите."
},
"pattern": {
"default": "Стандартен",
"custom": "Персонализиран",
"stripes_v": "Вертикален",
"stripes_h": "Хоризонтален",
"horizontal_stripes": "Хоризонтален (Алт)",
"vertical_bars": "Вертикален (Алт)",
"checkerboard": "Шахматен",
"choco": "Шоколадов",
"diagonal": "Диагонален",
"cross": "Кръст",
"mini_cross": "Мини кръст",
"sword": "Меч",
"sparse_dots": "Разредени точки",
"evan": "Еван",
"diagonal_stripe": "Диагонална ивица",
"mountain_ridge": "Планински хребет",
"scattered_dots": "Разпръснати точки",
"circuit_board": "Платка",
"shells": "Черупки",
"-w-": ".w.",
"white_rabbit": "Бял заек",
"goat": "Коза",
"cats": "Котки",
"cursor": "Курсор",
"hand": "Ръка",
"radiation": "Радиация",
"openfront_qr": "QR код за OpenFront.io",
"openfront": "OpenFront",
"t_rex": "Ти-Рекс",
"embelem": "Емблема",
"grogu_head": "Грогу глава",
"grogu": "Грогу"
}
},
"auth": {
"login_required": "За достъп до този уебсайт е необходим вход.",
"redirecting": "Пренасочваме ви...",
"not_authorized": "Нямате право да достъпите до този уебсайт.",
"contact_admin": "Ако смятате, че виждате това съобщение по погрешка, моля, свържете се с администратора на уебсайта."
}
}
+149 -13
View File
@@ -24,7 +24,9 @@
"wiki": "Wiki"
},
"news": {
"title": "Version 23 udgivet!"
"full_changelog": "Vis hele ændringsloggen",
"github_link": "på GitHub",
"title": "Udgivelsesnoter"
},
"help_modal": {
"hotkeys": "Genvejstaster",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Nulstil grafik",
"ui_section": "Spilgrænseflade",
"ui_leaderboard": "Rangliste",
"ui_your_team": "Dit hold:",
"ui_leaderboard_desc": "Viser de bedste spillere i spillet med deres navne, procentdel af ejet land, guld og tropper. Ved at vælge 'Vis alle' vises alle spillere i spillet. Hvis du ikke ønsker at se ranglisten, klik på 'Skjul'.",
"ui_control": "Betjeningspanel",
"ui_control_desc": "Kontrolpanelet indeholder følgende elementer:",
@@ -57,6 +60,7 @@
"ui_options_desc": "Følgende elementer findes indenfor:",
"ui_playeroverlay": "Spillerinfo-overlay",
"ui_playeroverlay_desc": "Når du holder musen over et land, vises spillerinfo-overlayet under Indstillinger. Det viser spillertypen: Menneske, Nation (smart bot) eller Bot. Adfærd: fra fjendtlig til venlig. Derudover vises forsvarende tropper, guld samt antallet af krigsskibe og forskellige bygninger, spilleren har.",
"ui_wilderness": "Ødemark",
"option_pause": "Pause/Unpause spillet - Kun tilgængelig i singleplayer-tilstand.",
"option_timer": "Timer Tid gået siden spillets start.",
"option_exit": "Afslut knap.",
@@ -86,6 +90,8 @@
"build_desc": "Beskrivelse",
"build_city": "By",
"build_city_desc": "Øger din maksimale befolkning. Nyttig, når du ikke kan udvide dit territorium, eller du er ved at ramme befolkningsgrænsen.",
"build_factory": "Fabrik",
"build_factory_desc": "Opretter automatisk jernbaner ved nærliggende strukturer og sender tog afsted med mellemrum.",
"build_defense": "Forsvarspost",
"build_defense_desc": "Øger forsvaret omkring nærliggende grænser, som viser et ternet mønster. Angreb fra fjender er langsommere og har flere tab.",
"build_port": "Havn",
@@ -109,7 +115,8 @@
"icon_ally": "Håndtryk - Allieret. Denne spiller er din allierede.",
"icon_embargo": "Dollar-stoptegn Embargo. Denne spiller har stoppet handlen med dig automatisk eller manuelt.",
"icon_request": "Konvolut - anmodning om Alliance. Denne spiller har sendt dig en allianceanmodning.",
"info_enemy_panel": "Fjende-info panel"
"info_enemy_panel": "Fjende-info panel",
"exit_confirmation": "Er du sikker på du vil afslutte spillet?"
},
"single_modal": {
"title": "Enkeltspiller",
@@ -128,6 +135,7 @@
"map": {
"map": "Kort",
"world": "Verden",
"giantworldmap": "Kæmpe Verdenskort",
"europe": "Europa",
"mena": "MENA",
"northamerica": "Nordamerika",
@@ -151,13 +159,17 @@
"falklandislands": "Falklandsøerne",
"baikal": "Baikalsøen",
"halkidiki": "Halkidiki",
"giantworldmap": "Kæmpe Verdenskort"
"straitofgibraltar": "Gibraltarstrædet",
"italia": "Italien"
},
"map_categories": {
"continental": "Kontinental",
"regional": "Regional",
"fantasy": "Andre"
},
"map_component": {
"loading": "Indlæser..."
},
"private_lobby": {
"title": "Deltag I Privat Lobby",
"enter_id": "Indtast Lobby ID",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Deltag i næste Spil",
"waiting": "spillere venter",
"teams_Duos": "Duos (hold af 2)",
"teams_Trios": "Trioer (hold af 3)",
"teams_Quads": "Quads (hold af 4)",
"teams": "{num} hold"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "Venter på spillerne...",
"start": "Start spil"
},
"team_colors": {
"red": "Rød",
"blue": "Blå",
"teal": "Grønblå",
"purple": "Lilla",
"yellow": "Gul",
"orange": "Orange",
"green": "Grøn",
"bot": "Bot"
},
"game_starting_modal": {
"title": "Spillet Starter...",
"desc": "Forbereder lobbyen på at starte. Vent venligst."
@@ -225,22 +250,36 @@
"sam_launcher": "SAM-affyringsrampe",
"atom_bomb": "Atombombe",
"hydrogen_bomb": "Brintbombe",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "Fabrik"
},
"user_setting": {
"title": "Brugerindstillinger",
"tab_basic": "Grundlæggende indstillinger",
"tab_keybinds": "Genvejstaster",
"dark_mode_label": "🌙 Mørk Tilstand",
"dark_mode_label": "Mørk Tilstand",
"dark_mode_desc": "Skift webstedets udseende mellem lyst og mørkt tema",
"emojis_label": "😊 Emojis",
"dark_mode_enabled": "Mørk tilstand aktiveret",
"light_mode_enabled": "Lys tilstand aktiveret",
"emojis_label": "Emojis",
"emojis_visible": "Emojis er synlige",
"emojis_hidden": "Emojis er skjult",
"emojis_desc": "Skift mellem om emojis vises i spillet",
"special_effects_label": "💥 Specialeffekter",
"alert_frame_label": "Advarselsramme",
"alert_frame_desc": "Slå alarmrammen til og fra. Når den er aktiveret, vises rammen, når du bliver forrådt.",
"special_effects_label": "Specialeffekter",
"special_effects_desc": "Slå specialeffekter til eller fra. Deaktivér for at forbedre ydeevnen",
"anonymous_names_label": "🥷 Skjulte Navne",
"special_effects_enabled": "Specialeffekter aktiveret",
"special_effects_disabled": "Specialeffekter deaktiveret",
"anonymous_names_label": "Skjulte Navne",
"anonymous_names_desc": "Skjul rigtige spillernavne med tilfældige navne på din skærm.",
"left_click_label": "🖱️ Venstreklik for at Åbne Menuen",
"anonymous_names_enabled": "Anonyme navne er aktiveret",
"real_names_shown": "Rigtige navne vist",
"left_click_label": "Venstreklik for at Åbne Menuen",
"left_click_desc": "Når den er TIL, åbner venstreklik menuen, og sværdknappen angriber. Når den er FRA, angriber venstreklik direkte.",
"left_click_menu": "Venstre Klik Menu",
"left_click_opens_menu": "Venstreklik åbner menu",
"right_click_opens_menu": "Højreklik åbner menu",
"attack_ratio_label": "⚔️ Angrebsforhold",
"attack_ratio_desc": "Hvor stor en procentdel af dine tropper skal sendes i et angreb (1100%)",
"troop_ratio_label": "🪖🛠️ Forholdet mellem tropper og arbejdere",
@@ -262,6 +301,8 @@
"attack_keybinds": "Angrebsgenvejstaster",
"boat_attack": "Båd Angreb",
"boat_attack_desc": "Send et bådangreb til den flise, din markør peger på.",
"ground_attack": "Jordangreb",
"ground_attack_desc": "Send et jordangreb til den flise, din markør peger på.",
"zoom_controls": "Zoom Styring",
"zoom_out": "Zoom Ud",
"zoom_out_desc": "Zoom ud af kortet",
@@ -279,7 +320,14 @@
"move_right": "Flyt Kamera Til Højre",
"move_right_desc": "Flyt kameraet til højre",
"reset": "Nulstil",
"unbind": "Fjern tilknytning"
"unbind": "Fjern tilknytning",
"on": "Til",
"off": "Fra",
"toggle_terrain": "Slå Terræn Til/Fra",
"terrain_enabled": "Terrænvisning aktiveret",
"terrain_disabled": "Terrænvisning deaktiveret",
"exit_game_label": "Afslut Spil",
"exit_game_info": "Tilbage til hovedmenu"
},
"chat": {
"title": "Hurtig Chat",
@@ -364,7 +412,8 @@
"warship": "Indfanger handelsskibe, ødelægger skibe og både",
"port": "Sender handelsskibe for at generere guld",
"defense_post": "Forstærker forsvaret af nærliggende grænser",
"city": "Forøger maks. befolkning"
"city": "Øger maksimal befolkning",
"factory": "Opretter jernbaner og sender tog afsted"
},
"not_enough_money": "Ikke nok penge"
},
@@ -383,6 +432,7 @@
"hide": "Skjul",
"rank": "Rang",
"player": "Spiller",
"team": "Hold",
"owned": "Ejet",
"gold": "Guld",
"troops": "Tropper"
@@ -402,7 +452,39 @@
"sams": "SAMs",
"warships": "Krigsskibe",
"health": "Helbred",
"attitude": "Adfærd"
"attitude": "Adfærd",
"levels": "Niveauer"
},
"events_display": {
"retreating": "trækker sig tilbage",
"boat": "Båd",
"alliance_request_status": "{name} {status} din allianceanmodning",
"alliance_accepted": "accepteret",
"alliance_rejected": "afvist",
"duration_second": "1 sekund",
"betrayal_description": "Du har brudt din alliance med {name}, og er nu en FORRÆDER (forsvarsstraffe på {malusPercent}% i {durationText})",
"duration_seconds_plural": "{seconds} sekunder",
"betrayed_you": "{name} har brudt sin alliance med dig",
"about_to_expire": "Din alliance med {name} er ved at udløbe!",
"alliance_expired": "Din alliance med {name} er udløbet",
"attack_request": "{name} anmoder om, at du angriber {target}",
"sent_emoji": "Sendt {name}: {emoji}",
"renew_alliance": "Anmod om fornyelse",
"request_alliance": "{name} anmoder om alliance!",
"focus": "Fokus",
"accept_alliance": "Acceptér",
"reject_alliance": "Afvis",
"alliance_renewed": "Din alliance med {name} er blevet fornyet",
"ignore": "Ignorér"
},
"unit_info_modal": {
"structure_info": "Strukturinfo",
"unit_type_unknown": "Ukendt",
"close": "Luk",
"cooldown": "Nedkøling",
"type": "Type",
"upgrade": "Opgradér",
"level": "Niveau"
},
"relation": {
"hostile": "Fjendtlig",
@@ -412,7 +494,7 @@
"default": "Standard"
},
"control_panel": {
"pop": "Befolk",
"pop": "Befolkning",
"gold": "Guld",
"troops": "Tropper",
"workers": "Arbejdere",
@@ -433,8 +515,14 @@
"none": "Ingen",
"alliances": "Alliancer"
},
"replay_panel": {
"replay_speed": "Genafspilnings hastighed",
"game_speed": "Spil hastighed",
"fastest_game_speed": "maks"
},
"error_modal": {
"crashed": "Spillet crashede!",
"connection_error": "Forbindelsesfejl!",
"paste_discord": "Indsæt venligst følgende i din fejlrapport i Discord:",
"copy_clipboard": "Kopier til udklipsholder",
"copied": "Kopieret!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Vælg en startplacering"
},
"territory_patterns": {
"title": "Vælg Territoriummønster",
"purchase": "Køb",
"blocked": {
"login": "Du skal være logget ind for at få adgang til dette mønster.",
"purchase": "Køb dette mønster for at låse det op."
},
"pattern": {
"default": "Standard",
"custom": "Brugerdefineret",
"stripes_v": "Lodret",
"stripes_h": "Vandret",
"horizontal_stripes": "Vandret (Alt)",
"vertical_bars": "Lodret (Alt)",
"checkerboard": "Skaktern",
"choco": "Choco",
"diagonal": "Diagonalt",
"cross": "Kryds",
"mini_cross": "Mini Kryds",
"sword": "Sværd",
"sparse_dots": "Spredte Prikker",
"evan": "Evansk",
"diagonal_stripe": "Diagonale Striber",
"mountain_ridge": "Bjergryg",
"scattered_dots": "Spredte Prikker",
"circuit_board": "Kredsløbstavle",
"shells": "Skaller",
"-w-": ".w.",
"white_rabbit": "Hvid Kanin",
"goat": "Ged",
"cats": "Katte",
"cursor": "Musemarkør",
"hand": "Hånd",
"radiation": "Stråling",
"openfront_qr": "OpenFront.io QR kode",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Emblem",
"grogu_head": "Grogu Hoved",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Login er påkrævet for at få adgang til denne hjemmeside.",
"redirecting": "Du bliver omdirigeret...",
"not_authorized": "Du har ikke adgang til denne hjemmeside.",
"contact_admin": "Hvis du mener, at du ser denne besked ved en fejl, bedes du kontakte hjemmesidens administrator."
}
}
+395 -32
View File
@@ -1,13 +1,33 @@
{
"lang": {
"en": "German",
"native": "Deutsch",
"svg": "de",
"lang_code": "de"
},
"common": {
"close": "Schließen"
},
"main": {
"title": "OpenFront (ALPHA)",
"join_discord": "Tritt dem Discord bei!",
"login_discord": "Anmelden mit Discord",
"checking_login": "Überprüfe Login...",
"logged_in": "Angemeldet!",
"log_out": "Abmelden",
"create_lobby": "Lobby erstellen",
"join_lobby": "Lobby beitreten",
"single_player": "Einzelspieler",
"instructions": "Anleitung",
"how_to_play": "Wie man Spielt",
"advertise": "Werbung",
"wiki": "Wiki"
},
"news": {
"full_changelog": "Gesamtes Änderungsprotokoll ansehen",
"github_link": "auf GitHub",
"title": "Versionshinweise"
},
"help_modal": {
"hotkeys": "Tastaturbelegungen",
"table_key": "Tastenkombination",
@@ -15,6 +35,7 @@
"action_alt_view": "Alternative Ansicht anzeigen (Gebiete/Länder)",
"action_attack_altclick": "Angriff ausführen (wenn Linksklick auf \"öffne Menü\" gestellt ist)",
"action_build": "Baumenü öffnen",
"action_emote": "Emote-Menü öffnen",
"action_center": "Karte auf Spieler zentrieren",
"action_zoom": "Ansicht vergrößern/verkleinern",
"action_move_camera": "Kamera bewegen",
@@ -22,50 +43,62 @@
"action_reset_gfx": "Grafik zurücksetzen",
"ui_section": "Spieloberfläche",
"ui_leaderboard": "Bestenliste",
"ui_leaderboard_desc": "Zeigt die Namen, % an besetzter Landfläche und Gold der stärksten Spieler im Spiel an.",
"ui_your_team": "Dein Team:",
"ui_leaderboard_desc": "Zeigt die besten Spieler des Spiels und ihre Namen, % des Besitzes von Land, Gold und Truppen. Mit \"Alle anzeigen\" werden alle Spieler im Spiel angezeigt. Wenn du die Rangliste nicht sehen möchtest, klicke auf \"Verstecken\".",
"ui_control": "Aktionsmenü",
"ui_control_desc": "Der Kontrollbereich beinhaltet folgende Elemente:",
"ui_pop": "Bevölkerung - Die Anzahl der aktuellen Einheiten, die maximale Bevölkerungszahl und die Geschwindigkeit mit der man neue Einheiten bekommst.",
"ui_gold": "Gold - Die aktuelle Menge an Gold, und die Geschwindigkeit mit der man Gold bekommt.",
"ui_troops_workers": "Truppen und Arbeiter - Die Menge der zugewiesenen Truppen und Arbeiter. Truppen werden zum Angriff oder zur Verteidigung gegen Angriffe eingesetzt. Arbeiter erzeugen Gold. Die Anzahl der Truppen und Arbeiter kann mit dem Schieberegler eingestellt werden.",
"ui_attack_ratio": "Angriffsverhältnis - Die Anzahl der Truppen, die beim Angriff verwendet werden, kann mit dem Schieberegler angepasst werden. Je mehr Truppen beim Angriff verwendet werden desto geringer sind die eigenen Verluste. Während weniger Truppen zu größeren Verlusten führen.\nDieser Effekt geht nicht über das Verhältnis von 2:1 hinaus.",
"ui_events": "Ereignis-Panel",
"ui_events_desc": "Das Ereignis-Panel zeigt die neuesten Ereignisse, Anfragen und Schnell-Nachrichten. Einige Beispiele sind:",
"ui_events_alliance": "Allianz - Allianzanfragen können akzeptiert oder abgelehnt werden. Alliierte können Ressourcen und Truppen teilen, können sich aber nicht gegenseitig angreifen. Durch Klicken auf \"Fokussieren\" wird die Ansicht an den Spieler verschoben, der die Anfrage gesendet hat.",
"ui_events_attack": "Angriffe - Eingehende Angriffe und ausgehende Angriffe werden angezeigt. Klicke auf die Nachricht, um die Ansicht auf den Angriff, Atomrakete oder (Transport-)Schiff zu zentrieren. Du kannst Truppen zurückziehen, indem du auf das rote X klickst. Dies wird 25% deiner angreifenden Truppen das Leben kosten. Wenn du einen Schiff zurück rufst, kehrt es an seinen Startpunkt zurück. Sollte der Startpunkt von einer anderen Fraktion erobert worden sein, greift es dort an. Atomwaffen können nicht zurückgezogen werden, sobald sie gestartet wurden.",
"ui_events_quickchat": "Schnellnachrichten - Hier können gesendete und empfangene Chat-Nachrichten eingesehen werden. Sende eine Nachricht an andere Spieler über das Nachrichten-Symbol in deren Info-Menü.",
"ui_options": "Optionen",
"ui_options_desc": "Die folgenden Schaltflächen sind in den Optionen verfügbar:",
"ui_playeroverlay": "Spieler-Info-Overlay",
"ui_playeroverlay_desc": "Wenn du über ein Land fährst, wird die Info-Übersicht des Spielers unter den Optionen angezeigt. Es zeigt den Typ des Spielers an: Menschlicher Spieler, Nation (schlauer Bot), oder Bot. Die Haltung einer Nation zu dir, von feindselig bis Freund. Und verteidigende Truppen, Gold, sowie die Anzahl der Kriegsschiffe und verschiedene Gebäude, die der Spieler hat.",
"option_pause": "Spiel pausieren/fortsetzen - Nur im Einzelspieler möglich.",
"option_timer": "Spieluhr - Vergangene Zeit seit Spielbeginn.",
"option_exit": "Spiel verlassen.",
"option_settings": "Einstellungen - Öffnet die Spieleinstellungen. Dort können die alternative Kartenansicht, der Dunkle Modus, Emojis und Aktion beim Linksklick eingestellt werden",
"option_settings": "Einstellungen - Öffnet die Einstellungen. Dort können die alternative Ansicht, der dunkle Modus, Ninja (anonyme/zufällige Namen) und die Aktion bei Linksklick eingestellt werden.",
"radial_title": "Radialmenü",
"radial_desc": "Rechtsklick (bei Berührung auf Mobilgeräten) öffnet das Aktionsmenü. Von dort kann man:",
"radial_build": "Das Baumenü öffnen.",
"radial_desc": "Rechtsklick (oder Touch auf dem Smartphone) öffnet das Menü. Rechtsklick außerhalb des Menüs schließt dieses. Aus dem Menü heraus kann man:",
"radial_build": "Baumenü öffnen.",
"radial_info": "Den Infobereich öffnen.",
"radial_boat": "Ein Boot zum Angriff auf das gewählte Gebiet schicken (nur verfügbar bei Zugang zu Wasser).",
"radial_boat": "Ein Transportschiff zum Angriff zum gewählten Gebiet schicken. Nur verfügbar mit Zugang zu Wasser.",
"radial_close": "Das Menü schließen.",
"info_title": "Infobereich",
"info_enemy_desc": "Beinhaltet Informationen wie den Namen, Gold und Truppen für den Spieler. Zeigt zusätzlich an ob der Spieler ein Verräter ist. Ein Verräter ist ein Spieler welcher ein Bündnis gebrochen und seinen Verbündeten angegriffen hat. Die folgenden Icons stehen für folgende Aktionen:",
"info_enemy_desc": "Enthält Informationen wie den Namen des ausgewählten Spielers, Gold, Truppen, ob der Handel gestoppt wurde, Anzahl der Atombomben die er gesendet hat und ob der Spieler ein Verräter ist. Gestoppter Handel bedeutet, dass du kein Gold von ihm erhältst und du kein Gold über Handelsschiffe schickst. Manuell (wenn der Spieler auf \"Handel stoppen\" klickte, was gilt bis beide wieder \"Handel starten\" klicken) oder automatisch (wenn du deine Allianz verraten hast und diese erneuerst oder nach 5 Minuten). Verräter zeigt Ja für 30 Sekunden, wenn der Spieler einen Spieler verraten und angegriffen hat, der sich in einer Allianz mit ihm befand. Die folgenden Symbole repräsentieren die folgenden Interaktionen:",
"info_chat": "Sende eine kurze Chat-Nachricht an den Spieler. Wähle eine Kategorie, einen Ausdruck, und wenn der Ausdruck [P1] enthält, wähle einen Spielernamen aus, um ihn zu ersetzen. Klicke auf Senden.",
"info_target": "Platziert eine Zielscheibe auf dem Spieler, als Markierung für alle Verbündeten zur Koordination von gemeinsamen Angriffen.",
"info_alliance": "Sendet eine Bündnis-Anfrage an den Spieler. Verbündete können Ressourcen und Truppen teilen, sich aber nicht gegenseitig angreifen.",
"info_emoji": "Sendet ein Emoji an den Spieler.",
"info_trade": "Benutze \"Handel stoppen\" um aufzuhören dem Spieler Gold über eure Handelsschiffe zu geben und Gold von Handelsschiffen des Spielers zu erhalten. Klickt ihr beide wieder auf \"Handel beginnen\" geht es wieder los.",
"info_ally_panel": "Bündnis Infobereich",
"info_ally_desc": "Wenn man sich mit einem Spieler verbündet werden die folgenden Icons sichtbar:",
"ally_betray": "Verrät den Verbündeten, was das Bündnis beendet. Hat eine permanente Markierung als Verräter zur Folge, wenn der Verbündete nicht bereits selbst ein Verräter war. Feindliche Angriffe werden bis zum Ende des Spiels größeren Schaden anrichten. Bots werden seltener Bündnisse mit Verrätern eingehen und menschliche Spieler sich es zweimal überlegen mit einem Verräter verbündet zu sein.",
"ally_betray": "Verrate deinen Verbündeten, beende die Allianz, stoppe den Handel und schwäche deine Verteidigung. Der Handel zwischen Ihnen wird für 5 Minuten unterbrochen (oder bis du dich wieder verbündest) und andere können auch den Handel einstellen. Und wenn der andere Spieler nicht selbst Verräter war, wirst du 30 Sekunden lang als Verräter markiert. Während dieser Zeit wird ein Symbol oberhalb deines Namens angezeigt und deine Verteidigung wird um 50% reduziert. Dass Bots sich verbünden ist eher unwahrscheinlich und die Spieler werden es sich vorher zweimal überlegen.",
"ally_donate": "Teile einige Truppen mit dem verbündeten Spieler. Kann benutzt werden, um einen angegriffenen Verbündeten mit Truppen zu helfen oder diesem bei einem vernichtenden Schlag gegen einen Feind zu unterstützen.",
"ally_donate_gold": "Spende einen Teil deines Goldes an deinen Alliierten. Wird verwendet, wenn Gold für Gebäude benötigt wird, oder wenn der Verbündete für ein MIRV spart.",
"build_menu_title": "Baumenü",
"build_menu_desc": "Baue eines davon oder sehe wie viele du bereits gebaut hast:",
"build_name": "Name",
"build_icon": "Icon",
"build_desc": "Beschreibung",
"build_city": "Stadt",
"build_city_desc": "Erhöht die maximale Bevölkerungsanzahl. Nützlich, wenn das eigene Territorium nicht erweitert werden kann oder das Bevölkerungslimit erreicht wird.",
"build_defense": "Verteidigungsposten",
"build_defense_desc": "Erhöht die Verteidigung von anliegenden Grenzen. Angriffe von Feinden sind langsamer und sorgen für mehr Verluste des Feindes.",
"build_defense_desc": "Erhöht die Verteidigung von anliegenden Grenzen, markiert mit einem karierten Muster. Angriffe von Feinden sind langsamer und sorgen für mehr Verluste beim Feind.",
"build_port": "Hafen",
"build_port_desc": "Sendet automatisch Handelsschiffe zwischen eigenen Häfen und denen anderer Länder (außer es wurde bei oder von einem anderen Spieler \"Handel stoppen\" im Infobereich geklickt), welche Gold für beide Seiten einbringen. Ermöglicht den Bau von Kriegsschiffen. Kann nur in der Nähe von Wasser gebaut werden.",
"build_port_desc": "Kann nur in der Nähe von Wasser gebaut werden. Erlaubt den Bau von Kriegsschiffen. Schickt automatisch Handelsschiffe zwischen deinen Häfen und denen anderer Länder (außer wenn der Handel gestoppt wird) und gibt Gold an beide Seiten. Der Handel stoppt automatisch, wenn du einen Spieler angreifst oder angegriffen wirst. Der Handel wird nach 5 Minuten wieder aufgenommen, oder wenn du dich mit dem Spieler verbündest. Sie können den Handel manuell mit \"Handel stoppen\" oder \"Handel starten\" an-/ausschalten.",
"build_warship": "Kriegsschiff",
"build_warship_desc": "Patrouilliert in einem Gebiet und kapert Handelsschiffe, zerstört feindliche Kriegsschiffe und Transportschiffe. Erscheint beim nächstgelegenen Hafen und patrouilliert im Gebiet wo es gebaut wurde. Mit einem Klick auf das Kriegsschiff kann es gesteuert und mit einem weiteren Klick in ein anderes Gebiet geschickt werden.",
"build_warship_desc": "Patrouilliert in einem Gebiet und kapert Handelsschiffe, zerstört feindliche Kriegsschiffe und Boote (Transportschiffe). Erscheint beim nächstgelegenen Hafen und patrouilliert im Gebiet wo es gebaut wurde. Mit einem Klick auf das Kriegsschiff kann es gesteuert und mit einem weiteren Klick in ein anderes Gebiet geschickt werden.",
"build_silo": "Raketensilo",
"build_silo_desc": "Ermöglicht das Abfeuern von Raketen und Bomben.",
"build_sam": "Flugabwehr",
"build_sam_desc": "Hat eine 75% Chance feindliche Raketen und Bomben in einem 100 Pixel Radius abzufangen. Die Flugabwehr hat eine 7,5 Sekunden Abklingzeit und kann keine MIRVs abfangen.",
"build_sam_desc": "Kann feindliche Raketen in ihrem 100-Pixel-Bereich abfangen. Mit einer 100%igen Trefferchance für Atombomben, 80% für Wasserstoffbomben und 50% für einzelne MIRV-Sprengköpfe. Das SAM hat eine Abklingzeit von 7,5 Sekunden.",
"build_atom": "Atombombe",
"build_atom_desc": "Bombe für eine kleine Explosion, die Territorium, Gebäude, Schiffe und Boote zerstört. Wird vom nächstgelegenen Raketensilo abgefeuert und schlägt am Punkt wo sie gebaut wurde ein.",
"build_hydrogen": "Wasserstoffbombe",
@@ -74,11 +107,12 @@
"build_mirv_desc": "Die stärkste Bombe im Spiel. Teilt sich in kleinere Bomben auf, die auf vielen Gebieten einschlagen. Beschädigt nur den Spieler auf den beim Bau der Bombe geklickt wurde. Wird vom nächstgelegenen Raketensilo abgefeuert und schlägt am Punkt wo sie gebaut wurde ein.",
"player_icons": "Spieler-Icons",
"icon_desc": "Beispiele zu einigen Icons während des Spielens und ihre Bedeutung:",
"icon_crown": "Krone - Dieser Spieler ist auf Platz 1 der Bestenliste.",
"icon_traitor": "Gekreuzte Schwerter - Verräter. Dieser Spieler hat einen Verbündeten verraten und angegriffen.",
"icon_crown": "Krone - Nummer 1. Dies ist der Top-Spieler in der Rangliste.",
"icon_traitor": "Zerbrochener Schild - Verräter. Dieser Spieler hat einen Verbündeten angegriffen.",
"icon_ally": "Handschlag - Verbündeter. Dieser Spieler ist ein Verbündeter.",
"info_enemy_panel": "Gegner-Infobereich",
"action_emote": "Emote-Menü öffnen"
"icon_embargo": "Dollar Stoppschild - Embargo. Dieser Spieler hat den Handel mit Dir automatisch oder manuell eingestellt.",
"icon_request": "Umschlag - Allianzanfrage. Dieser Spieler hat dir eine Allianzanfrage geschickt.",
"info_enemy_panel": "Gegner-Infobereich"
},
"single_modal": {
"title": "Einzelspieler",
@@ -91,10 +125,13 @@
"infinite_gold": "Unendlich Gold",
"infinite_troops": "Unendlich Truppen",
"disable_nukes": "Atomwaffen deaktivieren",
"enables_title": "Aktiviere Einstellungen",
"start": "Spiel starten"
},
"map": {
"map": "Karte",
"world": "Welt",
"giantworldmap": "Riesige Weltkarte",
"europe": "Europa",
"mena": "MENA",
"northamerica": "Nordamerika",
@@ -110,9 +147,24 @@
"random": "Zufällig",
"iceland": "Island",
"pangaea": "Pangaea",
"map": "Karte",
"eastasia": "Ostasien",
"betweentwoseas": "Zwischen zwei Meeren",
"knownworld": "Bekannte Welt"
"faroeislands": "Färöer-Inseln",
"deglaciatedantarctica": "Enteiste Antarktis",
"europeclassic": "Europa (klassisch)",
"falklandislands": "Falklandinseln",
"baikal": "Baikalsee",
"halkidiki": "Halkidiki",
"straitofgibraltar": "Straße von Gibraltar",
"italia": "Italien"
},
"map_categories": {
"continental": "Kontinental",
"regional": "Regional",
"fantasy": "Andere"
},
"map_component": {
"loading": "Lädt..."
},
"private_lobby": {
"title": "Privater Lobby beitreten",
@@ -127,7 +179,11 @@
},
"public_lobby": {
"join": "Nächstem Spiel beitreten",
"waiting": "wartende Spieler"
"waiting": "wartende Spieler",
"teams_Duos": "Duos (Teams von 2)",
"teams_Trios": "Trios (Teams von 3)",
"teams_Quads": "Quads (Teams von 4)",
"teams": "{num} Teams"
},
"username": {
"enter_username": "Benutzernamen eingeben",
@@ -138,6 +194,8 @@
},
"host_modal": {
"title": "Private Lobby",
"mode": "Modus",
"team_count": "Teamanzahl",
"options_title": "Optionen",
"bots": "Bots:",
"bots_disabled": "Deaktiviert",
@@ -145,29 +203,32 @@
"instant_build": "Sofortiges Bauen",
"infinite_gold": "Unendlich Gold",
"infinite_troops": "Unendlich Truppen",
"disable_nukes": "Atomwaffen deaktivieren",
"enables_title": "Aktiviere Einstellungen",
"player": "Spieler",
"players": "Spieler",
"waiting": "Warte auf Spieler...",
"start": "Spiel starten",
"mode": "Modus"
"start": "Spiel starten"
},
"difficulty": {
"Relaxed": "Entspannt",
"Balanced": "Ausgeglichen",
"Intense": "Anspruchsvoll",
"Impossible": "Unmöglich",
"difficulty": "Schwierigkeitsgrad"
"team_colors": {
"red": "Rot",
"blue": "Blau",
"teal": "Türkis",
"purple": "Lila",
"yellow": "Gelb",
"orange": "Orange",
"green": "Grün",
"bot": "Bot"
},
"game_starting_modal": {
"title": "Das Spiel startet...",
"desc": "Der Start der Lobby wird vorbereitet. Bitte warten."
},
"lang": {
"en": "German",
"native": "Deutsch",
"svg": "de",
"lang_code": "de"
"difficulty": {
"difficulty": "Schwierigkeitsgrad",
"Relaxed": "Entspannt",
"Balanced": "Ausgeglichen",
"Intense": "Anspruchsvoll",
"Impossible": "Unmöglich"
},
"game_mode": {
"ffa": "Free for All",
@@ -175,5 +236,307 @@
},
"select_lang": {
"title": "Sprache auswählen"
},
"unit_type": {
"city": "Stadt",
"defense_post": "Verteidigungsposten",
"port": "Hafen",
"warship": "Kriegsschiff",
"missile_silo": "Raketensilo",
"sam_launcher": "Flugabwehr-Raketenstellung",
"atom_bomb": "Atombombe",
"hydrogen_bomb": "Wasserstoffbombe",
"mirv": "MIRV-Rakete",
"factory": "Fabrik"
},
"user_setting": {
"title": "Benutzer Einstellungen",
"tab_basic": "Allgemeine Einstellungen",
"tab_keybinds": "Tastenbelegung",
"dark_mode_label": "Dunkler Modus",
"dark_mode_desc": "Wechseln zwischen dem dunklen und hellen Design der Website",
"emojis_label": "Emojis",
"emojis_desc": "Emojis im Spiel ein-/ausblenden",
"alert_frame_label": "Warnrahmen",
"alert_frame_desc": "Den Warnrahmen umschalten. Wenn aktiviert, wird der Rahmen angezeigt, wenn du verraten wirst.",
"special_effects_label": "Spezialeffekte",
"special_effects_desc": "Spezialeffekte (de-)aktivieren. Deaktivieren um die Leistung zu verbessern",
"anonymous_names_label": "Verborgene Namen",
"anonymous_names_desc": "Echte Spielernamen mit zufälligen Namen auf deinem Bildschirm ausblenden.",
"left_click_label": "Linksklick zum Öffnen des Menüs",
"left_click_desc": "Wenn AN, öffnet Linksklick das Menü und die Schwertattacken-Schaltfläche. Wenn AUS, greift Linksklick direkt an.",
"attack_ratio_label": "⚔️ Angriffsverhältnis",
"attack_ratio_desc": "Prozentsatz deiner Truppen die in den Angriff geschickt werden (1100 %)",
"troop_ratio_label": "🪖🛠️ Truppen-/Arbeiter-Verhältnis",
"troop_ratio_desc": "Stelle das Verhältnis zwischen Truppen (für den Kampf) und Arbeitern (für die Goldproduktion) ein (1100%)",
"territory_patterns_label": "🏳️ Gebietsmuster",
"territory_patterns_desc": "Wähle, ob Gebietsmuster im Spiel angezeigt werden sollen",
"easter_writing_speed_label": "Schreibgeschwindigkeits-Multiplikator",
"easter_writing_speed_desc": "Anpassen, wie schnell Du vorgibst zu programmieren (x1x100)",
"easter_bug_count_label": "Anzahl der Bugs",
"easter_bug_count_desc": "Wie viele Bugs kannst du emotional noch verkraften? (01000, emotional)",
"view_options": "Anzeigeeinstellungen",
"toggle_view": "Ansicht umschalten",
"toggle_view_desc": "Alternative Ansicht anzeigen (Gebiete/Länder)",
"attack_ratio_controls": "Angriffsverhältnis Steuerung",
"attack_ratio_up": "Angriffsverhältnis erhöhen",
"attack_ratio_up_desc": "Angriffsverhältnis erhöhen um 10%",
"attack_ratio_down": "Angriffsverhältnis verringern",
"attack_ratio_down_desc": "Angriffsverhältnis verringern um 10%",
"attack_keybinds": "Angriffs-Tastenkürzel",
"boat_attack": "Bootsangriff",
"boat_attack_desc": "Sende einen Bootsangriff auf die Kachel unter deinem Cursor.",
"ground_attack": "Bodenangriff",
"ground_attack_desc": "Sende einen Bodenangriff auf den Pixel unter deinem Cursor.",
"zoom_controls": "Zoomeinstellungen",
"zoom_out": "Verkleinern",
"zoom_out_desc": "Karte verkleinern",
"zoom_in": "Vergrößern",
"zoom_in_desc": "Karte vergrößern",
"camera_movement": "Kamerasteuerung",
"center_camera": "Kamera zentrieren",
"center_camera_desc": "Zentriert die Kamera auf den Spieler",
"move_up": "Kamera nach oben bewegen",
"move_up_desc": "Bewegt die Kamera nach oben",
"move_left": "Kamera nach links bewegen",
"move_left_desc": "Bewegt die Kamera nach links",
"move_down": "Kamera nach unten bewegen",
"move_down_desc": "Bewegt die Kamera nach unten",
"move_right": "Kamera nach rechts bewegen",
"move_right_desc": "Bewegt die Kamera nach rechts",
"reset": "Zurücksetzen",
"unbind": "Aufheben"
},
"chat": {
"title": "Chat",
"to": "Gesendet an {user}: {msg}",
"from": "Von {user}: {msg}",
"category": "Kategorie",
"phrase": "Satz",
"player": "Spieler",
"send": "Senden",
"search": "Spieler suchen...",
"build": "Erstelle deine Nachricht...",
"cat": {
"help": "Hilfe",
"attack": "Angriff",
"defend": "Verteidigen",
"greet": "Grüße",
"misc": "Verschiedenes",
"warnings": "Warnungen"
},
"help": {
"troops": "Bitte gib mir Truppen!",
"gold": "Bitte gib mir Gold!",
"no_attack": "Bitte greife mich nicht an!",
"sorry_attack": "Entschuldigung, ich wollte nicht angreifen.",
"alliance": "Allianz?",
"help_defend": "Hilf mir, gegen [P1] zu verteidigen!",
"team_up": "Lass uns gemeinsam gegen [P1] kämpfen!"
},
"attack": {
"attack": "Greife [P1] an!",
"mirv": "Starte einen MIRV auf [P1]!",
"focus": "Fokussiere Feuer auf [P1]!",
"finish": "Lass uns mit [P1] fertig werden!"
},
"defend": {
"defend": "Verteidige [P1]!",
"dont_attack": "Greife [P1] nicht an!",
"ally": "[P1] ist mein Verbündeter!"
},
"greet": {
"hello": "Hallo!",
"good_luck": "Viel Glück!",
"have_fun": "Viel Spaß!",
"gg": "GG!",
"nice_to_meet": "Schön, dich kennenzulernen!",
"well_played": "Gut gespielt!",
"hi_again": "Hallo nochmal!",
"bye": "Tschüss!",
"thanks": "Danke!",
"oops": "Hoppla, falscher Knopf!",
"trust_me": "Du kannst mir vertrauen. Versprochen!",
"trust_broken": "Ich hatte dir vertraut..."
},
"misc": {
"go": "Los geht's!",
"strategy": "Schöne Strategie!",
"fun": "Dieses Spiel macht Spaß!",
"pr": "Wann wird mein PR endlich übernommen...?"
},
"warnings": {
"strong": "[P1] ist stark.",
"weak": "[P1] ist schwach.",
"mirv_soon": "[P1] kann bald ein MIRV starten!",
"number1_warning": "Der #1 Spieler wird bald gewinnen, es sei denn, wir werden ein Team!",
"stalemate": "Lassen Sie uns Frieden schließen. Das ist eine Sackgasse, wir werden beide verlieren.",
"has_allies": "[P1] hat viele Verbündete.",
"no_allies": "[P1] hat keine Verbündeten.",
"betrayed": "[P1] hat seinen Verbündeten verraten!",
"getting_big": "[P1] wächst zu schnell!",
"danger_base": "[P1] ist ungeschützt!",
"saving_for_mirv": "[P1] spart, um eine MIRV-Rakete zu starten.",
"mirv_ready": "[P1] hat genug Gold, um eine MIRV-Rakete zu starten!"
}
},
"build_menu": {
"desc": {
"atom_bomb": "Kleine Explosion",
"hydrogen_bomb": "Große Explosion",
"mirv": "Riesige Explosion, trifft nur ausgewählten Spieler",
"missile_silo": "Ermöglicht den Einsatz von Atomraketen",
"sam_launcher": "Verteidigt gegen eingehende Atomraketen",
"warship": "Erobert Handelsschiffe, zerstört Schiffe und Boote",
"port": "Sendet Handelsschiffe, um Gold zu generieren",
"defense_post": "Erhöht Verteidigung der Grenzen in der Nähe",
"city": "Erhöht maximale Bevölkerung"
},
"not_enough_money": "Nicht genug Geld"
},
"win_modal": {
"died": "Du bist gestorben",
"your_team": "Dein Team hat gewonnen!",
"other_team": "Team {team} hat gewonnen!",
"you_won": "Du hast gewonnen!",
"other_won": "{player} hat gewonnen!",
"exit": "Spiel verlassen",
"keep": "Weiterspielen",
"wishlist": "Zur Steam-Wunschliste hinzufügen!"
},
"leaderboard": {
"title": "Rangliste",
"hide": "Ausblenden",
"rank": "Rang",
"player": "Spieler",
"team": "Team",
"owned": "Besitz",
"gold": "Gold",
"troops": "Truppen",
"show_top_5": "Top 5 anzeigen",
"show_all": "Alle anzeigen"
},
"player_info_overlay": {
"type": "Typ",
"bot": "Bot",
"nation": "Nation",
"player": "Spieler",
"team": "Team",
"d_troops": "Verteidigende Truppen",
"a_troops": "Angreifende Truppen",
"gold": "Gold",
"ports": "Häfen",
"cities": "Städte",
"missile_launchers": "Raketenwerfer",
"sams": "SAMs",
"warships": "Schlachtschiffe",
"health": "Gesundheit",
"attitude": "Haltung",
"levels": "Levels"
},
"events_display": {
"retreating": "Zieht sich zurück",
"boat": "Boot",
"about_to_expire": "Deine Allianz mit {name} läuft bald ab!",
"renew_alliance": "Verlängerung beantragen",
"focus": "Fokus",
"alliance_renewed": "Deine Allianz mit {name} wurde erneuert",
"ignore": "Ignorieren"
},
"unit_info_modal": {
"structure_info": "Gebäudeinformation",
"unit_type_unknown": "Unbekannt",
"close": "Schließen",
"cooldown": "Abklingzeit",
"type": "Typ",
"upgrade": "Verbessern",
"level": "Level"
},
"relation": {
"hostile": "Feindlich",
"distrustful": "Misstrauisch",
"neutral": "Neutral",
"friendly": "Freundlich",
"default": "Standard"
},
"control_panel": {
"pop": "Bevölkerung",
"gold": "Gold",
"troops": "Truppen",
"workers": "Arbeiter",
"attack_ratio": "Angriffsverhältnis"
},
"player_panel": {
"gold": "Gold",
"troops": "Truppen",
"betrayals": "Anzahl der Verrate",
"traitor": "Verräter",
"alliance_time_remaining": "Allianz endet in",
"embargo": "Stoppte den Handel mit dir",
"nuke": "Auf dich abgefeuerte Atomwaffen",
"start_trade": "Handel starten",
"stop_trade": "Handel stoppen",
"yes": "Ja",
"no": "Nein",
"none": "Nichts",
"alliances": "Allianzen"
},
"replay_panel": {
"replay_speed": "Wiedergabegeschwindigkeit",
"game_speed": "Spielgeschwindigkeit"
},
"error_modal": {
"crashed": "Spiel ist abgestürzt!",
"connection_error": "Verbindungsfehler!",
"paste_discord": "Bitte füge folgendes in deinen Fehlerbericht auf Discord ein:",
"copy_clipboard": "In die Zwischenablage kopieren",
"copied": "Kopiert!",
"failed_copy": "Kopieren fehlgeschlagen",
"desync_notice": "Du wurdest von anderen Spielern desynchronisiert. Was du siehst, könnte sich von anderen Spielern unterscheiden."
},
"heads_up_message": {
"choose_spawn": "Wähle eine Startposition"
},
"territory_patterns": {
"title": "Gebietsmuster auswählen",
"purchase": "Kaufen",
"blocked": {
"login": "Du musst angemeldet sein, um auf dieses Muster zugreifen zu können.",
"purchase": "Kaufe dieses Muster, um es freizuschalten."
},
"pattern": {
"default": "Standard",
"custom": "Benutzerdefiniert",
"stripes_v": "Vertikal",
"stripes_h": "Horizontal",
"horizontal_stripes": "Horizontal (Alt)",
"vertical_bars": "Vertikal (Alt)",
"checkerboard": "Schachbrett",
"choco": "Schoko",
"diagonal": "Diagonal",
"cross": "Kreuz",
"mini_cross": "Mini-Kreuz",
"sword": "Schwert",
"sparse_dots": "Spärliche Punkte",
"evan": "Evan",
"diagonal_stripe": "Diagonaler Streifen",
"mountain_ridge": "Gebirgszug",
"scattered_dots": "Verstreute Punkte",
"circuit_board": "Platine",
"shells": "Muscheln",
"-w-": ".w.",
"white_rabbit": "Weißer Hase",
"goat": "Ziege",
"cats": "Katzen",
"cursor": "Zeiger",
"hand": "Hand",
"radiation": "Strahlung",
"openfront_qr": "OpenFront.io QR code",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Emblem",
"grogu_head": "Grogu Kopf",
"grogu": "Grogu"
}
}
}
+13 -6
View File
@@ -21,7 +21,9 @@
"instructions": "Instructions",
"how_to_play": "How to Play",
"advertise": "Advertise",
"wiki": "Wiki"
"wiki": "Wiki",
"privacy_policy": "Privacy Policy",
"terms_of_service": "Terms of Service"
},
"news": {
"full_changelog": "See the complete change log",
@@ -90,6 +92,8 @@
"build_desc": "Description",
"build_city": "City",
"build_city_desc": "Increases your max population. Useful when you can't expand your territory or you're about to hit your population limit.",
"build_factory": "Factory",
"build_factory_desc": "Creates railroads automatically with nearby structures, and spawns trains sporadically.",
"build_defense": "Defense Post",
"build_defense_desc": "Increases defenses around nearby borders, which show a checkered pattern. Attacks from enemies are slower and have more casualties.",
"build_port": "Port",
@@ -409,8 +413,9 @@
"sam_launcher": "Defends against incoming nukes",
"warship": "Captures trade ships, destroys ships and boats",
"port": "Sends trade ships to generate gold",
"defense_post": "Increase defenses of nearby borders",
"city": "Increase max population"
"defense_post": "Increases defenses of nearby borders",
"city": "Increases max population",
"factory": "Creates railroads and spawns trains"
},
"not_enough_money": "Not enough money"
},
@@ -432,9 +437,7 @@
"team": "Team",
"owned": "Owned",
"gold": "Gold",
"troops": "Troops",
"show_top_5": "Show Top 5",
"show_all": "Show All"
"troops": "Troops"
},
"player_info_overlay": {
"type": "Type",
@@ -447,6 +450,7 @@
"gold": "Gold",
"ports": "Ports",
"cities": "Cities",
"factories": "Factories",
"missile_launchers": "Missile launchers",
"sams": "SAMs",
"warships": "Warships",
@@ -573,6 +577,9 @@
"grogu": "Grogu"
}
},
"spawn_ad": {
"loading": "Loading advertisement..."
},
"auth": {
"login_required": "Login is required to access this website.",
"redirecting": "You are being redirected...",
+149 -13
View File
@@ -24,7 +24,9 @@
"wiki": "Vikio"
},
"news": {
"title": "23-a eldono publikigita!"
"full_changelog": "Vidi la plenan ŝanĝprotokolon",
"github_link": "ĉe GitHub",
"title": "Eldonnotoj"
},
"help_modal": {
"hotkeys": "Rapidklavoj",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Restarigi la grafismoj",
"ui_section": "Ludo uzantinterfaco",
"ui_leaderboard": "Ĉampionejo",
"ui_your_team": "Via teamo:",
"ui_leaderboard_desc": "Montras la ĉefajn ludantojn de la ludo kaj iliajn nomojn, % de posedata tero, oro kaj trupoj. Uzante \"Montri Ĉiujn\" oni vidas ĉiujn ludantojn en la ludo. Se vi ne volas vidi la rangoliston, alklaku \"Kaŝi\".",
"ui_control": "Kontrolpanelo",
"ui_control_desc": "La kontrolpanelo enhavas la sekvajn elementojn:",
@@ -57,6 +60,7 @@
"ui_options_desc": "La sekvaj elementoj povas esti trovigita interne:",
"ui_playeroverlay": "Supermetita fenestro de ludanto-informoj",
"ui_playeroverlay_desc": "Kiam vi pasigas la muson super lando, la supermetita fenestro de ludanto-informoj aperas sub Opcioj. Ĝi montras la tipon de ludanto: Homo, Nacio (inteligenta roboto), aŭ Roboto. Por Nacioj, ĝi ankaŭ montras ilian sintenon al vi, intervalante de Malamika ĝis Amika. Krome, vi povas vidi la nombron da defendaj trupoj, oro, kaj la nombron da milŝipoj kaj diversaj konstruaĵoj, kiujn la ludanto posedas.",
"ui_wilderness": "Sovaĝejo",
"option_pause": "Paŭzigi/Rekomenci la ludon - Nur ebla en la solan modo.",
"option_timer": "Kronometro - Pasinta tempo ekde la luda komenco.",
"option_exit": "Elira butono",
@@ -86,6 +90,8 @@
"build_desc": "Priskribo",
"build_city": "Urbo",
"build_city_desc": "Utila kiam vi ne povas pligrandigi vian teritorion aŭ kiam vi atingas vian loĝantlimon.",
"build_factory": "Fabriko",
"build_factory_desc": "Kreas fervojojn aŭtomate kun apud konstruaĵoj, kaj generas trajnojn sporade.",
"build_defense": "Defenda posteno",
"build_defense_desc": "Plialtigas la defendon ĉirkaŭ najbaraj landlimoj, kiuj montriĝas per kontrolita ŝablono. Atakoj de malamikoj estas pli malrapidaj kaj kaŭzas pli da viktimoj.",
"build_port": "Haveno",
@@ -109,7 +115,8 @@
"icon_ally": "Manpremo - Aliancano. Ĉi tiu ludanto estas via aliancano.",
"icon_embargo": "Dolar-haltsigno - Embargo. Ĉi tiu ludanto ĉesis komerci kun vi aŭtomate aŭ mane.",
"icon_request": "Koverto Aliancopeto. Ĉi tiu ludanto sendis al vi peton pri alianco.",
"info_enemy_panel": "Malamiko informpanelo"
"info_enemy_panel": "Malamiko informpanelo",
"exit_confirmation": "Ĉu vi certe volas eliri el la ludo?"
},
"single_modal": {
"title": "Sola Ludanto",
@@ -128,6 +135,7 @@
"map": {
"map": "Karto",
"world": "Mondo",
"giantworldmap": "Giganta Mondmapo",
"europe": "Eŭropo",
"mena": "Mezoriento kaj Nordafriko",
"northamerica": "Nordameriko",
@@ -151,13 +159,17 @@
"falklandislands": "Falklandoj",
"baikal": "Bajkalo",
"halkidiki": "Ĥalkidiko",
"giantworldmap": "Giganta Mondmapo"
"straitofgibraltar": "Ĝibraltara Markolo",
"italia": "Italio"
},
"map_categories": {
"continental": "Kontinenta",
"regional": "Regiona",
"fantasy": "Alia"
},
"map_component": {
"loading": "Ŝargante..."
},
"private_lobby": {
"title": "Aliĝi al privata ludejo",
"enter_id": "Enigu la ludejan ID-on",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Kunigi la baldaŭan ludon",
"waiting": "atendante ludantoj",
"teams_Duos": "Duopoj (teamoj de 2)",
"teams_Trios": "Triopoj (teamoj de 3)",
"teams_Quads": "Kvaropoj (teamoj de 4)",
"teams": "{num} teamoj"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "Atendante ludantojn...",
"start": "Komenci la ludon"
},
"team_colors": {
"red": "Ruĝa",
"blue": "Blua",
"teal": "Verd-blua",
"purple": "Viola",
"yellow": "Flava",
"orange": "Oranĝa",
"green": "Verda",
"bot": "Roboto"
},
"game_starting_modal": {
"title": "Ludo komenciĝas...",
"desc": "Preparante por komenci la ludejon. Bonvolu atendi."
@@ -225,22 +250,36 @@
"sam_launcher": "SAM-lanĉilo",
"atom_bomb": "Atombombo",
"hydrogen_bomb": "Hidrogenbombo",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "Fabriko"
},
"user_setting": {
"title": "Uzantparametroj",
"tab_basic": "Bazaj parametroj",
"tab_keybinds": "Fulmoklavoj",
"dark_mode_label": "🌙 Malhela Modo",
"dark_mode_label": "Malhela Modo",
"dark_mode_desc": "Baskuli la retpaĝa aspekto inter hela kaj malhela temo",
"emojis_label": "😊 Emoĝioj",
"dark_mode_enabled": "Malhela etoso aktivigita",
"light_mode_enabled": "Hela etoso aktivigita",
"emojis_label": "Emoĝioj",
"emojis_visible": "Emoĝioj estas videblaj",
"emojis_hidden": "Emoĝioj estas maskitaj",
"emojis_desc": "Montri/Maski la emoĝiojn en la ludo",
"special_effects_label": "💥 Specialaj efektoj",
"alert_frame_label": "Avertkadro",
"alert_frame_desc": "Ŝalti la avertkadron. Kiam ebligita, la kadro estos montrata kiam vi estos perfidita.",
"special_effects_label": "Specialaj efektoj",
"special_effects_desc": "Baskuli specialajn efektojn. Malaktivigu por plibonigi funkciadon",
"anonymous_names_label": "🥷 Maskitaj Nomoj",
"special_effects_enabled": "Specialefektoj ebligitaj",
"special_effects_disabled": "Specialefektoj malebligitaj",
"anonymous_names_label": "Maskitaj Nomoj",
"anonymous_names_desc": "Kaŝi verajn uzantnomojn kun hazardaj sur via ekrano.",
"left_click_label": "🖱️Maldekstra alklako por malfermi menuon",
"anonymous_names_enabled": "Anonimaj nomoj estas ebligitaj",
"real_names_shown": "Veraj nomoj estas montritaj",
"left_click_label": "Maldekstra alklako por malfermi menuon",
"left_click_desc": "Kiam aktiviga, maldekstra alklako malfermas menuon kaj glava atakbutono. Kiam malaktiviga, maldekstra alklako atakas direkten.",
"left_click_menu": "Maldekstra alklako-menuo",
"left_click_opens_menu": "Maldekstra alklako malfermas menuon",
"right_click_opens_menu": "Dekstra alklako malfermas menuon",
"attack_ratio_label": "⚔️ Atakkvociento",
"attack_ratio_desc": "Kian procenton de viaj trupoj sendi en atako (1100%)",
"troop_ratio_label": "🪖🛠️ Trupoj kaj Laboristoj kvociento",
@@ -262,6 +301,8 @@
"attack_keybinds": "Atakaj Fulmoklavoj",
"boat_attack": "Boata Atako",
"boat_attack_desc": "Sendi boatan atakon al la kahelo sub via kursoro.",
"ground_attack": "Grundatako",
"ground_attack_desc": "Sendi grundatakon al la kahelo sub via kursoro.",
"zoom_controls": "Zomaj kontroloj",
"zoom_out": "Malzomi",
"zoom_out_desc": "Malzomi la mapon",
@@ -279,7 +320,14 @@
"move_right": "Movi Fotilon Dekstren",
"move_right_desc": "Movi la fotilon dekstren",
"reset": "Rekomencigi",
"unbind": "Senligi"
"unbind": "Senligi",
"on": "Ŝaltita",
"off": "Malŝaltita",
"toggle_terrain": "Ŝalti terenon",
"terrain_enabled": "Terenvido ebligita",
"terrain_disabled": "Terenvido malebligita",
"exit_game_label": "Eliri la ludon",
"exit_game_info": "Reiri al precipa menuo"
},
"chat": {
"title": "Rapida Babilejo",
@@ -363,8 +411,9 @@
"sam_launcher": "Defendas kontraŭ alvenantaj atombomboj",
"warship": "Kaptas komercŝipojn, detruas ŝipojn kaj boatojn",
"port": "Sendas komercŝipojn por produkti oron",
"defense_post": "Pligrandigi defendojn de proksimumaj landlimoj",
"city": "Pligrandigi maksiman loĝantaron"
"defense_post": "Pligrandigas defendojn de proksimumaj landlimoj",
"city": "Pligrandigas maksiman loĝantaron",
"factory": "Kreas fervojojn kaj generas trajnojn"
},
"not_enough_money": "Ne sufiĉe da mono"
},
@@ -383,6 +432,7 @@
"hide": "Maski",
"rank": "Rango",
"player": "Ludanto",
"team": "Teamo",
"owned": "Posedata",
"gold": "Oro",
"troops": "Trupoj"
@@ -402,7 +452,39 @@
"sams": "SAM-oj",
"warships": "Militŝipoj",
"health": "Sano",
"attitude": "Teniĝo"
"attitude": "Teniĝo",
"levels": "Niveloj"
},
"events_display": {
"retreating": "retiriĝas",
"boat": "Boato",
"alliance_request_status": "{name} {status} vian aliancpeton",
"alliance_accepted": "akceptis",
"alliance_rejected": "rifuzis",
"duration_second": "1 sekundo",
"betrayal_description": "Vi rompis vian aliancon kun {name}, igante vin PERFIDULO ({malusPercent}% defenda malfortigon dum {durationText})",
"duration_seconds_plural": "{seconds} sekundoj",
"betrayed_you": "{name} rompis sian aliancon kun vi",
"about_to_expire": "Via alianco kun {name} baldaŭ eksvalidiĝos!",
"alliance_expired": "Via alianco kun {name} eksvalidiĝis",
"attack_request": "{name} petas vin ataki {target}",
"sent_emoji": "Sendita al {name}: {emoji}",
"renew_alliance": "Peti renovigon",
"request_alliance": "{name} petas aliancon!",
"focus": "Fokusi",
"accept_alliance": "Akcepti",
"reject_alliance": "Rifuzi",
"alliance_renewed": "Via alianco kun {name} estis renovigita",
"ignore": "Ignori"
},
"unit_info_modal": {
"structure_info": "Informoj pri strukturo",
"unit_type_unknown": "Nekonata",
"close": "Fermi",
"cooldown": "Atendtempo",
"type": "Tipo",
"upgrade": "Promocii",
"level": "Nivelo"
},
"relation": {
"hostile": "Malamika",
@@ -433,8 +515,14 @@
"none": "Neniu",
"alliances": "Aliancoj"
},
"replay_panel": {
"replay_speed": "Reluda rapideco",
"game_speed": "Luda rapideco",
"fastest_game_speed": "maks"
},
"error_modal": {
"crashed": "Ludo kolapsis!",
"connection_error": "Eraro de konekto!",
"paste_discord": "Bonvolu elpoŝigi la jenon en via cimo-raporto en Discord:",
"copy_clipboard": "Kopii al tondujo",
"copied": "Kopiita!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Elektu komencan lokon"
},
"territory_patterns": {
"title": "Elekti Teritoriajn Ŝablonojn",
"purchase": "Aĉeti",
"blocked": {
"login": "Vi devas esti ensalutinta por aliri ĉi tiun ŝablonon.",
"purchase": "Aĉetu ĉi tiun ŝablonon por malŝlosi ĝin."
},
"pattern": {
"default": "Defaŭlta",
"custom": "Propra",
"stripes_v": "Vertikala",
"stripes_h": "Horizontala",
"horizontal_stripes": "Horizontala (Alt)",
"vertical_bars": "Vertikala (Alt)",
"checkerboard": "Ŝaktabulo",
"choco": "Ĉoko",
"diagonal": "Diagonala",
"cross": "Kruca",
"mini_cross": "Kruceta",
"sword": "Glava",
"sparse_dots": "Maldensaj Punktoj",
"evan": "Evano",
"diagonal_stripe": "Diagonala Strio",
"mountain_ridge": "Montkresto",
"scattered_dots": "Disaj Punktoj",
"circuit_board": "Cirkvitplato",
"shells": "Konkoj",
"-w-": ".w.",
"white_rabbit": "Blanka Kuniklo",
"goat": "Kapro",
"cats": "Katoj",
"cursor": "Kursoro",
"hand": "Mano",
"radiation": "Radiado",
"openfront_qr": "OpenFront.io QR-kodo",
"openfront": "OpenFront",
"t_rex": "Tiranosaŭro",
"embelem": "Emblemo",
"grogu_head": "Grogu Kapo",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Ensaluto estas necesa por aliri ĉi tiun retejon.",
"redirecting": "Vi estas redirektata...",
"not_authorized": "Vi ne rajtas aliri ĉi tiun retejon.",
"contact_admin": "Se vi kredas, ke vi vidas ĉi tiun mesaĝon erare, bonvolu kontakti la retejan administranton."
}
}
+153 -17
View File
@@ -24,7 +24,9 @@
"wiki": "Wiki"
},
"news": {
"title": "Versio 23 julkaistu!"
"full_changelog": "Katso koko muutosloki",
"github_link": "GitHubissa",
"title": "Päivitystiedot"
},
"help_modal": {
"hotkeys": "Pikanäppäimet",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Palauta grafiikat",
"ui_section": "Pelin käyttöliittymä",
"ui_leaderboard": "Pistetaulukko",
"ui_your_team": "Tiimisi: ",
"ui_leaderboard_desc": "Näyttää pelin parhaat pelaajat, sekä heidän kullan, sotilaiden ja maan (%) määrän. Painamalla \"Näytä kaikki\" näet kaikki pelin pelaajat. Jos et halua nähdä pistetaulukkoa, paina \"Sulje\".",
"ui_control": "Ohjauspaneeli",
"ui_control_desc": "Ohjauspaneeli sisältää seuraavat toiminnot:",
@@ -57,6 +60,7 @@
"ui_options_desc": "Sisältää seuraavat toiminnot:",
"ui_playeroverlay": "Pelaajan tietojen peittokuva",
"ui_playeroverlay_desc": "Kun pidät hiirtä maan päällä, pelaajan tietojen peittokuva näytetään asetusten alla. Se näyttää onko pelaaja ihminen, kansakunta (eli järkevä botti) vai botti. Kansakunnan asenne sinua kohtaan vaihtelee vihamielisestä ystävälliseen. Peittokuva näyttää myös pelaajan puolustavien joukkojen, kullan, sotalaivojen ja erilaisten rakennusten määrän.",
"ui_wilderness": "Erämaa",
"option_pause": "Pysäytä/Epäpysäytä peli - Saatavilla vain yhden pelaajan tilassa.",
"option_timer": "Ajastin - Aikaa pelin alusta.",
"option_exit": "Poistu pelistä -painike.",
@@ -86,6 +90,8 @@
"build_desc": "Kuvaus",
"build_city": "Kaupunki",
"build_city_desc": "Lisää enimmäisväkilukuasi. Hyödyllinen, kun et voi laajentaa aluettasi tai, jos haluat muuten lisätä väkilukuasi.",
"build_factory": "Tehdas",
"build_factory_desc": "Luo rautateitä automaattisesti lähellä rakennuksia ja lähettää junia satunnaisesti.",
"build_defense": "Puolustustorni",
"build_defense_desc": "Lisää puolustuksen tehokkuutta rajojen läheisyydessä. Vihollisten hyökkäykset puolustustornin lähellä ovat hitaampia ja niissä on enemmän uhreja.",
"build_port": "Satama",
@@ -109,7 +115,8 @@
"icon_ally": "Kädenpuristus - liittolainen. Tämä pelaaja on liittolaisesi.",
"icon_embargo": "Yliviivattu dollari - kauppasaarto. Tämä pelaaja on lopettanut kapuankäynnin kanssasi automaattisesti tai manuaalisesti.",
"icon_request": "Kirjekutsu - Liittopyyntö. Tämä pelaaja on lähettänyt sinulle liittokutsun.",
"info_enemy_panel": "Vihollisen tietopaneeli"
"info_enemy_panel": "Vihollisen tietopaneeli",
"exit_confirmation": "Haluatko varmasti poistua pelistä?"
},
"single_modal": {
"title": "Yksinpeli",
@@ -122,12 +129,13 @@
"infinite_gold": "Loputon kulta",
"infinite_troops": "Loputtomat joukot",
"disable_nukes": "Poista ydinohjukset käytöstä",
"enables_title": "Aktivoi asetukset",
"enables_title": "Säädä asetuksia",
"start": "Aloita peli"
},
"map": {
"map": "Kartta",
"world": "Maailma",
"giantworldmap": "Jättimäinen maailmankartta",
"europe": "Eurooppa",
"mena": "MENA",
"northamerica": "Pohjois-Amerikka",
@@ -151,13 +159,17 @@
"falklandislands": "Falklandinsaaret",
"baikal": "Baikal",
"halkidiki": "Halkidiki",
"giantworldmap": "Jättimäinen maailmankartta"
"straitofgibraltar": "Gibraltarinsalmi",
"italia": "Italia"
},
"map_categories": {
"continental": "Mantereet",
"regional": "Alueet",
"fantasy": "Muut"
},
"map_component": {
"loading": "Ladataan..."
},
"private_lobby": {
"title": "Liity yksityiseen aulaan",
"enter_id": "Syötä aulan tunnus",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Liity seuraavaan peliin",
"waiting": "pelaajaa odottaa",
"teams_Duos": "Duot (2:n tiimit)",
"teams_Trios": "Triot (3:n tiimit)",
"teams_Quads": "Neloset (4:n tiimit)",
"teams": "{num} joukkuetta"
},
"username": {
@@ -192,12 +207,22 @@
"instant_build": "Välitön rakentaminen",
"infinite_gold": "Loputon kulta",
"infinite_troops": "Loputtomat joukot",
"enables_title": "Aktivoi asetukset",
"enables_title": "Säädä asetuksia",
"player": "Pelaaja",
"players": "pelaajaa",
"waiting": "Odotetaan pelaajia...",
"start": "Aloita peli"
},
"team_colors": {
"red": "Punainen",
"blue": "Sininen",
"teal": "Sinivihreä",
"purple": "Liila",
"yellow": "Keltainen",
"orange": "Oranssi",
"green": "Vihreä",
"bot": "Botti"
},
"game_starting_modal": {
"title": "Peli alkaa...",
"desc": "Valmistellaan aulan aloittamista. Odota hetki."
@@ -225,28 +250,42 @@
"sam_launcher": "Ilmatorjuntaohjusjärjestelmä",
"atom_bomb": "Atomipommi",
"hydrogen_bomb": "Vetypommi",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "Tehdas"
},
"user_setting": {
"title": "Käyttäjäasetukset",
"tab_basic": "Perusasetukset",
"tab_keybinds": "Näppäinasetukset",
"dark_mode_label": "🌙 Tumma tila",
"dark_mode_label": "Tumma tila",
"dark_mode_desc": "Vaihda sivuston ulkonäköä vaaleiden ja tummien teemojen välillä",
"emojis_label": "😊 Hymiöt",
"dark_mode_enabled": "Tumma tila käytössä",
"light_mode_enabled": "Vaalea tila käytössä",
"emojis_label": "Hymiöt",
"emojis_visible": "Hymiöt näkyvissä",
"emojis_hidden": "Hymiöt on piilotettu",
"emojis_desc": "Valitse, ovatko hymiöt näkyvissä pelissä",
"special_effects_label": "💥 Erikoistehosteet",
"alert_frame_label": "Hälytyskehys",
"alert_frame_desc": "Laita hälytyskehys pois tai päälle. Kun päällä, kehys näkyy, kun sinut petetään.",
"special_effects_label": "Erikoistehosteet",
"special_effects_desc": "Valitse, ovatko erikoistehosteet päällä. Poista ne käytöstä parantaaksesi suorituskykyä",
"anonymous_names_label": "🥷 Piilotetut nimet",
"special_effects_enabled": "Erikoistehosteet käytössä",
"special_effects_disabled": "Erikoistehosteet poistettu käytöstä",
"anonymous_names_label": "Piilotetut nimet",
"anonymous_names_desc": "Korvaa pelaajien oikeat nimet satunnaisilla nimillä.",
"left_click_label": "🖱️Klikkaa hiiren vasenta näppäintä avataksesi valikon",
"anonymous_names_enabled": "Anonyymit nimet käytössä",
"real_names_shown": "Todelliset nimet näytetään",
"left_click_label": "Hiiren vasen nappi valikon avaamiseen",
"left_click_desc": "Kun päällä, hiiren vasen nappi avaa valikon, mistä voit hyökätä painamalla miekkaa. Kun pois päältä, vasen nappi hyökkää suoraan.",
"left_click_menu": "Hiiren vasemman napin valikko",
"left_click_opens_menu": "Hiiren vasen nappi avaa valikon",
"right_click_opens_menu": "Hiiren oikea nappi avaa valikon",
"attack_ratio_label": "⚔️ Hyökkäyksen osuus",
"attack_ratio_desc": "Mikä osuus joukoistasi lähetetään hyökkäykseen (1100%)",
"troop_ratio_label": "🪖🛠️ Joukkojen ja työntekijöiden suhde",
"troop_ratio_desc": "Säädä joukkojen (sotia varten) ja työntekijöiden (tekevät kultaa) määrää (1 - 100%)",
"territory_patterns_label": "🏳️ Aluekuviot",
"territory_patterns_desc": "Valitse, näkyvätkö aluekuviot pelissä",
"territory_patterns_label": "Aluekuviot",
"territory_patterns_desc": "Valitse näkyvätkö aluekuviot pelissä",
"easter_writing_speed_label": "Kirjoittamisen nopeuskerroin",
"easter_writing_speed_desc": "Säädä kuinka nopeasti teeskentelet koodaavasi (x1x100)",
"easter_bug_count_label": "Vikojen määrä",
@@ -262,6 +301,8 @@
"attack_keybinds": "Hyökkäyksen näppäinasetukset",
"boat_attack": "Venehyökkäys",
"boat_attack_desc": "Lähetä venehyökkäys hiiresi alla olevaan pikseliin.",
"ground_attack": "Maahyökkäys",
"ground_attack_desc": "Aloita maahyökkäys hiiresi alla olevaan ruutuun.",
"zoom_controls": "Zoomausohjaimet",
"zoom_out": "Loitonna",
"zoom_out_desc": "Loitonna karttaa",
@@ -279,7 +320,14 @@
"move_right": "Siirrä kameraa oikeaan",
"move_right_desc": "Siirrä kameraa oikealle",
"reset": "Palauta",
"unbind": "Irrota"
"unbind": "Irrota",
"on": "Päällä",
"off": "Pois",
"toggle_terrain": "Vaihda maastoa",
"terrain_enabled": "Maastonäkymä käytössä",
"terrain_disabled": "Maastonäkymä pois käytöstä",
"exit_game_label": "Poistu pelistä",
"exit_game_info": "Palaa päävalikkoon"
},
"chat": {
"title": "Pikaviestit",
@@ -363,8 +411,9 @@
"sam_launcher": "Puolustaa saapuvia ohjuksia vastaan",
"warship": "Kaappaa kauppa-aluksia, tuhoaa laivoja ja veneitä",
"port": "Lähettää kauppa-aluksia tuottaakseen kultaa",
"defense_post": "Lisää läheisten rajojen puolustusta",
"city": "Lisää enimmäisväkilukuasi"
"defense_post": "Parantaa läheisten rajojen puolustusta",
"city": "Lisää enimmäisväkilukuasi",
"factory": "Luo rautateitä ja lähettää junia"
},
"not_enough_money": "Ei tarpeeksi rahaa"
},
@@ -383,6 +432,7 @@
"hide": "Sulje",
"rank": "Sijoitus",
"player": "Pelaaja",
"team": "Tiimi",
"owned": "Maata",
"gold": "Kultaa",
"troops": "Joukkoja"
@@ -402,7 +452,39 @@
"sams": "Ilmatorjuntaohjusjärjestelmiä",
"warships": "Sota-aluksia",
"health": "Terveys",
"attitude": "Asenne"
"attitude": "Asenne",
"levels": "Tasot"
},
"events_display": {
"retreating": "peräännytään",
"boat": "Vene",
"alliance_request_status": "{name} {status} sinun liittokutsusi",
"alliance_accepted": "hyväksyi",
"alliance_rejected": "hylkäsi",
"duration_second": "1 sekunti",
"betrayal_description": "Rikkoit liiton pelaajan {name} kanssa, tehden sinusta PETTURIN ({malusPercent}% puolustuksen huononnus {durationText})",
"duration_seconds_plural": "{seconds} sekuntia",
"betrayed_you": "{name} rikkoi liittonsa kanssasi",
"about_to_expire": "Liittosi pelaajan {name} kanssa on vanhentumassa!",
"alliance_expired": "Liittosi pelaajan {name} kanssa vanhentui",
"attack_request": "{name} pyytää, että hyökkäät {target}",
"sent_emoji": "Lähetit pelaajalle {name}: {emoji}",
"renew_alliance": "Pyydä liitolle jatkoa",
"request_alliance": "{name} pyytää liittoutumista!",
"focus": "Keskitä",
"accept_alliance": "Hyväksy",
"reject_alliance": "Hylkää",
"alliance_renewed": "Liittosi pelaajan {name} kanssa sai jatkoa",
"ignore": "Sivuuta"
},
"unit_info_modal": {
"structure_info": "Rakennuksen tiedot",
"unit_type_unknown": "Tuntematon",
"close": "Sulje",
"cooldown": "Odotusaika",
"type": "Tyyppi",
"upgrade": "Päivitä",
"level": "Taso"
},
"relation": {
"hostile": "Vihamielinen",
@@ -433,8 +515,14 @@
"none": "Tyhjä",
"alliances": "Liittoumat"
},
"replay_panel": {
"replay_speed": "Uusinnan nopeus",
"game_speed": "Pelin nopeus",
"fastest_game_speed": "max"
},
"error_modal": {
"crashed": "Peli kaatui!",
"connection_error": "Yhteysongelma!",
"paste_discord": "Ole hyvä ja liitä seuraava vikailmoitukseesi Discordissa:",
"copy_clipboard": "Kopioi leikepöydälle",
"copied": "Kopioitu!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Valitse aloituspaikka"
},
"territory_patterns": {
"title": "Valitse aluekuvio",
"purchase": "Osta",
"blocked": {
"login": "Sinun täytyy olla kirjautunut sisään saadaksesi tämän kuvion.",
"purchase": "Osta tämä kuvio avataksesi sen."
},
"pattern": {
"default": "Oletus",
"custom": "Mukautettu",
"stripes_v": "Pystysuora",
"stripes_h": "Vaakasuora",
"horizontal_stripes": "Vaakasuora (Vaihtoehto)",
"vertical_bars": "Pystysuora (Vaihtoehto)",
"checkerboard": "Shakkilauta",
"choco": "Suklaa",
"diagonal": "Diagonaalinen",
"cross": "Risti",
"mini_cross": "Pikkuristi",
"sword": "Miekka",
"sparse_dots": "Harvat pisteet",
"evan": "Evan",
"diagonal_stripe": "Diagonaalinen raita",
"mountain_ridge": "Vuorijono",
"scattered_dots": "Hajanaiset pisteet",
"circuit_board": "Piirilevy",
"shells": "Kuoret",
"-w-": ".w.",
"white_rabbit": "Valkoinen jänis",
"goat": "Pukki",
"cats": "Kissat",
"cursor": "Kursori",
"hand": "Käsi",
"radiation": "Säteily",
"openfront_qr": "OpenFront.io:n QR-koodi",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Tunnus",
"grogu_head": "Grogun pää",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Kirjautuminen vaaditaan tälle verkkosivustolle pääsemiseen.",
"redirecting": "Sinut uudelleenohjataan...",
"not_authorized": "Sinulla ei ole oikeutta käyttää tätä verkkosivustoa.",
"contact_admin": "Jos uskot näkeväsi tämän viestin virheenä, ota yhteyttä sivuston ylläpitoon."
}
}
+151 -15
View File
@@ -20,11 +20,13 @@
"single_player": "Mode solo",
"instructions": "Instructions",
"how_to_play": "Comment jouer ?",
"advertise": "Annoncer",
"advertise": "Faire de la publicité",
"wiki": "Wiki"
},
"news": {
"title": "Version 23 disponible !"
"full_changelog": "Voir le journal des modifications complet",
"github_link": "sur Github",
"title": "Notes de version"
},
"help_modal": {
"hotkeys": "Raccourcis clavier",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Réinitialiser les graphismes",
"ui_section": "IU du jeu",
"ui_leaderboard": "Classement",
"ui_your_team": "Votre équipe :",
"ui_leaderboard_desc": "Montre les meilleurs joueurs du jeu et leurs noms, leur % de terres occupée, leur or et leurs troupes. Utiliser « Show All » montre tous les joueurs du jeu. Si vous ne voulez pas voir le classement, cliquez sur Masquer.",
"ui_control": "Panneau de contrôle",
"ui_control_desc": "Le panneau de contrôle contient les éléments suivants :",
@@ -57,6 +60,7 @@
"ui_options_desc": "Les éléments suivants peuvent être trouvés à l'intérieur :",
"ui_playeroverlay": "Informations sur le joueur",
"ui_playeroverlay_desc": "Lorsque vous survolez un pays, le panneau d'informations sur le joueur s'affichent dans Options. Il montre le type de joueur : Humain, Nation (bot intelligent), ou Bot ; l'attitude d'une nation à votre égard. allant de l'Hostile à l'Amical ; et les troupes en défense, l'or, le nombre de navires de guerre et les différents bâtiments que le joueur possède.",
"ui_wilderness": "Région sauvage",
"option_pause": "Mettre en pause/Continuer la partie - Disponible uniquement dans le mode solo.",
"option_timer": "Chronomètre - Temps écoulé depuis le début du jeu.",
"option_exit": "Bouton de sortie.",
@@ -86,6 +90,8 @@
"build_desc": "Description",
"build_city": "Ville",
"build_city_desc": "Utile quand vous ne pouvez agrandir votre territoire ou quand vous atteignez votre limite de population.",
"build_factory": "Usine",
"build_factory_desc": "Crée automatiquement des chemins de fer avec les structures à proximité, et fait apparaître des trains sporadiquement.",
"build_defense": "Poste de défense",
"build_defense_desc": "Augmente les défenses autour des frontières voisines, qui montrent un motif en damier. Les attaques des ennemis sont plus lentes et font plus de blessés.",
"build_port": "Port",
@@ -109,7 +115,8 @@
"icon_ally": "Poignée de main - Allié. Ce joueur est votre allié.",
"icon_embargo": "Signe dollar barré - Embargo. Ce joueur a cessé de commercer avec vous automatiquement ou manuellement.",
"icon_request": "Enveloppe - Demande d'alliance. Ce joueur vous a envoyé une demande d'alliance.",
"info_enemy_panel": "Panneau d'information de l'ennemi"
"info_enemy_panel": "Panneau d'information de l'ennemi",
"exit_confirmation": "Êtes-vous sûr de vouloir quitter le jeu ?"
},
"single_modal": {
"title": "Joueur seul",
@@ -128,6 +135,7 @@
"map": {
"map": "Carte",
"world": "Monde",
"giantworldmap": "Carte du monde géante",
"europe": "Europe",
"mena": "MOAN",
"northamerica": "Amérique du Nord",
@@ -151,13 +159,17 @@
"falklandislands": "Îles Malouines",
"baikal": "Lac Baïkal",
"halkidiki": "Chalcidique",
"giantworldmap": "Carte du monde géante"
"straitofgibraltar": "Détroit de Gibraltar",
"italia": "Italie"
},
"map_categories": {
"continental": "Continental",
"regional": "Régional",
"fantasy": "Autre"
},
"map_component": {
"loading": "Chargement..."
},
"private_lobby": {
"title": "Rejoindre un salon privé",
"enter_id": "Entrez l'ID du salon",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Rejoindre la prochaine partie",
"waiting": "joueurs en attente",
"teams_Duos": "Duos (équipes de 2)",
"teams_Trios": "Trios (équipes de 3)",
"teams_Quads": "Quatuors (équipes de 4)",
"teams": "{num} équipes"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "En attente de joueurs...",
"start": "Commencer la partie"
},
"team_colors": {
"red": "Rouge",
"blue": "Bleu",
"teal": "Turquoise",
"purple": "Violet",
"yellow": "Jaune",
"orange": "Orange",
"green": "Vert",
"bot": "Bot"
},
"game_starting_modal": {
"title": "La partie est en train de commencer...",
"desc": "Préparation du salon. Veuillez patienter."
@@ -225,28 +250,42 @@
"sam_launcher": "Lanceur de SAM",
"atom_bomb": "Bombe atomique",
"hydrogen_bomb": "Bombe à hydrogène",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "Usine"
},
"user_setting": {
"title": "Paramètres utilisateur",
"tab_basic": "Réglages de base",
"tab_keybinds": "Raccourcis clavier",
"dark_mode_label": "🌙 Mode nuit",
"dark_mode_label": "Mode sombre",
"dark_mode_desc": "Basculer l'apparence du site entre les thèmes clairs et sombres",
"emojis_label": "😊 Émojis",
"dark_mode_enabled": "Mode sombre activé",
"light_mode_enabled": "Mode jour activé",
"emojis_label": "Émojis",
"emojis_visible": "Les émojis sont visibles",
"emojis_hidden": "Les émojis sont masqués",
"emojis_desc": "Afficher/Masquer les émoticônes dans le jeu",
"special_effects_label": "💥 Effets spéciaux",
"alert_frame_label": "Fenêtre d'alertes",
"alert_frame_desc": "Activer/désactiver la fenêtre d'alertes. Lorsqu'elle est activée, la fenêtre s'affichera lorsque vous serez trahi.",
"special_effects_label": "Effets spéciaux",
"special_effects_desc": "Activer/désactiver les effets spéciaux. Désactiver pour améliorer les performances",
"anonymous_names_label": "🥷 Noms masqués",
"special_effects_enabled": "Effets spéciaux activés",
"special_effects_disabled": "Effets spéciaux désactivés",
"anonymous_names_label": "Noms masqués",
"anonymous_names_desc": "Cacher le vrai nom des joueurs avec des noms aléatoires sur votre écran.",
"left_click_label": "🖱️ Clic gauche pour ouvrir le menu",
"anonymous_names_enabled": "Noms anonymes activés",
"real_names_shown": "Noms réels affichés",
"left_click_label": "Clic gauche pour ouvrir le menu",
"left_click_desc": "Activé, un clic gauche ouvre le menu et le bouton épée d'attaque. Désactivé, un clic gauche attaque directement.",
"left_click_menu": "Menu Clic gauche",
"left_click_opens_menu": "Un clic gauche ouvre le menu",
"right_click_opens_menu": "Un clic droit ouvre le menu",
"attack_ratio_label": "⚔️ Ratio d'attaque",
"attack_ratio_desc": "Quel pourcentage de vos troupes envoyer dans une attaque (1100%)",
"troop_ratio_label": "🪖🛠️ Ratio des troupes et des ouvriers",
"troop_ratio_desc": "Ajuster l'équilibre entre les troupes (pour le combat) et les ouvriers (pour la production d'or) (1100%)",
"territory_patterns_label": "🏳️ Modèles de territoire",
"territory_patterns_desc": "Choisissez si vous voulez afficher les modèles de territoire en jeu",
"territory_patterns_desc": "Choisissez si vous voulez afficher les motifs de territoire en jeu",
"easter_writing_speed_label": "Multiplicateur de vitesse d'écriture",
"easter_writing_speed_desc": "Ajuster la vitesse à laquelle vous prétendez coder (x1x100)",
"easter_bug_count_label": "Nombre de bugs",
@@ -262,6 +301,8 @@
"attack_keybinds": "Raccourcis d'attaque",
"boat_attack": "Attaque navale",
"boat_attack_desc": "Envoyer une attaque navale à la tuile sous votre curseur.",
"ground_attack": "Attaque au sol",
"ground_attack_desc": "Envoyez une attaque au sol sur la tuile sous votre curseur.",
"zoom_controls": "Contrôles de zoom",
"zoom_out": "Zoom arrière",
"zoom_out_desc": "Dézoom de la carte",
@@ -279,7 +320,14 @@
"move_right": "Caméra Droite",
"move_right_desc": "Déplacer la caméra vers la droite",
"reset": "Réinitialiser",
"unbind": "Détacher"
"unbind": "Détacher",
"on": "Activé",
"off": "Désactivé",
"toggle_terrain": "Activer/désactiver le terrain",
"terrain_enabled": "Affichage du terrain activé",
"terrain_disabled": "Affichage du terrain désactivé",
"exit_game_label": "Quitter la partie",
"exit_game_info": "Retour au menu principal"
},
"chat": {
"title": "Discussion",
@@ -363,8 +411,9 @@
"sam_launcher": "Protège contre les bombes nucléaires",
"warship": "Capture les navires commerciaux, détruit les navires de guerre et les bateaux",
"port": "Envoie des navires commerciaux pour produire de l'or",
"defense_post": "Augmente les défenses des frontières voisines",
"city": "Augmente la population maximale"
"defense_post": "Augmente les défenses des frontières proches",
"city": "Augmente la population maximale",
"factory": "Crée des chemins de fer et fait apparaître des trains"
},
"not_enough_money": "Pas assez d'argent"
},
@@ -383,6 +432,7 @@
"hide": "Masquer",
"rank": "Rang",
"player": "Joueur",
"team": "Équipe",
"owned": "Possédé",
"gold": "Or",
"troops": "Troupes"
@@ -402,7 +452,39 @@
"sams": "SAMs",
"warships": "Navires de guerre",
"health": "Santé",
"attitude": "Attitude"
"attitude": "Attitude",
"levels": "Niveaux"
},
"events_display": {
"retreating": "en retraite",
"boat": "Bateau",
"alliance_request_status": "{name} {status} votre demande d'alliance",
"alliance_accepted": "a accepté",
"alliance_rejected": "a refusé",
"duration_second": "1 seconde",
"betrayal_description": "Vous avez rompu votre alliance avec {name}, ce qui fait de vous un TRAÎTRE (affaiblissement de défense de {malusPercent}% pendant {durationText})",
"duration_seconds_plural": "{seconds} secondes",
"betrayed_you": "{name} a rompu son alliance avec vous",
"about_to_expire": "Votre alliance avec {name} est sur le point d'expirer!",
"alliance_expired": "Votre alliance avec {name} a expiré",
"attack_request": "{name} vous demande d'attaquer {target}",
"sent_emoji": "Envoyé à {name} : {emoji}",
"renew_alliance": "Demander le renouvellement",
"request_alliance": "{name} demande une alliance !",
"focus": "Focaliser",
"accept_alliance": "Accepter",
"reject_alliance": "Refuser",
"alliance_renewed": "Votre alliance avec {name} a été renouvelée",
"ignore": "Ignorer"
},
"unit_info_modal": {
"structure_info": "Infos sur la structure",
"unit_type_unknown": "Inconnu",
"close": "Fermer",
"cooldown": "Rechargement",
"type": "Type",
"upgrade": "Mettre à niveau",
"level": "Niveau"
},
"relation": {
"hostile": "Hostile",
@@ -433,8 +515,14 @@
"none": "Aucun",
"alliances": "Alliances"
},
"replay_panel": {
"replay_speed": "Vitesse de relecture",
"game_speed": "Vitesse de jeu",
"fastest_game_speed": "max"
},
"error_modal": {
"crashed": "Le jeu a planté !",
"connection_error": "Erreur de connexion !",
"paste_discord": "Veuillez coller ce qui suit dans votre rapport de bogue dans Discord :",
"copy_clipboard": "Copier dans le presse-papier",
"copied": "Copié !",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Choisissez un emplacement de départ"
},
"territory_patterns": {
"title": "Sélectionnez un motif de territoire",
"purchase": "Acheter",
"blocked": {
"login": "Vous devez être connecté pour accéder à ce motif.",
"purchase": "Acheter ce motif pour le déverrouiller."
},
"pattern": {
"default": "Par défaut",
"custom": "Personnalisé",
"stripes_v": "Vertical",
"stripes_h": "Horizontal",
"horizontal_stripes": "Horizontal (Alt)",
"vertical_bars": "Vertical (Alt)",
"checkerboard": "Damier",
"choco": "Choco",
"diagonal": "Diagonal",
"cross": "Croix",
"mini_cross": "Petite croix",
"sword": "Épée",
"sparse_dots": "Points épars",
"evan": "Evan",
"diagonal_stripe": "Bande diagonale",
"mountain_ridge": "Crête de montagne",
"scattered_dots": "Pointillés",
"circuit_board": "Circuit imprimé",
"shells": "Coquilles",
"-w-": ".w.",
"white_rabbit": "Lapin blanc",
"goat": "Chèvre",
"cats": "Chats",
"cursor": "Curseur",
"hand": "Main",
"radiation": "Radiation",
"openfront_qr": "QR code OpenFront.io",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Emblème",
"grogu_head": "Tête de Grogu",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "La connexion est nécessaire pour accéder à ce site Web.",
"redirecting": "Vous êtes en cours de redirection...",
"not_authorized": "Vous n'êtes pas autorisé à accéder à ce site web.",
"contact_admin": "Si vous pensez que vous voyez ce message par erreur, veuillez contacter l'administrateur du site."
}
}
+583
View File
@@ -0,0 +1,583 @@
{
"lang": {
"en": "Galician",
"native": "Galego",
"svg": "es-ga",
"lang_code": "gl"
},
"common": {
"close": "Pechar"
},
"main": {
"title": "OpenFront (ALFA)",
"join_discord": "Únete ó Discord!",
"login_discord": "Iniciar sesión con Discord",
"checking_login": "Comprobando a sesión...",
"logged_in": "Sesión iniciada!",
"log_out": "Pechar sesión",
"create_lobby": "Crear sala",
"join_lobby": "Unirse á sala",
"single_player": "Un xogador",
"instructions": "Instrucións",
"how_to_play": "Como xogar",
"advertise": "Promoción",
"wiki": "Wiki"
},
"news": {
"full_changelog": "Ve o rexistro de actualizacións completo",
"github_link": "en GitHub",
"title": "Notas da versión"
},
"help_modal": {
"hotkeys": "Atallos de teclado",
"table_key": "Tecla",
"table_action": "Acción",
"action_alt_view": "Vista alternativa (xeográfico/político)",
"action_attack_altclick": "Ataque (cando o botón esquerdo está configurado para abrir o menú)",
"action_build": "Abrir menú de construción",
"action_emote": "Abrir menú de emoticonas",
"action_center": "Centrar cámara no xogador",
"action_zoom": "Afastar ou achegar",
"action_move_camera": "Mover cámara",
"action_ratio_change": "Diminuír ou aumentar razón de ataque",
"action_reset_gfx": "Reiniciar gráficos",
"ui_section": "Interface do xogo",
"ui_leaderboard": "Clasificación",
"ui_your_team": "O teu equipo:",
"ui_leaderboard_desc": "Mostra os xogadores principais da partida e os seus nomes, porcentaxe da terra posuída, ouro e tropas. Ó premer en \"Mostrar todos\", móstranse todos os xogadores do xogo. Se non queres ver a clasificación, preme \"Ocultar\".",
"ui_control": "Panel de control",
"ui_control_desc": "O panel de control contén os seguintes elementos:",
"ui_pop": "Poboación — A cantidade que tes, a poboación máxima e a taxa á que medra.",
"ui_gold": "Ouro — A cantidade que tes e a taxa á que o gañas.",
"ui_troops_workers": "Tropas e traballadores — A cantidade de tropas e traballadores asignados. As tropas empréganse para atacar ou defender ataques. Os traballadores serven para xerar ouro. Podes axustar o número de tropas e traballadores usando a barra.",
"ui_attack_ratio": "Proporción de ataque - A cantidade de tropas que se usarán ao atacar. Podes axustar a proporción usando a barra. Ter máis tropas atacantes que tropas defensoras fará que perdas menos tropas no ataque, mentres que ter menos aumentará o dano inflixido ás túas tropas atacantes. O efecto non vai máis alá de proporcións de 2:1.",
"ui_events": "Panel de eventos",
"ui_events_desc": "O Panel de Eventos amosa os últimos eventos, solicitudes e mensaxes de chat rápido. Algúns exemplos son:",
"ui_events_alliance": "Alianza — As solicitudes de alianza pódense aceptar ou rexeitar. Os aliados poden compartir recursos e tropas, e non poden atacarse entre eles. Fai clic en \"Enfocar\" para centrar a vista no xogador que enviou a solicitude.",
"ui_events_attack": "Ataques — Móstranse os ataques entrantes e os teus ataques saíntes. Fai clic na mensaxe para centrar a cámara no ataque, arma nuclear ou barco. Podes retirar as tropas facendo clic no botón X vermello, mais perderás un 25 % das túas tropas atacantes. Se cancelas un ataque naval, o barco volverá ao inicio, e, no caso de que ese territorio xa non sexa teu, atacará alí. Non se pode cancelar os ataques nucleares despois de lanzárelos.",
"ui_events_quickchat": "Chat Rápido — Aquí podes ver as mensaxes que envías e recibes no chat. Para enviar unha mensaxe a un xogador, fai clic na icona de Chat Rápido no menú de información.",
"ui_options": "Opcións",
"ui_options_desc": "Dentro, os seguintes elementos pódense atopar:",
"ui_playeroverlay": "Panel de información do xogador",
"ui_playeroverlay_desc": "Ó pasar o cursor sobre un país, a información do xogador móstrase baixo Opcións. Aparece o tipo de xogador: Humano, Nación (bot intelixente) ou Bot; a actitude da nación cara ti, que pode ir de hostil até amistoso; e as tropas defensoras, o ouro, e tamén o número de buques de guerra e edificios que o xogador ten.",
"ui_wilderness": "Monte",
"option_pause": "Pausar ou retomar a partida — Só dispoñible no modo de un xogador.",
"option_timer": "Temporizador — Tempo transcorrido dende o inicio da partida.",
"option_exit": "Botón de saída.",
"option_settings": "Axustes — Abre o menú de axustes, onde podes activar a vista alternativa, os emojis, o modo escuro, o modo ninja (nomes aleatorios e anónimos) e a función do clic esquerdo.",
"radial_title": "Menú circular",
"radial_desc": "O clic dereito (ou tocar no móbil) abre o menú circular. Para pechalo, fai clic fóra. Dende o menú podes:",
"radial_build": "Abrir o menú de construción.",
"radial_info": "Abrir o menú de información.",
"radial_boat": "Enviar un barco de transporte a atacar ó lugar escollido. Só dispoñible ó teres acceso ó mar.",
"radial_close": "Pechar o menú.",
"info_title": "Menú de información",
"info_enemy_desc": "Contén información como o nome do xogador escollido, o ouro, as tropas, se deixou de comerciar contigo, as armas nucleares que che enviou, e se o xogador é un traidor. \"Deixar de comerciar\" significa que non intercambiarás ouro cun xogador a través de barcos comerciais. Pode ocorrer manualmente (se o xogador fixo clic en \"Parar comercio\", que dura ata que ambos fagades clic en \"Comezar comercio\") ou automaticamente (se traizoaches a túa alianza, o que dura até que volvades ser aliados ou despois de 5 minutos). Aparece \"Traidor\" durante 30 segundos cando un xogador traizoa un aliado. As iconas debaixo representan as seguintes interaccións:",
"info_chat": "Envía unha mensaxe rápida ó xogador. Escolle unha categoría, unha frase e, se a frase contén [P1], escolle o nome do xogador para substituílo. Preme Enviar.",
"info_target": "Coloca unha marca de obxectivo no xogador, marcándoa para todos os aliados para coordinar ataques.",
"info_alliance": "Envía unha solicitude de alianza ao xogador. Os aliados poden compartir recursos e tropas, e non poden atacarse entre si.",
"info_emoji": "Enviar un emoji ó xogador.",
"info_trade": "Usa \"Parar comercio\" para deixar de intercambiar ouro a través de barcos comerciais. Se ambos premedes \"Comezar comercio\", o intercambio volverá comezar.",
"info_ally_panel": "Panel de información de aliados",
"info_ally_desc": "Ó aliarte cun xogador, estarán dispoñibles as seguintes iconas:",
"ally_betray": "Traizoar o teu aliado, rompendo a alianza, parando o comercio e debilitando as túas defensas. O comercio entre vós pararíase durante 5 minutos (ou até que volvades ser aliados) e outros tamén poderían deixar de comerciar contigo. A non ser que o outro xogador sexa un traidor eles mesmos, serías marcado como traidor durante 30 segundos. Durante este tempo, haberá unha icona enriba do teu nome e terás unha desvantaxe de defensa do 50 %. É menos probable que os bots se alíen contigo e os xogadores pensarano ben antes de facelo.",
"ally_donate": "Doar algunhas das túas tropas ó teu aliado. Serve para cando lle queden poucas tropas e estean sendo atacados, ou cando precisan esa forza extra para acabar cun inimigo.",
"ally_donate_gold": "Doar parte do teu ouro ó teu aliado. Serve para cando lle quede pouco ouro e o precisen para edificios, ou cando o teu aliado estea aforrando para ese MIRV.",
"build_menu_title": "Menú de construción",
"build_menu_desc": "Construír os seguintes edificios ou ver cantos tes no teu territorio:",
"build_name": "Nome",
"build_icon": "Icona",
"build_desc": "Descrición",
"build_city": "Cidade",
"build_city_desc": "Aumenta a túa poboación máxima. Útil cando xa non podes expandirte máis ou estás preto de acadar o teu límite de poboación.",
"build_factory": "Fábrica",
"build_factory_desc": "Constrúe vías férreas automaticamente con edificios próximos e xera trens de forma esporádica.",
"build_defense": "Posto de defensa",
"build_defense_desc": "Aumenta as defensas das fronteiras próximas, indicado cun padrón de cadros. Como consecuencia, os ataques inimigos son máis lentos e sofren máis perdas.",
"build_port": "Porto",
"build_port_desc": "Só se pode construír preto da auga. Permite a construción de buques de guerra. Envía automaticamente barcos comerciais entre os teus portos e os doutros xogadores (agás cando se interrompe o comercio), xerando ouro para ambos bandos. O comercio detense automaticamente ó atacares ou seres atacado por un xogador. Retómase despois de 5 minutos ou ó volverdes aliados. Podes alternar o comercio manualmente con \"Parar comercio\" ou \"Comezar comercio\".",
"build_warship": "Buque de guerra",
"build_warship_desc": "Patrulla nunha zona, capturando barcos comerciais inimigos e destruíndo os seus barcos de transporte e mais os de guerra. Aparece no porto máis próximo e patrulla a zona na que fixeches clic para construílo. Podes encamiñar os teus buques facendo clic neles (consulta a acción de ataque nos atallos) e despois facendo clic no destino desexado.",
"build_silo": "Silo nuclear",
"build_silo_desc": "Permite o lanzamento de mísiles.",
"build_sam": "Lanzador SAM",
"build_sam_desc": "Pode interceptar mísiles inimigos nun alcance de 100 píxeles. Ten un 100% de probabilidade de acerto contra a bomba atómica, un 80% contra a bomba de hidróxeno e un 50 % contra as cabezas individuais de MIRV. O mísil ten un tempo de recarga de 7,5 segundos.",
"build_atom": "Bomba atómica",
"build_atom_desc": "Pequena bomba explosiva que destrúe territorio, edificios, barcos de transporte e buques de guerra. Aparece no silo máis próximo e cae na zona onde fixeches clic.",
"build_hydrogen": "Bomba de hidróxeno",
"build_hydrogen_desc": "Bomba explosiva grande. Aparece no silo máis próximo e cae na zona na que fixeches clic.",
"build_mirv": "MIRV",
"build_mirv_desc": "A bomba máis poderosa do xogo. Divídese en bombas menores que cubrirán unha ampla extensión de territorio. Aparece no silo máis preto e soamente caerá no xogador no que se fixo clic para construíla.",
"player_icons": "Iconas de xogadores",
"icon_desc": "Exemplos dalgunhas iconas xogo que encontrarás no xogo e os seus significados:",
"icon_crown": "Coroa — Número 1. Este é o xogador que vai de primeiro na clasificación.",
"icon_traitor": "Escudo roto — Traidor. Este xogador atacou un aliado de seu.",
"icon_ally": "Aperta de mans — Aliado. Este xogador é o teu aliado.",
"icon_embargo": "Dólar con stop — Embargo. Este xogador parou o comercio contigo de forma automática ou manual.",
"icon_request": "Sobre — Solicitude de alianza. Este xogador enviouche unha solicitude de alianza.",
"info_enemy_panel": "Panel de información de inimigos",
"exit_confirmation": "Seguro que queres saír da partida?"
},
"single_modal": {
"title": "Un xogador",
"allow_alliances": "Permitir alianzas",
"options_title": "Axustes",
"bots": "Bots: ",
"bots_disabled": "Desactivado",
"disable_nations": "Desactivar nacións",
"instant_build": "Construción instantánea",
"infinite_gold": "Ouro infinito",
"infinite_troops": "Tropas infinitas",
"disable_nukes": "Desactivar bombas nucleares",
"enables_title": "Axustes de activación",
"start": "Comezar partida"
},
"map": {
"map": "Mapa",
"world": "Mapamundi",
"giantworldmap": "Mapamundi xigante",
"europe": "Europa",
"mena": "MENA",
"northamerica": "América do Norte",
"oceania": "Oceanía",
"blacksea": "Mar Negro",
"africa": "África",
"asia": "Asia",
"mars": "Marte",
"southamerica": "América do Sur",
"britannia": "Bretaña e Irlanda",
"gatewaytotheatlantic": "Península Ibérica",
"australia": "Australia",
"random": "Aleatorio",
"iceland": "Islandia",
"pangaea": "Panxea",
"eastasia": "Asia do Leste",
"betweentwoseas": "Entre dous mares",
"faroeislands": "Illas Feroe",
"deglaciatedantarctica": "Antártida sen xeo",
"europeclassic": "Europa (clásica)",
"falklandislands": "Illas Malvinas",
"baikal": "Baikal",
"halkidiki": "Halkidiki",
"straitofgibraltar": "Estreito de Xibraltar",
"italia": "Italia"
},
"map_categories": {
"continental": "Continentes",
"regional": "Rexións",
"fantasy": "Outros"
},
"map_component": {
"loading": "Cargando..."
},
"private_lobby": {
"title": "Unirse á sala privada",
"enter_id": "Introduce o código da sala",
"player": "xogador",
"players": "xogadores",
"join_lobby": "Unirse á sala",
"checking": "Verificando a sala...",
"not_found": "Non se atopou a sala. Por favor, revisa o código e téntao de novo.",
"error": "Produciuse un erro. Por favor, téntao de novo.",
"joined_waiting": "Unícheste con éxito! Agardando a que comece o xogo..."
},
"public_lobby": {
"join": "Entrar na vindeira partida",
"waiting": "xogadores agardando",
"teams_Duos": "Dúos (equipos de 2)",
"teams_Trios": "Tríos (equipos de 3)",
"teams_Quads": "Cuartetos (equipos de 4)",
"teams": "{num} equipos"
},
"username": {
"enter_username": "Introduce o teu nome de usuario",
"not_string": "O nome de usuario debe ser unha cadea de texto.",
"too_short": "O nome de usuario debe ter polo menos {min} caracteres.",
"too_long": "O nome de usuario non debe superar os {max} caracteres.",
"invalid_chars": "O nome de usuario só pode ter letras, números, espazos, subliñados e [corchetes]."
},
"host_modal": {
"title": "Sala privada",
"mode": "Modo",
"team_count": "Número de equipos",
"options_title": "Opcións",
"bots": "Bots: ",
"bots_disabled": "Desactivado",
"disable_nations": "Desactivar nacións",
"instant_build": "Construción instantánea",
"infinite_gold": "Ouro infinito",
"infinite_troops": "Tropas infinitas",
"enables_title": "Axustes de activación",
"player": "Xogador",
"players": "Xogadores",
"waiting": "Agardando polos xogadores...",
"start": "Comezar a partida"
},
"team_colors": {
"red": "Vermello",
"blue": "Azul",
"teal": "Turquesa",
"purple": "Violeta",
"yellow": "Amarelo",
"orange": "Laranxa",
"green": "Verde",
"bot": "Bot"
},
"game_starting_modal": {
"title": "A partida está a comezar...",
"desc": "Preparando o comezo da partida. Por favor, agarda."
},
"difficulty": {
"difficulty": "Dificultade",
"Relaxed": "Relaxada",
"Balanced": "Equilibrada",
"Intense": "Intensa",
"Impossible": "Imposible"
},
"game_mode": {
"ffa": "Todos contra todos",
"teams": "Equipos"
},
"select_lang": {
"title": "Escoller lingua"
},
"unit_type": {
"city": "Cidade",
"defense_post": "Posto de defensa",
"port": "Porto",
"warship": "Buque de guerra",
"missile_silo": "Silo de mísiles",
"sam_launcher": "Lanzador SAM",
"atom_bomb": "Bomba atómica",
"hydrogen_bomb": "Bomba de hidróxeno",
"mirv": "MIRV",
"factory": "Fábrica"
},
"user_setting": {
"title": "Axustes do usuario",
"tab_basic": "Axustes básicos",
"tab_keybinds": "Atallos de tecla",
"dark_mode_label": "Modo escuro",
"dark_mode_desc": "Alternar a aparencia do xogo entre modo claro e escuro",
"dark_mode_enabled": "Modo escuro activado",
"light_mode_enabled": "Modo claro activado",
"emojis_label": "Emojis",
"emojis_visible": "Emojis visíbeis",
"emojis_hidden": "Emojis escondidos",
"emojis_desc": "Alternar a mostra emojis no xogo",
"alert_frame_label": "Cadro de alerta",
"alert_frame_desc": "Alternar o cadro de alerta. Se está activado, o cadro mostrarase cando te traizoen.",
"special_effects_label": "Efectos especiais",
"special_effects_desc": "Alternar efectos especiais. Desactívaos para mellorar o rendemento",
"special_effects_enabled": "Efectos especiais activados",
"special_effects_disabled": "Efectos especiais desactivados",
"anonymous_names_label": "Nomes ocultos",
"anonymous_names_desc": "Oculta os nomes dos xogadores verdadeiros e mostra uns aleatorios.",
"anonymous_names_enabled": "Nomes anónimos",
"real_names_shown": "Nomes reais",
"left_click_label": "Clic esquerdo para abrir o menú",
"left_click_desc": "Cando está ACTIVADO, o clic esquerdo abre o menú e o botón da espada ataca. Cando está DESACTIVADO, o clic esquerdo ataca directamente.",
"left_click_menu": "Menú do clic esquerdo",
"left_click_opens_menu": "Clic esquerdo abre o menú",
"right_click_opens_menu": "Clic dereito abre o menú",
"attack_ratio_label": "⚔️ Proporción de atacantes",
"attack_ratio_desc": "Porcentaxe das túas tropas para enviar nun ataque (1100%)",
"troop_ratio_label": "🪖🛠️ Proporción entre tropas e traballadores",
"troop_ratio_desc": "Axustar o equilibrio entre tropas (para o combate) e traballadores (para a produción de ouro) (1100%)",
"territory_patterns_label": "🏳️ Deseños territoriais",
"territory_patterns_desc": "Escoller se mostrar deseños territoriais no xogo",
"easter_writing_speed_label": "Multiplicador da velocidade de escritura",
"easter_writing_speed_desc": "Axustar a velocidade coa que pretendes programar (x1x100)",
"easter_bug_count_label": "Contador de erros",
"easter_bug_count_desc": "Con cantos erros estás ben (01000, a nivel emocional)",
"view_options": "Ver opcións",
"toggle_view": "Alternar vista",
"toggle_view_desc": "Vista alternativo (político/xeográfico)",
"attack_ratio_controls": "Controis da proporción de ataque",
"attack_ratio_up": "Aumentar a proporción de ataque",
"attack_ratio_up_desc": "Aumentar a proporción de ataque un 10%",
"attack_ratio_down": "Reducir a proporción de ataque",
"attack_ratio_down_desc": "Reducir a proporción de ataque un 10%",
"attack_keybinds": "Atallos de ataque",
"boat_attack": "Ataque naval",
"boat_attack_desc": "Enviar un ataque naval á cela baixo o cursor.",
"ground_attack": "Ataque terrestre",
"ground_attack_desc": "Enviar un ataque terrestre á cela baixo o cursor.",
"zoom_controls": "Controis de afastamento",
"zoom_out": "Afastar",
"zoom_out_desc": "Reducir zoom do mapa",
"zoom_in": "Achegar",
"zoom_in_desc": "Aumentar zoom do mapa",
"camera_movement": "Movemento da cámara",
"center_camera": "Centrar cámara",
"center_camera_desc": "Centrar a cámara no xogador",
"move_up": "Mover cámara arriba",
"move_up_desc": "Mover a vista cara arriba",
"move_left": "Mover cámara esquerda",
"move_left_desc": "Mover a vista cara á esquerda",
"move_down": "Mover cámara abaixo",
"move_down_desc": "Mover a cámara cara abaixo",
"move_right": "Mover cámara dereita",
"move_right_desc": "Move a cámara cara á a dereita",
"reset": "Restabelecer",
"unbind": "Desvincular",
"on": "Activado",
"off": "Desactivado",
"toggle_terrain": "Activar terreo",
"terrain_enabled": "Vista xeográfica activada",
"terrain_disabled": "Vista xeográfica desactivada",
"exit_game_label": "Saír da partida",
"exit_game_info": "Volver ó menú principal"
},
"chat": {
"title": "Chat rápido",
"to": "A {user}: {msg}",
"from": "De {user}: {msg}",
"category": "Categoría",
"phrase": "Frase",
"player": "Xogador",
"send": "Enviar",
"search": "Buscar xogador...",
"build": "Crea a túa mensaxe...",
"cat": {
"help": "Axuda",
"attack": "Atacar",
"defend": "Defender",
"greet": "Saúdos",
"misc": "Outros",
"warnings": "Avisos"
},
"help": {
"troops": "Por favor, envíame tropas!",
"gold": "Por favor, envíame ouro!",
"no_attack": "Por favor, non me ataques!",
"sorry_attack": "Perdoa, non quíxente atacar.",
"alliance": "Alianza?",
"help_defend": "Axúdame a defender contra [P1]!",
"team_up": "Xuntémonos contra [P1]!"
},
"attack": {
"attack": "Ataca a [P1]!",
"mirv": "Lanza un MIRV contra [P1]!",
"focus": "A por [P1]!",
"finish": "Acabemos con [P1]!"
},
"defend": {
"defend": "Defende a [P1]!",
"dont_attack": "Non ataques a [P1]!",
"ally": "[P1] é o meu aliado!"
},
"greet": {
"hello": "Ola!",
"good_luck": "Boa sorte!",
"have_fun": "Divírtete!",
"gg": "GG!",
"nice_to_meet": "Encantado/a de coñecerte!",
"well_played": "Ben xogado!",
"hi_again": "Ola de novo!",
"bye": "Chao!",
"thanks": "Grazas!",
"oops": "Ai, premín o botón equivocado!",
"trust_me": "Podes confiar en min. Prométocho!",
"trust_broken": "Confiei en ti..."
},
"misc": {
"go": "Imos aló!",
"strategy": "Boa estratexia!",
"fun": "Esta partida está a ser moi divertida!",
"pr": "Cando mesturarán finalmente o meu PR...?"
},
"warnings": {
"strong": "[P1] é forte.",
"weak": "[P1] é débil.",
"mirv_soon": "[P1] poderá lanzar un MIRV en breve!",
"number1_warning": "O xogador #1 vai gañar pronto se non facemos equipo!",
"stalemate": "Fagamos as paces xa. Isto é un punto morto, perderemos os dous.",
"has_allies": "[P1] ten moitos aliados.",
"no_allies": "[P1] non ten aliados.",
"betrayed": "[P1] traizoou o seu aliado!",
"getting_big": "[P1] está a medrar demasiado rápido!",
"danger_base": "[P1] está desprotexido!",
"saving_for_mirv": "[P1] está aforrando para lanzar un MIRV.",
"mirv_ready": "\"[P1] xa ten ouro dabondo para lanzar un MIRV!\""
}
},
"build_menu": {
"desc": {
"atom_bomb": "Explosión pequena",
"hydrogen_bomb": "Explosión grande",
"mirv": "Explosión xigante, só dana o xogador escollido",
"missile_silo": "Serve para lanzar bombas atómicas",
"sam_launcher": "Defende contra mísiles entrantes",
"warship": "Captura barcos comerciais e destrúe barcos de guerra",
"port": "Envía barcos comerciais para xerar ouro",
"defense_post": "Reforza as defensas das fronteiras próximas",
"city": "Aumenta a poboación máxima",
"factory": "Constrúe vías férreas e xera trens"
},
"not_enough_money": "Non tes ouro dabondo"
},
"win_modal": {
"died": "Morriches",
"your_team": "Gañou o teu equipo!",
"other_team": "Gañou o equipo {team}!",
"you_won": "Gañaches!",
"other_won": "Gañou {player}!",
"exit": "Saír da partida",
"keep": "Seguir xogando",
"wishlist": "Engádenos á túa lista de desexos en Steam!"
},
"leaderboard": {
"title": "Clasificación",
"hide": "Agochar",
"rank": "Posición",
"player": "Xogador",
"team": "Equipo",
"owned": "Controlado",
"gold": "Ouro",
"troops": "Tropas"
},
"player_info_overlay": {
"type": "Tipo",
"bot": "Bot",
"nation": "Nación",
"player": "Xogador",
"team": "Equipo",
"d_troops": "Tropas defensoras",
"a_troops": "Tropas atacantes",
"gold": "Ouro",
"ports": "Portos",
"cities": "Cidades",
"missile_launchers": "Silos",
"sams": "Lanzadores SAM",
"warships": "Buques",
"health": "Saúde",
"attitude": "Actitude",
"levels": "Niveis"
},
"events_display": {
"retreating": "retirando",
"boat": "Barco",
"alliance_request_status": "{name} {status} a túa solicitude de alianza",
"alliance_accepted": "aceptou",
"alliance_rejected": "rexeitou",
"duration_second": "1 segundo",
"betrayal_description": "Rompiches a túa alianza con {name}, converténdote nun TRAIDOR (desvantaxe de defensa de {malusPercent}% por {durationText})",
"duration_seconds_plural": "{seconds} segundos",
"betrayed_you": "{name} rompeu a súa alianza contigo",
"about_to_expire": "A túa alianza con {name} está a piques de expirar!",
"alliance_expired": "A túa alianza con {name} expirou",
"attack_request": "{name} pídeche que ataques a {target}",
"sent_emoji": "A {name}: {emoji}",
"renew_alliance": "Solicitar renovación",
"request_alliance": "{name} pídeche unha alianza!",
"focus": "Enfocar",
"accept_alliance": "Aceptar",
"reject_alliance": "Rexeitar",
"alliance_renewed": "Renovouse a túa alianza con {name}",
"ignore": "Ignorar"
},
"unit_info_modal": {
"structure_info": "Información do edificio",
"unit_type_unknown": "Descoñecido",
"close": "Pechar",
"cooldown": "Tempo de recarga",
"type": "Tipo",
"upgrade": "Mellorar",
"level": "Nivel"
},
"relation": {
"hostile": "Hostil",
"distrustful": "Desconfiada",
"neutral": "Neutral",
"friendly": "Amistosa",
"default": "Predeterminada"
},
"control_panel": {
"pop": "Poboación",
"gold": "Ouro",
"troops": "Tropas",
"workers": "Traballadores",
"attack_ratio": "Proporción de ataque"
},
"player_panel": {
"gold": "Ouro",
"troops": "Tropas",
"betrayals": "Número de traizóns",
"traitor": "Traidor",
"alliance_time_remaining": "Alianza acaba en",
"embargo": "Parou de comerciar contigo",
"nuke": "Bombas que che ten enviadas",
"start_trade": "Comezar comercio",
"stop_trade": "Parar comercio",
"yes": "Si",
"no": "Non",
"none": "Ningún",
"alliances": "Alianzas"
},
"replay_panel": {
"replay_speed": "Velocidade de reprodución",
"game_speed": "Velocidade da partida",
"fastest_game_speed": "máx."
},
"error_modal": {
"crashed": "O xogo caeu!",
"connection_error": "Erro de conexión!",
"paste_discord": "Por favor, pega o seguinte no teu informe do erro en Discord:",
"copy_clipboard": "Copiar ó portapapeis",
"copied": "Copiado!",
"failed_copy": "Erro ó copiar",
"desync_notice": "Estás desincronizado con respecto ós demais xogadores. O que ves pode ser diferente do que ven eles."
},
"heads_up_message": {
"choose_spawn": "Escolle o lugar de inicio"
},
"territory_patterns": {
"title": "Escolle o deseño territorial",
"purchase": "Mercar",
"blocked": {
"login": "Debes iniciar sesión para acceder a este deseño.",
"purchase": "Merca este deseño para desbloquealo."
},
"pattern": {
"default": "Predeterminado",
"custom": "Personalizado",
"stripes_v": "Vertical",
"stripes_h": "Horizontal",
"horizontal_stripes": "Horizontal (Alt.)",
"vertical_bars": "Vertical (Alt.)",
"checkerboard": "Xadrez",
"choco": "Choco",
"diagonal": "Diagonal",
"cross": "Cruz",
"mini_cross": "Cruciña",
"sword": "Espada",
"sparse_dots": "Puntos dispersos",
"evan": "Evan",
"diagonal_stripe": "Banda diagonal",
"mountain_ridge": "Cordal de montaña",
"scattered_dots": "Puntos esparexidos",
"circuit_board": "Placa de circuito",
"shells": "Conchas",
"-w-": ".w.",
"white_rabbit": "Coello branco",
"goat": "Cabra",
"cats": "Gatos",
"cursor": "Cursor",
"hand": "Man",
"radiation": "Radiación",
"openfront_qr": "Código QR de OpenFront.io",
"openfront": "OpenFront",
"t_rex": "Tiranosauro",
"embelem": "Emblema",
"grogu_head": "Cabeza de Grogu",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Debes iniciar sesión para acceder a este sitio.",
"redirecting": "Estámosche a redirixir...",
"not_authorized": "Non tes autorización para acceder a este sitio.",
"contact_admin": "Se cres que esta mensaxe é un erro, por favor contacta co administrador do sitio."
}
}
+105 -10
View File
@@ -24,7 +24,9 @@
"wiki": "ויקי"
},
"news": {
"title": "גרסא 23 שוחררה!"
"full_changelog": "ראה את פרטי הגרסה המלאים",
"github_link": "בגיטהאב",
"title": "פרטי הגרסה"
},
"help_modal": {
"hotkeys": "מקשי קיצור",
@@ -41,6 +43,7 @@
"action_reset_gfx": "אפס גרפיקה",
"ui_section": "ממשק המשחק",
"ui_leaderboard": "לוח מובילים",
"ui_your_team": "הקבוצה שלך:",
"ui_leaderboard_desc": "מציג את השחקנים המובילים במשחק ואת שמותיהם, אחוז הקרקע שבבעלותם, כמות הזהב וכמות החיילים שלהם. לחיצה על \"הצג הכול\" תציג את כל השחקנים במשחק. אם אינך מעוניין לראות את טבלת הדירוג, לחץ על \"הסתר\".",
"ui_control": "לוח הבקרה",
"ui_control_desc": "לוח הבקרה מכיל את האלמנטים הבאים:",
@@ -128,6 +131,7 @@
"map": {
"map": "מפה",
"world": "עולם",
"giantworldmap": "מפת עולם ענקית",
"europe": "אירופה",
"mena": "המזרח התיכון וצפון אפריקה",
"northamerica": "צפון אמריקה",
@@ -151,13 +155,17 @@
"falklandislands": "איי פוקלנד",
"baikal": "באיקל",
"halkidiki": "כלקידיקי",
"giantworldmap": "מפת עולם ענקית"
"straitofgibraltar": "מיצרי גיברלטר",
"italia": "איטליה"
},
"map_categories": {
"continental": "יבשתי",
"regional": "אזורי",
"fantasy": "אחר"
},
"map_component": {
"loading": "טוען..."
},
"private_lobby": {
"title": "הצטרף ללובי פרטי",
"enter_id": "הכנס ID של הלובי",
@@ -172,6 +180,9 @@
"public_lobby": {
"join": "הצטרף למשחק הבא",
"waiting": "שחקנים מחכים",
"teams_Duos": "זוגות (קבוצות של 2)",
"teams_Trios": "שלישיות (קבוצות של 3)",
"teams_Quads": "רביעיות (קבוצות של 4)",
"teams": "{num} קבוצות"
},
"username": {
@@ -198,6 +209,16 @@
"waiting": "מחכה לשחקנים...",
"start": "התחל משחק"
},
"team_colors": {
"red": "אדום",
"blue": "כחול",
"teal": "תכלת",
"purple": "סגול",
"yellow": "צהוב",
"orange": "כתום",
"green": "ירוק",
"bot": "בוט"
},
"game_starting_modal": {
"title": "המשחק מתחיל...",
"desc": "מחכה שהלובי יתחיל. המתן בבקשה."
@@ -225,21 +246,24 @@
"sam_launcher": "טיל קרקע-אויר",
"atom_bomb": "פצצת אטום",
"hydrogen_bomb": "פצצת מימן",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "מפעל"
},
"user_setting": {
"title": "הגדרות משתמש",
"tab_basic": "הגדרות בסיסיות",
"tab_keybinds": "קיצורי מקלדת",
"dark_mode_label": "מצב כהה 🌙 ",
"dark_mode_label": "מצב כהה",
"dark_mode_desc": "החלף את הנראות של האתר בין מצב כהה לבהיר.",
"emojis_label": "אימוג'ים 😊",
"emojis_label": "אימוג'ים",
"emojis_desc": "מאפשר הצגה של אימוג'ים במשחק",
"special_effects_label": "אפקטים מיוחדים 💥",
"alert_frame_label": "מסגרת אזהרה",
"alert_frame_desc": "הפעל את מסגרת האזהרה. כשהיא מופעלת, המסגרת תופיע כשבן ברית בוגד בך.",
"special_effects_label": "אפקטים מיוחדים",
"special_effects_desc": "מאפשר הצגה של אפקטים מיוחדים. בטל כדי לשפר את הביצועים של המשחק.",
"anonymous_names_label": "🥷 שמות חבויים",
"anonymous_names_label": "שמות חבויים",
"anonymous_names_desc": "החלף את שמות השחקנים האמיתיים עם שמות רנדומליים במסך שלך.",
"left_click_label": "לחצן שמאלי לפתיחת תפריט 🖱️",
"left_click_label": "לחצן שמאלי לפתיחת תפריט",
"left_click_desc": "כאשר מופעל, הלחצן השמאלי פותח את התפריט וכפתור החרב תוקף. כאשר מכובה, הלחצן השמאלי תוקף ישירות.",
"attack_ratio_label": "יחס תקיפה ⚔️",
"attack_ratio_desc": "כמה אחוז מהחיילים שלך לשלוח בהתקפה (1-100%)",
@@ -262,6 +286,8 @@
"attack_keybinds": "קיצורי מקשים להתקפה",
"boat_attack": "התקפת סירה",
"boat_attack_desc": "שלח ספינת התקפה היכן שאתה לוחץ עם העכבר.",
"ground_attack": "התקפת קרקע",
"ground_attack_desc": "שלח ספינת התקפה היכן שאתה לוחץ עם העכבר.",
"zoom_controls": "שליטת זום",
"zoom_out": "זום החוצה",
"zoom_out_desc": "התרחק מהמפה",
@@ -383,9 +409,12 @@
"hide": "הסתר",
"rank": "מיקום",
"player": "שחקן",
"team": "קבוצה",
"owned": "שטח",
"gold": "זהב",
"troops": "חיילים"
"troops": "חיילים",
"show_top_5": "הצג את החמישה העליונים",
"show_all": "הצג הכול"
},
"player_info_overlay": {
"type": "סוג",
@@ -402,7 +431,26 @@
"sams": "טילי קרקע-אויר",
"warships": "ספינות קרב",
"health": "חיים",
"attitude": "יחסים"
"attitude": "יחסים",
"levels": "שלבים"
},
"events_display": {
"retreating": "נסיגה",
"boat": "סירה",
"about_to_expire": "הברית שלך עם {name} הולכת להסתיים!",
"renew_alliance": "בקשה לחידוש",
"focus": "מיקוד",
"alliance_renewed": "הברית שלך עם {name} התחדשה",
"ignore": "התעלם"
},
"unit_info_modal": {
"structure_info": "מידע מבנה",
"unit_type_unknown": "לא ידוע",
"close": "סגור",
"cooldown": "השהיה",
"type": "סוג",
"upgrade": "שדרג",
"level": "רמה"
},
"relation": {
"hostile": "עוין",
@@ -433,8 +481,13 @@
"none": "ללא",
"alliances": "בריתות"
},
"replay_panel": {
"replay_speed": "מהירות שידור חוזר",
"game_speed": "מהירות המשחק"
},
"error_modal": {
"crashed": "המשחק קרס!",
"connection_error": "שגיאת חיבור!",
"paste_discord": "בבקשה הדבק את החלק הזה בדיווח הבאג בדיסקורד:",
"copy_clipboard": "העתק ל-clipboard",
"copied": "הועתק!",
@@ -443,5 +496,47 @@
},
"heads_up_message": {
"choose_spawn": "בחר מיקום התחלתי"
},
"territory_patterns": {
"title": "בחר דפוס שטח",
"purchase": "קניה",
"blocked": {
"login": "אתה חייב להיות מחובר כדי להשתמש בדפוס הזה",
"purchase": "קנה את הדפוס הזה כדי להשתמש בו."
},
"pattern": {
"default": "בחירת מחדל",
"custom": "מותאם אישית",
"stripes_v": "אנכי",
"stripes_h": "אופקי",
"horizontal_stripes": "אופקי (אלטרנטיבי)",
"vertical_bars": "אנכי (אלטרנטיבי)",
"checkerboard": "לוח דמקה",
"choco": "שוקו",
"diagonal": "אלכסוני",
"cross": "צלב",
"mini_cross": "צלב קטן",
"sword": "חרב",
"sparse_dots": "נקודות מרוחקות",
"evan": "אוון",
"diagonal_stripe": "פס אלכסוני",
"mountain_ridge": "רכס הרים",
"scattered_dots": "נקודות מפוזרות",
"circuit_board": "לוח מגעים",
"shells": "קליפות",
"-w-": ".w.",
"white_rabbit": "ארנב לבן",
"goat": "עז",
"cats": "חתולים",
"cursor": "סמן",
"hand": "יד",
"radiation": "קרינה",
"openfront_qr": "קוד QR של OpenFront.io",
"openfront": "OpenFront",
"t_rex": "טי-רקס",
"embelem": "סמל",
"grogu_head": "ראש גרוגו",
"grogu": "גרוגו"
}
}
}
+149 -13
View File
@@ -24,7 +24,9 @@
"wiki": "ウィキ"
},
"news": {
"title": "バージョン23がリリースされました!"
"full_changelog": "完全な変更ログを見る",
"github_link": "GitHub上で",
"title": "更新情報"
},
"help_modal": {
"hotkeys": "ホットキー",
@@ -41,6 +43,7 @@
"action_reset_gfx": "グラフィックをリセット",
"ui_section": "ゲームUI",
"ui_leaderboard": "リーダーボード",
"ui_your_team": "あなたのチーム:",
"ui_leaderboard_desc": "このゲームのトッププレイヤーとその名前、占有した土地の割合、ゴールド、軍隊数を表示します。「すべて表示」を使うと、ゲーム内の全プレイヤーが表示されます。リーダーボードを見たくない場合は、「非表示」をクリックしてください。",
"ui_control": "コントロールパネル",
"ui_control_desc": "コントロールパネルには以下が含まれます:",
@@ -57,6 +60,7 @@
"ui_options_desc": "以下の項目が含まれます:",
"ui_playeroverlay": "プレイヤー情報オーバーレイ",
"ui_playeroverlay_desc": "国にカーソルを合わせると、「オプション」内にプレイヤー情報のオーバーレイが表示されます。\nそこでは、プレイヤーの種類(人間、国家〔スマートボット〕、通常のボット)が表示されます。\n国家の場合は、あなたに対する態度(敵対的〜友好的)も表示されます。\nさらに、防衛中の部隊数、所持ゴールド、戦艦の数、建設済みの各種建物の数なども確認できます。",
"ui_wilderness": "荒野",
"option_pause": "ゲームの一時停止(シングルプレイヤーのみ)",
"option_timer": "タイマー - ゲーム開始からの経過時間",
"option_exit": "終了ボタン",
@@ -86,6 +90,8 @@
"build_desc": "説明",
"build_city": "都市",
"build_city_desc": "最大人口を増加します。領土を拡張できない時や人口上限に近い時に有効です。",
"build_factory": "工場",
"build_factory_desc": "周囲の構造物と自動的に鉄道を接続し、列車を時々発車させます。",
"build_defense": "防衛ポスト",
"build_defense_desc": "範囲内の防御を強化し、敵の侵攻を遅らせ、兵力の消耗を早めます。",
"build_port": "港",
@@ -109,7 +115,8 @@
"icon_ally": "握手 - 味方(同盟関係)",
"icon_embargo": "取引停止 - このプレイヤーがあなたを自動または手動で貿易制限をかけているときに表示されます。",
"icon_request": "メール - このプレイヤーがあなたへ同盟の申込みをしているときに表示されます。",
"info_enemy_panel": "敵の情報パネル"
"info_enemy_panel": "敵の情報パネル",
"exit_confirmation": "本当にゲームを終了しますか?"
},
"single_modal": {
"title": "シングルプレイヤー",
@@ -128,6 +135,7 @@
"map": {
"map": "地図",
"world": "世界",
"giantworldmap": "巨大化した世界",
"europe": "ヨーロッパ",
"mena": "中東・北アフリカ",
"northamerica": "北アメリカ",
@@ -151,13 +159,17 @@
"falklandislands": "フォークランド諸島",
"baikal": "バイカル湖付近",
"halkidiki": "ハルキディキ半島",
"giantworldmap": "巨大化した世界"
"straitofgibraltar": "ジブラルタル海峡",
"italia": "イタリア"
},
"map_categories": {
"continental": "大陸",
"regional": "地域",
"fantasy": "その他"
},
"map_component": {
"loading": "読み込み中…"
},
"private_lobby": {
"title": "ランダム",
"enter_id": "プライベートゲームに参加",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "次のゲームに参加",
"waiting": "人が参加しています...",
"teams_Duos": "デュオ(2つのチーム)",
"teams_Trios": "トリオ(3つのチーム)",
"teams_Quads": "クワッド(4つのチーム)",
"teams": "{num}チーム"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "他のプレイヤーの参加を待っています...",
"start": "ゲーム開始"
},
"team_colors": {
"red": "赤",
"blue": "青",
"teal": "青緑",
"purple": "紫",
"yellow": "黄色",
"orange": "橙",
"green": "緑",
"bot": "ボット"
},
"game_starting_modal": {
"title": "ゲーム開始中...",
"desc": "スタートのためにロビー準備中... ちょっとまってね!"
@@ -225,22 +250,36 @@
"sam_launcher": "SAMランチャー",
"atom_bomb": "原子爆弾",
"hydrogen_bomb": "水素爆弾",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "工場"
},
"user_setting": {
"title": "ユーザー設定",
"tab_basic": "基本設定",
"tab_keybinds": "キーの割り当て",
"dark_mode_label": "🌙 ダークモード",
"dark_mode_label": "ダークモード",
"dark_mode_desc": "画面を黒基調に切り替えます",
"emojis_label": "😊 絵文字を表示",
"dark_mode_enabled": "ダークモード中です",
"light_mode_enabled": "ライトモード中です",
"emojis_label": "絵文字を表示",
"emojis_visible": "絵文字は表示中です",
"emojis_hidden": "絵文字は非表示中です",
"emojis_desc": "ゲーム中で絵文字を表示します",
"special_effects_label": "💥 スペシャルエフェクト",
"alert_frame_label": "アラートフレーム",
"alert_frame_desc": "アラートフレームを切り替えます。有効にすると、裏切られたときにフレームが表示されます。",
"special_effects_label": "特殊効果",
"special_effects_desc": "特殊効果を切り替えます。無効にするとパフォーマンスが向上します。",
"anonymous_names_label": "🥷 ユーザー名を匿名にする",
"special_effects_enabled": "スペシャルエフェクトは有効です",
"special_effects_disabled": "スペシャルエフェクトは無効です",
"anonymous_names_label": "ユーザー名を匿名にする",
"anonymous_names_desc": "自分の画面では他のプレイヤーのユーザー名を非表示にし、代わりに別の名前で表示します。",
"left_click_label": "🖱️ 左クリックでメニューを開く",
"anonymous_names_enabled": "ユーザー名を匿名で表示されてます",
"real_names_shown": "ユーザー名で表示されています",
"left_click_label": "左クリックでメニューを開く",
"left_click_desc": "オンにすると左クリックでメニューを開くことができ、剣ボタンで攻撃します。オフにすると左クリックでそのまま攻撃します。",
"left_click_menu": "左クリックでメニューを開く",
"left_click_opens_menu": "左クリックでメニューを開くようにします",
"right_click_opens_menu": "右クリックでメニューを開くようにします",
"attack_ratio_label": "⚔️ 出撃兵力の比率",
"attack_ratio_desc": "初期時点で出撃する兵力の割合を設定します(1–100%)",
"troop_ratio_label": "🪖🛠️ 兵士と労働者の比率",
@@ -262,6 +301,8 @@
"attack_keybinds": "攻撃機能",
"boat_attack": "ボート攻撃",
"boat_attack_desc": "カーソルの位置に合わせた土地にボート攻撃を送ります。",
"ground_attack": "ボート攻撃",
"ground_attack_desc": "カーソルの位置に合わせた土地にボート攻撃を送ります。",
"zoom_controls": "ズーム操作",
"zoom_out": "ズームアウト",
"zoom_out_desc": "マップを縮小します",
@@ -279,7 +320,14 @@
"move_right": "カメラを右に移動",
"move_right_desc": "カメラを右方向に移動します",
"reset": "リセット",
"unbind": "連携解除"
"unbind": "連携解除",
"on": "オン",
"off": "オフ",
"toggle_terrain": "地形表示の切り替え",
"terrain_enabled": "地形のみを表示",
"terrain_disabled": "国境を表示",
"exit_game_label": "ゲームから退出する",
"exit_game_info": "メインメニューに戻ります"
},
"chat": {
"title": "クイックチャット",
@@ -363,8 +411,9 @@
"sam_launcher": "飛来する核ミサイルを迎撃する",
"warship": "貿易船を捕獲し、敵の船やボートを破壊する",
"port": "貿易船を送って資金を獲得する",
"defense_post": "近くの国境の防御を強化す",
"city": "最大人口増加させる"
"defense_post": "近くの国境の防御を強化します",
"city": "最大人口増加します",
"factory": "列車が行き来できる線路を作成します"
},
"not_enough_money": "資金不足"
},
@@ -383,6 +432,7 @@
"hide": "隠す",
"rank": "順位",
"player": "プレイヤー",
"team": "チーム",
"owned": "領土",
"gold": "ゴールド",
"troops": "兵士"
@@ -402,7 +452,39 @@
"sams": "SAM",
"warships": "戦艦",
"health": "体力",
"attitude": "態度"
"attitude": "態度",
"levels": "レベル"
},
"events_display": {
"retreating": "撤退中",
"boat": "ボート",
"alliance_request_status": "{name}が同盟のリクエストを{status}しました",
"alliance_accepted": "承認",
"alliance_rejected": "拒否",
"duration_second": "1秒",
"betrayal_description": "あなたは{name}との同盟を破棄し、裏切り者になりました(防御力が{durationText}の間{malusPercent}%低下します)",
"duration_seconds_plural": "{seconds} 秒",
"betrayed_you": "{name} はあなたとの同盟を破棄しました",
"about_to_expire": "{name} との同盟は間もなく失効します!",
"alliance_expired": "{name} との同盟は失効しました",
"attack_request": "{name} があなたに {target} を攻撃するよう要求しています",
"sent_emoji": "{name}に送信:{emoji}",
"renew_alliance": "更新のリクエスト",
"request_alliance": "{name} は同盟をリクエストしています!",
"focus": "焦点",
"accept_alliance": "承諾",
"reject_alliance": "却下",
"alliance_renewed": "{name} との同盟が更新されました",
"ignore": "無視"
},
"unit_info_modal": {
"structure_info": "建造物情報",
"unit_type_unknown": "不明",
"close": "閉じる",
"cooldown": "クールダウン",
"type": "タイプ",
"upgrade": "アップグレード",
"level": "レベル"
},
"relation": {
"hostile": "敵対的",
@@ -433,8 +515,14 @@
"none": "該当なし",
"alliances": "同盟"
},
"replay_panel": {
"replay_speed": "再生速度",
"game_speed": "ゲーム速度",
"fastest_game_speed": "最大"
},
"error_modal": {
"crashed": "ゲームがクラッシュしました!",
"connection_error": "接続エラー!",
"paste_discord": "以下の内容をDiscordのバグ報告に貼り付けてください:",
"copy_clipboard": "クリップボードにコピーする",
"copied": "コピーしました!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "スタート地点を選んで下さい"
},
"territory_patterns": {
"title": "領土の模様を選択",
"purchase": "購入",
"blocked": {
"login": "このページにアクセスするにはログインしてください。",
"purchase": "この模様を購入してロックを解除します。"
},
"pattern": {
"default": "デフォルト",
"custom": "カスタム",
"stripes_v": "縦模様",
"stripes_h": "横模様",
"horizontal_stripes": "横模様(別バージョン)",
"vertical_bars": "縦模様(別バージョン)",
"checkerboard": "市松模様",
"choco": "チョコレート",
"diagonal": "斜め",
"cross": "十字模様",
"mini_cross": "小さい十字模様",
"sword": "剣模様",
"sparse_dots": "まばらなドット模様",
"evan": "エヴァン模様",
"diagonal_stripe": "斜め縞模様",
"mountain_ridge": "山模様",
"scattered_dots": "散らばったドット模様",
"circuit_board": "回路基板模様",
"shells": "甲羅模様",
"-w-": ".w.",
"white_rabbit": "白ウサギ模様",
"goat": "ヤギ模様",
"cats": "猫模様",
"cursor": "カーソル模様",
"hand": "手",
"radiation": "放射線模様",
"openfront_qr": "Openfront.ioのQRコード",
"openfront": "OpenFront",
"t_rex": "ティラノサウルス模様",
"embelem": "紋章模様",
"grogu_head": "グローグーの顔模様",
"grogu": "グローグー模様"
}
},
"auth": {
"login_required": "このサイトにアクセスするにはログインが必要です。",
"redirecting": "リダイレクト中…",
"not_authorized": "このウェブサイトにアクセスする権限がありません。",
"contact_admin": "エラーでこのメッセージが表示されていると思われる場合は、管理者にお問い合わせください。"
}
}
+583
View File
@@ -0,0 +1,583 @@
{
"lang": {
"en": "Korean",
"native": "한국어",
"svg": "kr",
"lang_code": "ko"
},
"common": {
"close": "닫기"
},
"main": {
"title": "오픈 프론트 (시험판)",
"join_discord": "디스코드에 참가하세요!",
"login_discord": "디스코드로 로그인하기",
"checking_login": "로그인 확인 중...",
"logged_in": "로그인되었습니다!",
"log_out": "로그아웃",
"create_lobby": "로비 만들기",
"join_lobby": "로비에 참여하기",
"single_player": "혼자 하기",
"instructions": "소개",
"how_to_play": "게임 방법",
"advertise": "광고",
"wiki": "위키"
},
"news": {
"full_changelog": "변경 사항 전부 보기",
"github_link": " (깃허브)",
"title": "배포 요약"
},
"help_modal": {
"hotkeys": "단축키",
"table_key": "키",
"table_action": "동작",
"action_alt_view": "지도 보기 전환 (지형/국가)",
"action_attack_altclick": "공격 (좌클릭을 메뉴 열기로 설정한 경우)",
"action_build": "건설 메뉴 열기",
"action_emote": "감정표현 메뉴 열기",
"action_center": "플레이어를 화면 가운데로",
"action_zoom": "확대 / 축소",
"action_move_camera": "카메라 움직이기",
"action_ratio_change": "공격 비율 낮추기 / 높이기",
"action_reset_gfx": "그래픽 초기화",
"ui_section": "게임 UI",
"ui_leaderboard": "순위표",
"ui_your_team": "나의 팀:",
"ui_leaderboard_desc": "게임의 상위 플레이어와 이름, 소유한 영토(%), 재화, 병력을 표시합니다. '\"모두 표시\"를 선택하면 게임에 참여한 모든 플레이어가 표시됩니다. 순위표를 보고 싶지 않으면 \"숨기기\"를 클릭하세요.",
"ui_control": "제어판",
"ui_control_desc": "컨트롤 패널에는 다음과 같은 요소들이 포함되어 있습니다:",
"ui_pop": "인구 - 현재 보유한 유닛 수, 최대 인구 수, 그리고 인구 증가 속도를 나타냅니다.",
"ui_gold": "금 - 현재 보유한 금 양과 금 획득 속도를 나타냅니다.",
"ui_troops_workers": "병력와 일꾼 - 배치된 병력와 일꾼의 수를 나타냅니다. 병력은 공격하거나 방어할 때 사용되고, 일꾼은 골드를 생산하는 데 사용됩니다. 슬라이더를 이용해 병력와 일꾼의 수를 조절할 수 있습니다.",
"ui_attack_ratio": "공격 비율 - 공격 시 사용할 병력의 비율을 나타냅니다. 슬라이더로 공격 비율을 조절할 수 있습니다. 공격군이 방어군보다 많으면 공격 중 손실되는 병력이 줄어들고, 적으면 공격군이 더 큰 피해를 입게 됩니다. 이 효과는 최대 2:1 비율까지만 적용됩니다.",
"ui_events": "이벤트판",
"ui_events_desc": "이벤트판은 최신 이벤트, 요청사항, 그리고 빠른 채팅 메시지를 보여줍니다. 예시로는 다음과 같은 것들이 있습니다:",
"ui_events_alliance": "동맹 - 동맹 요청은 수락하거나 거절할 수 있습니다. 동맹 간에는 자원과 병력을 공유할 수 있지만 서로 공격할 수는 없습니다. ‘집중’ 버튼을 누르면 요청을 보낸 플레이어 쪽으로 화면이 이동합니다.",
"ui_events_attack": "공격 - 들어오는 공격과 당신이 보내는 공격이 표시됩니다. 메시지를 클릭하면 공격, 핵무기, 또는 수송선(보트) 위치로 화면이 이동합니다. 빨간 X 버튼을 클릭하면 병력을 철수시킬 수 있으며, 이 경우 공격군의 25%가 희생됩니다. 보트 공격을 철수시키면 보트가 출발지로 돌아가고, 그 사이에 땅이 점령되었다면 출발지에서 다시 공격합니다. 핵무기는 발사 후 철수가 불가능합니다.",
"ui_events_quickchat": "빠른 채팅 - 여기서 주고받은 채팅 메시지를 확인할 수 있습니다. 상대방 프로필의 빠른 채팅 아이콘을 클릭해 메시지를 보낼 수 있습니다.",
"ui_options": "설정",
"ui_options_desc": "다음 요소들이 포함되어 있습니다:",
"ui_playeroverlay": "플레이어 정보 오버레이",
"ui_playeroverlay_desc": "나라 위에 마우스를 올리면 옵션 아래에 플레이어 정보 오버레이가 표시됩니다. 여기서는 플레이어 유형(사람, 국가(똑똑한 봇), 봇), 국가의 당신에 대한 태도(적대적부터 우호적까지), 방어 중인 병력과 골드, 그리고 보유한 군함과 다양한 건물 수를 확인할 수 있습니다.",
"ui_wilderness": "무주지",
"option_pause": "게임 일시정지/재개 - 혼자 하기 모드에서만 사용 가능합니다.",
"option_timer": "타이머 - 게임 시작 후 경과 시간을 보여줍니다.",
"option_exit": "종료 버튼.",
"option_settings": "설정 - 설정 메뉴를 엽니다. 메뉴에서 지도 보기 전환, 감정표현, 다크 모드, 닌자 모드(익명/랜덤 이름 모드), 왼쪽 클릭 시 동작을 설정할 수 있습니다.",
"radial_title": "방사 메뉴",
"radial_desc": "마우스 오른쪽 버튼을 클릭하면 방사형 메뉴가 열립니다. (모바일에서는 터치) 방사형 메뉴 바깥쪽을 마우스 오른쪽 버튼으로 클릭하면 메뉴가 닫힙니다. 메뉴에서 다음 작업을 수행할 수 있습니다.",
"radial_build": "건설 메뉴를 엽니다.",
"radial_info": "정보 메뉴를 엽니다.",
"radial_boat": "선택한 위치를 공격하기 위해 함선(수송선)을 보냅니다. 물에 접근할 수 있는 경우에만 사용 가능합니다.",
"radial_close": "메뉴를 닫습니다.",
"info_title": "정보 메뉴",
"info_enemy_desc": "선택한 플레이어의 이름, 금, 병력 수, 당신과의 거래 중단 여부, 당신에게 발사한 핵무기 수, 그리고 배신자인지 여부 등의 정보가 포함되어 있습니다.\n‘거래 중단’은 해당 플레이어가 골드를 보내지 않고, 무역선을 통한 골드 거래도 중단한 상태를 의미합니다. 이는 플레이어가 직접 ‘거래 중단’을 선택했을 때(서로 ‘거래 시작’을 누를 때까지 지속) 또는 자동으로 적용됩니다(동맹을 배신했을 경우, 다시 동맹이 되거나 5분 후 해제).\n‘배신자’는 플레이어가 동맹인 상대를 배신하고 공격했을 때 30초 동안 ‘예’로 표시됩니다.\n아래 아이콘들은 다음과 같은 상호작용을 나타냅니다:",
"info_chat": "플레이어에게 빠른 채팅 메시지를 보냅니다. 카테고리와 문구를 선택하고, 문구에 [P1]이 포함되어 있다면 해당 부분을 대체할 플레이어 이름을 선택하세요. 마지막으로 ‘전송’을 누르면 메시지가 발송됩니다.",
"info_target": "플레이어에게 목표 표시를 하여 모든 동맹원들이 볼 수 있도록 합니다. 주로 공격을 조율할 때 사용됩니다.",
"info_alliance": "플레이어에게 동맹 요청을 보냅니다. 동맹 간에는 자원과 병력을 공유할 수 있지만 서로 공격할 수 없습니다.",
"info_emoji": "플레이어에게 감정 표현을 보냅니다.",
"info_trade": "‘거래 중단’을 사용하면 해당 플레이어에게 골드를 주거나 무역선을 통해 골드를 받는 것이 멈춥니다. 둘 다 ‘거래 시작’을 클릭하면 다시 거래가 재개됩니다.",
"info_ally_panel": "동맹 정보판",
"info_ally_desc": "플레이어와 동맹을 맺으면 다음과 같은 새로운 아이콘들이 활성화됩니다:",
"ally_betray": "동맹을 배신하면 동맹 및 무역을 중단하고, 자신의 방어력이 약화됩니다. 5분 동안(또는 동맹이 다시 형성될 때까지) 동맹 간의 무역이 중단되며, 다른 플레이어도 무역을 중단할 수 있습니다. 상대 플레이어가 배신자가 아닌 이상 30초 동안 배신자로 표시됩니다. 이 시간 동안 이름 위에 아이콘이 표시되고 방어력이 50% 감소합니다. 봇이 동맹을 맺을 가능성이 낮아지고, 동맹을 맺기 전에 플레이어들이 다시 한번 신중하게 생각하게 될 것입니다.",
"ally_donate": "동맹에게 일부 병력을 지원합니다. 동맹이 병력이 부족해 공격당하고 있을 때나, 적을 무찌르기 위해 추가 병력이 필요할 때 사용됩니다.",
"ally_donate_gold": "아군에게 재화를 기부합니다. 아군이 건설에 필요한 재화가 부족하거나, 특히 MIRV를 위해 저축하는 것으로 보일 때 사용할 수 있습니다.",
"build_menu_title": "건설 메뉴",
"build_menu_desc": "다음 건물들을 건설하거나, 현재 몇 개를 보유하고 있는지 확인할 수 있습니다:",
"build_name": "이름",
"build_icon": "아이콘",
"build_desc": "설명",
"build_city": "도시",
"build_city_desc": "최대 인구를 증가시킵니다. 영토를 확장할 수 없거나 인구 제한에 도달할 뻔할 때 유용합니다.",
"build_factory": "공장",
"build_factory_desc": "인근 구조물로 자동으로 철도를 만들고, 가끔 기차를 생성합니다.",
"build_defense": "방어 진지",
"build_defense_desc": "체크무늬 패턴을 보이는 근처 국경 주변의 방어력을 강화합니다. 적의 공격 속도가 느려지고 사상자가 증가합니다.",
"build_port": "항구",
"build_port_desc": "물가 근처에만 건설할 수 있습니다. 군함을 건조할 수 있습니다. 자국과 다른 국가의 항구 간에 무역선을 자동으로 보내 양측에 재화를 제공합니다. (무역이 중단된 경우 제외) 플레이어를 공격하거나 플레이어에게 공격을 받으면 무역이 자동으로 중단됩니다. 5분 후 또는 동맹국이 되면 무역이 재개됩니다. \"무역 중단\" 또는 \"무역 시작\"을 통해 무역을 수동으로 전환할 수 있습니다.",
"build_warship": "군함",
"build_warship_desc": "지정한 지역을 순찰하며 적의 무역선과 보트(수송선), 군함을 공격해 파괴합니다. 가장 가까운 항구에서 생성되며, 처음 건설할 때 클릭한 지역을 순찰합니다. 군함은 공격 명령(단축키의 공격 기능 참고)을 통해 조종할 수 있으며, 이동시키고 싶은 지역을 다시 공격 클릭하면 해당 위치로 이동합니다.",
"build_silo": "미사일 발사대",
"build_silo_desc": "미사일을 발사할 수 있습니다.",
"build_sam": "지대공 미사일 발사기",
"build_sam_desc": "반경 100픽셀 내에서 적 미사일을 요격할 수 있습니다. 원자폭탄은 100%, 수소폭탄은 80%, 개별 다탄두 미사일의 탄두는 50%의 명중 확률을 가집니다. 지대공 미사일은 7.5초의 재사용 대기시간이 있습니다.",
"build_atom": "원자폭탄",
"build_atom_desc": "작은 폭발물로, 영토와 건물, 선박 및 보트를 파괴합니다. 가장 가까운 미사일 사일로에서 발사되며, 처음 클릭한 지역에 착륙합니다.",
"build_hydrogen": "수소폭탄",
"build_hydrogen_desc": "대형 폭발물입니다. 가장 가까운 미사일 발사대에서 발사되며, 처음 클릭한 지역에 착륙합니다.",
"build_mirv": "다탄두 미사일",
"build_mirv_desc": "게임 내에서 가장 강력한 폭탄입니다. 여러 개의 작은 폭탄으로 분리되어 넓은 지역을 동시에 공격합니다. 처음 클릭한 플레이어에게만 피해를 줍니다. 가장 가까운 미사일 사일로에서 발사되며, 처음 클릭한 지역에 착륙합니다.",
"player_icons": "플레이어 아이콘",
"icon_desc": "게임 내에서 볼 수 있는 아이콘 중 일부와 그 의미는 다음과 같습니다.",
"icon_crown": "왕관 - 1등. 순위에서 최상위 플레이어를 의미합니다.",
"icon_traitor": "깨진 방패 - 배신자. 이 플레이어는 동맹을 공격했습니다.",
"icon_ally": "악수 - 동맹. 이 플레이어는 당신의 동맹입니다.",
"icon_embargo": "달러 금지 표지 - 금수 조치. 이 플레이어는 자동 또는 수동으로 당신과의 교역을 중단했습니다.",
"icon_request": "봉투 - 동맹 요청. 이 플레이어가 당신에게 동맹을 요청했습니다.",
"info_enemy_panel": "적 정보판",
"exit_confirmation": "정말 게임을 종료 하시겠습니까?"
},
"single_modal": {
"title": "혼자 하기",
"allow_alliances": "동맹 허용",
"options_title": "설정",
"bots": "봇: ",
"bots_disabled": "사용 안 함",
"disable_nations": "국가 비활성화",
"instant_build": "빠른 건설",
"infinite_gold": "무한 금",
"infinite_troops": "무한 병력",
"disable_nukes": "핵 금지",
"enables_title": "설정 활성화",
"start": "게임 시작하기"
},
"map": {
"map": "지도",
"world": "세계",
"giantworldmap": "거대한 세계",
"europe": "유럽",
"mena": "중동과 북아프리카",
"northamerica": "북미",
"oceania": "오세아니아",
"blacksea": "흑해",
"africa": "아프리카",
"asia": "아시아",
"mars": "화성",
"southamerica": "남미",
"britannia": "브리튼 제도",
"gatewaytotheatlantic": "대서양으로의 관문",
"australia": "호주",
"random": "무작위",
"iceland": "아이슬란드",
"pangaea": "판게아",
"eastasia": "동아시아",
"betweentwoseas": "두 바다 사이",
"faroeislands": "페로 제도",
"deglaciatedantarctica": "빙하가 녹은 남극",
"europeclassic": "유럽 (클래식)",
"falklandislands": "포클랜드 제도",
"baikal": "바이칼",
"halkidiki": "할키디키 반도",
"straitofgibraltar": "지브롤터 해협",
"italia": "이탈리아"
},
"map_categories": {
"continental": "대륙",
"regional": "지역",
"fantasy": "기타"
},
"map_component": {
"loading": "로딩중..."
},
"private_lobby": {
"title": "비공개 로비 참가",
"enter_id": "로비 아이디를 입력하세요",
"player": "플레이어",
"players": "플레이어",
"join_lobby": "로비에 참여하기",
"checking": "로비 확인중...",
"not_found": "로비를 찾을 수 없습니다. 로비 ID를 확인하고 다시 시도해 주세요.",
"error": "오류가 발생했습니다. 다시 시도해 주세요.",
"joined_waiting": "성공적으로 참여했습니다! 게임이 시작될 때까지 기다리는 중입니다..."
},
"public_lobby": {
"join": "다음 게임 참가",
"waiting": "기다리는 플레이어들",
"teams_Duos": "듀오 (2인 1조)",
"teams_Trios": "트리오 (3인 1조)",
"teams_Quads": "쿼드 (4인 1조)",
"teams": "{num} 팀"
},
"username": {
"enter_username": "사용자 이름을 입력하세요",
"not_string": "사용자 이름은 문자열이어야 합니다.",
"too_short": "사용자 이름은 최소 {min}자 이상이어야 합니다.",
"too_long": "사용자 이름은 {max}자를 넘을 수 없습니다.",
"invalid_chars": "사용자 이름에는 문자, 숫자, 공백, 밑줄, [대괄호]만 사용할 수 있습니다."
},
"host_modal": {
"title": "비공개 로비",
"mode": "모드",
"team_count": "팀 수",
"options_title": "설정",
"bots": "봇: ",
"bots_disabled": "사용 안 함",
"disable_nations": "국가 비활성화",
"instant_build": "빠른 건설",
"infinite_gold": "무한 금",
"infinite_troops": "무한 병력",
"enables_title": "설정 활성화",
"player": "플레이어",
"players": "플레이어",
"waiting": "플레이어들을 기다리고 있습니다...",
"start": "게임 시작하기"
},
"team_colors": {
"red": "빨강",
"blue": "파랑",
"teal": "청록",
"purple": "보라",
"yellow": "노랑",
"orange": "주황",
"green": "초록",
"bot": "봇"
},
"game_starting_modal": {
"title": "게임이 시작됩니다...",
"desc": "로비가 시작하기를 기다리고 있습니다. 기다려주세요."
},
"difficulty": {
"difficulty": "난이도",
"Relaxed": "쉬움 ",
"Balanced": "보통",
"Intense": "어려움",
"Impossible": "불가능"
},
"game_mode": {
"ffa": "개인전",
"teams": "팀전"
},
"select_lang": {
"title": "언어 선택"
},
"unit_type": {
"city": "도시",
"defense_post": "방어 진지",
"port": "항구",
"warship": "군함",
"missile_silo": "미사일 발사대",
"sam_launcher": "지대공 미사일 발사대",
"atom_bomb": "원자 폭탄",
"hydrogen_bomb": "수소 폭탄",
"mirv": "다탄두 미사일",
"factory": "공장"
},
"user_setting": {
"title": "사용자 설정",
"tab_basic": "기본 설정",
"tab_keybinds": "키 설정",
"dark_mode_label": "다크 모드",
"dark_mode_desc": "밝은 테마/어두운 테마로 전환합니다.",
"dark_mode_enabled": "다크 모드 적용됨",
"light_mode_enabled": "라이트 모드 적용됨",
"emojis_label": "이모지",
"emojis_visible": "이모티콘 활성화됨",
"emojis_hidden": "이모티콘 숨김 처리 됨",
"emojis_desc": "게임 내에서 감정 표현을 표시할지 여부를 선택합니다.",
"alert_frame_label": "경고 프레임",
"alert_frame_desc": "경고 프레임을 전환합니다. 활성화하면 배신당했을 때 프레임이 표시됩니다.",
"special_effects_label": "특수 효과",
"special_effects_desc": "특수 효과를 켜고 끕니다. 성능을 향상시키려면 비활성화하세요.",
"special_effects_enabled": "특수 효과 적용됨",
"special_effects_disabled": "특수 효과 해제됨",
"anonymous_names_label": "이름 감추기",
"anonymous_names_desc": "화면에 무작위 이름을 표시하여 실제 플레이어 이름을 숨깁니다.",
"anonymous_names_enabled": "익명 활성화됨",
"real_names_shown": "이름 보임",
"left_click_label": "좌클릭으로 메뉴 열기",
"left_click_desc": "켜짐 상태에서는 마우스 왼쪽 클릭 시 메뉴가 열리고 검 버튼 공격이 활성화됩니다. 꺼짐 상태에서는 마우스 왼쪽 클릭 시 바로 공격이 활성화됩니다.",
"left_click_menu": "좌클릭 메뉴",
"left_click_opens_menu": "좌클릭으로 메뉴 열기",
"right_click_opens_menu": "우클릭으로 메뉴 열기",
"attack_ratio_label": "⚔️ 공격 비율",
"attack_ratio_desc": "공격에 보낼 병력 비율 (1~100%)",
"troop_ratio_label": "🪖🛠️ 병력과 일꾼 비율",
"troop_ratio_desc": "전투를 위한 병력과 재화 생산을 위한 일꾼의 균형을 조정합니다. (1~100%)",
"territory_patterns_label": "🏳️ 영토 패턴",
"territory_patterns_desc": "게임 내에서 영토 패턴 패턴을 표시할지 여부를 선택하세요",
"easter_writing_speed_label": "글쓰기 속도 배율",
"easter_writing_speed_desc": "코딩하는 척하는 속도 조정 (x1~x100)",
"easter_bug_count_label": "버그 수",
"easter_bug_count_desc": "감당할 수 있는 버그의 수 (0~1000, 멘탈 기준)",
"view_options": "옵션 보기",
"toggle_view": "보기 전환",
"toggle_view_desc": "지도 보기 전환 (지형/국가)",
"attack_ratio_controls": "공격 비율 제어",
"attack_ratio_up": "공격 비율 높이기",
"attack_ratio_up_desc": "공격 비율을 10% 증가",
"attack_ratio_down": "공격 비율 낮추기",
"attack_ratio_down_desc": "공격 비율을 10% 감소",
"attack_keybinds": "공격 단축키",
"boat_attack": "상륙 공격",
"boat_attack_desc": "커서 아래 타일에 상륙 공격을 보내보세요.",
"ground_attack": "지상 공격",
"ground_attack_desc": "커서 아래 타일에 지상 공격을 보냅니다.",
"zoom_controls": "확대 / 축소 제어",
"zoom_out": "축소",
"zoom_out_desc": "지도로 축소",
"zoom_in": "확대",
"zoom_in_desc": "지도로 확대",
"camera_movement": "시점 이동",
"center_camera": "중앙",
"center_camera_desc": "플레이어 영토의 중심으로 이동합니다",
"move_up": "위로 카메라 이동",
"move_up_desc": "카메라를 위로 이동",
"move_left": "왼쪽으로 카메라 이동",
"move_left_desc": "카메라를 왼쪽으로 이동",
"move_down": "아래로 카메라 이동",
"move_down_desc": "카메라를 아래로 이동",
"move_right": "오른쪽으로 카메라 이동",
"move_right_desc": "카메라를 오른쪽으로 이동",
"reset": "초기화",
"unbind": "바인딩 해제",
"on": "켬",
"off": "끔",
"toggle_terrain": "지형 보기",
"terrain_enabled": "지형 보기 활성화됨",
"terrain_disabled": "지형 보기 비활성화됨",
"exit_game_label": "게임 나가기",
"exit_game_info": "주 메뉴로 돌아가기"
},
"chat": {
"title": "빠른 채팅",
"to": "{user} 에게: {msg}",
"from": "{user}: {msg}",
"category": "카테고리",
"phrase": "문장",
"player": "플레이어",
"send": "보내기",
"search": "플레이어 찾기...",
"build": "메시지를 작성하세요...",
"cat": {
"help": "도움말",
"attack": "공격",
"defend": "방어",
"greet": "인사말",
"misc": "기타",
"warnings": "경고"
},
"help": {
"troops": "병력 좀 줘!",
"gold": "금 좀 줘!",
"no_attack": "나 치지 마!",
"sorry_attack": "미안, 치려던게 아니였어;",
"alliance": "동맹할래?",
"help_defend": "[P1](으)로부터 방어하는 걸 도와줘!",
"team_up": "[P1]을(를) 상대로 함께 편을 먹자!"
},
"attack": {
"attack": "[P1]을(를) 공격해!",
"mirv": "[P1]에게 다탄두 미사일을 발사 해야해!",
"focus": "[P1]에게 집중 공격하자!",
"finish": "[P1]을(를) 끝장내버리자!"
},
"defend": {
"defend": "[P1]을(를) 막아!",
"dont_attack": "[P1]을(를) 치지 마!",
"ally": "[P1]은(는) 내 동맹이야!"
},
"greet": {
"hello": "안녕!",
"good_luck": "행운을 빌어!",
"have_fun": "재미있게 놀아!",
"gg": "GG!",
"nice_to_meet": "만나서 반가워!",
"well_played": "잘 했어!",
"hi_again": "다시 만나서 반가워!",
"bye": "잘 가!",
"thanks": "고마워!",
"oops": "앗, 잘못 눌렀다",
"trust_me": "날 믿어, 약속할게!",
"trust_broken": "믿었는데..."
},
"misc": {
"go": "가자!",
"strategy": "좋은 전략이야!",
"fun": "이 판 재밌네 ㅋㅋㅋ",
"pr": "내 PR은 도대체 언제 머지되는 걸까...?"
},
"warnings": {
"strong": "[P1]은(는) 강해.",
"weak": "[P1]은(는) 약해.",
"mirv_soon": "[P1]은(는) 곧 다탄두 미사일을 쏠 수 있어!",
"number1_warning": "우리가 힘을 합치지 않으면 1등 플레이어가 곧 이길 거야!",
"stalemate": "평화를 맺자. 이건 교착 상태야, 우리 둘 다 질 거야.",
"has_allies": "[P1]은(는) 동맹이 많아.",
"no_allies": "[P1]은(는) 동맹이 없어.",
"betrayed": "[P1]이(가) 동맹을 배신했어!",
"getting_big": "[P1]이(가) 너무 빨리 크고 있어!",
"danger_base": "[P1]이(가) 방어되지 않고 있어!",
"saving_for_mirv": "[P1]이(가) 다탄두 미사일 발사를 위해 자금을 모으고 있어.",
"mirv_ready": "[P1]은(는) 다탄두 미사일 발사를 위한 금이 충분히 있어!"
}
},
"build_menu": {
"desc": {
"atom_bomb": "소형 폭발을 일으킴",
"hydrogen_bomb": "대형 폭발을 일으킴",
"mirv": "선택된 플레이어만을 대상으로 초대형 폭발을 일으킴",
"missile_silo": "핵 발사를 위해 사용됩니다",
"sam_launcher": "들어오는 핵미사일을 방어합니다",
"warship": "무역선을 포획하고, 함선을 파괴합니다",
"port": "무역선을 보내 금을 생산합니다",
"defense_post": "주변 경계의 방어력을 강화합니다",
"city": "최대 인구 수를 증가시킵니다",
"factory": "철도를 만들고 기차를 생성합니다"
},
"not_enough_money": "돈이 부족합니다"
},
"win_modal": {
"died": "죽었습니다",
"your_team": "우리팀이 승리했습니다!",
"other_team": "{team} 팀이 이겼습니다!",
"you_won": "나의 승리!",
"other_won": "{player} 이(가) 이겼습니다!",
"exit": "게임 나가기",
"keep": "계속 플레이하기",
"wishlist": "Steam에서 찜하기!"
},
"leaderboard": {
"title": "순위표",
"hide": "숨기기",
"rank": "순위",
"player": "플레이어",
"team": "팀",
"owned": "소유함",
"gold": "금",
"troops": "병력"
},
"player_info_overlay": {
"type": "유형",
"bot": "봇",
"nation": "국가",
"player": "플레이어",
"team": "팀",
"d_troops": "방어 병력",
"a_troops": "공격 병력",
"gold": "금",
"ports": "항구",
"cities": "도시",
"missile_launchers": "미사일 발사대",
"sams": "지대공 미사일들",
"warships": "군함",
"health": "체력",
"attitude": "태도",
"levels": "레벨"
},
"events_display": {
"retreating": "후퇴 중",
"boat": "배",
"alliance_request_status": "{name}이(가) 당신의 동맹 요청을 {status}했습니다",
"alliance_accepted": "수락",
"alliance_rejected": "거부",
"duration_second": "1초",
"betrayal_description": "{name}와의 동맹을 파기했습니다. 당신은 이제 배신자입니다. (방어력 {malusPercent}% 감소, 지속 시간: {durationText})",
"duration_seconds_plural": "{seconds}초",
"betrayed_you": "{name}이(가) 당신과의 동맹을 파기했습니다",
"about_to_expire": "{name}와(과)의 동맹이 곧 만료됩니다!",
"alliance_expired": "{name}와(과)의 동맹이 만료되었습니다",
"attack_request": "{name}이(가) 당신에게 {target}을(를) 공격해 달라고 요청했습니다",
"sent_emoji": "{name} 에게: {emoji}",
"renew_alliance": "갱신 요청",
"request_alliance": "{name}이(가) 동맹을 요청했습니다!",
"focus": "초점",
"accept_alliance": "수락",
"reject_alliance": "거절",
"alliance_renewed": "{name}와(과)의 동맹이 갱신되었습니다",
"ignore": "무시하기"
},
"unit_info_modal": {
"structure_info": "건축물 정보",
"unit_type_unknown": "알 수 없음",
"close": "닫기",
"cooldown": "재사용 대기시간",
"type": "타입",
"upgrade": "업그레이드",
"level": "레벨"
},
"relation": {
"hostile": "적대적",
"distrustful": "신뢰하지 않음",
"neutral": "중립",
"friendly": "우호적",
"default": "기본"
},
"control_panel": {
"pop": "인구",
"gold": "금",
"troops": "병력",
"workers": "일꾼",
"attack_ratio": "공격 비율"
},
"player_panel": {
"gold": "금",
"troops": "병력",
"betrayals": "배신 횟수",
"traitor": "배신자",
"alliance_time_remaining": "동맹 만료: ",
"embargo": "당신과의 무역을 중단함",
"nuke": "당신에게 발사한 핵무기",
"start_trade": "무역 시작",
"stop_trade": "무역 중단",
"yes": "예",
"no": "아니오",
"none": "없음",
"alliances": "동맹"
},
"replay_panel": {
"replay_speed": "리플레이 속도",
"game_speed": "게임 속도",
"fastest_game_speed": "최대"
},
"error_modal": {
"crashed": "게임이 튕겼습니다!",
"connection_error": "연결 오류!",
"paste_discord": "디스코드의 버그 보고서에 다음을 붙여넣어 주세요:",
"copy_clipboard": "클립보드로 복사",
"copied": "복사 완료!",
"failed_copy": "복사 실패",
"desync_notice": "다른 플레이어와 동기화되지 않았습니다. 보이는 것이 다른 플레이어와 다를 수 있습니다."
},
"heads_up_message": {
"choose_spawn": "시작 위치를 선택하세요"
},
"territory_patterns": {
"title": "영토 패턴 선택",
"purchase": "구매",
"blocked": {
"login": "이 패턴에 액세스하려면 로그인해야 합니다.",
"purchase": "이 패턴을 구매하여 잠금 해제하세요."
},
"pattern": {
"default": "기본값",
"custom": "사용자 정의",
"stripes_v": "세로",
"stripes_h": "가로",
"horizontal_stripes": "가로 (보조)",
"vertical_bars": "세로 (보조)",
"checkerboard": "체커보드",
"choco": "초코",
"diagonal": "대각선",
"cross": "교차",
"mini_cross": "작은 교차",
"sword": "검",
"sparse_dots": "듬성듬성한 점들",
"evan": "이반",
"diagonal_stripe": "대각선 줄무늬",
"mountain_ridge": "산마루",
"scattered_dots": "흩어진 점들",
"circuit_board": "회로 기판",
"shells": "껍데기",
"-w-": ".w.",
"white_rabbit": "하얀 토끼",
"goat": "염소",
"cats": "고양이",
"cursor": "커서",
"hand": "손",
"radiation": "방사선",
"openfront_qr": "OpenFront.io QR 코드",
"openfront": "오픈프론트",
"t_rex": "티라노사우루스",
"embelem": "휘장",
"grogu_head": "그로구 머리",
"grogu": "그로구"
}
},
"auth": {
"login_required": "이 웹사이트에 접속하려면 로그인해야 합니다.",
"redirecting": "다른 페이지로 이동 중입니다...",
"not_authorized": "이 웹사이트에 접근할 권한이 없습니다.",
"contact_admin": "이 메시지가 잘못 표시되었다고 생각되면 웹사이트 관리자에게 문의하십시오."
}
}
+192 -22
View File
@@ -5,10 +5,14 @@
"svg": "nl",
"lang_code": "nl"
},
"common": {
"close": "Sluiten"
},
"main": {
"title": "OpenFront (ALFA)",
"join_discord": "Word lid van de Discord!",
"login_discord": "Login met Discord",
"checking_login": "Inlog controleren...",
"logged_in": "Ingelogd!",
"log_out": "Uitloggen",
"create_lobby": "Lobby aanmaken",
@@ -16,13 +20,19 @@
"single_player": "Eén Speler",
"instructions": "Instructies",
"how_to_play": "Hoe spelen?",
"advertise": "Adverteren",
"wiki": "Wiki"
},
"news": {
"full_changelog": "Bekijk het volledige changelog",
"github_link": "op GitHub",
"title": "Release-opmerkingen"
},
"help_modal": {
"hotkeys": "Sneltoetsen",
"table_key": "Sneltoets",
"table_action": "Actie",
"action_alt_view": "Alternatieve weergave (terrein/landen)",
"action_alt_view": "Weergave wisselen (terrein/landen)",
"action_attack_altclick": "Aanvallen (als linkermuisknop is ingesteld op menu openen)",
"action_build": "Open bouwmenu",
"action_emote": "Open emoji-menu",
@@ -33,6 +43,7 @@
"action_reset_gfx": "Grafische instellingen herstellen",
"ui_section": "Spel-UI",
"ui_leaderboard": "Leidersbord",
"ui_your_team": "Jouw team:",
"ui_leaderboard_desc": "Toont de topspelers van het spel en hun namen, % bezette land, goud en troepen. Met Toon Alle worden alle spelers in het spel getoond. Als je het leidersbord niet wilt zien, klik op Verberg.",
"ui_control": "Controlepaneel",
"ui_control_desc": "Het controlepaneel bevat de volgende elementen:",
@@ -42,17 +53,18 @@
"ui_attack_ratio": "Aanvalsverhouding - Het aantal troepen dat wordt gebruikt wanneer je aanvalt. Je kunt de aanvalsverhouding aanpassen met de schuifbalk. Gebruik je bij een aanval meer aanvallende troepen dan er verdedigende troepen zijn, dan verlies je er minder dan wanneer je met minder troepen aanvalt. Dit effect gaat niet verder dan verhoudingen van 2:1.",
"ui_events": "Gebeurtenispaneel",
"ui_events_desc": "Het Gebeurtenispaneel toont de laatste gebeurtenissen, verzoeken en Snelchat-berichten. Wat voorbeelden:",
"ui_events_alliance": "Bondgenootschap - Verzoeken om bondgenootschap kunnen worden geaccepteerd of afgewezen. Bondgenoten kunnen grondstoffen en troepen delen, maar elkaar niet aanvallen. Klikken op Focus brengt de speler die het verzoek stuurde in beeld.",
"ui_events_alliance": "Alliantie - Alliantieverzoeken kunnen worden geaccepteerd of afgewezen. Bondgenoten kunnen grondstoffen en troepen delen, maar elkaar niet aanvallen. Klikken op Focus brengt de speler die het verzoek stuurde in beeld.",
"ui_events_attack": "Aanvallen - Inkomende aanvallen en jouw uitgaande aanvallen worden getoond. Klik op het bericht om de aanval, Boot (transportschip) of het kernwapen in beeld te brengen. Je kunt eigen troepen terugtrekken met de rode X-knop. Dit kost 25% van je aanvallende troepen het leven. Als je een bootaanval terughaalt, keert de boot terug naar zijn vertrekpunt en valt daar aan als het land sindsdien is veroverd. Gelanceerde kernwapens kunnen niet teruggehaald worden.",
"ui_events_quickchat": "Snelchat - Je kunt hier verzonden en ontvangen chatberichten zien. Stuur een bericht naar een speler door in hun Informenu op het Snelchat-icoon te klikken.",
"ui_options": "Opties",
"ui_options_desc": "De volgende elementen zijn hierin te vinden:",
"ui_playeroverlay": "Overzicht spelersinfo",
"ui_playeroverlay_desc": "Wanneer je over een land beweegt (of ze aantikt op touchscreen), wordt het Overzicht spelersinfo weergegeven onder Opties. Het toont het type speler: Mens, Natie (slimme bot), of Bot. De houding van een Natie tegenover jou, variërend van Vijandig tot Vriendelijk. En verdedigende troepen, goud, plus het aantal Oorlogsschepen en verschillende gebouwen die de speler heeft.",
"ui_wilderness": "Wildernis",
"option_pause": "Spel pauzeren/hervatten - Alleen beschikbaar in het speltype voor één speler.",
"option_timer": "Timer - Tijd verstreken sinds het begin van het spel.",
"option_exit": "Afsluitknop.",
"option_settings": "Instellingen - Open het instellingenmenu. Daarin kun je de Alternatieve weergave, Emoji's, Donkere modus, Ninja (anonieme spelersnamen) en actie bij linkermuisknop in- of uitschakelen.",
"option_settings": "Instellingen - Open het instellingenmenu. Daarin kun je de Terreinweergave, Emoji's, Donkere modus, Verborgen (anonieme) namen, en actie bij linkermuisknop in- of uitschakelen.",
"radial_title": "Radiale menu",
"radial_desc": "Rechtermuisknop (of tikken op touchscreen) opent het Radiale menu. Om het te sluiten klik je met de rechtermuisknop erbuiten. Vanuit het menu kun je:",
"radial_build": "Het bouwmenu openen.",
@@ -63,7 +75,7 @@
"info_enemy_desc": "Bevat informatie zoals de naam van de geselecteerde speler, goud, troepen, of ze de handel hebben stopgezet, hoeveel kernwapens ze op je hebben afgevuurd, en of de speler een verrader is. Een verrader is een speler die een bondgenoot heeft aangevallen. Handel stopgezet betekent dat jullie geen goud meer van elkaar ontvangen via handelsschepen. Handmatig (als de speler op \"Stop handel\" heeft geklikt, wat duurt totdat jullie beide op \"Start handel\" hebben geklikt) of automatisch (als jij jullie bondgenootschap hebt verraden, wat 5 minuten duurt of korter als jullie weer bondgenoten worden). Verrader toont 30 seconden lang Ja als de speler een bondgenoot heeft aangevallen. De iconen hieronder staan voor de volgende interacties:",
"info_chat": "Stuur een snelchat-bericht naar de speler. Kies een categorie, een zin, en een spelersnaam om op de plek van [P1] te zetten in een zin. Klik op Verzenden.",
"info_target": "Plaats een doelmarkering op de speler, zichtbaar voor alle bondgenoten, wordt gebruikt om aanvallen te coördineren.",
"info_alliance": "Stuur een bondgenootschapsverzoek naar de speler. Bondgenoten kunnen goud en troepen delen, maar kunnen elkaar niet aanvallen.",
"info_alliance": "Stuur een alliantieverzoek naar de speler. Bondgenoten kunnen goud en troepen delen, maar kunnen elkaar niet aanvallen.",
"info_emoji": "Stuur een emoji naar de speler.",
"info_trade": "Gebruik \"Stop handel\" om handelsschepen van hun naar jou en andersom geen goud meer te laten bezorgen. Ze starten weer nadat jullie beide op \"Start handel\" klikken.",
"info_ally_panel": "Infopaneel bondgenoot",
@@ -78,6 +90,8 @@
"build_desc": "Beschrijving",
"build_city": "Stad",
"build_city_desc": "Verhoogt je maximale bevolking. Handig wanneer je je gebied niet kunt uitbreiden of bijna je bevolkingslimiet heb bereikt.",
"build_factory": "Fabriek",
"build_factory_desc": "Legt automatisch spoorlijnen aan naar nabijgelegen gebouwen, en af en toe verschijnt een trein.",
"build_defense": "Verdedigingspost",
"build_defense_desc": "Versterkt de verdediging rondom, binnen dit gebied krijgen grenzen een geruit patroon. Aanvallen van vijanden zijn trager en maken meer slachtoffers.",
"build_port": "Haven",
@@ -100,8 +114,9 @@
"icon_traitor": "Gebroken schild - Verrader. Deze speler heeft een bondgenoot aangevallen.",
"icon_ally": "Handdruk - Bondgenoot. Deze speler is je bondgenoot.",
"icon_embargo": "Dollar stopbord - Embargo. Deze speler heeft de handel met jou automatisch of handmatig stopgezet.",
"icon_request": "Envelop - Bondgenootschapsverzoek. Deze speler stuurde je een verzoek om bondgenoten te worden.",
"info_enemy_panel": "Infopaneel vijand"
"icon_request": "Envelop - Alliantieverzoek. Deze speler stuurde je een verzoek om bondgenoten te worden.",
"info_enemy_panel": "Infopaneel vijand",
"exit_confirmation": "Weet je zeker dat je dit spel wilt verlaten?"
},
"single_modal": {
"title": "Eén speler",
@@ -120,6 +135,7 @@
"map": {
"map": "Kaart",
"world": "Wereld",
"giantworldmap": "Gigantische Wereldkaart",
"europe": "Europa",
"mena": "MENA",
"northamerica": "Noord-Amerika",
@@ -135,20 +151,25 @@
"random": "Willekeurig",
"iceland": "IJsland",
"pangaea": "Pangea",
"eastasia": "Oost-Azië",
"betweentwoseas": "Tussen twee zeeën",
"knownworld": "Bekende Wereld",
"faroeislands": "Faeröer eilanden",
"deglaciatedantarctica": "Ontdooid Antarctica",
"europeclassic": "Europa (klassiek)",
"falklandislands": "Falklandeilanden",
"baikal": "Baikalmeer",
"halkidiki": "Chalkidiki"
"halkidiki": "Chalkidiki",
"straitofgibraltar": "Straat van Gibraltar",
"italia": "Italië"
},
"map_categories": {
"continental": "Continent",
"regional": "Regio",
"fantasy": "Overig"
},
"map_component": {
"loading": "Laden..."
},
"private_lobby": {
"title": "Privélobby toetreden",
"enter_id": "Voer Lobby-ID in",
@@ -163,6 +184,9 @@
"public_lobby": {
"join": "Deelnemen aan volgende Spel",
"waiting": "spelers wachten",
"teams_Duos": "Duo's (teams van 2)",
"teams_Trios": "Trio's (teams van 3)",
"teams_Quads": "Viertallen (teams van 4)",
"teams": "{num} Teams"
},
"username": {
@@ -189,6 +213,16 @@
"waiting": "Wachten op spelers...",
"start": "Start Spel"
},
"team_colors": {
"red": "Rood",
"blue": "Blauw",
"teal": "Blauwgroen",
"purple": "Paars",
"yellow": "Geel",
"orange": "Oranje",
"green": "Groen",
"bot": "Bot"
},
"game_starting_modal": {
"title": "Spel gaat starten...",
"desc": "Voorbereiden op het starten van de lobby. Even geduld."
@@ -216,33 +250,59 @@
"sam_launcher": "Luchtdoelraket (SAM)-lanceerder",
"atom_bomb": "Atoombom",
"hydrogen_bomb": "Waterstofbom",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "Fabriek"
},
"user_setting": {
"title": "Gebruikersinstellingen",
"tab_basic": "Basisinstellingen",
"tab_keybinds": "Sneltoetsen",
"dark_mode_label": "🌙 Donkere modus",
"dark_mode_label": "Donkere Modus",
"dark_mode_desc": "Schakel tussen lichte en donkere thema's voor de site",
"emojis_label": "😊 Emoji's",
"dark_mode_enabled": "Donkere modus ingeschakeld",
"light_mode_enabled": "Lichte modus ingeschakeld",
"emojis_label": "Emoji's",
"emojis_visible": "Emoji's zijn zichtbaar",
"emojis_hidden": "Emoji's worden verborgen",
"emojis_desc": "Schakel het tonen van emoji's in de game uit/aan",
"special_effects_label": "💥 Speciale effecten",
"special_effects_desc": "Speciale effecten aanzetten. Zet uit om de prestaties van het spel te verbeteren",
"anonymous_names_label": "🥷 Verborgen namen",
"alert_frame_label": "Waarshuwingskader",
"alert_frame_desc": "Schakel het waarschuwingskader aan/uit. Als het is ingeschakeld, wordt het kader getoond wanneer je wordt verraden.",
"special_effects_label": "Visuele effecten",
"special_effects_desc": "Visuele effecten aanzetten. Zet uit om de prestaties van het spel te verbeteren",
"special_effects_enabled": "Visuele effecten ingeschakeld",
"special_effects_disabled": "Visuele effecten uitgeschakeld",
"anonymous_names_label": "Verborgen Namen",
"anonymous_names_desc": "Vervang echte spelersnamen door willekeurige namen op je scherm.",
"anonymous_names_enabled": "Anonieme namen ingeschakeld",
"real_names_shown": "Echte namen worden getoond",
"left_click_label": "Linkermuisknop voor openen menu",
"left_click_desc": "Als AAN: linkermuisknop opent het Radiale menu met zwaard-aanvalsknop. Als UIT: linkermuisknop opent direct de aanval.",
"left_click_menu": "Linkermuisknop Radiale Menu",
"left_click_opens_menu": "Linkermuisknop opent menu",
"right_click_opens_menu": "Rechtermuisknop opent menu",
"attack_ratio_label": "⚔️ Aanvalsverhouding",
"attack_ratio_desc": "Welk percentage van je troepen je bij een aanval stuurt (1-100%)",
"troop_ratio_label": "🪖🛠️ Troepen en Werkers-verhouding",
"troop_ratio_desc": "De balans tussen troepen (voor gevechten) en werkers (voor goudproductie) aanpassen (1-100%)",
"territory_patterns_label": "🏳️ Gebiedspatronen",
"territory_patterns_desc": "Kies of je gebiedspatronen in het spel wilt weergeven",
"easter_writing_speed_label": "Schrijfsnelheidsvermenigvuldiger",
"easter_writing_speed_desc": "Pas aan hoe snel je pretendeert te programmeren (x1-x100)",
"easter_bug_count_label": "Aantal bugs",
"easter_bug_count_desc": "Hoeveel bugs je oké vindt (0-1000, gevoelsmatig)",
"view_options": "Weergave-opties",
"toggle_view": "Weergave wisselen",
"toggle_view_desc": "Alternatieve weergave (terrein/landen)",
"toggle_view_desc": "Weergave wisselen (terrein/landen)",
"attack_ratio_controls": "Aanvalsverhouding-bediening",
"attack_ratio_up": "Verhoog Aanvalsverhouding",
"attack_ratio_up_desc": "Verhoog aanvalsverhouding met 10%",
"attack_ratio_down": "Verlaag Aanvalsverhouding",
"attack_ratio_down_desc": "Verlaag aanvalsverhouding met 10%",
"attack_keybinds": "Aanvalssneltoetsen",
"boat_attack": "Bootaanval",
"boat_attack_desc": "Stuur een bootaanval naar de plek onder je cursor.",
"ground_attack": "Grondaanval",
"ground_attack_desc": "Stuur een grondaanval naar de plek onder je cursor.",
"zoom_controls": "Zoombediening",
"zoom_out": "Uitzoomen",
"zoom_out_desc": "Kaart uitzoomen",
@@ -260,7 +320,14 @@
"move_right": "Camera naar rechts",
"move_right_desc": "Beweeg de camera naar rechts",
"reset": "Resetten",
"unbind": "Loskoppelen"
"unbind": "Loskoppelen",
"on": "Aan",
"off": "Uit",
"toggle_terrain": "Terrein Aan/Uit",
"terrain_enabled": "Terreinweergave ingeschakeld",
"terrain_disabled": "Terreinweergave uitgeschakeld",
"exit_game_label": "Spel Verlaten",
"exit_game_info": "Terug naar hoofdmenu"
},
"chat": {
"title": "Snelchat",
@@ -344,8 +411,9 @@
"sam_launcher": "Verdedigd tegen inkomende kernwapens",
"warship": "Verovert handelsschepen, vernietigt oorlog- en transportschepen",
"port": "Stuurt handelsschepen om goud te genereren",
"defense_post": "Verhoogt de verdediging eromheen",
"city": "Verhoog maximale bevolking"
"defense_post": "Versterkt verdediging eromheen",
"city": "Verhoogt maximale bevolking",
"factory": "Maakt spoorwegen en laat treinen rijden"
},
"not_enough_money": "Niet genoeg goud"
},
@@ -356,13 +424,15 @@
"you_won": "Je hebt gewonnen!",
"other_won": "{player} heeft gewonnen!",
"exit": "Verlaat spel",
"keep": "Blijf spelen"
"keep": "Blijf spelen",
"wishlist": "Op je Verlanglijst op Steam!"
},
"leaderboard": {
"title": "Leidersbord",
"hide": "Verberg",
"rank": "Plek",
"player": "Speler",
"team": "Team",
"owned": "Bezit",
"gold": "Goud",
"troops": "Troepen"
@@ -382,7 +452,39 @@
"sams": "SAM-lanceerders",
"warships": "Oorlogsschepen",
"health": "Gezondheid",
"attitude": "Houding"
"attitude": "Houding",
"levels": "Levels"
},
"events_display": {
"retreating": "trekken zich terug",
"boat": "Boot",
"alliance_request_status": "{name} heeft je alliantieverzoek {status}",
"alliance_accepted": "geaccepteerd",
"alliance_rejected": "geweigerd",
"duration_second": "1 seconde",
"betrayal_description": "Je hebt jouw alliantie met {name} verbroken, je bent nu een VERRADER ({durationText} een {malusPercent}% zwakkere verdediging)",
"duration_seconds_plural": "{seconds} seconden",
"betrayed_you": "{name} heeft de alliantie met jou verbroken",
"about_to_expire": "Je alliantie met {name} verloopt bijna!",
"alliance_expired": "Je alliantie met {name} is verlopen",
"attack_request": "{name} vraagt je om {target} aan te vallen",
"sent_emoji": "> Aan {name}: {emoji}",
"renew_alliance": "Vraag om verlenging",
"request_alliance": "{name} vraagt om een alliantie!",
"focus": "Centreer",
"accept_alliance": "Aanvaarden",
"reject_alliance": "Afwijzen",
"alliance_renewed": "Je alliantie met {name} is hernieuwd",
"ignore": "Negeren"
},
"unit_info_modal": {
"structure_info": "Gebouw Info",
"unit_type_unknown": "Onbekend",
"close": "Sluiten",
"cooldown": "Afkoeling",
"type": "Type",
"upgrade": "Upgrade",
"level": "Level"
},
"relation": {
"hostile": "Vijandig",
@@ -401,13 +503,81 @@
"player_panel": {
"gold": "Goud",
"troops": "Troepen",
"betrayals": "Aantal verraadacties",
"traitor": "Verrader",
"alliance_time_remaining": "Resterende tijd",
"alliance_time_remaining": "Alliantie verloopt over",
"embargo": "Handel met jou stopgezet",
"nuke": "Kernwapens op jou afgevuurd",
"start_trade": "Start handel",
"stop_trade": "Stop handel",
"yes": "Ja",
"no": "Nee"
"no": "Nee",
"none": "Geen",
"alliances": "Allianties"
},
"replay_panel": {
"replay_speed": "Afspeelsnelheid",
"game_speed": "Spel snelheid",
"fastest_game_speed": "max"
},
"error_modal": {
"crashed": "Spel gecrasht!",
"connection_error": "Verbindingsfout!",
"paste_discord": "Plak het volgende in je bug report op Discord:",
"copy_clipboard": "Naar klembord kopiëren",
"copied": "Gekopiëerd!",
"failed_copy": "Kopiëren mislukt",
"desync_notice": "Je bent niet meer gesynchroniseerd met andere spelers. Wat je ziet kan verschillen van andere spelers."
},
"heads_up_message": {
"choose_spawn": "Kies een startlocatie"
},
"territory_patterns": {
"title": "Selecteer gebiedspatroon",
"purchase": "Kopen",
"blocked": {
"login": "Je moet ingelogd zijn voor toegang tot dit patroon.",
"purchase": "Koop dit patroon om het te ontgrendelen."
},
"pattern": {
"default": "Standaard",
"custom": "Op maat",
"stripes_v": "Verticaal",
"stripes_h": "Horizontaal",
"horizontal_stripes": "Horizontaal (Alt)",
"vertical_bars": "Verticaal (Alt)",
"checkerboard": "Dambord",
"choco": "Choco",
"diagonal": "Diagonaal",
"cross": "Gekruisd",
"mini_cross": "Mini Gekruisd",
"sword": "Zwaard",
"sparse_dots": "Spaarzame Stippen",
"evan": "Evan",
"diagonal_stripe": "Diagonale Streep",
"mountain_ridge": "Bergrug",
"scattered_dots": "Verspreide Stippen",
"circuit_board": "Printplaat",
"shells": "Schelpen",
"-w-": ".w.",
"white_rabbit": "Wit Konijn",
"goat": "Geit",
"cats": "Katten",
"cursor": "Cursor",
"hand": "Hand",
"radiation": "Straling",
"openfront_qr": "OpenFront.io QR-code",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Embleem",
"grogu_head": "Grogu-hoofd",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Login is vereist voor toegang tot deze website.",
"redirecting": "Je wordt omgeleid...",
"not_authorized": "Je bent niet gemachtigd voor toegang tot deze website.",
"contact_admin": "Als je denkt dat dit bericht niet klopt, neem dan contact op met de websitebeheerder."
}
}
@@ -167,7 +167,7 @@
"en": "Brazilian Portuguese",
"native": "Português brasileiro",
"svg": "br",
"lang_code": "pt_br"
"lang_code": "pt-BR"
},
"game_mode": {
"ffa": "Free for All",
+165 -29
View File
@@ -24,13 +24,15 @@
"wiki": "Вики"
},
"news": {
"title": "Версия 23 выпущена!"
"full_changelog": "Смотрите весь журнал изменений",
"github_link": "на GitHub",
"title": "Список изменений"
},
"help_modal": {
"hotkeys": "Горячие клавиши",
"table_key": "Клавиша",
"table_action": "Действие",
"action_alt_view": "Альтернативное представление (ландшафт/страны)",
"action_alt_view": "Альтернативное представление (рельеф/страны)",
"action_attack_altclick": "Атака (если левая кнопка мыши назначена на открытие меню)",
"action_build": "Открыть меню строительства",
"action_emote": "Открыть меню смайлов",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Сбросить графику",
"ui_section": "Игровой интерфейс",
"ui_leaderboard": "Таблица лидеров",
"ui_your_team": "Ваша команда:",
"ui_leaderboard_desc": "Показывает лучших игроков игры и их имена, % принадлежащих территорий, количество золота и войск. При помощи кнопки «Показать всё» вы можете показать всех игроков в игре. Если вы не хотите видеть таблицу лидеров, нажмите «Скрыть».",
"ui_control": "Панель управления",
"ui_control_desc": "Панель управления содержит следующие элементы:",
@@ -50,17 +53,18 @@
"ui_attack_ratio": "Соотношение атаки — Количество войск, которое будет использовано при атаке. Вы можете настроить соотношение атаки с помощью ползунка. Имея больше войск атаки, чем войск защиты, вы уменьшите потери во время атаки, а меньше — увеличите потери, наносимые вашим атакующим войскам. Эффект не превышает соотношения 2:1.",
"ui_events": "Панель событий",
"ui_events_desc": "Панель событий отображает последние события, запросы и сообщения быстрого чата. Некоторые примеры:",
"ui_events_alliance": "Альянс — Запросы на заключение альянса можно принимать или отклонять. Союзники могут обмениваться ресурсами и войсками, но не могут атаковать друг друга. Нажатие на «Осмотреть» перемещает вид на игрока, который отправил запрос.",
"ui_events_alliance": "Союз — Запросы на заключение союзов можно принимать или отклонять. Союзники могут обмениваться ресурсами и войсками, но не могут атаковать друг друга. Нажатие на «Осмотреть» перемещает вид на игрока, который отправил запрос.",
"ui_events_attack": "Атаки — Отображение входящих и исходящих атак. Нажмите на сообщение, чтобы центровать камеру на атаку, ракету или лодку (транспортный корабль). Вы можете отозвать войска, нажав на красную кнопку «X». Это будет стоить жизней 25% войск, которые атакуют. Если вы отозвёте лодку, она вернётся в исходное местоположение и совершит атаку, если территория была захвачена. Ракеты нельзя отозвать после запуска.",
"ui_events_quickchat": "Быстрый чат — Здесь вы можете увидеть отправленные и полученные сообщения. Отправьте сообщение игроку, нажав на значок быстрого чата в его меню информации.",
"ui_options": "Настройки",
"ui_options_desc": "Среди них можно найти следующие элементы:",
"ui_playeroverlay": "Панель информации об игроке",
"ui_playeroverlay_desc": "Когда вы наведите курсор на страну, под кнопкой «Настройки» отображается панель информации об игроке. Он показывает тип игрока: человек, нация (умный бот) или бот. Отношение нации к вам: от враждебного до дружеского. И количество войск защиты, золота, военных кораблей и разных строений в собственности игрока.",
"ui_wilderness": "Пустошь",
"option_pause": "Приостановить/Продолжить игру — Доступно только в режиме одиночной игры.",
"option_timer": "Таймер — Время, прошедшее с начала игры.",
"option_exit": "Кнопка выхода.",
"option_settings": "Настройки — Открыть меню настроек. В нём вы можете переключить альтернативное представление, смайлики, тёмный режим, ниндзя (режим скрытых/случайных имён) и взаимодействие левой кнопкой мыши.",
"option_settings": "Настройки — Открыть меню настроек. В нём вы можете включить/выключить альтернативное представление, эмодзи, тёмный режим, ниндзя (режим скрытых/случайных имён) и взаимодействие левой кнопкой мыши.",
"radial_title": "Круговое меню",
"radial_desc": "Щелчок правой кнопкой мыши (или нажатие на мобильном устройстве) открывает круговое меню. Щёлкните правой кнопкой мыши за его пределами, чтобы закрыть его. С этого меню вы можете:",
"radial_build": "Открыть меню строительства.",
@@ -68,15 +72,15 @@
"radial_boat": "Отправить лодку (транспортный корабль) для атаки указанного места. Доступно только при наличии доступа к воде.",
"radial_close": "Закрыть меню.",
"info_title": "Меню информации",
"info_enemy_desc": "Содержит такую информацию о выбранном игроке, как его имя, золото, войска, состояние торговли с вами, запущенные на вас ракеты и метку предателя. Прекращённая торговля означает, что вы не будете получать от игрока золото и он не будет отправлять вам золото через торговые корабли. Вручную (если игрок нажал «Прекратить торговлю», что длится до тех пор, пока вы оба не нажмёте «Начать торговлю») или автоматически (если вы предали ваш альянс, что длится до тех пор, пока вы не станете союзниками снова или через 5 минут). В поле «Предатель» будет указана метка «Да» в течение 30 секунд после того, как игрок предал и напал на игрока, вступившего в альянс с ними. Значки ниже обозначают следующие взаимодействия:",
"info_enemy_desc": "Содержит такую информацию о выбранном игроке, как его имя, количество золота, войск, состояние торговли с вами, запущенные на вас ракеты и метку предателя. Прекращённая торговля значит, что вы не будете получать от игрока золото и он не будет отправлять вам золото через торговые корабли. Вручную (если игрок нажал «Прекратить торговлю», что длится до тех пор, пока вы оба не нажмёте «Начать торговлю») или автоматически (если вы предали ваш союз, что длится до тех пор, пока вы не станете союзниками снова или через 5 минут). В поле «Предатель» будет указана метка «Да» в течение 30 секунд после того, как игрок предал и напал на игрока, который был в союзе с ними. Значки ниже обозначают следующие взаимодействия:",
"info_chat": "Отправьте игроку быстрое сообщение. Выберите категорию, фразу и, если фраза содержит слово «[P1]», выберите имя игрока, которым хотите заменить его. Нажмите «Отправить».",
"info_target": "Поместить метку цели на игрока, отметив его для всех союзников. Используется для координирования атак.",
"info_alliance": "Отправить запрос альянса игроку. Союзники могут обмениваться ресурсами и войсками, но не могут атаковать друг друга.",
"info_emoji": "Отправить смайлик игроку.",
"info_alliance": "Отправить игроку запрос на союз. Союзники могут обмениваться ресурсами и войсками, но не могут атаковать друг друга.",
"info_emoji": "Отправить эмодзи игроку.",
"info_trade": "Используйте «Прекратить торговлю», чтобы перестать давать игроку золото и получать золото от него через торговые корабли. Если вы оба нажмете «Начать торговлю», то он начнется снова.",
"info_ally_panel": "Панель информации о союзнике",
"info_ally_desc": "Когда вы заключите альянс с игроком, станут доступны следующие значки:",
"ally_betray": "Предайте своего союзника, разрывая альянс, прекращая торговлю и ослабляя свою защиту. Торговля между вами приостановиться на 5 минут (или до тех пор, пока вы снова не станете союзниками), и другие игроку могут перестать с вами торговать. Если другой игрок не был предателем, вы получите метку предателя на 30 секунд. В это время над вашим именем будет отображаться значок и ваша защита будет снижена на 50%. Боты с меньшей вероятность будут заключать с вами альянсы, а игроки подумают дважды перед тем, как иметь с вами дело.",
"info_ally_desc": "Когда вы заключите союз с игроком, станут доступны следующие значки:",
"ally_betray": "Предайте своего союзника, разорвав союз, прекратив торговлю и ослабив свою защиту. Торговля между вами приостановиться на 5 минут (или до возобновления союза), а другие игроки также могут перестать торговать с вами. Если другой игрок не был предателем, вы получите метку предателя на 30 секунд. В это время над вашим именем появится особый значок и ваша защита будет снижена на 50%. Боты с меньшей вероятность будут заключать с вами союзы, а игроки дважды подумают перед тем, как иметь с вами дело.",
"ally_donate": "Пожертвовать часть войска союзнику. Используется, когда у него мало войск и его атакуют, или когда ему нужна дополнительная мощь для уничтожения врага.",
"ally_donate_gold": "Пожертвовать немного золота союзнику. Используйте, когда у него мало золота, необходимого для сооружений, или когда член команды копит на РГЧ ИН.",
"build_menu_title": "Меню строительства",
@@ -86,6 +90,8 @@
"build_desc": "Описание",
"build_city": "Город",
"build_city_desc": "Увеличивает ваше максимальное населения. Полезно, когда вы не можете расширить свою территорию или скоро достигнете лимита населения.",
"build_factory": "Фабрика",
"build_factory_desc": "Автоматически прокладывает железнодорожные пути к ближайшим структурам и время от времени создаёт поезда.",
"build_defense": "Укрепление",
"build_defense_desc": "Укрепляет защиту вокруг ближайших границ, которые выделены узором в клеточку. Атаки врагов замедлены и несут больше жертв.",
"build_port": "Порт",
@@ -108,12 +114,13 @@
"icon_traitor": "Сломанный щит — Предатель. Этот игрок напал на союзника.",
"icon_ally": "Рукопожатие — Союзник. Этот игрок — ваш союзник.",
"icon_embargo": "Перечёркнутый знак доллара — Эмбарго. Этот игрок перестал торговать с вами; автоматически или вручную.",
"icon_request": "Конверт — Запрос альянса. Этот игрок отправил вам запрос на создание альянса.",
"info_enemy_panel": "Панель информации о враге"
"icon_request": "Конверт — Запрос на союз. Этот игрок отправил вам запрос на заключение союза.",
"info_enemy_panel": "Панель информации о враге",
"exit_confirmation": "Вы уверены, что хотите выйти из игры?"
},
"single_modal": {
"title": "Одиночная игра",
"allow_alliances": "Разрешить альянсы",
"allow_alliances": "Разрешить союзы",
"options_title": "Настройки",
"bots": "Боты: ",
"bots_disabled": "Отключены",
@@ -128,6 +135,7 @@
"map": {
"map": "Карта",
"world": "Мир",
"giantworldmap": "Гигантская карта мира",
"europe": "Европа",
"mena": "MENA",
"northamerica": "Северная Америка",
@@ -151,13 +159,17 @@
"falklandislands": "Фолклендские острова",
"baikal": "Байкал",
"halkidiki": "Халкидики",
"giantworldmap": "Гигантская карта мира"
"straitofgibraltar": "Гибралтарский пролив",
"italia": "Италия"
},
"map_categories": {
"continental": "Континентальные",
"regional": "Региональные",
"fantasy": "Прочие"
},
"map_component": {
"loading": "Загрузка..."
},
"private_lobby": {
"title": "Присоединиться к приватному лобби",
"enter_id": "Введите ID лобби",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Присоединиться к следующей игре",
"waiting": "игрока(-ов) в ожидании",
"teams_Duos": "Дуо (команды по 2)",
"teams_Trios": "Трио (команды по 3)",
"teams_Quads": "Квады (команды по 4)",
"teams": "Команд: {num}"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "Ожидание игроков...",
"start": "Начать игру"
},
"team_colors": {
"red": "Красный",
"blue": "Синий",
"teal": "Бирюзовый",
"purple": "Фиолетовый",
"yellow": "Жёлтый",
"orange": "Оранжевый",
"green": "Зелёный",
"bot": "Бот"
},
"game_starting_modal": {
"title": "Игра начинается...",
"desc": "Подготовка к запуску лобби. Пожалуйста, подождите."
@@ -225,27 +250,41 @@
"sam_launcher": "Пусковая установка ЗРК",
"atom_bomb": "Атомная бомба",
"hydrogen_bomb": "Водородная бомба",
"mirv": "РГЧ ИН"
"mirv": "РГЧ ИН",
"factory": "Фабрика"
},
"user_setting": {
"title": "Пользовательские настройки",
"tab_basic": "Основные настройки",
"tab_keybinds": "Привязки клавиш",
"dark_mode_label": "🌙 Тёмный режим",
"dark_mode_label": "Тёмный режим",
"dark_mode_desc": "Переключение внешнего вида сайта между светлой и тёмной темой",
"emojis_label": "😊 Смайлы",
"emojis_desc": "Переключение видимости смайлов во время игры",
"special_effects_label": "💥 Специальные эффекты",
"special_effects_desc": "Переключить специальные эффекты. Отключите для улучшения производительности",
"anonymous_names_label": "🥷 Скрытые имена",
"dark_mode_enabled": "Включён тёмный режим",
"light_mode_enabled": "Включён светлый режим",
"emojis_label": "Эмодзи",
"emojis_visible": "Эмодзи показаны",
"emojis_hidden": "Эмодзи скрыты",
"emojis_desc": "Включение/выключение видимости эмодзи в игре",
"alert_frame_label": "Рамка тревоги",
"alert_frame_desc": "Включить/выключить рамку тревоги. Когда включено, она будет отображаться, когда вас предают.",
"special_effects_label": "Спецэффекты",
"special_effects_desc": "Включить/включить спецэффекты. Отключите для улучшения производительности",
"special_effects_enabled": "Спецэффекты включены",
"special_effects_disabled": "Спецэффекты выключены",
"anonymous_names_label": "Скрытые имена",
"anonymous_names_desc": "Скрыть настоящие имена игроков и заменить их случайными.",
"left_click_label": "🖱️ Открытие меню левой кнопкой мыши",
"anonymous_names_enabled": "Включены анонимные имена",
"real_names_shown": "Показаны настоящие имена",
"left_click_label": "Открытие меню левой кнопкой мыши",
"left_click_desc": "ВКЛЮЧЕНО: щелчок левой кнопкой мыши открывает меню, атака совершается кнопкой с мечом. ВЫКЛЮЧЕНО: нажатие левой кнопкой мыши совершает атаку напрямую.",
"left_click_menu": "Меню на левую кнопку мыши",
"left_click_opens_menu": "Меню открывается левой кнопкой мыши",
"right_click_opens_menu": "Меню открывается правой кнопкой мыши",
"attack_ratio_label": "⚔️ Соотношение атаки",
"attack_ratio_desc": "Какой процент ваших войск отправлять в бой (1–100%)",
"troop_ratio_label": "🪖🛠️ Соотношение войск и рабочих",
"troop_ratio_desc": "Настройте соотношение между войсками (для боя) и рабочими (для добычи золота) (1–100%)",
"territory_patterns_label": "🏳️ Узоры Территорий",
"territory_patterns_label": "🏳️ Узоры территорий",
"territory_patterns_desc": "Выберите, показывать ли узоры территорий в игре",
"easter_writing_speed_label": "Множитель скорости печати",
"easter_writing_speed_desc": "Настройте скорость, с которой вы делаете вид, что программируете (x1–x100)",
@@ -253,7 +292,7 @@
"easter_bug_count_desc": "Количество багов, которое вы считаете приемлемым (0–1000, эмоционально)",
"view_options": "Настройки просмотра",
"toggle_view": "Переключить представление",
"toggle_view_desc": "Альтернативное представление (ландшафт/страны)",
"toggle_view_desc": "Альтернативное представление (рельеф/страны)",
"attack_ratio_controls": "Управление соотношением атаки",
"attack_ratio_up": "Увеличить соотношение атаки",
"attack_ratio_up_desc": "Увеличить соотношение атаки на 10%",
@@ -262,6 +301,8 @@
"attack_keybinds": "Привязки клавиш атаки",
"boat_attack": "Атака лодкой",
"boat_attack_desc": "Отправить атаку лодкой на клетку под курсором.",
"ground_attack": "Наземная атака",
"ground_attack_desc": "Отправить наземную атаку на ячейку под курсором.",
"zoom_controls": "Масштабирование",
"zoom_out": "Отдалить",
"zoom_out_desc": "Отдалить карту",
@@ -279,7 +320,14 @@
"move_right": "Переместить вправо",
"move_right_desc": "Переместить камеру вправо",
"reset": "Сбросить",
"unbind": "Освободить"
"unbind": "Освободить",
"on": "Включено",
"off": "Выключено",
"toggle_terrain": "Включение/выключение рельефа",
"terrain_enabled": "Представление рельефа включено",
"terrain_disabled": "Представление рельефа выключено",
"exit_game_label": "Выйти из игры",
"exit_game_info": "Вернуться в главное меню"
},
"chat": {
"title": "Быстрый чат",
@@ -304,7 +352,7 @@
"gold": "Пожалуйста, дайте мне золото!",
"no_attack": "Пожалуйста, не атакуйте меня!",
"sorry_attack": "Извините, я не хотел атаковать.",
"alliance": "Альянс?",
"alliance": "Союз?",
"help_defend": "Помогите мне защититься от [P1]!",
"team_up": "Давайте объединимся против [P1]!"
},
@@ -364,7 +412,8 @@
"warship": "Захватывает торговые суда, уничтожает суда и лодки",
"port": "Отправляет торговые корабли для генерации золота",
"defense_post": "Укрепляет защиту ближайших границ",
"city": "Увеличивает максимальное население"
"city": "Увеличивает максимальное население",
"factory": "Прокладывает железнодорожные пути и создаёт поезда"
},
"not_enough_money": "Недостаточно средств"
},
@@ -383,6 +432,7 @@
"hide": "Скрыть",
"rank": "Место",
"player": "Игрок",
"team": "Команда",
"owned": "Территории",
"gold": "Золото",
"troops": "Войска"
@@ -402,7 +452,39 @@
"sams": "ЗРК",
"warships": "Военные корабли",
"health": "Здоровье",
"attitude": "Отношение"
"attitude": "Отношение",
"levels": "Уровни"
},
"events_display": {
"retreating": "отступает",
"boat": "Лодка",
"alliance_request_status": "{name} {status} ваш запрос",
"alliance_accepted": "принял",
"alliance_rejected": "отклонил",
"duration_second": "1 сек",
"betrayal_description": "Вы порвали союз с {name}, став ПРЕДАТЕЛЕМ (защита снижена на {malusPercent}% на {durationText})",
"duration_seconds_plural": "{seconds} сек",
"betrayed_you": "{name} разорвал союз с вами",
"about_to_expire": "Ваш союз с {name} скоро закончится!",
"alliance_expired": "Ваш союз с {name} закончился",
"attack_request": "{name} просит вас атаковать {target}",
"sent_emoji": "Отправлено {name}: {emoji}",
"renew_alliance": "Запрос на продление",
"request_alliance": "{name} просит союз!",
"focus": "Осмотреть",
"accept_alliance": "Принять",
"reject_alliance": "Отклонить",
"alliance_renewed": "Ваш союз с {name} был продлён",
"ignore": "Игнорировать"
},
"unit_info_modal": {
"structure_info": "Информация о структуре",
"unit_type_unknown": "Неизвестно",
"close": "Закрыть",
"cooldown": "Перезарядка",
"type": "Тип",
"upgrade": "Улучшить",
"level": "Уровень"
},
"relation": {
"hostile": "Враждебное",
@@ -423,7 +505,7 @@
"troops": "Войска",
"betrayals": "Количество предательств",
"traitor": "Предатель",
"alliance_time_remaining": "Альянс заканчивается через",
"alliance_time_remaining": "Союз закончится через",
"embargo": "Прекратил торговлю с вами",
"nuke": "Ракеты, запущенные ими на вас",
"start_trade": "Начать торговлю",
@@ -431,10 +513,16 @@
"yes": "Да",
"no": "Нет",
"none": "Ничего",
"alliances": "Альянсы"
"alliances": "Союзы"
},
"replay_panel": {
"replay_speed": "Скорость повтора",
"game_speed": "Скорость игры",
"fastest_game_speed": "максимум"
},
"error_modal": {
"crashed": "Игра крашнулась!",
"connection_error": "Ошибка соединения!",
"paste_discord": "Пожалуйста, вставьте следующее в отчет об ошибке в Discord:",
"copy_clipboard": "Копировать в буфер обмена",
"copied": "Скопировано!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Выберите стартовое местоположение"
},
"territory_patterns": {
"title": "Выбор узора территории",
"purchase": "Купить",
"blocked": {
"login": "Вы должны войти, чтобы получить доступ к этому узору.",
"purchase": "Купите этот узор, чтобы разблокировать его."
},
"pattern": {
"default": "По умолчанию",
"custom": "Свой",
"stripes_v": "Вертикаль",
"stripes_h": "Горизонталь",
"horizontal_stripes": "Горизонталь (альт.)",
"vertical_bars": "Вертикаль (альт.)",
"checkerboard": "Шахматная доска",
"choco": "Шоколад",
"diagonal": "Диагональ",
"cross": "Крест",
"mini_cross": "Мини-крест",
"sword": "Меч",
"sparse_dots": "Редкие точки",
"evan": "Эван",
"diagonal_stripe": "Диагональная полоса",
"mountain_ridge": "Горный хребет",
"scattered_dots": "Рассеянные точки",
"circuit_board": "Печатная плата",
"shells": "Ракушки",
"-w-": ".w.",
"white_rabbit": "Белый кролик",
"goat": "Коза",
"cats": "Кошки",
"cursor": "Указатель",
"hand": "Рука",
"radiation": "Радиация",
"openfront_qr": "QR-код OpenFront.io",
"openfront": "OpenFront",
"t_rex": "Тиранозавр",
"embelem": "Эмблема",
"grogu_head": "Голова Грогу",
"grogu": "Грогу"
}
},
"auth": {
"login_required": "Для доступа к этому сайту требуется войти в систему.",
"redirecting": "Вы будете перенаправлены...",
"not_authorized": "У вас нет прав для доступа на этот сайт.",
"contact_admin": "Если вы считаете, что видите это сообщение по ошибке, пожалуйста, свяжитесь с администратором сайта."
}
}
+583
View File
@@ -0,0 +1,583 @@
{
"lang": {
"en": "Slovenian",
"native": "Slovenščina",
"svg": "si",
"lang_code": "sl"
},
"common": {
"close": "Zapri"
},
"main": {
"title": "OpenFront (Alfa)",
"join_discord": "Pridruži se našemu Discord serverju!",
"login_discord": "Prijava z Discord računom",
"checking_login": "Preverjanje prijave...",
"logged_in": "Prijava uspešna!",
"log_out": "Odjavi se",
"create_lobby": "Ustvari sobo",
"join_lobby": "Pridruži se sobi",
"single_player": "Enoigralni način",
"instructions": "Navodila",
"how_to_play": "Kako igrati",
"advertise": "Oglaševanje",
"wiki": "Wiki"
},
"news": {
"full_changelog": "Poglej celotni seznam sprememb",
"github_link": "na GitHub",
"title": "Zadnje posodobitve"
},
"help_modal": {
"hotkeys": "Bližnjice",
"table_key": "Tipka",
"table_action": "Akcija",
"action_alt_view": "Alternativni pogled (teren/države)",
"action_attack_altclick": "Napadi (ko je levi klik nastavljen da odpre meni)",
"action_build": "Odpri meni grajenja",
"action_emote": "Odpri meni emojijev",
"action_center": "Centriraj kamero na igralca",
"action_zoom": "Pomanjšaj/povečaj",
"action_move_camera": "Premakni kamero",
"action_ratio_change": "Pomanjšaj/Povečaj napadalno razmerje",
"action_reset_gfx": "Ponastavi grafične nastavitve",
"ui_section": "Igralni uporabniški vmesnik",
"ui_leaderboard": "Lestvica",
"ui_your_team": "Tvoja ekipa:",
"ui_leaderboard_desc": "Prikaže najboljše igralce igre in njihova imena, % posesti zemlje, zlata in vojakov. Z možnostjo Prikaži vse se prikažejo vsi igralci v igri. Če ne želite videti lestvice najboljših, kliknite Skrij.",
"ui_control": "Nadzorna plošča",
"ui_control_desc": "Nadzorna plošča vsebuje naslednje elemente:",
"ui_pop": "Pop - Število enot, ki jih imate, vaša največja populacija in hitrost, s katero jih pridobivate.",
"ui_gold": "Zlato - Količina zlata, ki ga imate, in hitrost, s katero ga pridobivate.",
"ui_troops_workers": "Čete in delavci - Količina dodeljenih čet in delavcev. Čete se uporabljajo za napad ali obrambo pred napadi. Delavci se uporabljajo za ustvarjanje zlata. Število čet in delavcev lahko prilagodite z drsnikom.",
"ui_attack_ratio": "Razmerje napadov - Količina enot, ki bodo uporabljene pri napadu. Razmerje napadov lahko prilagodite z drsnikom. Če imate več napadalnih enot kot obrambnih enot, boste v napadu izgubili manj enot, če pa jih imate manj, boste povečali škodo, ki jo bodo napadalne enote utrpele. Učinek ne presega razmerja 2:1.",
"ui_events": "Panel dogodkov",
"ui_events_desc": "V zavihku Dogodki so prikazani najnovejši dogodki, zahteve in sporočila hitrega klepeta. Nekaj primerov:",
"ui_events_alliance": "Zavezništvo - Zahteve zavezništva je mogoče sprejeti ali zavrniti. Zavezniki si lahko delijo vire in enote, vendar se ne morejo napadati. S klikom na Fokus se pogled premakne na igralca, ki je poslal zahtevo.",
"ui_events_attack": "Napadi - Prikazani so dohodni in odhodni napadi. Kliknite sporočilo, da pogled usmerite na napad, jedrsko orožje ali čoln (transportno ladjo). Čete lahko umaknete s klikom na rdeči gumb X. To bo stalo življenj 25 % vaših napadajočih čet. Če vrnete napad s čolnom, se čoln vrne na začetno točko in tam napade, če je bilo od takrat zavzeto vaše kopno. Jedrskih orožij po izstrelitvi ni mogoče ustaviti.",
"ui_events_quickchat": "Hitri klepet - Tukaj si lahko ogledate poslana in prejeta sporočila v klepetu. Pošljite sporočilo igralcu tako, da v njegovem meniju z informacijami kliknete ikono Hitri klepet.",
"ui_options": "Možnosti",
"ui_options_desc": "V notranjosti lahko najdemo naslednje elemente:",
"ui_playeroverlay": "Informacije o igralcu",
"ui_playeroverlay_desc": "Ko premaknete miško nad državo, se v razdelku Možnosti prikaže podokno z informacijami o igralcu. Prikazuje vrsto igralca: človek, narod (pametni robot) ali robot. Odnos naroda do vas, od sovražnega do prijateljskega. Ter obrambne enote, zlato ter število vojnih ladij in različnih zgradb, ki jih ima igralec.",
"ui_wilderness": "Divjina",
"option_pause": "Začasna ustavitev/prenovitev igre - Na voljo samo v načinu za enega igralca.",
"option_timer": "Časovnik - Čas, ki je pretekel od začetka igre.",
"option_exit": "Tipka za izhod.",
"option_settings": "Nastavitve Odprite meni z nastavitvami. V njem lahko preklapljate med alternativnim pogledom, emojiji, temnim načinom, načinom anonimnosti (anonimni/naključni način imen) in dejanjem ob kliku z levim gumbom miške.",
"radial_title": "Radialni meni",
"radial_desc": "Z desnim klikom (ali dotikom na mobilni napravi) odprete radialni meni. Z desnim klikom zunaj njega ga zaprete. V meniju lahko:",
"radial_build": "Odprite meni Zgradb.",
"radial_info": "Odpri meni Informacije.",
"radial_boat": "Pošljite čoln (transportno ladjo) v napad na izbrano lokacijo. Na voljo le, če imate dostop do vode.",
"radial_close": "Zapri meni.",
"info_title": "Informacije",
"info_enemy_desc": "Vsebuje informacije, kot so ime izbranega igralca, zlato, vojaki, prenehanje trgovanja z vami, poslano jedrsko orožje in ali je igralec izdajalec. Ustavitev trgovanja pomeni, da od njega ne boste prejeli zlata in da vam igralec ne bo pošiljal zlata prek trgovskih ladij. Ročno (če je igralec kliknil »Ustavi trgovanje«, kar traja, dokler oba ne kliknete »Začni trgovati«) ali samodejno (če ste izdali svoje zavezništvo, kar traja, dokler ponovno ne postanete zaveznika ali po 5 minutah). Izdajalec prikaže Da 30 sekund, ko igralec izda in napade igralca, ki je bil z njim v zavezništvu. Spodnje ikone predstavljajo naslednje interakcije:",
"info_chat": "Pošlji igralcu hitro sporočilo v klepetu. Izberi kategorijo, frazo in če fraza vsebuje [P1] izberi ime igralca, s katerim jo boš zamenjal. Klikni Pošlji.",
"info_target": "Na igralca postavite ciljno oznako, ki jo označi za vse zaveznike in se uporablja za usklajevanje napadov.",
"info_alliance": "Pošlji igralcu zahtevo za zavezništvo. Zavezniki si lahko delijo vire in čete, vendar se ne morejo napadati.",
"info_emoji": "Pošljite emoji igralcu.",
"info_trade": "Uporabite »Ustavi trgovanje«, da prenehate dajati igralcu zlato in prejemati njegovo zlato prek trgovskih ladij. Če oba kliknete »Začni trgovati«, se bo trgovanje znova začelo.",
"info_ally_panel": "Zavezništva",
"info_ally_desc": "Ko se vzpostavite zavezništvo z igralcem, postanejo na voljo naslednje nove ikone:",
"ally_betray": "Izdajte svojega zaveznika, s čimer končate zavezništvo, ustavite trgovino in oslabite svojo obrambo. Trgovanje med vami se za 5 minut ustavi (ali dokler ponovno ne postanete zavezniki) in tudi drugi lahko prenehajo trgovati. Razen če je bil drugi igralec sam izdajalec, boste 30 sekund označeni kot izdajalec. V tem času bo nad vašim imenom ikona in imeli boste 50-odstotni negativni učinek na obrambo. Roboti se bodo manj verjetno povezali z vami in igralci bodo dvakrat premislili, preden to storijo.",
"ally_donate": "Donirajte nekaj svojih vojakov zavezniku. Uporablja se, ko imajo malo vojakov in so napadeni ali ko potrebujejo dodatno moč, da uničijo sovražnika.",
"ally_donate_gold": "Donirajte nekaj svojega zlata svojemu zavezniku. Uporabi se, ko mu primanjkuje zlata in ga potrebuje za gradnjo ali ko član vaše ekipe varčuje za MIRV.",
"build_menu_title": "Meni gradnje",
"build_menu_desc": "Zgradite te ali pa si oglejte, koliko jih že imate zgrajenih:",
"build_name": "Ime",
"build_icon": "Ikona",
"build_desc": "Opis",
"build_city": "Mesto",
"build_city_desc": "Poveča vašo največjo populacijo. Uporabno, ko ne morete razširiti svojega ozemlja ali ko ste tik pred dosego omejitve populacije.",
"build_factory": "Tovarna",
"build_factory_desc": "Samodejno ustvarja železnice z bližnjimi strukturami in občasno ustvarja vlake.",
"build_defense": "Trdnjava",
"build_defense_desc": "Poveča obrambo okoli bližnjih meja, ki kažejo karirast vzorec. Napadi sovražnikov so počasnejši in imajo več žrtev.",
"build_port": "Luka",
"build_port_desc": "Gradnja je mogoča le v bližini vode. Omogoča gradnjo vojnih ladij. Samodejno pošilja trgovske ladje med pristanišči vaše države in drugimi državami (razen ko je trgovina ustavljena), kar daje zlato obema stranema. Trgovina se samodejno ustavi, ko napadete vi ali vas napade igralec. Nadaljuje se po 5 minutah ali če postanete zavezniki. Trgovanje lahko ročno preklapljate z »Ustavi trgovanje« ali »Začni trgovati«.",
"build_warship": "Bojna ladja",
"build_warship_desc": "Patruljira na območju, zajame sovražne trgovske ladje in uničuje njihove čolne (transportne ladje) in vojne ladje. Zgradi se v najbližjem pristanišču in patruljira na območju, na katerega ste najprej kliknili, da ste jo zgradili. Vojne ladje lahko nadzorujete tako, da nanje kliknete z napadom (glejte akcijo Napad pod Bližnjice) in nato s klikom na napad na novo območje, kamor jih želite premakniti.",
"build_silo": "Raketni silos",
"build_silo_desc": "Omogoča izstreljevanje raket.",
"build_sam": "SAM sistem",
"build_sam_desc": "Lahko prestreže sovražne rakete v dosegu 100 slikovnih pik. S 100-odstotno možnostjo zadetka za atomsko bombo, 80-odstotno za vodikovo bombo in 50-odstotno za posamezne bojne glave MIRV. Sistem SAM ima 7,5 sekunde ohlajanja.",
"build_atom": "Atomska bomba",
"build_atom_desc": "Majhna eksplozivna bomba, ki uničuje ozemlje, zgradbe, ladje in čolne. Pojavi se iz najbližjega raketnega silosa in pristane na območju, kjer ste ga najprej kliknili, da bi ga zgradili.",
"build_hydrogen": "Vodikova bomba",
"build_hydrogen_desc": "Velika eksplozivna bomba. Pojavi se iz najbližjega raketnega silosa in pristane na območju, kjer ste jo najprej kliknili, da bi jo zgradili.",
"build_mirv": "MIRV",
"build_mirv_desc": "Najmočnejša bomba v igri. Razdeli se na manjše bombe, ki pokrivajo ogromno ozemlje. Poškoduje samo igralca, na katerega ste najprej kliknili, da bi jo zgradili. Pojavi se iz najbližjega raketnega silosa in pristane na območju, kjer ste ga najprej kliknili, da bi ga zgradili.",
"player_icons": "Ikona igralca",
"icon_desc": "Primeri nekaterih ikon v igri, na katere boste naleteli, in njihov pomen:",
"icon_crown": "Krona - Številka 1. To je najboljši igralec na lestvici.",
"icon_traitor": "Zlomljen ščit - Izdajalec. Ta igralec je napadel zaveznika.",
"icon_ally": "Rokovanje - Zaveznik. Ta igralec je tvoj zaveznik.",
"icon_embargo": "Znak stop za dolar - Embargo. Ta igralec je samodejno ali ročno prenehal trgovati z vami.",
"icon_request": "Ovojnica - Zahteva za zavezništvo. Ta igralec vam je poslal zahtevo za zavezništvo.",
"info_enemy_panel": "Informacijska plošča o sovražniku",
"exit_confirmation": "Ste prepričani, da želite zapustiti igro?"
},
"single_modal": {
"title": "En igralec",
"allow_alliances": "Dovoli zavezništvo",
"options_title": "Opcije",
"bots": "Roboti: ",
"bots_disabled": "Deaktivirano",
"disable_nations": "Deaktiviraj nacije",
"instant_build": "Instantna gradnja",
"infinite_gold": "Neomejeno zlata",
"infinite_troops": "Neomejene enote",
"disable_nukes": "Deaktiviraj bombe",
"enables_title": "Aktiviraj nastavitve",
"start": "Začni igro"
},
"map": {
"map": "Zemljevid",
"world": "Svet",
"giantworldmap": "Velika svetovna mapa",
"europe": "Evropa",
"mena": "MENA",
"northamerica": "Severna Amerika",
"oceania": "Oceanija",
"blacksea": "Črno morje",
"africa": "Afrika",
"asia": "Azija",
"mars": "Mars",
"southamerica": "Južna Amerika",
"britannia": "Britanija",
"gatewaytotheatlantic": "Vrata do Atlantika",
"australia": "Avstralija",
"random": "Naključno",
"iceland": "Islandija",
"pangaea": "Pangea",
"eastasia": "Vzhodna Azija",
"betweentwoseas": "Med dvema morjema",
"faroeislands": "Ferski otoki",
"deglaciatedantarctica": "Deglaciirana Antarktika",
"europeclassic": "Evropa (Klasika)",
"falklandislands": "Falklandski otoki",
"baikal": "Baikal",
"halkidiki": "Halkidiki",
"straitofgibraltar": "Gibraltarska ožina",
"italia": "Italija"
},
"map_categories": {
"continental": "Celinska",
"regional": "Regionalna",
"fantasy": "Druge"
},
"map_component": {
"loading": "Nalaganje..."
},
"private_lobby": {
"title": "Pridruži se privatni sobi",
"enter_id": "Vnesi ID sobe",
"player": "Igralec",
"players": "Igralci",
"join_lobby": "Pridruži se sobi",
"checking": "Preverjanje sobe...",
"not_found": "Sobe ni mogoče najti. Prosimo preverite ID in poskusite znova.",
"error": "Prišlo je do napake. Prosimo, poskusite znova.",
"joined_waiting": "Uspešna pridružitev! Čakanje na začetek igre..."
},
"public_lobby": {
"join": "Pridruži se naslednji igri",
"waiting": "čakajoči igralci",
"teams_Duos": "Dvojice (ekipe po 2)",
"teams_Trios": "Trojice (ekipe po 3)",
"teams_Quads": "Četverice (ekipe po 4)",
"teams": "{num} ekipe"
},
"username": {
"enter_username": "Vnesite uporabniško ime",
"not_string": "Uporabniško ime mora biti niz.",
"too_short": "Uporabniško ime mora biti dolgo vsaj {min} znakov.",
"too_long": "Uporabniško ime ne sme presegati {max} znakov.",
"invalid_chars": "Uporabniško ime lahko vsebuje samo črke, številke, presledke, podčrtaje in [oglate oklepaje]."
},
"host_modal": {
"title": "Zasebna soba",
"mode": "Način",
"team_count": "Število ekip",
"options_title": "Možnosti",
"bots": "Roboti: ",
"bots_disabled": "Onemogočeno",
"disable_nations": "Deaktiviraj nacije",
"instant_build": "Instantna gradnja",
"infinite_gold": "Neomejeno zlata",
"infinite_troops": "Neomejene enote",
"enables_title": "Aktiviraj nastavitve",
"player": "Igralec",
"players": "Igralci",
"waiting": "Čakanje na igralce...",
"start": "Začni igro"
},
"team_colors": {
"red": "Rdeča",
"blue": "Modra",
"teal": "Turkizna",
"purple": "Vijolična",
"yellow": "Rumena",
"orange": "Oranžna",
"green": "Zelena",
"bot": "Robot"
},
"game_starting_modal": {
"title": "Igra se začenja...",
"desc": "Priprava na začetek sobe. Prosimo, počakajte."
},
"difficulty": {
"difficulty": "Težavnost",
"Relaxed": "Sproščeno",
"Balanced": "Uravnoteženo",
"Intense": "Intenzivno",
"Impossible": "Nemogoče"
},
"game_mode": {
"ffa": "Vsi na vse",
"teams": "Ekipe"
},
"select_lang": {
"title": "Izberite jezik"
},
"unit_type": {
"city": "Mesto",
"defense_post": "Trdnjava",
"port": "Luka",
"warship": "Bojna ladja",
"missile_silo": "Raketni silos",
"sam_launcher": "SAM sistem",
"atom_bomb": "Atomska bomba",
"hydrogen_bomb": "Vodikova bomba",
"mirv": "MIRV",
"factory": "Tovarna"
},
"user_setting": {
"title": "Uporabniške nastavitve",
"tab_basic": "Osnovne nastavitve",
"tab_keybinds": "Bližnjice",
"dark_mode_label": "Temni način",
"dark_mode_desc": "Preklopi med temnim in svetlim načinom",
"dark_mode_enabled": "Temni način aktiviran",
"light_mode_enabled": "Svetli način aktiviran",
"emojis_label": "Emojiji",
"emojis_visible": "Emojiji so vidni",
"emojis_hidden": "Emojiji so skriti",
"emojis_desc": "Preklopi med načinom prikaza emojijev",
"alert_frame_label": "Opozorilni okvir",
"alert_frame_desc": "Preklopi okvir opozorila. Ko je omogočeno, se okvir prikaže, ko vas izdajo.",
"special_effects_label": "Specialni efekti",
"special_effects_desc": "Preklopi specialne efekte. Onemogoči da izboljšaš zmogljivost",
"special_effects_enabled": "Specialni efekti aktivirani",
"special_effects_disabled": "Specialni efekti onemogočeni",
"anonymous_names_label": "Skrita imena",
"anonymous_names_desc": "Skrij prava imena igralcev z naključnimi na zaslonu.",
"anonymous_names_enabled": "Omogočena anonimna imena",
"real_names_shown": "Omogočena prava imena",
"left_click_label": "Levi klik za odprtje menija",
"left_click_desc": "Ko je VKLOPLJEN, levi klik odpre meni, gumb za napad. Ko je IZKLOPLJEN, levi klik napada neposredno.",
"left_click_menu": "Levi klik meni",
"left_click_opens_menu": "Levi klik odpre meni",
"right_click_opens_menu": "Desni klik odpre meni",
"attack_ratio_label": "⚔️ Napadalno razmerje",
"attack_ratio_desc": "Kolikšen odstotek vaših vojakov poslati v napad (1100 %)",
"troop_ratio_label": "🪖🛠️ Razmerje med vojaki in delavci",
"troop_ratio_desc": "Prilagodite ravnovesje med četami (za boj) in delavci (za proizvodnjo zlata) (1100 %)",
"territory_patterns_label": "🏳️ Teritorialni vzorci",
"territory_patterns_desc": "Izberite, ali želite v igri prikazati vzorce ozemlja",
"easter_writing_speed_label": "Množitelj hitrosti pisanja",
"easter_writing_speed_desc": "Prilagodite hitrost pretvarjanja, da programirate (x1x100)",
"easter_bug_count_label": "Število hroščev",
"easter_bug_count_desc": "S koliko hrošči ste še vredu (01000, čustveno)",
"view_options": "Možnosti pogleda",
"toggle_view": "Preklopite pogled",
"toggle_view_desc": "Alternativni pogled (teren/države)",
"attack_ratio_controls": "Kontrole napadalnega razmerja",
"attack_ratio_up": "Povečaj napadalno razmerje",
"attack_ratio_up_desc": "Povečaj napadalno razmerje za 10%",
"attack_ratio_down": "Pomanjšaj napadalno razmerje",
"attack_ratio_down_desc": "Pomanjšaj napadalno razmerje za 10%",
"attack_keybinds": "Tipka za napad",
"boat_attack": "Napad s čolnom",
"boat_attack_desc": "Pošlji napadalni čoln na mesto pod kazalnikom.",
"ground_attack": "Talni napad",
"ground_attack_desc": "Pošlji talni napad na mesto pod kazalnikom.",
"zoom_controls": "Kontrola povečave",
"zoom_out": "Pomanjšaj",
"zoom_out_desc": "Pomanjšaj zemljevid",
"zoom_in": "Približaj",
"zoom_in_desc": "Približaj zemljevid",
"camera_movement": "Premikanje kamere",
"center_camera": "Centriraj kamero",
"center_camera_desc": "Centriraj kamero na igralca",
"move_up": "Premakni kamero gor",
"move_up_desc": "Premakni kamero navzgor",
"move_left": "Premakni kamero levo",
"move_left_desc": "Premakni kamero na levo",
"move_down": "Premakni kamero dol",
"move_down_desc": "Premakni kamero navzdol",
"move_right": "Premakni kamero desno",
"move_right_desc": "Premakni kamero na desno",
"reset": "Ponastavi",
"unbind": "Odveži",
"on": "Vklop",
"off": "Izklop",
"toggle_terrain": "Omogoči teren",
"terrain_enabled": "Terenski pogled vklopljen",
"terrain_disabled": "Terenski pogled izklopljen",
"exit_game_label": "Zapri Igro",
"exit_game_info": "Vrnitev na glavni meni"
},
"chat": {
"title": "Hitri klepet",
"to": "Poslano {user}: {msg}",
"from": "Pošiljatelj {user}: {msg}",
"category": "Kategorija",
"phrase": "Izraz",
"player": "Igralec",
"send": "Pošlji",
"search": "Išči igralce...",
"build": "Sestavi sporočilo...",
"cat": {
"help": "Pomoč",
"attack": "Napad",
"defend": "Obramba",
"greet": "Pozdravljeni",
"misc": "Razno",
"warnings": "Opozorila"
},
"help": {
"troops": "Prosim pošlji mi enote!",
"gold": "Prosim pošlji mi zlato!",
"no_attack": "Prosim ne napadi mi!",
"sorry_attack": "Oprosti, nisem mislil napasti.",
"alliance": "Zavezništvo?",
"help_defend": "Pomagaj mi obraniti napad [P1]!",
"team_up": "Združiva se proti [P1]!"
},
"attack": {
"attack": "Napadi [P1]!",
"mirv": "Pošlji MIRV na [P1]!",
"focus": "Fokusiraj napad na [P1]!",
"finish": "Končajva [P1]!"
},
"defend": {
"defend": "Obrani [P1]!",
"dont_attack": "Ne napadaj [P1]!",
"ally": "[P1] je moj zaveznik!"
},
"greet": {
"hello": "Zdravo!",
"good_luck": "Srečno!",
"have_fun": "Veliko zabave!",
"gg": "Dobra igra!",
"nice_to_meet": "Me veseli!",
"well_played": "Odlično igrano!",
"hi_again": "Zopet pozdravljen!",
"bye": "Adijo!",
"thanks": "Hvala!",
"oops": "Oops, napačna tipka!",
"trust_me": "Lahko mi zaupaš. Obljubim!",
"trust_broken": "Zaupal sem ti..."
},
"misc": {
"go": "Gremo!",
"strategy": "Dobra strategija!",
"fun": "Ta igra je zabavna!",
"pr": "Kdaj se bo moj PR končno združil...?"
},
"warnings": {
"strong": "[P1] je močan.",
"weak": "[P1] je slab.",
"mirv_soon": "[P1] lahko kmalu uporabi MIRV!",
"number1_warning": "Igralec št. 1 bo kmalu zmagal, če se ne združimo!",
"stalemate": "Sklenimo mir. To je pat pozicija, oba bova izgubila.",
"has_allies": "[P1] ima veliko zaveznikov.",
"no_allies": "[P1] nima zaveznikov.",
"betrayed": "[P1] je izdali svojega zaveznika!",
"getting_big": "[P1] raste prehitro!",
"danger_base": "[P1] ni zaščiten!",
"saving_for_mirv": "[P1] varčuje za izstrelitev MIRV-a.",
"mirv_ready": "[P1] ima dovolj zlata za izstrelitev MIRV-a!"
}
},
"build_menu": {
"desc": {
"atom_bomb": "Manjša eksplozija",
"hydrogen_bomb": "Velika eksplozija",
"mirv": "Ogromna eksplozija, cilja samo na izbranega igralca",
"missile_silo": "Uporablja se za izstrelitev jedrskih orožij",
"sam_launcher": "Brani se pred prihajajočimi bombam",
"warship": "Zajame trgovske ladje, uničuje ladje in čolne",
"port": "Pošilja trgovske ladje za pridobivanje zlata",
"defense_post": "Poveča obrambo bližnjih meja",
"city": "Poveča največjo populacijo",
"factory": "Ustvarja železnice in ustvarja vlake"
},
"not_enough_money": "Ni dovolj denarja"
},
"win_modal": {
"died": "Umrl si",
"your_team": "Vaša ekipa je zmagala!",
"other_team": "Ekipa {team} je zmagala!",
"you_won": "Zmagal si!",
"other_won": "{player} je zmagal/a!",
"exit": "Zapri Igro",
"keep": "Nadaljuj z igro",
"wishlist": "Dodaj na seznam želja na Steamu!"
},
"leaderboard": {
"title": "Lestvica vodilnih",
"hide": "Skrij",
"rank": "Uvrstitev",
"player": "Igralec",
"team": "Ekipa",
"owned": "V lasti",
"gold": "Zlato",
"troops": "Enote"
},
"player_info_overlay": {
"type": "Tip",
"bot": "Robot",
"nation": "Narod",
"player": "Igralec",
"team": "Ekipa",
"d_troops": "Obrambne enote",
"a_troops": "Napadalne enote",
"gold": "Zlato",
"ports": "Luka",
"cities": "Mesta",
"missile_launchers": "Raketni silosi",
"sams": "SAM",
"warships": "Bojna ladja",
"health": "Zdravje",
"attitude": "Odnos",
"levels": "Nivoji"
},
"events_display": {
"retreating": "umikanje",
"boat": "Čoln",
"alliance_request_status": "{name} {status} vašo zahtevo za zavezništvo",
"alliance_accepted": "sprejema",
"alliance_rejected": "zavrača",
"duration_second": "1 sekunda",
"betrayal_description": "Prekinil si zavezništvo z {name}, s čimer si postal IZDAJALEC ({malusPercent}% obrambni debuff za {durationText})",
"duration_seconds_plural": "{seconds} sekund",
"betrayed_you": "{name} je prekinil zavezništvo s tabo",
"about_to_expire": "Tvoje zavezništvo s {name} kmalu poteče!",
"alliance_expired": "Tvoje zavezništvo z {name} je poteklo",
"attack_request": "{name} zahteva, da napadeš {target}",
"sent_emoji": "Poslano {name}: {emoji}",
"renew_alliance": "Zahteva za podaljšanje",
"request_alliance": "{name} zahteva zavezništvo!",
"focus": "Fokus",
"accept_alliance": "Sprejmi",
"reject_alliance": "Zavrni",
"alliance_renewed": "Vaše zavezništvo z {name} je bilo obnovljeno",
"ignore": "Prezri"
},
"unit_info_modal": {
"structure_info": "Informacije o strukturi",
"unit_type_unknown": "Neznano",
"close": "Zapri",
"cooldown": "Ohladitev",
"type": "Vrsta",
"upgrade": "Nadgradi",
"level": "Nivo"
},
"relation": {
"hostile": "Sovražno",
"distrustful": "Nezaupljiv",
"neutral": "Nevtralno",
"friendly": "Prijazen",
"default": "Privzeto"
},
"control_panel": {
"pop": "Pop",
"gold": "Zlato",
"troops": "Enote",
"workers": "Delavci",
"attack_ratio": "Napadalno razmerje"
},
"player_panel": {
"gold": "Zlato",
"troops": "Enote",
"betrayals": "Število izdaj",
"traitor": "Izdajalec",
"alliance_time_remaining": "Zavezništvo poteče čez",
"embargo": "Prenehal trgovati s tabo",
"nuke": "Število raket izstreljenih na tebe z njihove strani",
"start_trade": "Začnite trgovati",
"stop_trade": "Prenehajte trgovati",
"yes": "Da",
"no": "Ne",
"none": "Noben",
"alliances": "Zavezništva"
},
"replay_panel": {
"replay_speed": "Hitrost ponovnega predvajanja",
"game_speed": "Hitrost igre",
"fastest_game_speed": "max"
},
"error_modal": {
"crashed": "Igra se je sesula!",
"connection_error": "Napaka v povezavi!",
"paste_discord": "V poročilo o napaki v Discordu prilepite naslednje:",
"copy_clipboard": "Kopiraj v odložišče",
"copied": "Kopirano!",
"failed_copy": "Kopiranje ni uspelo",
"desync_notice": "Niste sinhronizirani z drugimi igralci. Kar vidite, se lahko razlikuje od drugih igralcev."
},
"heads_up_message": {
"choose_spawn": "Izberite začetno lokacijo"
},
"territory_patterns": {
"title": "Izberite vzorec ozemlja",
"purchase": "Nakup",
"blocked": {
"login": "Za dostop do tega vzorca morate biti prijavljeni.",
"purchase": "Kupite ta vzorec, da ga odklenete."
},
"pattern": {
"default": "Privzeto",
"custom": "Po meri",
"stripes_v": "Navpično",
"stripes_h": "Vodoravno",
"horizontal_stripes": "Vodoravno (Alt)",
"vertical_bars": "Navpično (Alt)",
"checkerboard": "Šahovnica",
"choco": "Čoko",
"diagonal": "Diagonalno",
"cross": "Križ",
"mini_cross": "Majhen križ",
"sword": "Meč",
"sparse_dots": "Redke pike",
"evan": "Evan",
"diagonal_stripe": "Diagonalna črta",
"mountain_ridge": "Gorski greben",
"scattered_dots": "Razpršene pike",
"circuit_board": "Vezje",
"shells": "Školjke",
"-w-": "'w'",
"white_rabbit": "Beli zajec",
"goat": "Koza",
"cats": "Mačke",
"cursor": "Kazalnik",
"hand": "Roka",
"radiation": "Radiacija",
"openfront_qr": "OpenFront.io QR koda",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Grb",
"grogu_head": "Groguva glava",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Za dostop do te spletne strani je potrebna prijava.",
"redirecting": "Preusmerjeni ste...",
"not_authorized": "Nimate dovoljenja za dostop do tega spletnega mesta.",
"contact_admin": "Če menite, da se vam je to sporočilo prikazalo pomotoma, se obrnite na skrbnika spletnega mesta."
}
}
@@ -3,7 +3,7 @@
"en": "Swedish",
"native": "Svenska",
"svg": "se",
"lang_code": "sv"
"lang_code": "sv-SE"
},
"common": {
"close": "Stäng"
@@ -24,7 +24,9 @@
"wiki": "Wiki"
},
"news": {
"title": "Version 23 släppt!"
"full_changelog": "Se fullständig ändringslogg",
"github_link": "på GitHub",
"title": "Ändringslogg"
},
"help_modal": {
"hotkeys": "Kortkommandon",
@@ -41,6 +43,7 @@
"action_reset_gfx": "Återställ grafik",
"ui_section": "Spelgränssnitt",
"ui_leaderboard": "Topplista",
"ui_your_team": "Ditt lag:",
"ui_leaderboard_desc": "Visar toppspelarna i spelet och deras namn, % ägd mark, guld och trupper. Använd Visa Alla för att visa alla spelare i spelet. Om du inte vill se topplistan, klicka Dölj.",
"ui_control": "Kontrollpanel",
"ui_control_desc": "Kontrollpanelen innehåller följande element:",
@@ -57,6 +60,7 @@
"ui_options_desc": "Följande alternativ finns:",
"ui_playeroverlay": "Överlägg för spelar info",
"ui_playeroverlay_desc": "När du håller över ett land så kommer Spelarinformationen visas under Alternativ. Det visar typen av spelare: Människa, Nation (smart bot), eller Bot. En Nations attityd mot dig, från ondsint till vänlig. Och skyddande trupper, guld, plus mängden Krigsskepp och olika byggnader spelaren har.",
"ui_wilderness": "Vildmark",
"option_pause": "Pausa/Avpausa spelet - Enbart tillgänglig i läget Enspelarläge.",
"option_timer": "Timer - Tiden som gått sedan spelets start.",
"option_exit": "Avsluta knappen.",
@@ -86,6 +90,8 @@
"build_desc": "Beskrivning",
"build_city": "Stad",
"build_city_desc": "Ökar din max befolkningsmängd. Användbar när du inte kan expandera ditt territorium eller om du kommer nå taket för din befolkningsmängd.",
"build_factory": "Fabrik",
"build_factory_desc": "Skapar järnvägar automatiskt med närliggande byggnader, och producerar tåg sporadiskt.",
"build_defense": "Försvarspost",
"build_defense_desc": "Ökar försvaret runt närliggande gränser, vilket visas som ett rutigt mönster. Anfall från fiender är långsammare och tar mer skada.",
"build_port": "Hamn",
@@ -109,7 +115,8 @@
"icon_ally": "Handskakning - Allierad. Den här spelaren är din allierade.",
"icon_embargo": "Stoppskylt med dollartecken - Embargo. Den här spelaren har avbrutit handel med dig automatiskt eller manuellt.",
"icon_request": "Kuvert - Alliansförfrågan. Denna spelare har skickat dig en alliansförfrågan.",
"info_enemy_panel": "Fiendeinfopanel"
"info_enemy_panel": "Fiendeinfopanel",
"exit_confirmation": "Är du säker på att du vill avsluta spelet?"
},
"single_modal": {
"title": "Enspelarläge",
@@ -128,6 +135,7 @@
"map": {
"map": "Karta",
"world": "Världen",
"giantworldmap": "Massiv Världskarta",
"europe": "Europa",
"mena": "MENA",
"northamerica": "Nordamerika",
@@ -151,13 +159,17 @@
"falklandislands": "Falklandsöarna",
"baikal": "Baikal",
"halkidiki": "Halkidiki",
"giantworldmap": "Massiv världskarta"
"straitofgibraltar": "Gibraltarsundet",
"italia": "Italien"
},
"map_categories": {
"continental": "Kontinental",
"regional": "Regional",
"fantasy": "Övrigt"
},
"map_component": {
"loading": "Laddar..."
},
"private_lobby": {
"title": "Gå med i Privat Lobby",
"enter_id": "Ange Lobby-ID",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Gå med i nästa spel",
"waiting": "Spelare som väntar",
"teams_Duos": "Duos (lag av 2)",
"teams_Trios": "Trios (lag av 3)",
"teams_Quads": "Quads (lag av 4)",
"teams": "{num} lag"
},
"username": {
@@ -198,6 +213,16 @@
"waiting": "Väntar på spelare...",
"start": "Starta spelet"
},
"team_colors": {
"red": "Röd",
"blue": "Blå",
"teal": "Teal",
"purple": "Lila",
"yellow": "Gul",
"orange": "Orange",
"green": "Grön",
"bot": "Bot"
},
"game_starting_modal": {
"title": "Spelet startar...",
"desc": "Förbereder lobbyn för att starta. Vänligen vänta."
@@ -225,28 +250,42 @@
"sam_launcher": "Luftvärn",
"atom_bomb": "Liten atombomb",
"hydrogen_bomb": "Vätebomb",
"mirv": "MIRV"
"mirv": "MIRV",
"factory": "Fabrik"
},
"user_setting": {
"title": "Användarinställningar",
"tab_basic": "Grundläggande inställningar",
"tab_keybinds": "Tangentbindningar",
"dark_mode_label": "🌙 Mörkt Läge",
"dark_mode_label": "Mörkt Tema",
"dark_mode_desc": "Ändrar hemsidans utseende mellan mörkt och ljust tema.",
"emojis_label": "😊 Emojis",
"dark_mode_enabled": "Mörkt tema aktiverad",
"light_mode_enabled": "Ljust tema aktiverad",
"emojis_label": "Emojis",
"emojis_visible": "Emojis är synliga",
"emojis_hidden": "Emojis är dolda",
"emojis_desc": "Välj om emojis ska visas i spelet",
"special_effects_label": "💥 Specialeffekter",
"alert_frame_label": "Alertruta",
"alert_frame_desc": "Aktivera eller inaktivera varningsrutan. När den är aktiverad visas rutan när du blir förrådd.",
"special_effects_label": "Specialeffekter",
"special_effects_desc": "Välj om specialeffekter visas. Avaktivera för att öka prestandan",
"anonymous_names_label": "🥷 Dölj namn",
"special_effects_enabled": "Specialeffekter aktiverad",
"special_effects_disabled": "Specialeffekter avaktiverad",
"anonymous_names_label": "Dolda Namn",
"anonymous_names_desc": "Dölj riktiga spelarnamn med slumpmässiga namn på din skärm.",
"left_click_label": "🖱️ Vänsterklicka för att öppna menyn",
"anonymous_names_enabled": "Anonyma namn aktiverad",
"real_names_shown": "Riktiga namn visas",
"left_click_label": "Vänsterklicka för att Öppna Menyn",
"left_click_desc": "När det är PÅ öppnar vänsterklick en meny, och svärdknappen anfaller. När det är AV, anfaller vänster musknapp direkt.",
"left_click_menu": "Vänsterklicksmeny",
"left_click_opens_menu": "Vänsterklick öppnar menyn",
"right_click_opens_menu": "Högerklick öppnar menyn",
"attack_ratio_label": "⚔️ Anfallsskala",
"attack_ratio_desc": "Vilken procent av dina trupper som ska skickas in vid ett anfall.(1100%)",
"troop_ratio_label": "🪖🛠️ Trupp- och Arbetarskala",
"troop_ratio_desc": "Anpassa balansen mellan trupper (för strid) och arbetare (för guldproduktion) (1100%)",
"territory_patterns_label": "🏳️ Mönster för Territorium",
"territory_patterns_desc": "Välj mellan att visa territorium mönsterdesign i spelet",
"territory_patterns_desc": "Välj om mönster för territorium ska visas i spelet",
"easter_writing_speed_label": "Multiplikator för skrivhastighet",
"easter_writing_speed_desc": "Ändra hur snabbt du låtsas att koda (x1x100)",
"easter_bug_count_label": "Mängd buggar",
@@ -262,6 +301,8 @@
"attack_keybinds": "Anfallstangentbindningar",
"boat_attack": "Båtanfall",
"boat_attack_desc": "Skicka en båt att anfalla rutan under din muspekare.",
"ground_attack": "Markanfall",
"ground_attack_desc": "Skick ett markanfall till rutan under din muspekare.",
"zoom_controls": "Zoom Kontroller",
"zoom_out": "Zooma Ut",
"zoom_out_desc": "Zooma ut kartan",
@@ -279,7 +320,14 @@
"move_right": "Flytta Kameran Höger",
"move_right_desc": "Flytta kameran åt höger",
"reset": "Återställ",
"unbind": "Ta bort knappbindning"
"unbind": "Ta bort knappbindning",
"on": "På",
"off": "Av",
"toggle_terrain": "Växla Terräng",
"terrain_enabled": "Terräng vy aktiverad",
"terrain_disabled": "Terräng vy avaktiverad",
"exit_game_label": "Avsluta Spelet",
"exit_game_info": "Återgå till huvudmenyn"
},
"chat": {
"title": "Snabbchat",
@@ -363,8 +411,9 @@
"sam_launcher": "Skyddar mot inkommande kärnvapen",
"warship": "Fångar in handelsfartyg, förstör skepp och båtar",
"port": "Skickar handelsfartyg för att generera guld",
"defense_post": "Ökar försvaret av närliggande gränser",
"city": "Ökar max befolkning"
"defense_post": "Ökar försvaret mot närliggande gränser",
"city": "Ökar max befolkning",
"factory": "Skapar järnvägar och producerar tåg"
},
"not_enough_money": "Ej tillräckligt med guld"
},
@@ -383,6 +432,7 @@
"hide": "Dölj",
"rank": "Rank",
"player": "Spelare",
"team": "Lag",
"owned": "Ägd",
"gold": "Guld",
"troops": "Trupper"
@@ -402,7 +452,39 @@
"sams": "Luftvärn",
"warships": "Krigsskepp",
"health": "Hälsa",
"attitude": "Attityd"
"attitude": "Attityd",
"levels": "Nivåer"
},
"events_display": {
"retreating": "retirerar",
"boat": "Båt",
"alliance_request_status": "{name} {status} din alliansförfrågan",
"alliance_accepted": "accepterade",
"alliance_rejected": "nekade",
"duration_second": "1 sekund",
"betrayal_description": "Du bröt din allians med {name}, vilket gör dig till en FÖRRÄDARE ({malusPercent}% försvagat försvar under {durationText})",
"duration_seconds_plural": "{seconds} sekunder",
"betrayed_you": "{name} bröt sin allians med dig",
"about_to_expire": "Din allians med {name} håller på att gå ut!",
"alliance_expired": "Din allians med {name} har löpt ut",
"attack_request": "{name} begär att du angriper {target}",
"sent_emoji": "Skickat {name}: {emoji}",
"renew_alliance": "Begär att förnya",
"request_alliance": "{name} begär en allians!",
"focus": "Centrera",
"accept_alliance": "Acceptera",
"reject_alliance": "Neka",
"alliance_renewed": "Din allians med {name} har förnyats",
"ignore": "Ignorera"
},
"unit_info_modal": {
"structure_info": "Strukturinformation",
"unit_type_unknown": "Okänd",
"close": "Stäng",
"cooldown": "Fördröjning",
"type": "Typ",
"upgrade": "Uppgradera",
"level": "Nivå"
},
"relation": {
"hostile": "Fientlig",
@@ -433,8 +515,14 @@
"none": "Ingen",
"alliances": "Allianser"
},
"replay_panel": {
"replay_speed": "Återspelningshastighet",
"game_speed": "Spelhastighet",
"fastest_game_speed": "max"
},
"error_modal": {
"crashed": "Spelet kraschade!",
"connection_error": "Anslutningsfel!",
"paste_discord": "Vänligen klistra in följande i din buggrapport på Discord:",
"copy_clipboard": "Kopiera till urklipp",
"copied": "Kopierat!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "Välj en plats att börja på"
},
"territory_patterns": {
"title": "Välj Mönster för Territorium",
"purchase": "Köp",
"blocked": {
"login": "Du måste vara inloggad för att få åtkomst till det här mönstret.",
"purchase": "Köp det här mönstret för att låsa upp det."
},
"pattern": {
"default": "Standard",
"custom": "Anpassad",
"stripes_v": "Vertikal",
"stripes_h": "Horisontell",
"horizontal_stripes": "Horisontell (Alt)",
"vertical_bars": "Vertikal (Alt)",
"checkerboard": "Schackbräde",
"choco": "Choco",
"diagonal": "Diagonal",
"cross": "Kors",
"mini_cross": "Minikors",
"sword": "Svärd",
"sparse_dots": "Glesa Prickar",
"evan": "Evan",
"diagonal_stripe": "Diagonal Rand",
"mountain_ridge": "Bergsås",
"scattered_dots": "Spridda Prickar",
"circuit_board": "Kretskort",
"shells": "Snäckor",
"-w-": ".w.",
"white_rabbit": "Vit Kanin",
"goat": "Get",
"cats": "Katter",
"cursor": "Muspekare",
"hand": "Hand",
"radiation": "Radioaktivitet",
"openfront_qr": "OpenFront.io QR kod",
"openfront": "OpenFront",
"t_rex": "T-Rex",
"embelem": "Emblem",
"grogu_head": "Grogu Huvud",
"grogu": "Grogu"
}
},
"auth": {
"login_required": "Inloggning krävs för att komma åt den här webbplatsen.",
"redirecting": "Du blir omdirigerad...",
"not_authorized": "Du har inte behörighet att komma åt den här webbplatsen.",
"contact_admin": "Om du tror att du ser detta meddelande felaktigt, kontakta webbplatsens administratör."
}
}
+212 -76
View File
@@ -12,7 +12,7 @@
"title": "OpenFront (АЛЬФА)",
"join_discord": "Приєднуйтеся до Discord!",
"login_discord": "Увійти з Discord",
"checking_login": "Перевірка авторизації...",
"checking_login": "Перевірка входу...",
"logged_in": "Вхід виконано!",
"log_out": "Вийти",
"create_lobby": "Створити лобі",
@@ -24,74 +24,80 @@
"wiki": "Вікі"
},
"news": {
"title": "Версію 23 випущено!"
"full_changelog": "Перегляньте повний журнал змін",
"github_link": "на GitHub",
"title": "Список змін"
},
"help_modal": {
"hotkeys": "Гарячі клавіші",
"table_key": "Клавіш",
"table_action": "Дія",
"action_alt_view": "Альтернативний вигляд (топогорафія/країни)",
"action_attack_altclick": "Напад (коли лівий клац призначено на відкриття меню)",
"action_alt_view": "Альтернативний вигляд (рельєф/країни)",
"action_attack_altclick": "Атака (коли лівий клац призначено на відкриття меню)",
"action_build": "Відкрити меню будівництва",
"action_emote": "Відкрити меню емодзі",
"action_emote": "Відкрити меню емоджі",
"action_center": "Відцентрувати камеру на гравцеві",
"action_zoom": "Зменшити/Збільшити масштаб",
"action_move_camera": "Перемістити камеру",
"action_ratio_change": "Зменшити/Збільшити співвідношення нападу",
"action_ratio_change": "Зменшити/Збільшити коефіцієнт атаки",
"action_reset_gfx": "Скинути графіку",
"ui_section": "Ігровий інтерфейс",
"ui_leaderboard": "Таблиця лідерів",
"ui_leaderboard_desc": "Показує найкращих гравців гри та їх імена, % підконтрольних територій, кількість золота та військ. За допомогою кнопки «Показати все» ви можете переглянути всіх гравці в грі. Якщо ви не бажаєте бачити таблицю лідерів, натисніть «Приховати».",
"ui_your_team": "Ваша команда:",
"ui_leaderboard_desc": "Показує найкращих гравців гри та їхні імена, % підконтрольних територій, кількість золота та військ. За допомогою кнопки «Показати все» ви можете переглянути всіх гравців у грі. Якщо ви не бажаєте бачити таблицю лідерів, натисніть «Приховати».",
"ui_control": "Панель керування",
"ui_control_desc": "Панель керування містить наступні елементи:",
"ui_pop": "Населення — Кількість ваших підрозділів, максимальне населення та темп його приросту.",
"ui_gold": "Золото — Обсяг вашого золота та швидкість, з якою ви отримуєте його.",
"ui_troops_workers": "Війська та Робітники — Кількість розподілених військ і робітників. Війська використовуються для нападу або захисту від нападів. Робітники використовуються для генерації золота. Ви можете регулювати кількість військ і робітників використовуючи повзунок.",
"ui_attack_ratio": "Співвідношення нападу — Кількість військ, що буде використано під час нападу. Ви можете налаштувати співвідношення нападу використовуючи повзунок. Маючи більше військ нападу, аніж захисту, ви зменшите втрати під час нападу, а менше — збільшите шкоду, що буде завдано вашим військам нападу. Ефект не перевищує співвідношення 2:1.",
"ui_troops_workers": "Війська та Робітники — Кількість розподілених військ і робітників. Війська використовуються для атак або захисту від атак. Робітники використовуються для генерації золота. Ви можете регулювати кількість військ і робітників за допомогою повзунка.",
"ui_attack_ratio": "Коефіцієнт атаки — Кількість військ, що беруть участь в атаці. Ви можете налаштувати коефіцієнт атаки за допомогою повзунка. Якщо наступальних військ більше ніж оборонних, то буде зменшено втрати під час атаки, а якщо менше — буде збільшено шкоду, що буде завдано вашим наступальним військам. Ефективність не збільшується після коефіцієнту 2:1.",
"ui_events": "Панель подій",
"ui_events_desc": "На панелі подій показуються останні події, запити та повідомлення швидкого чату. Деякими прикладами є:",
"ui_events_alliance": "Альянс — Запити на укладення альянсу можна прийняти або відхилити. Союзники можуть ділитися ресурсами та військами, але не можуть нападати один на одного. Клацання на кнопку «Оглянути» переміщає камеру на гравця, який надіслав запит.",
"ui_events_attack": "Напади — Відображення вхідних та вихідних нападів. Натисніть на повідомлення, щоб центрувати камеру на напад, ракету чи човен (транспортний корабель). Ви можете відкликати війська, натиснувши на червону кнопку «X». Це коштуватиме життя 25% військ, що нападають. Якщо відкликати човен він повернеться до свого початкового розташування та здійсне напад, якщо територію було захоплено. Ракети не можна відкликати після запуску.",
"ui_events_alliance": "Союз — Запити на укладення союзів можуть бути прийняті або відхилені. Союзники можуть ділитися ресурсами та військами, але не можуть атакувати один одного. Клацання на кнопку «Оглянути» переміщає камеру на гравця, який надіслав запит.",
"ui_events_attack": "Атаки — Відображення вхідних та вихідних атак. Натисніть на повідомлення, щоб центрувати камеру на наступ, ракету або човен (транспортний корабель). Ви можете відкликати війська, натиснувши на червону кнопку «X». Це коштуватиме життя 25% ваших військ, що атакують. Якщо відкликати човен, то він повернеться до свого початкового розташування та атакуватиме, якщо територію було захоплено. Ракети неможливо відкликати після запуску.",
"ui_events_quickchat": "Швидкий чат — Тут ви можете переглядати надіслані та отримані повідомлення. Надішліть повідомлення гравцю клацанням на значок швидкого чату в його меню інформації.",
"ui_options": "Налаштування",
"ui_options_desc": "Серед них можна знайти наступні елементи:",
"ui_playeroverlay": "Панель інформації гравця",
"ui_playeroverlay_desc": "Коли ви наводите вказівник на країну, під значком налаштувань відображатиметься інформація гравця. Вона показує тип гравця: людина, нація (розумний бот) або бот. Ставлення нації до вас: від ворожого до товариського. А також кількість військ захисту, золота, військових кораблів і різних будівель, що гравець має.",
"ui_playeroverlay_desc": "Коли ви наводите вказівник на країну, під значком налаштувань відображається панель інформації гравця. Вона показує тип гравця: людина, нація (розумний бот) або бот; ставлення нації до вас від ворожого до товариського; а також кількість оборонних військ, золота, військових кораблів і різних будівель, що належать гравцеві.",
"ui_wilderness": "Пустир",
"option_pause": "Призупинити/Продовжити гру — Доступно лише в режимі гри наодинці.",
"option_timer": "Таймер — Час, що минув із початку гри.",
"option_exit": "Кнопка виходу.",
"option_settings": "Налаштування — Відкрити меню налаштувань. В ньому можна перемкнути режим альтернативного вигляду, емодзі, темний режим, ніндзя (режим прихованих/випадкових імен) та виконання дії при клацанні лівою кнопкою миші.",
"option_settings": "Налаштування — Відкрити меню налаштувань. У ньому можна увімкнути/вимкнути режим альтернативного вигляду, емоджі, темний режим, нінджя (режим прихованих/випадкових імен) та виконання дії при клацанні лівою кнопкою миші.",
"radial_title": "Кругове меню",
"radial_desc": "Правий клац (або дотик на мобільних пристроях) відкриває кругове меню. Клацніть правою кнопкою миші поза ним, щоб закрити його. У меню ви можете:",
"radial_build": "Відкрити меню будівництва.",
"radial_info": "Відкрити меню інформації.",
"radial_boat": "Надсилає човен (транспортний корабель) для нападу на вибране місце. Доступно лише якщо ви маєте доступ до води.",
"radial_boat": "Відправити човен (транспортний корабель) атакувати вибране розташування. Доступно лише якщо ви маєте доступ до води.",
"radial_close": "Закрити меню.",
"info_title": "Меню інформації",
"info_enemy_desc": "Містить таку інформацію вибраного гравця, як його ім'я, золото, війська, стан торгувілі з вами, запущені на вас ракети та мітку зрадника. Припинена торгівля означає, що ви не отримуватиме золото від гравця й він не надсилатиме вам золото торговельними кораблями. Свідомо (якщо гравець натиснув на «Припинити торгівлю», що триваме доки ви не натиснете на «Розпочати торгівлю») або автоматично (якщо ви зрадили свій альянс, що триває доки ви знову не станете союзниками або через 5 хвилин). Поле «Зрадник» відображає стан «Так» протягом 30 секунд після того, як граіець зрадив і напав на гравця, що укладав з ними альянс. Значки, перераховані нижче, зображають наступні взаємодії:",
"info_enemy_desc": "Містить таку інформацію про вибраного гравця, як його ім'я, кількість золото, війська, стан торгувілі з вами, кількість запущених на вас ракет і мітку зрадника. Припинення торгівля означає, що ви не отримуватиме золото від гравця, і він не надсилатиме вам золото торговельними кораблями. Свідомо (якщо гравець натиснув «Припинити торгівлю», що триває, поки ви обидва не натиснете «Розпочати торгівлю») або автоматично (якщо ви зрадили союз, що триває, поки ви знову не станете союзниками або через 5 хвилин). Поле «Зрадник» показує стан «Так» протягом 30 секунд після того, як гравець зрадив й атакував гравця, який перебував у союзні з ним. Значки нижче позначають такі взаємодії:",
"info_chat": "Надсилає швидке повідомлення гравцю. Виберіть категорію, фразу та, якщо фраза містить слово «[P1]», оберіть ім'я гравця, котрим бажаєте заміни його. Тицьніть «Надіслати».",
"info_target": "Розмістити мітку цілі на гравці, позначивши його для всіх союзників. Використовується для координації нападів.",
"info_alliance": "Надіслати гравцю запит на альянс. Союзники можуть ділитися ресурсами та військами, але не можуть нападати один на одного.",
"info_emoji": "Відправити емодзі гравцю.",
"info_trade": "Використайте «Припинити торгівлю», щоб припинити давати гравцеві золото та отримувати його золото використовуючи торгові кораблі. Якщо ви обидва натиснете «Розпочати торгівлю» вона розпочнеться знову.",
"info_target": "Розмістити мітку цілі на гравці, позначивши його для всіх союзників. Використовується для координації атак.",
"info_alliance": "Надіслати гравцю запит на союз. Союзники можуть ділитися ресурсами та військами, але не можуть атакувати один одного.",
"info_emoji": "Надіслати емоджі гравцю.",
"info_trade": "Використайте «Припинити торгівлю», щоб припинити давати гравцеві золото та отримувати золото від нього через торгові кораблі. Якщо ви обидва натиснете «Розпочати торгівлю», вона розпочнеться знову.",
"info_ally_panel": "Панель інформації союзника",
"info_ally_desc": "Коли ви укладете альянс із гравцем, стануть доступними наступні значки:",
"ally_betray": "Зрадьте свого союзника, розриваючи альянс, припиняючи торгівлю та послаблюючи свою оборону. Торгівля між вами зупиняється на 5 хвилин (або доки ви знову не станете союзниками), а інші також можуть припинити з вами торгівлю. Якщо інший гравець сам не був зрадником, ви отримаєте мітку зрадника на 30 секунд. Протягом цього часу над вашим ім'ям показуватиметься значок і ваш захист буде знижено на 50%. Боти з меншим шансом укладатимуть із вами альянси, а гравці подумають двічі, перш ніж мати з вами справу.",
"ally_donate": "Пожертвувати частину своїх військ союзнику. Використовується, коли в нього мало військ і на нього нападають, або коли йому необхідна додаткова сила для знищення ворога.",
"ally_betray": "Зрадьте свого союзника, розірвавши союз, припинивши торгівлю та послабивши свою оборону. Торгівля між вами призупиняється на 5 хвилин (або до відновлення союзу), і інші також можуть припинити торгівлю з вами. Якщо інший гравець сам не був зрадником, ви отримаєте мітку зрадника на 30 секунд. У цей час над вашим ім'ям з'явиться особливий значок, а ваша оборона знизиться на 50%. Боти рідше укладатимуть із вами союзи, а гравці двічі подумають, перш ніж мати з вами справу.",
"ally_donate": "Пожертвувати частину своїх військ союзнику. Використовується, коли в нього мало військ і його атакують, або коли йому необхідна додаткова сила для знищення ворога.",
"ally_donate_gold": "Пожертвувати частину свого золота союзнику. Використовуйте, коли в нього мало золота, яке він потребує для будівель, або коли член команди заощаджує на РГЧ ІН.",
"build_menu_title": "Меню будівництва",
"build_menu_desc": "Будуйте споруди чи переглядайте їх збудовану кількість:",
"build_menu_desc": "Будуйте споруди чи переглядайте їхню збудовану кількість:",
"build_name": "Назва",
"build_icon": "Значок",
"build_desc": "Опис",
"build_city": "Місто",
"build_city_desc": "Збільшує вашу максимальну кількість населення. Може бути корисним, коли ви не можете розширити свою територію, або незабаром досягнете ліміту населення.",
"build_city_desc": "Збільшує вашу максимальну кількість населення. Корисно, коли ви не можете розширити територію, або населення наближається до ліміту.",
"build_factory": "Фабрика",
"build_factory_desc": "Автоматично прокладає залізничні колії до сусідніх споруд і час від часу створює поїзди.",
"build_defense": "Пункт оборони",
"build_defense_desc": "Підсилює захист навколо найближчих кордонів, що показано візерунком у клітинку. Напади ворогів уповільнені та несуть більше жертв.",
"build_defense_desc": "Підсилює оборону навколо найближчих кордонів, що показано візерунком у клітинку. Атаки ворогів уповільнені та несуть більше жертв.",
"build_port": "Порт",
"build_port_desc": "Можуть бути збудовані лише біля води. Дозволяє будувати військові кораблі. Автоматично відправляє торгові кораблі між портами вашої та інших країнами (крім випадків, коли торгівлю припинено), даючи золото обом сторонам. Торгівля автоматично припиняється коли ви нападаєте на гравця або він нападає на вас. Вона відновлюється через 5 хвилин або якщо ви укладаєте альянс. Ви можете вручну керувати торгівлею кнопками «Припинити торгівлю» та «Розпочати торгівлю».",
"build_port_desc": "Можуть бути збудовані лише біля води. Дозволяє будувати військові кораблі. Автоматично відправляє торгові кораблі між портами вашої та інших країн (крім випадків, коли торгівлю припинено), даючи золото обом сторонам. Торгівля автоматично припиняється коли ви атакуєте гравця або він атакує вас. Вона відновлюється через 5 хвилин або якщо ви укладаєте альянс. Ви можете вручну керувати торгівлею кнопками «Припинити торгівлю» та «Розпочати торгівлю».",
"build_warship": "Військовий корабель",
"build_warship_desc": "Розвідує територію, захоплюючи ворожі торгові кораблі й знищуючи їх човни (транспортні кораблі) та військові кораблі. З'являється з найближчого порту та розвідує ділянку, вибрану клацанням при створенні. Військовими кораблями можна керувати кнопкою нападу (див. дія «Напад» в розділі «Гарячі клавіші»): спочатку клацніть на корабель, а потім — на ділянку, до якої бажаєте його перемістити.",
"build_warship_desc": "Розвідує територію, захоплюючи ворожі торгові кораблі й знищуючи їхні човни (транспортні кораблі) та військові кораблі. З'являється з найближчого порту та розвідує ділянку, вибрану клацанням при створенні. Військовими кораблями можна керувати кнопкою атаки (див. дія «Атака» в розділі «Гарячі клавіші»): спочатку клацніть на корабель, а потім — на ділянку, до якої бажаєте його перемістити.",
"build_silo": "Ракетна шахта",
"build_silo_desc": "Дає можливість запускати ракети.",
"build_sam": "Пускова установка ЗРК",
@@ -103,31 +109,33 @@
"build_mirv": "РГЧ ІН",
"build_mirv_desc": "Найпотужніша бомба в грі. Розділяється на менші бомби, які покривають величезну територію. Завдає шкоду лише вибраному гравцю. Запускається з найближчої ракетної шахти та вражає область, вибрану клацанням кнопкою миші.",
"player_icons": "Значки гравця",
"icon_desc": "Приклади деяких ікон, з якими ви зіткнетесь, і їх значення:",
"icon_crown": "Корона — Номер 1. Це — найкращий гравець у таблиці лідерів.",
"icon_traitor": "Зламаний щит — Зрадник. Цей гравець напав на союзника.",
"icon_desc": "Приклади деяких значків, з якими ви зіткнетесь, і їхнє значення:",
"icon_crown": "Корона — Перше місце. Найкращий гравець у таблиці лідерів.",
"icon_traitor": "Зламаний щит — Зрадник. Цей гравець атакував союзника.",
"icon_ally": "Рукостискання — Союзник. Цей гравець є вашим союзником.",
"icon_embargo": "Закреслений знак долара — Ембарго. Цей гравець припинив торгівлю з вами; автоматично чи свідомо.",
"icon_request": "Конверт — Запит альянсу. Гравець надіслав вам запит на укладення альянсу.",
"info_enemy_panel": "Панель інформації ворога"
"icon_request": "Конверт — Запрошення до союзу. Гравець надіслав вам запит на укладення союзу.",
"info_enemy_panel": "Панель інформації ворога",
"exit_confirmation": "Ви впевнені, що хочете вийти з гри?"
},
"single_modal": {
"title": "Гра наодинці",
"allow_alliances": "Дозволити альянси",
"allow_alliances": "Дозволити союзи",
"options_title": "Налаштування",
"bots": "Боти: ",
"bots_disabled": "Відключено",
"disable_nations": "Відключити нації",
"disable_nations": "Вимкнути нації",
"instant_build": "Миттєве будівництво",
"infinite_gold": "Нескінченне золото",
"infinite_troops": "Нескінченні війська",
"disable_nukes": "Відключити бомби",
"infinite_gold": "Необмежене золото",
"infinite_troops": "Необмежені війська",
"disable_nukes": "Вимкнути бомби",
"enables_title": "Дозволи",
"start": "Розпочати гру"
},
"map": {
"map": "Мапа",
"world": "Світ",
"giantworldmap": "Велетенська мапа світу",
"europe": "Європа",
"mena": "MENA",
"northamerica": "Північна Америка",
@@ -151,13 +159,17 @@
"falklandislands": "Фолклендські острови",
"baikal": "Байкал",
"halkidiki": "Халкідіки",
"giantworldmap": "Велетенська мапа світу"
"straitofgibraltar": "Гібралтарська протока",
"italia": "Італія"
},
"map_categories": {
"continental": "Континентальні",
"regional": "Регіональні",
"fantasy": "Інші"
},
"map_component": {
"loading": "Завантаження..."
},
"private_lobby": {
"title": "Приєднатися до приватного лобі",
"enter_id": "Введіть ID лобі",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "Приєднатися до наступної гри",
"waiting": "гравці(в) в очікуванні",
"teams_Duos": "Дуо (команди по 2)",
"teams_Trios": "Тріо (команди по 3)",
"teams_Quads": "Квади (команди по 4)",
"teams": "Команд: {num}"
},
"username": {
@@ -188,16 +203,26 @@
"options_title": "Налаштування",
"bots": "Боти: ",
"bots_disabled": "Відключено",
"disable_nations": "Відключити нації",
"disable_nations": "Вимкнути нації",
"instant_build": "Миттєве будівництво",
"infinite_gold": "Нескінченне золото",
"infinite_troops": "Нескінченні війська",
"infinite_gold": "Необмежене золото",
"infinite_troops": "Необмежені війська",
"enables_title": "Дозволи",
"player": "Гравець",
"players": "Гравці(в)",
"waiting": "Очікування гравців...",
"start": "Розпочати гру"
},
"team_colors": {
"red": "Червоний",
"blue": "Синій",
"teal": "Бірюзовий",
"purple": "Фіолетовий",
"yellow": "Жовтий",
"orange": "Помаранчевий",
"green": "Зелений",
"bot": "Бот"
},
"game_starting_modal": {
"title": "Гра починається...",
"desc": "Підготовка до запуску лобі. Будь ласка, зачекайте."
@@ -225,24 +250,38 @@
"sam_launcher": "Пускова установка ЗРК",
"atom_bomb": "Атомна бомба",
"hydrogen_bomb": "Воднева бомба",
"mirv": "РГЧ ІН"
"mirv": "РГЧ ІН",
"factory": "Фабрика"
},
"user_setting": {
"title": "Користувацькі налаштування",
"tab_basic": "Основні налаштування",
"tab_keybinds": "Призначення клавіш",
"dark_mode_label": "🌙 Темний режим",
"dark_mode_label": "Темний режим",
"dark_mode_desc": "Перемикання зовнішнього вигляду сайту між світлою та темною темою",
"emojis_label": "😊 Емодзі",
"emojis_desc": "Перемикання видимості емодзі під час гри",
"special_effects_label": "💥 Спеціальні ефекти",
"special_effects_desc": "Перемкнути спеціальні ефекти. Вимкніть для поліпшення продуктивності",
"anonymous_names_label": "🥷 Приховані імена",
"dark_mode_enabled": "Увімкнено темний режим",
"light_mode_enabled": "Увімкнено світлий режим",
"emojis_label": "Емодзі",
"emojis_visible": "Емоджі показані",
"emojis_hidden": "Емоджі приховані",
"emojis_desc": "Увімкнення/вимкнення видимості емоджі під час гри",
"alert_frame_label": "Рамка тривоги",
"alert_frame_desc": "Увімкнути/вимкнути рамку тривоги. Якщо ввімкнено, вона показуватиметься, коли вас зраджують.",
"special_effects_label": "Спецефекти",
"special_effects_desc": "Увімкнути/вимкнути спецефекти. Вимкніть для поліпшення продуктивності",
"special_effects_enabled": "Спецефекти увімкнено",
"special_effects_disabled": "Спецефекти вимкнено",
"anonymous_names_label": "Приховані імена",
"anonymous_names_desc": "Приховати справжні імена гравців і замінити їх випадковими.",
"left_click_label": "🖱️ Відкриття меню лівою кнопкою миші",
"left_click_desc": "УВІМКНЕНО: лівий клац відкриває меню, напад здійснюється кнопкою з мечем. ВИМКНЕНО: лівий клац здійснює напад безпосередньо.",
"attack_ratio_label": "⚔️ Співвідношення нападу",
"attack_ratio_desc": "Який відсоток ваших військ відправляти в напад (1–100%)",
"anonymous_names_enabled": "Увімкнено анонімні імена",
"real_names_shown": "Показані справжні імена",
"left_click_label": "Відкриття меню лівою кнопкою миші",
"left_click_desc": "УВІМКНЕНО — лівий клац відкриває меню, кнопкою з мечем здійснює атаку. ВИМКНЕНО — лівий клац одразу атакує.",
"left_click_menu": "Меню при лівому клацанні",
"left_click_opens_menu": "Меню відкривається лівою кнопкою миші",
"right_click_opens_menu": "Меню відкривається правою кнопкою миші",
"attack_ratio_label": "⚔️ Коефіцієнт атаки",
"attack_ratio_desc": "Відсоток ваших військ, що беруть учать в атаці (1–100%)",
"troop_ratio_label": "🪖🛠️ Співвідношення військ і працівників",
"troop_ratio_desc": "Налаштуйте співвідношення між військами (для бою) та працівниками (для видобування золота) (1–100%)",
"territory_patterns_label": "🏳️ Візерунки територій",
@@ -253,15 +292,17 @@
"easter_bug_count_desc": "Кількість багів, що ви вважаєте прийнятною (0–1000, емоційно)",
"view_options": "Налаштування вигляду",
"toggle_view": "Змінити вигляд",
"toggle_view_desc": "Альтернативний вигляд (топогорафія/країни)",
"attack_ratio_controls": "Керування співвідношенням нападу",
"toggle_view_desc": "Альтернативний вигляд (рельєф/країни)",
"attack_ratio_controls": "Керування коефіцієнтом атаки",
"attack_ratio_up": "Збільшити співвідношення атаки",
"attack_ratio_up_desc": "Збільшити співвідношення атаки на 10%",
"attack_ratio_down": "Зменшити співвідношення атаки",
"attack_ratio_down_desc": "Зменшити співвідношення атаки на 10%",
"attack_keybinds": "Призначення клавіш нападу",
"boat_attack": "Напад човном",
"boat_attack_desc": "Відправити човен на плитку під вказівником.",
"attack_keybinds": "Призначення клавіш для атаки",
"boat_attack": "Атака човном",
"boat_attack_desc": "Відправити човен на клітинку під вказівником.",
"ground_attack": "Наземна атака",
"ground_attack_desc": "Відправити наземну атаку на клітинку під вказівником.",
"zoom_controls": "Масштабування",
"zoom_out": "Зменшити масштаб",
"zoom_out_desc": "Зменшити масштаб мапи",
@@ -279,7 +320,14 @@
"move_right": "Рухати праворуч",
"move_right_desc": "Перемістити камеру праворуч",
"reset": "Скинути",
"unbind": "Звільнити"
"unbind": "Звільнити",
"on": "Увімкнено",
"off": "Вимкнено",
"toggle_terrain": "Увімкнення/вимкнення рельєфу",
"terrain_enabled": "Огляд рельєфу увімкнено",
"terrain_disabled": "Огляд рельєфу вимкнено",
"exit_game_label": "Вийти з гри",
"exit_game_info": "Повернутися до головного меню"
},
"chat": {
"title": "Швидкий чат",
@@ -293,7 +341,7 @@
"build": "Створіть своє повідомлення...",
"cat": {
"help": "Допомога",
"attack": "Напад",
"attack": "Атака",
"defend": "Захист",
"greet": "Привітання",
"misc": "Інше",
@@ -302,21 +350,21 @@
"help": {
"troops": "Будь ласка, дайте мені війська!",
"gold": "Будь ласка, дайте мені золото!",
"no_attack": "Будь ласка, не нападайте на мене!",
"sorry_attack": "Даруйте, я не хотів нападати.",
"alliance": "Альянс?",
"no_attack": "Прошу, не атакуйте мене!",
"sorry_attack": "Даруйте, я не хотів атакувати.",
"alliance": "Союз?",
"help_defend": "Допоможіть мені захиститися від [P1]!",
"team_up": "Об'єднаймося проти [P1]!"
},
"attack": {
"attack": "Нападайте на [P1]!",
"attack": "Атакуйте [P1]!",
"mirv": "Запустіть РГЧ ІН на [P1]!",
"focus": "Сконцентруйте вогонь на [P1]!",
"focus": "Зосередьте вогонь на [P1]!",
"finish": "Покінчимо з [P1]!"
},
"defend": {
"defend": "Захищайте [P1]!",
"dont_attack": "Не нападайте на [P1]!",
"dont_attack": "Не атакуйте [P1]!",
"ally": "[P1] — мій союзник!"
},
"greet": {
@@ -343,7 +391,7 @@
"strong": "[P1] сильний.",
"weak": "[P1] слабкий.",
"mirv_soon": "[P1] скоро може запустити РГЧ ІН!",
"number1_warning": "Гравець №1 скоро переможе якщо ми не об'єднаємося!",
"number1_warning": "Гравець №1 скоро переможе, якщо ми не об'єднаємося!",
"stalemate": "Укладімо мир. Це нічия; ми обидва програємо.",
"has_allies": "[P1] має багато союзників.",
"no_allies": "[P1] не має союзників.",
@@ -363,8 +411,9 @@
"sam_launcher": "Захищає від ядерних ударів",
"warship": "Захоплює торгові кораблі, знищує кораблі та човни",
"port": "Відправляє торгові кораблі для генерації золота",
"defense_post": "Підсилює захист найближчих кордонів",
"city": "Збільшує максимальне населення"
"defense_post": "Підсилює оборону найближчих кордонів",
"city": "Збільшує максимальне населення",
"factory": "Прокладає залізничні колії та створює поїзди"
},
"not_enough_money": "Недостатньо коштів"
},
@@ -383,6 +432,7 @@
"hide": "Приховати",
"rank": "Місце",
"player": "Гравець",
"team": "Команда",
"owned": "Території",
"gold": "Золото",
"troops": "Війська"
@@ -393,8 +443,8 @@
"nation": "Нація",
"player": "Гравець",
"team": "Команда",
"d_troops": "Війська захисту",
"a_troops": "Війська нападу",
"d_troops": "Оборонні війська",
"a_troops": "Наступальні війська",
"gold": "Золото",
"ports": "Порти",
"cities": "Міста",
@@ -402,7 +452,39 @@
"sams": "ЗРК",
"warships": "Військові кораблі",
"health": "Здоров'я",
"attitude": "Ставлення"
"attitude": "Ставлення",
"levels": "Рівні"
},
"events_display": {
"retreating": "відступає",
"boat": "Човен",
"alliance_request_status": "{name} {status} ваш запит альянсу",
"alliance_accepted": "прийняв",
"alliance_rejected": "відхилив",
"duration_second": "1 сек",
"betrayal_description": "Ви розірвали союз із {name}, ставши ЗРАДНИКОМ (оборону знижено на {malusPercent}% протягом {durationText})",
"duration_seconds_plural": "{seconds} сек",
"betrayed_you": "{name} розірвав союз із вами",
"about_to_expire": "Ваш союз із {name} скоро закінчиться!",
"alliance_expired": "Ваш союз із {name} закінчився",
"attack_request": "{name} просить вас атакувати {target}",
"sent_emoji": "Надіслано {name}: {emoji}",
"renew_alliance": "Запит на поновлення",
"request_alliance": "{name} запрошує до союзу!",
"focus": "Оглянути",
"accept_alliance": "Прийняти",
"reject_alliance": "Відхилити",
"alliance_renewed": "Ваш союз із {name} було поновлено",
"ignore": "Ігнорувати"
},
"unit_info_modal": {
"structure_info": "Інформація про структуру",
"unit_type_unknown": "Невідомо",
"close": "Закрити",
"cooldown": "Час відновлення",
"type": "Тип",
"upgrade": "Покращити",
"level": "Рівень"
},
"relation": {
"hostile": "Вороже",
@@ -416,25 +498,31 @@
"gold": "Золото",
"troops": "Війська",
"workers": "Робітники",
"attack_ratio": "Співвідношення нападу"
"attack_ratio": "Коефіцієнт атаки"
},
"player_panel": {
"gold": "Золото",
"troops": "Війська",
"betrayals": "Кількість зрад",
"traitor": "Зрадник",
"alliance_time_remaining": "Альянс закінчиться через",
"embargo": "Припинив торгівлю з вами",
"alliance_time_remaining": "Кінець союзу через",
"embargo": "Припинено торгівлю з вами",
"nuke": "Ракети, запущені на вас",
"start_trade": "Розпочати торгівлю",
"stop_trade": "Припинити торгівлю",
"yes": "Так",
"no": "Ні",
"none": "Нічого",
"alliances": "Альянси"
"none": "Немає",
"alliances": "Союзи"
},
"replay_panel": {
"replay_speed": "Швидкість відтворення",
"game_speed": "Швидкість гри",
"fastest_game_speed": "максимум"
},
"error_modal": {
"crashed": "Гра крашнулася!",
"connection_error": "Помилка з'єднання!",
"paste_discord": "Будь ласка, вставте наступне у ваш звіт про помилку в Discord:",
"copy_clipboard": "Скопіювати в буфер обміну",
"copied": "Скопійовано!",
@@ -442,6 +530,54 @@
"desync_notice": "Ви десинхронізовані з іншими гравцями. Те, що ви бачите, може відрізнятися від того, що бачать інші гравці."
},
"heads_up_message": {
"choose_spawn": "Оберіть стартове розташування"
"choose_spawn": "Виберіть початкове розташування"
},
"territory_patterns": {
"title": "Виберіть візерунок території",
"purchase": "Придбати",
"blocked": {
"login": "Ви повинні ввійти, щоб отримати доступ до цього візерунку.",
"purchase": "Придбайте цей візерунок, щоб розблокувати його."
},
"pattern": {
"default": "Типово",
"custom": "Власний",
"stripes_v": "Вертикаль",
"stripes_h": "Горизонталь",
"horizontal_stripes": "Горизонталь (альт.)",
"vertical_bars": "Вертикаль (альт.)",
"checkerboard": "Шахівниця",
"choco": "Шоколад",
"diagonal": "Діагональ",
"cross": "Хрест",
"mini_cross": "Мініхрест",
"sword": "Меч",
"sparse_dots": "Нечасті крапки",
"evan": "Еван",
"diagonal_stripe": "Діагональна смуга",
"mountain_ridge": "Гірський хребет",
"scattered_dots": "Розсіяні крапки",
"circuit_board": "Друкована плата",
"shells": "Мушлі",
"-w-": ".w.",
"white_rabbit": "Білий кролик",
"goat": "Коза",
"cats": "Коти",
"cursor": "Вказівник",
"hand": "Рука",
"radiation": "Радіація",
"openfront_qr": "QR-код OpenFront.io",
"openfront": "OpenFront",
"t_rex": "Тиранозавр",
"embelem": "Емблема",
"grogu_head": "Голова Ґроґу",
"grogu": "Ґроґу"
}
},
"auth": {
"login_required": "Для доступу до цього сайту потрібно ввійти в систему.",
"redirecting": "Вас буде переспрямовано...",
"not_authorized": "Ви не маєте права на доступ до цього вебсайту.",
"contact_admin": "Якщо ви вважаєте, що бачите це повідомлення помилково, зверніться до адміністратора сайту."
}
}
@@ -3,7 +3,7 @@
"en": "Chinese Simplified",
"native": "简体中文",
"svg": "cn",
"lang_code": "zh"
"lang_code": "zh-CN"
},
"common": {
"close": "关闭"
@@ -24,7 +24,9 @@
"wiki": "游戏百科"
},
"news": {
"title": "版本 23 已发布!"
"full_changelog": "查看完整的更新日志",
"github_link": "在 Github 上",
"title": "发行说明"
},
"help_modal": {
"hotkeys": "快捷键",
@@ -41,6 +43,7 @@
"action_reset_gfx": "重置图形",
"ui_section": "游戏 UI",
"ui_leaderboard": "排行榜",
"ui_your_team": "你的队伍:",
"ui_leaderboard_desc": "显示游戏中的顶尖玩家及其姓名、所占领土百分比、黄金和军队数量。点击“显示全部”可以查看所有玩家的信息。如果你不想看到排行榜,点击“隐藏”即可。",
"ui_control": "控制面板",
"ui_control_desc": "控制面板包括下列元素:",
@@ -57,6 +60,7 @@
"ui_options_desc": "内含以下内容:",
"ui_playeroverlay": "玩家信息叠层",
"ui_playeroverlay_desc": "当鼠标悬停在一个国家上时,玩家信息叠层将显示在“选项”下方。它将显示该玩家的类型,包括真人玩家、国家(智能AI)或机器人;还会显示该国对你的态度 (从敌对到友好);该国防守军队数量,黄金,军舰及各种建筑物的数量。",
"ui_wilderness": "荒野",
"option_pause": "暂停/继续游戏 - 仅在单人模式下有效。",
"option_timer": "计时器 - 自游戏开始以来经过的时长。",
"option_exit": "退出按钮。",
@@ -86,6 +90,8 @@
"build_desc": "描述",
"build_city": "城市",
"build_city_desc": "增加你的最大人口。当你无法拓展领土,或者即将达到人口上限时很有用。",
"build_factory": "工厂",
"build_factory_desc": "自动根据附近的建筑物铺设铁路,并不定期生成火车。",
"build_defense": "防守据点",
"build_defense_desc": "增加附近边境的防御力,并以棋盘图案标记。敌人在此处的进攻将更慢,伤亡也更高。",
"build_port": "港口",
@@ -100,7 +106,7 @@
"build_atom_desc": "小型爆弹可摧毁领土、建筑、船只。从最近的导弹发射井发射并坠落在你初次点击部署它的区域。",
"build_hydrogen": "氢弹",
"build_hydrogen_desc": "大型爆弹。从最近的导弹发射井发射并坠落在你初次点击部署它的区域。",
"build_mirv": "MIRV (分导式多弹头)",
"build_mirv": "MIRV",
"build_mirv_desc": "游戏中最强大的导弹。会分裂成多个小型导弹,覆盖大范围区域。只会对你最初点击发射时所选的玩家造成伤害。从最近的导弹发射井发射,并落在你最初点击发射的位置。",
"player_icons": "玩家图标",
"icon_desc": "您将遇到的一些游戏内图标及其含义的示例:",
@@ -109,7 +115,8 @@
"icon_ally": "握手 - 盟友。该玩家是你的盟友。",
"icon_embargo": "美元符号停止标志 - 禁商。该玩家已自动或手动停止与您的交易。",
"icon_request": "信封 - 结盟请求。该玩家已向你发送结盟请求。",
"info_enemy_panel": "敌人信息面板"
"info_enemy_panel": "敌人信息面板",
"exit_confirmation": "确定要退出游戏吗?"
},
"single_modal": {
"title": "单人玩家",
@@ -128,6 +135,7 @@
"map": {
"map": "地图",
"world": "世界",
"giantworldmap": "巨型世界地图",
"europe": "欧洲",
"mena": "中东/北非",
"northamerica": "北美洲",
@@ -151,13 +159,17 @@
"falklandislands": "福克兰群岛",
"baikal": "贝加尔湖",
"halkidiki": "哈尔基迪基",
"giantworldmap": "巨型世界地图"
"straitofgibraltar": "直布罗陀海峡",
"italia": "意大利"
},
"map_categories": {
"continental": "大陆",
"regional": "地区",
"fantasy": "其他"
},
"map_component": {
"loading": "正在加载..."
},
"private_lobby": {
"title": "加入私人房间",
"enter_id": "输入房间 ID",
@@ -172,6 +184,9 @@
"public_lobby": {
"join": "加入下一场游戏",
"waiting": "等待中的玩家",
"teams_Duos": "2人小队",
"teams_Trios": "3人小队",
"teams_Quads": "4人小队",
"teams": "{num} 个队伍"
},
"username": {
@@ -179,7 +194,7 @@
"not_string": "用户名必须是字符串。",
"too_short": "用户名最少包含 {min} 个字符。",
"too_long": "用户名不得超过 {max} 个字符。",
"invalid_chars": "用户名只能包含字母、 数字、 空格、 下划线和 [方括号]。"
"invalid_chars": "用户名只能包含字母、数字、空格、下划线和 [方括号]。"
},
"host_modal": {
"title": "私人房间",
@@ -198,6 +213,16 @@
"waiting": "正在等待玩家...",
"start": "开始游戏"
},
"team_colors": {
"red": "红色",
"blue": "蓝色",
"teal": "青色",
"purple": "紫色",
"yellow": "黄色",
"orange": "橙色",
"green": "绿色",
"bot": "机器人"
},
"game_starting_modal": {
"title": "游戏正在启动...",
"desc": "正在等待游戏开始,请稍候。"
@@ -225,28 +250,42 @@
"sam_launcher": "防空塔",
"atom_bomb": "原子弹",
"hydrogen_bomb": "氢弹",
"mirv": "MIRV (分导式多弹头)"
"mirv": "MIRV",
"factory": "工厂"
},
"user_setting": {
"title": "用户设置",
"tab_basic": "基本设置",
"tab_keybinds": "热键绑定",
"dark_mode_label": "🌙 深色模式",
"dark_mode_label": "深色模式",
"dark_mode_desc": "在浅色和深色主题之间切换网站外观",
"emojis_label": "😊 表情符号",
"dark_mode_enabled": "深色模式已启用",
"light_mode_enabled": "亮色模式已启用",
"emojis_label": "表情符号",
"emojis_visible": "已启用表情符号",
"emojis_hidden": "已屏蔽表情符号",
"emojis_desc": "切换是否在游戏中显示表情符号",
"special_effects_label": "💥 特效",
"alert_frame_label": "警告框",
"alert_frame_desc": "切换警告框显示。若启用,当您被背叛时会弹出警告框。",
"special_effects_label": "特效",
"special_effects_desc": "切换特效开关。停用以改进性能",
"anonymous_names_label": "🥷 隐藏名称",
"special_effects_enabled": "已启用动画特效",
"special_effects_disabled": "已禁用动画特效",
"anonymous_names_label": "隐藏的名称",
"anonymous_names_desc": "将真实玩家名字替换为随机名字。",
"left_click_label": "🖱️ 左键单击打开菜单",
"anonymous_names_enabled": "主播模式启用(将玩家匿名)",
"real_names_shown": "已显示真实玩家名",
"left_click_label": "左键单击打开菜单",
"left_click_desc": "开启时,先左键单击打开菜单,然后再点进攻。关闭时,左键将直接进攻。",
"left_click_menu": "左键点击菜单",
"left_click_opens_menu": "左键单击打开菜单",
"right_click_opens_menu": "右键单击打开菜单",
"attack_ratio_label": "⚔️ 攻击比例",
"attack_ratio_desc": "你要派出多少比例的军队进攻 (1100%)",
"troop_ratio_label": "🛠️ 军队和工人比例",
"troop_ratio_desc": "调整军队 (用于战斗) 和工人 (用于生产黄金) 之间的比例 (1-100%)",
"territory_patterns_label": "🏳️ 领土样式",
"territory_patterns_desc": "选择在游戏中如何显示领土样式",
"territory_patterns_desc": "选择是否在游戏中显示领土样式设计",
"easter_writing_speed_label": "写入速度乘数",
"easter_writing_speed_desc": "调节你“假装写代码”的速度 (x1x100)",
"easter_bug_count_label": "Bug 计数",
@@ -262,6 +301,8 @@
"attack_keybinds": "攻击快捷键",
"boat_attack": "船只攻击",
"boat_attack_desc": "向鼠标所指地块发送船只攻击。",
"ground_attack": "对地攻击",
"ground_attack_desc": "向鼠标所指地块发送船只攻击。",
"zoom_controls": "缩放控制",
"zoom_out": "缩小",
"zoom_out_desc": "缩小地图",
@@ -279,7 +320,14 @@
"move_right": "镜头右移",
"move_right_desc": "向右移动镜头",
"reset": "重置",
"unbind": "解绑"
"unbind": "解绑",
"on": "开",
"off": "关",
"toggle_terrain": "切换地形视图",
"terrain_enabled": "已启用地形视图",
"terrain_disabled": "已禁用地形视图",
"exit_game_label": "退出游戏",
"exit_game_info": "返回主菜单"
},
"chat": {
"title": "快捷聊天",
@@ -360,11 +408,12 @@
"hydrogen_bomb": "大型爆炸",
"mirv": "巨型爆炸,仅针对选中的玩家",
"missile_silo": "用于发射核弹",
"sam_launcher": "防御飞来的核弹",
"warship": "获商船、摧毁船只",
"sam_launcher": "抵御导弹攻击",
"warship": "获商船、摧毁船只和军舰",
"port": "发送商船来获得黄金",
"defense_post": "增加附近边界的防御力",
"city": "增加最大人口"
"city": "增加最大人口",
"factory": "创建铁轨并生成火车"
},
"not_enough_money": "金钱不足"
},
@@ -383,7 +432,8 @@
"hide": "隐藏",
"rank": "排名",
"player": "玩家",
"owned": "已拥有",
"team": "队伍",
"owned": "已占领",
"gold": "黄金",
"troops": "军队"
},
@@ -402,7 +452,39 @@
"sams": "防空塔",
"warships": "军舰",
"health": "生命值",
"attitude": "态度"
"attitude": "态度",
"levels": "等级"
},
"events_display": {
"retreating": "正在撤退",
"boat": "船",
"alliance_request_status": "{name} {status}你的联盟请求",
"alliance_accepted": "已接受",
"alliance_rejected": "已拒绝",
"duration_second": "1 秒",
"betrayal_description": "你已撕毁和 {name} 的盟约,因而被标记为“叛徒”(你将获得 {durationText} 的 {malusPercent}% 防御降低惩罚)",
"duration_seconds_plural": "{seconds} 秒",
"betrayed_you": "{name} 撕毁了和你的盟约",
"about_to_expire": "你与 {name} 的结盟即将到期!",
"alliance_expired": "你与 {name} 的结盟已过期",
"attack_request": "{name} 请求你向 {target} 发起攻击",
"sent_emoji": "发送给 {name}: {emoji}",
"renew_alliance": "请求续期",
"request_alliance": "{name} 请求结盟!",
"focus": "聚焦",
"accept_alliance": "接受",
"reject_alliance": "拒绝",
"alliance_renewed": "你与 {name} 的结盟已续期",
"ignore": "忽略"
},
"unit_info_modal": {
"structure_info": "建筑信息",
"unit_type_unknown": "未知",
"close": "关闭",
"cooldown": "冷却时间",
"type": "类型",
"upgrade": "升级",
"level": "等级"
},
"relation": {
"hostile": "敌对",
@@ -433,8 +515,14 @@
"none": "空",
"alliances": "盟友"
},
"replay_panel": {
"replay_speed": "回放速度",
"game_speed": "游戏速度",
"fastest_game_speed": "最快"
},
"error_modal": {
"crashed": "游戏崩溃了!",
"connection_error": "连接出错!",
"paste_discord": "请在 Discord 中粘贴以下错误报告:",
"copy_clipboard": "复制到剪贴板",
"copied": "已复制!",
@@ -443,5 +531,53 @@
},
"heads_up_message": {
"choose_spawn": "选择出生点"
},
"territory_patterns": {
"title": "选择领土样式",
"purchase": "购买",
"blocked": {
"login": "您必须登录才能使用此样式。",
"purchase": "购买此图案以解锁它。"
},
"pattern": {
"default": "默认",
"custom": "自定义",
"stripes_v": "垂直",
"stripes_h": "水平",
"horizontal_stripes": "水平 (替换)",
"vertical_bars": "垂直 (替换)",
"checkerboard": "棋盘格",
"choco": "巧克力",
"diagonal": "对角线",
"cross": "十字线",
"mini_cross": "迷你十字线",
"sword": "剑",
"sparse_dots": "稀疏点",
"evan": "埃文",
"diagonal_stripe": "斜纹",
"mountain_ridge": "山脊",
"scattered_dots": "散点",
"circuit_board": "电路板",
"shells": "贝壳",
"-w-": ".w.",
"white_rabbit": "小白兔",
"goat": "山羊",
"cats": "猫",
"cursor": "光标",
"hand": "手",
"radiation": "辐射",
"openfront_qr": "OpenFront.io 二维码",
"openfront": "OpenFront",
"t_rex": "霸王龙",
"embelem": "徽章",
"grogu_head": "格罗古的头",
"grogu": "格罗古"
}
},
"auth": {
"login_required": "需要登录才能访问此网站。",
"redirecting": "正在将您重新定向……",
"not_authorized": "您没有权限访问此网站。",
"contact_admin": "如果您认为您看到此消息有误,请与网站管理员联系。"
}
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 2032,
"num_land_tiles": 2266710,
"num_land_tiles": 2184135,
"width": 1950
},
"mini_map": {
"height": 1016,
"num_land_tiles": 559837,
"num_land_tiles": 538153,
"width": 975
},
"name": "Africa",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1200,
"num_land_tiles": 1124099,
"num_land_tiles": 1079855,
"width": 2000
},
"mini_map": {
"height": 600,
"num_land_tiles": 277784,
"num_land_tiles": 266262,
"width": 1000
},
"name": "Asia",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1500,
"num_land_tiles": 1338638,
"num_land_tiles": 1319763,
"width": 2000
},
"mini_map": {
"height": 750,
"num_land_tiles": 333175,
"num_land_tiles": 328215,
"width": 1000
},
"name": "Australia",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1564,
"num_land_tiles": 2234157,
"num_land_tiles": 2181746,
"width": 2500
},
"mini_map": {
"height": 782,
"num_land_tiles": 554725,
"num_land_tiles": 540863,
"width": 1250
},
"name": "Baikal",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1062,
"num_land_tiles": 1541211,
"num_land_tiles": 1483208,
"width": 1778
},
"mini_map": {
"height": 531,
"num_land_tiles": 380567,
"num_land_tiles": 365411,
"width": 889
},
"name": "BetweenTwoSeas",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1100,
"num_land_tiles": 1201650,
"num_land_tiles": 1153632,
"width": 1500
},
"mini_map": {
"height": 550,
"num_land_tiles": 296740,
"num_land_tiles": 284219,
"width": 750
},
"name": "BlackSea",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1396,
"num_land_tiles": 980143,
"num_land_tiles": 938800,
"width": 2000
},
"mini_map": {
"height": 698,
"num_land_tiles": 241934,
"num_land_tiles": 231151,
"width": 1000
},
"name": "Britannia",
@@ -1,12 +1,12 @@
{
"map": {
"height": 1840,
"num_land_tiles": 1171253,
"num_land_tiles": 1079790,
"width": 2300
},
"mini_map": {
"height": 920,
"num_land_tiles": 287132,
"num_land_tiles": 262417,
"width": 1150
},
"name": "Deglaciated Antarctica",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1646,
"num_land_tiles": 928056,
"num_land_tiles": 879264,
"width": 1562
},
"mini_map": {
"height": 823,
"num_land_tiles": 228603,
"num_land_tiles": 215238,
"width": 781
},
"name": "East Asia",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1674,
"num_land_tiles": 2501136,
"num_land_tiles": 2318609,
"width": 2350
},
"mini_map": {
"height": 837,
"num_land_tiles": 610071,
"num_land_tiles": 563296,
"width": 1175
},
"name": "Europe",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1000,
"num_land_tiles": 1046542,
"num_land_tiles": 1008469,
"width": 2000
},
"mini_map": {
"height": 500,
"num_land_tiles": 258385,
"num_land_tiles": 248793,
"width": 1000
},
"name": "Europe",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1400,
"num_land_tiles": 929295,
"num_land_tiles": 859274,
"width": 2100
},
"mini_map": {
"height": 700,
"num_land_tiles": 226784,
"num_land_tiles": 208351,
"width": 1050
},
"name": "Falkland Islands",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 2000,
"num_land_tiles": 458869,
"num_land_tiles": 424994,
"width": 1600
},
"mini_map": {
"height": 1000,
"num_land_tiles": 111960,
"num_land_tiles": 103147,
"width": 800
},
"name": "Faroe Islands",
@@ -1,12 +1,12 @@
{
"map": {
"height": 1968,
"num_land_tiles": 2291474,
"num_land_tiles": 2239818,
"width": 2216
},
"mini_map": {
"height": 984,
"num_land_tiles": 568298,
"num_land_tiles": 555003,
"width": 1108
},
"name": "GatewayToTheAtlantic",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1948,
"num_land_tiles": 2544294,
"num_land_tiles": 2333974,
"width": 4110
},
"mini_map": {
"height": 974,
"num_land_tiles": 618860,
"num_land_tiles": 564737,
"width": 2055
},
"name": "Giant_World_Map",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1760,
"num_land_tiles": 1777270,
"num_land_tiles": 1729369,
"width": 2200
},
"mini_map": {
"height": 880,
"num_land_tiles": 441119,
"num_land_tiles": 428074,
"width": 1100
},
"name": "Halkidiki",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1500,
"num_land_tiles": 1123359,
"num_land_tiles": 1098655,
"width": 2000
},
"mini_map": {
"height": 750,
"num_land_tiles": 279119,
"num_land_tiles": 272699,
"width": 1000
},
"name": "Iceland",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1272,
"num_land_tiles": 806817,
"num_land_tiles": 780495,
"width": 1360
},
"mini_map": {
"height": 636,
"num_land_tiles": 199974,
"num_land_tiles": 192915,
"width": 680
},
"name": "Italia",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1000,
"num_land_tiles": 1384168,
"num_land_tiles": 1354047,
"width": 2000
},
"mini_map": {
"height": 500,
"num_land_tiles": 343861,
"num_land_tiles": 335950,
"width": 1000
},
"name": "Mars",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 964,
"num_land_tiles": 1672209,
"num_land_tiles": 1621317,
"width": 2200
},
"mini_map": {
"height": 482,
"num_land_tiles": 413783,
"num_land_tiles": 400552,
"width": 1100
},
"name": "MENA",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1448,
"num_land_tiles": 1412703,
"num_land_tiles": 1243623,
"width": 2800
},
"mini_map": {
"height": 724,
"num_land_tiles": 339357,
"num_land_tiles": 295689,
"width": 1400
},
"name": "NorthAmerica",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1000,
"num_land_tiles": 216012,
"num_land_tiles": 194648,
"width": 2000
},
"mini_map": {
"height": 500,
"num_land_tiles": 52422,
"num_land_tiles": 46767,
"width": 1000
},
"name": "Oceania",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1000,
"num_land_tiles": 450234,
"num_land_tiles": 420336,
"width": 1000
},
"mini_map": {
"height": 500,
"num_land_tiles": 110270,
"num_land_tiles": 102357,
"width": 500
},
"name": "Pangaea",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 2378,
"num_land_tiles": 1513764,
"num_land_tiles": 1411064,
"width": 1746
},
"mini_map": {
"height": 1189,
"num_land_tiles": 369899,
"num_land_tiles": 342861,
"width": 873
},
"name": "Americas",
@@ -1,12 +1,12 @@
{
"map": {
"height": 1476,
"num_land_tiles": 2015157,
"num_land_tiles": 1998085,
"width": 2902
},
"mini_map": {
"height": 738,
"num_land_tiles": 502404,
"num_land_tiles": 498123,
"width": 1451
},
"name": "Strait of Gibraltar",
+2 -2
View File
@@ -1,12 +1,12 @@
{
"map": {
"height": 1000,
"num_land_tiles": 702094,
"num_land_tiles": 651609,
"width": 2000
},
"mini_map": {
"height": 500,
"num_land_tiles": 171447,
"num_land_tiles": 158550,
"width": 1000
},
"name": "World",
+45 -6
View File
@@ -1,9 +1,48 @@
License: CC BY-NC 4.0 with Commercial Exemption
Creative Commons Non-Commercial License Agreement
This work is licensed under Creative Commons Attribution-NonCommercial 4.0
International License with the following exception:
With Commercial Exemption for OpenFront LLC
This License Agreement (“Agreement”) is entered into by and between the Licensor and the public users of the Licensed Work, subject to the terms described below.
OpenFront LLC is granted unlimited commercial use rights for all purposes.
1. Definitions
(a) “Licensor” means Evan Ray Pellegrini, on behalf of OpenFront LLC.
(b) “Licensee” means any natural or legal person who receives the Licensed Work under this Agreement.
(c) “Licensed Work” refers to the creative assets including but not limited to images, sounds, and music created by or for OpenFront LLC and distributed under this Agreement.
(d) “Non-Commercial” means not primarily intended for or directed toward commercial advantage or monetary compensation.
(e) “Commercial Use” means use of the Licensed Work for monetary compensation, financial gain, or other commercial advantage.
(f) “Exempt Commercial Use” means use of the Licensed Work by OpenFront LLC or its authorized agents, licensees, or contractors for any commercial purpose.
For all other parties, standard CC BY-NC 4.0 terms apply.
Full license text: https://creativecommons.org/licenses/by-nc/4.0/
2. License Grant (Non-Commercial Use)
Subject to the terms and conditions of this Agreement, Licensor hereby grants to Licensee a worldwide, royalty-free, non-exclusive, revocable license to use, copy, distribute, publicly perform, publicly display, and create derivative works of the Licensed Work solely for Non-Commercial purposes, provided that proper attribution is given as required under Section 4.
3. Commercial Use Exemption for OpenFront LLC
Notwithstanding Section 2, OpenFront LLC, including its owners, employees, contractors, sublicensees, and assigns, is expressly exempt from the Non-Commercial restriction. OpenFront LLC is granted an unrestricted, irrevocable, worldwide, royalty-free, exclusive right to use, copy, modify, distribute, sublicense, and commercially exploit the Licensed Work, including in derivative or combined works.
4. Attribution
Licensee must provide proper attribution to the Licensor as follows:
“Asset created by Evan Ray Pellegrini for OpenFront LLC used under Creative Commons Non-Commercial License (CC NC) with Commercial Exemption in favor of OpenFront LLC.”
Attribution must be included in any reasonable manner, but not in any way that suggests the Licensor endorses the Licensee or its use.
5. Restrictions
Licensee shall not:
(a) use the Licensed Work for Commercial Use unless specifically authorized by Licensor in writing;
(b) sublicense or assign the Licensed Work for Commercial Use;
(c) remove, obscure, or modify any copyright, trademark, or attribution notice.
6. No Warranties
The Licensed Work is provided “AS IS,” without warranty of any kind. Licensor disclaims all warranties, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, and non-infringement.
7. Termination
This license terminates automatically if Licensee breaches any of its terms. Upon termination, Licensee must cease all use and destroy any copies of the Licensed Work in their possession.
8. Governing Law
This Agreement shall be governed by and construed in accordance with the laws of the State of California, without regard to its conflict of law principles.
9. Entire Agreement
This Agreement constitutes the entire understanding between the parties and supersedes all prior agreements regarding the subject matter hereof.
IN WITNESS WHEREOF, this Creative Commons Non-Commercial License Agreement is made effective as of the date the Licensed Work is first used or accessed.
Licensor:
Evan Ray Pellegrini
on behalf of OpenFront LLC
2108 N ST STE N
SACRAMENTO CA 95816
+5 -11
View File
@@ -8,9 +8,9 @@ echo "🚀 STARTING SERVER SETUP"
echo "====================================================="
# Verify required environment variables
if [ -z "$OTEL_ENDPOINT" ] || [ -z "$OTEL_USERNAME" ] || [ -z "$OTEL_PASSWORD" ]; then
if [ -z "$OTEL_EXPORTER_OTLP_ENDPOINT" ] || [ -z "$OTEL_AUTH_HEADER" ]; then
echo "❌ ERROR: Required environment variables are not set!"
echo "Please set OTEL_ENDPOINT, OTEL_USERNAME, and OTEL_PASSWORD"
echo "Please set OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_AUTH_HEADER"
exit 1
fi
@@ -91,9 +91,6 @@ if [ ! -d "$OTEL_CONFIG_DIR" ]; then
echo "Created OpenTelemetry configuration directory"
fi
# Generate Base64 auth string
BASE64_AUTH=$(echo -n "${OTEL_USERNAME}:${OTEL_PASSWORD}" | base64)
# Create OpenTelemetry Collector configuration
cat > "$OTEL_CONFIG_DIR/otel-collector-config.yaml" << EOF
receivers:
@@ -118,9 +115,9 @@ processors:
exporters:
otlphttp:
endpoint: "${OTEL_ENDPOINT}"
endpoint: "${OTEL_EXPORTER_OTLP_ENDPOINT}"
headers:
Authorization: "Basic ${BASE64_AUTH}"
Authorization: "${OTEL_AUTH_HEADER}"
tls:
insecure: true # Set to false in production with proper certs
@@ -154,7 +151,6 @@ echo "🚀 Starting OpenTelemetry Collector..."
docker pull otel/opentelemetry-collector-contrib:latest
docker rm -f otel-collector 2> /dev/null || true
# Run OpenTelemetry Collector with appropriate permissions
# Run OpenTelemetry Collector
echo "🚀 Starting OpenTelemetry Collector..."
docker pull otel/opentelemetry-collector-contrib:latest
docker rm -f otel-collector 2> /dev/null || true
@@ -165,7 +161,6 @@ docker run -d \
--network=host \
--user=0 \
-v "$OTEL_CONFIG_DIR/otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml:ro" \
-e OTEL_ENDPOINT="${OTEL_ENDPOINT}" \
otel/opentelemetry-collector-contrib:latest
# Check if containers are running
@@ -186,6 +181,5 @@ echo "OpenTelemetry Collector is forwarding metrics to your endpoint."
echo ""
echo "📝 Configuration:"
echo " - Config Directory: $OTEL_CONFIG_DIR"
echo " - OpenTelemetry Endpoint: $OTEL_ENDPOINT"
echo " - Username: $OTEL_USERNAME"
echo " - OpenTelemetry Endpoint: $OTEL_EXPORTER_OTLP_ENDPOINT"
echo "====================================================="
+15 -11
View File
@@ -103,7 +103,7 @@ export function joinLobby(
if (message.type === "error") {
showErrorModal(
message.error,
"",
message.message,
lobbyConfig.gameID,
lobbyConfig.clientID,
true,
@@ -329,7 +329,7 @@ export class ClientGameRunner {
if (message.type === "error") {
showErrorModal(
message.error,
"",
message.message,
this.lobby.gameID,
this.lobby.clientID,
true,
@@ -385,7 +385,7 @@ export class ClientGameRunner {
!this.gameView.hasOwner(tile) &&
this.gameView.inSpawnPhase()
) {
this.eventBus.emit(new SendSpawnIntentEvent(cell));
this.eventBus.emit(new SendSpawnIntentEvent(tile));
return;
}
if (this.gameView.inSpawnPhase()) {
@@ -582,27 +582,31 @@ export class ClientGameRunner {
}
function showErrorModal(
errMsg: string,
stack: string,
error: string,
message: string | undefined,
gameID: GameID,
clientID: ClientID,
closable = false,
showDiscord = true,
heading = "error_modal.crashed",
) {
const errorText = `Error: ${errMsg}\nStack: ${stack}`;
if (document.querySelector("#error-modal")) {
return;
}
const modal = document.createElement("div");
modal.id = "error-modal";
const discord = showDiscord ? translateText("error_modal.paste_discord") : "";
const content = `${discord}\n${translateText(heading)}\n game id: ${gameID}, client id: ${clientID}\n${errorText}`;
const content = [
showDiscord ? translateText("error_modal.paste_discord") : null,
translateText(heading),
`game id: ${gameID}`,
`client id: ${clientID}`,
`Error: ${error}`,
message ? `Message: ${message}` : null,
]
.filter(Boolean)
.join("\n");
// Create elements
const pre = document.createElement("pre");
+25 -10
View File
@@ -13,20 +13,23 @@ import eo from "../../resources/lang/eo.json";
import es from "../../resources/lang/es.json";
import fi from "../../resources/lang/fi.json";
import fr from "../../resources/lang/fr.json";
import gl from "../../resources/lang/gl.json";
import he from "../../resources/lang/he.json";
import hi from "../../resources/lang/hi.json";
import it from "../../resources/lang/it.json";
import ja from "../../resources/lang/ja.json";
import ko from "../../resources/lang/ko.json";
import nl from "../../resources/lang/nl.json";
import pl from "../../resources/lang/pl.json";
import pt_br from "../../resources/lang/pt_br.json";
import pt_BR from "../../resources/lang/pt-BR.json";
import ru from "../../resources/lang/ru.json";
import sh from "../../resources/lang/sh.json";
import sv_se from "../../resources/lang/sv_se.json";
import sl from "../../resources/lang/sl.json";
import sv_SE from "../../resources/lang/sv-SE.json";
import tp from "../../resources/lang/tp.json";
import tr from "../../resources/lang/tr.json";
import uk from "../../resources/lang/uk.json";
import zh_cn from "../../resources/lang/zh_cn.json";
import zh_CN from "../../resources/lang/zh-CN.json";
@customElement("lang-selector")
export class LangSelector extends LitElement {
@@ -53,7 +56,7 @@ export class LangSelector extends LitElement {
ja,
nl,
pl,
pt_br,
"pt-BR": pt_BR,
ru,
sh,
tr,
@@ -63,8 +66,11 @@ export class LangSelector extends LitElement {
he,
da,
fi,
sv_se,
zh_cn,
"sv-SE": sv_SE,
"zh-CN": zh_CN,
ko,
gl,
sl,
};
createRenderRoot() {
@@ -89,15 +95,23 @@ export class LangSelector extends LitElement {
private getClosestSupportedLang(lang: string): string {
if (!lang) return "en";
if (lang in this.languageMap) return lang;
const base = lang.split("-")[0];
if (base in this.languageMap) return base;
const base = lang.slice(0, 2);
const candidates = Object.keys(this.languageMap).filter((key) =>
key.startsWith(base),
);
if (candidates.length > 0) {
candidates.sort((a, b) => b.length - a.length); // More specific first
return candidates[0];
}
return "en";
}
private async initializeLanguage() {
const browserLocale = navigator.language;
const savedLang = localStorage.getItem("lang");
const userLang = this.getClosestSupportedLang(savedLang || browserLocale);
const userLang = this.getClosestSupportedLang(savedLang ?? browserLocale);
this.defaultTranslations = this.loadLanguage("en");
this.translations = this.loadLanguage(userLang);
@@ -108,7 +122,7 @@ export class LangSelector extends LitElement {
}
private loadLanguage(lang: string): Record<string, string> {
const language = this.languageMap[lang] || {};
const language = this.languageMap[lang] ?? {};
const flat = flattenTranslations(language);
return flat;
}
@@ -204,6 +218,7 @@ export class LangSelector extends LitElement {
"user-setting",
"o-modal",
"o-button",
"territory-patterns-modal",
];
document.title = this.translateText("main.title") ?? document.title;
+1 -1
View File
@@ -162,7 +162,7 @@ export class LanguageModal extends LitElement {
<div class="c-modal__wrapper">
<header class="c-modal__header">
${translateText("select_lang.title")}
<div class="c-modal__close" @click=${this.close}>X</div>
<div class="c-modal__close" @click=${this.close}></div>
</header>
<section class="c-modal__content">
+3
View File
@@ -460,6 +460,9 @@ class Client {
"game-top-bar",
"help-modal",
"user-setting",
"territory-patterns-modal",
"language-modal",
"news-modal",
].forEach((tag) => {
const modal = document.querySelector(tag) as HTMLElement & {
close?: () => void;
+1 -1
View File
@@ -110,7 +110,7 @@ export class PublicLobby extends LitElement {
const teamCount =
lobby.gameConfig.gameMode === GameMode.Team
? lobby.gameConfig.playerTeams || 0
? (lobby.gameConfig.playerTeams ?? 0)
: null;
const mapImageSrc = this.mapImages.get(lobby.gameID);
+16 -18
View File
@@ -2,7 +2,6 @@ import { z } from "zod/v4";
import { EventBus, GameEvent } from "../core/EventBus";
import {
AllPlayers,
Cell,
GameType,
Gold,
PlayerID,
@@ -68,7 +67,7 @@ export class SendAllianceExtensionIntentEvent implements GameEvent {
}
export class SendSpawnIntentEvent implements GameEvent {
constructor(public readonly cell: Cell) {}
constructor(public readonly tile: TileRef) {}
}
export class SendAttackIntentEvent implements GameEvent {
@@ -90,7 +89,7 @@ export class SendBoatAttackIntentEvent implements GameEvent {
export class BuildUnitIntentEvent implements GameEvent {
constructor(
public readonly unit: UnitType,
public readonly cell: Cell,
public readonly tile: TileRef,
) {}
}
@@ -245,16 +244,14 @@ export class Transport {
}
private startPing() {
if (this.isLocal || this.pingInterval) return;
if (this.pingInterval === null) {
this.pingInterval = window.setInterval(() => {
if (this.socket !== null && this.socket.readyState === WebSocket.OPEN) {
this.sendMsg({
type: "ping",
} satisfies ClientPingMessage);
}
}, 5 * 1000);
}
if (this.isLocal) return;
this.pingInterval ??= window.setInterval(() => {
if (this.socket !== null && this.socket.readyState === WebSocket.OPEN) {
this.sendMsg({
type: "ping",
} satisfies ClientPingMessage);
}
}, 5 * 1000);
}
private stopPing() {
@@ -344,7 +341,10 @@ export class Transport {
console.log(
`WebSocket closed. Code: ${event.code}, Reason: ${event.reason}`,
);
if (event.code !== 1000 && event.code !== 1002) {
if (event.code === 1002) {
// TODO: make this a modal
alert(`connection refused: ${event.reason}`);
} else if (event.code !== 1000) {
console.log(`recieved error code ${event.code}, reconnecting`);
this.reconnect();
}
@@ -437,8 +437,7 @@ export class Transport {
pattern: this.lobbyConfig.pattern,
name: this.lobbyConfig.playerName,
playerType: PlayerType.Human,
x: event.cell.x,
y: event.cell.y,
tile: event.tile,
});
}
@@ -539,8 +538,7 @@ export class Transport {
type: "build_unit",
clientID: this.lobbyConfig.clientID,
unit: event.unit,
x: event.cell.x,
y: event.cell.y,
tile: event.tile,
});
}
+1 -1
View File
@@ -172,7 +172,7 @@ export function getAltKey(): string {
export function getGamesPlayed(): number {
try {
return parseInt(localStorage.getItem("gamesPlayed") || "0", 10) || 0;
return parseInt(localStorage.getItem("gamesPlayed") ?? "0", 10) || 0;
} catch (error) {
console.warn("Failed to read games played from localStorage:", error);
return 0;
+2 -4
View File
@@ -17,9 +17,7 @@ export class NewsButton extends LitElement {
private checkForNewVersion() {
try {
const lastSeenVersion = localStorage.getItem(
"news-button-last-seen-version",
);
const lastSeenVersion = localStorage.getItem("version");
this.isActive = lastSeenVersion !== version;
} catch (error) {
// Fallback to NOT showing notification if localStorage fails
@@ -28,7 +26,7 @@ export class NewsButton extends LitElement {
}
private handleClick() {
localStorage.setItem("news-button-last-seen-version", version);
localStorage.setItem("version", version);
this.isActive = false;
const newsModal = document.querySelector("news-modal") as NewsModal;
@@ -79,7 +79,7 @@ export class OModal extends LitElement {
${`${this.translationKey}` === ""
? `${this.title}`
: `${translateText(this.translationKey)}`}
<div class="c-modal__close" @click=${this.close}>X</div>
<div class="c-modal__close" @click=${this.close}></div>
</header>
<section class="c-modal__content">
<slot></slot>
+4 -13
View File
@@ -15,7 +15,6 @@ import { EventsDisplay } from "./layers/EventsDisplay";
import { FxLayer } from "./layers/FxLayer";
import { GameLeftSidebar } from "./layers/GameLeftSidebar";
import { GameRightSidebar } from "./layers/GameRightSidebar";
import { GameTopBar } from "./layers/GameTopBar";
import { GutterAdModal } from "./layers/GutterAdModal";
import { HeadsUpMessage } from "./layers/HeadsUpMessage";
import { Layer } from "./layers/Layer";
@@ -75,8 +74,8 @@ export function createRenderer(
buildMenu.transformHandler = transformHandler;
const leaderboard = document.querySelector("leader-board") as Leaderboard;
if (!emojiTable || !(leaderboard instanceof Leaderboard)) {
console.error("EmojiTable element not found in the DOM");
if (!leaderboard || !(leaderboard instanceof Leaderboard)) {
console.error("LeaderBoard element not found in the DOM");
}
leaderboard.eventBus = eventBus;
leaderboard.game = game;
@@ -90,8 +89,8 @@ export function createRenderer(
gameLeftSidebar.game = game;
const teamStats = document.querySelector("team-stats") as TeamStats;
if (!emojiTable || !(teamStats instanceof TeamStats)) {
console.error("EmojiTable element not found in the DOM");
if (!teamStats || !(teamStats instanceof TeamStats)) {
console.error("TeamStats element not found in the DOM");
}
teamStats.eventBus = eventBus;
teamStats.game = game;
@@ -162,13 +161,6 @@ export function createRenderer(
settingsModal.userSettings = userSettings;
settingsModal.eventBus = eventBus;
const gameTopBar = document.querySelector("game-top-bar") as GameTopBar;
if (!(gameTopBar instanceof GameTopBar)) {
console.error("top bar not found");
}
gameTopBar.game = game;
gameTopBar.eventBus = eventBus;
const unitDisplay = document.querySelector("unit-display") as UnitDisplay;
if (!(unitDisplay instanceof UnitDisplay)) {
console.error("unit display not found");
@@ -255,7 +247,6 @@ export function createRenderer(
new SpawnTimer(game, transformHandler),
leaderboard,
gameLeftSidebar,
gameTopBar,
unitDisplay,
gameRightSidebar,
controlPanel,
+2 -2
View File
@@ -91,9 +91,9 @@ const getSpriteForUnit = (unit: UnitView): ImageBitmap | null => {
const unitType = unit.type();
if (unitType === UnitType.Train) {
const trainType = trainTypeToSpriteType(unit);
return spriteMap.get(trainType) || null;
return spriteMap.get(trainType) ?? null;
}
return spriteMap.get(unitType) || null;
return spriteMap.get(unitType) ?? null;
};
export const isSpriteReady = (unit: UnitView): boolean => {
+7 -8
View File
@@ -15,7 +15,6 @@ import { translateText } from "../../../client/Utils";
import { EventBus } from "../../../core/EventBus";
import {
BuildableUnit,
Cell,
Gold,
PlayerActions,
UnitType,
@@ -136,6 +135,11 @@ export class BuildMenu extends LitElement implements Layer {
if (!this.game.myPlayer()?.isAlive()) {
return;
}
if (!this._hidden) {
// Players sometimes hold control while building a unit,
// so if the menu is already open, ignore the event.
return;
}
const clickedCell = this.transformHandler.screenToWorldCoordinates(
e.x,
e.y,
@@ -379,7 +383,7 @@ export class BuildMenu extends LitElement implements Layer {
return "?";
}
return player.units(item.unitType).length.toString();
return player.totalUnitLevels(item.unitType).toString();
}
public sendBuildOrUpgrade(buildableUnit: BuildableUnit, tile: TileRef): void {
@@ -391,12 +395,7 @@ export class BuildMenu extends LitElement implements Layer {
),
);
} else if (buildableUnit.canBuild) {
this.eventBus.emit(
new BuildUnitIntentEvent(
buildableUnit.type,
new Cell(this.game.x(tile), this.game.y(tile)),
),
);
this.eventBus.emit(new BuildUnitIntentEvent(buildableUnit.type, tile));
}
this.hideMenu();
}
+78 -16
View File
@@ -2,16 +2,19 @@ import { LitElement, html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { translateText } from "../../../client/Utils";
import { EventBus } from "../../../core/EventBus";
import { Gold } from "../../../core/game/Game";
import { GameView } from "../../../core/game/GameView";
import { ClientID } from "../../../core/Schemas";
import { AttackRatioEvent } from "../../InputHandler";
import { SendSetTargetTroopRatioEvent } from "../../Transport";
import { renderTroops } from "../../Utils";
import { renderNumber, renderTroops } from "../../Utils";
import { UIState } from "../UIState";
import { Layer } from "./Layer";
@customElement("control-panel")
export class ControlPanel extends LitElement implements Layer {
public game: GameView;
public clientID: ClientID;
public eventBus: EventBus;
public uiState: UIState;
@@ -27,13 +30,34 @@ export class ControlPanel extends LitElement implements Layer {
@state()
private _population: number;
@state()
private _maxPopulation: number;
@state()
private popRate: number;
@state()
private _troops: number;
@state()
private _workers: number;
@state()
private _isVisible = false;
@state()
private _manpower: number = 0;
@state()
private _gold: Gold;
@state()
private _goldPerSecond: Gold;
private _popRateIsIncreasing: boolean = true;
private _lastPopulationIncreaseRate: number;
private init_: boolean = false;
init() {
@@ -90,17 +114,31 @@ export class ControlPanel extends LitElement implements Layer {
return;
}
const popIncreaseRate = player.population() - this._population;
if (this.game.ticks() % 5 === 0) {
this._lastPopulationIncreaseRate = popIncreaseRate;
this.updatePopulationIncrease();
}
this._population = player.population();
this._maxPopulation = this.game.config().maxPopulation(player);
this._gold = player.gold();
this._troops = player.troops();
this._workers = player.workers();
this.popRate = this.game.config().populationIncreaseRate(player) * 10;
this._goldPerSecond = this.game.config().goldAdditionRate(player) * 10n;
this.currentTroopRatio = player.troops() / player.population();
this.requestUpdate();
}
private updatePopulationIncrease() {
const player = this.game?.myPlayer();
if (player === null) return;
const popIncreaseRate = this.game.config().populationIncreaseRate(player);
this._popRateIsIncreasing =
popIncreaseRate >= this._lastPopulationIncreaseRate;
this._lastPopulationIncreaseRate = popIncreaseRate;
}
onAttackRatioChange(newRatio: number) {
this.uiState.attackRatio = newRatio;
}
@@ -174,21 +212,45 @@ export class ControlPanel extends LitElement implements Layer {
</style>
<div
class="${this._isVisible
? "text-sm lg:text-m md:w-[320px] bg-gray-800/70 p-2 pr-3 lg:p-4 shadow-lg lg:rounded-lg backdrop-blur"
? "w-full sm:max-w-[320px] text-sm sm:text-base bg-gray-800/70 p-2 pr-3 sm:p-4 shadow-lg sm:rounded-lg backdrop-blur"
: "hidden"}"
@contextmenu=${(e) => e.preventDefault()}
>
<div class="relative mb-4 lg:mb-4">
<label class="flex justify-between text-white mb-1" translate="no">
<span>
${translateText("control_panel.troops")}:
${(this.currentTroopRatio * 100).toFixed(0)}%
</span>
<span>
${translateText("control_panel.workers")}:
${((1 - this.currentTroopRatio) * 100).toFixed(0)}%
</span>
</label>
<div class="block bg-black/30 text-white mb-4 p-2 rounded">
<div class="flex justify-between mb-1">
<span class="font-bold"
>${translateText("control_panel.pop")}:</span
>
<span translate="no"
>${renderTroops(this._population)} /
${renderTroops(this._maxPopulation)}
<span
class="${this._popRateIsIncreasing
? "text-green-500"
: "text-yellow-500"}"
translate="no"
>(+${renderTroops(this.popRate)})</span
></span
>
</div>
<div class="flex justify-between">
<span class="font-bold"
>${translateText("control_panel.gold")}:</span
>
<span translate="no"
>${renderNumber(this._gold)}
(+${renderNumber(this._goldPerSecond)})</span
>
</div>
</div>
<div class="relative mb-4 sm:mb-4">
<label class="block text-white mb-1" translate="no"
>${translateText("control_panel.troops")}:
<span translate="no">${renderTroops(this._troops)}</span> |
${translateText("control_panel.workers")}:
<span translate="no">${renderTroops(this._workers)}</span></label
>
<div class="relative h-8">
<!-- Background track -->
<div
@@ -215,7 +277,7 @@ export class ControlPanel extends LitElement implements Layer {
</div>
</div>
<div class="relative mb-0 lg:mb-4">
<div class="relative mb-0 sm:mb-4">
<label class="block text-white mb-1" translate="no"
>${translateText("control_panel.attack_ratio")}:
${(this.attackRatio * 100).toFixed(0)}%
+50 -101
View File
@@ -1,4 +1,4 @@
import { LitElement, css, html } from "lit";
import { LitElement, html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { EventBus } from "../../../core/EventBus";
import { AllPlayers } from "../../../core/game/Game";
@@ -11,91 +11,14 @@ import { TransformHandler } from "../TransformHandler";
@customElement("emoji-table")
export class EmojiTable extends LitElement {
@state() public isVisible = false;
public eventBus: EventBus;
public transformHandler: TransformHandler;
public game: GameView;
static styles = css`
:host {
display: block;
}
.emoji-table {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 9999;
background-color: #1e1e1e;
padding: 15px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
border-radius: 10px;
display: flex;
flex-direction: column;
align-items: center;
max-width: 95vw;
max-height: 95vh;
overflow-y: auto;
}
.emoji-row {
display: flex;
justify-content: center;
width: 100%;
}
.emoji-button {
font-size: 60px;
width: 80px;
height: 80px;
border: 1px solid #333;
background-color: #2c2c2c;
color: white;
border-radius: 12px;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
justify-content: center;
align-items: center;
margin: 8px;
}
.emoji-button:hover {
background-color: #3a3a3a;
transform: scale(1.1);
}
.emoji-button:active {
background-color: #4a4a4a;
transform: scale(0.95);
}
.hidden {
display: none !important;
}
@media (max-width: 600px) {
.emoji-button {
font-size: 32px;
/* Slightly smaller font size for mobile */
width: 60px;
/* Smaller width for mobile */
height: 60px;
/* Smaller height for mobile */
margin: 5px;
/* Smaller margin for mobile */
}
}
@media (max-width: 400px) {
.emoji-button {
font-size: 28px;
width: 50px;
height: 50px;
margin: 3px;
}
}
`;
@state()
private _hidden = true;
initEventBus() {
this.eventBus.on(ShowEmojiMenuEvent, (e) => {
this.isVisible = true;
const cell = this.transformHandler.screenToWorldCoordinates(e.x, e.y);
if (!this.game.isValidCoord(cell.x, cell.y)) {
return;
@@ -131,40 +54,66 @@ export class EmojiTable extends LitElement {
private onEmojiClicked: (emoji: string) => void = () => {};
render() {
if (!this.isVisible) {
return null;
}
return html`
<div class="emoji-table ${this._hidden ? "hidden" : ""}">
${emojiTable.map(
(row) => html`
<div class="emoji-row">
${row.map(
(emoji) => html`
<button
class="emoji-button"
@click=${() => this.onEmojiClicked(emoji)}
>
${emoji}
</button>
`,
)}
</div>
`,
)}
<div
class="bg-slate-800 max-w-[95vw] max-h-[95vh] pt-[15px] pb-[15px] fixed flex flex-col -translate-x-1/2 -translate-y-1/2
items-center rounded-[10px] z-[9999] top-[50%] left-[50%] justify-center"
@contextmenu=${(e) => e.preventDefault()}
@wheel=${(e) => e.stopPropagation()}
>
<!-- Close button -->
<button
class="absolute -top-2 -right-2 w-6 h-6 flex items-center justify-center
bg-red-500 hover:bg-red-900 text-white rounded-full
text-sm font-bold transition-colors"
@click=${this.hideTable}
>
</button>
<div
class="flex flex-col overflow-y-auto"
style="scrollbar-gutter: stable both-edges;"
>
${emojiTable.map(
(row) => html`
<div class="w-full justify-center flex">
${row.map(
(emoji) => html`
<button
class="flex transition-transform duration-300 ease justify-center items-center cursor-pointer
border border-solid border-slate-500 rounded-[12px] bg-slate-700 hover:bg-slate-600 active:bg-slate-500
md:m-[8px] md:text-[60px] md:w-[80px] md:h-[80px] hover:scale-[1.1] active:scale-[0.95]
sm:w-[60px] sm:h-[60px] sm:text-[32px] sm:m-[5px] text-[28px] w-[50px] h-[50px] m-[3px]"
@click=${() => this.onEmojiClicked(emoji)}
>
${emoji}
</button>
`,
)}
</div>
`,
)}
</div>
</div>
`;
}
hideTable() {
this._hidden = true;
this.isVisible = false;
this.requestUpdate();
}
showTable(oneEmojiClicked: (emoji: string) => void) {
this.onEmojiClicked = oneEmojiClicked;
this._hidden = false;
this.isVisible = true;
this.requestUpdate();
}
get isVisible() {
return !this._hidden;
createRenderRoot() {
return this; // Disable shadow DOM to allow Tailwind styles
}
}
+19 -5
View File
@@ -137,7 +137,7 @@ export class EventsDisplay extends LitElement implements Layer {
}
private toggleEventFilter(filterName: MessageCategory) {
const currentState = this.eventsFilters.get(filterName) || false;
const currentState = this.eventsFilters.get(filterName) ?? false;
this.eventsFilters.set(filterName, !currentState);
this.requestUpdate();
}
@@ -351,8 +351,15 @@ export class EventsDisplay extends LitElement implements Layer {
}
}
let description: string = event.message;
if (event.params !== undefined) {
if (event.message.startsWith("events_display.")) {
description = translateText(event.message, event.params);
}
}
this.addEvent({
description: event.message,
description: description,
createdAt: this.game.ticks(),
highlight: true,
type: event.messageType,
@@ -375,7 +382,7 @@ export class EventsDisplay extends LitElement implements Layer {
if (event.target) {
try {
const targetPlayer = this.game.player(event.target);
const targetName = targetPlayer?.name() ?? event.target;
const targetName = targetPlayer?.displayName() ?? event.target;
translatedMessage = baseMessage.replace("[P1]", targetName);
} catch (e) {
console.warn(
@@ -386,9 +393,16 @@ export class EventsDisplay extends LitElement implements Layer {
}
}
let otherPlayerDiplayName: string = "";
if (event.recipient !== null) {
//'recipient' parameter contains sender ID or recipient ID
const player = this.game.player(event.recipient);
otherPlayerDiplayName = player ? player.displayName() : "";
}
this.addEvent({
description: translateText(event.isFrom ? "chat.from" : "chat.to", {
user: event.recipient,
user: otherPlayerDiplayName,
msg: translatedMessage,
}),
createdAt: this.game.ticks(),
@@ -893,7 +907,7 @@ export class EventsDisplay extends LitElement implements Layer {
: html`
<!-- Main Events Display -->
<div
class="relative w-full lg:bottom-2.5 lg:right-2.5 z-50 lg:w-96 backdrop-blur"
class="relative w-full sm:bottom-2.5 sm:right-2.5 z-50 sm:w-96 backdrop-blur"
>
<!-- Button Bar -->
<div
+13 -3
View File
@@ -22,6 +22,7 @@ export class GameLeftSidebar extends LitElement implements Layer {
private playerColor: Colord = new Colord("#FFFFFF");
public game: GameView;
private _shownOnInit = false;
createRenderRoot() {
return this;
@@ -32,12 +33,15 @@ export class GameLeftSidebar extends LitElement implements Layer {
if (this.isTeamGame) {
this.isPlayerTeamLabelVisible = true;
}
// Make it visible by default on large screens
if (window.innerWidth >= 1024) {
// lg breakpoint
this._shownOnInit = true;
}
this.requestUpdate();
}
tick() {
if (!this.isPlayerTeamLabelVisible) return;
if (!this.playerTeam && this.game.myPlayer()?.team()) {
this.playerTeam = this.game.myPlayer()!.team();
if (this.playerTeam) {
@@ -49,6 +53,12 @@ export class GameLeftSidebar extends LitElement implements Layer {
}
}
if (this._shownOnInit && !this.game.inSpawnPhase()) {
this._shownOnInit = false;
this.isLeaderboardShow = true;
this.requestUpdate();
}
if (!this.game.inSpawnPhase()) {
this.isPlayerTeamLabelVisible = false;
this.requestUpdate();
@@ -130,7 +140,7 @@ export class GameLeftSidebar extends LitElement implements Layer {
<div class="block lg:flex flex-wrap gap-2">
<leader-board .visible=${this.isLeaderboardShow}></leader-board>
<team-stats
class=${`flex-1 ${this.isTeamLeaderboardShow ? "sm:mt-4 lg:mt-12" : ""}`}
class="flex-1"
.visible=${this.isTeamLeaderboardShow && this.isTeamGame}
></team-stats>
</div>
@@ -76,7 +76,9 @@ export class GameRightSidebar extends LitElement implements Layer {
private toggleReplayPanel(): void {
this._isReplayVisible = !this._isReplayVisible;
this.eventBus.emit(new ShowReplayPanelEvent(this._isReplayVisible));
this.eventBus.emit(
new ShowReplayPanelEvent(this._isReplayVisible, this._isSinglePlayer),
);
}
private onPauseButtonClick() {
-168
View File
@@ -1,168 +0,0 @@
import { html, LitElement } from "lit";
import { customElement } from "lit/decorators.js";
import goldCoinIcon from "../../../../resources/images/GoldCoinIcon.svg";
import populationIcon from "../../../../resources/images/PopulationIconSolidWhite.svg";
import troopIcon from "../../../../resources/images/TroopIconWhite.svg";
import workerIcon from "../../../../resources/images/WorkerIconWhite.svg";
import { EventBus } from "../../../core/EventBus";
import { GameUpdateType } from "../../../core/game/GameUpdates";
import { GameView } from "../../../core/game/GameView";
import { renderNumber, renderTroops } from "../../Utils";
import { Layer } from "./Layer";
@customElement("game-top-bar")
export class GameTopBar extends LitElement implements Layer {
public game: GameView;
public eventBus: EventBus;
private _troops = 0;
private _workers = 0;
private _lastPopulationIncreaseRate = 0;
private _popRateIsIncreasing = false;
private hasWinner = false;
createRenderRoot() {
return this;
}
init() {
this.requestUpdate();
}
tick() {
this.updatePopulationIncrease();
const player = this.game?.myPlayer();
if (!player) return;
this._troops = player.troops();
this._workers = player.workers();
const updates = this.game.updatesSinceLastTick();
if (updates) {
this.hasWinner = this.hasWinner || updates[GameUpdateType.Win].length > 0;
}
this.requestUpdate();
}
private updatePopulationIncrease() {
const player = this.game?.myPlayer();
if (player === null) return;
const popIncreaseRate = this.game.config().populationIncreaseRate(player);
this._popRateIsIncreasing =
popIncreaseRate >= this._lastPopulationIncreaseRate;
this._lastPopulationIncreaseRate = popIncreaseRate;
}
render() {
const myPlayer = this.game?.myPlayer();
if (!this.game || !myPlayer || this.game.inSpawnPhase()) {
return null;
}
const isAlt = this.game.config().isReplay();
if (isAlt) {
return html`
<div
class="absolute top-4 left-1/2 transform -translate-x-1/2 flex justify-center items-center p-2"
></div>
`;
}
const popRate = myPlayer
? this.game.config().populationIncreaseRate(myPlayer) * 10
: 0;
const maxPop = myPlayer ? this.game.config().maxPopulation(myPlayer) : 0;
const goldPerSecond = myPlayer
? this.game.config().goldAdditionRate(myPlayer) * 10n
: 0n;
return html`
<div
class="fixed top-4 left-1/2 transform -translate-x-1/2 flex justify-center items-center p-1 md:px-1.5 lg:px-4 z-[1100]"
>
<div class="flex justify-center items-center gap-1">
${myPlayer?.isAlive() && !this.game.inSpawnPhase()
? html`
<div class="overflow-x-auto hide-scrollbar">
<div
class="grid gap-1 grid-cols-[80px_100px_80px] w-max md:gap-2 md:grid-cols-[90px_120px_90px]"
>
<div
class="flex flex-wrap gap-1 flex-col bg-gray-800/70 border border-slate-400 p-0.5 md:px-1 lg:px-2"
>
<div class="flex gap-2 items-center justify-between">
<img
src=${goldCoinIcon}
alt="gold"
width="20"
height="20"
style="vertical-align: middle;"
/>
<span class="text-white"
>+${renderNumber(goldPerSecond)}</span
>
</div>
<div class="text-white">
${renderNumber(myPlayer.gold())}
</div>
</div>
<div
class="flex flex-wrap gap-1 flex-col bg-gray-800/70 border border-slate-400 p-0.5 md:px-1 lg:px-2"
>
<div class="flex gap-2 items-center justify-between">
<img
src=${populationIcon}
alt="population"
width="20"
height="20"
style="vertical-align: middle;"
/>
<span
class="${this._popRateIsIncreasing
? "text-green-500"
: "text-yellow-500"}"
translate="no"
>
+${renderTroops(popRate)}
</span>
</div>
<div class="text-white">
${renderTroops(myPlayer.population())} /
${renderTroops(maxPop)}
</div>
</div>
<div
class="flex bg-gray-800/70 border border-slate-400 p-0.5 md:px-1 lg:px-2"
>
<div class="flex flex-col flex-grow gap-1 w-full ">
<div class="flex gap-1">
<img
src=${troopIcon}
alt="troops"
width="20"
height="20"
style="vertical-align: middle;"
/>
<span class="text-white"
>${renderTroops(this._troops)}</span
>
</div>
<div class="flex gap-1">
<img
src=${workerIcon}
alt="gold"
width="20"
height="20"
style="vertical-align: middle;"
/>
<span class="text-white"
>${renderTroops(this._workers)}</span
>
</div>
</div>
</div>
</div>
</div>
`
: html`<div></div>`}
</div>
</div>
`;
}
}
+23 -38
View File
@@ -40,7 +40,6 @@ export class Leaderboard extends LitElement implements Layer {
players: Entry[] = [];
@property({ type: Boolean }) visible = false;
private _shownOnInit = false;
private showTopFive = true;
@state()
@@ -57,10 +56,6 @@ export class Leaderboard extends LitElement implements Layer {
tick() {
if (this.game === null) throw new Error("Not initialized");
if (!this._shownOnInit && !this.game.inSpawnPhase()) {
this._shownOnInit = true;
this.updateLeaderboard();
}
if (!this.visible) return;
if (this.game.ticks() % 10 === 0) {
this.updateLeaderboard();
@@ -174,37 +169,25 @@ export class Leaderboard extends LitElement implements Layer {
}
return html`
<div
class="max-h-[35vh] overflow-y-auto text-white text-xs md:text-sm md:max-h-[50vh] ${this
class="max-h-[35vh] overflow-y-auto text-white text-xs md:text-xs lg:text-sm md:max-h-[50vh] ${this
.visible
? ""
: "hidden"}"
@contextmenu=${(e: Event) => e.preventDefault()}
>
<button
class="mb-2 px-2 py-1 md:px-2.5 md:py-1.5 text-xs md:text-sm lg:text-base border border-white/20 hover:bg-white/10"
@click=${() => {
this.showTopFive = !this.showTopFive;
this.updateLeaderboard();
}}
>
${this.showTopFive
? translateText("leaderboard.show_all")
: translateText("leaderboard.show_top_5")}
</button>
<div
class="grid bg-gray-800/70 w-full text-xs md:text-sm lg:text-base"
style="grid-template-columns: 35px 100px 85px 65px 65px;"
class="grid bg-gray-800/70 w-full text-xs md:text-xs lg:text-sm"
style="grid-template-columns: 30px 100px 70px 55px 75px;"
>
<div class="contents font-bold bg-gray-700/50">
<div class="py-1.5 md:py-2.5 text-center border-b border-slate-500">
<div class="py-1 md:py-2 text-center border-b border-slate-500">
#
</div>
<div class="py-1.5 md:py-2.5 text-center border-b border-slate-500">
<div class="py-1 md:py-2 text-center border-b border-slate-500">
${translateText("leaderboard.player")}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500 cursor-pointer"
class="py-1 md:py-2 text-center border-b border-slate-500 cursor-pointer whitespace-nowrap"
@click=${() => this.setSort("tiles")}
>
${translateText("leaderboard.owned")}
@@ -215,7 +198,7 @@ export class Leaderboard extends LitElement implements Layer {
: ""}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500 cursor-pointer"
class="py-1 md:py-2 text-center border-b border-slate-500 cursor-pointer whitespace-nowrap"
@click=${() => this.setSort("gold")}
>
${translateText("leaderboard.gold")}
@@ -226,7 +209,7 @@ export class Leaderboard extends LitElement implements Layer {
: ""}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500 cursor-pointer"
class="py-1 md:py-2 text-center border-b border-slate-500 cursor-pointer whitespace-nowrap"
@click=${() => this.setSort("troops")}
>
${translateText("leaderboard.troops")}
@@ -248,29 +231,21 @@ export class Leaderboard extends LitElement implements Layer {
: ""} cursor-pointer"
@click=${() => this.handleRowClickPlayer(player.player)}
>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500"
>
<div class="py-1 md:py-2 text-center border-b border-slate-500">
${player.position}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500 truncate"
class="py-1 md:py-2 text-center border-b border-slate-500 truncate"
>
${player.name}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500"
>
<div class="py-1 md:py-2 text-center border-b border-slate-500">
${player.score}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500"
>
<div class="py-1 md:py-2 text-center border-b border-slate-500">
${player.gold}
</div>
<div
class="py-1.5 md:py-2.5 text-center border-b border-slate-500"
>
<div class="py-1 md:py-2 text-center border-b border-slate-500">
${player.troops}
</div>
</div>
@@ -278,6 +253,16 @@ export class Leaderboard extends LitElement implements Layer {
)}
</div>
</div>
<button
class="mt-1 px-1.5 py-0.5 md:px-2 md:py-0.5 text-xs md:text-xs lg:text-sm border border-white/20 hover:bg-white/10 text-white mx-auto block"
@click=${() => {
this.showTopFive = !this.showTopFive;
this.updateLeaderboard();
}}
>
${this.showTopFive ? "+" : "-"}
</button>
`;
}
}
+28 -18
View File
@@ -1,7 +1,7 @@
import { LitElement } from "lit";
import { customElement } from "lit/decorators.js";
import { EventBus } from "../../../core/EventBus";
import { PlayerActions, TerraNullius } from "../../../core/game/Game";
import { PlayerActions } from "../../../core/game/Game";
import { TileRef } from "../../../core/game/GameMap";
import { GameView, PlayerView } from "../../../core/game/GameView";
import { TransformHandler } from "../TransformHandler";
@@ -17,7 +17,7 @@ import {
centerButtonElement,
COLORS,
MenuElementParams,
rootMenuItems,
rootMenuElement,
} from "./RadialMenuElements";
import swordIcon from "../../../../resources/images/SwordIconWhite.svg";
@@ -31,7 +31,6 @@ export class MainRadialMenu extends LitElement implements Layer {
private chatIntegration: ChatIntegration;
private clickedTile: TileRef | null = null;
private selectedPlayer: PlayerView | TerraNullius | null = null;
constructor(
private eventBus: EventBus,
@@ -57,7 +56,12 @@ export class MainRadialMenu extends LitElement implements Layer {
`,
};
this.radialMenu = new RadialMenu(menuConfig);
this.radialMenu = new RadialMenu(
this.eventBus,
rootMenuElement,
centerButtonElement,
menuConfig,
);
this.playerActionHandler = new PlayerActionHandler(
this.eventBus,
@@ -65,8 +69,6 @@ export class MainRadialMenu extends LitElement implements Layer {
);
this.chatIntegration = new ChatIntegration(this.game, this.eventBus);
this.radialMenu.setRootMenuItems(rootMenuItems, centerButtonElement);
}
init() {
@@ -83,12 +85,11 @@ export class MainRadialMenu extends LitElement implements Layer {
return;
}
this.clickedTile = this.game.ref(worldCoords.x, worldCoords.y);
this.selectedPlayer = this.game.owner(this.clickedTile);
this.game
.myPlayer()!
.actions(this.clickedTile)
.then((actions) => {
this.handlePlayerActions(
this.updatePlayerActions(
this.game.myPlayer()!,
actions,
this.clickedTile!,
@@ -99,12 +100,12 @@ export class MainRadialMenu extends LitElement implements Layer {
});
}
private async handlePlayerActions(
private async updatePlayerActions(
myPlayer: PlayerView,
actions: PlayerActions,
tile: TileRef,
screenX: number,
screenY: number,
screenX: number | null = null,
screenY: number | null = null,
) {
this.buildMenu.playerActions = actions;
@@ -130,18 +131,27 @@ export class MainRadialMenu extends LitElement implements Layer {
eventBus: this.eventBus,
};
this.radialMenu.setRootMenuItems(rootMenuItems, centerButtonElement);
this.radialMenu.setParams(params);
this.radialMenu.showRadialMenu(screenX, screenY);
if (screenX !== null && screenY !== null) {
this.radialMenu.showRadialMenu(screenX, screenY);
} else {
this.radialMenu.refresh();
}
}
async tick() {
if (!this.radialMenu.isMenuVisible() || this.clickedTile === null) return;
if (this.selectedPlayer === null) return;
const currentPlayer = this.game.owner(this.clickedTile);
if (currentPlayer.id() !== this.selectedPlayer.id()) {
this.closeMenu();
return;
if (this.game.ticks() % 5 === 0) {
this.game
.myPlayer()!
.actions(this.clickedTile)
.then((actions) => {
this.updatePlayerActions(
this.game.myPlayer()!,
actions,
this.clickedTile!,
);
});
}
}
@@ -1,5 +1,5 @@
import { EventBus } from "../../../core/EventBus";
import { Cell, PlayerActions, PlayerID } from "../../../core/game/Game";
import { PlayerActions, PlayerID } from "../../../core/game/Game";
import { TileRef } from "../../../core/game/GameMap";
import { PlayerView } from "../../../core/game/GameView";
import {
@@ -61,8 +61,9 @@ export class PlayerActionHandler {
): Promise<TileRef | false> {
return await player.bestTransportShipSpawn(tile);
}
handleSpawn(spawnCell: Cell) {
this.eventBus.emit(new SendSpawnIntentEvent(spawnCell));
handleSpawn(tile: TileRef) {
this.eventBus.emit(new SendSpawnIntentEvent(tile));
}
handleAllianceRequest(player: PlayerView, recipient: PlayerView) {
+49 -62
View File
@@ -13,10 +13,11 @@ import {
} from "../../../core/game/Game";
import { TileRef } from "../../../core/game/GameMap";
import { GameView, PlayerView, UnitView } from "../../../core/game/GameView";
import { MouseMoveEvent } from "../../InputHandler";
import { ContextMenuEvent, MouseMoveEvent } from "../../InputHandler";
import { renderNumber, renderTroops } from "../../Utils";
import { TransformHandler } from "../TransformHandler";
import { Layer } from "./Layer";
import { CloseRadialMenuEvent } from "./RadialMenu";
function euclideanDistWorld(
coord: { x: number; y: number },
@@ -69,6 +70,10 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
this.eventBus.on(MouseMoveEvent, (e: MouseMoveEvent) =>
this.onMouseEvent(e),
);
this.eventBus.on(ContextMenuEvent, (e: ContextMenuEvent) =>
this.maybeShow(e.x, e.y),
);
this.eventBus.on(CloseRadialMenuEvent, () => this.hide());
this._isActive = true;
}
@@ -165,6 +170,18 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
}
}
private displayUnitCount(
player: PlayerView,
type: UnitType,
description: string,
) {
return !this.game.config().isUnitDisabled(type)
? html`<div class="text-sm opacity-80" translate="no">
${translateText(description)}: ${player.totalUnitLevels(type)}
</div>`
: "";
}
private renderPlayerInfo(player: PlayerView) {
const myPlayer = this.game.myPlayer();
const isFriendly = myPlayer?.isFriendly(player);
@@ -250,66 +267,36 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
${translateText("player_info_overlay.gold")}:
${renderNumber(player.gold())}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.ports")}:
${player.units(UnitType.Port).length}
${player
.units(UnitType.Port)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0) > 1
? html`(${translateText("player_info_overlay.levels")}:
${player
.units(UnitType.Port)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0)})`
: ""}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.cities")}:
${player.units(UnitType.City).length}
${player
.units(UnitType.City)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0) > 1
? html`(${translateText("player_info_overlay.levels")}:
${player
.units(UnitType.City)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0)})`
: ""}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.missile_launchers")}:
${player.units(UnitType.MissileSilo).length}
${player
.units(UnitType.MissileSilo)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0) > 1
? html`(${translateText("player_info_overlay.levels")}:
${player
.units(UnitType.MissileSilo)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0)})`
: ""}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.sams")}:
${player.units(UnitType.SAMLauncher).length}
${player
.units(UnitType.SAMLauncher)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0) > 1
? html`(${translateText("player_info_overlay.levels")}:
${player
.units(UnitType.SAMLauncher)
.map((unit) => unit.level())
.reduce((a, b) => a + b, 0)})`
: ""}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.warships")}:
${player.units(UnitType.Warship).length}
</div>
${this.displayUnitCount(
player,
UnitType.Port,
"player_info_overlay.ports",
)}
${this.displayUnitCount(
player,
UnitType.City,
"player_info_overlay.cities",
)}
${this.displayUnitCount(
player,
UnitType.Factory,
"player_info_overlay.factories",
)}
${this.displayUnitCount(
player,
UnitType.MissileSilo,
"player_info_overlay.missile_launchers",
)}
${this.displayUnitCount(
player,
UnitType.SAMLauncher,
"player_info_overlay.sams",
)}
${this.displayUnitCount(
player,
UnitType.Warship,
"player_info_overlay.warships",
)}
${relationHtml}
</div>
`;
@@ -352,7 +339,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
return html`
<div
class="hidden lg:flex fixed top-[245px] right-0 w-full z-50 flex-col max-w-[180px]"
class="block lg:flex fixed top-[150px] right-0 w-full z-50 flex-col max-w-[180px]"
@contextmenu=${(e) => e.preventDefault()}
>
<div
+1 -1
View File
@@ -233,7 +233,7 @@ export class PlayerPanel extends LitElement implements Layer {
return html`
<div
class="fixed inset-0 flex items-center justify-center z-50 pointer-events-none overflow-auto"
class="fixed inset-0 flex items-center justify-center z-[1001] pointer-events-none overflow-auto"
@contextmenu=${(e) => e.preventDefault()}
@wheel=${(e) => e.stopPropagation()}
>
+143 -97
View File
@@ -1,5 +1,6 @@
import * as d3 from "d3";
import backIcon from "../../../../resources/images/BackIconWhite.svg";
import { EventBus, GameEvent } from "../../../core/EventBus";
import { Layer } from "./Layer";
import {
CenterButtonElement,
@@ -7,6 +8,10 @@ import {
MenuElementParams,
} from "./RadialMenuElements";
export class CloseRadialMenuEvent implements GameEvent {
constructor() {}
}
export interface TooltipItem {
text: string;
className: string;
@@ -39,13 +44,11 @@ export class RadialMenu implements Layer {
private currentLevel: number = 0; // Current menu level (0 = main menu, 1 = submenu, etc.)
private menuStack: MenuElement[][] = []; // Stack to track menu navigation history
private currentMenuItems: MenuElement[] = []; // Current active menu items (changes based on level)
private rootMenuItems: MenuElement[] = []; // Store the original root menu items
private readonly config: RequiredRadialMenuConfig;
private readonly backIconSize: number;
private centerButtonState: CenterButtonState = "default";
private centerButtonElement: CenterButtonElement | null = null;
private isTransitioning: boolean = false;
private lastHideTime: number = 0;
@@ -72,7 +75,12 @@ export class RadialMenu implements Layer {
private params: MenuElementParams | null = null;
constructor(config: RadialMenuConfig = {}) {
constructor(
private eventBus: EventBus,
private rootMenu: MenuElement,
private centerButtonElement: CenterButtonElement,
config: RadialMenuConfig = {},
) {
this.config = {
menuSize: config.menuSize ?? 190,
submenuScale: config.submenuScale ?? 1.5,
@@ -112,10 +120,12 @@ export class RadialMenu implements Layer {
.style("height", "100vh")
.on("click", () => {
this.hideRadialMenu();
this.eventBus.emit(new CloseRadialMenuEvent());
})
.on("contextmenu", (e) => {
e.preventDefault();
this.hideRadialMenu();
this.eventBus.emit(new CloseRadialMenuEvent());
});
// Calculate the total svg size needed for all potential nested menus
@@ -217,7 +227,7 @@ export class RadialMenu implements Layer {
}
private getInnerRadiusForLevel(level: number): number {
return level === 0 ? 50 : 50 + 25;
return level === 0 ? 40 : 50 + 25;
}
private getOuterRadiusForLevel(level: number): number {
@@ -237,10 +247,12 @@ export class RadialMenu implements Layer {
.append("g")
.attr("class", `menu-level-${level}`);
// Set initial animation styles
// Set initial animation styles only for submenus (level > 0)
if (level === 0) {
menuGroup.style("opacity", 0.5).style("transform", "scale(0.2)");
// Main menu appears immediately without animation
menuGroup.style("opacity", 1).style("transform", "scale(1)");
} else {
// Submenus get the expansion animation
menuGroup.style("opacity", 0).style("transform", "scale(0.5)");
}
@@ -296,14 +308,14 @@ export class RadialMenu implements Layer {
const disabled = this.params === null || d.data.disabled(this.params);
const color = disabled
? this.config.disabledColor
: d.data.color || "#333333";
: (d.data.color ?? "#333333");
const opacity = disabled ? 0.5 : 0.7;
if (d.data.id === this.selectedItemId && this.currentLevel > level) {
return color;
}
return d3.color(color)?.copy({ opacity: opacity })?.toString() || color;
return d3.color(color)?.copy({ opacity: opacity })?.toString() ?? color;
})
.attr("stroke", "#ffffff")
.attr("stroke-width", "2")
@@ -339,7 +351,7 @@ export class RadialMenu implements Layer {
const color =
this.params === null || d.data.disabled(this.params)
? this.config.disabledColor
: d.data.color || "#333333";
: (d.data.color ?? "#333333");
path.attr("fill", color);
}
});
@@ -403,11 +415,11 @@ export class RadialMenu implements Layer {
path.attr("stroke-width", "2");
const color = disabled
? this.config.disabledColor
: d.data.color || "#333333";
: (d.data.color ?? "#333333");
const opacity = disabled ? 0.5 : 0.7;
path.attr(
"fill",
d3.color(color)?.copy({ opacity: opacity })?.toString() || color,
d3.color(color)?.copy({ opacity: opacity })?.toString() ?? color,
);
};
@@ -435,6 +447,8 @@ export class RadialMenu implements Layer {
this.updateCenterButtonState("back");
} else {
d.data.action?.(this.params);
// Force transition state to false to ensure menu hides
this.isTransitioning = false;
this.hideRadialMenu();
}
};
@@ -477,6 +491,14 @@ export class RadialMenu implements Layer {
});
}
private isItemDisabled(item: MenuElement): boolean {
return (
this.params === null ||
this.params.game.inSpawnPhase() ||
item.disabled(this.params)
);
}
private renderIconsAndText(
arcs: d3.Selection<
SVGGElement,
@@ -494,10 +516,7 @@ export class RadialMenu implements Layer {
.each((d) => {
const contentId = d.data.id;
const content = d3.select(`g[data-id="${contentId}"]`);
const disabled =
this.params === null ||
this.params.game.inSpawnPhase() ||
d.data.disabled(this.params);
const disabled = this.isItemDisabled(d.data);
if (d.data.text) {
content
@@ -555,24 +574,43 @@ export class RadialMenu implements Layer {
}
private updateMenuGroupVisibility() {
// Hide all menus except the current and immediate previous one
this.updateMenuVisibility("forward");
}
private updateMenuVisibility(direction: "forward" | "backward" = "backward") {
this.menuGroups.forEach((menuGroup, level) => {
if (level === this.currentLevel) {
// Current level - always visible and interactive
menuGroup.style("display", "block");
} else if (level === this.currentLevel - 1) {
menuGroup.style("display", "block");
menuGroup
.transition()
.duration(this.config.menuTransitionDuration * 0.8)
.style("transform", "scale(0.5)")
.style("transform", "scale(1)")
.style("opacity", 1);
// Enable pointer events for current level
menuGroup.selectAll("path").style("pointer-events", "auto");
} else if (level === this.currentLevel - 1 && this.currentLevel > 0) {
// Previous level - visible but scaled down
menuGroup.style("display", "block");
menuGroup
.transition()
.duration(this.config.menuTransitionDuration * 0.8)
.style(
"transform",
`scale(${this.currentLevel === 1 ? "0.65" : "0.5"})`,
)
.style("opacity", 0.8);
menuGroup.selectAll("path").each(function () {
const pathElement = d3.select(this);
pathElement.style("pointer-events", "none");
});
} else {
// Disable pointer events for previous level when going forward
if (direction === "forward") {
menuGroup.selectAll("path").each(function () {
const pathElement = d3.select(this);
pathElement.style("pointer-events", "none");
});
}
} else if (level !== this.currentLevel + 1) {
// Hide all other levels
menuGroup
.transition()
.duration(this.config.menuTransitionDuration * 0.5)
@@ -610,7 +648,7 @@ export class RadialMenu implements Layer {
this.updateMenuLevels();
this.clearSelectedItemHoverState();
this.updateMenuVisibility();
this.updateMenuVisibility("backward");
this.animateMenuTransitions();
}
@@ -623,7 +661,7 @@ export class RadialMenu implements Layer {
this.selectedItemId = null;
}
this.currentMenuItems = previousItems || [];
this.currentMenuItems = previousItems ?? [];
if (this.currentLevel === 0) {
this.updateCenterButtonState("default");
@@ -637,54 +675,10 @@ export class RadialMenu implements Layer {
if (selectedPath) {
selectedPath.attr("filter", null);
selectedPath.attr("stroke-width", "2");
const item = this.findMenuItem(this.selectedItemId);
if (item) {
const disabled = this.params === null || item.disabled(this.params);
const color = disabled
? this.config.disabledColor
: item.color || "#333333";
const opacity = disabled ? 0.5 : 0.7;
selectedPath.attr(
"fill",
d3.color(color)?.copy({ opacity: opacity })?.toString() || color,
);
}
}
}
}
private updateMenuVisibility() {
this.menuGroups.forEach((menuGroup, level) => {
if (level === this.currentLevel) {
menuGroup.style("display", "block");
menuGroup
.transition()
.duration(this.config.menuTransitionDuration * 0.8)
.style("transform", "scale(1)")
.style("opacity", 1);
menuGroup.selectAll("path").style("pointer-events", "auto");
} else if (level === this.currentLevel - 1 && this.currentLevel > 0) {
menuGroup.style("display", "block");
menuGroup
.transition()
.duration(this.config.menuTransitionDuration * 0.8)
.style(
"transform",
`scale(${this.currentLevel === 1 ? "0.65" : "0.5"})`,
)
.style("opacity", 0.8);
} else if (level !== this.currentLevel + 1) {
menuGroup
.transition()
.duration(this.config.menuTransitionDuration * 0.5)
.style("opacity", 0)
.on("end", function () {
d3.select(this).style("display", "none");
});
}
});
// Use refresh() to update all item appearances consistently
this.refresh();
}
private animateMenuTransitions() {
@@ -765,10 +759,13 @@ export class RadialMenu implements Layer {
}
public hideRadialMenu() {
if (!this.isVisible || this.isTransitioning) {
if (!this.isVisible) {
return;
}
// Force transition state to false to ensure menu hides
this.isTransitioning = false;
this.menuElement.style("display", "none");
this.isVisible = false;
this.selectedItemId = null;
@@ -786,7 +783,7 @@ export class RadialMenu implements Layer {
private handleCenterButtonClick() {
if (this.centerButtonState === "default") {
if (this.params) {
if (this.params && this.isCenterButtonEnabled()) {
this.centerButtonElement?.action(this.params);
}
return;
@@ -810,6 +807,28 @@ export class RadialMenu implements Layer {
public updateCenterButtonState(state: CenterButtonState) {
this.centerButtonState = state;
if (state === "back") {
const backButtonSize = this.config.centerButtonSize * 0.8; // Make back button 20% smaller
this.menuElement
.select(".center-button-hitbox")
.transition()
.duration(0)
.attr("r", backButtonSize);
this.menuElement
.select(".center-button-visible")
.transition()
.duration(0)
.attr("r", backButtonSize);
const backIconImg = this.menuElement.select(".center-button-icon");
backIconImg
.attr("xlink:href", backIcon)
.attr("width", this.backIconSize)
.attr("height", this.backIconSize)
.attr("x", -this.backIconSize / 2)
.attr("y", -this.backIconSize / 2);
}
if (state === "default") {
// Restore original button size
this.menuElement
.select(".center-button-hitbox")
.transition()
@@ -821,15 +840,6 @@ export class RadialMenu implements Layer {
.duration(0)
.attr("r", this.config.centerButtonSize);
const backIconImg = this.menuElement.select(".center-button-icon");
backIconImg
.attr("xlink:href", backIcon)
.attr("width", this.backIconSize)
.attr("height", this.backIconSize)
.attr("x", -this.backIconSize / 2)
.attr("y", -this.backIconSize / 2);
}
if (state === "default") {
const iconImg = this.menuElement.select(".center-button-icon");
iconImg
.attr("xlink:href", this.originalCenterButtonIcon)
@@ -857,6 +867,11 @@ export class RadialMenu implements Layer {
}
private isCenterButtonEnabled(): boolean {
// Back button should always be enabled when in submenu levels
if (this.currentLevel > 0) {
return true;
}
if (this.params && this.centerButtonElement) {
return !this.centerButtonElement.disabled(this.params);
}
@@ -889,18 +904,6 @@ export class RadialMenu implements Layer {
return this.currentLevel;
}
public setRootMenuItems(
items: MenuElement[],
centerButton: CenterButtonElement,
) {
this.currentMenuItems = [...items];
this.rootMenuItems = [...items];
this.centerButtonElement = centerButton;
if (this.isVisible) {
this.refreshMenu();
}
}
public setParams(params: MenuElementParams) {
this.params = params;
}
@@ -913,7 +916,7 @@ export class RadialMenu implements Layer {
this.currentLevel = 0;
this.menuStack = [];
this.currentMenuItems = [...this.rootMenuItems];
this.currentMenuItems = this.rootMenu.subMenu!(this.params!);
this.navigationInProgress = false;
@@ -944,6 +947,49 @@ export class RadialMenu implements Layer {
this.renderMenuItems(this.currentMenuItems, this.currentLevel);
}
public refresh() {
if (!this.isVisible || !this.params) return;
// Refresh the disabled state of all menu items
this.menuPaths.forEach((path, itemId) => {
const item = this.findMenuItem(itemId);
if (item) {
const disabled = this.isItemDisabled(item);
const color = disabled
? this.config.disabledColor
: (item.color ?? "#333333");
const opacity = disabled ? 0.5 : 0.7;
// Update path appearance
path.attr(
"fill",
d3.color(color)?.copy({ opacity: opacity })?.toString() ?? color,
);
path.style("opacity", disabled ? 0.5 : 1);
path.style("cursor", disabled ? "not-allowed" : "pointer");
// Update icon/text appearance using the same logic as renderIconsAndText
const icon = this.menuIcons.get(itemId);
if (icon) {
// Update text opacity
const textElement = icon.select("text");
if (!textElement.empty()) {
textElement.style("opacity", disabled ? 0.5 : 1);
}
// Update image opacity
const imageElement = icon.select("image");
if (!imageElement.empty()) {
imageElement.attr("opacity", disabled ? 0.5 : 1);
}
}
}
});
// Refresh center button state
this.updateCenterButtonState(this.centerButtonState);
}
renderLayer(context: CanvasRenderingContext2D) {
// No need to render anything on the canvas
}
@@ -1,10 +1,5 @@
import { Config } from "../../../core/configuration/Config";
import {
AllPlayers,
Cell,
PlayerActions,
UnitType,
} from "../../../core/game/Game";
import { AllPlayers, PlayerActions, UnitType } from "../../../core/game/Game";
import { TileRef } from "../../../core/game/GameMap";
import { GameView, PlayerView } from "../../../core/game/GameView";
import { flattenedEmojiTable } from "../../../core/Util";
@@ -352,9 +347,9 @@ export const buildMenuElement: MenuElement = {
: undefined,
icon: item.icon,
tooltipItems: [
{ text: translateText(item.key || ""), className: "title" },
{ text: translateText(item.key ?? ""), className: "title" },
{
text: translateText(item.description || ""),
text: translateText(item.description ?? ""),
className: "description",
},
{
@@ -401,7 +396,7 @@ export const boatMenuElement: MenuElement = {
params.playerActionHandler.handleBoatAttack(
params.myPlayer,
params.selected?.id() || null,
params.selected?.id() ?? null,
params.tile,
spawn !== false ? spawn : null,
);
@@ -423,15 +418,11 @@ export const centerButtonElement: CenterButtonElement = {
}
return false;
}
return false;
return !params.playerActions.canAttack;
},
action: (params: MenuElementParams) => {
if (params.game.inSpawnPhase()) {
const cell = new Cell(
params.game.x(params.tile),
params.game.y(params.tile),
);
params.playerActionHandler.handleSpawn(cell);
params.playerActionHandler.handleSpawn(params.tile);
} else {
params.playerActionHandler.handleAttack(
params.myPlayer,
@@ -442,8 +433,17 @@ export const centerButtonElement: CenterButtonElement = {
},
};
export const rootMenuItems: MenuElement[] = [
infoMenuElement,
boatMenuElement,
buildMenuElement,
];
export const rootMenuElement: MenuElement = {
id: "root",
name: "root",
disabled: () => false,
icon: infoIcon,
color: COLORS.info,
subMenu: (params: MenuElementParams) => {
let ally = allyRequestElement;
if (params.selected?.isAlliedWith(params.myPlayer)) {
ally = allyBreakElement;
}
return [infoMenuElement, boatMenuElement, ally, buildMenuElement];
},
};
+5 -1
View File
@@ -11,7 +11,10 @@ import { translateText } from "../../Utils";
import { Layer } from "./Layer";
export class ShowReplayPanelEvent {
constructor(public visible: boolean = true) {}
constructor(
public visible: boolean = true,
public isSingleplayer: boolean = false,
) {}
}
@customElement("replay-panel")
@@ -36,6 +39,7 @@ export class ReplayPanel extends LitElement implements Layer {
if (this.eventBus) {
this.eventBus.on(ShowReplayPanelEvent, (event: ShowReplayPanelEvent) => {
this.visible = event.visible;
this.isSingleplayer = event.isSingleplayer;
});
}
}
+6 -3
View File
@@ -1,5 +1,6 @@
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators.js";
import { translateText } from "../../../client/Utils";
import { GameView } from "../../../core/game/GameView";
import { getGamesPlayed } from "../../Utils";
import { Layer } from "./Layer";
@@ -55,8 +56,8 @@ export class SpawnAd extends LitElement implements Layer {
this.g.ticks() > 10 &&
this.gamesPlayed > 5
) {
console.log("showing bottom left ad");
this.show();
console.log("not showing spawn ad");
// this.show();
}
if (this.isVisible && !this.g.inSpawnPhase()) {
console.log("hiding bottom left ad");
@@ -123,7 +124,9 @@ export class SpawnAd extends LitElement implements Layer {
class="w-full h-full flex items-center justify-center"
>
${!this.adLoaded
? html`<span class="text-white text-sm">Loading ad...</span>`
? html`<span class="text-white text-sm"
>${translateText("spawn_ad.loading")}</span
>`
: ""}
</div>
</div>
+5 -11
View File
@@ -59,17 +59,11 @@ export class SpawnTimer implements Layer {
const barHeight = 10;
const barWidth = this.transformHandler.width();
let yOffset: number;
if (this.game.inSpawnPhase()) {
// At spawn time, draw at top
yOffset = 0;
} else if (this.game.config().gameConfig().gameMode === GameMode.Team) {
// After spawn, only in team mode, offset based on screen width
const screenW = window.innerWidth;
yOffset = screenW > 1024 ? 80 : 58;
} else {
// Not spawn and not team mode: no bar
if (
!this.game.inSpawnPhase() &&
this.game.config().gameConfig().gameMode !== GameMode.Team
) {
return;
}
@@ -80,7 +74,7 @@ export class SpawnTimer implements Layer {
const segmentWidth = barWidth * ratio;
context.fillStyle = this.colors[i];
context.fillRect(x, yOffset, segmentWidth, barHeight);
context.fillRect(x, 0, segmentWidth, barHeight);
x += segmentWidth;
filledRatio += ratio;
+1 -1
View File
@@ -52,7 +52,7 @@ export class TeamStats extends LitElement implements Layer {
for (const player of players) {
const team = player.team();
if (team === null) continue;
if (!grouped[team]) grouped[team] = [];
grouped[team] ??= [];
grouped[team].push(player);
}
+7 -1
View File
@@ -317,10 +317,16 @@ export class UILayer implements Layer {
if (constructionType === undefined) {
return 1;
}
const constDuration =
this.game.unitInfo(constructionType).constructionDuration;
if (constDuration === undefined) {
throw new Error("unit does not have constructionTime");
}
return (
(this.game.ticks() - unit.createdAt()) /
(this.game.unitInfo(constructionType).constructionDuration || 1)
(constDuration === 0 ? 1 : constDuration)
);
case UnitType.MissileSilo:
case UnitType.SAMLauncher:
return unit.missileReadinesss();
+13
View File
@@ -24,12 +24,21 @@ export class UnitDisplay extends LitElement implements Layer {
private _port = 0;
private _defensePost = 0;
private _samLauncher = 0;
private allDisabled = false;
createRenderRoot() {
return this;
}
init() {
const config = this.game.config();
this.allDisabled =
config.isUnitDisabled(UnitType.City) &&
config.isUnitDisabled(UnitType.Factory) &&
config.isUnitDisabled(UnitType.Port) &&
config.isUnitDisabled(UnitType.DefensePost) &&
config.isUnitDisabled(UnitType.MissileSilo) &&
config.isUnitDisabled(UnitType.SAMLauncher);
this.requestUpdate();
}
@@ -89,6 +98,10 @@ export class UnitDisplay extends LitElement implements Layer {
return null;
}
if (this.allDisabled) {
return null;
}
return html`
<div
class="fixed bottom-4 left-1/2 transform -translate-x-1/2 z-[1100] bg-gray-800/70 backdrop-blur-sm border border-slate-400 rounded-lg p-2 hidden lg:block"
+12 -2
View File
@@ -332,10 +332,20 @@
class="ml-2 mr-4"
/>
</a>
<a href="/privacy-policy.html" class="t-link" target="_blank">
<a
href="/privacy-policy.html"
data-i18n="main.privacy_policy"
class="t-link"
target="_blank"
>
Privacy Policy
</a>
<a href="/terms-of-service.html" class="t-link" target="_blank">
<a
href="/terms-of-service.html"
data-i18n="main.terms_of_service"
class="t-link"
target="_blank"
>
Terms of Service
</a>
<p style="text-align: center">
+2 -3
View File
@@ -104,9 +104,8 @@ export type IsLoggedInResponse =
| false;
let __isLoggedIn: IsLoggedInResponse | undefined = undefined;
export function isLoggedIn(): IsLoggedInResponse {
if (__isLoggedIn === undefined) {
__isLoggedIn = _isLoggedIn();
}
__isLoggedIn ??= _isLoggedIn();
return __isLoggedIn;
}
function _isLoggedIn(): IsLoggedInResponse {
+6 -1
View File
@@ -369,6 +369,11 @@ label.option-card:hover {
mask: url("../../resources/images/CityIconWhite.svg") no-repeat center / cover;
}
#helpModal .factory-icon {
mask: url("../../resources/images/FactoryIconWhite.svg") no-repeat center /
cover;
}
#helpModal .defense-post-icon {
mask: url("../../resources/images/ShieldIconWhite.svg") no-repeat center /
cover;
@@ -626,7 +631,7 @@ label.option-card:hover {
}
/* News Button Notification */
.news-button .active button {
news-button .active button {
position: relative;
border-color: #2563eb !important;
border-width: 2px !important;
+1 -1
View File
@@ -1,4 +1,4 @@
export interface GameEvent {}
export type GameEvent = object;
export interface EventConstructor<T extends GameEvent = GameEvent> {
new (...args: any[]): T;
+6 -7
View File
@@ -162,7 +162,7 @@ export const TeamSchema = z.string();
const SafeString = z
.string()
.regex(
/^([a-zA-Z0-9\s.,!?@#$%&*()\-_+=\[\]{}|;:"'\/\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]|üÜ])*$/,
/^([a-zA-Z0-9\s.,!?@#$%&*()\-_+=[\]{}|;:"'/\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]|[üÜ])*$/u,
)
.max(1000);
@@ -246,7 +246,7 @@ export const AllianceExtensionIntentSchema = BaseIntentSchema.extend({
export const AttackIntentSchema = BaseIntentSchema.extend({
type: z.literal("attack"),
targetID: ID.nullable(),
troops: z.number().nullable(),
troops: z.number().nonnegative().nullable(),
});
export const SpawnIntentSchema = BaseIntentSchema.extend({
@@ -255,14 +255,13 @@ export const SpawnIntentSchema = BaseIntentSchema.extend({
flag: FlagSchema,
pattern: PatternSchema,
playerType: PlayerTypeSchema,
x: z.number(),
y: z.number(),
tile: z.number(),
});
export const BoatAttackIntentSchema = BaseIntentSchema.extend({
type: z.literal("boat"),
targetID: ID.nullable(),
troops: z.number(),
troops: z.number().nonnegative(),
dst: z.number(),
src: z.number().nullable(),
});
@@ -320,8 +319,7 @@ export const TargetTroopRatioIntentSchema = BaseIntentSchema.extend({
export const BuildUnitIntentSchema = BaseIntentSchema.extend({
type: z.literal("build_unit"),
unit: z.enum(UnitType),
x: z.number(),
y: z.number(),
tile: z.number(),
});
export const UpgradeStructureIntentSchema = BaseIntentSchema.extend({
@@ -450,6 +448,7 @@ export const ServerDesyncSchema = z.object({
export const ServerErrorSchema = z.object({
type: z.literal("error"),
error: z.string(),
message: z.string().optional(),
});
export const ServerMessageSchema = z.discriminatedUnion("type", [
+1 -1
View File
@@ -89,7 +89,7 @@ export const OTHER_INDEX_LOST = 3; // Structures/warships destroyed/captured by
export const OTHER_INDEX_UPGRADE = 4; // Structures upgraded
const BigIntStringSchema = z.preprocess((val) => {
if (typeof val === "string" && /^\d+$/.test(val)) return BigInt(val);
if (typeof val === "string" && /^-?\d+$/.test(val)) return BigInt(val);
if (typeof val === "bigint") return val;
return val;
}, z.bigint());
+2 -2
View File
@@ -119,7 +119,7 @@ export function getMode(list: Set<number>): number {
// Count occurrences
const counts = new Map<number, number>();
for (const item of list) {
counts.set(item, (counts.get(item) || 0) + 1);
counts.set(item, (counts.get(item) ?? 0) + 1);
}
// Find the item with the highest count
@@ -139,7 +139,7 @@ export function getMode(list: Set<number>): number {
export function sanitize(name: string): string {
return Array.from(name)
.join("")
.replace(/[^\p{L}\p{N}\s\p{Emoji}\p{Emoji_Component}\[\]_]/gu, "");
.replace(/[^\p{L}\p{N}\s\p{Emoji}\p{Emoji_Component}[\]_]/gu, "");
}
export function processName(name: string): string {
+1 -3
View File
@@ -76,9 +76,7 @@ export class ColorAllocator {
case ColoredTeams.Bot:
return botColor;
default:
return this.availableColors[
simpleHash(team) % this.availableColors.length
];
return this.assignColor(team);
}
}
}
+11 -4
View File
@@ -1,6 +1,5 @@
import { Colord } from "colord";
import { JWK } from "jose";
import { GameConfig, GameID, TeamCountConfig } from "../Schemas";
import {
Difficulty,
Game,
@@ -18,6 +17,8 @@ import {
import { GameMap, TileRef } from "../game/GameMap";
import { PlayerView } from "../game/GameView";
import { UserSettings } from "../game/UserSettings";
import { GameConfig, GameID, TeamCountConfig } from "../Schemas";
import { NukeType } from "../StatsSchemas";
export enum GameEnv {
Dev,
@@ -48,8 +49,7 @@ export interface ServerConfig {
r2AccessKey(): string;
r2SecretKey(): string;
otelEndpoint(): string;
otelUsername(): string;
otelPassword(): string;
otelAuthHeader(): string;
otelEnabled(): boolean;
jwtAudience(): string;
jwtIssuer(): string;
@@ -153,10 +153,17 @@ export interface Config {
traitorDefenseDebuff(): number;
traitorDuration(): number;
nukeMagnitudes(unitType: UnitType): NukeMagnitude;
// Number of tiles destroyed to break an alliance
nukeAllianceBreakThreshold(): number;
defaultNukeSpeed(): number;
defaultNukeTargetableRange(): number;
defaultSamRange(): number;
nukeDeathFactor(humans: number, tilesOwned: number): number;
nukeDeathFactor(
nukeType: NukeType,
humans: number,
tilesOwned: number,
maxPop: number,
): number;
structureMinDist(): number;
isReplay(): boolean;
allianceExtensionPromptOffset(): number;
+74 -95
View File
@@ -23,6 +23,7 @@ import { TileRef } from "../game/GameMap";
import { PlayerView } from "../game/GameView";
import { UserSettings } from "../game/UserSettings";
import { GameConfig, GameID, TeamCountConfig } from "../Schemas";
import { NukeType } from "../StatsSchemas";
import { assertNever, simpleHash, within } from "../Util";
import { Config, GameEnv, NukeMagnitude, ServerConfig, Theme } from "./Config";
import { PastelTheme } from "./PastelTheme";
@@ -119,19 +120,16 @@ export abstract class DefaultServerConfig implements ServerConfig {
}
otelEnabled(): boolean {
return (
this.env() !== GameEnv.Dev &&
Boolean(this.otelEndpoint()) &&
Boolean(this.otelUsername()) &&
Boolean(this.otelPassword())
Boolean(this.otelAuthHeader())
);
}
otelEndpoint(): string {
return process.env.OTEL_ENDPOINT ?? "";
return process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? "";
}
otelUsername(): string {
return process.env.OTEL_USERNAME ?? "";
}
otelPassword(): string {
return process.env.OTEL_PASSWORD ?? "";
otelAuthHeader(): string {
return process.env.OTEL_AUTH_HEADER ?? "";
}
gitCommit(): string {
return process.env.GIT_COMMIT ?? "";
@@ -236,7 +234,7 @@ export class DefaultConfig implements Config {
return 0.5;
}
traitorSpeedDebuff(): number {
return 0.7;
return 0.8;
}
traitorDuration(): number {
return 30 * 10; // 30 seconds
@@ -326,7 +324,7 @@ export class DefaultConfig implements Config {
return this._gameConfig.infiniteTroops;
}
trainSpawnRate(numberOfStations: number): number {
return Math.min(1400, Math.round(70 * Math.pow(numberOfStations, 0.8)));
return Math.min(1400, Math.round(20 * Math.pow(numberOfStations, 0.5)));
}
trainGold(): Gold {
return BigInt(10_000);
@@ -342,9 +340,9 @@ export class DefaultConfig implements Config {
}
tradeShipGold(dist: number, numPorts: number): Gold {
const baseGold = Math.floor(50000 + 130 * dist);
const basePortBonus = 0.2;
const diminishingFactor = 0.95;
const baseGold = Math.floor(50000 + 100 * dist);
const basePortBonus = 0.25;
const diminishingFactor = 0.9;
let totalMultiplier = 1;
for (let i = 0; i < numPorts; i++) {
@@ -356,17 +354,14 @@ export class DefaultConfig implements Config {
// Chance to spawn a trade ship in one second,
tradeShipSpawnRate(numTradeShips: number): number {
if (numTradeShips <= 20) {
if (numTradeShips < 20) {
return 5;
}
if (numTradeShips > this.tradeShipCap()) {
return 1_000_000;
if (numTradeShips <= 150) {
const additional = numTradeShips - 20;
return Math.floor(Math.pow(additional, 0.85) + 5);
}
return numTradeShips - 15;
}
tradeShipCap(): number {
return 100;
return 1_000_000;
}
unitInfo(type: UnitType): UnitInfo {
@@ -378,15 +373,9 @@ export class DefaultConfig implements Config {
};
case UnitType.Warship:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: BigInt(
Math.min(
1_000_000,
(p.unitsOwned(UnitType.Warship) + 1) * 250_000,
),
),
cost: this.costWrapper(UnitType.Warship, (numUnits: number) =>
Math.min(1_000_000, (numUnits + 1) * 250_000),
),
territoryBound: false,
maxHealth: 1000,
};
@@ -403,15 +392,9 @@ export class DefaultConfig implements Config {
};
case UnitType.Port:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: BigInt(
Math.min(
1_000_000,
Math.pow(2, p.unitsConstructed(UnitType.Port)) * 125_000,
),
),
cost: this.costWrapper(UnitType.Port, (numUnits: number) =>
Math.min(1_000_000, Math.pow(2, numUnits) * 125_000),
),
territoryBound: true,
constructionDuration: this.instantBuild() ? 0 : 2 * 10,
upgradable: true,
@@ -419,26 +402,17 @@ export class DefaultConfig implements Config {
};
case UnitType.AtomBomb:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: 750_000n,
cost: this.costWrapper(UnitType.AtomBomb, () => 750_000),
territoryBound: false,
};
case UnitType.HydrogenBomb:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: 5_000_000n,
cost: this.costWrapper(UnitType.HydrogenBomb, () => 5_000_000),
territoryBound: false,
};
case UnitType.MIRV:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: 25_000_000n,
cost: this.costWrapper(UnitType.MIRV, () => 35_000_000),
territoryBound: false,
};
case UnitType.MIRVWarhead:
@@ -453,54 +427,33 @@ export class DefaultConfig implements Config {
};
case UnitType.MissileSilo:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: 1_000_000n,
cost: this.costWrapper(UnitType.MissileSilo, () => 1_000_000),
territoryBound: true,
constructionDuration: this.instantBuild() ? 0 : 10 * 10,
upgradable: true,
};
case UnitType.DefensePost:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: BigInt(
Math.min(
250_000,
(p.unitsConstructed(UnitType.DefensePost) + 1) * 50_000,
),
),
cost: this.costWrapper(UnitType.DefensePost, (numUnits: number) =>
Math.min(250_000, (numUnits + 1) * 50_000),
),
territoryBound: true,
constructionDuration: this.instantBuild() ? 0 : 5 * 10,
};
case UnitType.SAMLauncher:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: BigInt(
Math.min(
3_000_000,
(p.unitsConstructed(UnitType.SAMLauncher) + 1) * 1_500_000,
),
),
cost: this.costWrapper(UnitType.SAMLauncher, (numUnits: number) =>
Math.min(3_000_000, (numUnits + 1) * 1_500_000),
),
territoryBound: true,
constructionDuration: this.instantBuild() ? 0 : 30 * 10,
upgradable: true,
};
case UnitType.City:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: BigInt(
Math.min(
1_000_000,
Math.pow(2, p.unitsConstructed(UnitType.City)) * 125_000,
),
),
cost: this.costWrapper(UnitType.City, (numUnits: number) =>
Math.min(1_000_000, Math.pow(2, numUnits) * 125_000),
),
territoryBound: true,
constructionDuration: this.instantBuild() ? 0 : 2 * 10,
upgradable: true,
@@ -508,15 +461,9 @@ export class DefaultConfig implements Config {
};
case UnitType.Factory:
return {
cost: (p: Player) =>
p.type() === PlayerType.Human && this.infiniteGold()
? 0n
: BigInt(
Math.min(
1_000_000,
Math.pow(2, p.unitsConstructed(UnitType.Factory)) * 125_000,
),
),
cost: this.costWrapper(UnitType.Factory, (numUnits: number) =>
Math.min(1_000_000, Math.pow(2, numUnits) * 125_000),
),
territoryBound: true,
constructionDuration: this.instantBuild() ? 0 : 2 * 10,
canBuildTrainStation: true,
@@ -538,6 +485,20 @@ export class DefaultConfig implements Config {
assertNever(type);
}
}
private costWrapper(
type: UnitType,
costFn: (units: number) => number,
): (p: Player) => bigint {
return (p: Player) => {
if (p.type() === PlayerType.Human && this.infiniteGold()) {
return 0n;
}
const numUnits = Math.min(p.unitsOwned(type), p.unitsConstructed(type));
return BigInt(costFn(numUnits));
};
}
defaultDonationAmount(sender: Player): number {
return Math.floor(sender.troops() / 3);
}
@@ -560,7 +521,7 @@ export class DefaultConfig implements Config {
return 30 * 10;
}
allianceDuration(): Tick {
return 600 * 10; // 10 minutes.
return 300 * 10; // 5 minutes.
}
temporaryEmbargoDuration(): Tick {
return 300 * 10; // 5 minutes.
@@ -791,7 +752,7 @@ export class DefaultConfig implements Config {
toAdd *= ratio;
if (player.type() === PlayerType.Bot) {
toAdd *= 0.7;
toAdd *= 0.6;
}
if (player.type() === PlayerType.FakeHuman) {
@@ -845,6 +806,10 @@ export class DefaultConfig implements Config {
throw new Error(`Unknown nuke type: ${unitType}`);
}
nukeAllianceBreakThreshold(): number {
return 100;
}
defaultNukeSpeed(): number {
return 6;
}
@@ -858,8 +823,22 @@ export class DefaultConfig implements Config {
}
// Humans can be population, soldiers attacking, soldiers in boat etc.
nukeDeathFactor(humans: number, tilesOwned: number): number {
return (5 * humans) / Math.max(1, tilesOwned);
nukeDeathFactor(
nukeType: NukeType,
humans: number,
tilesOwned: number,
maxPop: number,
): number {
if (nukeType !== UnitType.MIRVWarhead) {
return (5 * humans) / Math.max(1, tilesOwned);
}
const targetPop = 0.03 * maxPop;
const excessPop = Math.max(0, humans - targetPop);
const scalingFactor = 500;
const steepness = 2;
const normalizedExcess = excessPop / maxPop;
return scalingFactor * (1 - Math.exp(-steepness * normalizedExcess));
}
structureMinDist(): number {
+9 -7
View File
@@ -97,11 +97,9 @@ export class AttackExecution implements Execution {
}
}
if (this.startTroops === null) {
this.startTroops = this.mg
.config()
.attackAmount(this._owner, this.target);
}
this.startTroops ??= this.mg
.config()
.attackAmount(this._owner, this.target);
if (this.removeTroops) {
this.startTroops = Math.min(this._owner.troops(), this.startTroops);
this._owner.removeTroops(this.startTroops);
@@ -187,8 +185,11 @@ export class AttackExecution implements Execution {
this.attack.delete();
this.active = false;
// Record stats
this.mg.stats().attackCancel(this._owner, this.target, survivors);
// Not all retreats are canceled attacks
if (this.attack.retreated()) {
// Record stats
this.mg.stats().attackCancel(this._owner, this.target, survivors);
}
}
tick(ticks: number) {
@@ -344,6 +345,7 @@ export class AttackExecution implements Execution {
);
this.target.removeGold(gold);
this._owner.addGold(gold);
this.mg.stats().goldWar(this._owner, this.target, gold);
for (let i = 0; i < 10; i++) {
for (const tile of this.target.tiles()) {
+5 -14
View File
@@ -1,5 +1,4 @@
import {
Cell,
Execution,
Game,
Gold,
@@ -27,12 +26,11 @@ export class ConstructionExecution implements Execution {
private ticksUntilComplete: Tick;
private cost: Gold;
private tile: TileRef;
constructor(
private player: Player,
private constructionType: UnitType,
private tileOrCell: TileRef | Cell,
private tile: TileRef,
) {}
init(mg: Game, ticks: number): void {
@@ -46,17 +44,10 @@ export class ConstructionExecution implements Execution {
return;
}
if (this.tileOrCell instanceof Cell) {
if (!this.mg.isValidCoord(this.tileOrCell.x, this.tileOrCell.y)) {
console.warn(
`cannot build construction invalid coordinates ${this.tileOrCell.x}, ${this.tileOrCell.y}`,
);
this.active = false;
return;
}
this.tile = this.mg.ref(this.tileOrCell.x, this.tileOrCell.y);
} else {
this.tile = this.tileOrCell;
if (!this.mg.isValidRef(this.tile)) {
console.warn(`cannot build construction invalid tile ${this.tile}`);
this.active = false;
return;
}
}
+1 -3
View File
@@ -19,9 +19,7 @@ export class DonateGoldExecution implements Execution {
}
this.recipient = mg.player(this.recipientID);
if (this.gold === null) {
this.gold = this.sender.gold() / 3n;
}
this.gold ??= this.sender.gold() / 3n;
}
tick(ticks: number): void {
+1 -3
View File
@@ -19,9 +19,7 @@ export class DonateTroopsExecution implements Execution {
}
this.recipient = mg.player(this.recipientID);
if (this.troops === null) {
this.troops = mg.config().defaultDonationAmount(this.sender);
}
this.troops ??= mg.config().defaultDonationAmount(this.sender);
const maxDonation =
mg.config().maxPopulation(this.recipient) - this.recipient.population();
this.troops = Math.min(this.troops, maxDonation);
+3 -10
View File
@@ -1,4 +1,4 @@
import { Cell, Execution, Game } from "../game/Game";
import { Execution, Game } from "../game/Game";
import { PseudoRandom } from "../PseudoRandom";
import { ClientID, GameID, Intent, Turn } from "../Schemas";
import { simpleHash } from "../Util";
@@ -67,10 +67,7 @@ export class Executor {
case "move_warship":
return new MoveWarshipExecution(player, intent.unitId, intent.tile);
case "spawn":
return new SpawnExecution(
player.info(),
this.mg.ref(intent.x, intent.y),
);
return new SpawnExecution(player.info(), intent.tile);
case "boat":
return new TransportShipExecution(
player,
@@ -106,11 +103,7 @@ export class Executor {
case "embargo":
return new EmbargoExecution(player, intent.targetID, intent.action);
case "build_unit":
return new ConstructionExecution(
player,
intent.unit,
new Cell(intent.x, intent.y),
);
return new ConstructionExecution(player, intent.unit, intent.tile);
case "allianceExtension": {
return new AllianceExtensionExecution(player, intent.recipient);
}

Some files were not shown because too many files have changed in this diff Show More