mirror of
https://github.com/imayushsaini/Bombsquad-Ballistica-Modded-Server.git
synced 2025-11-14 17:46:03 +00:00
updated to 1.7.20
This commit is contained in:
parent
0dfe2de8e5
commit
dab1db4141
67 changed files with 5236 additions and 2272 deletions
83
dist/ba_data/data/langdata.json
vendored
83
dist/ba_data/data/langdata.json
vendored
|
|
@ -16,10 +16,11 @@
|
|||
"Greek": "Ελληνικά",
|
||||
"Hindi": "हिंदी",
|
||||
"Hungarian": "Magyar",
|
||||
"Indonesian": "Indonesia",
|
||||
"Indonesian": "Bahasa Indonesia",
|
||||
"Italian": "Italiano",
|
||||
"Japanese": "日本語",
|
||||
"Korean": "한국어",
|
||||
"Malay": "Melayu",
|
||||
"Persian": "فارسی",
|
||||
"Polish": "Polski",
|
||||
"Portuguese": "Português",
|
||||
|
|
@ -37,6 +38,7 @@
|
|||
"Vietnamese": "Tiếng Việt "
|
||||
},
|
||||
"translation_contributors": [
|
||||
"!edMedic💊",
|
||||
"!ParkuristTurist!",
|
||||
"\"9ÅℳЇℜρℜѺƬǀGΞЯ",
|
||||
"/in/dev/",
|
||||
|
|
@ -96,7 +98,7 @@
|
|||
"ariyan ahir",
|
||||
"AHMAD",
|
||||
"Aufan Ahmad",
|
||||
"ahmed",
|
||||
"Ahmed",
|
||||
"ahmedzabara",
|
||||
"Collin Ainge",
|
||||
"Akash",
|
||||
|
|
@ -114,6 +116,7 @@
|
|||
"Anna Alanis",
|
||||
"Manuel Alanis",
|
||||
"alanjijuoo7fudu@gmail.com",
|
||||
"albertojesusvaldesdelrey@gmail.com",
|
||||
"Alej0hio",
|
||||
"Pedro Alejandro",
|
||||
"Gabrijel Aleksić",
|
||||
|
|
@ -183,6 +186,7 @@
|
|||
"Krishna D Angad",
|
||||
"vân anh",
|
||||
"Aniol",
|
||||
"Daniel Felipe Silva dos Anjos",
|
||||
"Anmol",
|
||||
"anonymous",
|
||||
"Alok. R. Anoop",
|
||||
|
|
@ -193,10 +197,12 @@
|
|||
"apis",
|
||||
"Sagar April",
|
||||
"Fernando Araise",
|
||||
"Arda (Frosty)",
|
||||
"arda",
|
||||
"Hellmann Arias",
|
||||
"Muhammad Arief",
|
||||
"Arimaru",
|
||||
"Arin",
|
||||
"arjanex",
|
||||
"Arroz",
|
||||
"ARSHAD",
|
||||
"ArshiyDLn",
|
||||
|
|
@ -232,6 +238,7 @@
|
|||
"Myth B.",
|
||||
"B4likeBefore",
|
||||
"Praveen Babu",
|
||||
"Baechu",
|
||||
"Balage8",
|
||||
"BalaguerM",
|
||||
"Peter Balind",
|
||||
|
|
@ -279,6 +286,7 @@
|
|||
"BenVectorgames",
|
||||
"benybrot96",
|
||||
"berkay",
|
||||
"Silvio Berlusconi",
|
||||
"Bernardiny",
|
||||
"Anton Bang Berner",
|
||||
"Felix Bernhard",
|
||||
|
|
@ -291,12 +299,15 @@
|
|||
"Daniel Block",
|
||||
"BlueBlur",
|
||||
"bob bobber",
|
||||
"BomBillo",
|
||||
"The Bomboler 💣",
|
||||
"bombsquad",
|
||||
"Bombsquadzueira",
|
||||
"Bomby",
|
||||
"Zeleni bomby",
|
||||
"Alex BONYOMA",
|
||||
"Book",
|
||||
"Guilherme Borges",
|
||||
"Lucas Borges",
|
||||
"Gianfranco Del Borrello",
|
||||
"Abel Borso",
|
||||
|
|
@ -345,6 +356,7 @@
|
|||
"Fabio Cannavacciuolo",
|
||||
"CANOVER",
|
||||
"Fedrigo Canpanjoło",
|
||||
"Yan Carlos",
|
||||
"CarlosE.",
|
||||
"mark Dave a carposo",
|
||||
"Fabricio de Carvalho",
|
||||
|
|
@ -360,6 +372,7 @@
|
|||
"kalpesh chauhan",
|
||||
"chausony",
|
||||
"CheesySquad",
|
||||
"Chicken",
|
||||
"ChocolateComrade",
|
||||
"choi",
|
||||
"Vadim Choi",
|
||||
|
|
@ -396,6 +409,7 @@
|
|||
"cukomus",
|
||||
"CYCL0YT",
|
||||
"D",
|
||||
"D-Mega",
|
||||
"Dada",
|
||||
"Daivaras",
|
||||
"Dajo6596YT",
|
||||
|
|
@ -422,6 +436,7 @@
|
|||
"Die or Dead",
|
||||
"Привет от детей DeadLine",
|
||||
"deepjith",
|
||||
"dekarl",
|
||||
"deliciouspudding43",
|
||||
"delshe",
|
||||
"Denis",
|
||||
|
|
@ -458,6 +473,7 @@
|
|||
"Dragomir",
|
||||
"Drellsan",
|
||||
"DrGhast",
|
||||
"Dron009",
|
||||
"drov.drov",
|
||||
"Davide DST",
|
||||
"Bruno Duarte",
|
||||
|
|
@ -485,6 +501,7 @@
|
|||
"Elsans320_YT",
|
||||
"Elskoser",
|
||||
"ElVolKo",
|
||||
"ali emad",
|
||||
"Ramy Emad",
|
||||
"Emil",
|
||||
"Kürti Emil",
|
||||
|
|
@ -497,6 +514,7 @@
|
|||
"EnglandFirst",
|
||||
"Enrico",
|
||||
"enzo",
|
||||
"Era",
|
||||
"Erick",
|
||||
"Erkam",
|
||||
"Jonas Ernst",
|
||||
|
|
@ -535,6 +553,7 @@
|
|||
"Federico",
|
||||
"Fedrigo",
|
||||
"Marco Fabián Feijoó",
|
||||
"Fenyx",
|
||||
"Fernando",
|
||||
"David Fernández",
|
||||
"FerranC",
|
||||
|
|
@ -584,6 +603,7 @@
|
|||
"krish gator",
|
||||
"gene.mTs",
|
||||
"GeoMatHeo",
|
||||
"Gerry",
|
||||
"GG (9.2)",
|
||||
"Onkar Ghagarum",
|
||||
"GHAIS",
|
||||
|
|
@ -600,10 +620,13 @@
|
|||
"Giovanny",
|
||||
"Dc superhero girl",
|
||||
"Givij",
|
||||
"Gleb",
|
||||
"Glu10free",
|
||||
"Mr. Glu10free",
|
||||
"Jhon Zion N. delos reyes gmail",
|
||||
"gman_4815",
|
||||
"God丶烛龙",
|
||||
"Colin Goeieman",
|
||||
"박준서(PJS GoodNews)",
|
||||
"gowthamvelkarthik.k",
|
||||
"Nicola Grassi",
|
||||
|
|
@ -622,6 +645,7 @@
|
|||
"Tymoteusz Górski",
|
||||
"Thomas Günther",
|
||||
"H.J.N",
|
||||
"Haasaani",
|
||||
"Hack",
|
||||
"HackPlayer697",
|
||||
"hadi",
|
||||
|
|
@ -708,6 +732,9 @@
|
|||
"Darkness indo",
|
||||
"Indohuman",
|
||||
"IniSaya6666",
|
||||
"inkMedic",
|
||||
"inkMedic💊",
|
||||
"InvisibleDude",
|
||||
"Anestis Ioakimidis",
|
||||
"Dragomir Ioan",
|
||||
"Isa",
|
||||
|
|
@ -717,6 +744,7 @@
|
|||
"Itamar",
|
||||
"ivan",
|
||||
"iViietZ",
|
||||
"MOHD IZWAN",
|
||||
"JaaJ",
|
||||
"Al jabbar",
|
||||
"Jacek",
|
||||
|
|
@ -728,6 +756,7 @@
|
|||
"Martin Jansson",
|
||||
"JasimGamer",
|
||||
"Jason",
|
||||
"Javvaed",
|
||||
"Jbo",
|
||||
"JCIBravo",
|
||||
"Jd",
|
||||
|
|
@ -775,6 +804,7 @@
|
|||
"Oliver Jõgar",
|
||||
"Nackter Jörg",
|
||||
"Calvin Jünemann",
|
||||
"Luis K",
|
||||
"Sayooj k",
|
||||
"K'veen",
|
||||
"Kacper",
|
||||
|
|
@ -787,6 +817,7 @@
|
|||
"Kamal",
|
||||
"Aiman Aryan Kamarajan",
|
||||
"Kamil (Limak09)",
|
||||
"Kamilkampfwagen",
|
||||
"Kaneki",
|
||||
"Smurfit Kappa",
|
||||
"Mustafa Karabacak",
|
||||
|
|
@ -801,10 +832,12 @@
|
|||
"KD",
|
||||
"Kejuxs",
|
||||
"Mani kelidari",
|
||||
"Kelly",
|
||||
"Kelmine",
|
||||
"Kenjie",
|
||||
"Kerfix",
|
||||
"Kerim",
|
||||
"Kevinga2533a",
|
||||
"Khaild1717",
|
||||
"muh khairul",
|
||||
"Khalid",
|
||||
|
|
@ -822,6 +855,7 @@
|
|||
"kira",
|
||||
"kirill",
|
||||
"KirillMasich",
|
||||
"Kittycat41",
|
||||
"Andrew Kmitto",
|
||||
"Philipp Koch",
|
||||
"Kolmat",
|
||||
|
|
@ -921,7 +955,9 @@
|
|||
"Lurã",
|
||||
"Luthy",
|
||||
"Geogre Lyu",
|
||||
"Be aware that m",
|
||||
"M.R.T",
|
||||
"M5TF4",
|
||||
"Mac 143338",
|
||||
"MaceracıMS",
|
||||
"Samuel Maciel",
|
||||
|
|
@ -948,6 +984,7 @@
|
|||
"Marchella",
|
||||
"Marcin",
|
||||
"Marco",
|
||||
"Marcolino",
|
||||
"Filip Marek",
|
||||
"Marcin Marek",
|
||||
"Mariel",
|
||||
|
|
@ -963,7 +1000,9 @@
|
|||
"Taobao Mascot",
|
||||
"Masood",
|
||||
"MasterRyan",
|
||||
"Mateusz",
|
||||
"Mathias",
|
||||
"Mathieu",
|
||||
"matias",
|
||||
"matj1",
|
||||
"Eduardo de Matos",
|
||||
|
|
@ -979,8 +1018,10 @@
|
|||
"German Medin",
|
||||
"Martin Medina",
|
||||
"Mehret Mehanzel",
|
||||
"Mehmet",
|
||||
"Mehrdad",
|
||||
"Kevin Mejía",
|
||||
"Mell",
|
||||
"MereCrack",
|
||||
"Mert",
|
||||
"Meryu07",
|
||||
|
|
@ -1001,6 +1042,7 @@
|
|||
"MinhAn19203",
|
||||
"Azfar Ahmed Mirza",
|
||||
"Deepak Mishra",
|
||||
"Mistetas3002",
|
||||
"Skramh Miugrik",
|
||||
"Mizzzzon",
|
||||
"Mk",
|
||||
|
|
@ -1035,15 +1077,19 @@
|
|||
"MrNexis",
|
||||
"MrS0meone",
|
||||
"Ivan Ms",
|
||||
"MSampic",
|
||||
"Msta",
|
||||
"MT",
|
||||
"MT2087",
|
||||
"Muhammed Muhsin",
|
||||
"MujtabaFR",
|
||||
"Muni",
|
||||
"mustardb",
|
||||
"Hisham Musthafa",
|
||||
"Mohammed Musthafa",
|
||||
"MUZAMMIL",
|
||||
"Mwss",
|
||||
"MYSENIOR",
|
||||
"mythbrk00@gmail.com",
|
||||
"Sajti Márk",
|
||||
"Samuel Mörling",
|
||||
|
|
@ -1055,6 +1101,7 @@
|
|||
"Natasja",
|
||||
"Nathan",
|
||||
"naveentamizhan123456",
|
||||
"Navid (Nasa)",
|
||||
"Nayan",
|
||||
"Nazar",
|
||||
"Nazar_1232",
|
||||
|
|
@ -1065,7 +1112,9 @@
|
|||
"Neel",
|
||||
"Nel",
|
||||
"Nemeil",
|
||||
"Era (Spazton neo)",
|
||||
"Mattia Nepote",
|
||||
"The nerd",
|
||||
"Gabriel Del Nero",
|
||||
"nevergpdia",
|
||||
"Andrew Nevero",
|
||||
|
|
@ -1108,6 +1157,7 @@
|
|||
"Bastián Olea",
|
||||
"Nikita Oleshko",
|
||||
"Omar",
|
||||
"OmarBv",
|
||||
"On3GaMs",
|
||||
"No One",
|
||||
"Adam Oros",
|
||||
|
|
@ -1194,6 +1244,7 @@
|
|||
"Pulidomedia.com",
|
||||
"haris purnama",
|
||||
"GABRIEL PUTRICK",
|
||||
"Bodnár Péter",
|
||||
"Gangler Quentin",
|
||||
"Qwsa",
|
||||
"QŴE",
|
||||
|
|
@ -1201,7 +1252,9 @@
|
|||
"efvdtrrgvvfygttty5 5 r",
|
||||
"Felo Raafat",
|
||||
"Tim Rabatr",
|
||||
"Radfrom",
|
||||
"RadicalGamer",
|
||||
"Radicool",
|
||||
"RafieMY",
|
||||
"raghul",
|
||||
"khaled rahma",
|
||||
|
|
@ -1228,8 +1281,10 @@
|
|||
"Razil",
|
||||
"Jaiden Razo",
|
||||
"RCSV159",
|
||||
"RCTwerk",
|
||||
"Re",
|
||||
"realSamy",
|
||||
"RECRUTA",
|
||||
"REDEJCR",
|
||||
"redyan",
|
||||
"De'Viren Reed",
|
||||
|
|
@ -1248,6 +1303,7 @@
|
|||
"rian",
|
||||
"Bruno Ricardo",
|
||||
"Riccardo",
|
||||
"Richard Lévai (aka ricinoob)",
|
||||
"Rico",
|
||||
"Ridzuan",
|
||||
"Samuel Rieger",
|
||||
|
|
@ -1334,6 +1390,7 @@
|
|||
"Leonardo Henrique da Silva",
|
||||
"Sebastian Silva",
|
||||
"Simotoring",
|
||||
"Pawan Singh sisodiya",
|
||||
"Skick",
|
||||
"sks",
|
||||
"Max Sky",
|
||||
|
|
@ -1344,6 +1401,7 @@
|
|||
"smertfhg",
|
||||
"Nico Smit",
|
||||
"Snack",
|
||||
"Snobbish",
|
||||
"Mahteus Soares",
|
||||
"Matheus Soares",
|
||||
"sobhan",
|
||||
|
|
@ -1360,6 +1418,7 @@
|
|||
"Spielfreake (Garke)",
|
||||
"Spielfream",
|
||||
"Spy",
|
||||
"SqdDoom",
|
||||
"sss",
|
||||
"ST",
|
||||
"Danny Stalman",
|
||||
|
|
@ -1367,6 +1426,7 @@
|
|||
"Bartosz Staniszewski",
|
||||
"Stare",
|
||||
"StarFighter",
|
||||
"Rz Stazzy",
|
||||
"Stealives",
|
||||
"Steffo",
|
||||
"stelios",
|
||||
|
|
@ -1415,6 +1475,7 @@
|
|||
"Nemanja Tekić",
|
||||
"Marcel Teleznob",
|
||||
"TempVolcano3200",
|
||||
"TerfulFellowship47",
|
||||
"Yan Teryokhin",
|
||||
"TestGame1",
|
||||
"TestGame1👽🔥",
|
||||
|
|
@ -1441,12 +1502,14 @@
|
|||
"Tingis2",
|
||||
"Thura Tint",
|
||||
"Nishant Tiwari",
|
||||
"tjkffndeupwfbkh",
|
||||
"Toloche",
|
||||
"Tom",
|
||||
"Juan Pablo Montoya Tomalá",
|
||||
"TomasNoobCz",
|
||||
"tomo",
|
||||
"tongtong",
|
||||
"Top 999",
|
||||
"Tory",
|
||||
"TozeLeal",
|
||||
"Trung Hieu Le Tran",
|
||||
|
|
@ -1467,6 +1530,7 @@
|
|||
"Unknown",
|
||||
"Uros",
|
||||
"clarins usap",
|
||||
"utyrrwq",
|
||||
"Uzinerz",
|
||||
"Shohrux V",
|
||||
"Vader",
|
||||
|
|
@ -1488,6 +1552,7 @@
|
|||
"Robin Vinith",
|
||||
"vinoth",
|
||||
"Vishal",
|
||||
"VoidNumberZero",
|
||||
"Voxel",
|
||||
"Voxel25",
|
||||
"VTOR",
|
||||
|
|
@ -1536,9 +1601,11 @@
|
|||
"Yamir",
|
||||
"YannSonic",
|
||||
"Yantohrmnt401",
|
||||
"Halil Yarkin",
|
||||
"amr yasser",
|
||||
"YellowTractor",
|
||||
"Yasin YILMAZ",
|
||||
"Ymgfr",
|
||||
"yoksoudraft",
|
||||
"Kenneth Yoneyama",
|
||||
"yossef",
|
||||
|
|
@ -1607,6 +1674,7 @@
|
|||
"Юстин Иглин",
|
||||
"Игор",
|
||||
"Кирилл",
|
||||
"клаудкубес",
|
||||
"Климов",
|
||||
"Кирилл Климов",
|
||||
"Андрей Коваленко",
|
||||
|
|
@ -1621,12 +1689,15 @@
|
|||
"Арсений Мостовщиков",
|
||||
"Принцип",
|
||||
"Пук-пук пук-пук",
|
||||
"Пупсєль",
|
||||
"Піптик💖",
|
||||
"Михаил Радионов",
|
||||
"Даниил Рахов \"DaNiiRuSPlay\"",
|
||||
"Рома",
|
||||
"Ромашка :3",
|
||||
"Кирилл Рябцев",
|
||||
"ZEPT\"Александр Фартунов\"",
|
||||
"Эмир",
|
||||
"Өмүрзаков Эрсултан",
|
||||
"Ярослав \"Noiseaholic\"",
|
||||
"қуатжан",
|
||||
|
|
@ -1654,6 +1725,7 @@
|
|||
"فاطمه عباس زاده ۸۴",
|
||||
"فاطمه عباس زاده۸۴",
|
||||
"ستسپ",
|
||||
"سلطان سروش",
|
||||
"محمد وائل سلطان",
|
||||
"ص",
|
||||
"عبداللہ صائم",
|
||||
|
|
@ -1685,6 +1757,7 @@
|
|||
"วีรภัทร",
|
||||
"แมวผงาด(JuniorMeowMeow)",
|
||||
"๖̶ζ͜͡zephyro",
|
||||
"ᗪ|乃|丂Я尺卂",
|
||||
"✰ℭØØҜĬ£$✰",
|
||||
"JPnatu なつ",
|
||||
"クリーバー",
|
||||
|
|
@ -1707,6 +1780,7 @@
|
|||
"志夏君deron",
|
||||
"枫夜",
|
||||
"毛毛毛大毛",
|
||||
"炸弹朋友和Medic药",
|
||||
"熊老三",
|
||||
"盐焗汽水er",
|
||||
"神仙",
|
||||
|
|
@ -1733,6 +1807,7 @@
|
|||
"전감호",
|
||||
"BombsquadKorea 네이버 카페",
|
||||
"Zona-BombSquad",
|
||||
"CrazySquad"
|
||||
"CrazySquad",
|
||||
"Stazzy"
|
||||
]
|
||||
}
|
||||
|
|
|
|||
12
dist/ba_data/data/languages/arabic.json
vendored
12
dist/ba_data/data/languages/arabic.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "يمكنك تغييره مرة واحدة في الموسم",
|
||||
"changeOncePerSeasonError": "يجب عليك الانتظار حتى الموسم القادم لتغيير هذا مجددا (${NUM} أيام )",
|
||||
"customName": "الاسم المخصص",
|
||||
"googlePlayGamesAccountSwitchText": "اذا اردت استخدام حساب غوغل بلاي اخر،\nقم بإستعمال تطبيق غوغل بلاي العاب لتحويله.",
|
||||
"linkAccountsEnterCodeText": "ادخل الرمز",
|
||||
"linkAccountsGenerateCodeText": "انشئ رمز",
|
||||
"linkAccountsInfoText": "(مشاركة تقدمك مع الاجهزة الاخرى)",
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "لربط حسابين, انتج كود على احد الحسابين \nو ادخل هذا الكود على الاخر.\nالتقدم و المخزون سيشتركا.\nيمكنك ربط حتى ${COUNT} حسابات.\n\nكن حذراً; هذا لا يمكن استرجاعه",
|
||||
"linkAccountsText": "ربط حساب",
|
||||
"linkedAccountsText": ": حساباتي المرتبطة",
|
||||
"manageAccountText": "إدارة الحساب",
|
||||
"nameChangeConfirm": "هل تريد تغيير اسم حسابك إلى ${NAME}؟",
|
||||
"resetProgressConfirmNoAchievementsText": "سوف يحذف هذا الخيار تقدمك في الحملات التعاونية ولن يحذف تذاكرك\nلا يمكن إلغاء هذا الخيار\nهل أنت متأكد ؟",
|
||||
"resetProgressConfirmText": ":عند موافقتك على هذا الاخيار سوف يتم\n(حذف انجازاتك وتقدمك الحالي(لكن لن تخسر تَذَاكِرك\nإذا وافقت على هذا القرار لا يمكنك تراجع عنه\nهل أنت متأكد؟",
|
||||
|
|
@ -39,6 +41,7 @@
|
|||
"titleText": "الحساب",
|
||||
"unlinkAccountsInstructionsText": "حدد حسابا لإلغاء ربطه",
|
||||
"unlinkAccountsText": "إلغاء ربط الحسابات",
|
||||
"unlinkLegacyV1AccountsText": "إلغاء ربط الحسابات القديمة (V1)",
|
||||
"v2LinkInstructionsText": "استخدم هذا الارتباط لإنشاء حساب أو تسجيل الدخول.",
|
||||
"viaAccount": "(${NAME} عبر الحساب)",
|
||||
"youAreSignedInAsText": ": قمت بتسجيل الدخول كـ"
|
||||
|
|
@ -546,7 +549,9 @@
|
|||
"deleteText": "حذف",
|
||||
"demoText": "عرض",
|
||||
"denyText": "رفض",
|
||||
"deprecatedText": "إهمال",
|
||||
"desktopResText": "جودة سطح المكتب",
|
||||
"deviceAccountUpgradeText": "تحذير:\nانت مسجل الدهول بحساب الجهاز (${NAME}).\nحسابات الجهاز (Device) سيتم حذفها في المستقبل.\nقم بالتطوير الى حساب V2 اذا اردت ان تقوم بحفظ تقدمك.",
|
||||
"difficultyEasyText": "سهل",
|
||||
"difficultyHardOnlyText": "الوضع الصعب فقط",
|
||||
"difficultyHardText": "صعب",
|
||||
|
|
@ -804,6 +809,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "عذرًا ، خدمة جوجل متعددة اللاعبين لم تعد متاحة.\n أنا أعمل على بديل بأسرع وقت ممكن.\n حتى ذلك الحين ، يرجى تجربة طريقة اتصال أخرى.\n -إريك",
|
||||
"googlePlayPurchasesNotAvailableText": "عمليات شراء جوجل بلاي غير متوفرة.\nقد تحتاج لتحديث تطبيق المتجر.",
|
||||
"googlePlayServicesNotAvailableText": "غوغل بلاي العاب غير متوفر.\nبعض المزايا لن تكون متوفرة.",
|
||||
"googlePlayText": "جوجل بلاي",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "دائما",
|
||||
|
|
@ -1000,6 +1006,7 @@
|
|||
"creditsText": "معلومات",
|
||||
"demoMenuText": "عرض القائمة",
|
||||
"endGameText": "نهاية لعبة",
|
||||
"endTestText": "الاختبار النهائي",
|
||||
"exitGameText": "الخروج من اللعبة",
|
||||
"exitToMenuText": "هل تريد الخروج من القائمة؟",
|
||||
"howToPlayText": "كيف ألعب",
|
||||
|
|
@ -1019,6 +1026,7 @@
|
|||
"maxConnectionsText": "اتصالات مكتمل",
|
||||
"maxPartySizeText": "أقصى حجم للحفلة",
|
||||
"maxPlayersText": "عدد لاعبين مكتمل",
|
||||
"merchText": "ميرش!",
|
||||
"modeArcadeText": "وضع اللهو",
|
||||
"modeClassicText": "الوضع التقليدي",
|
||||
"modeDemoText": "الوضع التجريبي",
|
||||
|
|
@ -1058,6 +1066,7 @@
|
|||
"notSignedInErrorText": "يجب ان تسجل الدخول لتفعل هذا",
|
||||
"notSignedInGooglePlayErrorText": "عليك تسجيل الدخول لجوجل بلاي لتفعل هذا",
|
||||
"notSignedInText": "لم تقم بتسجيل الدخول",
|
||||
"notUsingAccountText": "ملاحظة: حساب ${SERVICE} متجاهل.\nقم بالتوجه الى 'الحساب -> تسجيل الدخول بواسطة ${SERVICE}' اذا اردت استعماله.",
|
||||
"nothingIsSelectedErrorText": "لا شئ تم اختياره!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "إيقاف",
|
||||
|
|
@ -1521,6 +1530,7 @@
|
|||
"Italian": "الإيطالي",
|
||||
"Japanese": "اليابانية",
|
||||
"Korean": "الكورية",
|
||||
"Malay": "لغة الملايو",
|
||||
"Persian": "اللغة الفارسية",
|
||||
"Polish": "البولندي",
|
||||
"Portuguese": "البرتغالية",
|
||||
|
|
@ -1802,6 +1812,7 @@
|
|||
"useDefaultText": "استخدام الإفتراضي",
|
||||
"usesExternalControllerText": "هذه اللعبة تستخدم يد تحكم خارجية للإدخال",
|
||||
"usingItunesText": "...استخدام تطبيق الموسيقى للموسيقى التصويرية",
|
||||
"v2AccountLinkingInfoText": "اذا اردت ربط حسابات V2، قم بالتوجه الى 'ادارة الحساب'.",
|
||||
"validatingTestBuildText": "التحقق من صحة البناء",
|
||||
"victoryText": "!النصر",
|
||||
"voteDelayText": "ثانية ${NUMBER} لا يمكنك التصويت ثانية حتى",
|
||||
|
|
@ -1834,6 +1845,7 @@
|
|||
},
|
||||
"waveText": "موجة",
|
||||
"wellSureText": "!حسنا طبعا",
|
||||
"whatIsThisText": "ما هذا؟",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwinRemoteحقوق التأليف والنشر ل"
|
||||
},
|
||||
|
|
|
|||
63
dist/ba_data/data/languages/chinese.json
vendored
63
dist/ba_data/data/languages/chinese.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "在每个赛季中你只能更改它一次。",
|
||||
"changeOncePerSeasonError": "你需要等到下个赛季才能对它再次更改 (还有${NUM}天)",
|
||||
"customName": "玩家姓名",
|
||||
"googlePlayGamesAccountSwitchText": "如果你想登录两个不同的谷歌账户,\n请使用Play游戏APP来操作~",
|
||||
"linkAccountsEnterCodeText": "输入代码",
|
||||
"linkAccountsGenerateCodeText": "生成代码",
|
||||
"linkAccountsInfoText": "(在不同的平台上同步游戏进程)",
|
||||
|
|
@ -42,6 +43,7 @@
|
|||
"titleText": "账号",
|
||||
"unlinkAccountsInstructionsText": "选择要取消关联的帐户",
|
||||
"unlinkAccountsText": "取消连结帐户",
|
||||
"unlinkLegacyV1AccountsText": "取消连接旧版(V1)账户",
|
||||
"v2LinkInstructionsText": "扫码或使用链接来登录或注册新账户",
|
||||
"viaAccount": "(不可用名称 ${NAME})",
|
||||
"youAreLoggedInAsText": "您已登录为",
|
||||
|
|
@ -549,7 +551,9 @@
|
|||
"deleteText": "删除",
|
||||
"demoText": "演示",
|
||||
"denyText": "拒绝",
|
||||
"deprecatedText": "已弃用",
|
||||
"desktopResText": "桌面分辨率",
|
||||
"deviceAccountUpgradeText": "紧急警告:\n你正在使用本地账户登录! (${NAME})\n此账户会在未来升级中被删除!!\n~如果想保持账号,请升级到v2账户~",
|
||||
"difficultyEasyText": "简单",
|
||||
"difficultyHardOnlyText": "仅限困难模式",
|
||||
"difficultyHardText": "困难",
|
||||
|
|
@ -729,7 +733,7 @@
|
|||
"inviteAFriendText": "好友还未加入该游戏?邀请他们\n一起玩,新玩家可获得${COUNT}张免费点券。",
|
||||
"inviteFriendsText": "邀请朋友",
|
||||
"joinPublicPartyDescriptionText": "加入一个公开派对",
|
||||
"localNetworkDescriptionText": "加入一个附近的派对(通过局域网,蓝牙,etc等)",
|
||||
"localNetworkDescriptionText": "加入一个局域网派对(通过wifi,蓝牙,etc等)",
|
||||
"localNetworkText": "本地网络",
|
||||
"makePartyPrivateText": "将我的派对变成私人派对",
|
||||
"makePartyPublicText": "将我的派对变成公开派对",
|
||||
|
|
@ -775,7 +779,7 @@
|
|||
"showMyAddressText": "显示我的地址",
|
||||
"startHostingPaidText": "创建需花费 ${COST}",
|
||||
"startHostingText": "创建",
|
||||
"startStopHostingMinutesText": "你可以在接下来的${MINUTES}分钟内启用会停止一个免费的主机",
|
||||
"startStopHostingMinutesText": "你还可以使用${MINUTES}分钟的免费服务器",
|
||||
"stopHostingText": "停止主机",
|
||||
"titleText": "多人游戏",
|
||||
"wifiDirectDescriptionBottomText": "如果所有设备都设有 Wi-Fi Direct 面板,那他们应该可以使用通过它来找到彼此,\n然后相互连接。一旦所有设备都相互连接上了,你就可以通过“本地网络”选项卡\n在此组织派对,常规的无线局域网也是一样。\n\n如要取得最佳效果,Wi-Fi Direct 创建者也应是${APP_NAME} 派对的创建者",
|
||||
|
|
@ -812,6 +816,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "抱歉,Google的多人游戏服务已不可用。\n我将尽快更换新的替代服务。\n在此之前,请尝试其他连接方法。\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Google商店购买不可用!\n请安装谷歌框架或更新Google服务。",
|
||||
"googlePlayServicesNotAvailableText": "Google Play服务不可用\n某些功能可能会被禁用",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "总是",
|
||||
|
|
@ -863,9 +868,9 @@
|
|||
"powerupShieldDescriptionText": "能吸收一些伤害,\n关键时刻可能会有用。",
|
||||
"powerupShieldNameText": "能量护盾",
|
||||
"powerupStickyBombsDescriptionText": "黏在任何碰到的东西上,\n然后就等着看烟花吧。",
|
||||
"powerupStickyBombsNameText": "粘性炸弹",
|
||||
"powerupsSubtitleText": "当然,没有提升器的游戏很难通关:",
|
||||
"powerupsText": "加成",
|
||||
"powerupStickyBombsNameText": "黏黏炸弹",
|
||||
"powerupsSubtitleText": "当然,没有道具的游戏很难通关:",
|
||||
"powerupsText": "道具",
|
||||
"punchInfoText": "拳击\n跑得越快,拳击的伤害\n越高。所以像疯子一样\n旋转跳跃吧!",
|
||||
"runInfoText": "冲刺\n按任意键冲刺,如果你用手柄操作将会容易许多。\n冲刺跑的虽快,但会造成转向困难。且冲且珍惜。",
|
||||
"someDaysText": "有些时候你只是想挥拳猛击某些东西,或把什么东西给炸飞。",
|
||||
|
|
@ -875,7 +880,7 @@
|
|||
},
|
||||
"holdAnyButtonText": "<按住任意按钮>",
|
||||
"holdAnyKeyText": "<按住任何键>",
|
||||
"hostIsNavigatingMenusText": "- ${HOST}像大老板一样观察主界面 -",
|
||||
"hostIsNavigatingMenusText": "- ${HOST}像皇帝一样控制主菜单 -",
|
||||
"importPlaylistCodeInstructionsText": "用代码来导入列表",
|
||||
"importPlaylistSuccessText": "成功导入${TYPE}列表 '${NAME}'",
|
||||
"importText": "导入",
|
||||
|
|
@ -888,7 +893,7 @@
|
|||
"cantKickHostError": "你不能踢房主啊喂!",
|
||||
"chatBlockedText": "玩家 ${NAME} 被禁言 ${TIME} 秒.",
|
||||
"connectedToGameText": "加入 '${NAME}'",
|
||||
"connectedToPartyText": "加入${NAME}的派对!",
|
||||
"connectedToPartyText": "加入${NAME}的房间!",
|
||||
"connectingToPartyText": "正在连接...",
|
||||
"connectionFailedHostAlreadyInPartyText": "连接失败;创建者正在另一派对中。",
|
||||
"connectionFailedPartyFullText": "连接出错:房间满员了…",
|
||||
|
|
@ -927,7 +932,7 @@
|
|||
"playerJoinedPartyText": "${NAME}加入了游戏!",
|
||||
"playerLeftPartyText": "${NAME}离开了游戏。",
|
||||
"rejectingInviteAlreadyInPartyText": "拒绝邀请(已经在派对中)。",
|
||||
"serverRestartingText": "服务器重启下下,请各位重新加入哈,,",
|
||||
"serverRestartingText": "服务器自动重启中,请重新加入..",
|
||||
"serverShuttingDownText": "服务器正在关机…",
|
||||
"signInErrorText": "登陆出错啦~",
|
||||
"signInNoConnectionText": "哎呀,无法登陆。(网络连接有故障?)",
|
||||
|
|
@ -1030,6 +1035,7 @@
|
|||
"maxConnectionsText": "最大连接数",
|
||||
"maxPartySizeText": "最大派对规模",
|
||||
"maxPlayersText": "最多人数",
|
||||
"merchText": "来买周边吧~",
|
||||
"modeArcadeText": "街机模式",
|
||||
"modeClassicText": "经典模式",
|
||||
"modeDemoText": "演示模式",
|
||||
|
|
@ -1070,6 +1076,7 @@
|
|||
"notSignedInErrorText": "您必须登录到您的帐户。",
|
||||
"notSignedInGooglePlayErrorText": "您必须通过Google Play登录。",
|
||||
"notSignedInText": "(未登录)",
|
||||
"notUsingAccountText": "注意:已忽略${SERVICE}账户的自动登录\n如果你想用它登录,前往“账户->使用${SERVICE}登录”~",
|
||||
"nothingIsSelectedErrorText": "未选择任何内容!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "关",
|
||||
|
|
@ -1131,7 +1138,11 @@
|
|||
"pleaseWaitText": "请稍等...",
|
||||
"pluginClassLoadErrorText": "加载'${PLUGIN}'插件时出错了耶: ${ERROR}",
|
||||
"pluginInitErrorText": "初始化'${PLUGIN}'插件失败了啦: ${ERROR}",
|
||||
"pluginSettingsText": "插件设置喵",
|
||||
"pluginsAutoEnableNewText": "自动启用新插件",
|
||||
"pluginsDetectedText": "新插件安装成功,请重启游戏或在设置中设置它们~",
|
||||
"pluginsDisableAllText": "禁用所有插件",
|
||||
"pluginsEnableAllText": "启用所有插件",
|
||||
"pluginsRemovedText": "有${NUM}个插件被删除了...",
|
||||
"pluginsText": "插件",
|
||||
"practiceText": "练习",
|
||||
|
|
@ -1268,6 +1279,7 @@
|
|||
"netTestingText": "网络测试",
|
||||
"resetText": "恢复默认值",
|
||||
"showBombTrajectoriesText": "显示炸弹轨迹",
|
||||
"showInGamePingText": "显示游戏延迟",
|
||||
"showPlayerNamesText": "显示玩家名字",
|
||||
"showUserModsText": "显示修改文件夹",
|
||||
"titleText": "高级",
|
||||
|
|
@ -1401,11 +1413,11 @@
|
|||
"Flopsy": "萌兔耷拉",
|
||||
"Frosty": "冰冰",
|
||||
"Gretel": "格蕾特",
|
||||
"Grumbledorf": "格朗布多尔夫",
|
||||
"Grumbledorf": "男巫",
|
||||
"Jack Morgan": "杰克摩根",
|
||||
"Kronk": "克罗克",
|
||||
"Lee": "李",
|
||||
"Lucky": "好运者",
|
||||
"Lucky": "幸运儿",
|
||||
"Mel": "梅尔",
|
||||
"Middle-Man": "平衡之尊",
|
||||
"Minimus": "迷你姆斯",
|
||||
|
|
@ -1541,6 +1553,7 @@
|
|||
"Italian": "意大利语",
|
||||
"Japanese": "日本语",
|
||||
"Korean": "朝鲜语",
|
||||
"Malay": "马来语",
|
||||
"Persian": "波斯文",
|
||||
"Polish": "波兰语",
|
||||
"Portuguese": "葡萄牙语",
|
||||
|
|
@ -1655,7 +1668,7 @@
|
|||
"You got ${COUNT} tickets!": "你获得了${COUNT}点券!",
|
||||
"You got a ${ITEM}!": "你获得了一个${ITEM}!",
|
||||
"You have been promoted to a new league; congratulations!": "你已被升级至一个全新联赛;恭喜!",
|
||||
"You must update to a newer version of the app to do this.": "你必須先更新遊戲才能這麼做。",
|
||||
"You must update to a newer version of the app to do this.": "你必须升级到最新版本才可以",
|
||||
"You must update to the newest version of the game to do this.": "你必须更新到最新版来做到这一点。",
|
||||
"You must wait a few seconds before entering a new code.": "你必须在输入新代码前稍等几秒。",
|
||||
"You ranked #${RANK} in the last tournament. Thanks for playing!": "你在上一场锦标赛中排名#${RANK}。多谢玩赏本游戏!",
|
||||
|
|
@ -1728,11 +1741,11 @@
|
|||
"Hold down any button to run. You'll get places faster\nbut won't turn very well, so watch out for cliffs.": "按住任意按钮来奔跑。你将会更快地抵达一些地方,\n但是转弯效果并不好,所以当心悬崖。",
|
||||
"Ice bombs are not very powerful, but they freeze\nwhoever they hit, leaving them vulnerable to shattering.": "寒冰炸弹并非很厉害,但它们能够冻结\n任何被击中者,使他们极易粉碎。",
|
||||
"If someone picks you up, punch them and they'll let go.\nThis works in real life too.": "如果有人将你提起,出拳攻击他们,他们便会放手。\n这在现实生活中同样有效。",
|
||||
"If you are short on controllers, install the '${REMOTE_APP_NAME}' app\non your mobile devices to use them as controllers.": "如果您缺控制器,在手機上安裝「${REMOTE_APP_NAME}」\n並用手機當控制器。",
|
||||
"If you are short on controllers, install the '${REMOTE_APP_NAME}' app\non your mobile devices to use them as controllers.": "如果您缺控制器,可以在手机安装「${REMOTE_APP_NAME}」\n然后手机就可以当作控制器啦~",
|
||||
"If you are short on controllers, install the 'BombSquad Remote' app\non your iOS or Android devices to use them as controllers.": "如果你没有手柄,请在你的iOS或Android设备上安装\n“BombSquad Remote”应用程序,并将它们作为手柄使用。",
|
||||
"If you get a sticky-bomb stuck to you, jump around and spin in circles. You might\nshake the bomb off, or if nothing else your last moments will be entertaining.": "如果一个黏黏弹将你困住,你应该四处跳动并转圈。你可能\n将炸弹抖落,或如果没有其他办法,你最后的时刻将是有趣的。",
|
||||
"If you kill an enemy in one hit you get double points for it.": "如果你一击杀死一个敌人,你将获得双倍积分。",
|
||||
"If you pick up a curse, your only hope for survival is to\nfind a health powerup in the next few seconds.": "如果你捡到一个诅咒之盒,你唯一的生存希望是\n在接下来的几秒内找到一个生命值提升器。",
|
||||
"If you pick up a curse, your only hope for survival is to\nfind a health powerup in the next few seconds.": "如果你捡到一个诅咒之盒,你唯一的生存希望是\n在接下来的几秒内找到一个加血包。",
|
||||
"If you stay in one place, you're toast. Run and dodge to survive..": "如果你停留在一个地方,你就完了。为了生存而奔跑和躲避……",
|
||||
"If you've got lots of players coming and going, turn on 'auto-kick-idle-players'\nunder settings in case anyone forgets to leave the game.": "如果众多玩家进进出出,在设置下打开“自动踢出闲置玩家”,以防\n任何玩家忘记离开游戏。",
|
||||
"If your device gets too warm or you'd like to conserve battery power,\nturn down \"Visuals\" or \"Resolution\" in Settings->Graphics": "如果你的设备过热,或者你想要节省电池电量,\n则在设置->图形中调低“视觉效果”或“分辨率”",
|
||||
|
|
@ -1780,22 +1793,22 @@
|
|||
"phrase09Text": "啊,这样好多了。",
|
||||
"phrase10Text": "奔跑也会发挥作用。",
|
||||
"phrase11Text": "按住任意按钮来奔跑。",
|
||||
"phrase12Text": "如要获得超赞的出拳,请尝试持续奔跑并旋转。",
|
||||
"phrase13Text": "啊;非常不好意思,${NAME}。",
|
||||
"phrase12Text": "想成为一拳超人,可以尝试边跑边旋转。",
|
||||
"phrase13Text": "啊;真抱歉啊,${NAME}。(狗头)",
|
||||
"phrase14Text": "你可以捡起并投掷物体,如旗帜或${NAME}。",
|
||||
"phrase15Text": "最后,还有炸弹。",
|
||||
"phrase16Text": "投掷炸弹需要练习。",
|
||||
"phrase17Text": "哎哟!这一下投的不咋地啊。",
|
||||
"phrase18Text": "移动有助你投掷得更远。",
|
||||
"phrase17Text": "大家不要学我这样丢...",
|
||||
"phrase18Text": "跑起来有助你投掷得更远。",
|
||||
"phrase19Text": "跳跃有助你投掷得更高。",
|
||||
"phrase20Text": "“鞭打”你的炸弹以抛出更远的距离。",
|
||||
"phrase21Text": "定时你的炸弹可能会非常棘手。",
|
||||
"phrase21Text": "你还要卡准时机丢出炸弹。",
|
||||
"phrase22Text": "我靠。",
|
||||
"phrase23Text": "尝试将导火线“爆燃”一秒或两秒。",
|
||||
"phrase24Text": "万岁!爆燃超赞。",
|
||||
"phrase25Text": "好吧,已经很不错了。",
|
||||
"phrase26Text": "去完成你的任务吧,老铁!",
|
||||
"phrase27Text": "记住你的训练,你会活着回来的!",
|
||||
"phrase23Text": "可以让火线先燃烧一秒或两秒。",
|
||||
"phrase24Text": "好耶!差点秒杀~",
|
||||
"phrase25Text": "好了,教程先到这里吧。",
|
||||
"phrase26Text": "先尝试一波吧,老铁!",
|
||||
"phrase27Text": "记住刚刚的教程,你会活着回来的!",
|
||||
"phrase28Text": "......好吧,也许...",
|
||||
"phrase29Text": "祝好运!",
|
||||
"randomName1Text": "弗雷德",
|
||||
|
|
@ -1824,6 +1837,7 @@
|
|||
"usesExternalControllerText": "该游戏使用外部手柄进行输入。",
|
||||
"usingItunesText": "使用音乐应用设置背景音乐……",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "请确认iTunes中随机播放已开启且重复全部歌曲。",
|
||||
"v2AccountLinkingInfoText": "要连接V2账户,请点击“管理账户”~",
|
||||
"validatingTestBuildText": "测试版验证中……",
|
||||
"victoryText": "胜利!",
|
||||
"voteDelayText": "${NUMBER} 秒内你不能发起另一个投票",
|
||||
|
|
@ -1831,7 +1845,7 @@
|
|||
"votedAlreadyText": "你已经投过票啦!",
|
||||
"votesNeededText": "通过需要 ${NUMBER} 个投票",
|
||||
"vsText": "vs.",
|
||||
"waitingForHostText": "(等待${HOST}以继续)",
|
||||
"waitingForHostText": "(请等待${HOST}继续游戏)",
|
||||
"waitingForPlayersText": "等待玩家的加入……",
|
||||
"waitingInLineText": "正在排队等候(人满为患)...",
|
||||
"watchAVideoText": "看一个小广告视频",
|
||||
|
|
@ -1856,6 +1870,7 @@
|
|||
},
|
||||
"waveText": "波",
|
||||
"wellSureText": "确定!",
|
||||
"whatIsThisText": "这啥玩意??",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote版权所有"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
"changeOncePerSeason": "每一賽季只有一次更改機會",
|
||||
"changeOncePerSeasonError": "您必須等${NUM}天到下個賽季改變此選項",
|
||||
"customName": "自定義名稱",
|
||||
"googlePlayGamesAccountSwitchText": "如果您想使用其他 Google 帳戶,\n使用 Google Play 遊戲應用程序進行切換。",
|
||||
"linkAccountsEnterCodeText": "輸入代碼",
|
||||
"linkAccountsGenerateCodeText": "生成代碼",
|
||||
"linkAccountsInfoText": "(在不同的平台上共享遊戲進度)",
|
||||
|
|
@ -37,6 +38,7 @@
|
|||
"titleText": "帳號",
|
||||
"unlinkAccountsInstructionsText": "選擇一個要解除連結的帳號",
|
||||
"unlinkAccountsText": "解除連結帳號",
|
||||
"unlinkLegacyV1AccountsText": "取消鏈接舊版(V1)賬戶",
|
||||
"v2LinkInstructionsText": "使用此鏈接新建或登錄賬戶",
|
||||
"viaAccount": "(透過帳號 ${NAME})",
|
||||
"youAreSignedInAsText": "您以這帳號登入:"
|
||||
|
|
@ -543,7 +545,9 @@
|
|||
"deleteText": "刪除",
|
||||
"demoText": "演示",
|
||||
"denyText": "拒絕",
|
||||
"deprecatedText": "棄用",
|
||||
"desktopResText": "桌面分辨率",
|
||||
"deviceAccountUpgradeText": "警告:\n您已使用設備帳戶(${NAME})登錄。\n設備帳戶將在未來的更新中刪除。\n如果您想保留賬戶,請升級到 V2 帳戶。",
|
||||
"difficultyEasyText": "簡單",
|
||||
"difficultyHardOnlyText": "僅困難模式",
|
||||
"difficultyHardText": "困難",
|
||||
|
|
@ -801,6 +805,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "抱歉,Google的多人遊戲服務不再可用。\n我將盡快更換新的替代服務。\n在此之前,請嘗試其他連接方法。\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Google Play購買不可用\n你可能需要更新你的Google Play商店組件",
|
||||
"googlePlayServicesNotAvailableText": "Google play當前不可用\n一些功能將會被禁用",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "總是",
|
||||
|
|
@ -1017,6 +1022,7 @@
|
|||
"maxConnectionsText": "最大連接數",
|
||||
"maxPartySizeText": "最大派對規模",
|
||||
"maxPlayersText": "最多人數",
|
||||
"merchText": "周邊",
|
||||
"modeArcadeText": "街機模式",
|
||||
"modeClassicText": "經典模式",
|
||||
"modeDemoText": "演示模式",
|
||||
|
|
@ -1056,6 +1062,7 @@
|
|||
"notSignedInErrorText": "你必須登入來進行該操作.",
|
||||
"notSignedInGooglePlayErrorText": "您必須通過Google Play登錄",
|
||||
"notSignedInText": "(未登錄)",
|
||||
"notUsingAccountText": "注意:忽略 ${SERVICE} 帳戶。\n如果您想使用它,請轉到“帳戶 -> 使用 ${SERVICE} 登錄”。",
|
||||
"nothingIsSelectedErrorText": "未選擇任何內容",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "關",
|
||||
|
|
@ -1519,6 +1526,7 @@
|
|||
"Italian": "意大利語",
|
||||
"Japanese": "日語",
|
||||
"Korean": "朝鮮語",
|
||||
"Malay": "馬來語",
|
||||
"Persian": "波斯文",
|
||||
"Polish": "波蘭語",
|
||||
"Portuguese": "葡萄牙語",
|
||||
|
|
@ -1800,6 +1808,7 @@
|
|||
"useDefaultText": "使用默認值",
|
||||
"usesExternalControllerText": "該遊戲使用外部手柄進行接入",
|
||||
"usingItunesText": "使用音樂軟件設置背景音樂...",
|
||||
"v2AccountLinkingInfoText": "要鏈接 V2 帳戶,請使用“管理帳戶”按鈕。",
|
||||
"validatingTestBuildText": "測試版驗證中",
|
||||
"victoryText": "勝利!",
|
||||
"voteDelayText": "你不能在${NUMBER}內發起一個新的投票",
|
||||
|
|
@ -1832,6 +1841,7 @@
|
|||
},
|
||||
"waveText": "波",
|
||||
"wellSureText": "確定!",
|
||||
"whatIsThisText": "這是什麼?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote版權擁有©"
|
||||
},
|
||||
|
|
|
|||
10
dist/ba_data/data/languages/czech.json
vendored
10
dist/ba_data/data/languages/czech.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Lze změnit pouze jednou za sezónu.",
|
||||
"changeOncePerSeasonError": "Chcete-li toto změnit znovu, musíte počkat na další sezónu (${NUM} days)",
|
||||
"customName": "Vlastní Jméno",
|
||||
"googlePlayGamesAccountSwitchText": "Pokud chcete použít jiný Google účet,\npoužijte pro změnu aplikaci Google Play Hry.",
|
||||
"linkAccountsEnterCodeText": "Vložit kód",
|
||||
"linkAccountsGenerateCodeText": "Generovat kód",
|
||||
"linkAccountsInfoText": "(sdílení postupu mezi různými zařízeními)",
|
||||
|
|
@ -43,6 +44,7 @@
|
|||
"titleText": "Profil",
|
||||
"unlinkAccountsInstructionsText": "Zvolte účet k odpojení",
|
||||
"unlinkAccountsText": "Odpojit účty",
|
||||
"unlinkLegacyV1AccountsText": "na rozdíl od starších účtů (V1).",
|
||||
"v2LinkInstructionsText": "Použijte tento odkaz pro vytvoření účtu nebo přihlášení.",
|
||||
"viaAccount": "(přes účet ${NAME})",
|
||||
"youAreLoggedInAsText": "Jste přihlášen jako:",
|
||||
|
|
@ -553,7 +555,9 @@
|
|||
"deleteText": "Vymaž",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Zakázat",
|
||||
"deprecatedText": "Zastaralé",
|
||||
"desktopResText": "Rozlišení Plochy",
|
||||
"deviceAccountUpgradeText": "Varování:\nJste přihlášeni na účet dostupný pouze na tomto zařízení\n(${NAME}).\nTyto účty budou v příští aktualizaci odstraněny.",
|
||||
"difficultyEasyText": "Lehká",
|
||||
"difficultyHardOnlyText": "Pouze Těžký Mód",
|
||||
"difficultyHardText": "Těžká",
|
||||
|
|
@ -815,6 +819,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Litujeme, služba pro více hráčů Google již není k dispozici.\n Pracuji na výměně co nejrychleji.\n Do té doby zkuste jiný způsob připojení.\n -Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Nákupy na Google Play nejsou k dispozici.\nMožná budete muset aktualizovat obchod play.",
|
||||
"googlePlayServicesNotAvailableText": "Služby Google play nejsou dostupné.\nNěkteré funkce mohou být zakázány.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Vždy",
|
||||
|
|
@ -1033,6 +1038,7 @@
|
|||
"maxConnectionsText": "Max připojitelných hráčů",
|
||||
"maxPartySizeText": "Maximální velikost party",
|
||||
"maxPlayersText": "Max hráčů",
|
||||
"merchText": "Pro fanoušky!",
|
||||
"modeArcadeText": "Arkádový mód",
|
||||
"modeClassicText": "Klasický mód",
|
||||
"modeDemoText": "Ukázkový mód",
|
||||
|
|
@ -1073,6 +1079,7 @@
|
|||
"notSignedInErrorText": "Pro tuto akci se musíte přihlásit",
|
||||
"notSignedInGooglePlayErrorText": "Pro tuto akci se musíte přihlásit přes Google Play",
|
||||
"notSignedInText": "nepřihlášen",
|
||||
"notUsingAccountText": "Poznámka: nevyužívaný ${SERVICE} account.\nJděte do 'Účet -> Přihlásit se službou ${SERVICE}' pokud chcete účet používat.",
|
||||
"nothingIsSelectedErrorText": "Nic není vybráno!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Vyp",
|
||||
|
|
@ -1542,6 +1549,7 @@
|
|||
"Italian": "Italština",
|
||||
"Japanese": "Japonština",
|
||||
"Korean": "Korejština",
|
||||
"Malay": "Malajština",
|
||||
"Persian": "Perština",
|
||||
"Polish": "Polština",
|
||||
"Portuguese": "Portugalština",
|
||||
|
|
@ -1825,6 +1833,7 @@
|
|||
"usesExternalControllerText": "Tato hra používá jako vstup externí ovladač.",
|
||||
"usingItunesText": "Používám Music App pro soundtrack",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Ujistěte se prosím, že je zaplý shuffle, a opakovat VŠE v iTunes,",
|
||||
"v2AccountLinkingInfoText": "Pro propojení V2 účtů, stiskněte tlačítko 'Spravovat Účet'",
|
||||
"validatingTestBuildText": "Ověřuji Testovací Build...",
|
||||
"victoryText": "Vítězství!!!",
|
||||
"voteDelayText": "Nelze spustit další hlas za ${NUMBER} sekund",
|
||||
|
|
@ -1857,6 +1866,7 @@
|
|||
},
|
||||
"waveText": "Vlna",
|
||||
"wellSureText": "Nuže dobrá!",
|
||||
"whatIsThisText": "Co je tohle?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
},
|
||||
|
|
|
|||
15
dist/ba_data/data/languages/english.json
vendored
15
dist/ba_data/data/languages/english.json
vendored
|
|
@ -7,6 +7,7 @@
|
|||
"changeOncePerSeason": "You can only change this once per season.",
|
||||
"changeOncePerSeasonError": "You must wait until next season to change this again (${NUM} days)",
|
||||
"customName": "Custom Name",
|
||||
"googlePlayGamesAccountSwitchText": "If you want to use a different Google account,\nuse the Google Play Games app to switch.",
|
||||
"linkAccountsEnterCodeText": "Enter Code",
|
||||
"linkAccountsGenerateCodeText": "Generate Code",
|
||||
"linkAccountsInfoText": "(share progress across different platforms)",
|
||||
|
|
@ -37,6 +38,7 @@
|
|||
"titleText": "Account",
|
||||
"unlinkAccountsInstructionsText": "Select an account to unlink",
|
||||
"unlinkAccountsText": "Unlink Accounts",
|
||||
"unlinkLegacyV1AccountsText": "Unlink Legacy (V1) Accounts",
|
||||
"v2LinkInstructionsText": "Use this link to create an account or sign in.",
|
||||
"viaAccount": "(via account ${NAME})",
|
||||
"youAreSignedInAsText": "You are signed in as:"
|
||||
|
|
@ -545,7 +547,9 @@
|
|||
"deleteText": "Delete",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Deny",
|
||||
"deprecatedText": "Deprecated",
|
||||
"desktopResText": "Desktop Res",
|
||||
"deviceAccountUpgradeText": "Warning:\nYou are signed in with a device account (${NAME}).\nDevice accounts will be removed in a future update.\nUpgrade to a V2 Account if you want to keep your progress.",
|
||||
"difficultyEasyText": "Easy",
|
||||
"difficultyHardOnlyText": "Hard Mode Only",
|
||||
"difficultyHardText": "Hard",
|
||||
|
|
@ -803,6 +807,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Sorry, Google’s multiplayer service is no longer available.\nI am working on a replacement as fast as possible.\nUntil then, please try another connection method.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Google Play purchases are not available.\nYou may need to update your store app.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play Services is not available.\nSome app functionality may be disabled.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Always",
|
||||
|
|
@ -1027,6 +1032,7 @@
|
|||
"maxConnectionsText": "Max Connections",
|
||||
"maxPartySizeText": "Max Party Size",
|
||||
"maxPlayersText": "Max Players",
|
||||
"merchText": "Merch!",
|
||||
"modeArcadeText": "Arcade Mode",
|
||||
"modeClassicText": "Classic Mode",
|
||||
"modeDemoText": "Demo Mode",
|
||||
|
|
@ -1066,6 +1072,7 @@
|
|||
"notSignedInErrorText": "You must sign in to do this.",
|
||||
"notSignedInGooglePlayErrorText": "You must sign in with Google Play to do this.",
|
||||
"notSignedInText": "not signed in",
|
||||
"notUsingAccountText": "Note: ignoring ${SERVICE} account.\nGo to 'Account -> Sign in with ${SERVICE}' if you want to use it.",
|
||||
"nothingIsSelectedErrorText": "Nothing is selected!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Off",
|
||||
|
|
@ -1123,7 +1130,11 @@
|
|||
"pleaseWaitText": "Please wait...",
|
||||
"pluginClassLoadErrorText": "Error loading plugin class '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Error initing plugin '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Plugin Settings",
|
||||
"pluginsAutoEnableNewText": "Auto Enable New Plugins",
|
||||
"pluginsDetectedText": "New plugin(s) detected. Restart to activate them, or configure them in settings.",
|
||||
"pluginsDisableAllText": "Disable All Plugins",
|
||||
"pluginsEnableAllText": "Enable All Plugins",
|
||||
"pluginsRemovedText": "${NUM} plugin(s) no longer found.",
|
||||
"pluginsText": "Plugins",
|
||||
"practiceText": "Practice",
|
||||
|
|
@ -1258,6 +1269,7 @@
|
|||
"netTestingText": "Network Testing",
|
||||
"resetText": "Reset",
|
||||
"showBombTrajectoriesText": "Show Bomb Trajectories",
|
||||
"showInGamePingText": "Show In-Game Ping",
|
||||
"showPlayerNamesText": "Show Player Names",
|
||||
"showUserModsText": "Show Mods Folder",
|
||||
"titleText": "Advanced",
|
||||
|
|
@ -1528,6 +1540,7 @@
|
|||
"Italian": null,
|
||||
"Japanese": null,
|
||||
"Korean": null,
|
||||
"Malay": null,
|
||||
"Persian": null,
|
||||
"Polish": null,
|
||||
"Portuguese": null,
|
||||
|
|
@ -1809,6 +1822,7 @@
|
|||
"useDefaultText": "Use Default",
|
||||
"usesExternalControllerText": "This game uses an external controller for input.",
|
||||
"usingItunesText": "Using Music App for soundtrack...",
|
||||
"v2AccountLinkingInfoText": "To link V2 accounts, use the 'Manage Account' button.",
|
||||
"validatingTestBuildText": "Validating Test Build...",
|
||||
"victoryText": "Victory!",
|
||||
"voteDelayText": "You can't start another vote for ${NUMBER} seconds",
|
||||
|
|
@ -1841,6 +1855,7 @@
|
|||
},
|
||||
"waveText": "Wave",
|
||||
"wellSureText": "Well Sure!",
|
||||
"whatIsThisText": "What is this?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
},
|
||||
|
|
|
|||
9
dist/ba_data/data/languages/esperanto.json
vendored
9
dist/ba_data/data/languages/esperanto.json
vendored
|
|
@ -1,18 +1,27 @@
|
|||
{
|
||||
"accountSettingsWindow": {
|
||||
"accountNameRules": "Kontoj nomoj ne povas enhavi emoji aŭ aliajn specialajn signojn",
|
||||
"accountProfileText": "(konta profilo)",
|
||||
"accountsText": "Kontoj",
|
||||
"achievementProgressText": "Atingoj: ${COUNT} el ${TOTAL}",
|
||||
"campaignProgressText": "Kampanja progreso [malfacila]: ${PROGRESS}",
|
||||
"changeOncePerSeason": "Vi povas ŝanĝi ĉi tion nur unufoje por sezono.",
|
||||
"changeOncePerSeasonError": "Vi devas atendi ĝis la venonta sezono por ŝanĝi ĉi tion denove (${NUM} tagoj)",
|
||||
"customName": "Adaptita nomo",
|
||||
"linkAccountsEnterCodeText": "Enigi kodon",
|
||||
"linkAccountsGenerateCodeText": "Generu Kodon",
|
||||
"linkAccountsInfoText": "(dividu progreson tra malsamaj platformoj)",
|
||||
"linkAccountsInstructionsNewText": "Por ligi du kontojn, generu kodon sur la unua\nkaj enigu tiun kodon sur la dua. Datumoj de la\ndua konto tiam estos dividita inter ambaŭ.\n(Datumoj de la unua konto estos perditaj)\n\nVi povas ligi ĝis ${COUNT} kontoj.\n\nGRAVA: nur ligu kontojn kiujn vi posedas;\nSe vi ligas kun la kontoj de amikoj, vi ne faros\npovi ludi interrete samtempe.",
|
||||
"linkAccountsText": "Ligi kontojn",
|
||||
"linkedAccountsText": "Ligitaj kontoj:",
|
||||
"manageAccountText": "Administri Konton",
|
||||
"nameChangeConfirm": "Ĉu redakti vian kontan nomon al ${NAME}?",
|
||||
"notLoggedInText": "<ne ensalutita>",
|
||||
"resetProgressConfirmNoAchievementsText": "Ĉi tio reigos vian kunlaboran progreson\nkaj lokajn plej altajn poentojn (sed ne\nviajn biletojn). Ne eblas malfari.\nĈu vi certas?",
|
||||
"resetProgressConfirmText": "Ĉi tio reigos vian kunlaboran\nprogreson, atingojn kaj lokajn\nplej altajn poentojn (sed ne\nviajn biletojn). Ne eblas malfari.\nĈu vi certas?",
|
||||
"resetProgressText": "Reigi progreson",
|
||||
"setAccountName": "Difini Konton Nomon",
|
||||
"setAccountNameDesc": "Elektu la nomon por montri por via konto.\nVi povas uzi la nomon de unu el viaj ligitaj\nkontoj aŭ krei unikan kutiman nomon.",
|
||||
"signInInfoText": "Ensalutu por konservi vian progreson\nen la nubon, gajni biletojn kaj\npartopreni en turniroj.",
|
||||
"signInText": "Ensaluti",
|
||||
"signInWithDeviceText": "Ensaluti per aparatkonto",
|
||||
|
|
|
|||
28
dist/ba_data/data/languages/filipino.json
vendored
28
dist/ba_data/data/languages/filipino.json
vendored
|
|
@ -1,12 +1,13 @@
|
|||
{
|
||||
"accountSettingsWindow": {
|
||||
"accountNameRules": "Marapat na ang pangalan ng account na iyon ay walang mga special characters o mga emoji",
|
||||
"accountsText": "Mga account",
|
||||
"accountsText": "Mga Account",
|
||||
"achievementProgressText": "Mga Nakamtan: ${COUNT} sa ${TOTAL}",
|
||||
"campaignProgressText": "Ang Progreso sa Laro [Mahirap]: ${PROGRESS}",
|
||||
"changeOncePerSeason": "Mapapalit mo lang ito isa-isa kada season",
|
||||
"changeOncePerSeasonError": "Kailangan mo muna maghintay ng susunod na season para mapalitan ito. (${NUM} araw)",
|
||||
"customName": "Custom na Pangalan",
|
||||
"googlePlayGamesAccountSwitchText": "Kung gusto mong gamitin ang iba ninyong Google Account,\nGumamit ka ng Google Play Games app upang maipalit.",
|
||||
"linkAccountsEnterCodeText": "Ilagay ang Code",
|
||||
"linkAccountsGenerateCodeText": "Gumawa ng Code",
|
||||
"linkAccountsInfoText": "(ibahagi ang pag-usad sa iba't ibang platform)",
|
||||
|
|
@ -14,7 +15,7 @@
|
|||
"linkAccountsInstructionsText": "Para mag-ugnay ng dalawang account, gumawa ng code\nsa isa at ilagay ang code na iyon sa kabila.\nAng iyong pag-usad at imbentaryo ay pagsasamahin.\nMaaari mong i-ugnay hanggang sa ${COUNT} accounts.\n\nBabala lang; hindi na ito maibabalik!",
|
||||
"linkAccountsText": "Iugnay ang mga Account",
|
||||
"linkedAccountsText": "Naka-ugnay na mga Account",
|
||||
"manageAccountText": "Patnubayan ang Account",
|
||||
"manageAccountText": "I-Manage ang Account",
|
||||
"nameChangeConfirm": "Baguhin ang pangalan ng iyong account sa ${NAME}?",
|
||||
"resetProgressConfirmNoAchievementsText": "Ibabalik nito sa dati ang iyong pag-usad,\nat lokal na mga high-score (pwera sa ticket).\nHindi na ito maibabalik pa. Ipagpatuloy pa rin?",
|
||||
"resetProgressConfirmText": "Ibabalik nito sa dati ang iyong pag-usad,\nmga nakamtan, at lokal na mga high-score\n(pwera sa ticket). Hindi na ito maibabalik\npa. Ipagpatuloy pa rin?",
|
||||
|
|
@ -38,6 +39,7 @@
|
|||
"titleText": "Account",
|
||||
"unlinkAccountsInstructionsText": "Pumili ng account na i-uunlink",
|
||||
"unlinkAccountsText": "I-unlink ang mga accounts",
|
||||
"unlinkLegacyV1AccountsText": "I-unlink ang mga Legacy (V1) Account",
|
||||
"v2LinkInstructionsText": "Gamitin ang link na ito para gumawa ng account o mag sign in.",
|
||||
"viaAccount": "(sa pamamagitan ng account ${NAME})",
|
||||
"youAreSignedInAsText": "Nakasign-in ka bilang:"
|
||||
|
|
@ -545,7 +547,9 @@
|
|||
"deleteText": "Tanggalin",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Tanggihan",
|
||||
"deprecatedText": "Hindi Na Uso",
|
||||
"desktopResText": "Desktop Res",
|
||||
"deviceAccountUpgradeText": "Babala:\nNaka-sign in ka gamit ang isang device account (${NAME}).\nMawawala na yan sa kinakabukasang update.\nMag-upgrade sa isang V2 Account kung gusto mong panatilihin ang iyong pag-unlad.",
|
||||
"difficultyEasyText": "Madali",
|
||||
"difficultyHardOnlyText": "Mahirap Na Mode Lang",
|
||||
"difficultyHardText": "Mahirap",
|
||||
|
|
@ -676,8 +680,8 @@
|
|||
"gamesToText": "${WINCOUNT} na laro sa ${LOSECOUNT}",
|
||||
"gatherWindow": {
|
||||
"aboutDescriptionLocalMultiplayerExtraText": "Tandaan: anumang device sa isang party ay maaaring magkaroon ng higit pa\nkaysa sa isang manlalaro kung mayroon kang sapat na mga controller.",
|
||||
"aboutDescriptionText": "Gamitin ang mga tab na ito para mag-assemble ng party.\n\nHinahayaan ka ng mga party na maglaro at mga paligsahan\nkasama ang iyong mga kaibigan sa iba't ibang device.\n\nGamitin ang ${PARTY} na button sa kanang tuktok upang\nmakipag-chat at makipag-ugnayan sa iyong partido.\n(sa isang controller, pindutin ang ${BUTTON} habang nasa isang menu)",
|
||||
"aboutText": "About",
|
||||
"aboutDescriptionText": "Gamitin ang mga tab na ito para mag-assemble ng party.\n\nPwede kang maglaro at mag paligsahan kasama ang iyong mga kaibigan sa \niba't ibang device sa pamamagitan ng “Party”.\n\nGamitin ang pindutin na ${PARTY} sa kanang tuktok upang\nmakipag-chat at makipag-ugnayan sa iyong partido.\n(sa isang controller, pindutin ang ${BUTTON} habang nasa isang menu)",
|
||||
"aboutText": "Tungkulin",
|
||||
"addressFetchErrorText": "<error sa pagkuha ng mga address>",
|
||||
"appInviteMessageText": "Pinadalhan ka ni ${NAME} ng ${COUNT} ticket sa ${APP_NAME}",
|
||||
"appInviteSendACodeText": "Mag-send ka sa Kanila ng Code",
|
||||
|
|
@ -803,6 +807,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Pasensya na, hindi na available ang multiplayer na serbisyo ng Google.\nGumagawa ako ng kapalit sa lalong madaling panahon.\nHanggang doon, mangyaring sumubok ng ibang paraan ng koneksyon.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Hindi puwede ang mga pagbili sa Google Play nito.\nMaaaring kailanganin mong i-update ang iyong store app.",
|
||||
"googlePlayServicesNotAvailableText": "Hindi available ang Google Play Services sa ngayon.\n‘Di magagana ang takbo ng ilang mga app.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Palagi",
|
||||
|
|
@ -915,8 +920,8 @@
|
|||
"kickIdlePlayersKickedText": "na-kicked si ${NAME} dahil sa pagiging idle.",
|
||||
"kickIdlePlayersWarning1Text": "I-kikick si ${NAME} sa loob ng ${COUNT} (na) segundo kung idle pa rin.",
|
||||
"kickIdlePlayersWarning2Text": "(maaari mong i-off ito sa Mga Setting -> Advanced)",
|
||||
"leftGameText": "Umalis sa '${NAME}'.",
|
||||
"leftPartyText": "Umalis sa party ni ${NAME}.",
|
||||
"leftGameText": "Umalis ka sa '${NAME}'.",
|
||||
"leftPartyText": "Umalis ka sa party ni ${NAME}.",
|
||||
"noMusicFilesInFolderText": "Walang mga file ng musika ang folder.",
|
||||
"playerJoinedPartyText": "Sumali si ${NAME} sa party mo!",
|
||||
"playerLeftPartyText": "Umalis si ${NAME} sa party mo.",
|
||||
|
|
@ -1022,6 +1027,7 @@
|
|||
"maxConnectionsText": "Max na Koneksyon",
|
||||
"maxPartySizeText": "Max ng Pagdami ng Party",
|
||||
"maxPlayersText": "Pagdami ng Mga Manlalaro",
|
||||
"merchText": "Paninda!",
|
||||
"modeArcadeText": "Arcade na Mode",
|
||||
"modeClassicText": "Klasikong Mode",
|
||||
"modeDemoText": "Mode na Demo",
|
||||
|
|
@ -1061,6 +1067,7 @@
|
|||
"notSignedInErrorText": "Dapat kang mag-sign in para magawa ito.",
|
||||
"notSignedInGooglePlayErrorText": "Dapat kang mag-sign in gamit ang Google Play para magawa ito.",
|
||||
"notSignedInText": "hindi naka-sign in",
|
||||
"notUsingAccountText": "Note: hindi pinapansin ang account ng ${SERVICE}.\nPumunta sa 'Account -> Mag-sign in gamit ang ‘${SERVICE}' kung gusto mo itong gamitin.",
|
||||
"nothingIsSelectedErrorText": "Walang napili!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Naka-Off",
|
||||
|
|
@ -1504,8 +1511,8 @@
|
|||
"languages": {
|
||||
"Arabic": "Arabe",
|
||||
"Belarussian": "Belaruso",
|
||||
"Chinese": "Tsino Na Pinasimple",
|
||||
"ChineseTraditional": "Intsik",
|
||||
"Chinese": "Tsino",
|
||||
"ChineseTraditional": "Tsinong Tradisyonal",
|
||||
"Croatian": "Kroatyano",
|
||||
"Czech": "Tsek",
|
||||
"Danish": "Makadenmark",
|
||||
|
|
@ -1516,7 +1523,7 @@
|
|||
"Finnish": "Finnish",
|
||||
"French": "Pranses",
|
||||
"German": "Aleman",
|
||||
"Gibberish": "Pagyayapyap",
|
||||
"Gibberish": "Walang Kwentang Linguahe",
|
||||
"Greek": "Griyego",
|
||||
"Hindi": "Indiyano",
|
||||
"Hungarian": "Hanggaryan",
|
||||
|
|
@ -1524,6 +1531,7 @@
|
|||
"Italian": "Italiyano",
|
||||
"Japanese": "Nippongo",
|
||||
"Korean": "Koreano",
|
||||
"Malay": "Malay",
|
||||
"Persian": "Persyano",
|
||||
"Polish": "Polish",
|
||||
"Portuguese": "Portuges",
|
||||
|
|
@ -1805,6 +1813,7 @@
|
|||
"useDefaultText": "Gamitin ang default",
|
||||
"usesExternalControllerText": "Gumagamit ang larong ito ng external na controller para sa input.",
|
||||
"usingItunesText": "Paggamit ng Music App para sa soundtrack...",
|
||||
"v2AccountLinkingInfoText": "Upang ma-link ang mga V2 account mo, dumeretso ka sa “I-Manage ang Account“.",
|
||||
"validatingTestBuildText": "Pinapatunayan ang Test Build...",
|
||||
"victoryText": "Panalo!",
|
||||
"voteDelayText": "Hindi ka makapagsimula ng bagong botohan sa ${NUMBER} segundo",
|
||||
|
|
@ -1837,6 +1846,7 @@
|
|||
},
|
||||
"waveText": "Kaway",
|
||||
"wellSureText": "Oo Syempre!",
|
||||
"whatIsThisText": "Ano ito?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "Copyright ni DarwiinRemote"
|
||||
},
|
||||
|
|
|
|||
10
dist/ba_data/data/languages/french.json
vendored
10
dist/ba_data/data/languages/french.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Vous ne pouvez changer cela qu'une fois par saison.",
|
||||
"changeOncePerSeasonError": "Vous devez attendre la prochaine saison pour le modifier à nouveau (${NUM} jours)",
|
||||
"customName": "Nom personnalisé",
|
||||
"googlePlayGamesAccountSwitchText": "Si vous voulez utiliser un autre compte Google, \nutilisez l'application Google Play Games pour le changer.",
|
||||
"linkAccountsEnterCodeText": "Entrer code",
|
||||
"linkAccountsGenerateCodeText": "Générez votre code",
|
||||
"linkAccountsInfoText": "(partager la progression entre différentes plateformes)",
|
||||
|
|
@ -43,6 +44,7 @@
|
|||
"titleText": "Compte",
|
||||
"unlinkAccountsInstructionsText": "Sélectionnez un compte à délier",
|
||||
"unlinkAccountsText": "Délier des comptes",
|
||||
"unlinkLegacyV1AccountsText": "Dissocier les anciens comptes (V1)",
|
||||
"v2LinkInstructionsText": "Utiliser ce lien pour créer un compte ou se connecter.",
|
||||
"viaAccount": "(via le compte ${NAME})",
|
||||
"youAreLoggedInAsText": "Vous êtes connecté en temps que :",
|
||||
|
|
@ -565,7 +567,9 @@
|
|||
"deleteText": "Supprimer",
|
||||
"demoText": "Démo",
|
||||
"denyText": "Refuser",
|
||||
"deprecatedText": "Obsolète",
|
||||
"desktopResText": "Résolution de l'Ordinateur",
|
||||
"deviceAccountUpgradeText": "Avertissement:\nVous etes connecté avec un compte d'appareil (${NAME}).\nLes comptes d'appareils seront enlevés dans une future mise à jour.\nMettez à jour vers un compte V2 si vous voulez garder votre progression.",
|
||||
"difficultyEasyText": "Facile",
|
||||
"difficultyHardOnlyText": "Mode Difficile Seulement",
|
||||
"difficultyHardText": "Difficile",
|
||||
|
|
@ -844,6 +848,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Désolé, le service multijoueur de Google n'est plus disponible.\nJe travaille sur un moyen de le remplacer aussi vite que possible.\nEn attendant, veuillez essayer une nouvelle méthode de connexion.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Les achats Google Play ne sont pas disponibles.\nVous avez peut-être besoin de mettre à jour votre Google play",
|
||||
"googlePlayServicesNotAvailableText": "Les services Google Play sont indisponibles.\nCertaines fonctions de l'application peuvent être désactivées.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Toujours",
|
||||
|
|
@ -1078,6 +1083,7 @@
|
|||
"maxConnectionsText": "Limite de Connexions",
|
||||
"maxPartySizeText": "Maximum Participants",
|
||||
"maxPlayersText": "Joueurs Max",
|
||||
"merchText": "Boutique!",
|
||||
"modeArcadeText": "Mode Arcade",
|
||||
"modeClassicText": "Mode classique",
|
||||
"modeDemoText": "Mode Demo",
|
||||
|
|
@ -1119,6 +1125,7 @@
|
|||
"notSignedInErrorText": "Vous devez vous connecter pour faire ceci.",
|
||||
"notSignedInGooglePlayErrorText": "Vous devez vous connecter avec Google Play pour faire ceci.",
|
||||
"notSignedInText": "pas connecté",
|
||||
"notUsingAccountText": "Note: ignorer le compte ${SERVICE}.\nAllez à 'Compte -> Connectez-vous avec ${SERVICE}' si vous voulons le utiliser.",
|
||||
"nothingIsSelectedErrorText": "Rien n'est sélectionné!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Désactivé",
|
||||
|
|
@ -1618,6 +1625,7 @@
|
|||
"Italian": "Italien",
|
||||
"Japanese": "Japonais",
|
||||
"Korean": "Coréen",
|
||||
"Malay": "Malais",
|
||||
"Persian": "Persan",
|
||||
"Polish": "Polonais",
|
||||
"Portuguese": "Portugais",
|
||||
|
|
@ -1908,6 +1916,7 @@
|
|||
"usesExternalControllerText": "Ce jeu utilise un contrôleur externe pour l'input.",
|
||||
"usingItunesText": "Utilisez Music App pour la bande-son...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Vérifiez que 'Lecture Aléatoire'='ACTIF' et 'Reprise'='TOUT' dans iTunes.",
|
||||
"v2AccountLinkingInfoText": "Pour lier des comptes V2, utilisez le bouton 'Gérer compte'.",
|
||||
"validatingBetaText": "Validation de la beta...",
|
||||
"validatingTestBuildText": "Validation de la Version Test...",
|
||||
"victoryText": "Victoire!",
|
||||
|
|
@ -1942,6 +1951,7 @@
|
|||
},
|
||||
"waveText": "Vague",
|
||||
"wellSureText": "Bien Sûr!",
|
||||
"whatIsThisText": "C'est quoi ça?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
},
|
||||
|
|
|
|||
23
dist/ba_data/data/languages/german.json
vendored
23
dist/ba_data/data/languages/german.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Du kannst dies nur einmal pro Saison ändern.",
|
||||
"changeOncePerSeasonError": "Du musst warten bis du das wieder in der nächsten Saison ändern kannst. (${NUM} Tage)",
|
||||
"customName": "Benutzerdefinierter Name",
|
||||
"googlePlayGamesAccountSwitchText": "Wenn Sie ein anderes Google-Konto verwenden möchten,\nVerwenden Sie die Google Play Games-App, um zu wechseln.",
|
||||
"linkAccountsEnterCodeText": "Code eingeben",
|
||||
"linkAccountsGenerateCodeText": "Code generieren",
|
||||
"linkAccountsInfoText": "(Teile deine Erfolge über verschiedene Platformen)",
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "Um zwei Accounts miteinander zu verknüpfen,generiere einen \nCode auf einem der Geräte und trage ihn auf dem anderen ein.\nFortschritt und Inventar werden kombiniert.\nDu kannst bis zu ${COUNT} Accounts miteinander verknüpfen.\n\nSei vorsichtig; das kann nicht rückgängig gemacht werden!",
|
||||
"linkAccountsText": "Konten verknüpfen",
|
||||
"linkedAccountsText": "Verknüpfte Konten:",
|
||||
"manageAccountText": "Konto verwalten",
|
||||
"nameChangeConfirm": "Möchtest du deinen Konto Namen in ${NAME} ändern?",
|
||||
"notLoggedInText": "<nicht eingeloggt>",
|
||||
"resetProgressConfirmNoAchievementsText": "Das wird deinen Koop-Fortschritt und deine\nHigh-Scores zurücksetzen (aber nicht deine Tickets).\nDies kann nicht rückgängig gemacht werden. Bist du sicher?",
|
||||
|
|
@ -42,6 +44,7 @@
|
|||
"titleText": "Konto",
|
||||
"unlinkAccountsInstructionsText": "Wähle ein Konto aus um die Verknüpfung zu trennen",
|
||||
"unlinkAccountsText": "Kontos entknüpfen",
|
||||
"unlinkLegacyV1AccountsText": "Heben Sie die Verknüpfung von Legacy-Konten (V1) auf",
|
||||
"v2LinkInstructionsText": "Benutze diesen Link um einen Account zu erstellen oder dich einzuloggen.",
|
||||
"viaAccount": "(über das Konto ${NAME})",
|
||||
"youAreLoggedInAsText": "Du bist eingeloggt als:",
|
||||
|
|
@ -573,7 +576,9 @@
|
|||
"deleteText": "Löschen",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Verweigern",
|
||||
"deprecatedText": "Veraltet",
|
||||
"desktopResText": "Desktop Auflösung",
|
||||
"deviceAccountUpgradeText": "Achtung:\nDu bist mit einem Gerät-Konto angemeldet (${NAME}).\nGerät-Konten werden in einem kommendem Update entfernt.\nVerbessere zu einem V2 Konto, wenn du deinen Fortschritt behalten willst.",
|
||||
"difficultyEasyText": "Leicht",
|
||||
"difficultyHardOnlyText": "Nur auf Schwer",
|
||||
"difficultyHardText": "Schwer",
|
||||
|
|
@ -852,6 +857,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Sorry, Googles Multiplayerservice ist nicht länger verfügbar.\nIch arbeite so schnell wie möglich an einem Ersatz.\nBis dahin, versuche bitte eine andere Verbindungsmethode.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Google Play-Käufe sind nicht verfügbar.\nMöglicherweise müssen Sie Ihre Store-App aktualisieren.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play-Dienste sind nicht verfügbar.\nEinige App-Funktionen sind möglicherweise deaktiviert.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Immer",
|
||||
|
|
@ -1074,6 +1080,7 @@
|
|||
"creditsText": "Credits",
|
||||
"demoMenuText": "Demo Menü",
|
||||
"endGameText": "Spiel beenden",
|
||||
"endTestText": "Test beenden",
|
||||
"exitGameText": "Spiel verlassen",
|
||||
"exitToMenuText": "Zurück zum Menü?",
|
||||
"howToPlayText": "Anleitung",
|
||||
|
|
@ -1094,6 +1101,7 @@
|
|||
"maxConnectionsText": "Maximale Anzahl verbundener Geräte",
|
||||
"maxPartySizeText": "Maximale Gruppengröße",
|
||||
"maxPlayersText": "Maximale Spielerzahl",
|
||||
"merchText": "Fanartikel!",
|
||||
"modeArcadeText": "Arcade-Modus",
|
||||
"modeClassicText": "Klassischer Modus",
|
||||
"modeDemoText": "Demo Modus",
|
||||
|
|
@ -1135,6 +1143,7 @@
|
|||
"notSignedInErrorText": "Du musst dich hierfür einloggen.",
|
||||
"notSignedInGooglePlayErrorText": "Hierfür musst du dich mit Google Play anmelden",
|
||||
"notSignedInText": "Nicht angemeldet",
|
||||
"notUsingAccountText": "Achtung: ${SERVICE} Konto wird ignoriert.\nGehe zu 'Konto -> Mit ${SERVICE} anmelden', wenn du es benutzen willst.",
|
||||
"nothingIsSelectedErrorText": "Nichts ausgewählt!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Aus",
|
||||
|
|
@ -1198,7 +1207,11 @@
|
|||
"pleaseWaitText": "Bitte warte...",
|
||||
"pluginClassLoadErrorText": "Fehler beim laden der plugin class '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Fehler beim einleiten des plugins '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Plugin Einstellungen",
|
||||
"pluginsAutoEnableNewText": "Aktiviere neue Plugins automatisch",
|
||||
"pluginsDetectedText": "Neue Plugins erkannt. Neustarten, um sie zu aktivieren oder in den Einstellungen konfigurieren.",
|
||||
"pluginsDisableAllText": "Deaktiviere alle Plugins",
|
||||
"pluginsEnableAllText": "Aktiviere alle Plugins",
|
||||
"pluginsRemovedText": "${NUM} plugin(s) wurden nicht mehr gefunden.",
|
||||
"pluginsText": "Plugins",
|
||||
"practiceText": "Übung",
|
||||
|
|
@ -1345,6 +1358,7 @@
|
|||
"netTestingText": "Netzwerk Tests",
|
||||
"resetText": "Zurücksetzen",
|
||||
"showBombTrajectoriesText": "Zeige die Bomben-Flugbahn",
|
||||
"showInGamePingText": "Zeige Ping im Spiel",
|
||||
"showPlayerNamesText": "Zeige Spielernamen",
|
||||
"showUserModsText": "Zeige Mods-Ordner",
|
||||
"titleText": "Erweitert",
|
||||
|
|
@ -1405,10 +1419,10 @@
|
|||
"holidaySpecialText": "Ferien Spezial",
|
||||
"howToSwitchCharactersText": "(Gehe zu \"${SETTINGS} -> ${PLAYER_PROFILES}\" um deine Charactere zu bearbeiten)",
|
||||
"howToUseIconsText": "(Erstelle öffentliche Spieler Profile (im Account Fenster), um diese zu benutzen.)",
|
||||
"howToUseMapsText": "(Benutze diese Mappen in deinen eigenen Teams/Frei-für-alle Playlisten)",
|
||||
"howToUseMapsText": "(Benutze diese Karten in deinen eigenen Teams/Frei-für-alle Playlisten)",
|
||||
"iconsText": "Symbole",
|
||||
"loadErrorText": "Seite kann nicht geladen werden.\nÜberprüfe deine Internetverbindung.",
|
||||
"loadingText": "laden",
|
||||
"loadingText": "lade",
|
||||
"mapsText": "Karten",
|
||||
"miniGamesText": "MiniSpiele",
|
||||
"oneTimeOnlyText": "(einmalig)",
|
||||
|
|
@ -1461,7 +1475,7 @@
|
|||
"titleVRText": "BombSquad VR",
|
||||
"topFriendsText": "Top Freunde",
|
||||
"tournamentCheckingStateText": "Überprüfe Turnier Status; Bitte warten...",
|
||||
"tournamentEndedText": "Dieses Turnier ist zu Ende. Ein neues startet bald.",
|
||||
"tournamentEndedText": "Dieses Turnier ist zu Ende. Ein Neues startet bald.",
|
||||
"tournamentEntryText": "Turnier beitreten",
|
||||
"tournamentResultsRecentText": "Neueste Turnierergebnisse",
|
||||
"tournamentStandingsText": "Tournier Tabelle",
|
||||
|
|
@ -1639,6 +1653,7 @@
|
|||
"Italian": "Italienisch",
|
||||
"Japanese": "Japanisch",
|
||||
"Korean": "Koreanisch",
|
||||
"Malay": "Malaiisch",
|
||||
"Persian": "Persisch",
|
||||
"Polish": "Polnisch",
|
||||
"Portuguese": "Portugiesisch",
|
||||
|
|
@ -1929,6 +1944,7 @@
|
|||
"usesExternalControllerText": "Das Spiel nutzt einen externen Controller für die Eingaben.",
|
||||
"usingItunesText": "benutze Musik-App für Hintergrundmusik...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Stelle sicher, dass iTunes ZUFÄLLIG wiedergibt und ALLE wiederholt.",
|
||||
"v2AccountLinkingInfoText": "Um V2 Kontos zu verknüpfen, benutze den 'Konto Verwalten' Knopf.",
|
||||
"validatingBetaText": "Verifizieren der Beta...",
|
||||
"validatingTestBuildText": "Bestätige Testversion...",
|
||||
"victoryText": "Sieg!",
|
||||
|
|
@ -1963,6 +1979,7 @@
|
|||
},
|
||||
"waveText": "Welle",
|
||||
"wellSureText": "Natürlich!",
|
||||
"whatIsThisText": "Was ist das?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"licenseText": "Copyright (c) 2007, DarwiinRemote Team\nAll rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, this\n list of conditions and the following disclaimer in the documentation and/or other\n materials provided with the distribution.\n3. Neither the name of this project nor the names of its contributors may be used to\n endorse or promote products derived from this software without specific prior\n written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.",
|
||||
"licenseTextScale": 0.62,
|
||||
|
|
|
|||
15
dist/ba_data/data/languages/gibberish.json
vendored
15
dist/ba_data/data/languages/gibberish.json
vendored
|
|
@ -10,6 +10,7 @@
|
|||
"changeOncePerSeasonError": "You cows ow woefj woifjwo ec oweo fowijf owiejf (${NUM} cowefwe)",
|
||||
"customName": "Cow oj wojNaoa",
|
||||
"deviceSpecificAccountText": "Crrlzfjowf uznfl a divwfo-zpijfwo ancnfo ${NAME}",
|
||||
"googlePlayGamesAccountSwitchText": "If cows objc aw;eoifjw efoGoogl coweijwoejr,\nOc wore aero two cw oerjwoer jo gw spoeor.",
|
||||
"linkAccountsEnterCodeText": "Enrlr Cfdsz",
|
||||
"linkAccountsGenerateCodeText": "Gncowf CFdzz",
|
||||
"linkAccountsInfoText": "(fwoco par owcj woef oac we paoi oijof)",
|
||||
|
|
@ -45,6 +46,7 @@
|
|||
"titleText": "Acnfnnz",
|
||||
"unlinkAccountsInstructionsText": "Slj cwefjwe f owcjwoeijowief",
|
||||
"unlinkAccountsText": "Uldfj owjowerjsr",
|
||||
"unlinkLegacyV1AccountsText": "Unkind filcher (V1) Acosdf",
|
||||
"v2LinkInstructionsText": "Usdl ow cweoroe arc o woij erode cowefoweirjewr sers.",
|
||||
"viaAccount": "(fc cowefjwef ${NAME})",
|
||||
"youAreLoggedInAsText": "Yzrl arz lgzffd iz az:",
|
||||
|
|
@ -576,7 +578,9 @@
|
|||
"deleteText": "Deferf",
|
||||
"demoText": "Dmfwef",
|
||||
"denyText": "Dénziy",
|
||||
"deprecatedText": "Dowefowicjwer",
|
||||
"desktopResText": "Dzlflfjz Rzflz",
|
||||
"deviceAccountUpgradeText": "Wowierj:\nWofiwj c weojfw duo wdjfo weir are(${NAME}).\nDowjc weowje r ofjowei fjwoeodjfowdofijwodfjf.\nUpeworwe coweoijwV2 ocwoe roweijroidjjfj owejowejd.",
|
||||
"difficultyEasyText": "Ezrz",
|
||||
"difficultyHardOnlyText": "Hrdf Mdd Onflz",
|
||||
"difficultyHardText": "Hrefz",
|
||||
|
|
@ -859,6 +863,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Sowoer Gojf wel wouwen weoioc long wf won.\nI wow oe wefwjr pif g wfpawouja c oeij fw ocjaoiejowr.\nUntil. cowier oa j fapefij cpoypt ao coonnec awoiery.\n-Ercff",
|
||||
"googlePlayPurchasesNotAvailableText": "Weofiiwj woe woerd wieofjwe\ncome foe rj eofiaj cpwoe jrowjer..dd",
|
||||
"googlePlayServicesNotAvailableText": "GOowf cpw ef A coweij woerj.\nWomb woof cape wgwoijc we coowiejrerdss.",
|
||||
"googlePlayText": "Gzzggl Plzz",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Azlwáys",
|
||||
|
|
@ -1103,6 +1108,7 @@
|
|||
"maxConnectionsText": "Mc COnoweijwer",
|
||||
"maxPartySizeText": "McCoy cpweo fwocwoef",
|
||||
"maxPlayersText": "Mx Plweffz",
|
||||
"merchText": "Mower!",
|
||||
"modeArcadeText": "Aroc Mofwfz",
|
||||
"modeClassicText": "Cjwofej mDofd",
|
||||
"modeDemoText": "Dfwocij Mmdff",
|
||||
|
|
@ -1144,6 +1150,7 @@
|
|||
"notSignedInErrorText": "Yz mst bz snginf intof yrrz accnt tz dz thzz.",
|
||||
"notSignedInGooglePlayErrorText": "Ym fij cow fj wo cowe toiw jcoj ojwoefj owi.",
|
||||
"notSignedInText": "(nf cow eofw)",
|
||||
"notUsingAccountText": "Wewoeirj: ncowe rower'${SERVICE}'.\nSniff fwefwef ${SERVICE} jogs cpwoeijr odfjowf.",
|
||||
"nothingIsSelectedErrorText": "Nothflf iz seleftcetzd!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Ófz",
|
||||
|
|
@ -1207,7 +1214,11 @@
|
|||
"pleaseWaitText": "Poke focwoe fjowef.",
|
||||
"pluginClassLoadErrorText": "Erori cojflw cwoej woer erwe '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Error cowejwoer plugins ${PLUGIN}: ${ERROR}",
|
||||
"pluginSettingsText": "Plwj coijordsfsddf.",
|
||||
"pluginsAutoEnableNewText": "Auto f wow rjwo fipawgojsd",
|
||||
"pluginsDetectedText": "Now cow rwoejcw. Wnewoiow rwepwot ghowcoweior weorjdfdfs.",
|
||||
"pluginsDisableAllText": "DIsdof All Cplgwerd",
|
||||
"pluginsEnableAllText": "NEwoc wowed. Aplugiss.",
|
||||
"pluginsRemovedText": "${NUM} powefjwj no legate fcwdf.",
|
||||
"pluginsText": "Plfzlfez",
|
||||
"practiceText": "Pcoifjzzz",
|
||||
|
|
@ -1357,6 +1368,7 @@
|
|||
"netTestingText": "Ntwkrz Tsstcg",
|
||||
"resetText": "Rsttz",
|
||||
"showBombTrajectoriesText": "Shzlz Bomf Tfwoejcwoefz",
|
||||
"showInGamePingText": "Shoe o co fowl Png",
|
||||
"showPlayerNamesText": "SHzlfjl Plzlrr Nmzlzlls",
|
||||
"showUserModsText": "Shzl Mdsz Fldlrz",
|
||||
"titleText": "Advnafjfljdz",
|
||||
|
|
@ -1652,6 +1664,7 @@
|
|||
"Italian": "Itzllfjssnn",
|
||||
"Japanese": "Jpndjsjzes",
|
||||
"Korean": "Kornesnzn",
|
||||
"Malay": "FJwoerjjdf",
|
||||
"Persian": "Psdfsdf",
|
||||
"Polish": "Pzlishz",
|
||||
"Portuguese": "Portuguenejs",
|
||||
|
|
@ -1942,6 +1955,7 @@
|
|||
"usesExternalControllerText": "Thz gjf coiwjef oif owicoiwefj owejf owejoojof",
|
||||
"usingItunesText": "Ufwefw Mfwoef co ef srnweoicjowe...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Plzelz mkdk srzlc shfflds isON anz andpreld is ALZ unz iTunes",
|
||||
"v2AccountLinkingInfoText": "To ljeowirj V2 sojowe, use fo 'Mnawefw Acoiwo' bons.",
|
||||
"validatingBetaText": "Válúdztíng Bztá...",
|
||||
"validatingTestBuildText": "Vldfjdfoi jtese-bsdfasfd...",
|
||||
"victoryText": "Vúctzry!",
|
||||
|
|
@ -1976,6 +1990,7 @@
|
|||
},
|
||||
"waveText": "Wávz",
|
||||
"wellSureText": "Wélz Súre!",
|
||||
"whatIsThisText": "Who come woeirjwf?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"licenseText": "Copyríght (c) 2007, DarwíínRúmotú Túam\nAll ríghtz rúzúrvúd.\n\n Rúdíztríbutíon and uzú ín zourcú and bínary formz, wíth or wíthout modífícatíon,\n arú púrmíttúd provídúd that thú followíng condítíonz arú mút:\n\n1. Rúdíztríbutíonz of zourcú codú muzt rútaín thú abovú copyríght notícú, thíz\n lízt of condítíonz and thú followíng dízclaímúr.\n2. Rúdíztríbutíonz ín bínary form muzt rúproducú thú abovú copyríght notícú, thíz\n lízt of condítíonz and thú followíng dízclaímúr ín thú documúntatíon and/or othúr\n matúríalz provídúd wíth thú díztríbutíon.\n3. Núíthúr thú namú of thíz projúct nor thú namúz of ítz contríbutorz may bú uzúd to\n úndorzú or promotú productz dúrívúd from thíz zoftwarú wíthout zpúcífíc príor\n wríttún púrmízzíon.\n\nTHÍZ ZOFTWARÚ ÍZ PROVÍDÚD BY THÚ COPYRÍGHT HOLDÚRZ AND CONTRÍBUTORZ \"AZ ÍZ\"\nAND ANY ÚXPRÚZZ OR ÍMPLÍÚD WARRANTÍÚZ, ÍNCLUDÍNG, BUT NOT LÍMÍTÚD TO, THÚ\nÍMPLÍÚD WARRANTÍÚZ OF MÚRCHANTABÍLÍTY AND FÍTNÚZZ FOR A PARTÍCULAR PURPOZÚ\nARÚ DÍZCLAÍMÚD. ÍN NO ÚVÚNT ZHALL THÚ COPYRÍGHT OWNÚR OR CONTRÍBUTORZ BÚ\nLÍABLÚ FOR ANY DÍRÚCT, ÍNDÍRÚCT, ÍNCÍDÚNTAL, ZPÚCÍAL, ÚXÚMPLARY, OR\nCONZÚQUÚNTÍAL DAMAGÚZ (ÍNCLUDÍNG, BUT NOT LÍMÍTÚD TO, PROCURÚMÚNT OF\n ZUBZTÍTUTÚ GOODZ OR ZÚRVÍCÚZ; LOZZ OF UZÚ, DATA, OR PROFÍTZ; OR BUZÍNÚZZ\nÍNTÚRRUPTÍON) HOWÚVÚR CAUZÚD AND ON ANY THÚORY OF LÍABÍLÍTY, WHÚTHÚR ÍN\nCONTRACT, ZTRÍCT LÍABÍLÍTY, OR TORT (ÍNCLUDÍNG NÚGLÍGÚNCÚ OR OTHÚRWÍZÚ)\nARÍZÍNG ÍN ANY WAY OUT OF THÚ UZÚ OF THÍZ ZOFTWARÚ, ÚVÚN ÍF ADVÍZÚD OF THÚ\nPOZZÍBÍLÍTY OF ZUCH DAMAGÚ.\n",
|
||||
"licenseTextScale": 0.62,
|
||||
|
|
|
|||
7
dist/ba_data/data/languages/greek.json
vendored
7
dist/ba_data/data/languages/greek.json
vendored
|
|
@ -7,6 +7,7 @@
|
|||
"changeOncePerSeason": "Μπορείτε να το αλλάξετε μόνο μία φορά ανά σεζόν.",
|
||||
"changeOncePerSeasonError": "Πρέπει να περιμένετε μέχρι την επόμενη σεζόν για να το αλλάξετε ξανά (${NUM} days)",
|
||||
"customName": "Προσαρμοσμένο Όνομα",
|
||||
"googlePlayGamesAccountSwitchText": "Αν θέλετε να χρησιμοποιείσετε έναν διφορετικό λογαριασμό Google,\nχρησιμοποιείστε την εφαρμογή Google Play Games γιανα αλλάξετε.",
|
||||
"linkAccountsEnterCodeText": "Εισάγετε Κωδικό",
|
||||
"linkAccountsGenerateCodeText": "Δημιουργήστε Κωδικό",
|
||||
"linkAccountsInfoText": "(Μοιραστείτε την πρόοδο ανάμεσα σε διάφορες πλατφόρμες)",
|
||||
|
|
@ -545,7 +546,9 @@
|
|||
"deleteText": "Διαγραφή",
|
||||
"demoText": "Επίδειξη",
|
||||
"denyText": "Απαγόρευση",
|
||||
"deprecatedText": "Καταργήθηκε",
|
||||
"desktopResText": "Ανάλυση Σταθερού Η/Υ",
|
||||
"deviceAccountUpgradeText": "Προσοχή:\nΧρησιμοποιειτέ ένα λογαριασμό συσκευής(${NAME}).\nΟι λογαριασμοί συσκευών θα αφαιρεθούν σε μέλλουσα ενημέρωση.\nΑναβαθμίστε σε ένα λογαριασμό V2 αν θέλετε να διατηρήσετε την πρόοδο σας.",
|
||||
"difficultyEasyText": "Εύκολο",
|
||||
"difficultyHardOnlyText": "Αποκλειστικά Στο Δύσκολο",
|
||||
"difficultyHardText": "Δύσκολο",
|
||||
|
|
@ -803,6 +806,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Συγνώμη, φαίνεται πως η υπηρεσία πολλών παικτών της Google δεν είναι πλέον διαθέσιμη.\nΠροσπαθώ να βρω αντικατάσταση όσο πιο γρήγορα γίνεται.\nΜέχρι τότε, παρακαλώ δοκιμάστε άλλο τρόπο σύνδεσης.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Οι αγορές Google Play δεν είναι διαθέσιμες.\nΜπορεί να χρειάζεται να ενημερώσετε την εφαρμογή σας.",
|
||||
"googlePlayServicesNotAvailableText": "Οι υπηρεσίες Google Play δεν είναι διαθέσιμες.\nΚάποιες λειτουργείες μπορεί να είναι απενεργοποιμένες.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Πάντα",
|
||||
|
|
@ -1062,6 +1066,7 @@
|
|||
"notSignedInErrorText": "Πρέπει να συνδεθείτε γι' αυτό.",
|
||||
"notSignedInGooglePlayErrorText": "Πρέπει να συνδεθείτε με το Google Play γι' αυτό.",
|
||||
"notSignedInText": "δεν έχετε συνδεθεί",
|
||||
"notUsingAccountText": "Σημείωση: αγνοείται ο λογαριασμός ${SERVICE}.\nΠηγαίνετε στο'Λογαριασμός -> Σύνδεση με ${SERVICE}' αν θέλετε να τον χρησιμοποιήσετε.",
|
||||
"nothingIsSelectedErrorText": "Τίποτα δεν επιλέχθηκε!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Κλειστό",
|
||||
|
|
@ -1808,6 +1813,7 @@
|
|||
"useDefaultText": "Χρήση Προκαθορισμένων",
|
||||
"usesExternalControllerText": "Αυτό το παιχνίδι χρησιμοποιεί ένα εξωτερικό χειριστήριο για είσοδο.",
|
||||
"usingItunesText": "Χρήση εφαρμογής μουσικής για ηχητική υπόκρουση...",
|
||||
"v2AccountLinkingInfoText": "Για να δεσμεύσετε λογαριασμούς V2, χρησιμοιποιήστε το κουμπί 'Διαχείριση Λογαριασμού'.",
|
||||
"validatingTestBuildText": "Επικύρωση Δοκιμαστικής Έκδοσης...",
|
||||
"victoryText": "Νίκη!",
|
||||
"voteDelayText": "Δεν μπορείτε να ξαναξεκινήσετε ψηφοφορία για ${NUMBER} δευτ.",
|
||||
|
|
@ -1840,6 +1846,7 @@
|
|||
},
|
||||
"waveText": "Κύμα",
|
||||
"wellSureText": "Βεβαίως!",
|
||||
"whatIsThisText": "Τι είναι αυτό;",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
},
|
||||
|
|
|
|||
11
dist/ba_data/data/languages/hindi.json
vendored
11
dist/ba_data/data/languages/hindi.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "आप केवल प्रति सीजन इसे एक बार बदल सकते हैं।",
|
||||
"changeOncePerSeasonError": "आपको इसे फिर से बदलने के लिए अगले सीज़न तक इंतजार करना होगा (${NUM} दिन)",
|
||||
"customName": "अनुकूल नाम",
|
||||
"googlePlayGamesAccountSwitchText": "अगर आप किसी भिन्न Google खाते का उपयोग करना चाहते हैं,\n स्विच करने के लिए Google Play गेम्स ऐप का उपयोग करें।",
|
||||
"linkAccountsEnterCodeText": "कोड डालीए",
|
||||
"linkAccountsGenerateCodeText": "काेड उत्पन्न करे",
|
||||
"linkAccountsInfoText": "(प्रगति को अलग अलग यंत्रो पर बाटिए)",
|
||||
|
|
@ -15,7 +16,8 @@
|
|||
"linkAccountsInstructionsText": "दो खातों को जोड़ने के लिए एक में कोड उत्पन्न\nकरें एयर दुसरे खाते में दर्ज करें | प्रगति और\nवस्तुसूची जोड़ दी जायेगी | आप अधिकतम\n${COUNT} खातों को जोड़ सकते हैं |\n\nध्यान रखिये, इसे वापस नहीं लिया जा सकता !",
|
||||
"linkAccountsText": "खाते को जोडिए",
|
||||
"linkedAccountsText": "जुड़े हुए खाते:",
|
||||
"nameChangeConfirm": "अपने खाता का नाम ईस नाम ${NAME} से बदले?",
|
||||
"manageAccountText": "खाता प्रबंधन",
|
||||
"nameChangeConfirm": "अपने खाता का नाम इस नाम ${NAME} से बदले?",
|
||||
"resetProgressConfirmNoAchievementsText": "यह आपकी को-ऑप प्रगति और \nस्थानीय उच्च स्कोर रीसेट कर देगा (आपके टिकट रीसेट नहीं होंगे) | \nइसे पूर्ववत नहीं किया जा सकता | इस बात की पुष्टि करें कि आप यह करना चाहते हैं |",
|
||||
"resetProgressConfirmText": "यह आपकी को-ऑप प्रगति और\n स्थानीय उच्च स्कोर रीसेट कर देगा\n (आपके टिकट रीसेट नहीं होंगे) | \nइसे पूर्ववत नहीं किया जा सकता | इस बात की पुष्टि करें कि आप यह करना चाहते हैं |",
|
||||
"resetProgressText": "प्रगति रीसेट करें",
|
||||
|
|
@ -547,7 +549,9 @@
|
|||
"deleteText": "हटाना",
|
||||
"demoText": "डेमो",
|
||||
"denyText": "अस्वीकृत करें",
|
||||
"deprecatedText": "पदावनत",
|
||||
"desktopResText": "डेस्कटॉप रेज़ोल्यूशन",
|
||||
"deviceAccountUpgradeText": "चेतावनी:\n आप डिवाइस खाते (${NAME}) से साइन इन हैं।\n डिवाइस खातों को भविष्य के अपडेट में हटा दिया जाएगा।\n यदि आप अपनी प्रगति को बनाए रखना चाहते हैं तो V2 खाते में अपग्रेड करें।",
|
||||
"difficultyEasyText": "आसन",
|
||||
"difficultyHardOnlyText": "केवल कठिन",
|
||||
"difficultyHardText": "कठिन",
|
||||
|
|
@ -808,6 +812,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "क्षमा करें, गूगल की एक साथ खेलने की सेवा अब उपलब्ध नहीं है। \nमैं जितनी जल्दी हो सके एक प्रतिस्थापन पर काम कर रहा हूं।\nतब तक, कृपया दूसरी जुडने की विधि आज़माएँ। \n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "गूगल प्ले से ख़रीदारी उपलब्ध नहीं हैं।\nआपको अपना स्टोर ऐप अपडेट करना पड़ सकता है।",
|
||||
"googlePlayServicesNotAvailableText": "गूगल प्ले सर्विसेज उपलब्ध नहीं है।\nऐप की कुछ कार्यक्षमता अक्षम हो सकती है।",
|
||||
"googlePlayText": "गूगल प्ले",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "हमेशा",
|
||||
|
|
@ -1006,6 +1011,7 @@
|
|||
"creditsText": "आभार सूचि",
|
||||
"demoMenuText": "डेमो मेनू",
|
||||
"endGameText": "गेम ख़तम करें",
|
||||
"endTestText": "परीक्षण अंत",
|
||||
"exitGameText": "गेम से बहार जाएँ",
|
||||
"exitToMenuText": "ख़तम कर के मेनू में जाएं ?",
|
||||
"howToPlayText": "कैसे खेलें",
|
||||
|
|
@ -1065,6 +1071,7 @@
|
|||
"notSignedInErrorText": "यह करने के लिए आपको अपने खाते में साइन इन करना पड़ेगा",
|
||||
"notSignedInGooglePlayErrorText": "आपको गूगल प्ले से साइन इन करना पड़ेगा यह करने के लिए |",
|
||||
"notSignedInText": "साइन इन नहीं हैं",
|
||||
"notUsingAccountText": "नोट: ${SERVICE} खाते को अनदेखा करना।\n यदि आप इसका उपयोग करना चाहते हैं तो 'खाता -> ${SERVICE}' के साथ साइन इन करें।",
|
||||
"nothingIsSelectedErrorText": "कुछ चुना नहीं है !",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "बंद करें",
|
||||
|
|
@ -1810,6 +1817,7 @@
|
|||
"useDefaultText": "पूर्व निर्धारित उपयोग करें",
|
||||
"usesExternalControllerText": "यह गेम इनपुट के लिए बाहरी नियंत्रक का उपयोग करता है।",
|
||||
"usingItunesText": "गाने के लिए संगीत ऐप का उपयोग कर रहे है ...",
|
||||
"v2AccountLinkingInfoText": "V2 खातों को लिंक करने के लिए, 'खाता प्रबंधित करें' बटन का उपयोग करें।",
|
||||
"validatingTestBuildText": "परीक्षण निर्माण मान्य ...",
|
||||
"victoryText": "विजय!",
|
||||
"voteDelayText": "आप ${NUMBER} सेकंड के लिए एक और वोट शुरू नहीं कर सकते हैं",
|
||||
|
|
@ -1842,6 +1850,7 @@
|
|||
},
|
||||
"waveText": "लहर",
|
||||
"wellSureText": "हाँ ज़रूर !",
|
||||
"whatIsThisText": "यह क्या है?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "डार्विन रिमोट कॉपीराइट"
|
||||
},
|
||||
|
|
|
|||
20
dist/ba_data/data/languages/hungarian.json
vendored
20
dist/ba_data/data/languages/hungarian.json
vendored
|
|
@ -6,7 +6,7 @@
|
|||
"achievementProgressText": "Eredmènyek: ${COUNT} a(z) ${TOTAL}-ból/ből.",
|
||||
"campaignProgressText": "Kampány haladás(nehéz mód): ${PROGRESS}",
|
||||
"changeOncePerSeason": "Ebben a szezonban ezt csak egyszer változtathatod meg.",
|
||||
"changeOncePerSeasonError": "Kell várjál a következő szezonig, hogy ezt megint megváltoztasd (${NUM} nap)",
|
||||
"changeOncePerSeasonError": "Várj a következő szezonig, hogy ezt megint megváltoztasd (${NUM} nap)",
|
||||
"customName": "Egyedi név",
|
||||
"deviceSpecificAccountText": "Csak erről az eszközről lehet elérni ezt a profilt: ${NAME}",
|
||||
"linkAccountsEnterCodeText": "Írd Be A Kódot",
|
||||
|
|
@ -16,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "Hogy párosíts két profilt, generálj egy kódot\naz egyiken majd írd be a kapott kódot a másikon.\nAz előrehaladás és a megvásárolt dolgok is párosításra kerülnek .\nÖsszesen ${COUNT} profilt tudsz összehangolni.\n\nFONTOS:Csak olyan profilt csatlakoztass ami a tiéd!\nHogyha profilt csatlakoztatsz a barátaiddal\nakkor nem fogsz tudni játszani azonos időben!\n\nLégy óvatos!Ezt a lépést nem lehet visszavonni!",
|
||||
"linkAccountsText": "Profilok Párosítása",
|
||||
"linkedAccountsText": "Párosított Profilok:",
|
||||
"manageAccountText": "Fiók szerkesztése",
|
||||
"nameChangeConfirm": "Megváltoztatod a fiókod nevét erre: ${NAME}?",
|
||||
"resetProgressConfirmNoAchievementsText": "Ez visszaállítja a co-op haladásodat és \nhelyi legmagasabb pontszámaidat (de a jegyeidet nem). \nEz nem vissza vonható. Biztos vagy benne?",
|
||||
"resetProgressConfirmText": "Ez visszaállítja a co-op haladásodat,\nteljesítményeidet és helyi legmagasabb pontszámaidat\n(de a jegyeidet nem). Ez nem vissza vonható.\nBiztos vagy benne?",
|
||||
|
|
@ -330,6 +331,7 @@
|
|||
"achievementsRemainingText": "Hátralévő Teljesítmények:",
|
||||
"achievementsText": "Teljesítmények",
|
||||
"achievementsUnavailableForOldSeasonsText": "Bocsi, de a teljesítmények nem elérhetőek a régi szezonban.",
|
||||
"activatedText": "${THING} aktiválva",
|
||||
"addGameWindow": {
|
||||
"getMoreGamesText": "Több Játékmód...",
|
||||
"titleText": "Játék Hozzáadása"
|
||||
|
|
@ -500,6 +502,7 @@
|
|||
"welcome2Text": "Jegyeket is szerezhetsz. A jegyekkel beléphetsz mérkőzésekbe,\nilletve betudod váltani új karakterekre, pályákra, mini-játékokra\nés még sok másra.",
|
||||
"yourPowerRankingText": "Helyezésed:"
|
||||
},
|
||||
"copyConfirmText": "Másolva",
|
||||
"copyOfText": "${NAME} másolata",
|
||||
"copyText": "Másolat",
|
||||
"createEditPlayerText": "<Játékos készítése/szerkesztése>",
|
||||
|
|
@ -628,7 +631,9 @@
|
|||
"epicDescriptionFilterText": "${DESCRIPTION} A hatalmas lassú mozgásban",
|
||||
"epicNameFilterText": "Hatalmas ${NAME}",
|
||||
"errorAccessDeniedText": "hozzáférés megtagadva",
|
||||
"errorDeviceTimeIncorrectText": "Az eszközöd rossz időt mutat ennyi órával:${HOURS}.\nEz okozhat problémákat is.\nKérjük ellenőrizze az időt és idő-zónát a beállításokban.",
|
||||
"errorOutOfDiskSpaceText": "Kifogyott a szabadhelyből",
|
||||
"errorSecureConnectionFailText": "Nem lehet kapcsolatot létrehozni a biztonságos felhővel;Az internet funkcionálása talán elbukik.",
|
||||
"errorText": "Hiba",
|
||||
"errorUnknownText": "ismeretlen hiba",
|
||||
"exitGameText": "Kilépsz a ${APP_NAME}-ból?",
|
||||
|
|
@ -797,7 +802,7 @@
|
|||
"ticketPack4Text": "Jumbo Jegy Csomag",
|
||||
"ticketPack5Text": "Mammoth Jegy Csomag",
|
||||
"ticketPack6Text": "Végső Jegy Csomag",
|
||||
"ticketsFromASponsorText": "Szerezz ${COUNT} jegyet\negy szponzortól",
|
||||
"ticketsFromASponsorText": "Nézz egy reklámot \n${COUNT} jegyekért",
|
||||
"ticketsText": "${COUNT} Jegy",
|
||||
"titleText": "Szerezz Jegyeket",
|
||||
"unavailableLinkAccountText": "Sajnálom, a vásárlások ezen az eszközön nem elérhetőek.\nHa szeretnéd, ezt a felhasználót csatlakoztathatod egy másik\neszközre és ott vásárolhatsz.",
|
||||
|
|
@ -808,6 +813,8 @@
|
|||
"youHaveText": "Neked ${COUNT} jegyed van."
|
||||
},
|
||||
"googleMultiplayerDiscontinuedText": "Bocsánat, A Google-nek a többjátékos szervisze többé nem elérhető.\nÉn most egy cserén dolgozok.\nAddig, Kérlek Válasz egy Másik Kapcsolódási lehetőséget.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "A Google Play vásárlások nem elérhetőek.\nTalán frissíteni kell a vásárló alakalmazásod",
|
||||
"googlePlayServicesNotAvailableText": "A Google Play Szolgáltatások nem elérhetőek.\nNéhány része a játéknak talán le vannak tiltva",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Mindig",
|
||||
|
|
@ -1006,6 +1013,7 @@
|
|||
"creditsText": "Közreműködők",
|
||||
"demoMenuText": "Demo Menü",
|
||||
"endGameText": "Játék Vége",
|
||||
"endTestText": "Teszt vége",
|
||||
"exitGameText": "Kilépés a Játékból",
|
||||
"exitToMenuText": "Kilépés a menübe?",
|
||||
"howToPlayText": "Tippek",
|
||||
|
|
@ -1121,7 +1129,10 @@
|
|||
"playlistsText": "Listák",
|
||||
"pleaseRateText": "Ha élvezed a játékot, kérlek értékeld, vagy írj egy\nvéleményt a ${APP_NAME}-ról. Ez mások számára hasznos \nlehet, vagy akár segítheti a játék fejlődését is a jövőben.\n\nKöszi!\n-eric",
|
||||
"pleaseWaitText": "Kérljek várj...",
|
||||
"pluginsDetectedText": "Új Plugin találva. Kapcsold/Configuráld őket a beálitásokba.",
|
||||
"pluginClassLoadErrorText": "Nem sikerült egy hoozáadást betölteni '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Nem sikerült elkezdeni az egyik hozzáadást '${PLUGIN}': ${ERROR}",
|
||||
"pluginsDetectedText": "Új hozzáadások érzékelve. Indítsa újra az alkalmazást az aktiváláshoz, vagy szerkesztés őket a beállításokban",
|
||||
"pluginsRemovedText": "${NUM} hozzáadás(ok) mostmár nem találhatóak",
|
||||
"pluginsText": "Pluginok",
|
||||
"practiceText": "Gyakorlás",
|
||||
"pressAnyButtonPlayAgainText": "Nyomj meg egy gombot, az újrakezdéshez...",
|
||||
|
|
@ -1377,6 +1388,7 @@
|
|||
"tournamentStandingsText": "Torna Állása",
|
||||
"tournamentText": "Bajnokság",
|
||||
"tournamentTimeExpiredText": "Mérkőzési Idő Lejárt",
|
||||
"tournamentsDisabledWorkspaceText": "A versenyek ki vannak kapcsolva amíg a munkaterületek aktiválva vannak.\nA versenyek aktiválásához, kapcsold ki a munkaterületeket, és indítsd újra az alkalmazást.",
|
||||
"tournamentsText": "Bajnokságok",
|
||||
"translations": {
|
||||
"characterNames": {
|
||||
|
|
@ -1862,6 +1874,8 @@
|
|||
"winsPlayerText": "${NAME} nyert!",
|
||||
"winsTeamText": "${NAME} nyert!",
|
||||
"winsText": "${NAME} nyert!",
|
||||
"workspaceSyncErrorText": "Nem sikerült szinkronizálni a következő munkaterületet: ${WORKSPACE}. Nézd a naplót további adatokért.",
|
||||
"workspaceSyncReuseText": "Nem lehet szinkronizálni a következő munkaterületet: ${WORKSPACE}. Előző munkaterület lesz használatban.",
|
||||
"worldScoresUnavailableText": "Világ eredmények elérhetetlenek",
|
||||
"worldsBestScoresText": "Világ legjobb eredményei",
|
||||
"worldsBestTimesText": "Világ legjobb idejei",
|
||||
|
|
|
|||
81
dist/ba_data/data/languages/indonesian.json
vendored
81
dist/ba_data/data/languages/indonesian.json
vendored
|
|
@ -8,14 +8,15 @@
|
|||
"changeOncePerSeason": "Kamu hanya dapat mengganti ini sekali per musim.",
|
||||
"changeOncePerSeasonError": "Kamu harus menunggu sampai musim berikutnya untuk menggantinya lagi (${NUM} hari)",
|
||||
"customName": "Nama Khusus",
|
||||
"googlePlayGamesAccountSwitchText": "Jika kamu ingin menggunakan akun Google yang lain,\ngunakan aplikasi Google Play Games untuk mengganti.",
|
||||
"linkAccountsEnterCodeText": "Masukkan kode",
|
||||
"linkAccountsGenerateCodeText": "Buat Kode",
|
||||
"linkAccountsInfoText": "(bagikan kemajuan permainan dengan platform lain)",
|
||||
"linkAccountsInstructionsNewText": "untuk menghubungkan dua akun,buat kode pada \nperangkat pertama dan masukan kode ke perangkat kedua.\nData dari kedua akun akan di bagi ke kedua perangkat.\n(Data dari akun pertama akan hilang)\n\nKamu dapat menghubungkan ke ${COUNT} akun.\n\nPENTING:menghubungkan akun hanya bekerja untuk akun milikmu sendiri;\nJika kamu menghubungkannya dengan akun milik temanmu kamu tidak akan\ndapat bermain daring pada waktu yang bersamaan.",
|
||||
"linkAccountsInstructionsNewText": "Untuk menghubungkan dua akun, buat kode pada \nperangkat pertama dan masukkan kode ke perangkat kedua.\nData dari kedua akun akan di bagi ke kedua perangkat.\n(Data dari akun pertama akan hilang)\n\nKamu dapat menghubungkan ke ${COUNT} akun.\n\nPENTING: hanya hubungkan akun milikmu sendiri;\nJika kamu menghubungkannya dengan temanmu, kamu tidak akan\ndapat bermain daring pada waktu yang bersamaan.",
|
||||
"linkAccountsInstructionsText": "Untuk menghubungkan dua akun, buat kode di salah satu\ndari mereka dan masukkan kode itu di sisi lain.\nKemajuan dan persediaan akan digabungkan.\nAnda dapat menghubungkan hingga ${COUNT} akun.\n\nPENTING: Hanya hubungkan akun yang anda miliki!\nJika Anda menghubungkan akun dengan teman anda, anda\ntidak akan bisa bermain bersamaan!\n\nJuga: ini tidak dapat dibatalkan, jadi berhati-hatilah!",
|
||||
"linkAccountsText": "Hubungkan Akun",
|
||||
"linkedAccountsText": "Akun yang Terhubung:",
|
||||
"manageAccountText": "Pengaturan Akun",
|
||||
"linkAccountsText": "Tautkan Akun",
|
||||
"linkedAccountsText": "Akun yang Tertaut:",
|
||||
"manageAccountText": "Manajemen Akun",
|
||||
"nameChangeConfirm": "Ganti namamu menjadi ${NAME}?",
|
||||
"resetProgressConfirmNoAchievementsText": "Tindakan ini akan mengatur ulang kemajuan co-op dan\nskor tertinggi Kamu (kecuali tiket).\nTidak dapat dibatalkan. Apakah Kamu yakin?",
|
||||
"resetProgressConfirmText": "Ini akan mengatur ulang kemajuan co-op,\npencapaian, dan skor tertinggi Kamu\n(kecuali tiket). Ini tidak dapat\ndibatalkan. Kamu yakin?",
|
||||
|
|
@ -39,6 +40,7 @@
|
|||
"titleText": "Akun",
|
||||
"unlinkAccountsInstructionsText": "Pilih akun yang akan diputuskan.",
|
||||
"unlinkAccountsText": "Memutus Akun.",
|
||||
"unlinkLegacyV1AccountsText": "Putuskan tautan Akun lama (V1)",
|
||||
"v2LinkInstructionsText": "Gunakan tautan ini untuk membuat akun atau masuk.",
|
||||
"viaAccount": "(melalui akun ${NAME})",
|
||||
"youAreSignedInAsText": "Kamu terdaftar sebagai:"
|
||||
|
|
@ -545,7 +547,9 @@
|
|||
"deleteText": "Hapus",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Tolak",
|
||||
"deprecatedText": "Usang",
|
||||
"desktopResText": "Resolusi Desktop",
|
||||
"deviceAccountUpgradeText": "Peringatan:\nKamu masuk dengan akun perangkat (${NAME}).\nAkun perangkat akan dihilangkan pada pembaharuan yg akan datang.\nTingkatkan ke akun V2 jika kamu ingin pertahankan kemajuanmu.",
|
||||
"difficultyEasyText": "Mudah",
|
||||
"difficultyHardOnlyText": "Khusus Mode Sulit",
|
||||
"difficultyHardText": "Sulit",
|
||||
|
|
@ -578,7 +582,7 @@
|
|||
"colorText": "warna",
|
||||
"getMoreCharactersText": "Dapatkan karakter lain...",
|
||||
"getMoreIconsText": "Dapatkan ikon lain...",
|
||||
"globalProfileInfoText": "profil pemain global dijamin untuk memiliki nama unik\ndi seluruh dunia. Termasuk juga ikon lain.",
|
||||
"globalProfileInfoText": "Profil pemain global dijamin untuk memiliki nama unik\ndi seluruh dunia. Termasuk juga ikon lain.",
|
||||
"globalProfileText": "(Profil Global)",
|
||||
"highlightText": "highlight",
|
||||
"iconText": "ikon",
|
||||
|
|
@ -739,15 +743,15 @@
|
|||
"nearbyText": "Dekat",
|
||||
"noConnectionText": "<tidak ada koneksi>",
|
||||
"otherVersionsText": "(Versi lain)",
|
||||
"partyCodeText": "Kode Pesta",
|
||||
"partyCodeText": "Kode Acara",
|
||||
"partyInviteAcceptText": "Terima",
|
||||
"partyInviteDeclineText": "Tolak",
|
||||
"partyInviteGooglePlayExtraText": "(Lihat tab 'Google Play' di jendela 'Berkumpul')",
|
||||
"partyInviteIgnoreText": "Abaikan",
|
||||
"partyInviteText": "${NAME} mengundangmu\nke acaranya!",
|
||||
"partyNameText": "Nama acara",
|
||||
"partyServerRunningText": "Server pesta Anda sedang berjalan.",
|
||||
"partySizeText": "ukuran pesta",
|
||||
"partyServerRunningText": "Server acara Anda sedang berjalan.",
|
||||
"partySizeText": "ukuran acara",
|
||||
"partyStatusCheckingText": "memeriksa status...",
|
||||
"partyStatusJoinableText": "sekarang orang lain dapat gabung ke acaramu dari internet",
|
||||
"partyStatusNoConnectionText": "Tidak dapat terhubung ke server",
|
||||
|
|
@ -756,10 +760,10 @@
|
|||
"pingText": "Ping",
|
||||
"portText": "Port",
|
||||
"privatePartyCloudDescriptionText": "Acara pribadi dijalankan di server cloud khusus; tidak diperlukan konfigurasi router.",
|
||||
"privatePartyHostText": "Selenggarakan Pesta Pribadi",
|
||||
"privatePartyJoinText": "Bergabunglah dengan Pesta Pribadi",
|
||||
"privatePartyHostText": "Adakan Acara Pribadi",
|
||||
"privatePartyJoinText": "Gabung di Acara Pribadi",
|
||||
"privateText": "Pribadi",
|
||||
"publicHostRouterConfigText": "Ini mungkin memerlukan konfigurasi penerusan port di router Anda. Untuk opsi yang lebih mudah, selenggarakan pesta pribadi.",
|
||||
"publicHostRouterConfigText": "Ini mungkin memerlukan konfigurasi penerusan port di router Anda. Untuk opsi yang lebih mudah, adakan acara pribadi.",
|
||||
"publicText": "Publik",
|
||||
"requestingAPromoCodeText": "Memesan Kode...",
|
||||
"sendDirectInvitesText": "Kirim Undangan",
|
||||
|
|
@ -803,6 +807,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Maaf, Google's multiplayer service tidak lagi tersedia.\nSaya sedang bekerja pada penggantian secepat mungkin.\nHingga saat itu, silakan coba metode koneksi lainnya.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Pembayaran Google Play tidak tersedia.\nMungkin perlu memperbaharui Playstore anda.",
|
||||
"googlePlayServicesNotAvailableText": "Layanan Google Play tidak tersedia.\nBeberapa fungsi dari aplikasi mungkin padam.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Selalu",
|
||||
|
|
@ -1021,6 +1026,7 @@
|
|||
"maxConnectionsText": "Koneksi maksimal",
|
||||
"maxPartySizeText": "Besar Ukuran Maksimal",
|
||||
"maxPlayersText": "Jumlah Pemain Maksimal",
|
||||
"merchText": "Merchandise!",
|
||||
"modeArcadeText": "Mode Arcade",
|
||||
"modeClassicText": "Mode Klasik",
|
||||
"modeDemoText": "Mode Demo",
|
||||
|
|
@ -1061,6 +1067,7 @@
|
|||
"notSignedInErrorText": "Kamu harus masuk untuk lakukan ini.",
|
||||
"notSignedInGooglePlayErrorText": "Kamu harus masuk pakai Google Play untuk lakukan ini.",
|
||||
"notSignedInText": "belum masuk",
|
||||
"notUsingAccountText": "Catatan: mengabaikan akun ${SERVICE}.\nPergi ke 'Akun -> Masuk dengan ${SERVICE}' jika kamu ingin gunakan.",
|
||||
"nothingIsSelectedErrorText": "Tidak ada yang dipilih!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Mati",
|
||||
|
|
@ -1119,7 +1126,11 @@
|
|||
"pleaseWaitText": "Mohon tunggu...",
|
||||
"pluginClassLoadErrorText": "Error saat memuat class plugin '${PLUGIN}':${ERROR}",
|
||||
"pluginInitErrorText": "Error saat menjalankan plugin '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Pengaturan Plugin",
|
||||
"pluginsAutoEnableNewText": "Otomatis nyalakan Plugin",
|
||||
"pluginsDetectedText": "Plugin baru terdeteksi. Mulai ulang game untuk mengaktifkan pluginnya, atau mengaturnya di pengaturan.",
|
||||
"pluginsDisableAllText": "Matikan semua Plugin",
|
||||
"pluginsEnableAllText": "Nyalakan semua Plugin",
|
||||
"pluginsRemovedText": "${NUM} plugin tidak lagi ditemukan.",
|
||||
"pluginsText": "Plugin",
|
||||
"practiceText": "Latihan",
|
||||
|
|
@ -1255,22 +1266,23 @@
|
|||
"netTestingText": "Tes Jaringan",
|
||||
"resetText": "Atur ulang",
|
||||
"showBombTrajectoriesText": "Lihat Lintasan Bom",
|
||||
"showInGamePingText": "Tampilkan Ping dalam permainan",
|
||||
"showPlayerNamesText": "Tunjukkan Nama Pemain",
|
||||
"showUserModsText": "Lihat Folder Mod",
|
||||
"titleText": "Lanjutan",
|
||||
"translationEditorButtonText": "Penyunting Translasi ${APP_NAME}",
|
||||
"translationFetchErrorText": "status translasi tidak tersedia.",
|
||||
"translationFetchingStatusText": "memeriksa status translasi",
|
||||
"translationFetchingStatusText": "memeriksa status terjemahan...",
|
||||
"translationInformMe": "Beritahu saya jika bahasa yang saya gunakan harus diperbarui",
|
||||
"translationNoUpdateNeededText": "Bahasa ini sudah yang terbaru; Horeee !",
|
||||
"translationNoUpdateNeededText": "Bahasa saat ini sudah yang terbaru; woohoo!",
|
||||
"translationUpdateNeededText": "** bahasa ini perlu diperbaharui! **",
|
||||
"vrTestingText": "Tes VR"
|
||||
"vrTestingText": "Percobaan VR"
|
||||
},
|
||||
"shareText": "Bagikan",
|
||||
"sharingText": "Membagikan...",
|
||||
"showText": "Lihat",
|
||||
"showText": "Tampilkan",
|
||||
"signInForPromoCodeText": "Kamu harus masuk ke akun agar kode berlaku.",
|
||||
"signInWithGameCenterText": "Untuk menggunakan akun Game Center,\nmasuk ke Game Center dulu",
|
||||
"signInWithGameCenterText": "Untuk menggunakan akun Game Center,\nmasuk ke Game Center dahulu.",
|
||||
"singleGamePlaylistNameText": "Hanya ${GAME}",
|
||||
"singlePlayerCountText": "1 pemain",
|
||||
"soloNameFilterText": "Solo ${NAME}",
|
||||
|
|
@ -1282,10 +1294,10 @@
|
|||
"FlagCatcher": "Tangkap Bendera",
|
||||
"Flying": "Pikiran Bahagia",
|
||||
"Football": "Rugby",
|
||||
"ForwardMarch": "Serangan",
|
||||
"ForwardMarch": "Penyerbuan",
|
||||
"GrandRomp": "Penaklukan",
|
||||
"Hockey": "Hoki",
|
||||
"Keep Away": "Menjauh !",
|
||||
"Keep Away": "Menjauh",
|
||||
"Marching": "Bolak-Balik",
|
||||
"Menu": "Menu Utama",
|
||||
"Onslaught": "Pembantaian",
|
||||
|
|
@ -1307,11 +1319,11 @@
|
|||
"charactersText": "Karakter",
|
||||
"comingSoonText": "Segera Hadir...",
|
||||
"extrasText": "Extra",
|
||||
"freeBombSquadProText": "BombSquad sekarang gratis, karena dulu Kamu membelinya\nKamu mendapat tingkatan BombSquad Pro dan ${COUNT} tiket sebagai ucapan terima kasih.\nNikmati fitur barunya, dan terima kasih dukugannya!\n-Eric",
|
||||
"freeBombSquadProText": "BombSquad sekarang gratis, karena dulu Kamu membelinya\nKamu mendapat tingkatan BombSquad Pro dan ${COUNT} tiket sebagai ucapan terima kasih.\nNikmati fitur barunya, dan terima kasih atas dukungannya!\n-Eric",
|
||||
"holidaySpecialText": "Spesial Liburan",
|
||||
"howToSwitchCharactersText": "pergi ke \"${SETTINGS} -> ${PLAYER_PROFILES}\" untuk mengubah karakter",
|
||||
"howToUseIconsText": "(Buatlah profil pemain global (dalam jendela akun) untuk menggunakan ini)",
|
||||
"howToUseMapsText": "(gunakan peta ini di tim/playlist bebasmu)",
|
||||
"howToUseMapsText": "(gunakan peta ini di tim/daftar putar bebasmu)",
|
||||
"iconsText": "Simbol",
|
||||
"loadErrorText": "Tidak dapat memuat halaman.\nCek koneksi internetmu.",
|
||||
"loadingText": "memuat",
|
||||
|
|
@ -1376,34 +1388,34 @@
|
|||
"tournamentsText": "Turnamen",
|
||||
"translations": {
|
||||
"characterNames": {
|
||||
"Agent Johnson": "Agen Jhonson",
|
||||
"Agent Johnson": "Agen Johnson",
|
||||
"B-9000": "B-9000",
|
||||
"Bernard": "Beruang",
|
||||
"Bernard": "Bernard",
|
||||
"Bones": "Jerangkong",
|
||||
"Butch": "Koboi",
|
||||
"Butch": "Butch",
|
||||
"Easter Bunny": "Kelinci Paskah",
|
||||
"Flopsy": "Kelinci",
|
||||
"Frosty": "Manusia Salju",
|
||||
"Frosty": "Frosty",
|
||||
"Gretel": "Gretel",
|
||||
"Grumbledorf": "Penyihir",
|
||||
"Grumbledorf": "Grumbledorf",
|
||||
"Jack Morgan": "Jack Morgan",
|
||||
"Kronk": "Ade Rai",
|
||||
"Lee": "Yudu",
|
||||
"Kronk": "Kronk",
|
||||
"Lee": "Lee",
|
||||
"Lucky": "Lucky",
|
||||
"Mel": "Yani",
|
||||
"Mel": "Mel",
|
||||
"Middle-Man": "Manusia Super",
|
||||
"Minimus": "Minimus",
|
||||
"Pascal": "Pinguin",
|
||||
"Pascal": "Pascal",
|
||||
"Pixel": "Peri",
|
||||
"Sammy Slam": "Sammy Slam",
|
||||
"Santa Claus": "Santa Klaus",
|
||||
"Snake Shadow": "Ninja",
|
||||
"Spaz": "Reno",
|
||||
"Spaz": "Spaz",
|
||||
"Taobao Mascot": "Maskot Taobao",
|
||||
"Todd": "Todd",
|
||||
"Todd McBurton": "Rambo",
|
||||
"Xara": "Xara",
|
||||
"Zoe": "Putri",
|
||||
"Zoe": "Zoe",
|
||||
"Zola": "Zola"
|
||||
},
|
||||
"coopLevelNames": {
|
||||
|
|
@ -1436,7 +1448,7 @@
|
|||
"Final glorious epic slow motion battle to the death.": "Pertarungan slow motion epik hingga kematian menjemput.",
|
||||
"Gather eggs!": "Kumpulkan telur!",
|
||||
"Get the flag to the enemy end zone.": "Bawa bendera sampai ujung lapangan.",
|
||||
"How fast can you defeat the ninjas?": "Seberapa cepat kamu bisa mengalahkan ninja-ninja itu?",
|
||||
"How fast can you defeat the ninjas?": "Secepat apa kamu bisa mengalahkan para ninja?",
|
||||
"Kill a set number of enemies to win.": "Hancurkan sejumlah musuh.",
|
||||
"Last one standing wins.": "Terakhir hidup menang.",
|
||||
"Last remaining alive wins.": "Terakhir hidup menang.",
|
||||
|
|
@ -1523,10 +1535,11 @@
|
|||
"Greek": "Yunani",
|
||||
"Hindi": "Hindi",
|
||||
"Hungarian": "Hongaria",
|
||||
"Indonesian": "Indonesia",
|
||||
"Indonesian": "Bahasa Indonesia",
|
||||
"Italian": "Italia",
|
||||
"Japanese": "Jepang",
|
||||
"Korean": "Korea",
|
||||
"Malay": "Bahasa Malaysia",
|
||||
"Persian": "Persia",
|
||||
"Polish": "Polandia",
|
||||
"Portuguese": "Portugis",
|
||||
|
|
@ -1809,6 +1822,7 @@
|
|||
"usesExternalControllerText": "Game ini menggunakan pengontrol external untuk input.",
|
||||
"usingItunesText": "Menggunakan soundtrack dari aplikasi Musik",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Tolong pastikan lagu diacak dan diulang di iTunes. ",
|
||||
"v2AccountLinkingInfoText": "Untuk menautkan akun V2, gunakan tombol 'Manajemen Akun'.",
|
||||
"validatingTestBuildText": "Memvalidasi Bangunan Tes...",
|
||||
"victoryText": "Menang!",
|
||||
"voteDelayText": "Kamu tidak dapat memulai pemilihan suara dalam ${NUMBER} detik",
|
||||
|
|
@ -1841,6 +1855,7 @@
|
|||
},
|
||||
"waveText": "Gelombang",
|
||||
"wellSureText": "Sip!",
|
||||
"whatIsThisText": "Apa ini?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
},
|
||||
|
|
|
|||
10
dist/ba_data/data/languages/italian.json
vendored
10
dist/ba_data/data/languages/italian.json
vendored
|
|
@ -9,6 +9,7 @@
|
|||
"changeOncePerSeasonError": "Devi aspettare la prossima stagione per apportare delle modifiche (${NUM} days)",
|
||||
"customName": "Nome Personalizzato",
|
||||
"deviceSpecificAccountText": "Stai usando un account automaticamente generato: ${NAME}",
|
||||
"googlePlayGamesAccountSwitchText": "Se desideri utilizzare un'altro account Google,\nutilizza l'app Google Play Games.",
|
||||
"linkAccountsEnterCodeText": "Inserisci il codice",
|
||||
"linkAccountsGenerateCodeText": "Genera codice",
|
||||
"linkAccountsInfoText": "(condividi i progressi sui vari dispositivi)",
|
||||
|
|
@ -44,6 +45,7 @@
|
|||
"titleText": "Account",
|
||||
"unlinkAccountsInstructionsText": "Seleziona un account da scollegare",
|
||||
"unlinkAccountsText": "Scollega Account",
|
||||
"unlinkLegacyV1AccountsText": "Desvincular cuentas heredadas (V1)",
|
||||
"v2LinkInstructionsText": "Usa questo link per creare un account o accedere.",
|
||||
"viaAccount": "(tramite ${NAME})",
|
||||
"youAreLoggedInAsText": "Accesso effettuato come:",
|
||||
|
|
@ -565,7 +567,9 @@
|
|||
"deleteText": "Cancella",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Nega",
|
||||
"deprecatedText": "Deprecato",
|
||||
"desktopResText": "Risoluzione Nativa",
|
||||
"deviceAccountUpgradeText": "Attenzione:\nHai effettuato l'accesso con un profilo dispositivo (${NAME}$).\nI profili dispositivi verranno rimossi in un aggiornamento futuro.\nAggiornati ad un profilo V2 se desideri mantenere i tuoi progressi.",
|
||||
"difficultyEasyText": "Facile",
|
||||
"difficultyHardOnlyText": "Solo Modalità Difficile",
|
||||
"difficultyHardText": "Difficile",
|
||||
|
|
@ -842,6 +846,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Mi dispiace, il servizio multiplayer di Google non è più disponibile.\nSto lavorando per sostituirlo il più velocemente possibile.\nFino a quando non troverò una soluzione, prova un altro metodo per connetterti.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Gli acquisti Google Play non sono disponibili.\nPotresti dover aggiornare lo store.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play Services non è disponibile.\nAlcune funzionalità dell'app saranno disattivate.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Sempre",
|
||||
|
|
@ -1067,6 +1072,7 @@
|
|||
"maxConnectionsText": "Connessioni massime",
|
||||
"maxPartySizeText": "Dimensione massima gruppo",
|
||||
"maxPlayersText": "Giocatori massimi",
|
||||
"merchText": "Mercancía!",
|
||||
"modeArcadeText": "Modalità Arcade",
|
||||
"modeClassicText": "Modalità Classica",
|
||||
"modeDemoText": "Modalità Demo",
|
||||
|
|
@ -1108,6 +1114,7 @@
|
|||
"notSignedInErrorText": "Per fare questo, devi accedere.",
|
||||
"notSignedInGooglePlayErrorText": "Per fare questo devi accedere a Google Play.",
|
||||
"notSignedInText": "non hai effettuato l'accesso",
|
||||
"notUsingAccountText": "Nota: ignorando ${SERVICE} account.\nVai su 'Account -> Accedi con ${SERVICE}' se desideri utilizzarlo.",
|
||||
"nothingIsSelectedErrorText": "Non hai selezionato nulla!",
|
||||
"numberText": "N°${NUMBER}",
|
||||
"offText": "Disattiva",
|
||||
|
|
@ -1605,6 +1612,7 @@
|
|||
"Italian": "Italiano",
|
||||
"Japanese": "Giapponese",
|
||||
"Korean": "Koreano",
|
||||
"Malay": "Malese",
|
||||
"Persian": "Persiano",
|
||||
"Polish": "Polacco",
|
||||
"Portuguese": "Portoghese",
|
||||
|
|
@ -1895,6 +1903,7 @@
|
|||
"usesExternalControllerText": "Questo gioco utilizza un controller esterno come input.",
|
||||
"usingItunesText": "Sto usando una app musicale per la colonna sonora...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Per favore, assicurati che la riproduzione casuale sia ATTIVA e che la ripetizione sia su TUTTO su iTunes.",
|
||||
"v2AccountLinkingInfoText": "Per collegare degli account V2, usa il tasto 'Gestisci Account'.",
|
||||
"validatingBetaText": "Sto convalidando la beta...",
|
||||
"validatingTestBuildText": "Convalida Build Di Prova...",
|
||||
"victoryText": "Vittoria!",
|
||||
|
|
@ -1929,6 +1938,7 @@
|
|||
},
|
||||
"waveText": "Ondata",
|
||||
"wellSureText": "Beh, certo!",
|
||||
"whatIsThisText": "Che cos'è questo?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"licenseText": "Copyright (c) 2007, DarwiinRemote Team\nAll rights reserved.\n\n Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n3. Neither the name of this project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.",
|
||||
"licenseTextScale": 0.62,
|
||||
|
|
|
|||
14
dist/ba_data/data/languages/korean.json
vendored
14
dist/ba_data/data/languages/korean.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "한 시즌마다 바꿀수 있습니다.",
|
||||
"changeOncePerSeasonError": "다음 시즌으로 바뀔때까지 (${NUM} 일)기다려야 계정 이름을 바꿀수 있습니다.",
|
||||
"customName": "이름 맞춤설정",
|
||||
"googlePlayGamesAccountSwitchText": "다른 Google 계정을 전환하려면,\nGoogle Play 앱을 사용하세요",
|
||||
"linkAccountsEnterCodeText": "코드 입력",
|
||||
"linkAccountsGenerateCodeText": "코드 생성",
|
||||
"linkAccountsInfoText": "(여러 플랫폼에서 진행 상황을 공유합니다)",
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "두 개의 계정을 연동하려면 한 곳에서 코드를\n생성한 후 다른 곳에서 해당 코드를 입력합니다.\n진행 상황 및 소지품은 결합됩니다.\n최대 ${COUNT}개의 계정을 연동할 수 있습니다.\n\n중요:당신의 계정만 연동하십시오!\n만약에 당신이 친구의 계정과 연동하면 친구가 게임\n하는 동안 당신은 게임 할수 없게 됩니다!\n\n이 작업은 취소할 수 없으므로 주의하세요!",
|
||||
"linkAccountsText": "계정 연동",
|
||||
"linkedAccountsText": "연동된 계정",
|
||||
"manageAccountText": "계정 관리",
|
||||
"nameChangeConfirm": "계정이름을 ${NAME}으로 바꾸시겠습니까?",
|
||||
"resetProgressConfirmNoAchievementsText": "이 옵션은 협동 모드 진행 상황 및 로컬\n최고 점수를 초기화합니다 (티켓 제외).\n이 작업은 취소할 수 없습니다. 괜찮습니까?",
|
||||
"resetProgressConfirmText": "이 옵션은 협동 모드 진행 상황, 업적 및\n로컬 최고 점수를 초기화합니다\n(티켓 제외). 이 작업은 취소할 수 없습니다.\n괜찮습니까?",
|
||||
|
|
@ -39,7 +41,8 @@
|
|||
"titleText": "계정",
|
||||
"unlinkAccountsInstructionsText": "계정 연동을 해제할 계정을 선택하세요",
|
||||
"unlinkAccountsText": "계정 연동해제",
|
||||
"v2LinkInstructionsText": "니 링크를 사용해서 계정을 만들거나, 로그인을 하세요.",
|
||||
"unlinkLegacyV1AccountsText": "레거시(V1) 계정 연결 해제",
|
||||
"v2LinkInstructionsText": "이 링크를 사용해서 계정을 만들거나, 로그인을 하세요.",
|
||||
"viaAccount": "(계정 종류 ${NAME})",
|
||||
"youAreSignedInAsText": "현재 로그인된 사용자 이름:"
|
||||
},
|
||||
|
|
@ -545,7 +548,9 @@
|
|||
"deleteText": "삭제",
|
||||
"demoText": "체험판",
|
||||
"denyText": "거부",
|
||||
"deprecatedText": "더 이상 사용되지 않음",
|
||||
"desktopResText": "데스크톱 해상도",
|
||||
"deviceAccountUpgradeText": "경고:\n 기기 계정(${NAME})으로 로그인하셨습니다.\n 기기 계정은 향후 업데이트에서 제거되기에\n 진행 상황을 유지하려면 V2 계정으로 업그레이드하세요.",
|
||||
"difficultyEasyText": "쉬움",
|
||||
"difficultyHardOnlyText": "어려움 모드만",
|
||||
"difficultyHardText": "어려움",
|
||||
|
|
@ -803,6 +808,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "죄송하지만, 구글의 멀티플레이어 서비스는 더이상 이용할수가 없어요.\n지금 대체제에 가능한 빨리 작업중이에요.\n그 때까지는, 다른 접속 방법을 사용해주세요.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "구매가 되지 않았습니다.\n아마 스토어 앱을 업데이트 해야 합니다.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play 서비스를 사용할 수 없습니다.\n 일부 앱 기능이 비활성화될 수 있습니다.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "언제나",
|
||||
|
|
@ -999,6 +1005,7 @@
|
|||
"creditsText": "개발진",
|
||||
"demoMenuText": "데모 메뉴",
|
||||
"endGameText": "게임 종료",
|
||||
"endTestText": "테스트 종료",
|
||||
"exitGameText": "게임 종료",
|
||||
"exitToMenuText": "메뉴로 나가시겠습니까?",
|
||||
"howToPlayText": "게임 방법",
|
||||
|
|
@ -1018,6 +1025,7 @@
|
|||
"maxConnectionsText": "최대 연결",
|
||||
"maxPartySizeText": "최대 인원",
|
||||
"maxPlayersText": "최대 플레이어",
|
||||
"merchText": "상품!",
|
||||
"modeArcadeText": "아케이드 모드",
|
||||
"modeClassicText": "클래식 모드",
|
||||
"modeDemoText": "데모 모드",
|
||||
|
|
@ -1057,6 +1065,7 @@
|
|||
"notSignedInErrorText": "이 작업을 하려면 로그인해야 합니다.",
|
||||
"notSignedInGooglePlayErrorText": "이 작업을 하려면 Google Play로 로그인해야 합니다.",
|
||||
"notSignedInText": "로그인하지 않음",
|
||||
"notUsingAccountText": "참고: ${SERVICE} 계정을 사용하지 않고 있습니다.\n 사용하려면 '계정 -> ${SERVICE}로 로그인'으로 이동하세요.",
|
||||
"nothingIsSelectedErrorText": "선택된 것이 없습니다!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "끔",
|
||||
|
|
@ -1521,6 +1530,7 @@
|
|||
"Italian": "이탈리아어",
|
||||
"Japanese": "일본어",
|
||||
"Korean": "한국어",
|
||||
"Malay": "말레이어",
|
||||
"Persian": "페르시아어",
|
||||
"Polish": "폴란드어",
|
||||
"Portuguese": "포르투갈어",
|
||||
|
|
@ -1803,6 +1813,7 @@
|
|||
"usesExternalControllerText": "이 게임은 외부 컨트롤러를 입력용으로 사용합니다.",
|
||||
"usingItunesText": "사운트트랙에 음악 앱 사용 중...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "iTunes에서 임의 재생이 켜져있고 반복은 모두로 되어 있는지 확인해주십시오.",
|
||||
"v2AccountLinkingInfoText": "V2 계정을 연결하려면 '계정 관리' 버튼을 누르세요.",
|
||||
"validatingTestBuildText": "테스트 빌드 확인 중...",
|
||||
"victoryText": "승리!",
|
||||
"voteDelayText": "${NUMBER} 초 동안 다른 투표를 시작할 수 없습니다.",
|
||||
|
|
@ -1835,6 +1846,7 @@
|
|||
},
|
||||
"waveText": "웨이브",
|
||||
"wellSureText": "확인!",
|
||||
"whatIsThisText": "이게 뭔가요?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote 저작권"
|
||||
},
|
||||
|
|
|
|||
1878
dist/ba_data/data/languages/malay.json
vendored
Normal file
1878
dist/ba_data/data/languages/malay.json
vendored
Normal file
File diff suppressed because it is too large
Load diff
19
dist/ba_data/data/languages/persian.json
vendored
19
dist/ba_data/data/languages/persian.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": ".فقط یکبار در هر فصل میتوانید این مورد را تغییر دهید",
|
||||
"changeOncePerSeasonError": "(روز تا فصل بعد ${NUM}) برای تغییر این گزینه باید تا فصل بعد صبر کنید",
|
||||
"customName": "نام سفارشی",
|
||||
"googlePlayGamesAccountSwitchText": "اگه میخوای اکانت گوگلت رو استفاده کنی\nاستفاده کن اکانت گوگل پلی بازی های دیگت رو",
|
||||
"linkAccountsEnterCodeText": "کد را وارد کنید",
|
||||
"linkAccountsGenerateCodeText": "ایجاد کد",
|
||||
"linkAccountsInfoText": "(به اشتراک گذاری پیشروی بین دستگاههای مختلف)",
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "برای اتصال دو حساب، در یکی از\nآن ها کدی ایجاد کرده \nو آن را در دیگری وارد کنید.\nپیشرفت ها و موجودی ترکیب خواهد شد.\nحساب را وصل کنید ${COUNT} شما می توانید.\n!توجه : فقط حساب هایی را وصل کنید که برای\n شماست\nاگر شما حساب دیگری را وصل کنید، شما توانایی این را ندارید که در یک زمان بازی کنید!\nاین عمل برگشت پذیر نیست، پس \nدقت کنید!",
|
||||
"linkAccountsText": "متصل کردن حساب ها",
|
||||
"linkedAccountsText": ":حساب های متصل شده",
|
||||
"manageAccountText": "تنظیمات حساب کاربری",
|
||||
"nameChangeConfirm": "تغییر کند؟ ${NAME} آیا نام شما به",
|
||||
"resetProgressConfirmNoAchievementsText": "همهٔ پیشرویهای شما در بخش همکاری و بالاترین امتیازات\nشما پاک خواهد شد. (به استثنای بلیتهای شما)\nاین کار برگشتپذیر نیست. آیا مطمئنید؟",
|
||||
"resetProgressConfirmText": "همهٔ پیشرویها در بخش همکاری، دستاوردها\n.و امتیازات بالای شما پاک خواهد شد\n(به استثنای بلیتهای شما)\nاین کار برگشتپذیر نیست. آیا مطمئنید؟",
|
||||
|
|
@ -38,6 +40,7 @@
|
|||
"titleText": "حساب",
|
||||
"unlinkAccountsInstructionsText": "یک حساب را برای جداسازی انتخاب کنید",
|
||||
"unlinkAccountsText": "جداسازی حسابها",
|
||||
"unlinkLegacyV1AccountsText": "لغو پیوند حسابهای قدیمی (V1)",
|
||||
"v2LinkInstructionsText": "استفاده از این لینک برای ایجاد یک حساب کاربری و یا ورود به سیستم.",
|
||||
"viaAccount": "(${NAME} از طریق حساب)",
|
||||
"youAreSignedInAsText": ":با این حساب وصل شدهاید"
|
||||
|
|
@ -546,7 +549,9 @@
|
|||
"deleteText": "پاک کن",
|
||||
"demoText": "نسخه آزمایشی",
|
||||
"denyText": "نپذیرفتن",
|
||||
"deprecatedText": "ناراحت شد",
|
||||
"desktopResText": "رزولوشن دسکتاپ",
|
||||
"deviceAccountUpgradeText": "هشدار:\nشما با حساب کاربری دستگاه ثبت نام کرده اید (${NAME}).\nدر بروزرسانی های آینده حساب کاربری دستگاه حذف خواهد شد.\nبه حساب کاربری نسخه 2 بروزرسانی کنید اگر می خواهید روند را ادامه دهید.",
|
||||
"difficultyEasyText": "آسان",
|
||||
"difficultyHardOnlyText": "فقط حالت سخت",
|
||||
"difficultyHardText": "سخت",
|
||||
|
|
@ -804,6 +809,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "متأسفیم ، سرویس چند نفره Google دیگر در دسترس نیست.\nمن در اسرع وقت در حال جایگزینی هستم.\nتا آن زمان ، لطفاً روش اتصال دیگری را امتحان کنید.",
|
||||
"googlePlayPurchasesNotAvailableText": "خرید های گوگلپلی در دسترس نیستند.\nاحتمالا باید برنامهی استور خود را بروزرسانی کنید.",
|
||||
"googlePlayServicesNotAvailableText": ".سرویس گوگل پلی در دسترس نیست\n.بعضی عملکرد های برنامه ممکن غیرفعال باشند",
|
||||
"googlePlayText": "گوگل پلی",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "همیشه",
|
||||
|
|
@ -863,7 +869,7 @@
|
|||
"someDaysText": "بعضی روزا دوس داری مشت بزنی یه جایی. یا یه چیزیو بزنی بترکونی.",
|
||||
"titleText": "${APP_NAME} راهنمایی",
|
||||
"toGetTheMostText": "To get the most out of this game, you'll need:",
|
||||
"welcomeText": "${APP_NAME}!خوش آمدید به"
|
||||
"welcomeText": "!خوش آمدید ${APP_NAME} به"
|
||||
},
|
||||
"holdAnyButtonText": "<نگه داشتن هر دکمه>",
|
||||
"holdAnyKeyText": "<نگه داشتن هر کلید>",
|
||||
|
|
@ -1000,6 +1006,7 @@
|
|||
"creditsText": "درباره",
|
||||
"demoMenuText": "منو نسخه ی نمایشی",
|
||||
"endGameText": "پایان بازی",
|
||||
"endTestText": "پایان تست",
|
||||
"exitGameText": "خروج از بازی",
|
||||
"exitToMenuText": "خروج به منو؟",
|
||||
"howToPlayText": "روش بازی",
|
||||
|
|
@ -1019,6 +1026,7 @@
|
|||
"maxConnectionsText": "حداکثر اتصالات",
|
||||
"maxPartySizeText": "حداکثر فضای پارتی",
|
||||
"maxPlayersText": "حداکثر بازیکنان",
|
||||
"merchText": "اجناس",
|
||||
"modeArcadeText": "حالت بازی",
|
||||
"modeClassicText": "حالت کلاسیک",
|
||||
"modeDemoText": "حالت نمایشی",
|
||||
|
|
@ -1058,6 +1066,7 @@
|
|||
"notSignedInErrorText": ".برای انجام این کار باید وارد شوید",
|
||||
"notSignedInGooglePlayErrorText": "برا استفاده از این مورد شما باید به گوگلپلی وارد شوید",
|
||||
"notSignedInText": "وارد نشدهای",
|
||||
"notUsingAccountText": "توجه: نادیده گرفتن حساب ${SERVICE}.\n اگر میخواهید از آن استفاده کنید، به «حساب -> با ${SERVICE}» وارد شوید.",
|
||||
"nothingIsSelectedErrorText": "چیزی انتخاب نشده",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "خاموش",
|
||||
|
|
@ -1116,7 +1125,11 @@
|
|||
"pleaseWaitText": "…لطفاً صبر کنید",
|
||||
"pluginClassLoadErrorText": "${ERROR} :«${PLUGIN}» خطا در بارگیری دستهبندی افزونهٔ",
|
||||
"pluginInitErrorText": "${ERROR} :«${PLUGIN}» خطا در راهاندازی افزونهٔ",
|
||||
"pluginSettingsText": "تنظیمات پلاگین",
|
||||
"pluginsAutoEnableNewText": "فعال کردن خودکار افزونه های جدید",
|
||||
"pluginsDetectedText": "افزونه(ها)ی جدید شناسایی شد. آنها را در تنظیمات فعال، یا پیکربندی کنید.",
|
||||
"pluginsDisableAllText": "غیرفعال کردن همه افزونه ها",
|
||||
"pluginsEnableAllText": "فعال کردن همه افزونه ها",
|
||||
"pluginsRemovedText": "${NUM} افزونه دیگر یافت نمیشود.",
|
||||
"pluginsText": "افزونهها",
|
||||
"practiceText": "تمرین",
|
||||
|
|
@ -1251,6 +1264,7 @@
|
|||
"netTestingText": "تست شبکه",
|
||||
"resetText": "باز گرداندن",
|
||||
"showBombTrajectoriesText": "نمایش خط سیر بمب",
|
||||
"showInGamePingText": "نمایش پینگ در بازی",
|
||||
"showPlayerNamesText": "نمایش نام بازیکنان",
|
||||
"showUserModsText": "نمایش پوشهٔ سبک بازیها",
|
||||
"titleText": "پیشرفته",
|
||||
|
|
@ -1524,6 +1538,7 @@
|
|||
"Italian": "ایتالیایی",
|
||||
"Japanese": "ژاپنی",
|
||||
"Korean": "کرهای",
|
||||
"Malay": "مالایی",
|
||||
"Persian": "فارسی",
|
||||
"Polish": "لهستانی",
|
||||
"Portuguese": "پرتغالی",
|
||||
|
|
@ -1806,6 +1821,7 @@
|
|||
"usesExternalControllerText": "این بازی از یک کنترلر خارجی برای ورودی استفاده می کند.",
|
||||
"usingItunesText": "استفاده از برنامه ی موسیقی برای موسیقی متن",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "مطمین شید که شافل روشن است و تکرار کنید همه رو در آیتونز",
|
||||
"v2AccountLinkingInfoText": "برای پیوند دادن حسابهای V2، از دکمه «مدیریت حساب» استفاده کنید.",
|
||||
"validatingTestBuildText": "... در حال بررسی حالت آزمایشی",
|
||||
"victoryText": "! برنده شدی",
|
||||
"voteDelayText": ".ثانیه رای گیری کنید ${NUMBER} شما نمیتوانید به مدت",
|
||||
|
|
@ -1838,6 +1854,7 @@
|
|||
},
|
||||
"waveText": "دست",
|
||||
"wellSureText": "! حتما",
|
||||
"whatIsThisText": "این چیه؟",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
},
|
||||
|
|
|
|||
22
dist/ba_data/data/languages/polish.json
vendored
22
dist/ba_data/data/languages/polish.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Możesz to zmienić tylko raz na sezon.",
|
||||
"changeOncePerSeasonError": "Musisz poczekać do następnego sezonu by znowu to zmienić (${NUM} dni)",
|
||||
"customName": "Losowa Nazwa",
|
||||
"googlePlayGamesAccountSwitchText": "Jeśli chcesz użyć innego konta Google,\nużyj aplikacji Gry Google Play, aby przełączyć się na to konto.",
|
||||
"linkAccountsEnterCodeText": "Wpisz Kod",
|
||||
"linkAccountsGenerateCodeText": "Wygeneruj Kod",
|
||||
"linkAccountsInfoText": "(przenoś postęp między różnymi platformami)",
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "By połączyć dwa konta, wygeneruj kod\nna jednym z nich i wpisz na drugim.\nPostęp i ekwipunek zostaną połączone.\nMożesz połączyć do ${COUNT} kont.\n\nUWAGA: Łącz tylko konta, które należą do Ciebie!\nJeśli połączysz konto z przyjacielem,\nnie będziecie mogli grać w tym samym czasie!\n\nAktualnie nie można tego cofnąć, więc uważaj!",
|
||||
"linkAccountsText": "Połącz Konta",
|
||||
"linkedAccountsText": "Połączone Konta:",
|
||||
"manageAccountText": "Zarządzaj Kontem",
|
||||
"nameChangeConfirm": "Zmienić twoją nazwę konta na ${NAME}?",
|
||||
"notLoggedInText": "<niezalogowany>",
|
||||
"resetProgressConfirmNoAchievementsText": "Spowoduje to wyczyszczenie postępu i lokalnych\nrekordów w trybie Kooperacji (kupony pozostaną).\nOperacja nieodwracalna. Jesteś pewny?",
|
||||
|
|
@ -42,10 +44,11 @@
|
|||
"titleText": "Konto",
|
||||
"unlinkAccountsInstructionsText": "Wybierz konto do rozłączenia",
|
||||
"unlinkAccountsText": "Rozłącz konta",
|
||||
"unlinkLegacyV1AccountsText": "Rozłącz stare konta (V1)",
|
||||
"v2LinkInstructionsText": "Użyj tego linku aby stworzyć konto lub zaloguj się.",
|
||||
"viaAccount": "(przez konto ${NAME})",
|
||||
"youAreLoggedInAsText": "Jesteś zalogowany jako:",
|
||||
"youAreSignedInAsText": "Jesteś zapisany jako:"
|
||||
"youAreSignedInAsText": "Jesteś zalogowany jako:"
|
||||
},
|
||||
"achievementChallengesText": "Lista Osiągnięć i Wyzwań",
|
||||
"achievementText": "Osiągnięcia",
|
||||
|
|
@ -510,6 +513,7 @@
|
|||
"welcome2Text": "Możesz również zdobywać kupony z wielu tych samych działań.\nKupony mogą zostać użyte do: odblokowywania nowych postaci,\nmap, mini-gierek, uczestniczenia w turniejach i innych.",
|
||||
"yourPowerRankingText": "Twoje miejsce:"
|
||||
},
|
||||
"copyConfirmText": "Skopiowano do schowka.",
|
||||
"copyOfText": "${NAME} - kopia",
|
||||
"copyText": "Kopiuj",
|
||||
"createAPlayerProfileText": "Utworzyć profil gracza?",
|
||||
|
|
@ -562,7 +566,9 @@
|
|||
"deleteText": "Usuń",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Odmów",
|
||||
"deprecatedText": "Przestarzałe",
|
||||
"desktopResText": "Rozdzielczość ekranu",
|
||||
"deviceAccountUpgradeText": "Uwaga:\nLogujesz się kontem urządzenia (${NAME}).\nKonta urządzenia zostaną usunięte w przyszłej aktualizacji.\nUlepsz do konta V2, jeżeli chcesz zachować swój postęp.",
|
||||
"difficultyEasyText": "Łatwy",
|
||||
"difficultyHardOnlyText": "Tylko w trudnym trybie",
|
||||
"difficultyHardText": "Trudny",
|
||||
|
|
@ -648,7 +654,7 @@
|
|||
"epicDescriptionFilterText": "${DESCRIPTION} Epickie zwolnione tempo.",
|
||||
"epicNameFilterText": "Epicki tryb - ${NAME}",
|
||||
"errorAccessDeniedText": "odmowa dostępu",
|
||||
"errorDeviceTimeIncorrectText": "Czas na Twoim urządzeniu nie zgadza się o ${HOURS} godziny.\nTo może powodować problemy.\nSprawdź swoje ustawienia czasu i strefy czasowej.",
|
||||
"errorDeviceTimeIncorrectText": "Czas na Twoim urządzeniu różni się o ${HOURS} godziny.\nTo może spowodować problemy.\nSprawdź swoje ustawienia czasu i strefy czasowej.",
|
||||
"errorOutOfDiskSpaceText": "brak miejsca na dysku",
|
||||
"errorSecureConnectionFailText": "Wystąpił błąd z ustanowieniem bezpiecznego połączenia z chmurą; funkcje sieciowe mogą nie działać.",
|
||||
"errorText": "Błąd",
|
||||
|
|
@ -840,6 +846,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Przepraszam, usługa gry wieloosobowej Google nie jest już dostępna.\nPracuję nad zamiennikiem tak szybko jak potrafię.\nTymczasem proszę o wypróbowanie innej metody połączenia.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Zakupy Google Play niedostępne.\nSpróbuj zaktualizować aplikację Google Play.",
|
||||
"googlePlayServicesNotAvailableText": "Usługi Google Play są niedostępne.\nNiektóre funkcje aplikacji mogą być wyłączone.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Zawsze",
|
||||
|
|
@ -1043,6 +1050,7 @@
|
|||
"creditsText": "Info",
|
||||
"demoMenuText": "Menu Demo",
|
||||
"endGameText": "Koniec Gry",
|
||||
"endTestText": "Zakończ test",
|
||||
"exitGameText": "Wyjście z Gry",
|
||||
"exitToMenuText": "Wyjść do menu?",
|
||||
"howToPlayText": "Jak grać",
|
||||
|
|
@ -1063,6 +1071,7 @@
|
|||
"maxConnectionsText": "Maksymalne Połączenia",
|
||||
"maxPartySizeText": "Maksymalna ilość graczy",
|
||||
"maxPlayersText": "Maksymalna ilość graczy",
|
||||
"merchText": "Merch!",
|
||||
"modeArcadeText": "Tryb Salonu Gier",
|
||||
"modeClassicText": "Tryb Klasyczny",
|
||||
"modeDemoText": "Tryb Demo",
|
||||
|
|
@ -1104,6 +1113,7 @@
|
|||
"notSignedInErrorText": "Musisz zalogować się, aby to zrobić.",
|
||||
"notSignedInGooglePlayErrorText": "Zaloguj się z Google Play, by to zrobić.",
|
||||
"notSignedInText": "Nie zapisany",
|
||||
"notUsingAccountText": "Uwaga: ignorowanie konta ${SERVICE}.\nIdź do \"Konto -> Zaloguj się kontem ${SERVICE}\", jeżeli chcesz go używać.",
|
||||
"nothingIsSelectedErrorText": "Nic nie zaznaczyłeś!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Off",
|
||||
|
|
@ -1167,7 +1177,11 @@
|
|||
"pleaseWaitText": "Czekaj chwilkę...",
|
||||
"pluginClassLoadErrorText": "Błąd ładowania klasy pluginu '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Błąd inicjowania pluginu '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Ustawienia pluginów",
|
||||
"pluginsAutoEnableNewText": "Auto uruchomienie nowych wtyczek",
|
||||
"pluginsDetectedText": "Wykryto nowe pluginy. Uruchom ponownie grę, aby je aktywować, lub skonfiguruje je w ustawieniach.",
|
||||
"pluginsDisableAllText": "Wyłącz wszystkie pluginy",
|
||||
"pluginsEnableAllText": "Włącz wszystkie pluginy",
|
||||
"pluginsRemovedText": "Usunięto ${NUM} pluginy(ów)",
|
||||
"pluginsText": "Pluginy",
|
||||
"practiceText": "Praktyka",
|
||||
|
|
@ -1310,6 +1324,7 @@
|
|||
"netTestingText": "Testowanie sieci",
|
||||
"resetText": "Reset",
|
||||
"showBombTrajectoriesText": "Pokaż trajektorię bomb",
|
||||
"showInGamePingText": "Pokaż ping w grze",
|
||||
"showPlayerNamesText": "Pokazuj nazwy graczy",
|
||||
"showUserModsText": "Pokaż katalog modów",
|
||||
"titleText": "Zaawansowane",
|
||||
|
|
@ -1603,6 +1618,7 @@
|
|||
"Italian": "Włoski",
|
||||
"Japanese": "Japoński",
|
||||
"Korean": "Koreański",
|
||||
"Malay": "Malajski",
|
||||
"Persian": "Perski",
|
||||
"Polish": "Polski",
|
||||
"Portuguese": "Portugalski",
|
||||
|
|
@ -1893,6 +1909,7 @@
|
|||
"usesExternalControllerText": "Ta gra wykorzystuje zewnętrzny kontroler jako wejście.",
|
||||
"usingItunesText": "Korzystanie z aplikacji muzycznej jako ścieżki dźwiękowej...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Upewnij się, że w ustawieniach iTunes tasowanie utworów i powtarzanie całości jest włączone.",
|
||||
"v2AccountLinkingInfoText": "Aby połączyć konta V2, użyj przycisku \"Zarządzaj Kontem\".",
|
||||
"validatingBetaText": "Legalizowanie wersji Beta...",
|
||||
"validatingTestBuildText": "Sprawdzanie wersji testowej...",
|
||||
"victoryText": "Zwycięstwo!",
|
||||
|
|
@ -1927,6 +1944,7 @@
|
|||
},
|
||||
"waveText": "Fala",
|
||||
"wellSureText": "No pewnie!",
|
||||
"whatIsThisText": "Co to jest?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "Prawa autorskie DarwiinRemote"
|
||||
},
|
||||
|
|
|
|||
17
dist/ba_data/data/languages/portuguese.json
vendored
17
dist/ba_data/data/languages/portuguese.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Você só pode mudar isso uma vez por temporada.",
|
||||
"changeOncePerSeasonError": "Você deve esperar até a próxima temporada para mudar isso novamente (${NUM} dias)",
|
||||
"customName": "Nome personalizado",
|
||||
"googlePlayGamesAccountSwitchText": "Se você quer usar uma conta Google diferente,\nUse o Google Play Games para trocar de conta.",
|
||||
"linkAccountsEnterCodeText": "Inserir código",
|
||||
"linkAccountsGenerateCodeText": "Gerar código",
|
||||
"linkAccountsInfoText": "(compartilhar progresso entre várias plataformas)",
|
||||
|
|
@ -43,6 +44,7 @@
|
|||
"titleText": "Conta",
|
||||
"unlinkAccountsInstructionsText": "Selecione uma conta para desvincular",
|
||||
"unlinkAccountsText": "Desvincular contas",
|
||||
"unlinkLegacyV1AccountsText": "Desvincular contas herdadas (V1)",
|
||||
"v2LinkInstructionsText": "Utilize o link para criar uma conta ou entrar nela.",
|
||||
"viaAccount": "(via ${NAME})",
|
||||
"youAreLoggedInAsText": "Você está logado como:",
|
||||
|
|
@ -573,7 +575,9 @@
|
|||
"deleteText": "Excluir",
|
||||
"demoText": "Teste",
|
||||
"denyText": "Recusar",
|
||||
"deprecatedText": "Descontinuado",
|
||||
"desktopResText": "Resolução da área de trabalho",
|
||||
"deviceAccountUpgradeText": "Aviso:\nVocê está logado com a conta do seu dispositivo\n(${NAME}).\nContas de dispositivo serão removidas em uma atualização futura.",
|
||||
"difficultyEasyText": "Fácil",
|
||||
"difficultyHardOnlyText": "Modo difícil apenas",
|
||||
"difficultyHardText": "Difícil",
|
||||
|
|
@ -849,6 +853,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Desculpe, o serviço multijogador do Google não está mais disponível.\nEstou trabalhando em uma substituição o mais rápido possível.\nAté lá, tente outro método de conexão.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Compras pela Google Play não estão disponíveis.\nTalvez seja necessário atualizar sua loja para isso.",
|
||||
"googlePlayServicesNotAvailableText": "Os serviços do Google Play não estão disponíveis. \nAlgumas funções do aplicativo talvez serão desabilitadas.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Sempre",
|
||||
|
|
@ -1088,6 +1093,7 @@
|
|||
"maxConnectionsText": "Limite de Conexões",
|
||||
"maxPartySizeText": "Tamanho Máximo da Sala",
|
||||
"maxPlayersText": "Limite de jogadores",
|
||||
"merchText": "Produtos do BombSquad!",
|
||||
"modeArcadeText": "Modo Arcade",
|
||||
"modeClassicText": "Modo Clássico",
|
||||
"modeDemoText": "Modo Demo",
|
||||
|
|
@ -1129,6 +1135,7 @@
|
|||
"notSignedInErrorText": "Você deve iniciar sessão primeiro.",
|
||||
"notSignedInGooglePlayErrorText": "Você deve iniciar sessão no Google Play primeiro.",
|
||||
"notSignedInText": "sem sessão iniciada",
|
||||
"notUsingAccountText": "Aviso: Ignorando a conta ${SERVICE}.\nVá em 'Conta -> Entrar com ${SERVICE}' se quiser usá-la.",
|
||||
"nothingIsSelectedErrorText": "Nada foi selecionado!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Desligar",
|
||||
|
|
@ -1192,7 +1199,11 @@
|
|||
"pleaseWaitText": "Por favor, aguarde...",
|
||||
"pluginClassLoadErrorText": "Erro ao carregar a classe de um plugin '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Erro ao inicializar plugin '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Configurações de plugins",
|
||||
"pluginsAutoEnableNewText": "Ativar automaticamente novos plug-ins",
|
||||
"pluginsDetectedText": "Novo(s) plugin(s) detetados. Reinicie o jogo para ativá-los ou configure-os nas configurações.",
|
||||
"pluginsDisableAllText": "Desativar todos os Plugins!",
|
||||
"pluginsEnableAllText": "Habilitar todos os plug-ins!",
|
||||
"pluginsRemovedText": "${NUM} plugin(s) não foram encontrados.",
|
||||
"pluginsText": "Plugins",
|
||||
"practiceText": "Praticar",
|
||||
|
|
@ -1213,7 +1224,7 @@
|
|||
"codeTextDescription": "Código Promocional",
|
||||
"enterText": "Entrar"
|
||||
},
|
||||
"promoSubmitErrorText": "Erro verifique sua internet",
|
||||
"promoSubmitErrorText": "Erro ao enviar código; Verifique a sua conexão com a internet!",
|
||||
"ps3ControllersWindow": {
|
||||
"macInstructionsText": "Desligue a energia na parte traseira do seu PS3, verifique se\no Bluetooth do seu Mac está ativado, em seguida conecte o seu controle\nno seu Mac através de um cabo USB para emparelhar os dois. A partir daí, você\npode usar o botão home do controle para conectá-lo ao seu Mac\nseja por fio (USB) ou sem fio (Bluetooth).\n\nEm alguns Macs, uma senha pode ser solicitada ao emparelhar.\nSe isso acontecer, consulte o seguinte tutorial ou o Google para obter ajuda.\n\n\n\n\nOs controles de PS3 conectados sem fio devem aparecer na lista de\ndispositivos em Preferências do Sistema > Bluetooth. Você pode precisar remover\nda lista quando você quiser usar com o seu PS3 novamente.\n\nTambém certifique-se de desconectá-los do Bluetooth quando não estiver\nusando ou a bateria ficará acabando.\n\nBluetooth deve suportar até sete dispositivos conectados,\nembora a sua capacidade possa variar.",
|
||||
"macInstructionsTextScale": 0.74,
|
||||
|
|
@ -1339,6 +1350,7 @@
|
|||
"netTestingText": "Teste de conexão",
|
||||
"resetText": "Redefinir",
|
||||
"showBombTrajectoriesText": "Mostrar trajetórias da bomba",
|
||||
"showInGamePingText": "Mostrar latência no jogo",
|
||||
"showPlayerNamesText": "Mostrar nomes dos jogadores",
|
||||
"showUserModsText": "Mostrar Pasta de Modificações",
|
||||
"titleText": "Avançado",
|
||||
|
|
@ -1633,6 +1645,7 @@
|
|||
"Italian": "Italiano",
|
||||
"Japanese": "Japonês",
|
||||
"Korean": "Coreano",
|
||||
"Malay": "Malaio",
|
||||
"Persian": "Persa",
|
||||
"Polish": "Polonês",
|
||||
"Portuguese": "Português",
|
||||
|
|
@ -1923,6 +1936,7 @@
|
|||
"usesExternalControllerText": "Este jogo usa um controle externo para entrada.",
|
||||
"usingItunesText": "Usando o app de música para a trilha sonora",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Por favor, certifique-se de que o aleatório esteja ligado e que a repetição seja TODAS AS MÚSICAS no iTunes.",
|
||||
"v2AccountLinkingInfoText": "Para vincular contas V2, use o botão 'Gerenciar conta'.",
|
||||
"validatingBetaText": "Validando Beta...",
|
||||
"validatingTestBuildText": "Validando versão de teste...",
|
||||
"victoryText": "Vitória!",
|
||||
|
|
@ -1957,6 +1971,7 @@
|
|||
},
|
||||
"waveText": "Onda",
|
||||
"wellSureText": "Claro!",
|
||||
"whatIsThisText": "Oque é isto?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"licenseTextScale": 0.62,
|
||||
"titleText": "DarwiinRemote Copyright"
|
||||
|
|
|
|||
41
dist/ba_data/data/languages/russian.json
vendored
41
dist/ba_data/data/languages/russian.json
vendored
|
|
@ -9,6 +9,7 @@
|
|||
"changeOncePerSeasonError": "Вы должны подождать до следующего сезона, чтобы изменить это снова (${NUM} дней)",
|
||||
"customName": "Имя аккаунта",
|
||||
"deviceSpecificAccountText": "Сейчас используется аккаунт имениустройства: ${NAME}",
|
||||
"googlePlayGamesAccountSwitchText": "Если хотите сменить внутриигровой аккаунт Google, используйте приложение Google Play.",
|
||||
"linkAccountsEnterCodeText": "Введите код",
|
||||
"linkAccountsGenerateCodeText": "Сгенерировать код",
|
||||
"linkAccountsInfoText": "(делиться достижениями с другими платформами)",
|
||||
|
|
@ -44,6 +45,7 @@
|
|||
"titleText": "Аккаунт",
|
||||
"unlinkAccountsInstructionsText": "Выберите аккаунт, который хотите отвязать",
|
||||
"unlinkAccountsText": "Отвязать аккаунты",
|
||||
"unlinkLegacyV1AccountsText": "Разблокируйте устаревшие (V1) аккаунты",
|
||||
"v2LinkInstructionsText": "Используйте эту ссылку чтобы создать аккаунт или войти",
|
||||
"viaAccount": "(через аккаунт ${NAME})",
|
||||
"youAreLoggedInAsText": "Вы зашли как:",
|
||||
|
|
@ -515,7 +517,7 @@
|
|||
},
|
||||
"copyConfirmText": "Скопировано в буфер обмена",
|
||||
"copyOfText": "Копия ${NAME}",
|
||||
"copyText": "Копия",
|
||||
"copyText": "Копировать",
|
||||
"copyrightText": "© 2013 Eric Froemling",
|
||||
"createAPlayerProfileText": "Создать профиль игрока?",
|
||||
"createEditPlayerText": "<Создание / редактирование игрока>",
|
||||
|
|
@ -567,7 +569,9 @@
|
|||
"deleteText": "Удалить",
|
||||
"demoText": "Демонстрация",
|
||||
"denyText": "Отклонить",
|
||||
"deprecatedText": "Устарело>=",
|
||||
"desktopResText": "Разреш. экрана",
|
||||
"deviceAccountUpgradeText": "Внимание!\nВы заригестрированы как (${NAME})!\nДанный аккаунт будет удален в следующем обновлении!\nОбновите его до аккаунта Google Play, если не хотите потерять прогресс!",
|
||||
"difficultyEasyText": "Легкий",
|
||||
"difficultyHardOnlyText": "Только в трудном режиме",
|
||||
"difficultyHardText": "Трудный",
|
||||
|
|
@ -780,13 +784,13 @@
|
|||
"partyInviteText": "${NAME} пригласил\nвас в его лобби!",
|
||||
"partyNameText": "Имя команды",
|
||||
"partyServerRunningText": "Твой сервер для лобби работает.",
|
||||
"partySizeText": "Размер группы",
|
||||
"partySizeText": "Игроки",
|
||||
"partyStatusCheckingText": "Проверка...",
|
||||
"partyStatusJoinableText": "Ваша команда доступна через интернет",
|
||||
"partyStatusNoConnectionText": "Невозможно подключиться к серверу",
|
||||
"partyStatusNotJoinableText": "Ваше лобби недоступно через интернет",
|
||||
"partyStatusNotPublicText": "Ваше лобби не публично",
|
||||
"pingText": "пинг",
|
||||
"pingText": "Пинг",
|
||||
"portText": "Порт",
|
||||
"privatePartyCloudDescriptionText": "Частные лобби работают на выделенных облачных серверах; настройка маршрутизатора не требуется.",
|
||||
"privatePartyHostText": "Создать частное лобби",
|
||||
|
|
@ -846,6 +850,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Простите, сервис многопользовательской игры Google больше не поддерживается.\nЯ работаю над заменой так быстро, насколько это возможно.\nДо тех пор, пожалуйста выберете другой способ подключения.\n-Эрик",
|
||||
"googlePlayPurchasesNotAvailableText": "Покупки в Google Play недоступны.\nВозможно, вам необходимо обновить приложение магазина.",
|
||||
"googlePlayServicesNotAvailableText": "Сервисы Google Play недоступны.\nНекоторый функционал игры могут быть отключены.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Всегда",
|
||||
|
|
@ -1071,6 +1076,7 @@
|
|||
"maxConnectionsText": "Максимум соединений",
|
||||
"maxPartySizeText": "Размер группы",
|
||||
"maxPlayersText": "Максимум игроков",
|
||||
"merchText": "Мерч с символикой Bomb squad!",
|
||||
"modeArcadeText": "Аркадный режим",
|
||||
"modeClassicText": "Обычный режим",
|
||||
"modeDemoText": "Демонстрационный режим",
|
||||
|
|
@ -1112,6 +1118,7 @@
|
|||
"notSignedInErrorText": "Войдите в аккаунт для начала.",
|
||||
"notSignedInGooglePlayErrorText": "Войдите сначала в Google Play, а там посмотрим.",
|
||||
"notSignedInText": "(вы не вошли)",
|
||||
"notUsingAccountText": "Рекомендация: вы не используете аккаунт ${SERVICE}.\nЗайдите в 'Аккаунт' => 'зайти в ${SERVICE}', чтобы зайти в ${SERVICE}.",
|
||||
"nothingIsSelectedErrorText": "Ничего не выбрано!",
|
||||
"numberText": "${NUMBER}",
|
||||
"offText": "Выкл",
|
||||
|
|
@ -1175,7 +1182,11 @@
|
|||
"pleaseWaitText": "Пожалуйста, подождите...",
|
||||
"pluginClassLoadErrorText": "Ошибка при попытке загрузить класс плагина '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Ошибка при инициализации плагина '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Настройки плагина",
|
||||
"pluginsAutoEnableNewText": "Автоматически включать плагины",
|
||||
"pluginsDetectedText": "Обнаружены новые плагины! Перезапустите игру, чтобы активировать их, или настройте их в настройках.",
|
||||
"pluginsDisableAllText": "Выключить все плагины",
|
||||
"pluginsEnableAllText": "Включить все плагины",
|
||||
"pluginsRemovedText": "${NUM} плагин(ов) больше не найдены.",
|
||||
"pluginsText": "Плагины",
|
||||
"practiceText": "Тренировка",
|
||||
|
|
@ -1315,6 +1326,7 @@
|
|||
"netTestingText": "Тестирование сети",
|
||||
"resetText": "Сбросить",
|
||||
"showBombTrajectoriesText": "Показывать траекторию бомбы",
|
||||
"showInGamePingText": "Показать Ping",
|
||||
"showPlayerNamesText": "Показывать имена игроков",
|
||||
"showUserModsText": "Показать папку модов",
|
||||
"titleText": "Дополнительно",
|
||||
|
|
@ -1501,10 +1513,10 @@
|
|||
"Rookie Onslaught": "Атака для новичков",
|
||||
"Runaround": "Бесконечный манёвр",
|
||||
"The Last Stand": "Последний рубеж",
|
||||
"Uber ${GAME}": "Ӱбер ${GAME}",
|
||||
"Uber Football": "Ӱбер регби",
|
||||
"Uber Onslaught": "Ӱбер атака",
|
||||
"Uber Runaround": "Ӱбер беготня"
|
||||
"Uber ${GAME}": "Убер ${GAME}",
|
||||
"Uber Football": "Убер регби",
|
||||
"Uber Onslaught": "Убер атака",
|
||||
"Uber Runaround": "Убер беготня"
|
||||
},
|
||||
"gameDescriptions": {
|
||||
"Be the chosen one for a length of time to win.\nKill the chosen one to become it.": "Чтобы победить, стань избранным на некоторое время.\nЧтобы стать избранным, убей избранного.",
|
||||
|
|
@ -1609,6 +1621,7 @@
|
|||
"Italian": "Итальянский",
|
||||
"Japanese": "Японский",
|
||||
"Korean": "Корейский",
|
||||
"Malay": "Малайский",
|
||||
"Persian": "Персидский",
|
||||
"Polish": "Польский",
|
||||
"Portuguese": "Португальский",
|
||||
|
|
@ -1778,7 +1791,7 @@
|
|||
"statements": {
|
||||
"${TEAM} is disqualified because ${PLAYER} left": "${TEAM} дисквалифицирована потому что ${PLAYER} вышел",
|
||||
"Killing ${NAME} for skipping part of the track!": "Ликвидация ${NAME} за срезание трассы!",
|
||||
"Warning to ${NAME}: turbo / button-spamming knocks you out.": "Предупреждение для ${NAME}: за турбо / быстрое повторное нажатие кнопки можно вылететь."
|
||||
"Warning to ${NAME}: turbo / button-spamming knocks you out.": "Предупреждение для ${NAME}: за турбо / быстрое повторное нажатие кнопки можно вырубится."
|
||||
},
|
||||
"teamNames": {
|
||||
"Bad Guys": "Негодяи",
|
||||
|
|
@ -1853,7 +1866,7 @@
|
|||
"phrase07Text": "Видите? Мы не двигались, поэтому ${NAME} почти в полном порядке.",
|
||||
"phrase08Text": "Теперь подпрыгнем и крутанемся для скорости.",
|
||||
"phrase09Text": "Ага, так-то лучше.",
|
||||
"phrase10Text": "Также помогает бег.",
|
||||
"phrase10Text": "Бег тоже помогает.",
|
||||
"phrase11Text": "Для бега удерживайте любую кнопку.",
|
||||
"phrase12Text": "Для супер-крутых ударов попробуйте бежать и крутиться.",
|
||||
"phrase13Text": "Упс.. Извини, ${NAME}.",
|
||||
|
|
@ -1863,9 +1876,9 @@
|
|||
"phrase17Text": "Ай! Не очень хороший бросок.",
|
||||
"phrase18Text": "В движении бросок получается дальше.",
|
||||
"phrase19Text": "В прыжке бросок выше.",
|
||||
"phrase20Text": "\"Подкрученные\" бомбы летят еще дальше.",
|
||||
"phrase20Text": "\"Раскрученные\" бомбы летят еще дальше.",
|
||||
"phrase21Text": "\"Подогревать\" бомбы довольно сложно.",
|
||||
"phrase22Text": "Блин нафиг!",
|
||||
"phrase22Text": "Чёрт.",
|
||||
"phrase23Text": "Попробуйте \"подогреть\" фитиль секунду или две.",
|
||||
"phrase24Text": "Ура! Хорошо подогрето.",
|
||||
"phrase25Text": "Ну на этом, пожалуй, всё.",
|
||||
|
|
@ -1877,7 +1890,7 @@
|
|||
"randomName2Text": "Петя",
|
||||
"randomName3Text": "Иннокентий",
|
||||
"randomName4Text": "Шурик",
|
||||
"randomName5Text": "Виталий",
|
||||
"randomName5Text": "Виталик",
|
||||
"skipConfirmText": "Пропустить тьюториал? Коснитесь или нажмите кнопку для подтверждения.",
|
||||
"skipVoteCountText": "${COUNT}/${TOTAL} голосов за пропуск",
|
||||
"skippingText": "пропуск обучения...",
|
||||
|
|
@ -1899,6 +1912,7 @@
|
|||
"usesExternalControllerText": "Эта игра может использовать внешний контроллер для управления.",
|
||||
"usingItunesText": "Использование музыкального приложения для саундтрека...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Убедитесь, что в iTunes включен случайный порядок, и повтор установлен на 'все'.",
|
||||
"v2AccountLinkingInfoText": "Чтобы обьединить старый и новый аккаунты, используйте кнопку 'Обьединить аккаунты'",
|
||||
"validatingBetaText": "Валидация бета-версии...",
|
||||
"validatingTestBuildText": "Проверка тестовой сборки...",
|
||||
"victoryText": "Победа!",
|
||||
|
|
@ -1933,6 +1947,7 @@
|
|||
},
|
||||
"waveText": "Волна",
|
||||
"wellSureText": "Сойдет!",
|
||||
"whatIsThisText": "Что это?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "Авторские права DarwiinRemote"
|
||||
},
|
||||
|
|
@ -1952,7 +1967,7 @@
|
|||
"winsTeamText": "Победили ${NAME}!",
|
||||
"winsText": "${NAME} выиграл!",
|
||||
"workspaceSyncErrorText": "Ошибка при попытке синхронизации ${WORKSPACE}. Посмотрите лог для информации.",
|
||||
"workspaceSyncReuseText": "Не может синронизировать ${WORKSPACE}. Будет использоватся прошлая синхронизация.",
|
||||
"workspaceSyncReuseText": "Не получается синхронизировать ${WORKSPACE}. Используется прошлая синхронизация.",
|
||||
"worldScoresUnavailableText": "Мировые результаты недоступны.",
|
||||
"worldsBestScoresText": "Лучшие в мире очки",
|
||||
"worldsBestTimesText": "Лучшее в мире время",
|
||||
|
|
|
|||
18
dist/ba_data/data/languages/slovak.json
vendored
18
dist/ba_data/data/languages/slovak.json
vendored
|
|
@ -15,6 +15,7 @@
|
|||
"linkAccountsInstructionsText": "Abyste mohli pripojiť dva účty, vygenerujte na prvom kód,\nktorý následne vložte na účte druhom.\nPostup a inventár sa skombinujú.\nMôžete spojiť až ${COUNT} účtov.",
|
||||
"linkAccountsText": "Pripojené účty",
|
||||
"linkedAccountsText": "Spojené účty:",
|
||||
"manageAccountText": "Spravovať Účet",
|
||||
"nameChangeConfirm": "Zmeniť vás účet na ${NAME}?",
|
||||
"notLoggedInText": "<neprihlásený>",
|
||||
"resetProgressConfirmNoAchievementsText": "Týmto zresetuješ progres v tímovej hre\na všetky dosiahnuté skóre (tikety ostanú). Nedá sa \nto vrátiť späť. Pokračovať?",
|
||||
|
|
@ -330,6 +331,7 @@
|
|||
"achievementsRemainingText": "Zostávajúce Achievementy",
|
||||
"achievementsText": "Achievementy",
|
||||
"achievementsUnavailableForOldSeasonsText": "Prepáč, podrobnosti achievementov nie sú dostupné pre minulé sezóny.",
|
||||
"activatedText": "${THING} aktivovaný.",
|
||||
"addGameWindow": {
|
||||
"getMoreGamesText": "Viac Hier...",
|
||||
"titleText": "Pridať Hru"
|
||||
|
|
@ -500,6 +502,7 @@
|
|||
"welcome2Text": "Taktiež môžeš získavať tikety z veľa aktivít. Tikety sa \nmôžu používať na odomknutie nových charakterov, máp, \nminihier, ako vstupné do turnajov, a viac.",
|
||||
"yourPowerRankingText": "Tvoje Umiestnenie:"
|
||||
},
|
||||
"copyConfirmText": "Skopírované do schránky.",
|
||||
"copyOfText": "${NAME} Kópia",
|
||||
"copyText": "Kopírovať",
|
||||
"createEditPlayerText": "<Vytvoriť/Upraviť Charakter>",
|
||||
|
|
@ -627,7 +630,9 @@
|
|||
"epicDescriptionFilterText": "${DESCRIPTION} Spomalene.",
|
||||
"epicNameFilterText": "Epic ${NAME}",
|
||||
"errorAccessDeniedText": "prístup odmietnutý",
|
||||
"errorDeviceTimeIncorrectText": "Čas vášho zariadenia je nesprávny o ${HOURS} hodín.\nToto môže spôsobiť problémy.\nProsím skontrolujte vaše nastavenia času a časových zón.",
|
||||
"errorOutOfDiskSpaceText": "žiadne miesto na disku",
|
||||
"errorSecureConnectionFailText": "Nebolo možné vyrvoriť bezpečné cloudové pripojenie; funkčnosť siete môže zlyhať.",
|
||||
"errorText": "Chyba",
|
||||
"errorUnknownText": "neznámy error",
|
||||
"exitGameText": "Ukončiť ${APP_NAME}?",
|
||||
|
|
@ -790,7 +795,7 @@
|
|||
"ticketPack4Text": "Obrovský Balíček Tiketov",
|
||||
"ticketPack5Text": "Gigantický Balíček Tiketov",
|
||||
"ticketPack6Text": "Ultimátny Balíček Tiketov",
|
||||
"ticketsFromASponsorText": "Dostaň ${COUNT} tiketov\nod sponzora",
|
||||
"ticketsFromASponsorText": "Pozri si reklamu\npre ${COUNT} tiketov",
|
||||
"ticketsText": "${COUNT} Tiketov",
|
||||
"titleText": "Dostať Tikety",
|
||||
"unavailableLinkAccountText": "Prepáč, nákupy sú nedostupné na tejto platforme.\nAko riešenie, môžeš stále prepojiť tento účet s účtom na \ninej platforme a nakupovať.",
|
||||
|
|
@ -801,6 +806,8 @@
|
|||
"youHaveText": "máš ${COUNT} tiketov"
|
||||
},
|
||||
"googleMultiplayerDiscontinuedText": "Prepáč, Google multiplayer už viac nie je dostupný.\nSnažím sa to prehodiť čo najskôr. Dovtedy prosím\nskús inú metódu pripojenia.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Nákupy Google Play nie sú dostupné.\nAsi musíte aktualizovať svoju obchodnú aplikáciu.",
|
||||
"googlePlayServicesNotAvailableText": "Služby Google Play nie sú dostupné.\nNiektoré funkčnosti aplikácie môžu byť vypnuté.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Stále",
|
||||
|
|
@ -997,6 +1004,7 @@
|
|||
"creditsText": "Credits",
|
||||
"demoMenuText": "Demo Menu",
|
||||
"endGameText": "Ukončiť Hru",
|
||||
"endTestText": "Ukončiť Test",
|
||||
"exitGameText": "Uzavrieť Hru",
|
||||
"exitToMenuText": "Odísť do menu?",
|
||||
"howToPlayText": "Ako Hrať",
|
||||
|
|
@ -1111,7 +1119,10 @@
|
|||
"playlistsText": "Playlisty",
|
||||
"pleaseRateText": "Ak si ${APP_NAME} užívaš, prosím pouvažuj nad chvíľou\nohodnotenia a napísania recenzie. Toto poskytuje\nužitočnú spätnú väzbu a pomáha podporovať budúci rozvoj.\n\nvďaka!\n-Eric",
|
||||
"pleaseWaitText": "Prosím počkaj...",
|
||||
"pluginsDetectedText": "Boli zistené nové doplnky. Povoľte / nakonfigurujte ich v nastaveniach.",
|
||||
"pluginClassLoadErrorText": "Chyba pri načítaní triedy doplnku '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Chyba pri iniciovaní doplnku '${PLUGIN}': ${ERROR}",
|
||||
"pluginsDetectedText": "Bol zistený nový doplnok(ky). Reštartujte aby sa aktivovali, alebo ich nakonfigurte v nastaveniach.",
|
||||
"pluginsRemovedText": "${NUM} doplnok(ky) nebol najdený.",
|
||||
"pluginsText": "Pluginy",
|
||||
"practiceText": "Tréning",
|
||||
"pressAnyButtonPlayAgainText": "Stlač hocijaké tlačidlo ak chceš hrať znova...",
|
||||
|
|
@ -1362,6 +1373,7 @@
|
|||
"tournamentStandingsText": "Postavenie v Turnaji",
|
||||
"tournamentText": "Turnaj",
|
||||
"tournamentTimeExpiredText": "Čas v Turnaji Vypršal",
|
||||
"tournamentsDisabledWorkspaceText": "Turnaje sú zakázané keď pracoviská sú aktívne.\nAby sa znova povolili turnaje, vypnite svoje pracovisko a reštartujte.",
|
||||
"tournamentsText": "Turnaje",
|
||||
"translations": {
|
||||
"characterNames": {
|
||||
|
|
@ -1845,6 +1857,8 @@
|
|||
"winsPlayerText": "${NAME} Vyhráva!",
|
||||
"winsTeamText": "${NAME} Vyhráva!",
|
||||
"winsText": "${NAME} Vyhráva!",
|
||||
"workspaceSyncErrorText": "Chyba pri synchronizácii ${WORKSPACE}. Pozri log pre detaily.",
|
||||
"workspaceSyncReuseText": "Nemožno synchronizovať ${WORKSPACE}. Znovu-využitie predošlej synchronizovanej verzie.",
|
||||
"worldScoresUnavailableText": "Svetové skóre nedostupné.",
|
||||
"worldsBestScoresText": "Svetovo Najlepšie Skóre",
|
||||
"worldsBestTimesText": "Svetovo Najlepšie Časy",
|
||||
|
|
|
|||
155
dist/ba_data/data/languages/spanish.json
vendored
155
dist/ba_data/data/languages/spanish.json
vendored
|
|
@ -4,11 +4,12 @@
|
|||
"accountProfileText": "(Perfil de la cuenta)",
|
||||
"accountsText": "Cuentas",
|
||||
"achievementProgressText": "Logros: ${COUNT} de ${TOTAL}",
|
||||
"campaignProgressText": "Progreso de campaña [Dificil]: ${PROGRESS}",
|
||||
"campaignProgressText": "Progreso de campaña [Difícil]: ${PROGRESS}",
|
||||
"changeOncePerSeason": "Solamente puedes cambiarlo una vez por temporada.",
|
||||
"changeOncePerSeasonError": "Debes esperar hasta la siguiente temporada para cambiarlo de nuevo (en ${NUM} día/s)",
|
||||
"customName": "Nombre personalizado",
|
||||
"deviceSpecificAccountText": "Actualmente usando una cuenta específica de dispositivo: ${NAME}",
|
||||
"googlePlayGamesAccountSwitchText": "Si quieres cambiar a otra cuenta de Google,\nusa Google Play para cambiar tu cuenta.",
|
||||
"linkAccountsEnterCodeText": "Registrar Código",
|
||||
"linkAccountsGenerateCodeText": "Generar Código",
|
||||
"linkAccountsInfoText": "(compartir progreso a través de diferentes plataformas)",
|
||||
|
|
@ -16,7 +17,7 @@
|
|||
"linkAccountsInstructionsText": "Para enlazar dos cuentas, genera un código en una\n de ellas y escribe el código en la otra.\nEl progreso e accesorios se combinarán.\nPuedes enlazar hasta ${COUNT} cuentas. \n\nIMPORTANTE: Solo enlaza cuentas tuyas!\n\nSi enlazas cuentas con tus amigos no podrán jugar al mismo tiempo!\n\nTambién: esto no se puede deshacer actualmente, así que se cuidadoso!",
|
||||
"linkAccountsText": "Enlazar Cuentas",
|
||||
"linkedAccountsText": "Cuentas enlazadas:",
|
||||
"manageAccountText": "administrar cuenta",
|
||||
"manageAccountText": "Administrar Cuenta",
|
||||
"nameChangeConfirm": "¿Cambiar tu nombre a ${NAME}?",
|
||||
"notLoggedInText": "<no estás conectado>",
|
||||
"resetProgressConfirmNoAchievementsText": "Esto reiniciará tu progreso en el modo\ncooperativo y tus puntajes (A excepción de tus tickets).\nNo podrás recuperar los cambios. ¿Estás seguro?",
|
||||
|
|
@ -33,7 +34,7 @@
|
|||
"signInWithTestAccountInfoText": "(Cuenta de prueba, usa la cuenta del dispositivo para avanzar)",
|
||||
"signInWithTestAccountText": "Registrarse con una Cuenta de Prueba",
|
||||
"signInWithV2InfoText": "(una cuenta que funciona en todas las plataformas)",
|
||||
"signInWithV2Text": "Inicie sesión con tú cuenta de BombSquad",
|
||||
"signInWithV2Text": "Inicia sesión con tu cuenta de BombSquad",
|
||||
"signOutText": "Cerrar Sesión",
|
||||
"signingInText": "Iniciando sesión...",
|
||||
"signingOutText": "Cerrando sesión...",
|
||||
|
|
@ -44,7 +45,8 @@
|
|||
"titleText": "Cuenta",
|
||||
"unlinkAccountsInstructionsText": "Selecciona una cuenta para dejar de enlazar con ella",
|
||||
"unlinkAccountsText": "Desenlazar Cuentas",
|
||||
"v2LinkInstructionsText": "Usa este encale para crearte una cuenta o para iniciar sesión",
|
||||
"unlinkLegacyV1AccountsText": "Desvincular Cuenta Heredada (V1)",
|
||||
"v2LinkInstructionsText": "Usa este enlace para crearte una cuenta o para iniciar sesión",
|
||||
"viaAccount": "(por cuenta ${NAME})",
|
||||
"youAreLoggedInAsText": "Estás conectado como:",
|
||||
"youAreSignedInAsText": "Has iniciado sesión como:"
|
||||
|
|
@ -372,7 +374,7 @@
|
|||
"challengeEndedText": "Este desafío ha terminado.",
|
||||
"chatMuteText": "Silenciar Chat",
|
||||
"chatMutedText": "Chat Silenciado",
|
||||
"chatUnMuteText": "Activar Chat",
|
||||
"chatUnMuteText": "Desmutear Chat",
|
||||
"choosingPlayerText": "<eligiendo jugador>",
|
||||
"completeThisLevelToProceedText": "¡Debes completar\neste nivel para avanzar!",
|
||||
"completionBonusText": "Bono extra por Acabar",
|
||||
|
|
@ -430,7 +432,7 @@
|
|||
"secondaryText": "Control Secundario",
|
||||
"startButtonActivatesDefaultDescriptionText": "(desactívalo si tu botón de inicio es más bien un botón de 'menú')",
|
||||
"startButtonActivatesDefaultText": "El botón de inicio activa la función por defecto",
|
||||
"titleText": "Configuración del Control",
|
||||
"titleText": "Configurar Control",
|
||||
"twoInOneSetupText": "Configuración de Controles 2 en 1",
|
||||
"uiOnlyDescriptionText": "(evitar que este control se una a un juego)",
|
||||
"uiOnlyText": "Limitar a Uso en Menú",
|
||||
|
|
@ -569,7 +571,9 @@
|
|||
"deleteText": "Borrar",
|
||||
"demoText": "Versión de prueba",
|
||||
"denyText": "Rechazar",
|
||||
"deprecatedText": "Obsoleto",
|
||||
"desktopResText": "Resolución del escritorio",
|
||||
"deviceAccountUpgradeText": "Advertencia:\nEstás conectado con una cuenta de dispositivo\n(${NAME}).\nLas cuentas de dispositivo serán removidas en una próxima actualización",
|
||||
"difficultyEasyText": "Fácil",
|
||||
"difficultyHardOnlyText": "Solo Modo Difícil",
|
||||
"difficultyHardText": "Difícil",
|
||||
|
|
@ -708,7 +712,7 @@
|
|||
"gamepadsDetectedText": "${COUNT} controles detectados.",
|
||||
"gamesToText": "${WINCOUNT} juegos a ${LOSECOUNT}",
|
||||
"gatherWindow": {
|
||||
"aboutDescriptionLocalMultiplayerExtraText": "Recuerda: cualquier dispositivo en la fiesta puede\ntener mas de un jugador si tienen controles suficientes.",
|
||||
"aboutDescriptionLocalMultiplayerExtraText": "Recuerda: cualquier dispositivo en la fiesta puede\ntener más de un jugador si tienen controles suficientes.",
|
||||
"aboutDescriptionText": "Usa estas pestañas para crear una fiesta.\n\nLas fiestas te permiten jugar y competir con\ntus amigos con sus propios dispositivos.\n\nUsa el botón ${PARTY} en la parte superior\nderecha para chatear e interactuar con tu fiesta.\n(En el control, presiona ${BUTTON} mientras estés en el menú)",
|
||||
"aboutText": "Acerca de",
|
||||
"addressFetchErrorText": "<error consiguiendo dirección>",
|
||||
|
|
@ -804,7 +808,7 @@
|
|||
"startStopHostingMinutesText": "Puede iniciar y detener el alojamiento de forma gratuita durante los próximos ${MINUTES} minutos.",
|
||||
"stopHostingText": "Dejar de alojar",
|
||||
"titleText": "Reúne",
|
||||
"wifiDirectDescriptionBottomText": "Si todo los dispositivos disponen de 'Wi-fi Directo', deberían poder utiizarlo para\nencontrar y conectarse entre ellos. Cuando todos estén coneectados, pudes formar \nfiestas, usando la pestaña 'Red Local', como si estuvieran en la misma red Wi-fi.\n\nPara mejores resultados, el host de Wi-fi Directo también debe de ser el host de la fiesta en ${APP_NAME}.",
|
||||
"wifiDirectDescriptionBottomText": "Si todo los dispositivos disponen de 'Wi-fi Directo', deberían poder utilizarlo para\nencontrar y conectarse entre ellos. Cuando todos estén conectados, puedes formar \nfiestas, usando la pestaña 'Red Local', como si estuvieran en la misma red Wi-fi.\n\nPara mejores resultados, el host de Wi-fi Directo también debe de ser el host de la fiesta en ${APP_NAME}.",
|
||||
"wifiDirectDescriptionTopText": "Wi-Fi Directo puede ser utilizado para conectar dispositivos Android sin\ntener que utilizar una red Wi-Fi. Esto funciona mejor de Android 4.2 o mas nuevo.\n\nPara utilizarlo, abre los ajustes de Wi-Fi y busca 'Wi-Fi Directo' en el menú.",
|
||||
"wifiDirectOpenWiFiSettingsText": "Abrir Ajustes Wi-Fi",
|
||||
"wifiDirectText": "Wi-Fi Directo",
|
||||
|
|
@ -845,6 +849,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Lo siento, Google's multijugador servicio ya no esta mas disponible.\nEstoy trabajando en un reemplazo lo mas rapido posible.\nHasta entonces, por favor intente con otro metodo de conexión.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Las compras de Google Play no están disponibles.\nEs posible que deba actualizar la aplicación de su tienda.",
|
||||
"googlePlayServicesNotAvailableText": "Servicios de Google Play no disponibles.\nAlgunas funciones de la aplicación pueden estar deshabilitadas.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Siempre",
|
||||
|
|
@ -859,7 +864,7 @@
|
|||
"resolutionText": "Resolución",
|
||||
"showFPSText": "Mostrar FPS",
|
||||
"texturesText": "Texturas",
|
||||
"titleText": "Gráficas",
|
||||
"titleText": "Gráficos",
|
||||
"tvBorderText": "Marco de TV",
|
||||
"verticalSyncText": "Sincronización vertical",
|
||||
"visualsText": "Visuales"
|
||||
|
|
@ -891,40 +896,40 @@
|
|||
"orPunchingSomethingTextScale": 0.51,
|
||||
"pickUpInfoText": "- Levanta -\nAlza banderas, enemigos, o cualquier\notra cosa no atornillada al suelo.\nPulsa de nuevo para lanzar.",
|
||||
"pickUpInfoTextScale": 0.6,
|
||||
"powerupBombDescriptionText": "Puedes tirar tres bombas de\nun solo tiro en vez de una sola.",
|
||||
"powerupBombNameText": "Triple-Bombas",
|
||||
"powerupCurseDescriptionText": "Probablemente querrás evitar estos.\n...¿o quizás no?",
|
||||
"powerupBombDescriptionText": "Te permite sacar tres bombas\nen una fila en lugar de solo una.",
|
||||
"powerupBombNameText": "Bombas Triples",
|
||||
"powerupCurseDescriptionText": "Probablemente quieras evitar estos.\n ...¿o quizás tú?",
|
||||
"powerupCurseNameText": "Maldición",
|
||||
"powerupHealthDescriptionText": "Restaura toda la salud.\nNunca lo hubieras adivinado.",
|
||||
"powerupHealthNameText": "Medicina",
|
||||
"powerupIceBombsDescriptionText": "Más débil que las bombas habituales\npero dejan a tus enemigos congelados\ny particularmente frágiles.",
|
||||
"powerupIceBombsNameText": "Bombas de hielo",
|
||||
"powerupImpactBombsDescriptionText": "Levemente más débiles que las bombas\nnormales, pero explotan al impacto.",
|
||||
"powerupImpactBombsNameText": "Insta-Bombas",
|
||||
"powerupHealthDescriptionText": "Te restaura a la salud completa.\nNunca lo habrías adivinado.",
|
||||
"powerupHealthNameText": "Botiquín",
|
||||
"powerupIceBombsDescriptionText": "Más débiles que las bombas normales\npero dejan a tus enemigos congelados\ny particularmente frágiles.",
|
||||
"powerupIceBombsNameText": "Bombas de Hielo",
|
||||
"powerupImpactBombsDescriptionText": "Levemente más débiles que las bombas\nregulares, pero explotan al impacto.",
|
||||
"powerupImpactBombsNameText": "Bombas de Gatillo",
|
||||
"powerupLandMinesDescriptionText": "Estas vienen en grupos de 3;\nSon buenas para defensa territorial\no para detener enemigos veloces.",
|
||||
"powerupLandMinesNameText": "Mina Terrestre",
|
||||
"powerupPunchDescriptionText": "Hace que tus golpes sean más duros,\nmás rápidos, mejores, y más fuertes.",
|
||||
"powerupLandMinesNameText": "Minas Terrestres",
|
||||
"powerupPunchDescriptionText": "Hacen que tus golpes sean más duros,\nmás rápidos, mejores, y más fuertes.",
|
||||
"powerupPunchNameText": "Guantes de Boxeo",
|
||||
"powerupShieldDescriptionText": "Absorbe un poco del impacto\npara que tu no tengas que hacerlo.",
|
||||
"powerupShieldNameText": "Electro-Escudo",
|
||||
"powerupStickyBombsDescriptionText": "Se adhieren a cualquier cosa.\nEn serio, es demasiado gracioso.",
|
||||
"powerupShieldDescriptionText": "Absorbe un poco de daño\npara que no tengas que hacerlo.",
|
||||
"powerupShieldNameText": "Escudo de Energía",
|
||||
"powerupStickyBombsDescriptionText": "Se adhieren a cualquier cosa.\nProducen hilaridad.",
|
||||
"powerupStickyBombsNameText": "Bombas Pegajosas",
|
||||
"powerupsSubtitleText": "Por supuesto, ningún juego está completo sin poderes extra:",
|
||||
"powerupsSubtitleText": "Por supuesto, ningún juego está completo sin potenciadores:",
|
||||
"powerupsSubtitleTextScale": 0.8,
|
||||
"powerupsText": "Poderes Extra",
|
||||
"powerupsText": "Potenciadores",
|
||||
"powerupsTextScale": 1.4,
|
||||
"punchInfoText": "- Golpe -\nEntre mas rápido te muevas más\nimpacto causan tus golpes, así que\ncorre, salta y da vueltas como loco.",
|
||||
"punchInfoText": "- Golpe -\nEntre más rápido te muevas más\nimpacto causan tus golpes, así que\ncorre, salta y da vueltas como loco.",
|
||||
"punchInfoTextScale": 0.6,
|
||||
"runInfoText": "- Correr -\nSostén CUALQUIER botón para correr. Los botones gatillos o traseros funcionan bien si los tienes.\nCorrer te hace llegar mas rápido pero es mas difícil girar, así que ten cuidado con los barrancos.",
|
||||
"runInfoText": "- Correr -\nSostén CUALQUIER botón para correr. Los botones gatillos o traseros funcionan bien si los tienes.\nCorrer te hace llegar más rápido pero es más difícil girar, así que ten cuidado con los barrancos.",
|
||||
"runInfoTextScale": 0.6,
|
||||
"someDaysText": "Hay días cuando sientes ganas de romper algo. O explotar algo.",
|
||||
"someDaysText": "Hay días cuando sientes ganas de romper algo. O explotarlo.",
|
||||
"someDaysTextScale": 0.66,
|
||||
"titleText": "Ayuda ${APP_NAME}",
|
||||
"toGetTheMostText": "Para sacar el máximo partido a este juego, necesitas:",
|
||||
"toGetTheMostTextScale": 1.0,
|
||||
"welcomeText": "¡Bienvenido a ${APP_NAME}!"
|
||||
},
|
||||
"holdAnyButtonText": "<sostén cualquier botón>",
|
||||
"holdAnyButtonText": "<mantén cualquier botón>",
|
||||
"holdAnyKeyText": "<sostén cualquier tecla>",
|
||||
"hostIsNavigatingMenusText": "- ${HOST} navega los menús como todo un pro -",
|
||||
"importPlaylistCodeInstructionsText": "Usa el siguiente código para importar esta lista de reproducción en otra parte",
|
||||
|
|
@ -937,7 +942,7 @@
|
|||
"arrowsToExitListText": "pulsa ${LEFT} o ${RIGHT} para salir de la lista",
|
||||
"buttonText": "botón",
|
||||
"cantKickHostError": "No puedes expulsar al host",
|
||||
"chatBlockedText": "A ${NAME} se le ha bloqueado el chat por ${TIME} segundos.",
|
||||
"chatBlockedText": "A ${NAME} le hemos bloqueado el chat por ${TIME} segundos.",
|
||||
"connectedToGameText": "'${NAME}' se unió",
|
||||
"connectedToPartyText": "¡Unido a la fiesta de ${NAME}!",
|
||||
"connectingToPartyText": "Conectando...",
|
||||
|
|
@ -959,7 +964,7 @@
|
|||
"errorPlayingMusicText": "Error al reproducir música: ${MUSIC}",
|
||||
"errorResettingAchievementsText": "No se pudieron reiniciar los logros; por favor inténtalo de nuevo.",
|
||||
"hasMenuControlText": "${NAME} Tiene control del menú.",
|
||||
"incompatibleNewerVersionHostText": "El host esta corriendo una versión nueva del juego.\nActualiza a la última versión y vuelve a intentarlo.",
|
||||
"incompatibleNewerVersionHostText": "El host está corriendo una versión nueva del juego.\nActualiza a la última versión y vuelve a intentarlo.",
|
||||
"incompatibleVersionHostText": "Host corre una versión diferente del juego; imposible conectar.\nAsegúrese de que ambos están actualizados y vuelva a intentar.",
|
||||
"incompatibleVersionPlayerText": "${NAME} está corriendo una versión diferente del juego y no se ha podido conectar.\nAsegúrese de que ambos están actualizados y vuelva a intentar.",
|
||||
"invalidAddressErrorText": "Error: Dirección inválida.",
|
||||
|
|
@ -978,7 +983,7 @@
|
|||
"playerJoinedPartyText": "¡${NAME} se unió a la fiesta!",
|
||||
"playerLeftPartyText": "${NAME} se fue de la fiesta.",
|
||||
"rejectingInviteAlreadyInPartyText": "Rechazando invitación (Ya en una fiesta).",
|
||||
"serverRestartingText": "El servidor se está reiniciando. Conectese en un momento...",
|
||||
"serverRestartingText": "El servidor se está reiniciando. Conéctese en un momento...",
|
||||
"serverShuttingDownText": "El servidor está fuera de servicio...",
|
||||
"signInErrorText": "Error iniciando sesión.",
|
||||
"signInNoConnectionText": "Imposible iniciar sesión (¿No hay conexión a internet?)",
|
||||
|
|
@ -995,7 +1000,7 @@
|
|||
"willTimeOutText": "(caducará si está inactivo)"
|
||||
},
|
||||
"jumpBoldText": "SALTA",
|
||||
"jumpText": "Salta",
|
||||
"jumpText": "Brinca",
|
||||
"keepText": "Mantener",
|
||||
"keepTheseSettingsText": "¿Mantener estos ajustes?",
|
||||
"keyboardChangeInstructionsText": "Presiona dos veces el espacio para cambiar los teclados.",
|
||||
|
|
@ -1008,7 +1013,7 @@
|
|||
"kickVoteCantKickSelfText": "No puedes expulsarte a ti mismo",
|
||||
"kickVoteFailedNotEnoughVotersText": "No hay suficientes jugadores para votar.",
|
||||
"kickVoteFailedText": "Votación de expulsión fallida",
|
||||
"kickVoteStartedText": "Se ha iniciado una votación para expulsar a '${NAME}'",
|
||||
"kickVoteStartedText": "Han iniciado una votación para expulsar a '${NAME}'.",
|
||||
"kickVoteText": "Vota para expulsar",
|
||||
"kickVotingDisabledText": "El voto para expulsar no está disponible",
|
||||
"kickWithChatText": "Escribe ${YES} en el chat para \"Si\" y ${NO} para \"No\".",
|
||||
|
|
@ -1081,15 +1086,16 @@
|
|||
"mapSelectText": "Seleccionar…",
|
||||
"mapSelectTitleText": "Pistas: ${GAME}",
|
||||
"mapText": "Pista",
|
||||
"maxConnectionsText": "Conexiones maximas",
|
||||
"maxConnectionsText": "Conexiones máximas",
|
||||
"maxPartySizeText": "Capacidad máxima de la fiesta",
|
||||
"maxPlayersText": "Jugadores máximos",
|
||||
"merchText": "Mercado!",
|
||||
"modeArcadeText": "Modo Arcade",
|
||||
"modeClassicText": "Modo Clásico",
|
||||
"modeDemoText": "Modo De Demostración",
|
||||
"mostValuablePlayerText": "Jugador más Valorado",
|
||||
"mostViolatedPlayerText": "Jugador más Agredido",
|
||||
"mostViolentPlayerText": "Jugador más Violento",
|
||||
"mostViolatedPlayerText": "Jugador más Violado",
|
||||
"mostViolentPlayerText": "Jugador más Matador",
|
||||
"moveText": "Mover",
|
||||
"multiKillText": "¡¡¡${COUNT}-COMBO!!!",
|
||||
"multiPlayerCountText": "${COUNT} jugadores",
|
||||
|
|
@ -1099,8 +1105,8 @@
|
|||
"nameKilledText": "${NAME} mató a ${VICTIM}.",
|
||||
"nameNotEmptyText": "¡El nombre no puede quedar vacío!",
|
||||
"nameScoresText": "¡${NAME} anotó!",
|
||||
"nameSuicideKidFriendlyText": "${NAME} murió accidentalmente.",
|
||||
"nameSuicideText": "${NAME} se suicidó.",
|
||||
"nameSuicideKidFriendlyText": "${NAME} murió por accidente.",
|
||||
"nameSuicideText": "${NAME} se a suicidado.",
|
||||
"nameText": "Nombre",
|
||||
"nativeText": "Nativo",
|
||||
"newPersonalBestText": "¡Nuevo récord personal!",
|
||||
|
|
@ -1112,7 +1118,7 @@
|
|||
"noAchievementsRemainingText": "- ninguno",
|
||||
"noContinuesText": "(sin re-intentos)",
|
||||
"noExternalStorageErrorText": "No se encontraron almacenamientos externos en este dispositivo",
|
||||
"noGameCircleText": "Error: No haz autenticado con GameCircle",
|
||||
"noGameCircleText": "Error: No has autenticado con GameCircle",
|
||||
"noJoinCoopMidwayText": "Jugadores no pueden unirse en mitad de un juego.",
|
||||
"noProfilesErrorText": "No haz creado ningún perfil, por lo que tendrás que llamarte '${NAME}'.\nVe a Ajustes>Perfiles para que te hagas un perfil.",
|
||||
"noScoresYetText": "Sin puntuaciones aún.",
|
||||
|
|
@ -1120,11 +1126,12 @@
|
|||
"noTournamentsInTestBuildText": "ADVERTENCIA: los puntajes de los torneos en esta versión de prueba serán ignorados.",
|
||||
"noValidMapsErrorText": "No hay pistas para este tipo de juego.",
|
||||
"notEnoughPlayersRemainingText": "Cantidad necesaria de jugadores no coincide; inicia un juego nuevo.",
|
||||
"notEnoughPlayersText": "¡Necesitas al menos ${COUNT} jugadores para empezar este juego!",
|
||||
"notEnoughPlayersText": "¡Necesitas por lo menos ${COUNT} jugadores para comenzar!",
|
||||
"notNowText": "Ahora no",
|
||||
"notSignedInErrorText": "Necesitas registrarte para hacer esto.",
|
||||
"notSignedInGooglePlayErrorText": "Debes iniciar sesión con Google Play para hacer esto.",
|
||||
"notSignedInText": "No registrado",
|
||||
"notUsingAccountText": "Nota: ignorando su cuenta de ${SERVICE}.\nVaya a 'Cuenta -> Ingresar con ${SERVICE}' si quieres usarla",
|
||||
"nothingIsSelectedErrorText": "¡No hay nada seleccionado!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Apagado",
|
||||
|
|
@ -1135,11 +1142,11 @@
|
|||
"orText": "${A} o ${B}",
|
||||
"otherText": "Otros...",
|
||||
"outOfText": "(#${RANK} de ${ALL})",
|
||||
"ownFlagAtYourBaseWarning": "Tu propia bandera debe estar\nen su base para anotar!",
|
||||
"ownFlagAtYourBaseWarning": "Tu misma bandera debe estar\nen su lugar para anotar!",
|
||||
"packageModsEnabledErrorText": "Juegos de red no están permitidos mientras paquetes modificadores estén habilitados (ver Ajustes->Avanzado)",
|
||||
"partyWindow": {
|
||||
"chatMessageText": "Mensaje del Chat",
|
||||
"emptyText": "Tu fiesta esta vacia",
|
||||
"emptyText": "Tu fiesta está vacía",
|
||||
"hostText": "(host)",
|
||||
"sendText": "Enviar",
|
||||
"titleText": "Tu Fiesta"
|
||||
|
|
@ -1152,7 +1159,7 @@
|
|||
"coopText": "Cooperativo",
|
||||
"freeForAllText": "Todos contra Todos",
|
||||
"multiTeamText": "Múltiples Equipos",
|
||||
"singlePlayerCoopText": "Sólo un Jugador / Co-op",
|
||||
"singlePlayerCoopText": "Solo un Jugador / Co-op",
|
||||
"teamsText": "Equipos"
|
||||
},
|
||||
"playText": "Jugar",
|
||||
|
|
@ -1188,7 +1195,11 @@
|
|||
"pleaseWaitText": "Por favor, espera...",
|
||||
"pluginClassLoadErrorText": "Error al cargar la clase del plugin '${PLUGIN}': ${ERROR}",
|
||||
"pluginInitErrorText": "Error al iniciar el plugin '${PLUGIN}': ${ERROR}",
|
||||
"pluginSettingsText": "Ajustes del Plugin",
|
||||
"pluginsAutoEnableNewText": "Activar Plugins automáticamente",
|
||||
"pluginsDetectedText": "Nuevos complemento(s) detectados. Reinicie para activarlos, o configúrelos en la configuración",
|
||||
"pluginsDisableAllText": "Desactivar todos los Plugins",
|
||||
"pluginsEnableAllText": "Activar todos los Plugins",
|
||||
"pluginsRemovedText": "${NUM} plugin(s) ya no se encuentran.",
|
||||
"pluginsText": "Plugins",
|
||||
"practiceText": "Práctica",
|
||||
|
|
@ -1221,7 +1232,7 @@
|
|||
"publicBetaText": "BETA PUBLICA",
|
||||
"punchBoldText": "GOLPE",
|
||||
"punchText": "Golpe",
|
||||
"purchaseForText": "Comprar por ${PRICE}",
|
||||
"purchaseForText": "Comprar por este precio : ${PRICE}",
|
||||
"purchaseGameText": "Comprar Juego",
|
||||
"purchasingText": "Comprando...",
|
||||
"quitGameText": "¿Cerrar ${APP_NAME}?",
|
||||
|
|
@ -1332,6 +1343,7 @@
|
|||
"netTestingText": "Prueba de Red",
|
||||
"resetText": "Reiniciar",
|
||||
"showBombTrajectoriesText": "Mostrar trayectorias",
|
||||
"showInGamePingText": "Visualizar Ping en el juego",
|
||||
"showPlayerNamesText": "Mostrar Nombres de los Jugadores",
|
||||
"showUserModsText": "Mostrar Carpeta de Mods",
|
||||
"titleText": "Avanzado",
|
||||
|
|
@ -1403,14 +1415,14 @@
|
|||
"purchaseConfirmText": "¿Comprar ${ITEM}?",
|
||||
"purchaseNotValidError": "Compra inválida.\nContacte ${EMAIL} si esto es un error.",
|
||||
"purchaseText": "Comprar",
|
||||
"saleBundleText": "Paquete en Oferta!",
|
||||
"saleBundleText": "¡Paquete en Oferta!",
|
||||
"saleExclaimText": "¡Oferta!",
|
||||
"salePercentText": "(${PERCENT}% menos)",
|
||||
"saleText": "OFERTA",
|
||||
"searchText": "Buscar",
|
||||
"teamsFreeForAllGamesText": "En Equipos / Todos contra Todos",
|
||||
"totalWorthText": "*** ¡${TOTAL_WORTH} de valor! ***",
|
||||
"upgradeQuestionText": "¿Comprar Bombsquad Pro?",
|
||||
"upgradeQuestionText": "¿Comprar BombSquad Pro?",
|
||||
"winterSpecialText": "Especial de Invierno",
|
||||
"youOwnThisText": "- ya posees esto -"
|
||||
},
|
||||
|
|
@ -1463,7 +1475,7 @@
|
|||
"Bernard": "Bernard",
|
||||
"Bones": "Huesos",
|
||||
"Butch": "Butch",
|
||||
"Easter Bunny": "Conejo de pascua",
|
||||
"Easter Bunny": "Conejo de Pascua",
|
||||
"Flopsy": "Flopsy",
|
||||
"Frosty": "Frosty",
|
||||
"Gretel": "Gretel",
|
||||
|
|
@ -1625,6 +1637,7 @@
|
|||
"Italian": "Italiano",
|
||||
"Japanese": "Japonés",
|
||||
"Korean": "Coreano",
|
||||
"Malay": "Malayo",
|
||||
"Persian": "Persa",
|
||||
"Polish": "Polaco",
|
||||
"Portuguese": "Portugués",
|
||||
|
|
@ -1692,7 +1705,7 @@
|
|||
"An error has occurred; please contact support. (${ERROR})": "Se ha producido un error; por favor contácte con soporte. (${ERROR})",
|
||||
"An error has occurred; please contact support@froemling.net.": "Ha ocurrido un error; contacta a support@froemling.net.",
|
||||
"An error has occurred; please try again later.": "Un error ha ocurrido; por favor intenta más tarde.",
|
||||
"Are you sure you want to link these accounts?\n\n${ACCOUNT1}\n${ACCOUNT2}\n\nThis cannot be undone!": "Quieres enlazar estas cuentas?\n\n${ACCOUNT1}\n${ACCOUNT2}\n\n¡Esto no se puede deshacer!",
|
||||
"Are you sure you want to link these accounts?\n\n${ACCOUNT1}\n${ACCOUNT2}\n\nThis cannot be undone!": "¿Quieres enlazar estas cuentas?\n\n${ACCOUNT1}\n${ACCOUNT2}\n\n¡Esto no se puede deshacer!",
|
||||
"BombSquad Pro unlocked!": "¡BombSquad Pro desbloqueado!",
|
||||
"Can't link 2 accounts of this type.": "No puedes enlazar dos cuentas de este tipo.",
|
||||
"Can't link 2 diamond league accounts.": "No pueden enlazar dos cuentas de liga diamante.",
|
||||
|
|
@ -1794,56 +1807,56 @@
|
|||
"statements": {
|
||||
"${TEAM} is disqualified because ${PLAYER} left": "El equipo ${TEAM} ha sido descalificado porque ${PLAYER} se ha ido.",
|
||||
"Killing ${NAME} for skipping part of the track!": "¡Matando a ${NAME} por saltarse un pedazo de la pista!",
|
||||
"Warning to ${NAME}: turbo / button-spamming knocks you out.": "Advertencia para ${NAME}: turbo / El spameo de botones te noqueara."
|
||||
"Warning to ${NAME}: turbo / button-spamming knocks you out.": "Advertencia para ${NAME}: turbo / El spameo de botones te noqueará."
|
||||
},
|
||||
"teamNames": {
|
||||
"Bad Guys": "Chicos malos",
|
||||
"Bad Guys": "Chicos Malos",
|
||||
"Blue": "Azul",
|
||||
"Good Guys": "Chicos Buenos",
|
||||
"Red": "Rojo"
|
||||
},
|
||||
"tips": {
|
||||
"A perfectly timed running-jumping-spin-punch can kill in a single hit\nand earn you lifelong respect from your friends.": "Un 'corre-salta-gira-golpea' puede destrozar de un solo impacto\ny ganarte el respeto de tus amigos por toda la vida.",
|
||||
"A perfectly timed running-jumping-spin-punch can kill in a single hit\nand earn you lifelong respect from your friends.": "Un 'corre-salta-gira-golpea' puede destrozar de un solo impacto\ny ganarte el respeto de tus amigos para toda la vida.",
|
||||
"Always remember to floss.": "Siempre acuérdate de cepillar tus dientes.",
|
||||
"Create player profiles for yourself and your friends with\nyour preferred names and appearances instead of using random ones.": "Crea perfiles para ti y tus amigos con nombres\ny colores personalizados en vez de usar aleatorios.",
|
||||
"Curse boxes turn you into a ticking time bomb.\nThe only cure is to quickly grab a health-pack.": "La maldición te convierte en una bomba de tiempo.\nLa única cura es coger una caja de salud.",
|
||||
"Curse boxes turn you into a ticking time bomb.\nThe only cure is to quickly grab a health-pack.": "Las cajas de maldición te convierten en una bomba de tiempo.\nLa única cura es agarrar rápidamente un botiquín.",
|
||||
"Despite their looks, all characters' abilities are identical,\nso just pick whichever one you most closely resemble.": "A pesar de su apariencia, las habilidades de todos los personajes\nson idénticas, así que escoge el que más se parezca a ti.",
|
||||
"Don't get too cocky with that energy shield; you can still get yourself thrown off a cliff.": "No eres invencible con ese Electro-Escudo, todavía te pueden arrojar por un precipicio.",
|
||||
"Don't get too cocky with that energy shield; you can still get yourself thrown off a cliff.": "No te pongas demasiado engreído(a) con ese escudo de energía; todavía puedes caerte de un acantilado.",
|
||||
"Don't run all the time. Really. You will fall off cliffs.": "No corras todo el tiempo. En serio. Te vas a caer.",
|
||||
"Don't spin for too long; you'll become dizzy and fall.": "No gires por un largo tiempo; puedes marearte y caer.",
|
||||
"Hold any button to run. (Trigger buttons work well if you have them)": "Sostén cualquier botón para correr. (Los botones de gatillo son para eso)",
|
||||
"Hold down any button to run. You'll get places faster\nbut won't turn very well, so watch out for cliffs.": "Mantén pulsado cualquier botón para correr. Llegarás a lugares rápido\npero no girarás muy bien, así que ten cuidado con los acantilados.",
|
||||
"Ice bombs are not very powerful, but they freeze\nwhoever they hit, leaving them vulnerable to shattering.": "Las Bombas de hielo no son muy potentes, pero congelan lo\nque toquen, dejando a tus enemigos vulnerables a romperse.",
|
||||
"If someone picks you up, punch them and they'll let go.\nThis works in real life too.": "Si alguien te levanta, golpéalos y ve como te sueltan.\nTambién funciona en la vida real.",
|
||||
"If you are short on controllers, install the '${REMOTE_APP_NAME}' app\non your mobile devices to use them as controllers.": "Si no tienes suficientes controles, instala la aplicación '${REMOTE_APP_NAME}'\nen tu teléfono celulares para utilizarlos como controles.",
|
||||
"If someone picks you up, punch them and they'll let go.\nThis works in real life too.": "Si alguien te levanta, golpéalos y ellos te soltarán.\nTambién funciona en la vida real.",
|
||||
"If you are short on controllers, install the '${REMOTE_APP_NAME}' app\non your mobile devices to use them as controllers.": "Si no tienes suficientes controles, instala la aplicación '${REMOTE_APP_NAME}'\nen tus dispositivos móviles para utilizarlos como controles.",
|
||||
"If you are short on controllers, install the 'BombSquad Remote' app\non your iOS or Android devices to use them as controllers.": "Te faltan controles? Instala la aplicación 'BombSquad Remote'\nen tu dispositivo iOS o Android para usarlo como control.",
|
||||
"If you get a sticky-bomb stuck to you, jump around and spin in circles. You might\nshake the bomb off, or if nothing else your last moments will be entertaining.": "Si te adhieres a una bomba pegajosa, salta y da muchas vueltas. Es posible que sacudas\nla bomba pegada, o sin nada más, tus últimos momentos serán entretenidos.",
|
||||
"If you kill an enemy in one hit you get double points for it.": "Si eliminas a un enemigo de un golpe ganas doble puntos.",
|
||||
"If you pick up a curse, your only hope for survival is to\nfind a health powerup in the next few seconds.": "Si levantas una maldición, tu única esperanza es\nencontrar una caja de salud en tus últimos segundos.",
|
||||
"If you stay in one place, you're toast. Run and dodge to survive..": "Si te quedas quieto, estás perdido. Corre y esquiva para sobrevivir...",
|
||||
"If you kill an enemy in one hit you get double points for it.": "Si matas a un enemigo de un solo golpe obtendrás puntos dobles.",
|
||||
"If you pick up a curse, your only hope for survival is to\nfind a health powerup in the next few seconds.": "Si tomaste una maldición, tu única esperanza es\nencontrar un botiquín en tus últimos segundos.",
|
||||
"If you stay in one place, you're toast. Run and dodge to survive..": "Si te quedas quieto, estás frito. Corre y esquiva para sobrevivir...",
|
||||
"If you've got lots of players coming and going, turn on 'auto-kick-idle-players'\nunder settings in case anyone forgets to leave the game.": "Si tienes muchos jugadores yendo y viniendo, activa 'expulsar jugadores inactivos'\nen ajustes en caso de que alguien se olvide de abandonar el juego.",
|
||||
"If your device gets too warm or you'd like to conserve battery power,\nturn down \"Visuals\" or \"Resolution\" in Settings->Graphics": "Si tu dispositivo se pone caliente o te gustaria conservar bateria,\nbaja los \"Visuales\" o \"Resolución\" en configuración->Gráficos",
|
||||
"If your device gets too warm or you'd like to conserve battery power,\nturn down \"Visuals\" or \"Resolution\" in Settings->Graphics": "Si tu dispositivo se pone caliente o te gustaría conservar batería,\nbaja los \"Visuales\" o \"Resolución\" en configuración->Gráficos",
|
||||
"If your framerate is choppy, try turning down resolution\nor visuals in the game's graphics settings.": "Si la imagen va lenta, intenta reducir la resolución\no los visuales en los ajustes gráficos del juego.",
|
||||
"In Capture-the-Flag, your own flag must be at your base to score, If the other\nteam is about to score, stealing their flag can be a good way to stop them.": "En Captura la Bandera, la tuya debe estar en tu base para que anotes.\nSi el otro equipo está a punto de anotar, el arrebatar su bandera evitará que lo hagan.",
|
||||
"In hockey, you'll maintain more speed if you turn gradually.": "En hockey, mantendrás tu impulso si giras gradualmente.",
|
||||
"It's easier to win with a friend or two helping.": "Es mas fácil ganar con un amigo.",
|
||||
"Jump just as you're throwing to get bombs up to the highest levels.": "Brinca antes de lanzar una bomba para que alcance lugares altos.",
|
||||
"Land-mines are a good way to stop speedy enemies.": "Las minas son una buena manera para detener a los enemigos veloces.",
|
||||
"It's easier to win with a friend or two helping.": "Es más fácil ganar con un amigo.",
|
||||
"Jump just as you're throwing to get bombs up to the highest levels.": "Salta antes de lanzar una bomba para que alcance lugares altos.",
|
||||
"Land-mines are a good way to stop speedy enemies.": "Las minas terrestres son una buena manera para detener a los enemigos veloces.",
|
||||
"Many things can be picked up and thrown, including other players. Tossing\nyour enemies off cliffs can be an effective and emotionally fulfilling strategy.": "Muchas cosas se pueden recoger y lanzar, incluyendo a otros jugadores.\nArroja a tus enemigos por los precipicios. Te sentirás mejor.",
|
||||
"No, you can't get up on the ledge. You have to throw bombs.": "No, no puedes subir a la cornisa. Tienes que lanzar bombas.",
|
||||
"Players can join and leave in the middle of most games,\nand you can also plug and unplug controllers on the fly.": "Jugadores pueden unirse e irse en medio de casi todos los juegos,\ntambién puedes poner o quitar controles en cualquier momento.",
|
||||
"Players can join and leave in the middle of most games,\nand you can also plug and unplug gamepads on the fly.": "Los jugadores pueden unirse y abandonar en el transcurso del juego,\ny también puedes conectar y desconectar controles cuando quieras.",
|
||||
"Powerups only have time limits in co-op games.\nIn teams and free-for-all they're yours until you die.": "Los poderes sólo tienen tiempo límite en juego cooperativo.\nEn los equipos y Pelea libre son tuyos hasta que seas eliminado.",
|
||||
"Practice using your momentum to throw bombs more accurately.": "Practica con tu impulso para lanzar bombas con más precisión.",
|
||||
"Punches do more damage the faster your fists are moving,\nso try running, jumping, and spinning like crazy.": "Cuanto más rápido se mueven tu puños, tus golpes tienen\nmás impacto, así que corre, salta y gira como un loco.",
|
||||
"Punches do more damage the faster your fists are moving,\nso try running, jumping, and spinning like crazy.": "Tus golpes harán más daño dependiendo de que tan rápido tus puños se muevan,\nasí que intenta correr, saltar, y girar como un loco.",
|
||||
"Run back and forth before throwing a bomb\nto 'whiplash' it and throw it farther.": "Corre de un lado a otro antes de lanzar una\nbomba de 'latigazo' para lanzarla lejos.",
|
||||
"Take out a group of enemies by\nsetting off a bomb near a TNT box.": "Elimina un gran cantidad de enemigos\nal detonar una bomba cerca del TNT.",
|
||||
"The head is the most vulnerable area, so a sticky-bomb\nto the noggin usually means game-over.": "La cabeza es la zona más vulnerable, una bomba pegajosa\na la cabeza generalmente significa el fin.",
|
||||
"Take out a group of enemies by\nsetting off a bomb near a TNT box.": "Elimina un gran cantidad de enemigos\nal detonar una bomba cerca de una caja TNT.",
|
||||
"The head is the most vulnerable area, so a sticky-bomb\nto the noggin usually means game-over.": "La cabeza es la zona más vulnerable, una bomba pegajosa\na la cabeza usualmente significa game-over.",
|
||||
"This level never ends, but a high score here\nwill earn you eternal respect throughout the world.": "Este nivel no tiene fin, pero un alto puntaje aquí\nte hará ganar el respeto eterno por todo el mundo.",
|
||||
"Throw strength is based on the direction you are holding.\nTo toss something gently in front of you, don't hold any direction.": "La fuerza de tiro se basa en la dirección que estás sosteniendo.\nPara arrojar algo justo delante de ti, no sostengas ninguna dirección.",
|
||||
"Tired of the soundtrack? Replace it with your own!\nSee Settings->Audio->Soundtrack": "¿Cansado de la pista de audio? ¡Reemplázala con tu música!\nVe a Ajustes->Audio->Banda Sonora",
|
||||
"Try 'Cooking off' bombs for a second or two before throwing them.": "'Cocina tus Bombas' por un segundo o dos antes de tirarlas.",
|
||||
"Try tricking enemies into killing eachother or running off cliffs.": "Engaña a tus enemigos para que se eliminen entre sí o para que corran a los barrancos.",
|
||||
"Try tricking enemies into killing eachother or running off cliffs.": "Engaña a tus enemigos para que se eliminen entre sí o para que corran a los acantilados.",
|
||||
"Use the pick-up button to grab the flag < ${PICKUP} >": "Usa el botón de 'levantar' para llevar la bandera < ${PICKUP} >",
|
||||
"Whip back and forth to get more distance on your throws..": "Bate de un lado a otro para tirar las bombas más lejos..",
|
||||
"You can 'aim' your punches by spinning left or right.\nThis is useful for knocking bad guys off edges or scoring in hockey.": "Puedes 'dirigir' tus golpes girando a la izquierda o derecha. Esto\nes útil para tirar a los enemigos al vacío o para anotar en el hockey.",
|
||||
|
|
@ -1915,6 +1928,7 @@
|
|||
"usesExternalControllerText": "Este juego usa un control externo como entrada.",
|
||||
"usingItunesText": "Usando la aplicación de música para la banda sonora...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Asegúrate de que mezclar esté ENCENDIDO y repetir TODOS esté activado en iTunes.",
|
||||
"v2AccountLinkingInfoText": "Para vincular las cuentas V2, utilice el botón \"Administrar cuenta\".",
|
||||
"validatingBetaText": "Validando Beta…",
|
||||
"validatingTestBuildText": "Validando versión de prueba...",
|
||||
"victoryText": "¡Victoria!",
|
||||
|
|
@ -1926,7 +1940,7 @@
|
|||
"waitingForHostText": "(esperando a que ${HOST} continúe)",
|
||||
"waitingForLocalPlayersText": "Esperando jugadores locales...",
|
||||
"waitingForPlayersText": "esperando a jugadores para unirse...",
|
||||
"waitingInLineText": "Esperando en línea (la fiesta esta llena)...",
|
||||
"waitingInLineText": "Esperando en línea (la fiesta está llena)...",
|
||||
"watchAVideoText": "Ver un Vídeo",
|
||||
"watchAnAdText": "Mira un Anuncio",
|
||||
"watchWindow": {
|
||||
|
|
@ -1949,6 +1963,7 @@
|
|||
},
|
||||
"waveText": "Horda",
|
||||
"wellSureText": "¡Pues claro!",
|
||||
"whatIsThisText": "Qué es esto?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "Marca registrada DarwiinRemote"
|
||||
},
|
||||
|
|
@ -1972,7 +1987,7 @@
|
|||
"winsPlayerText": "¡${NAME} Gana!",
|
||||
"winsTeamText": "¡${NAME} Gana!!",
|
||||
"winsText": "¡${NAME} Gana!",
|
||||
"workspaceSyncErrorText": "Error al sincronizar ${WORKSPACE}. Mira el registro para mas detalles.",
|
||||
"workspaceSyncErrorText": "Error al sincronizar ${WORKSPACE}. Mira el registro para más detalles.",
|
||||
"workspaceSyncReuseText": "No se puede sincronizar ${WORKSPACE}. Reusando la versión sincronizada anterior.",
|
||||
"worldScoresUnavailableText": "Puntuaciones globales no disponibles.",
|
||||
"worldsBestScoresText": "Mejores puntuaciones Mundiales",
|
||||
|
|
@ -1987,7 +2002,7 @@
|
|||
"ouyaInstructionsTextScale": 0.8,
|
||||
"titleText": "Controles de Xbox 360 con ${APP_NAME}:"
|
||||
},
|
||||
"yesAllowText": "¡Si, permitelo!",
|
||||
"yesAllowText": "¡Sí, permítelo!",
|
||||
"yourBestScoresText": "Tus Mejores Puntuaciones",
|
||||
"yourBestTimesText": "Tus Mejores Tiempos"
|
||||
}
|
||||
15
dist/ba_data/data/languages/swedish.json
vendored
15
dist/ba_data/data/languages/swedish.json
vendored
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Du kan enbart ändra detta en gång per säsong.",
|
||||
"changeOncePerSeasonError": "Du måste vänta tills nästa säsong för att ändra detta igen (${NUM} days)",
|
||||
"customName": "Anpassat Namn",
|
||||
"googlePlayGamesAccountSwitchText": "Om du vill använda ett annat Google-konto,\nanvänd appen Google Play Spel för att byta.",
|
||||
"linkAccountsEnterCodeText": "Skriv in kod",
|
||||
"linkAccountsGenerateCodeText": "Generera kod",
|
||||
"linkAccountsInfoText": "(dela framsteg över olika plattformar)",
|
||||
|
|
@ -15,6 +16,7 @@
|
|||
"linkAccountsInstructionsText": "För att länka ihop två konton, generera en kod på\nett av dem och skriv in den på det andra. Framsteg\noch samlingar kommer att föras samman. Du kan länka \nupp till ${COUNT} konton.\n\nVar försiktig, detta kan inte ångras! ",
|
||||
"linkAccountsText": "Länka konton",
|
||||
"linkedAccountsText": "Länkade konton:",
|
||||
"manageAccountText": "Hantera konto",
|
||||
"nameChangeConfirm": "Ändra nanmnet på ditt konto till ${NAME}?",
|
||||
"notLoggedInText": "<ej inloggad>",
|
||||
"resetProgressConfirmNoAchievementsText": "Detta kommer att återställa co-op spel och \npoäng (men inte dina värdekuponger). Kan ej ångras.\nÄr du säker?",
|
||||
|
|
@ -807,7 +809,7 @@
|
|||
"ticketsFromASponsorText": "Få ${COUNT} värdekuponger\nfrån en sponsor",
|
||||
"ticketsText": "${COUNT} Värdekuponger",
|
||||
"titleText": "Skaffa Värdekuponger",
|
||||
"unavailableLinkAccountText": "Sorry, det går inte att göra inköp på den här plattformen. \nOm du vill kan du länka det här kontot till en annan\nplattform och göra inköpen där.",
|
||||
"unavailableLinkAccountText": "Tyvärr, köp är inte tillgängliga på den här plattformen.\nSom en lösning kan du länka detta konto till ett konto på\nen annan plattform och gör inköp där.",
|
||||
"unavailableTemporarilyText": "Detta är inte tillgänglig för tillfället; försök igen senare.",
|
||||
"unavailableText": "Tyvärr, detta är inte tillgängligt.",
|
||||
"versionTooOldText": "Tyvärr, denna version av spelet är för gammalt; vänligen uppgradera till en nyare.",
|
||||
|
|
@ -1306,15 +1308,24 @@
|
|||
"tournamentsText": "Turneringar",
|
||||
"translations": {
|
||||
"characterNames": {
|
||||
"Agent Johnson": "Agent Johnson",
|
||||
"B-9000": "B-9000",
|
||||
"Bernard": "Bernard",
|
||||
"Bones": "Bones",
|
||||
"Butch": "Butch",
|
||||
"Easter Bunny": "Påskharen",
|
||||
"Flopsy": "Floppy",
|
||||
"Frosty": "Frostig",
|
||||
"Gretel": "Greta",
|
||||
"Middle-Man": "Mellanhand",
|
||||
"Pixel": "Pixel",
|
||||
"Santa Claus": "Jultomten",
|
||||
"Snake Shadow": "Ormskugga",
|
||||
"Zoe": "Zoe"
|
||||
"Spaz": "Spaz",
|
||||
"Taobao Mascot": "Taobao maskot",
|
||||
"Todd McBurton": "Todd McBurton",
|
||||
"Zoe": "Zoe",
|
||||
"Zola": "Zola"
|
||||
},
|
||||
"coopLevelNames": {
|
||||
"${GAME} Training": "${GAME} Övning",
|
||||
|
|
|
|||
10
dist/ba_data/data/languages/tamil.json
vendored
10
dist/ba_data/data/languages/tamil.json
vendored
|
|
@ -7,6 +7,7 @@
|
|||
"changeOncePerSeason": "ஒரு பருவத்திற்கு ஒரு முறை மட்டுமே இதை மாற்ற முடியும்.",
|
||||
"changeOncePerSeasonError": "இதை மீண்டும் மாற்ற அடுத்த சீசன் வரை நீங்கள் காத்திருக்க வேண்டும் (${NUM} நாட்கள்)",
|
||||
"customName": "தனிப்பயன் பெயர்",
|
||||
"googlePlayGamesAccountSwitchText": "நீங்கள் வேறு Google கணக்கைப் பயன்படுத்த விரும்பினால்,\nமாறுவதற்கு Google Play கேம்ஸ் பயன்பாட்டைப் பயன்படுத்தவும்.",
|
||||
"linkAccountsEnterCodeText": "குறியீட்டை உள்ளிடவும்",
|
||||
"linkAccountsGenerateCodeText": "குறியீட்டை உருவாக்கவும்",
|
||||
"linkAccountsInfoText": "வெவ்வேறு தளங்களில் முன்னேற்றத்தைப் பகிரலாம்",
|
||||
|
|
@ -37,6 +38,7 @@
|
|||
"titleText": "கணக்கு",
|
||||
"unlinkAccountsInstructionsText": "இணைப்பை நீக்குவதற்கான கணக்கைத் தேர்ந்தெடுக்கவும்",
|
||||
"unlinkAccountsText": "கணக்கை நீக்க",
|
||||
"unlinkLegacyV1AccountsText": "மரபு (V1) கணக்குகளின் இணைப்பை நீக்கு",
|
||||
"v2LinkInstructionsText": "கணக்கை உருவாக்க அல்லது உள்நுழைய இந்த இணைப்பைப் பயன்படுத்தவும்.",
|
||||
"viaAccount": "${NAME} கணக்கின் வழியாக",
|
||||
"youAreSignedInAsText": "நீங்கள் உள்நுழைந்துள்ளீர்கள்"
|
||||
|
|
@ -545,7 +547,9 @@
|
|||
"deleteText": "அழி",
|
||||
"demoText": "டெமோ",
|
||||
"denyText": "மறுக்க",
|
||||
"deprecatedText": "நிராகரிக்கப்பட்டது",
|
||||
"desktopResText": "டெஸ்க்டாப் ரெஸ்",
|
||||
"deviceAccountUpgradeText": "எச்சரிக்கை:\nசாதனக் கணக்கில் (${NAME}) உள்நுழைந்துள்ளீர்கள்.\nஎதிர்கால புதுப்பிப்பில் சாதன கணக்குகள் அகற்றப்படும்.\nஉங்கள் முன்னேற்றத்தைத் தொடர விரும்பினால், V2 கணக்கிற்கு மேம்படுத்தவும்.",
|
||||
"difficultyEasyText": "சுலபம்",
|
||||
"difficultyHardOnlyText": "கடினமான முறை மட்டுமே",
|
||||
"difficultyHardText": "கடினமான",
|
||||
|
|
@ -803,6 +807,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "மன்னிக்கவும், கூகுளின் மல்டிபிளேயர் சேவை இனி கிடைக்காது.\nநான் முடிந்தவரை விரைவாக மாற்றுவதற்கு வேலை செய்கிறேன்.\nஅதுவரை, வேறு இணைப்பு முறையை முயற்சிக்கவும்.\n-எரிக்",
|
||||
"googlePlayPurchasesNotAvailableText": "Google Play வாங்குதல்கள் கிடைக்கவில்லை.\nஉங்கள் ஸ்டோர் பயன்பாட்டைப் புதுப்பிக்க வேண்டியிருக்கலாம்.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play சேவைகள் கிடைக்கவில்லை.\nசில ஆப்ஸ் செயல்பாடுகள் முடக்கப்பட்டிருக்கலாம்.",
|
||||
"googlePlayText": "கூகுள் பிளே",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "எப்போதும்",
|
||||
|
|
@ -1020,6 +1025,7 @@
|
|||
"maxConnectionsText": "அதிகபட்ச இணைப்புகள்",
|
||||
"maxPartySizeText": "அதிகபட்ச பார்ட்டி அளவு",
|
||||
"maxPlayersText": "அதிகபட்ச வீரர்கள்",
|
||||
"merchText": "பொருட்கள்!",
|
||||
"modeArcadeText": "ஆர்கேட் முறை",
|
||||
"modeClassicText": "கிளாசிக் பயன்முறை",
|
||||
"modeDemoText": "Demo Mode",
|
||||
|
|
@ -1059,6 +1065,7 @@
|
|||
"notSignedInErrorText": "இதைச் செய்ய நீங்கள் உள்நுழைய வேண்டும்.",
|
||||
"notSignedInGooglePlayErrorText": "இதைச் செய்ய நீங்கள் Google Play இல் உள்நுழைய வேண்டும்.",
|
||||
"notSignedInText": "உள்நுழையவில்லை",
|
||||
"notUsingAccountText": "குறிப்பு: ${SERVICE} கணக்கைப் புறக்கணித்தல்.\nநீங்கள் அதைப் பயன்படுத்த விரும்பினால், 'கணக்கு -> ${SERVICE} உடன் உள்நுழையவும்' என்பதற்குச் செல்லவும்.",
|
||||
"nothingIsSelectedErrorText": "எதுவும் தேர்ந்தெடுக்கப்படவில்லை!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "ஆஃப்",
|
||||
|
|
@ -1524,6 +1531,7 @@
|
|||
"Italian": "இத்தாலியன்",
|
||||
"Japanese": "ஜாபனீஸ்",
|
||||
"Korean": "கொரியன்",
|
||||
"Malay": "மலாய்",
|
||||
"Persian": "பர்ஷியன்",
|
||||
"Polish": "பலிஷ்",
|
||||
"Portuguese": "போர்சுகிஸ்",
|
||||
|
|
@ -1805,6 +1813,7 @@
|
|||
"useDefaultText": "இயல்புநிலையைப் பயன்படுத்தவும்",
|
||||
"usesExternalControllerText": "இந்த விளையாட்டு உள்ளீட்டிற்கு வெளிப்புற கட்டுப்படுத்தியைப் பயன்படுத்துகிறது.",
|
||||
"usingItunesText": "ஒலிப்பதிவுக்காக மியூசிக் ஆப் பயன்படுத்துகிறது...",
|
||||
"v2AccountLinkingInfoText": "V2 கணக்குகளை இணைக்க, 'கணக்கை நிர்வகி' பட்டனைப் பயன்படுத்தவும்.",
|
||||
"validatingTestBuildText": "சோதனை கட்டத்தை சரிபார்க்கிறது...",
|
||||
"victoryText": "வெற்றி!",
|
||||
"voteDelayText": "நீங்கள் மற்றொரு வாக்கை ${NUMBER} வினாடிகளுக்குத் தொடங்க முடியாது",
|
||||
|
|
@ -1837,6 +1846,7 @@
|
|||
},
|
||||
"waveText": "அலை",
|
||||
"wellSureText": "சரி நிச்சயமாக!",
|
||||
"whatIsThisText": "இது என்ன?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "டார்வின் ரிமோட் பதிப்புரிமை"
|
||||
},
|
||||
|
|
|
|||
12
dist/ba_data/data/languages/thai.json
vendored
12
dist/ba_data/data/languages/thai.json
vendored
|
|
@ -7,6 +7,7 @@
|
|||
"changeOncePerSeason": "คุณสามารถเปลี่ยนได้เพียงครั้งเดียวต่อฤดูกาล",
|
||||
"changeOncePerSeasonError": "คุณต้องรอจนกว่าฤดูกาลหน้าจะเปลี่ยนอีก (${NUM} days)",
|
||||
"customName": "ชื่อที่กำหนดเอง",
|
||||
"googlePlayGamesAccountSwitchText": "หากคุณต้องการใช้บัญชี Google อื่น\nใช้แอป Google Play Games เพื่อเปลี่ยน",
|
||||
"linkAccountsEnterCodeText": "ใส่รหัส",
|
||||
"linkAccountsGenerateCodeText": "สร้างรหัส",
|
||||
"linkAccountsInfoText": "(ใช้ความคืบหน้าร่วมกันกับแพลตฟอร์มอื่นๆ)",
|
||||
|
|
@ -14,6 +15,7 @@
|
|||
"linkAccountsInstructionsText": "เพื่อที่จะผูกทั้งสองบัญชีเข้าด้วยกัน จะต้องสร้างรหัสรหัสหนึ่ง\nแล้วจะต้องใส่รหัสในบัญที่คุณต้องการจะเชื่อมโยงเข้าด้วยกัน\nความคืบหน้าและสิ่งของในคลังของทั้งสองบัญชีจะถูกรวมกัน\nคุณสามารถเชื่อมโยงได้ทั้งหมด ${COUNT} บัญชี\n\nระวัง! หลังจากผูกบัญชีแล้วจะไม่สามารถยกเลิกได้!",
|
||||
"linkAccountsText": "ผูกบัญชี",
|
||||
"linkedAccountsText": "บัญชีที่เชื่อมโยงแล้ว",
|
||||
"manageAccountText": "จัดการบัญชี",
|
||||
"nameChangeConfirm": "คุณต้องการเปลี่ยนชื่อบัญชีของคุณเป็น ${NAME} หรือไม่",
|
||||
"resetProgressConfirmNoAchievementsText": "การทำสิ่งนี้จะรีเซ็ตความคืบหน้าต่างๆ ในโหมด co-op\nและคะแนนดีที่สุดในอุปกรณ์นี้ (แต่จะไม่รีเซ็ตตั๋วของคุณ) \nการทำสิ่งนี้ไม่สามารถยกเลิกได้! คุณแน่ใจหรือไม่?",
|
||||
"resetProgressConfirmText": "การทำสิ่งนี้จะรีเซ็ตความคืบหน้าในโหมด co-op,\nความสำเร็จและคะแนนดีที่สุดในอุปกรณ์นี้\n(แต่จะไม่รีเซ็ตตั๋วของคุณ) การทำสิ่งนี้จะ\nไม่สามารถยกเลิกได้! คุณแน่ใจหรือไม่?",
|
||||
|
|
@ -496,6 +498,7 @@
|
|||
"welcome2Text": "คุณสามารถได้ตั๋วจากการทำกิจกรรมเดิมๆ ได้\nตัวสามารถใช้ในการปลดล็อคตัวละครใหม่ แผนที่ใหม่\nและมินิเกมใหม่ การใช้เข้าทัวร์นาเมนท์ และอีกหลายอย่าง",
|
||||
"yourPowerRankingText": "อันดับของคุณ:"
|
||||
},
|
||||
"copyConfirmText": "คัดลอกไปที่คลิปบอร์ดแล้ว",
|
||||
"copyOfText": "${NAME} ที่ถูกคัดลอก",
|
||||
"copyText": "คัดลอก",
|
||||
"createEditPlayerText": "<สร้าง/แก้ไข ผู้เล่น>",
|
||||
|
|
@ -542,7 +545,9 @@
|
|||
"deleteText": "ลบ",
|
||||
"demoText": "ทดลอง",
|
||||
"denyText": "ยกเลิก",
|
||||
"deprecatedText": "คัดค้าน",
|
||||
"desktopResText": "เดสก์ท็อป Res",
|
||||
"deviceAccountUpgradeText": "คำเตือน:\nคุณลงชื่อเข้าใช้ด้วยบัญชีอุปกรณ์ (${NAME})\nบัญชีอุปกรณ์จะถูกลบออกในการอัปเดตในอนาคต\nอัปเกรดเป็นบัญชี V2 หากคุณต้องการติดตามความคืบหน้า",
|
||||
"difficultyEasyText": "ง่าย",
|
||||
"difficultyHardOnlyText": "โหมดยากเท่านั้น",
|
||||
"difficultyHardText": "ยาก",
|
||||
|
|
@ -623,7 +628,7 @@
|
|||
"epicDescriptionFilterText": "${DESCRIPTION} ในการเคลื่อนไหวที่ช้ามากๆ",
|
||||
"epicNameFilterText": "${NAME} แบบช้ามหากาฬ",
|
||||
"errorAccessDeniedText": "การเข้าถึงถูกปฏิเสธ",
|
||||
"errorDeviceTimeIncorrectText": "เวลาของอุปกรณ์ของคุณปิดลง ${HOURS} ชั่วโมง\nมีแนวโน้มที่จะทำให้เกิดปัญหา\nโปรดตรวจสอบการตั้งค่าเวลาและเขตเวลาของคุณ",
|
||||
"errorDeviceTimeIncorrectText": "เวลาของอุปกรณ์ไม่ถูกต้อง ${HOURS} ชั่วโมง\nมีแนวโน้มที่จะทำให้เกิดปัญหา\nโปรดตรวจสอบการตั้งค่าเวลาและเขตเวลาของคุณ",
|
||||
"errorOutOfDiskSpaceText": "พื้นที่ว่างในเครื่องหมด",
|
||||
"errorSecureConnectionFailText": "ไม่สามารถสร้างการเชื่อมต่อระบบคลาวด์ที่ปลอดภัยได้ การทำงานของเครือข่ายอาจล้มเหลว",
|
||||
"errorText": "ข้อผิดพลาด",
|
||||
|
|
@ -800,6 +805,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "ขออภัย บริการผู้เล่นหลายคนของ Google ไม่มีให้บริการอีกต่อไป\nฉันกำลังดำเนินการเปลี่ยนให้เร็วที่สุด\nในระหว่างนี้ โปรดลองวิธีการเชื่อมต่ออื่น\n-เอริค",
|
||||
"googlePlayPurchasesNotAvailableText": "ไม่สามารถซื้อด้วย Google Play ได้\nคุณอาจต้องอัปเดตแอปร้านค้าของคุณ",
|
||||
"googlePlayServicesNotAvailableText": "บริการ Google Play ไม่พร้อมใช้งาน\nฟังก์ชันบางอย่างของแอปอาจถูกปิดใช้งาน",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "ตลอด",
|
||||
|
|
@ -996,6 +1002,7 @@
|
|||
"creditsText": "เครดิต",
|
||||
"demoMenuText": "เมนูสาธิต",
|
||||
"endGameText": "จบเกม",
|
||||
"endTestText": "สิ้นสุดการทดสอบ",
|
||||
"exitGameText": "ออกจากเกม",
|
||||
"exitToMenuText": "จะออกไปหน้าเมนูหรือไม่?",
|
||||
"howToPlayText": "วิธีการเล่น",
|
||||
|
|
@ -1054,6 +1061,7 @@
|
|||
"notSignedInErrorText": "คุณต้องลงชื่อเข้าใช้เพื่อทำสิ่งนี้",
|
||||
"notSignedInGooglePlayErrorText": "คุณต้องลงชื่อเข้าใช้ Google Play เพื่อดำเนินการนี้",
|
||||
"notSignedInText": "ไม่ได้ลงชื่อเข้าใช้",
|
||||
"notUsingAccountText": "หมายเหตุ: ละเว้นบัญชี ${SERVICE}\nไปที่ 'บัญชี -> ลงชื่อเข้าใช้ด้วย ${SERVICE}' หากคุณต้องการ",
|
||||
"nothingIsSelectedErrorText": "ไม่มีอะไรถูกเลือก!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "ปิด",
|
||||
|
|
@ -1798,6 +1806,7 @@
|
|||
"useDefaultText": "ใช้ค่าเริ่มต้น",
|
||||
"usesExternalControllerText": "เกมนี้ใช้คอนโทรลเลอร์ภายนอกสำหรับการป้อนข้อมูล",
|
||||
"usingItunesText": "การใช้แอพ Music สำหรับซาวด์แทร็ก...",
|
||||
"v2AccountLinkingInfoText": "หากต้องการเชื่อมโยงบัญชี V2 ให้ใช้ปุ่ม 'จัดการบัญชี'",
|
||||
"validatingTestBuildText": "กำลังตรวจสอบการสร้างการทดสอบ...",
|
||||
"victoryText": "ชัยชนะ!",
|
||||
"voteDelayText": "คุณไม่สามารถเริ่มโหวตได้อีกเป็นเวลา ${NUMBER} วินาที",
|
||||
|
|
@ -1830,6 +1839,7 @@
|
|||
},
|
||||
"waveText": "เวฟ",
|
||||
"wellSureText": "แน่นอน!",
|
||||
"whatIsThisText": "นี่คืออะไร?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "ลิขสิทธิ์ DarwiinRemote"
|
||||
},
|
||||
|
|
|
|||
44
dist/ba_data/data/languages/turkish.json
vendored
44
dist/ba_data/data/languages/turkish.json
vendored
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"accountSettingsWindow": {
|
||||
"accountNameRules": "Hesap isimleri emoji veya diğer özel karakterler içeremez",
|
||||
"accountNameRules": "Hesap isimleri emoji veya başka özel karakterler içeremez",
|
||||
"accountProfileText": "(hesap profili) ",
|
||||
"accountsText": "Hesaplar",
|
||||
"achievementProgressText": "Başarılar: ${COUNT} / ${TOTAL}",
|
||||
|
|
@ -8,6 +8,7 @@
|
|||
"changeOncePerSeason": "Bunu sezon başına sadece bir kere değiştirebilirsin",
|
||||
"changeOncePerSeasonError": "Bunu tekrar değiştirmek için bir sonraki sezona kadar beklemelisin (${NUM}gün)",
|
||||
"customName": "Özel isim",
|
||||
"googlePlayGamesAccountSwitchText": "Eğer farklı bir google hesabı kullanmak istiyorsanız,\nGoogle Play Oyunlar uygulamasını kullabilirsiniz.",
|
||||
"linkAccountsEnterCodeText": "Kod Gir",
|
||||
"linkAccountsGenerateCodeText": "Kod Oluştur",
|
||||
"linkAccountsInfoText": "(ilerlemeyi farklı platformlar ile paylaş)",
|
||||
|
|
@ -39,6 +40,7 @@
|
|||
"titleText": "Hesap",
|
||||
"unlinkAccountsInstructionsText": "Ayırmak için bir hesap seç",
|
||||
"unlinkAccountsText": "Hesapları ayır",
|
||||
"unlinkLegacyV1AccountsText": "Eski V1 Hesaplarını Kaldırın",
|
||||
"v2LinkInstructionsText": "Bu bağlantıyı kullanarak bir hesap oluşturun yada giriş yapın.",
|
||||
"viaAccount": "(${NAME}hesabı ile)",
|
||||
"youAreSignedInAsText": "Aşağıdaki ile giriş yapıldı"
|
||||
|
|
@ -546,7 +548,9 @@
|
|||
"deleteText": "Sil",
|
||||
"demoText": "Tanıtım",
|
||||
"denyText": "Reddet",
|
||||
"deprecatedText": "Kullanımdan kaldırıldı",
|
||||
"desktopResText": "PC Çözünürlüğü",
|
||||
"deviceAccountUpgradeText": "Uyarı:\n(${NAME}) isimli bir cihaz hesabıyla giriş yaptın.\nCihaz hesapları gelecek güncellemelerde kaldırılacak.\nİlerlemeni tutmak istiyorsan V2 hesabına geçiş yap.",
|
||||
"difficultyEasyText": "Kolay",
|
||||
"difficultyHardOnlyText": "Sadece Zor Mod",
|
||||
"difficultyHardText": "Zor",
|
||||
|
|
@ -804,6 +808,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Üzgünüz, Google'ın çok oyunculu servisi şu anda çalışmıyor.\nBir yer değişimi için olabildiğince hızlı çalışıyorum.\nO zamana kadar, lütfen başka bir bağlantı yöntemi deneyin.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Google Play satın alma işlemleri mevcut değildir.\nMağaza uygulamanızı güncellemeniz gerekebilir.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play Hizmetleri kullanılamıyor.\nBazı uygulama işlevleri devre dışı bırakılabilir.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Her Zaman",
|
||||
|
|
@ -914,7 +919,7 @@
|
|||
"kickIdlePlayersWarning1Text": "${NAME} boşta durmaya devam ederse ${COUNT} saniye içinde atılacak.",
|
||||
"kickIdlePlayersWarning2Text": "(Ayarlar-> Gelişmiş den bunu kapatabilirsin)",
|
||||
"leftGameText": "'${NAME}' Terkedildi",
|
||||
"leftPartyText": "${NAME} partisini terk et.",
|
||||
"leftPartyText": "${NAME}'in partisini terk ettin.",
|
||||
"noMusicFilesInFolderText": "Klasör müzik dosyası içermiyor.",
|
||||
"playerJoinedPartyText": "${NAME} partiye katıldı!",
|
||||
"playerLeftPartyText": "${NAME} partiyi terk etti.",
|
||||
|
|
@ -1020,6 +1025,7 @@
|
|||
"maxConnectionsText": "Maksimum Bağlantı",
|
||||
"maxPartySizeText": "Maksimum Parti Kapasitesi",
|
||||
"maxPlayersText": "Maksimum Oyuncu",
|
||||
"merchText": "Merch!",
|
||||
"modeArcadeText": "Arcade Modu",
|
||||
"modeClassicText": "Klasik Mod",
|
||||
"modeDemoText": "Demo Modu",
|
||||
|
|
@ -1059,6 +1065,7 @@
|
|||
"notSignedInErrorText": "Bunu yapmak için giriş yapmalısın.",
|
||||
"notSignedInGooglePlayErrorText": "Bunu yapmak için Google Play ile giriş yapmalısın.",
|
||||
"notSignedInText": "giriş yapılmadı",
|
||||
"notUsingAccountText": "Not: ${SERVICE} hesabı kullanılmıyor\nEğer kullanmak istiyorsanız 'Hesabım -> ${SERVICE} ile Kayıt ol' a gidin.",
|
||||
"nothingIsSelectedErrorText": "Hiçbir şey seçilmedi!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Kapalı",
|
||||
|
|
@ -1117,7 +1124,11 @@
|
|||
"pleaseWaitText": "Lütfen bekle...",
|
||||
"pluginClassLoadErrorText": "'${PLUGIN}' eklenti sınıfı yüklenirken hata oluştu: ${ERROR}",
|
||||
"pluginInitErrorText": "'${PLUGIN}' eklentisi başlatılırken hata oluştu: ${ERROR}",
|
||||
"pluginSettingsText": "Eklenti Ayarları",
|
||||
"pluginsAutoEnableNewText": "Yeni Eklentileri Otomatik Etkinleştir",
|
||||
"pluginsDetectedText": "Yeni eklentiler tespit edildi. Onları etkinleştirmek veya ayarlarda yapılandırmak için oyunu yeniden başlatın.",
|
||||
"pluginsDisableAllText": "Tüm Eklentileri Devre Dışı Bırak",
|
||||
"pluginsEnableAllText": "Tüm Eklentileri Etkinleştir",
|
||||
"pluginsRemovedText": "${NUM} eklenti(ler) artık bulunmuyor.",
|
||||
"pluginsText": "Eklentiler",
|
||||
"practiceText": "Alıştırma",
|
||||
|
|
@ -1252,6 +1263,7 @@
|
|||
"netTestingText": "Ağ Testi",
|
||||
"resetText": "Sıfırla",
|
||||
"showBombTrajectoriesText": "Bomba Gidişatını Göster",
|
||||
"showInGamePingText": "Oyun İçinde Gecikmeyi Göster",
|
||||
"showPlayerNamesText": "Oyuncu Adlarını Göster",
|
||||
"showUserModsText": "Mod Klasörünü Göster",
|
||||
"titleText": "Gelişmiş",
|
||||
|
|
@ -1362,7 +1374,7 @@
|
|||
"tipText": "İpucu",
|
||||
"titleText": "BombSquad",
|
||||
"titleVRText": "BombSquad VR",
|
||||
"topFriendsText": "En-İyi Arkadaşlar",
|
||||
"topFriendsText": "En İyi Arkadaşlar",
|
||||
"tournamentCheckingStateText": "Turnuva durumu denetleniyor; lütfen bekleyin...",
|
||||
"tournamentEndedText": "Bu turnuva sonlandı. Yeni bir tanesi yakında başlayacak.",
|
||||
"tournamentEntryText": "Turnuva Katılımı",
|
||||
|
|
@ -1416,10 +1428,10 @@
|
|||
"Rookie Football": "Acemi Futbol",
|
||||
"Rookie Onslaught": "Acemi Saldırı",
|
||||
"The Last Stand": "Son Çırpınış",
|
||||
"Uber ${GAME}": "Üst-Düzey ${GAME}",
|
||||
"Uber Football": "Üst-Düzey Futbol",
|
||||
"Uber Onslaught": "Üst-Düzey Saldırı",
|
||||
"Uber Runaround": "Üst-Düzey Dolambaç"
|
||||
"Uber ${GAME}": "Üst Düzey ${GAME}",
|
||||
"Uber Football": "Üst Düzey Futbol",
|
||||
"Uber Onslaught": "Üst Düzey Saldırı",
|
||||
"Uber Runaround": "Üst Düzey Dolambaç"
|
||||
},
|
||||
"gameDescriptions": {
|
||||
"Be the chosen one for a length of time to win.\nKill the chosen one to become it.": "Kazanmak için uzun süre seçilmiş kişi ol.\nseçilmiş kişi olmak için seçilmiş kişiyi öldür.",
|
||||
|
|
@ -1444,10 +1456,10 @@
|
|||
"Run ${ARG1} laps. Your entire team has to finish.": "${ARG1} tur koş. Tüm takım için geçerli.",
|
||||
"Run 1 lap.": "1 Tur koş.",
|
||||
"Run 1 lap. Your entire team has to finish.": "1 Tur koş. Tüm takım için geçerli.",
|
||||
"Run real fast!": "Cidden Hızlı Koş!",
|
||||
"Run real fast!": "Cidden hızlı koş!",
|
||||
"Score ${ARG1} goals.": "${ARG1} Gol At.",
|
||||
"Score ${ARG1} touchdowns.": "${ARG1} Sayı Yap.",
|
||||
"Score a goal.": "Gol At.",
|
||||
"Score a goal.": "Gol at.",
|
||||
"Score a touchdown.": "Bir sayı yap.",
|
||||
"Score some goals.": "Birkaç gol at.",
|
||||
"Secure all ${ARG1} flags.": "${ARG1} bayrağın tümünü ele geçir.",
|
||||
|
|
@ -1516,13 +1528,14 @@
|
|||
"French": "Fransızca",
|
||||
"German": "Almanca",
|
||||
"Gibberish": "Abuk Sabukça",
|
||||
"Greek": "Yunan",
|
||||
"Greek": "Yunanca",
|
||||
"Hindi": "Hintçe",
|
||||
"Hungarian": "Macarca",
|
||||
"Indonesian": "Endonezyaca",
|
||||
"Italian": "İtalyanca",
|
||||
"Japanese": "Japonca",
|
||||
"Korean": "Korece",
|
||||
"Malay": "Malayca",
|
||||
"Persian": "Farsça",
|
||||
"Polish": "Polonya Dili",
|
||||
"Portuguese": "Portekizce",
|
||||
|
|
@ -1805,6 +1818,7 @@
|
|||
"usesExternalControllerText": "Bu oyun girdi olarak harici kontrolcü kullanıyor.",
|
||||
"usingItunesText": "Müzikler için iTunes kullanılıyor...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Lütfen iTunes da karıştırmanın KAPALI oldugundan ve Yinelemenin TÜM oldugundan emin olun. ",
|
||||
"v2AccountLinkingInfoText": "V2 hesapları bağlamak için, 'Hesabı yönet' butonuna tıklayın.",
|
||||
"validatingTestBuildText": "Test Yapısı Onaylanıyor...",
|
||||
"victoryText": "Galibiyet!",
|
||||
"voteDelayText": "${NUMBER} saniye boyunca başka oylama başlatamazsın.",
|
||||
|
|
@ -1837,6 +1851,7 @@
|
|||
},
|
||||
"waveText": "Dalga",
|
||||
"wellSureText": "Elbette!",
|
||||
"whatIsThisText": "Bu da ne?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "DarwiinRemote Telif Hakkı"
|
||||
},
|
||||
|
|
@ -1858,16 +1873,17 @@
|
|||
"workspaceSyncErrorText": "${WORKSPACE} eşitlemesinde hata oluştu. Detaylar için günlüğü inceleyin.",
|
||||
"workspaceSyncReuseText": "${WORKSPACE} eşitlenemiyor. Önceden eşitlenmiş sürüm kullanılıyor.",
|
||||
"worldScoresUnavailableText": "Global Skorlar Mevcut Değil.",
|
||||
"worldsBestScoresText": "Global En-İyi Skorlar",
|
||||
"worldsBestTimesText": "Global En-İyi Süreler",
|
||||
"worldsBestScoresText": "Global En İyi Skorlar",
|
||||
"worldsBestTimesText": "Global En İyi Süreler",
|
||||
"xbox360ControllersWindow": {
|
||||
"getDriverText": "Sürücüyü İndir",
|
||||
"macInstructions2Text": "Kablosuz olarak kullanmak için; ayrıca 'Xbox 360 Kontroller for Windows'\nile gelen bir alıcı kullanman lazım. \nBir alıcı sana 4 taneye kadar bağlantı sağlar.\n\nÖnemli: 3.şahıs alıcılar bu sürücü ile çalışmaz;\nAlıcının 'Microsoft' için olduğuna dikkat et 'XBOX 360' değil.\nMicrosoft bunu uzun süredir ayrı olarak satmıyor. Kontrolcüleri ile \nbirlikte alabilirsin ya da ebay de araştırabilirsin.\n\nEğer bunu kullanışlı bulduysan, lütfen değerlendirerek sürücü\ngeliştirilmesine bu siteden bağış yap.",
|
||||
"macInstructionsText": "Xbox 360 kolunu kullanmak için aşağıdaki bağlantıdaki\nMac sürücüsü yüklemen gerekiyor.\nKablolu ve Kablosuz kontroller de çalışır.",
|
||||
"macInstructionsTextScale": 0.8,
|
||||
"ouyaInstructionsText": "BombSquad ile kablolu Xbox 360 kontrolcüsü kullanmak için basitçe\ncihazının USB girişine takın. Çoklu kontrolcü kullanmak için USB\nçoklayıcı kullanabilirsiniz.\n\nKablosuz kontrolcü için \"Xbox 360 Wireless Controller for Windows\"\nkablosuz alıcısına ihtiyacınız var. Her alıcıya\nUSB girişi ile bağlanır ve 4 kablosuz kontrolcüye\nkadar desteklenir.",
|
||||
"titleText": "Xbox 360 Kontrolcüsü ${APP_NAME} ile kullanılıyor:"
|
||||
},
|
||||
"yesAllowText": "Evet, Kabul!",
|
||||
"yourBestScoresText": "En-İyi Skorların",
|
||||
"yourBestTimesText": "En-İyi Sürelerin"
|
||||
"yourBestScoresText": "En İyi Skorların",
|
||||
"yourBestTimesText": "En İyi Sürelerin"
|
||||
}
|
||||
55
dist/ba_data/data/languages/ukrainian.json
vendored
55
dist/ba_data/data/languages/ukrainian.json
vendored
|
|
@ -1,13 +1,14 @@
|
|||
{
|
||||
"accountSettingsWindow": {
|
||||
"accountNameRules": "Імена акаунтів не можуть містити емоджі або інші спеціальні символи",
|
||||
"accountNameRules": "Імена акаунтів не можуть містити емоджі або інші особливі символи",
|
||||
"accountProfileText": "(профіль аккаунта)",
|
||||
"accountsText": "Акаунти",
|
||||
"achievementProgressText": "Досягнення: ${COUNT} з ${TOTAL}",
|
||||
"campaignProgressText": "Прогрес кампанії [Тяжко]: ${PROGRESS}",
|
||||
"changeOncePerSeason": "Ви можете змінити це тільки раз в сезон.",
|
||||
"changeOncePerSeason": "Ви можете змінити це лише раз в сезон.",
|
||||
"changeOncePerSeasonError": "Ви повинні дочекатися наступного сезону, щоб змінити це знову (${NUM} днів)",
|
||||
"customName": "Ім'я акаунта",
|
||||
"googlePlayGamesAccountSwitchText": "Якщо ви хочете використовувати інший акаунт Google,\nперейдіть у додаток Google Play Games, щоб змінити його.",
|
||||
"linkAccountsEnterCodeText": "Ввести Код",
|
||||
"linkAccountsGenerateCodeText": "Створити Код",
|
||||
"linkAccountsInfoText": "(поділитися прогресом на різних платформах)",
|
||||
|
|
@ -15,17 +16,17 @@
|
|||
"linkAccountsInstructionsText": "Щоб зв'язати дви обликови записи, створювати код на одному з них и ввести цей код на инший. Прогрес та инвентаризации будуць об'эднанни. Ви можете зв'язати ${COUNT} рахунки.",
|
||||
"linkAccountsText": "Зв'язати акаунти",
|
||||
"linkedAccountsText": "Зв'язані акаунти:",
|
||||
"manageAccountText": "Контролювати аккаунтом",
|
||||
"manageAccountText": "Керувати аккаунтом",
|
||||
"nameChangeConfirm": "Ви впевнені що хочете змінити ім'я на ${NAME}?",
|
||||
"resetProgressConfirmNoAchievementsText": "Це скине весь ваш кооперативний прогрес\nі локальні кращі результати (крім квитків).\nЦей процес є незворотнім. Ви впевнені?",
|
||||
"resetProgressConfirmText": "Це скине весь ваш кооперативний\nпрогрес, досягнення і локальні результати\n(Крім квитків). Цей процес є незворотнім.\nВи впевнені?",
|
||||
"resetProgressConfirmNoAchievementsText": "Це скине весь ваш прогрес кооперативу\nі локальні рекорди (але не ваші квитки).\nЦей процес є незворотнім. Ви впевнені?",
|
||||
"resetProgressConfirmText": "Це скине весь ваш прогрес кооперативу,\nдосягнення та локальні рекорди (але не\nваші квитки). Цей процес незворотній.\nВи впевнені?",
|
||||
"resetProgressText": "Скинути прогрес",
|
||||
"setAccountName": "Задайте ім'я акаунта",
|
||||
"setAccountNameDesc": "Виберіть ім'я для відображення свого акаунта.\nВи можете використовувати ім'я однієї з ваших пов'язаних\nакаунтів або створити унікальне ім'я акаунта.",
|
||||
"signInInfoText": "Увійдіть, щоб збирати квитки, змагатися онлайн,\nі синхронізувати прогрес на всіх пристроях.",
|
||||
"setAccountName": "Задати ім'я акаунта",
|
||||
"setAccountNameDesc": "Виберіть ім'я для відображення свого акаунту.\nВи можете використовувати ім'я одного з ваших прив'язаних\nакаунтів або створити своє унікальне ім'я.",
|
||||
"signInInfoText": "Увійдіть, щоб збирати квитки, змагатися онлайн,\nі синхронізувати прогрес між пристроями.",
|
||||
"signInText": "Увійти",
|
||||
"signInWithDeviceInfoText": "(стандартний акаунт тільки для цього пристрою)",
|
||||
"signInWithDeviceText": "Увійдіть, використовуючи акаунт пристрою",
|
||||
"signInWithDeviceInfoText": "(для цього пристрою доступний тільки стандартний акаунт)",
|
||||
"signInWithDeviceText": "Увійти використовуючи акаунт пристрою",
|
||||
"signInWithGameCircleText": "Увійти через Game Circle",
|
||||
"signInWithGooglePlayText": "Увійти через Google Play",
|
||||
"signInWithTestAccountInfoText": "(тест-аккаунт; надалі використовуйте акаунт пристрою)",
|
||||
|
|
@ -38,9 +39,10 @@
|
|||
"testAccountWarningOculusText": "Увага: ви входите під \"тестовим\" аккаунтом.\nВін буде замінений \"справжнім\" акаунтом пізніше в цьому\nроці, що дозволить здійснювати покупки квитків і багато іншого.\nНа даний момент Вам доведеться заробляти квитки в грі.",
|
||||
"testAccountWarningText": "Увага: ви увійшли під \"тестовим\" аккаунтом.\nЦей аккаунт зв'язанний з певним девайсом та може\nчас від часу скидатися. (так що не марнуйте час для\nзбирання/розблокування добра для нього)\n\nДля використання \"реального\" аккаунту (Game-Center,\nGoogle Plus та інші) запустіть платну версію гри. Це\nнадасть вам можливість зберігати прогрес у хмарі та\nробити його доступним для різних девайсів.",
|
||||
"ticketsText": "Квитки: ${COUNT}",
|
||||
"titleText": "Акаунт",
|
||||
"titleText": "Акаунт пупсель",
|
||||
"unlinkAccountsInstructionsText": "Виберіть акаунт, який хочете відв'язати",
|
||||
"unlinkAccountsText": "Відв'язати акаунт",
|
||||
"unlinkLegacyV1AccountsText": "від’єднати застарілі облікові записи (v1)",
|
||||
"v2LinkInstructionsText": "Скористайтеся цим посиланням, щоб створити обліковий запис або увійти.",
|
||||
"viaAccount": "(через акаунт ${NAME})",
|
||||
"youAreSignedInAsText": "Ви увійшли як:"
|
||||
|
|
@ -547,7 +549,9 @@
|
|||
"deleteText": "Видалити",
|
||||
"demoText": "Демо",
|
||||
"denyText": "Відхилити",
|
||||
"deprecatedText": "Застаріла",
|
||||
"desktopResText": "Розширення екрану",
|
||||
"deviceAccountUpgradeText": "Увага!\nТи ввійшов за допомогою акаунта пристрою (${NAME}).\nАкаунти пристроїв будуть видалені у майбутньому оновленні.\nОновись до V2-акаунта, якщо ти хочеш зберегти свій прогрес.",
|
||||
"difficultyEasyText": "Легкий",
|
||||
"difficultyHardOnlyText": "Тільки в складному режимі",
|
||||
"difficultyHardText": "Складний",
|
||||
|
|
@ -805,6 +809,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Пробачте, але сервіс мультіплеєра від Google тепер не доступний.\nЯ працюю над зміною сервіса як можно скоріше.\nДо цього, будь ласка, подивіться інакші способи гри в мультіплеєр. \n-Ерік",
|
||||
"googlePlayPurchasesNotAvailableText": "Покупки в Google Play недоступні.\nМожливо, вам знадобиться оновити програму магазину.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play сервіси недоступні.\nДеякі функції програми не роблять.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Завжди",
|
||||
|
|
@ -1021,6 +1026,7 @@
|
|||
"maxConnectionsText": "Максимум з'єднань",
|
||||
"maxPartySizeText": "Розмір групи",
|
||||
"maxPlayersText": "Максимум гравців",
|
||||
"merchText": "Мерч!",
|
||||
"modeArcadeText": "Аркадний режим",
|
||||
"modeClassicText": "Класичний режим",
|
||||
"modeDemoText": "Демо режим",
|
||||
|
|
@ -1060,6 +1066,7 @@
|
|||
"notSignedInErrorText": "Увійдіть щоб зробити це.",
|
||||
"notSignedInGooglePlayErrorText": "Увійдіть спочатку в Google Play, а там подивимося.",
|
||||
"notSignedInText": "(ви не ввійшли)",
|
||||
"notUsingAccountText": "Примітка: ти не підключив акаунт ${SERVICE}.\nПерейди у 'Акаунт -> Увійти за допомогою ${SERVICE}', якщо ти хочеш його використовувати.",
|
||||
"nothingIsSelectedErrorText": "Нічого не вибрано!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Викл",
|
||||
|
|
@ -1118,7 +1125,11 @@
|
|||
"pleaseWaitText": "Будь ласка зачекайте...",
|
||||
"pluginClassLoadErrorText": "Помилка завантаження класу плагіна \"${PLUGIN}\": ${ERROR}",
|
||||
"pluginInitErrorText": "Помилка запуску плагіна \"${PLUGIN}\": ${ERROR}",
|
||||
"pluginSettingsText": "Налаштування плагінів",
|
||||
"pluginsAutoEnableNewText": "Автоматично вмикати нові плагіни",
|
||||
"pluginsDetectedText": "Виявлено нові плагіни. Перезапустіть, щоб активувати їх, або налаштуйте їх у налаштуваннях",
|
||||
"pluginsDisableAllText": "Вимкнути усі плагіни",
|
||||
"pluginsEnableAllText": "Увімкнути усі плагіни",
|
||||
"pluginsRemovedText": "${NUM} плагін(ів) більше не знайдено.",
|
||||
"pluginsText": "Плагіни",
|
||||
"practiceText": "Тренування",
|
||||
|
|
@ -1253,6 +1264,7 @@
|
|||
"netTestingText": "Тестування мережі",
|
||||
"resetText": "Скинути",
|
||||
"showBombTrajectoriesText": "Показувати траєкторію бомби",
|
||||
"showInGamePingText": "Показувати пінг у грі",
|
||||
"showPlayerNamesText": "Показувати імена гравців",
|
||||
"showUserModsText": "Показати теку модів",
|
||||
"titleText": "Додатково",
|
||||
|
|
@ -1523,6 +1535,7 @@
|
|||
"Italian": "Італійська",
|
||||
"Japanese": "Японська",
|
||||
"Korean": "Корейська",
|
||||
"Malay": "Малайська",
|
||||
"Persian": "Перська",
|
||||
"Polish": "Польська",
|
||||
"Portuguese": "Португальська",
|
||||
|
|
@ -1751,9 +1764,9 @@
|
|||
"tutorial": {
|
||||
"cpuBenchmarkText": "Прогін туторіала на шаленій швидкості (перевіряє швидкість процесора)",
|
||||
"phrase01Text": "Привіт!",
|
||||
"phrase02Text": "Ласкаво просимо в ${APP_NAME}!",
|
||||
"phrase02Text": "Ласкаво просимо до ${APP_NAME}!",
|
||||
"phrase03Text": "Кілька порад з управління персонажем:",
|
||||
"phrase04Text": "Багато чого в ${APP_NAME} засноване на законах фізики.",
|
||||
"phrase04Text": "Багато чого в ${APP_NAME} базується на законах фізики.",
|
||||
"phrase05Text": "Наприклад, при ударі кулаком..",
|
||||
"phrase06Text": "..пошкодження залежать від швидкості кулака.",
|
||||
"phrase07Text": "Бачите? Ми не рухалися, тому ${NAME} майже в повному порядку.",
|
||||
|
|
@ -1763,7 +1776,7 @@
|
|||
"phrase11Text": "Для бігу утримуйте будь-яку кнопку.",
|
||||
"phrase12Text": "Для супер-крутих ударів спробуйте бігти і крутитися.",
|
||||
"phrase13Text": "Ой .. Вибач, ${NAME}.",
|
||||
"phrase14Text": "Можна піднімати і кидати речі, наприклад прапори .. або ${NAME}.",
|
||||
"phrase14Text": "Ви можете піднімати і кидати речі, наприклад прапори .. або ${NAME}.",
|
||||
"phrase15Text": "І, зрештою, бомби.",
|
||||
"phrase16Text": "Кидання бомб потребує тренування.",
|
||||
"phrase17Text": "Ай! Не дуже хороший кидок.",
|
||||
|
|
@ -1779,11 +1792,11 @@
|
|||
"phrase27Text": "Не забувай ці поради, і ТОЧНО повернешся живим!",
|
||||
"phrase28Text": "...може бути...",
|
||||
"phrase29Text": "Успіхів!",
|
||||
"randomName1Text": "Петя",
|
||||
"randomName1Text": "Петро",
|
||||
"randomName2Text": "Вася",
|
||||
"randomName3Text": "Коля",
|
||||
"randomName3Text": "Микола",
|
||||
"randomName4Text": "Ігор",
|
||||
"randomName5Text": "Сашка",
|
||||
"randomName5Text": "Сашко",
|
||||
"skipConfirmText": "Пропустити туторіал? Торкніться або натисніть кнопку для підтвердження.",
|
||||
"skipVoteCountText": "${COUNT}/${TOTAL} голосів за пропуск",
|
||||
"skippingText": "пропуск навчання ...",
|
||||
|
|
@ -1805,9 +1818,10 @@
|
|||
"usesExternalControllerText": "Ця гра може використовувати зовнішній контролер для управління.",
|
||||
"usingItunesText": "Використання музикального додатку для саундтрека...",
|
||||
"usingItunesTurnRepeatAndShuffleOnText": "Будь ласка, переконайтеся, що випадковий порядок і повтор усіх пісень включений в Itunes.",
|
||||
"v2AccountLinkingInfoText": "Щоб підключити V2-акаунти, використовуйте кнопку 'Керування акаунтом'.",
|
||||
"validatingTestBuildText": "Перевірка тестової збірки...",
|
||||
"victoryText": "Перемога!",
|
||||
"voteDelayText": "Ви не можете виганяти ще ${NUMBER} секунд",
|
||||
"voteDelayText": "Ви зможете почати голосування через ${NUMBER} секунд",
|
||||
"voteInProgressText": "Голосування ще триває.",
|
||||
"votedAlreadyText": "Ви вже голосували",
|
||||
"votesNeededText": "Потрібно ${NUMBER} голосів",
|
||||
|
|
@ -1837,6 +1851,7 @@
|
|||
},
|
||||
"waveText": "Хвиля",
|
||||
"wellSureText": "Зійде!",
|
||||
"whatIsThisText": "Шо це?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "Авторські права DarwiinRemote"
|
||||
},
|
||||
|
|
@ -1853,9 +1868,9 @@
|
|||
"thanksText": "Це стало можливим завдяки\nкоманді DarwiinRemote.",
|
||||
"titleText": "Налаштування контролера Wii"
|
||||
},
|
||||
"winsPlayerText": "Переміг ${NAME}!",
|
||||
"winsPlayerText": "Перемагає ${NAME}!",
|
||||
"winsTeamText": "Перемогли ${NAME}!",
|
||||
"winsText": "${NAME} виграв!",
|
||||
"winsText": "${NAME} виграє!",
|
||||
"workspaceSyncErrorText": "Помилка синхронізації ${WORKSPACE}. Подробиці дивіться в журналі.",
|
||||
"workspaceSyncReuseText": "Не вдається синхронізувати ${WORKSPACE}. Повторне використання попередньої синхронізованої версії.",
|
||||
"worldScoresUnavailableText": "Світові результати недоступні.",
|
||||
|
|
|
|||
13
dist/ba_data/data/languages/venetian.json
vendored
13
dist/ba_data/data/languages/venetian.json
vendored
|
|
@ -7,6 +7,7 @@
|
|||
"changeOncePerSeason": "Te połi canbiar ’sto dato soło na volta par stajon.",
|
||||
"changeOncePerSeasonError": "Par canbiarlo te ghè da spetar ła pròsema stajon (${NUM} days).",
|
||||
"customName": "Nome parsonałizà",
|
||||
"googlePlayGamesAccountSwitchText": "Se te vołi doparar un account Google defarente,\ndòpara l'apl Google Play Giochi par canbiarlo.",
|
||||
"linkAccountsEnterCodeText": "Insarisi còdaze",
|
||||
"linkAccountsGenerateCodeText": "Jènara còdaze",
|
||||
"linkAccountsInfoText": "(sparpagna progresi infrà dispozidivi defarenti)",
|
||||
|
|
@ -23,10 +24,10 @@
|
|||
"signInInfoText": "Conétate par tirar sù biłieti, batajar online e\nsparpagnar i to progresi infrà dispozidivi defarenti.",
|
||||
"signInText": "Conétate",
|
||||
"signInWithDeviceInfoText": "(par 'sto dispozidivo ze disponìbiłe un soło account automàtego)",
|
||||
"signInWithDeviceText": "Conétate co l'account de’l dispozidivo",
|
||||
"signInWithDeviceText": "Conétate co un account łogałe",
|
||||
"signInWithGameCircleText": "Conétate co Game Circle",
|
||||
"signInWithGooglePlayText": "Conétate co Google Play",
|
||||
"signInWithTestAccountInfoText": "(account de proa vecio: in fuduro dòpara i account de’l dispozidivo)",
|
||||
"signInWithTestAccountInfoText": "(account de proa vecio: in fuduro dòpara un account łogałe)",
|
||||
"signInWithTestAccountText": "Conétate co un account de proa",
|
||||
"signInWithV2InfoText": "(un account che fusiona so tute łe piataforme)",
|
||||
"signInWithV2Text": "Acedi co un account BombSquad",
|
||||
|
|
@ -543,7 +544,9 @@
|
|||
"deleteText": "Ełìmena",
|
||||
"demoText": "Demo",
|
||||
"denyText": "Refuda",
|
||||
"deprecatedText": "Roba vecia",
|
||||
"desktopResText": "Resołusion PC",
|
||||
"deviceAccountUpgradeText": "Ocio:\nte ghè fazesto l'aceso co l'account łogałe ${NAME}.\nCo un pròsemo ajornamento i account łogałi i vegnarà cavài via.\nSe te vołi tegnerte i to progresi ajorna el to account a ła varsion V2.",
|
||||
"difficultyEasyText": "Fàsiłe",
|
||||
"difficultyHardOnlyText": "Soło modałità defìsiłe",
|
||||
"difficultyHardText": "Defìsiłe",
|
||||
|
|
@ -801,6 +804,7 @@
|
|||
},
|
||||
"googleMultiplayerDiscontinuedText": "Me despiaze, el sarviso multizugador de Google no'l ze miga pì disponìbiłe.\nA sò drio łaorar a un renpiaso pì in presa che se połe.\nIntanto proa n'antro mètodo de conesion.\n-Eric",
|
||||
"googlePlayPurchasesNotAvailableText": "Łe cronpe vecie no łe ze miga disponìbiłi.\nPodarìa èsarghe bezogno de ajornar l'apl Google Play.",
|
||||
"googlePlayServicesNotAvailableText": "Google Play Services no'l ze miga disponìbiłe.\nSerte funsion de l'apl łe podarìa èsar dezativàe.",
|
||||
"googlePlayText": "Google Play",
|
||||
"graphicsSettingsWindow": {
|
||||
"alwaysText": "Senpre",
|
||||
|
|
@ -1056,6 +1060,7 @@
|
|||
"notSignedInErrorText": "Par partesipar A te ghè da conétarte.",
|
||||
"notSignedInGooglePlayErrorText": "Far farlo A te ghè da conétarte co Google Play.",
|
||||
"notSignedInText": "gnancora cołegà",
|
||||
"notUsingAccountText": "Ocio: ze stà łasà in parte l'account ${SERVICE}.\nSe te vołi dopararlo và so 'Account > Acedi co ${SERVICE}'.",
|
||||
"nothingIsSelectedErrorText": "A no ze sełesionà gnente!",
|
||||
"numberText": "#${NUMBER}",
|
||||
"offText": "Dezativa",
|
||||
|
|
@ -1625,7 +1630,7 @@
|
|||
"Tournaments require ${VERSION} or newer": "Par i tornèi A serve ła varsion ${VERSION} o una pì resente",
|
||||
"Unlink ${ACCOUNT} from this account?\nAll data on ${ACCOUNT} will be reset.\n(except for achievements in some cases)": "Vutu descołegar l'account ${ACCOUNT} da 'sto account?\nTuti i dati de ${ACCOUNT} i vegnarà ełimenài.\n(obietivi a parte in calche cazo)",
|
||||
"WARNING: complaints of hacking have been issued against your account.\nAccounts found to be hacking will be banned. Please play fair.": "AVERTENSA: el to account el ze stà segnałà par el dòparo de truchi.\nI zugaduri catài a doparar truchi i vegnarà blocài. Zuga da gałantomo.",
|
||||
"Would you like to link your device account to this one?\n\nYour device account is ${ACCOUNT1}\nThis account is ${ACCOUNT2}\n\nThis will allow you to keep your existing progress.\nWarning: this cannot be undone!\n": "Ghetu caro cołegar l'account de'l to dispozidivo co 'sto cuà?\n\nL'account de'l to dispozidivo el ze ${ACCOUNT1}\n'Sto account el ze ${ACCOUNT2}\n\n'Sta oparasion ła te parmetarà de mantegner i to progresi ezistenti.\nAvertensa: 'sta asion no ła połe pì èsar anułada!",
|
||||
"Would you like to link your device account to this one?\n\nYour device account is ${ACCOUNT1}\nThis account is ${ACCOUNT2}\n\nThis will allow you to keep your existing progress.\nWarning: this cannot be undone!\n": "Ghetu caro cołegar el to account łogałe co 'sto cuà?\n\nEl to account łogałe el ze ${ACCOUNT1}\n'Sto account el ze ${ACCOUNT2}\n\n'Sta oparasion ła te parmetarà de mantegner i to progresi ezistenti.\nOcio: 'sta asion no ła połe pì èsar anułada!",
|
||||
"You already own this!": "Dezà cronpà!",
|
||||
"You can join in ${COUNT} seconds.": "A te połi zontarte tenpo ${COUNT} segondi.",
|
||||
"You don't have enough tickets for this!": "A no te ghè miga biłieti che basta par cronparlo!",
|
||||
|
|
@ -1800,6 +1805,7 @@
|
|||
"useDefaultText": "Reinposta",
|
||||
"usesExternalControllerText": "'Sto zugo el dòpara un controłador esterno cofà dispozidivo de entrada.",
|
||||
"usingItunesText": "Doparar l'apl de mùzega par el son de fondo...",
|
||||
"v2AccountLinkingInfoText": "Par łigar un account V2 dòpara el boton 'Jestisi account'.",
|
||||
"validatingTestBuildText": "Confermasion varsion de proa...",
|
||||
"victoryText": "Vitoria!",
|
||||
"voteDelayText": "A no te połi tacar n'antra votasion par ${NUMBER} segondi",
|
||||
|
|
@ -1832,6 +1838,7 @@
|
|||
},
|
||||
"waveText": "Ondada",
|
||||
"wellSureText": "Ciaro!",
|
||||
"whatIsThisText": "Cosa zeła 'sta roba?",
|
||||
"wiimoteLicenseWindow": {
|
||||
"titleText": "Deriti d'autor DarwiinRemote"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
from .core import contents, where
|
||||
|
||||
__all__ = ["contents", "where"]
|
||||
__version__ = "2022.09.14"
|
||||
__version__ = "2022.12.07"
|
||||
|
|
|
|||
220
dist/ba_data/python-site-packages/certifi/cacert.pem
vendored
220
dist/ba_data/python-site-packages/certifi/cacert.pem
vendored
|
|
@ -636,37 +636,6 @@ BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
|
|||
ZQ==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
|
||||
# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
|
||||
# Label: "Network Solutions Certificate Authority"
|
||||
# Serial: 116697915152937497490437556386812487904
|
||||
# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
|
||||
# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
|
||||
# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
|
||||
MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
|
||||
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
|
||||
dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
|
||||
UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
|
||||
ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
|
||||
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
|
||||
c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
|
||||
OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
|
||||
mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
|
||||
BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
|
||||
qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
|
||||
gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
|
||||
BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
|
||||
bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
|
||||
dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
|
||||
6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
|
||||
h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
|
||||
/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
|
||||
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
|
||||
pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
|
||||
# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
|
||||
# Label: "COMODO ECC Certification Authority"
|
||||
|
|
@ -1323,45 +1292,6 @@ t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
|
|||
SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes
|
||||
# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes
|
||||
# Label: "EC-ACC"
|
||||
# Serial: -23701579247955709139626555126524820479
|
||||
# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09
|
||||
# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8
|
||||
# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB
|
||||
8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy
|
||||
dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1
|
||||
YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3
|
||||
dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh
|
||||
IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD
|
||||
LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG
|
||||
EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g
|
||||
KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD
|
||||
ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu
|
||||
bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg
|
||||
ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN
|
||||
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R
|
||||
85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm
|
||||
4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV
|
||||
HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd
|
||||
QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t
|
||||
lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB
|
||||
o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
|
||||
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4
|
||||
opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo
|
||||
dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW
|
||||
ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN
|
||||
AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y
|
||||
/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k
|
||||
SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy
|
||||
Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS
|
||||
Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl
|
||||
nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
|
||||
# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
|
||||
# Label: "Actalis Authentication Root CA"
|
||||
|
|
@ -2243,46 +2173,6 @@ KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
|
|||
xwy8p2Fp8fc74SrL+SvzZpA3
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
|
||||
# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
|
||||
# Label: "Staat der Nederlanden EV Root CA"
|
||||
# Serial: 10000013
|
||||
# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
|
||||
# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
|
||||
# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
|
||||
TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
|
||||
dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
|
||||
MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
|
||||
TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
|
||||
b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
|
||||
M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
|
||||
UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
|
||||
Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
|
||||
rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
|
||||
pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
|
||||
j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
|
||||
KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
|
||||
/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
|
||||
cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
|
||||
1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
|
||||
px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
|
||||
/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
|
||||
MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
|
||||
eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
|
||||
2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
|
||||
v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
|
||||
wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
|
||||
CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
|
||||
vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
|
||||
Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
|
||||
Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
|
||||
eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
|
||||
FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
|
||||
7uzXLg==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
|
||||
# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
|
||||
# Label: "IdenTrust Commercial Root CA 1"
|
||||
|
|
@ -2890,116 +2780,6 @@ T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
|
|||
MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
|
||||
# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
|
||||
# Label: "TrustCor RootCert CA-1"
|
||||
# Serial: 15752444095811006489
|
||||
# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
|
||||
# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
|
||||
# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
|
||||
VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
|
||||
MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
|
||||
cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
|
||||
IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
|
||||
pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
|
||||
IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
|
||||
A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
|
||||
cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
||||
CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
|
||||
RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
|
||||
seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
|
||||
9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
|
||||
EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
|
||||
hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
|
||||
DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
|
||||
DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
|
||||
ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
|
||||
/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
|
||||
ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
|
||||
yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
|
||||
L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
|
||||
zl/HHk484IkzlQsPpTLWPFp5LBk=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
|
||||
# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
|
||||
# Label: "TrustCor RootCert CA-2"
|
||||
# Serial: 2711694510199101698
|
||||
# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
|
||||
# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
|
||||
# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
|
||||
BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
|
||||
IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
|
||||
dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
|
||||
Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
|
||||
MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
|
||||
Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
|
||||
VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
|
||||
dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
|
||||
AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
|
||||
QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
|
||||
1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
|
||||
2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
|
||||
DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
|
||||
az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
|
||||
3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
|
||||
oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
|
||||
g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
|
||||
mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
|
||||
8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
|
||||
BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
|
||||
nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
|
||||
DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
|
||||
dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
|
||||
MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
|
||||
/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
|
||||
CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
|
||||
ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
|
||||
2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
|
||||
N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
|
||||
Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
|
||||
As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
|
||||
5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
|
||||
1uwJ
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
|
||||
# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
|
||||
# Label: "TrustCor ECA-1"
|
||||
# Serial: 9548242946988625984
|
||||
# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
|
||||
# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
|
||||
# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
|
||||
VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
|
||||
MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
|
||||
cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
|
||||
IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
|
||||
BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
|
||||
IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
|
||||
dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
|
||||
RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
|
||||
3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
|
||||
BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
|
||||
3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
|
||||
owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
|
||||
wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
|
||||
ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
|
||||
BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
|
||||
MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
|
||||
civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
|
||||
AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
|
||||
hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
|
||||
soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
|
||||
WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
|
||||
tJ/X5g==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
|
||||
# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
|
||||
# Label: "SSL.com Root Certification Authority RSA"
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ import types as _types
|
|||
import typing
|
||||
|
||||
|
||||
# Please keep __all__ alphabetized within each category.
|
||||
__all__ = [
|
||||
# Super-special typing primitives.
|
||||
'Any',
|
||||
'ClassVar',
|
||||
'Concatenate',
|
||||
'Final',
|
||||
|
|
@ -20,6 +20,7 @@ __all__ = [
|
|||
'ParamSpecKwargs',
|
||||
'Self',
|
||||
'Type',
|
||||
'TypeVar',
|
||||
'TypeVarTuple',
|
||||
'Unpack',
|
||||
|
||||
|
|
@ -60,6 +61,7 @@ __all__ = [
|
|||
'Literal',
|
||||
'NewType',
|
||||
'overload',
|
||||
'override',
|
||||
'Protocol',
|
||||
'reveal_type',
|
||||
'runtime',
|
||||
|
|
@ -149,6 +151,37 @@ VT = typing.TypeVar('VT') # Value type.
|
|||
T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers.
|
||||
T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant.
|
||||
|
||||
|
||||
if sys.version_info >= (3, 11):
|
||||
from typing import Any
|
||||
else:
|
||||
|
||||
class _AnyMeta(type):
|
||||
def __instancecheck__(self, obj):
|
||||
if self is Any:
|
||||
raise TypeError("typing_extensions.Any cannot be used with isinstance()")
|
||||
return super().__instancecheck__(obj)
|
||||
|
||||
def __repr__(self):
|
||||
if self is Any:
|
||||
return "typing_extensions.Any"
|
||||
return super().__repr__()
|
||||
|
||||
class Any(metaclass=_AnyMeta):
|
||||
"""Special type indicating an unconstrained type.
|
||||
- Any is compatible with every type.
|
||||
- Any assumed to have all methods.
|
||||
- All values assumed to be instances of Any.
|
||||
Note that all the above statements are true from the point of view of
|
||||
static type checkers. At runtime, Any should not be used with instance
|
||||
checks.
|
||||
"""
|
||||
def __new__(cls, *args, **kwargs):
|
||||
if cls is Any:
|
||||
raise TypeError("Any cannot be instantiated")
|
||||
return super().__new__(cls, *args, **kwargs)
|
||||
|
||||
|
||||
ClassVar = typing.ClassVar
|
||||
|
||||
# On older versions of typing there is an internal class named "Final".
|
||||
|
|
@ -431,7 +464,7 @@ else:
|
|||
if type(self)._is_protocol:
|
||||
raise TypeError('Protocols cannot be instantiated')
|
||||
|
||||
class _ProtocolMeta(abc.ABCMeta):
|
||||
class _ProtocolMeta(abc.ABCMeta): # noqa: B024
|
||||
# This metaclass is a bit unfortunate and exists only because of the lack
|
||||
# of __instancehook__.
|
||||
def __instancecheck__(cls, instance):
|
||||
|
|
@ -1115,6 +1148,44 @@ else:
|
|||
above.""")
|
||||
|
||||
|
||||
class _DefaultMixin:
|
||||
"""Mixin for TypeVarLike defaults."""
|
||||
|
||||
__slots__ = ()
|
||||
|
||||
def __init__(self, default):
|
||||
if isinstance(default, (tuple, list)):
|
||||
self.__default__ = tuple((typing._type_check(d, "Default must be a type")
|
||||
for d in default))
|
||||
elif default:
|
||||
self.__default__ = typing._type_check(default, "Default must be a type")
|
||||
else:
|
||||
self.__default__ = None
|
||||
|
||||
|
||||
# Add default and infer_variance parameters from PEP 696 and 695
|
||||
class TypeVar(typing.TypeVar, _DefaultMixin, _root=True):
|
||||
"""Type variable."""
|
||||
|
||||
__module__ = 'typing'
|
||||
|
||||
def __init__(self, name, *constraints, bound=None,
|
||||
covariant=False, contravariant=False,
|
||||
default=None, infer_variance=False):
|
||||
super().__init__(name, *constraints, bound=bound, covariant=covariant,
|
||||
contravariant=contravariant)
|
||||
_DefaultMixin.__init__(self, default)
|
||||
self.__infer_variance__ = infer_variance
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
|
||||
except (AttributeError, ValueError):
|
||||
def_mod = None
|
||||
if def_mod != 'typing_extensions':
|
||||
self.__module__ = def_mod
|
||||
|
||||
|
||||
# Python 3.10+ has PEP 612
|
||||
if hasattr(typing, 'ParamSpecArgs'):
|
||||
ParamSpecArgs = typing.ParamSpecArgs
|
||||
|
|
@ -1179,12 +1250,32 @@ else:
|
|||
|
||||
# 3.10+
|
||||
if hasattr(typing, 'ParamSpec'):
|
||||
ParamSpec = typing.ParamSpec
|
||||
|
||||
# Add default Parameter - PEP 696
|
||||
class ParamSpec(typing.ParamSpec, _DefaultMixin, _root=True):
|
||||
"""Parameter specification variable."""
|
||||
|
||||
__module__ = 'typing'
|
||||
|
||||
def __init__(self, name, *, bound=None, covariant=False, contravariant=False,
|
||||
default=None):
|
||||
super().__init__(name, bound=bound, covariant=covariant,
|
||||
contravariant=contravariant)
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
|
||||
except (AttributeError, ValueError):
|
||||
def_mod = None
|
||||
if def_mod != 'typing_extensions':
|
||||
self.__module__ = def_mod
|
||||
|
||||
# 3.7-3.9
|
||||
else:
|
||||
|
||||
# Inherits from list as a workaround for Callable checks in Python < 3.9.2.
|
||||
class ParamSpec(list):
|
||||
class ParamSpec(list, _DefaultMixin):
|
||||
"""Parameter specification variable.
|
||||
|
||||
Usage::
|
||||
|
|
@ -1242,7 +1333,8 @@ else:
|
|||
def kwargs(self):
|
||||
return ParamSpecKwargs(self)
|
||||
|
||||
def __init__(self, name, *, bound=None, covariant=False, contravariant=False):
|
||||
def __init__(self, name, *, bound=None, covariant=False, contravariant=False,
|
||||
default=None):
|
||||
super().__init__([self])
|
||||
self.__name__ = name
|
||||
self.__covariant__ = bool(covariant)
|
||||
|
|
@ -1251,6 +1343,7 @@ else:
|
|||
self.__bound__ = typing._type_check(bound, 'Bound must be a type.')
|
||||
else:
|
||||
self.__bound__ = None
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
|
|
@ -1752,9 +1845,25 @@ else:
|
|||
|
||||
|
||||
if hasattr(typing, "TypeVarTuple"): # 3.11+
|
||||
TypeVarTuple = typing.TypeVarTuple
|
||||
|
||||
# Add default Parameter - PEP 696
|
||||
class TypeVarTuple(typing.TypeVarTuple, _DefaultMixin, _root=True):
|
||||
"""Type variable tuple."""
|
||||
|
||||
def __init__(self, name, *, default=None):
|
||||
super().__init__(name)
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')
|
||||
except (AttributeError, ValueError):
|
||||
def_mod = None
|
||||
if def_mod != 'typing_extensions':
|
||||
self.__module__ = def_mod
|
||||
|
||||
else:
|
||||
class TypeVarTuple:
|
||||
class TypeVarTuple(_DefaultMixin):
|
||||
"""Type variable tuple.
|
||||
|
||||
Usage::
|
||||
|
|
@ -1804,8 +1913,9 @@ else:
|
|||
def __iter__(self):
|
||||
yield self.__unpacked__
|
||||
|
||||
def __init__(self, name):
|
||||
def __init__(self, name, *, default=None):
|
||||
self.__name__ = name
|
||||
_DefaultMixin.__init__(self, default)
|
||||
|
||||
# for pickling:
|
||||
try:
|
||||
|
|
@ -1968,6 +2078,36 @@ else:
|
|||
return decorator
|
||||
|
||||
|
||||
if hasattr(typing, "override"):
|
||||
override = typing.override
|
||||
else:
|
||||
_F = typing.TypeVar("_F", bound=typing.Callable[..., typing.Any])
|
||||
|
||||
def override(__arg: _F) -> _F:
|
||||
"""Indicate that a method is intended to override a method in a base class.
|
||||
|
||||
Usage:
|
||||
|
||||
class Base:
|
||||
def method(self) -> None: ...
|
||||
pass
|
||||
|
||||
class Child(Base):
|
||||
@override
|
||||
def method(self) -> None:
|
||||
super().method()
|
||||
|
||||
When this decorator is applied to a method, the type checker will
|
||||
validate that it overrides a method with the same name on a base class.
|
||||
This helps prevent bugs that may occur when a base class is changed
|
||||
without an equivalent change to a child class.
|
||||
|
||||
See PEP 698 for details.
|
||||
|
||||
"""
|
||||
return __arg
|
||||
|
||||
|
||||
# We have to do some monkey patching to deal with the dual nature of
|
||||
# Unpack/TypeVarTuple:
|
||||
# - We want Unpack to be a kind of TypeVar so it gets accepted in
|
||||
|
|
|
|||
2
dist/ba_data/python/ba/__init__.py
vendored
2
dist/ba_data/python/ba/__init__.py
vendored
|
|
@ -102,6 +102,7 @@ from ba._error import (
|
|||
WidgetNotFoundError,
|
||||
ActivityNotFoundError,
|
||||
TeamNotFoundError,
|
||||
MapNotFoundError,
|
||||
SessionTeamNotFoundError,
|
||||
SessionNotFoundError,
|
||||
DelegateNotFoundError,
|
||||
|
|
@ -282,6 +283,7 @@ __all__ = [
|
|||
'Lobby',
|
||||
'Lstr',
|
||||
'Map',
|
||||
'MapNotFoundError',
|
||||
'Material',
|
||||
'MetadataSubsystem',
|
||||
'Model',
|
||||
|
|
|
|||
43
dist/ba_data/python/ba/_accountv2.py
vendored
43
dist/ba_data/python/ba/_accountv2.py
vendored
|
|
@ -36,7 +36,7 @@ class AccountV2Subsystem:
|
|||
# (or lack thereof) has completed. This includes things like
|
||||
# workspace syncing. Completion of this is what flips the app
|
||||
# into 'running' state.
|
||||
self._initial_login_completed = False
|
||||
self._initial_sign_in_completed = False
|
||||
|
||||
self._kicked_off_workspace_load = False
|
||||
|
||||
|
|
@ -98,7 +98,7 @@ class AccountV2Subsystem:
|
|||
if account.workspaceid is not None:
|
||||
assert account.workspacename is not None
|
||||
if (
|
||||
not self._initial_login_completed
|
||||
not self._initial_sign_in_completed
|
||||
and not self._kicked_off_workspace_load
|
||||
):
|
||||
self._kicked_off_workspace_load = True
|
||||
|
|
@ -121,9 +121,9 @@ class AccountV2Subsystem:
|
|||
return
|
||||
|
||||
# Ok; no workspace to worry about; carry on.
|
||||
if not self._initial_login_completed:
|
||||
self._initial_login_completed = True
|
||||
_ba.app.on_initial_login_completed()
|
||||
if not self._initial_sign_in_completed:
|
||||
self._initial_sign_in_completed = True
|
||||
_ba.app.on_initial_sign_in_completed()
|
||||
|
||||
def on_active_logins_changed(self, logins: dict[LoginType, str]) -> None:
|
||||
"""Should be called when logins for the active account change."""
|
||||
|
|
@ -156,9 +156,9 @@ class AccountV2Subsystem:
|
|||
within a few seconds of app launch; the app can move forward
|
||||
with the startup sequence at that point.
|
||||
"""
|
||||
if not self._initial_login_completed:
|
||||
self._initial_login_completed = True
|
||||
_ba.app.on_initial_login_completed()
|
||||
if not self._initial_sign_in_completed:
|
||||
self._initial_sign_in_completed = True
|
||||
_ba.app.on_initial_sign_in_completed()
|
||||
|
||||
@staticmethod
|
||||
def _hashstr(val: str) -> str:
|
||||
|
|
@ -271,7 +271,7 @@ class AccountV2Subsystem:
|
|||
self._implicit_state_changed = False
|
||||
|
||||
# Once we've made a move here we don't want to
|
||||
# do any more automatic ones.
|
||||
# do any more automatic stuff.
|
||||
self._can_do_auto_sign_in = False
|
||||
|
||||
else:
|
||||
|
|
@ -290,22 +290,23 @@ class AccountV2Subsystem:
|
|||
' of implicit state change...',
|
||||
)
|
||||
self._implicit_signed_in_adapter.sign_in(
|
||||
self._on_explicit_sign_in_completed
|
||||
self._on_explicit_sign_in_completed,
|
||||
description='implicit state change',
|
||||
)
|
||||
self._implicit_state_changed = False
|
||||
|
||||
# Once we've made a move here we don't want to
|
||||
# do any more automatic ones.
|
||||
# do any more automatic stuff.
|
||||
self._can_do_auto_sign_in = False
|
||||
|
||||
if not self._can_do_auto_sign_in:
|
||||
return
|
||||
|
||||
# If we're not currently signed in, we have connectivity, and
|
||||
# we have an available implicit login, auto-sign-in with it.
|
||||
# we have an available implicit login, auto-sign-in with it once.
|
||||
# The implicit-state-change logic above should keep things
|
||||
# mostly in-sync, but due to connectivity or other issues that
|
||||
# might not always be the case. We prefer to keep people signed
|
||||
# mostly in-sync, but that might not always be the case due to
|
||||
# connectivity or other issues. We prefer to keep people signed
|
||||
# in as a rule, even if there are corner cases where this might
|
||||
# not be what they want (A user signing out and then restarting
|
||||
# may be auto-signed back in).
|
||||
|
|
@ -324,7 +325,7 @@ class AccountV2Subsystem:
|
|||
)
|
||||
self._can_do_auto_sign_in = False # Only ATTEMPT once
|
||||
self._implicit_signed_in_adapter.sign_in(
|
||||
self._on_implicit_sign_in_completed
|
||||
self._on_implicit_sign_in_completed, description='auto-sign-in'
|
||||
)
|
||||
|
||||
def _on_explicit_sign_in_completed(
|
||||
|
|
@ -337,8 +338,8 @@ class AccountV2Subsystem:
|
|||
|
||||
del adapter # Unused.
|
||||
|
||||
# Make some noise on errors since the user knows
|
||||
# a sign-in attempt is happening in this case.
|
||||
# Make some noise on errors since the user knows a
|
||||
# sign-in attempt is happening in this case (the 'explicit' part).
|
||||
if isinstance(result, Exception):
|
||||
# We expect the occasional communication errors;
|
||||
# Log a full exception for anything else though.
|
||||
|
|
@ -347,6 +348,8 @@ class AccountV2Subsystem:
|
|||
'Error on explicit accountv2 sign in attempt.',
|
||||
exc_info=result,
|
||||
)
|
||||
|
||||
# For now just show 'error'. Should do better than this.
|
||||
with _ba.Context('ui'):
|
||||
_ba.screenmessage(
|
||||
Lstr(resource='internal.signInErrorText'),
|
||||
|
|
@ -395,9 +398,9 @@ class AccountV2Subsystem:
|
|||
_ba.app.accounts_v2.set_primary_credentials(result.credentials)
|
||||
|
||||
def _on_set_active_workspace_completed(self) -> None:
|
||||
if not self._initial_login_completed:
|
||||
self._initial_login_completed = True
|
||||
_ba.app.on_initial_login_completed()
|
||||
if not self._initial_sign_in_completed:
|
||||
self._initial_sign_in_completed = True
|
||||
_ba.app.on_initial_sign_in_completed()
|
||||
|
||||
|
||||
class AccountV2Handle:
|
||||
|
|
|
|||
71
dist/ba_data/python/ba/_app.py
vendored
71
dist/ba_data/python/ba/_app.py
vendored
|
|
@ -20,6 +20,7 @@ from ba._meta import MetadataSubsystem
|
|||
from ba._ads import AdsSubsystem
|
||||
from ba._net import NetworkSubsystem
|
||||
from ba._workspace import WorkspaceSubsystem
|
||||
from ba._appcomponent import AppComponentSubsystem
|
||||
from ba import _internal
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
|
@ -58,20 +59,26 @@ class App:
|
|||
class State(Enum):
|
||||
"""High level state the app can be in."""
|
||||
|
||||
# Python-level systems being inited but should not interact.
|
||||
LAUNCHING = 0
|
||||
# The launch process has not yet begun.
|
||||
INITIAL = 0
|
||||
|
||||
# Initial account logins, workspace & asset downloads, etc.
|
||||
LOADING = 1
|
||||
# Our app subsystems are being inited but should not yet interact.
|
||||
LAUNCHING = 1
|
||||
|
||||
# Normal running state.
|
||||
RUNNING = 2
|
||||
# App subsystems are inited and interacting, but the app has not
|
||||
# yet embarked on a high level course of action. It is doing initial
|
||||
# account logins, workspace & asset downloads, etc. in order to
|
||||
# prepare for this.
|
||||
LOADING = 2
|
||||
|
||||
# App is backgrounded or otherwise suspended.
|
||||
PAUSED = 3
|
||||
# All pieces are in place and the app is now doing its thing.
|
||||
RUNNING = 3
|
||||
|
||||
# App is shutting down.
|
||||
SHUTTING_DOWN = 4
|
||||
# The app is backgrounded or otherwise suspended.
|
||||
PAUSED = 4
|
||||
|
||||
# The app is shutting down.
|
||||
SHUTTING_DOWN = 5
|
||||
|
||||
@property
|
||||
def aioloop(self) -> asyncio.AbstractEventLoop:
|
||||
|
|
@ -128,7 +135,7 @@ class App:
|
|||
|
||||
@property
|
||||
def debug_build(self) -> bool:
|
||||
"""Whether the game was compiled in debug mode.
|
||||
"""Whether the app was compiled in debug mode.
|
||||
|
||||
Debug builds generally run substantially slower than non-debug
|
||||
builds due to compiler optimizations being disabled and extra
|
||||
|
|
@ -232,11 +239,14 @@ class App:
|
|||
"""
|
||||
# pylint: disable=too-many-statements
|
||||
|
||||
self.state = self.State.LAUNCHING
|
||||
self.state = self.State.INITIAL
|
||||
|
||||
self._bootstrapping_completed = False
|
||||
self._called_on_app_launching = False
|
||||
self._launch_completed = False
|
||||
self._initial_login_completed = False
|
||||
self._initial_sign_in_completed = False
|
||||
self._meta_scan_completed = False
|
||||
self._called_on_app_loading = False
|
||||
self._called_on_app_running = False
|
||||
self._app_paused = False
|
||||
|
||||
|
|
@ -294,6 +304,7 @@ class App:
|
|||
# Server Mode.
|
||||
self.server: ba.ServerController | None = None
|
||||
|
||||
self.components = AppComponentSubsystem()
|
||||
self.meta = MetadataSubsystem()
|
||||
self.accounts_v1 = AccountV1Subsystem()
|
||||
self.plugins = PluginSubsystem()
|
||||
|
|
@ -342,10 +353,8 @@ class App:
|
|||
self.delegate: ba.AppDelegate | None = None
|
||||
self._asyncio_timer: ba.Timer | None = None
|
||||
|
||||
def on_app_launch(self) -> None:
|
||||
"""Runs after the app finishes low level bootstrapping.
|
||||
|
||||
(internal)"""
|
||||
def on_app_launching(self) -> None:
|
||||
"""Called when the app is first entering the launching state."""
|
||||
# pylint: disable=cyclic-import
|
||||
# pylint: disable=too-many-locals
|
||||
from ba import _asyncio
|
||||
|
|
@ -473,6 +482,9 @@ class App:
|
|||
self._launch_completed = True
|
||||
self._update_state()
|
||||
|
||||
def on_app_loading(self) -> None:
|
||||
"""Called when initially entering the loading state."""
|
||||
|
||||
def on_app_running(self) -> None:
|
||||
"""Called when initially entering the running state."""
|
||||
|
||||
|
|
@ -481,6 +493,13 @@ class App:
|
|||
# from ba._dependency import test_depset
|
||||
# test_depset()
|
||||
|
||||
def on_bootstrapping_completed(self) -> None:
|
||||
"""Called by the C++ layer once its ready to rock."""
|
||||
assert _ba.in_logic_thread()
|
||||
assert not self._bootstrapping_completed
|
||||
self._bootstrapping_completed = True
|
||||
self._update_state()
|
||||
|
||||
def on_meta_scan_complete(self) -> None:
|
||||
"""Called by meta-scan when it is done doing its thing."""
|
||||
assert _ba.in_logic_thread()
|
||||
|
|
@ -511,15 +530,25 @@ class App:
|
|||
self.plugins.on_app_resume()
|
||||
self.health_monitor.on_app_resume()
|
||||
|
||||
if self._initial_login_completed and self._meta_scan_completed:
|
||||
# Handle initially entering or returning to other states.
|
||||
if self._initial_sign_in_completed and self._meta_scan_completed:
|
||||
self.state = self.State.RUNNING
|
||||
if not self._called_on_app_running:
|
||||
self._called_on_app_running = True
|
||||
self.on_app_running()
|
||||
elif self._launch_completed:
|
||||
self.state = self.State.LOADING
|
||||
if not self._called_on_app_loading:
|
||||
self._called_on_app_loading = True
|
||||
self.on_app_loading()
|
||||
else:
|
||||
# Only thing left is launching. We shouldn't be getting
|
||||
# called before at least that is complete.
|
||||
assert self._bootstrapping_completed
|
||||
self.state = self.State.LAUNCHING
|
||||
if not self._called_on_app_launching:
|
||||
self._called_on_app_launching = True
|
||||
self.on_app_launching()
|
||||
|
||||
def on_app_pause(self) -> None:
|
||||
"""Called when the app goes to a suspended state."""
|
||||
|
|
@ -724,8 +753,8 @@ class App:
|
|||
_ba.screenmessage(Lstr(resource='errorText'), color=(1, 0, 0))
|
||||
_ba.playsound(_ba.getsound('error'))
|
||||
|
||||
def on_initial_login_completed(self) -> None:
|
||||
"""Callback to be run after initial login process (or lack thereof).
|
||||
def on_initial_sign_in_completed(self) -> None:
|
||||
"""Callback to be run after initial sign-in (or lack thereof).
|
||||
|
||||
This period includes things such as syncing account workspaces
|
||||
or other data so it may take a substantial amount of time.
|
||||
|
|
@ -736,5 +765,5 @@ class App:
|
|||
# (account workspaces).
|
||||
self.meta.start_extra_scan()
|
||||
|
||||
self._initial_login_completed = True
|
||||
self._initial_sign_in_completed = True
|
||||
self._update_state()
|
||||
|
|
|
|||
90
dist/ba_data/python/ba/_appcomponent.py
vendored
Normal file
90
dist/ba_data/python/ba/_appcomponent.py
vendored
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# Released under the MIT License. See LICENSE for details.
|
||||
#
|
||||
"""Provides the AppComponent class."""
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING, TypeVar, cast
|
||||
|
||||
import _ba
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import Callable, Any
|
||||
|
||||
T = TypeVar('T', bound=type)
|
||||
|
||||
|
||||
class AppComponentSubsystem:
|
||||
"""Subsystem for wrangling AppComponents.
|
||||
|
||||
Category: **App Classes**
|
||||
|
||||
This subsystem acts as a registry for classes providing particular
|
||||
functionality for the app, and allows plugins or other custom code to
|
||||
easily override said functionality.
|
||||
|
||||
Use ba.app.components to get the single shared instance of this class.
|
||||
|
||||
The general idea with this setup is that a base-class is defined to
|
||||
provide some functionality and then anyone wanting that functionality
|
||||
uses the getclass() method with that base class to return the current
|
||||
registered implementation. The user should not know or care whether
|
||||
they are getting the base class itself or some other implementation.
|
||||
|
||||
Change-callbacks can also be requested for base classes which will
|
||||
fire in a deferred manner when particular base-classes are overridden.
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self._implementations: dict[type, type] = {}
|
||||
self._prev_implementations: dict[type, type] = {}
|
||||
self._dirty_base_classes: set[type] = set()
|
||||
self._change_callbacks: dict[type, list[Callable[[Any], None]]] = {}
|
||||
|
||||
def setclass(self, baseclass: type, implementation: type) -> None:
|
||||
"""Set the class providing an implementation of some base-class.
|
||||
|
||||
The provided implementation class must be a subclass of baseclass.
|
||||
"""
|
||||
# Currently limiting this to logic-thread use; can revisit if needed
|
||||
# (would need to guard access to our implementations dict).
|
||||
assert _ba.in_logic_thread()
|
||||
|
||||
if not issubclass(implementation, baseclass):
|
||||
raise TypeError(
|
||||
f'Implementation {implementation}'
|
||||
f' is not a subclass of baseclass {baseclass}.'
|
||||
)
|
||||
|
||||
self._implementations[baseclass] = implementation
|
||||
|
||||
# If we're the first thing getting dirtied, set up a callback to
|
||||
# clean everything. And add ourself to the dirty list regardless.
|
||||
if not self._dirty_base_classes:
|
||||
_ba.pushcall(self._run_change_callbacks)
|
||||
self._dirty_base_classes.add(baseclass)
|
||||
|
||||
def getclass(self, baseclass: T) -> T:
|
||||
"""Given a base-class, return the currently set implementation class.
|
||||
|
||||
If no custom implementation has been set, the provided base-class
|
||||
is returned.
|
||||
"""
|
||||
assert _ba.in_logic_thread()
|
||||
|
||||
del baseclass # Unused.
|
||||
return cast(T, None)
|
||||
|
||||
def register_change_callback(
|
||||
self, baseclass: T, callback: Callable[[T], None]
|
||||
) -> None:
|
||||
"""Register a callback to fire when a class implementation changes.
|
||||
|
||||
The callback will be scheduled to run in the logic thread event
|
||||
loop. Note that any further setclass calls before the callback
|
||||
runs will not result in additional callbacks.
|
||||
"""
|
||||
assert _ba.in_logic_thread()
|
||||
self._change_callbacks.setdefault(baseclass, []).append(callback)
|
||||
|
||||
def _run_change_callbacks(self) -> None:
|
||||
pass
|
||||
35
dist/ba_data/python/ba/_apputils.py
vendored
35
dist/ba_data/python/ba/_apputils.py
vendored
|
|
@ -476,35 +476,18 @@ def on_too_many_file_descriptors() -> None:
|
|||
real_time = _ba.time(TimeType.REAL)
|
||||
|
||||
def _do_log() -> None:
|
||||
import subprocess
|
||||
|
||||
pid = os.getpid()
|
||||
out = f'TOO MANY FDS at {real_time}.\nWe are pid {pid}\n'
|
||||
|
||||
out += (
|
||||
'FD Count: '
|
||||
+ subprocess.run(
|
||||
f'ls -l /proc/{pid}/fd | wc -l',
|
||||
shell=True,
|
||||
check=False,
|
||||
capture_output=True,
|
||||
).stdout.decode()
|
||||
+ '\n'
|
||||
try:
|
||||
fdcount: int | str = len(os.listdir(f'/proc/{pid}/fd'))
|
||||
except Exception as exc:
|
||||
fdcount = f'? ({exc})'
|
||||
logging.warning(
|
||||
'TOO MANY FDS at %.2f. We are pid %d. FDCount is %s.',
|
||||
real_time,
|
||||
pid,
|
||||
fdcount,
|
||||
)
|
||||
|
||||
out += (
|
||||
'lsof output:\n'
|
||||
+ subprocess.run(
|
||||
f'lsof -p {pid}',
|
||||
shell=True,
|
||||
check=False,
|
||||
capture_output=True,
|
||||
).stdout.decode()
|
||||
+ '\n'
|
||||
)
|
||||
|
||||
logging.warning(out)
|
||||
|
||||
Thread(target=_do_log, daemon=True).start()
|
||||
|
||||
# import io
|
||||
|
|
|
|||
2
dist/ba_data/python/ba/_bootstrap.py
vendored
2
dist/ba_data/python/ba/_bootstrap.py
vendored
|
|
@ -47,7 +47,7 @@ def bootstrap() -> None:
|
|||
|
||||
# Give a soft warning if we're being used with a different binary
|
||||
# version than we expect.
|
||||
expected_build = 20982
|
||||
expected_build = 21005
|
||||
running_build: int = env['build_number']
|
||||
if running_build != expected_build:
|
||||
print(
|
||||
|
|
|
|||
7
dist/ba_data/python/ba/_error.py
vendored
7
dist/ba_data/python/ba/_error.py
vendored
|
|
@ -69,6 +69,13 @@ class TeamNotFoundError(NotFoundError):
|
|||
"""
|
||||
|
||||
|
||||
class MapNotFoundError(NotFoundError):
|
||||
"""Exception raised when an expected ba.Map does not exist.
|
||||
|
||||
Category: **Exception Classes**
|
||||
"""
|
||||
|
||||
|
||||
class DelegateNotFoundError(NotFoundError):
|
||||
"""Exception raised when an expected delegate object does not exist.
|
||||
|
||||
|
|
|
|||
6
dist/ba_data/python/ba/_gameactivity.py
vendored
6
dist/ba_data/python/ba/_gameactivity.py
vendored
|
|
@ -14,7 +14,7 @@ from ba._activity import Activity
|
|||
from ba._score import ScoreConfig
|
||||
from ba._language import Lstr
|
||||
from ba._messages import PlayerDiedMessage, StandMessage
|
||||
from ba._error import NotFoundError, print_error, print_exception
|
||||
from ba._error import MapNotFoundError, print_error, print_exception
|
||||
from ba._general import Call, WeakCall
|
||||
from ba._player import PlayerInfo
|
||||
from ba import _map
|
||||
|
|
@ -274,10 +274,10 @@ class GameActivity(Activity[PlayerType, TeamType]):
|
|||
def map(self) -> ba.Map:
|
||||
"""The map being used for this game.
|
||||
|
||||
Raises a ba.NotFoundError if the map does not currently exist.
|
||||
Raises a ba.MapNotFoundError if the map does not currently exist.
|
||||
"""
|
||||
if self._map is None:
|
||||
raise NotFoundError
|
||||
raise MapNotFoundError
|
||||
return self._map
|
||||
|
||||
def get_instance_display_string(self) -> ba.Lstr:
|
||||
|
|
|
|||
52
dist/ba_data/python/ba/_hooks.py
vendored
52
dist/ba_data/python/ba/_hooks.py
vendored
|
|
@ -1,13 +1,13 @@
|
|||
# Released under the MIT License. See LICENSE for details.
|
||||
#
|
||||
"""Snippets of code for use by the internal C++ layer.
|
||||
"""Snippets of code for use by the internal layer.
|
||||
|
||||
History: originally I would dynamically compile/eval bits of Python text
|
||||
from within C++ code, but the major downside there was that none of that was
|
||||
type-checked so if names or arguments changed I would never catch code breakage
|
||||
until the code was next run. By defining all snippets I use here and then
|
||||
capturing references to them all at launch I can immediately verify everything
|
||||
I'm looking for exists and pylint/mypy can do their magic on this file.
|
||||
History: originally the engine would dynamically compile/eval various Python
|
||||
code from within C++ code, but the major downside there was that none of it
|
||||
was type-checked so if names or arguments changed it would go unnoticed
|
||||
until it broke at runtime. By instead defining such snippets here and then
|
||||
capturing references to them all at launch it is possible to allow linting
|
||||
and type-checking magic to happen and most issues will be caught immediately.
|
||||
"""
|
||||
# (most of these are self-explanatory)
|
||||
# pylint: disable=missing-function-docstring
|
||||
|
|
@ -27,12 +27,8 @@ def finish_bootstrapping() -> None:
|
|||
"""Do final bootstrapping related bits."""
|
||||
assert _ba.in_logic_thread()
|
||||
|
||||
# Kick off our asyncio event handling, allowing us to use coroutines
|
||||
# in our logic thread alongside our internal event handling.
|
||||
# setup_asyncio()
|
||||
|
||||
# Ok, bootstrapping is done; time to get the show started.
|
||||
_ba.app.on_app_launch()
|
||||
# Ok, low level bootstrapping is done; time to get Python stuff started.
|
||||
_ba.app.on_bootstrapping_completed()
|
||||
|
||||
|
||||
def reset_to_main_menu() -> None:
|
||||
|
|
@ -495,3 +491,33 @@ def login_adapter_get_sign_in_token_response(
|
|||
adapter = _ba.app.accounts_v2.login_adapters[login_type]
|
||||
assert isinstance(adapter, LoginAdapterNative)
|
||||
adapter.on_sign_in_complete(attempt_id=attempt_id, result=result)
|
||||
|
||||
|
||||
def show_client_too_old_error() -> None:
|
||||
"""Called at launch if the server tells us we're too old to talk to it."""
|
||||
from ba._language import Lstr
|
||||
|
||||
# If you are using an old build of the app and would like to stop
|
||||
# seeing this error at launch, do:
|
||||
# ba.app.config['SuppressClientTooOldErrorForBuild'] = ba.app.build_number
|
||||
# ba.app.config.commit()
|
||||
# Note that you will have to do that again later if you update to
|
||||
# a newer build.
|
||||
if (
|
||||
_ba.app.config.get('SuppressClientTooOldErrorForBuild')
|
||||
== _ba.app.build_number
|
||||
):
|
||||
return
|
||||
|
||||
_ba.playsound(_ba.getsound('error'))
|
||||
_ba.screenmessage(
|
||||
Lstr(
|
||||
translate=(
|
||||
'serverResponses',
|
||||
'Server functionality is no longer supported'
|
||||
' in this version of the game;\n'
|
||||
'Please update to a newer version.',
|
||||
)
|
||||
),
|
||||
color=(1, 0, 0),
|
||||
)
|
||||
|
|
|
|||
44
dist/ba_data/python/ba/_login.py
vendored
44
dist/ba_data/python/ba/_login.py
vendored
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
import logging
|
||||
from dataclasses import dataclass
|
||||
from typing import TYPE_CHECKING, final
|
||||
|
|
@ -57,6 +58,9 @@ class LoginAdapter:
|
|||
# current active primary account.
|
||||
self._active_login_id: str | None = None
|
||||
|
||||
self._last_sign_in_time: float | None = None
|
||||
self._last_sign_in_desc: str | None = None
|
||||
|
||||
def on_app_launch(self) -> None:
|
||||
"""Should be called for each adapter in on_app_launch."""
|
||||
|
||||
|
|
@ -142,6 +146,7 @@ class LoginAdapter:
|
|||
def sign_in(
|
||||
self,
|
||||
result_cb: Callable[[LoginAdapter, SignInResult | Exception], None],
|
||||
description: str,
|
||||
) -> None:
|
||||
"""Attempt an explicit sign in via this adapter.
|
||||
|
||||
|
|
@ -151,6 +156,38 @@ class LoginAdapter:
|
|||
"""
|
||||
assert _ba.in_logic_thread()
|
||||
from ba._general import Call
|
||||
from ba._generated.enums import TimeType
|
||||
|
||||
# Have been seeing multiple sign-in attempts come through
|
||||
# nearly simultaneously which can be problematic server-side.
|
||||
# Let's error if a sign-in attempt is made within a few seconds
|
||||
# of the last one to address this.
|
||||
now = time.monotonic()
|
||||
appnow = _ba.time(TimeType.REAL)
|
||||
if self._last_sign_in_time is not None:
|
||||
since_last = now - self._last_sign_in_time
|
||||
if since_last < 1.0:
|
||||
logging.warning(
|
||||
'LoginAdapter: %s adapter sign_in() called too soon'
|
||||
' (%.2fs) after last; this-desc="%s", last-desc="%s",'
|
||||
' ba-real-time=%.2f.',
|
||||
self.login_type.name,
|
||||
since_last,
|
||||
description,
|
||||
self._last_sign_in_desc,
|
||||
appnow,
|
||||
)
|
||||
_ba.pushcall(
|
||||
Call(
|
||||
result_cb,
|
||||
self,
|
||||
RuntimeError('sign_in called too soon after last.'),
|
||||
)
|
||||
)
|
||||
return
|
||||
|
||||
self._last_sign_in_desc = description
|
||||
self._last_sign_in_time = now
|
||||
|
||||
if DEBUG_LOG:
|
||||
logging.debug(
|
||||
|
|
@ -223,7 +260,12 @@ class LoginAdapter:
|
|||
_ba.pushcall(Call(result_cb, self, result2))
|
||||
|
||||
_ba.app.cloud.send_message_cb(
|
||||
bacommon.cloud.SignInMessage(self.login_type, result),
|
||||
bacommon.cloud.SignInMessage(
|
||||
self.login_type,
|
||||
result,
|
||||
description=description,
|
||||
apptime=appnow,
|
||||
),
|
||||
on_response=_got_sign_in_response,
|
||||
)
|
||||
|
||||
|
|
|
|||
16
dist/ba_data/python/ba/_playlist.py
vendored
16
dist/ba_data/python/ba/_playlist.py
vendored
|
|
@ -9,6 +9,8 @@ import copy
|
|||
import logging
|
||||
from typing import Any, TYPE_CHECKING
|
||||
|
||||
import _ba
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from typing import Sequence
|
||||
from ba import _session
|
||||
|
|
@ -34,6 +36,7 @@ def filter_playlist(
|
|||
# pylint: disable=too-many-branches
|
||||
# pylint: disable=too-many-statements
|
||||
from ba._map import get_filtered_map_name
|
||||
from ba._error import MapNotFoundError
|
||||
from ba._store import get_unowned_maps, get_unowned_game_types
|
||||
from ba._general import getclass
|
||||
from ba._gameactivity import GameActivity
|
||||
|
|
@ -160,7 +163,7 @@ def filter_playlist(
|
|||
gameclass = getclass(entry['type'], GameActivity)
|
||||
|
||||
if entry['settings']['map'] not in available_maps:
|
||||
raise ImportError(f"Map not found: '{entry['settings']['map']}'")
|
||||
raise MapNotFoundError()
|
||||
|
||||
if remove_unowned and gameclass in unowned_game_types:
|
||||
continue
|
||||
|
|
@ -176,15 +179,22 @@ def filter_playlist(
|
|||
for setting in neededsettings:
|
||||
if setting.name not in entry['settings']:
|
||||
entry['settings'][setting.name] = setting.default
|
||||
|
||||
goodlist.append(entry)
|
||||
|
||||
except MapNotFoundError:
|
||||
logging.warning(
|
||||
'Map \'%s\' not found while scanning playlist \'%s\'.',
|
||||
name,
|
||||
entry['settings']['map'],
|
||||
)
|
||||
except ImportError as exc:
|
||||
logging.warning(
|
||||
'Import failed while scanning playlist \'%s\': %s', name, exc
|
||||
)
|
||||
except Exception:
|
||||
from ba import _error
|
||||
logging.exception('Error in filter_playlist.')
|
||||
|
||||
_error.print_exception()
|
||||
return goodlist
|
||||
|
||||
|
||||
|
|
|
|||
10
dist/ba_data/python/ba/_plugin.py
vendored
10
dist/ba_data/python/ba/_plugin.py
vendored
|
|
@ -22,6 +22,9 @@ class PluginSubsystem:
|
|||
Access the single shared instance of this class at `ba.app.plugins`.
|
||||
"""
|
||||
|
||||
AUTO_ENABLE_NEW_PLUGINS_CONFIG_KEY = 'Auto Enable New Plugins'
|
||||
AUTO_ENABLE_NEW_PLUGINS_DEFAULT = True
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.potential_plugins: list[ba.PotentialPlugin] = []
|
||||
self.active_plugins: dict[str, ba.Plugin] = {}
|
||||
|
|
@ -48,6 +51,13 @@ class PluginSubsystem:
|
|||
available=True,
|
||||
)
|
||||
)
|
||||
if (
|
||||
_ba.app.config.get(
|
||||
self.AUTO_ENABLE_NEW_PLUGINS_CONFIG_KEY,
|
||||
self.AUTO_ENABLE_NEW_PLUGINS_DEFAULT,
|
||||
)
|
||||
is True
|
||||
):
|
||||
if class_path not in plugstates:
|
||||
# Go ahead and enable new plugins by default, but we'll
|
||||
# inform the user that they need to restart to pick them up.
|
||||
|
|
|
|||
5
dist/ba_data/python/ba/macmusicapp.py
vendored
5
dist/ba_data/python/ba/macmusicapp.py
vendored
|
|
@ -4,6 +4,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import threading
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import _ba
|
||||
|
|
@ -68,7 +69,7 @@ class _MacMusicAppThread(threading.Thread):
|
|||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self._commands_available = threading.Event()
|
||||
self._commands: list[list] = []
|
||||
self._commands = deque[list]()
|
||||
self._volume = 1.0
|
||||
self._current_playlist: str | None = None
|
||||
self._orig_volume: int | None = None
|
||||
|
|
@ -109,7 +110,7 @@ class _MacMusicAppThread(threading.Thread):
|
|||
# We're not protecting this list with a mutex but we're
|
||||
# just using it as a simple queue so it should be fine.
|
||||
while self._commands:
|
||||
cmd = self._commands.pop(0)
|
||||
cmd = self._commands.popleft()
|
||||
if cmd[0] == 'DIE':
|
||||
self._handle_die_command()
|
||||
done = True
|
||||
|
|
|
|||
4
dist/ba_data/python/bacommon/cloud.py
vendored
4
dist/ba_data/python/bacommon/cloud.py
vendored
|
|
@ -183,6 +183,10 @@ class SignInMessage(Message):
|
|||
login_type: Annotated[LoginType, IOAttrs('l')]
|
||||
sign_in_token: Annotated[str, IOAttrs('t')]
|
||||
|
||||
# For debugging. Can remove soft_default once build 20988+ is ubiquitous.
|
||||
description: Annotated[str, IOAttrs('d', soft_default='-')]
|
||||
apptime: Annotated[float, IOAttrs('at', soft_default=-1.0)]
|
||||
|
||||
@classmethod
|
||||
def get_response_types(cls) -> list[type[Response] | None]:
|
||||
return [SignInResponse]
|
||||
|
|
|
|||
11
dist/ba_data/python/bastd/actor/spaz.py
vendored
11
dist/ba_data/python/bastd/actor/spaz.py
vendored
|
|
@ -88,12 +88,12 @@ class Spaz(ba.Actor):
|
|||
|
||||
self.play_big_death_sound = False
|
||||
|
||||
# scales how much impacts affect us (most damage calcs)
|
||||
# Scales how much impacts affect us (most damage calcs).
|
||||
self.impact_scale = 1.0
|
||||
|
||||
self.source_player = source_player
|
||||
self._dead = False
|
||||
if self._demo_mode: # preserve old behavior
|
||||
if self._demo_mode: # Preserve old behavior.
|
||||
self._punch_power_scale = 1.2
|
||||
else:
|
||||
self._punch_power_scale = factory.punch_power_scale
|
||||
|
|
@ -180,6 +180,7 @@ class Spaz(ba.Actor):
|
|||
self._bomb_wear_off_flash_timer: ba.Timer | None = None
|
||||
self._multi_bomb_wear_off_timer: ba.Timer | None = None
|
||||
self._multi_bomb_wear_off_flash_timer: ba.Timer | None = None
|
||||
self._curse_timer: ba.Timer | None = None
|
||||
self.bomb_count = self.default_bomb_count
|
||||
self._max_bomb_count = self.default_bomb_count
|
||||
self.bomb_type_default = self.default_bomb_type
|
||||
|
|
@ -262,7 +263,7 @@ class Spaz(ba.Actor):
|
|||
def _turbo_filter_add_press(self, source: str) -> None:
|
||||
"""
|
||||
Can pass all button presses through here; if we see an obscene number
|
||||
of them in a short time let's shame/pushish this guy for using turbo
|
||||
of them in a short time let's shame/pushish this guy for using turbo.
|
||||
"""
|
||||
t_ms = ba.time(
|
||||
timetype=ba.TimeType.BASE, timeformat=ba.TimeFormat.MILLISECONDS
|
||||
|
|
@ -620,7 +621,9 @@ class Spaz(ba.Actor):
|
|||
self.node.curse_death_time = int(
|
||||
1000.0 * (tval + self.curse_time)
|
||||
)
|
||||
ba.timer(5.0, ba.WeakCall(self.curse_explode))
|
||||
self._curse_timer = ba.Timer(
|
||||
5.0, ba.WeakCall(self.curse_explode)
|
||||
)
|
||||
|
||||
def equip_boxing_gloves(self) -> None:
|
||||
"""
|
||||
|
|
|
|||
2
dist/ba_data/python/bastd/mainmenu.py
vendored
2
dist/ba_data/python/bastd/mainmenu.py
vendored
|
|
@ -63,7 +63,7 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]):
|
|||
'scale': scale,
|
||||
'position': (0, 10),
|
||||
'vr_depth': -10,
|
||||
'text': '\xa9 2011-2022 Eric Froemling',
|
||||
'text': '\xa9 2011-2023 Eric Froemling',
|
||||
},
|
||||
)
|
||||
)
|
||||
|
|
|
|||
57
dist/ba_data/python/bastd/tutorial.py
vendored
57
dist/ba_data/python/bastd/tutorial.py
vendored
|
|
@ -16,6 +16,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import ba
|
||||
|
|
@ -235,7 +236,7 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
self.control_ui_nodes: list[ba.Node] = []
|
||||
self.spazzes: dict[int, basespaz.Spaz] = {}
|
||||
self.jump_image_color = (1.0, 1.0, 1.0)
|
||||
self._entries: list[Any] = []
|
||||
self._entries: deque[Any] = deque()
|
||||
self._read_entries_timer: ba.Timer | None = None
|
||||
self._entry_timer: ba.Timer | None = None
|
||||
|
||||
|
|
@ -856,18 +857,23 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
'invalid celebrate type ' + self._celebrate_type
|
||||
)
|
||||
|
||||
self._entries = [
|
||||
self._entries = deque(
|
||||
[
|
||||
Reset(),
|
||||
SpawnSpaz(0, (0, 5.5, -3.0), make_current=True),
|
||||
DelayOld(1000),
|
||||
AnalyticsScreen('Tutorial Section 1'),
|
||||
Text(ba.Lstr(resource=self._r + '.phrase01Text')), # hi there
|
||||
Text(
|
||||
ba.Lstr(resource=self._r + '.phrase01Text')
|
||||
), # hi there
|
||||
Celebrate('left'),
|
||||
DelayOld(2000),
|
||||
Text(
|
||||
ba.Lstr(
|
||||
resource=self._r + '.phrase02Text',
|
||||
subs=[('${APP_NAME}', ba.Lstr(resource='titleText'))],
|
||||
subs=[
|
||||
('${APP_NAME}', ba.Lstr(resource='titleText'))
|
||||
],
|
||||
)
|
||||
), # welcome to <appname>
|
||||
DelayOld(80),
|
||||
|
|
@ -907,7 +913,9 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
Text(
|
||||
ba.Lstr(
|
||||
resource=self._r + '.phrase04Text',
|
||||
subs=[('${APP_NAME}', ba.Lstr(resource='titleText'))],
|
||||
subs=[
|
||||
('${APP_NAME}', ba.Lstr(resource='titleText'))
|
||||
],
|
||||
)
|
||||
), # many things are based on physics
|
||||
DelayOld(20),
|
||||
|
|
@ -1312,7 +1320,9 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
subs=[
|
||||
(
|
||||
'${NAME}',
|
||||
ba.Lstr(resource=self._r + '.randomName1Text'),
|
||||
ba.Lstr(
|
||||
resource=self._r + '.randomName1Text'
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
|
|
@ -1530,7 +1540,9 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
ba.Lstr(resource=self._r + '.phrase10Text')
|
||||
), # running also helps
|
||||
DelayOld(100),
|
||||
SpawnSpaz(0, (-3.2, 4.3, -4.4), make_current=True, flash=False),
|
||||
SpawnSpaz(
|
||||
0, (-3.2, 4.3, -4.4), make_current=True, flash=False
|
||||
),
|
||||
SpawnSpaz(
|
||||
1,
|
||||
(3.3, 4.2, -5.8),
|
||||
|
|
@ -1802,7 +1814,11 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
DelayOld(200),
|
||||
SpawnSpaz(
|
||||
0,
|
||||
(2.368781805038452, 4.337533950805664, -4.360159873962402),
|
||||
(
|
||||
2.368781805038452,
|
||||
4.337533950805664,
|
||||
-4.360159873962402,
|
||||
),
|
||||
make_current=True,
|
||||
flash=False,
|
||||
),
|
||||
|
|
@ -2015,7 +2031,9 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
subs=[
|
||||
(
|
||||
'${NAME}',
|
||||
ba.Lstr(resource=self._r + '.randomName3Text'),
|
||||
ba.Lstr(
|
||||
resource=self._r + '.randomName3Text'
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
|
|
@ -2029,7 +2047,9 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
subs=[
|
||||
(
|
||||
'${NAME}',
|
||||
ba.Lstr(resource=self._r + '.randomName4Text'),
|
||||
ba.Lstr(
|
||||
resource=self._r + '.randomName4Text'
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
|
|
@ -2067,7 +2087,11 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
Move(0, 0),
|
||||
DelayOld(800),
|
||||
SpawnSpaz(
|
||||
0, (1.5, 4.3, -4.0), make_current=True, flash=False, angle=0
|
||||
0,
|
||||
(1.5, 4.3, -4.0),
|
||||
make_current=True,
|
||||
flash=False,
|
||||
angle=0,
|
||||
),
|
||||
AnalyticsScreen('Tutorial Section 6'),
|
||||
Text(
|
||||
|
|
@ -2375,14 +2399,19 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
ba.Lstr(resource=self._r + '.phrase27Text')
|
||||
), # remember you training
|
||||
DelayOld(3000),
|
||||
Text(ba.Lstr(resource=self._r + '.phrase28Text')), # well maybe
|
||||
Text(
|
||||
ba.Lstr(resource=self._r + '.phrase28Text')
|
||||
), # well maybe
|
||||
DelayOld(1600),
|
||||
Text(ba.Lstr(resource=self._r + '.phrase29Text')), # good luck
|
||||
Text(
|
||||
ba.Lstr(resource=self._r + '.phrase29Text')
|
||||
), # good luck
|
||||
Celebrate('right', duration=10000),
|
||||
DelayOld(1000),
|
||||
AnalyticsScreen('Tutorial Complete'),
|
||||
End(),
|
||||
]
|
||||
)
|
||||
|
||||
except Exception:
|
||||
ba.print_exception()
|
||||
|
|
@ -2399,7 +2428,7 @@ class TutorialActivity(ba.Activity[Player, Team]):
|
|||
def _run_next_entry(self) -> None:
|
||||
|
||||
while self._entries:
|
||||
entry = self._entries.pop(0)
|
||||
entry = self._entries.popleft()
|
||||
try:
|
||||
result = entry.run(self)
|
||||
except Exception:
|
||||
|
|
|
|||
|
|
@ -1403,7 +1403,8 @@ class AccountSettingsWindow(ba.Window):
|
|||
if adapter is not None:
|
||||
self._signing_in_adapter = adapter
|
||||
adapter.sign_in(
|
||||
result_cb=ba.WeakCall(self._on_adapter_sign_in_result)
|
||||
result_cb=ba.WeakCall(self._on_adapter_sign_in_result),
|
||||
description='account settings button',
|
||||
)
|
||||
# Will get 'Signing in...' to show.
|
||||
self._needs_refresh = True
|
||||
|
|
|
|||
|
|
@ -234,6 +234,7 @@ class ManualGatherTab(GatherTab):
|
|||
c_width = region_width
|
||||
c_height = region_height - 20
|
||||
last_addr = ba.app.config.get('Last Manual Party Connect Address', '')
|
||||
last_port = ba.app.config.get('Last Manual Party Connect Port', 43210)
|
||||
v = c_height - 70
|
||||
v -= 70
|
||||
ba.textwidget(
|
||||
|
|
@ -256,6 +257,7 @@ class ManualGatherTab(GatherTab):
|
|||
autoselect=True,
|
||||
v_align='center',
|
||||
scale=1.0,
|
||||
maxwidth=380,
|
||||
size=(420, 60),
|
||||
)
|
||||
ba.widget(edit=self._join_by_address_text, down_widget=txt)
|
||||
|
|
@ -275,7 +277,7 @@ class ManualGatherTab(GatherTab):
|
|||
parent=self._container,
|
||||
editable=True,
|
||||
description=ba.Lstr(resource='gatherWindow.' 'portText'),
|
||||
text='43210',
|
||||
text=str(last_port),
|
||||
autoselect=True,
|
||||
max_chars=5,
|
||||
position=(c_width * 0.5 - 240 + 490, v - 30),
|
||||
|
|
@ -811,6 +813,7 @@ class ManualGatherTab(GatherTab):
|
|||
# Store for later.
|
||||
config = ba.app.config
|
||||
config['Last Manual Party Connect Address'] = resolved_address
|
||||
config['Last Manual Party Connect Port'] = port
|
||||
config.commit()
|
||||
ba.internal.connect_to_party(resolved_address, port=port)
|
||||
|
||||
|
|
|
|||
|
|
@ -571,6 +571,7 @@ class PublicGatherTab(GatherTab):
|
|||
h_align='left',
|
||||
v_align='center',
|
||||
editable=True,
|
||||
maxwidth=310,
|
||||
description=filter_txt,
|
||||
)
|
||||
ba.widget(edit=self._filter_text, up_widget=self._join_text)
|
||||
|
|
|
|||
5
dist/ba_data/python/bastd/ui/party.py
vendored
5
dist/ba_data/python/bastd/ui/party.py
vendored
|
|
@ -211,9 +211,8 @@ class PartyWindow(ba.Window):
|
|||
flatness=1.0,
|
||||
)
|
||||
self._chat_texts.append(txt)
|
||||
if len(self._chat_texts) > 40:
|
||||
first = self._chat_texts.pop(0)
|
||||
first.delete()
|
||||
while len(self._chat_texts) > 40:
|
||||
self._chat_texts.pop(0).delete()
|
||||
ba.containerwidget(edit=self._columnwidget, visible_child=txt)
|
||||
|
||||
def _on_menu_button_press(self) -> None:
|
||||
|
|
|
|||
|
|
@ -473,7 +473,6 @@ class PlaylistEditGameWindow(ba.Window):
|
|||
|
||||
# Ok now wire up the column.
|
||||
try:
|
||||
# pylint: disable=unsubscriptable-object
|
||||
prev_widgets: list[ba.Widget] | None = None
|
||||
for cwdg in widget_column:
|
||||
if prev_widgets is not None:
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
parent=self._root_widget,
|
||||
position=(0, self._height - 52),
|
||||
size=(self._width, 25),
|
||||
text=ba.Lstr(resource=self._r + '.titleText'),
|
||||
text=ba.Lstr(resource=f'{self._r}.titleText'),
|
||||
color=app.ui.title_color,
|
||||
h_align='center',
|
||||
v_align='top',
|
||||
|
|
@ -203,10 +203,10 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
text=''
|
||||
if ba.app.lang.language == 'Test'
|
||||
else ba.Lstr(
|
||||
resource=self._r + '.translationNoUpdateNeededText'
|
||||
resource=f'{self._r}.translationNoUpdateNeededText'
|
||||
)
|
||||
if up_to_date
|
||||
else ba.Lstr(resource=self._r + '.translationUpdateNeededText'),
|
||||
else ba.Lstr(resource=f'{self._r}.translationUpdateNeededText'),
|
||||
color=(0.2, 1.0, 0.2, 0.8)
|
||||
if up_to_date
|
||||
else (1.0, 0.2, 0.2, 0.8),
|
||||
|
|
@ -214,10 +214,10 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
else:
|
||||
ba.textwidget(
|
||||
edit=self._lang_status_text,
|
||||
text=ba.Lstr(resource=self._r + '.translationFetchErrorText')
|
||||
text=ba.Lstr(resource=f'{self._r}.translationFetchErrorText')
|
||||
if self._complete_langs_error
|
||||
else ba.Lstr(
|
||||
resource=self._r + '.translationFetchingStatusText'
|
||||
resource=f'{self._r}.translationFetchingStatusText'
|
||||
),
|
||||
color=(1.0, 0.5, 0.2)
|
||||
if self._complete_langs_error
|
||||
|
|
@ -267,7 +267,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
)
|
||||
|
||||
ba.textwidget(
|
||||
edit=self._title_text, text=ba.Lstr(resource=self._r + '.titleText')
|
||||
edit=self._title_text, text=ba.Lstr(resource=f'{self._r}.titleText')
|
||||
)
|
||||
|
||||
this_button_width = 410
|
||||
|
|
@ -277,7 +277,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 14),
|
||||
size=(this_button_width, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource=self._r + '.enterPromoCodeText'),
|
||||
label=ba.Lstr(resource=f'{self._r}.enterPromoCodeText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=self._on_promo_code_press,
|
||||
)
|
||||
|
|
@ -293,7 +293,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
parent=self._subcontainer,
|
||||
position=(200, v + 10),
|
||||
size=(0, 0),
|
||||
text=ba.Lstr(resource=self._r + '.languageText'),
|
||||
text=ba.Lstr(resource=f'{self._r}.languageText'),
|
||||
maxwidth=150,
|
||||
scale=0.95,
|
||||
color=ba.app.ui.title_color,
|
||||
|
|
@ -371,7 +371,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width * 0.5, v + 10),
|
||||
size=(0, 0),
|
||||
text=ba.Lstr(
|
||||
resource=self._r + '.helpTranslateText',
|
||||
resource=f'{self._r}.helpTranslateText',
|
||||
subs=[('${APP_NAME}', ba.Lstr(resource='titleText'))],
|
||||
),
|
||||
maxwidth=self._sub_width * 0.9,
|
||||
|
|
@ -389,7 +389,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 24),
|
||||
size=(this_button_width, 60),
|
||||
label=ba.Lstr(
|
||||
resource=self._r + '.translationEditorButtonText',
|
||||
resource=f'{self._r}.translationEditorButtonText',
|
||||
subs=[('${APP_NAME}', ba.Lstr(resource='titleText'))],
|
||||
),
|
||||
autoselect=True,
|
||||
|
|
@ -422,7 +422,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
maxwidth=430,
|
||||
textcolor=(0.8, 0.8, 0.8),
|
||||
value=lang_inform,
|
||||
text=ba.Lstr(resource=self._r + '.translationInformMe'),
|
||||
text=ba.Lstr(resource=f'{self._r}.translationInformMe'),
|
||||
on_value_change_call=ba.WeakCall(self._on_lang_inform_value_change),
|
||||
)
|
||||
|
||||
|
|
@ -439,7 +439,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(50, v),
|
||||
size=(self._sub_width - 100, 30),
|
||||
configkey='Kick Idle Players',
|
||||
displayname=ba.Lstr(resource=self._r + '.kickIdlePlayersText'),
|
||||
displayname=ba.Lstr(resource=f'{self._r}.kickIdlePlayersText'),
|
||||
scale=1.0,
|
||||
maxwidth=430,
|
||||
)
|
||||
|
|
@ -450,7 +450,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(50, v),
|
||||
size=(self._sub_width - 100, 30),
|
||||
configkey='Show Ping',
|
||||
displayname=ba.Lstr(value='Show InGame Ping'),
|
||||
displayname=ba.Lstr(resource=f'{self._r}.showInGamePingText'),
|
||||
scale=1.0,
|
||||
maxwidth=430,
|
||||
)
|
||||
|
|
@ -461,7 +461,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(50, v),
|
||||
size=(self._sub_width - 100, 30),
|
||||
configkey='Disable Camera Shake',
|
||||
displayname=ba.Lstr(resource=self._r + '.disableCameraShakeText'),
|
||||
displayname=ba.Lstr(resource=f'{self._r}.disableCameraShakeText'),
|
||||
scale=1.0,
|
||||
maxwidth=430,
|
||||
)
|
||||
|
|
@ -475,7 +475,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
size=(self._sub_width - 100, 30),
|
||||
configkey='Disable Camera Gyro',
|
||||
displayname=ba.Lstr(
|
||||
resource=self._r + '.disableCameraGyroscopeMotionText'
|
||||
resource=f'{self._r}.disableCameraGyroscopeMotionText'
|
||||
),
|
||||
scale=1.0,
|
||||
maxwidth=430,
|
||||
|
|
@ -491,7 +491,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
configkey='Always Use Internal Keyboard',
|
||||
autoselect=True,
|
||||
displayname=ba.Lstr(
|
||||
resource=self._r + '.alwaysUseInternalKeyboardText'
|
||||
resource=f'{self._r}.alwaysUseInternalKeyboardText'
|
||||
),
|
||||
scale=1.0,
|
||||
maxwidth=430,
|
||||
|
|
@ -501,8 +501,9 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(90, v - 10),
|
||||
size=(0, 0),
|
||||
text=ba.Lstr(
|
||||
resource=self._r
|
||||
+ '.alwaysUseInternalKeyboardDescriptionText'
|
||||
resource=(
|
||||
f'{self._r}.alwaysUseInternalKeyboardDescriptionText'
|
||||
)
|
||||
),
|
||||
maxwidth=400,
|
||||
flatness=1.0,
|
||||
|
|
@ -523,7 +524,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 10),
|
||||
size=(this_button_width, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource=self._r + '.moddingGuideText'),
|
||||
label=ba.Lstr(resource=f'{self._r}.moddingGuideText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=ba.Call(
|
||||
ba.open_url, 'https://ballistica.net/wiki/modding-guide'
|
||||
|
|
@ -556,7 +557,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 10),
|
||||
size=(this_button_width, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource=self._r + '.showUserModsText'),
|
||||
label=ba.Lstr(resource=f'{self._r}.showUserModsText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=show_user_scripts,
|
||||
)
|
||||
|
|
@ -583,7 +584,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 14),
|
||||
size=(this_button_width, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource=self._r + '.vrTestingText'),
|
||||
label=ba.Lstr(resource=f'{self._r}.vrTestingText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=self._on_vr_test_press,
|
||||
)
|
||||
|
|
@ -598,7 +599,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 14),
|
||||
size=(this_button_width, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource=self._r + '.netTestingText'),
|
||||
label=ba.Lstr(resource=f'{self._r}.netTestingText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=self._on_net_test_press,
|
||||
)
|
||||
|
|
@ -611,7 +612,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
position=(self._sub_width / 2 - this_button_width / 2, v - 14),
|
||||
size=(this_button_width, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource=self._r + '.benchmarksText'),
|
||||
label=ba.Lstr(resource=f'{self._r}.benchmarksText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=self._on_benchmark_press,
|
||||
)
|
||||
|
|
@ -633,7 +634,7 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
def _show_restart_needed(self, value: Any) -> None:
|
||||
del value # Unused.
|
||||
ba.screenmessage(
|
||||
ba.Lstr(resource=self._r + '.mustRestartText'), color=(1, 1, 0)
|
||||
ba.Lstr(resource=f'{self._r}.mustRestartText'), color=(1, 1, 0)
|
||||
)
|
||||
|
||||
def _on_lang_inform_value_change(self, val: bool) -> None:
|
||||
|
|
@ -678,14 +679,12 @@ class AdvancedSettingsWindow(ba.Window):
|
|||
appinvite.handle_app_invites_press()
|
||||
|
||||
def _on_plugins_button_press(self) -> None:
|
||||
from bastd.ui.settings.plugins import PluginSettingsWindow
|
||||
from bastd.ui.settings.plugins import PluginWindow
|
||||
|
||||
self._save_state()
|
||||
ba.containerwidget(edit=self._root_widget, transition='out_left')
|
||||
ba.app.ui.set_main_menu_window(
|
||||
PluginSettingsWindow(
|
||||
origin_widget=self._plugins_button
|
||||
).get_root_widget()
|
||||
PluginWindow(origin_widget=self._plugins_button).get_root_widget()
|
||||
)
|
||||
|
||||
def _on_promo_code_press(self) -> None:
|
||||
|
|
|
|||
37
dist/ba_data/python/bastd/ui/settings/plugins.py
vendored
37
dist/ba_data/python/bastd/ui/settings/plugins.py
vendored
|
|
@ -1,6 +1,6 @@
|
|||
# Released under the MIT License. See LICENSE for details.
|
||||
#
|
||||
"""Plugin settings UI."""
|
||||
"""Plugin Window UI."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
|
|
@ -12,7 +12,7 @@ if TYPE_CHECKING:
|
|||
pass
|
||||
|
||||
|
||||
class PluginSettingsWindow(ba.Window):
|
||||
class PluginWindow(ba.Window):
|
||||
"""Window for configuring plugins."""
|
||||
|
||||
def __init__(
|
||||
|
|
@ -106,6 +106,27 @@ class PluginSettingsWindow(ba.Window):
|
|||
size=(60, 60),
|
||||
label=ba.charstr(ba.SpecialChar.BACK),
|
||||
)
|
||||
settings_button_x = 670 if uiscale is ba.UIScale.SMALL else 570
|
||||
self._settings_button = ba.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(settings_button_x, self._height - 60),
|
||||
size=(40, 40),
|
||||
label='',
|
||||
on_activate_call=self._open_settings,
|
||||
)
|
||||
|
||||
ba.imagewidget(
|
||||
parent=self._root_widget,
|
||||
position=(settings_button_x + 3, self._height - 60),
|
||||
size=(35, 35),
|
||||
texture=ba.gettexture('settingsIcon'),
|
||||
)
|
||||
|
||||
ba.widget(
|
||||
edit=self._settings_button,
|
||||
up_widget=self._settings_button,
|
||||
right_widget=self._settings_button,
|
||||
)
|
||||
|
||||
self._scrollwidget = ba.scrollwidget(
|
||||
parent=self._root_widget,
|
||||
|
|
@ -185,6 +206,7 @@ class PluginSettingsWindow(ba.Window):
|
|||
edit=check,
|
||||
up_widget=self._back_button,
|
||||
left_widget=self._back_button,
|
||||
right_widget=self._settings_button,
|
||||
)
|
||||
if button is not None:
|
||||
ba.widget(edit=button, up_widget=self._back_button)
|
||||
|
|
@ -212,6 +234,17 @@ class PluginSettingsWindow(ba.Window):
|
|||
plugstate['enabled'] = value
|
||||
ba.app.config.commit()
|
||||
|
||||
def _open_settings(self) -> None:
|
||||
# pylint: disable=cyclic-import
|
||||
from bastd.ui.settings.pluginsettings import PluginSettingsWindow
|
||||
|
||||
ba.playsound(ba.getsound('swish'))
|
||||
|
||||
ba.containerwidget(edit=self._root_widget, transition='out_left')
|
||||
ba.app.ui.set_main_menu_window(
|
||||
PluginSettingsWindow(transition='in_right').get_root_widget()
|
||||
)
|
||||
|
||||
def _save_state(self) -> None:
|
||||
pass
|
||||
|
||||
|
|
|
|||
174
dist/ba_data/python/bastd/ui/settings/pluginsettings.py
vendored
Normal file
174
dist/ba_data/python/bastd/ui/settings/pluginsettings.py
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
# Released under the MIT License. See LICENSE for details.
|
||||
#
|
||||
"""Plugin Settings UI."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import ba
|
||||
from bastd.ui.confirm import ConfirmWindow
|
||||
|
||||
if TYPE_CHECKING:
|
||||
pass
|
||||
|
||||
|
||||
class PluginSettingsWindow(ba.Window):
|
||||
"""Plugin Settings Window"""
|
||||
|
||||
def __init__(self, transition: str = 'in_right'):
|
||||
|
||||
scale_origin: tuple[float, float] | None
|
||||
self._transition_out = 'out_right'
|
||||
scale_origin = None
|
||||
|
||||
uiscale = ba.app.ui.uiscale
|
||||
width = 470.0 if uiscale is ba.UIScale.SMALL else 470.0
|
||||
height = (
|
||||
365.0
|
||||
if uiscale is ba.UIScale.SMALL
|
||||
else 300.0
|
||||
if uiscale is ba.UIScale.MEDIUM
|
||||
else 370.0
|
||||
)
|
||||
top_extra = 10 if uiscale is ba.UIScale.SMALL else 0
|
||||
|
||||
super().__init__(
|
||||
root_widget=ba.containerwidget(
|
||||
size=(width, height + top_extra),
|
||||
transition=transition,
|
||||
toolbar_visibility='menu_minimal',
|
||||
scale_origin_stack_offset=scale_origin,
|
||||
scale=(
|
||||
2.06
|
||||
if uiscale is ba.UIScale.SMALL
|
||||
else 1.4
|
||||
if uiscale is ba.UIScale.MEDIUM
|
||||
else 1.0
|
||||
),
|
||||
stack_offset=(0, -25)
|
||||
if uiscale is ba.UIScale.SMALL
|
||||
else (0, 0),
|
||||
)
|
||||
)
|
||||
|
||||
self._back_button = ba.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(53, height - 60),
|
||||
size=(60, 60),
|
||||
scale=0.8,
|
||||
autoselect=True,
|
||||
label=ba.charstr(ba.SpecialChar.BACK),
|
||||
button_type='backSmall',
|
||||
on_activate_call=self._do_back,
|
||||
)
|
||||
ba.containerwidget(
|
||||
edit=self._root_widget, cancel_button=self._back_button
|
||||
)
|
||||
|
||||
self._title_text = ba.textwidget(
|
||||
parent=self._root_widget,
|
||||
position=(0, height - 52),
|
||||
size=(width, 25),
|
||||
text=ba.Lstr(resource='pluginSettingsText'),
|
||||
color=ba.app.ui.title_color,
|
||||
h_align='center',
|
||||
v_align='top',
|
||||
)
|
||||
|
||||
self._y_position = 170 if uiscale is ba.UIScale.MEDIUM else 205
|
||||
self._enable_plugins_button = ba.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(65, self._y_position),
|
||||
size=(350, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource='pluginsEnableAllText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=lambda: ConfirmWindow(
|
||||
action=self._enable_all_plugins,
|
||||
),
|
||||
)
|
||||
|
||||
self._y_position -= 70
|
||||
self._disable_plugins_button = ba.buttonwidget(
|
||||
parent=self._root_widget,
|
||||
position=(65, self._y_position),
|
||||
size=(350, 60),
|
||||
autoselect=True,
|
||||
label=ba.Lstr(resource='pluginsDisableAllText'),
|
||||
text_scale=1.0,
|
||||
on_activate_call=lambda: ConfirmWindow(
|
||||
action=self._disable_all_plugins,
|
||||
),
|
||||
)
|
||||
|
||||
self._y_position -= 70
|
||||
self._enable_new_plugins_check_box = ba.checkboxwidget(
|
||||
parent=self._root_widget,
|
||||
position=(65, self._y_position),
|
||||
size=(350, 60),
|
||||
value=ba.app.config.get(
|
||||
ba.app.plugins.AUTO_ENABLE_NEW_PLUGINS_CONFIG_KEY,
|
||||
ba.app.plugins.AUTO_ENABLE_NEW_PLUGINS_DEFAULT,
|
||||
),
|
||||
text=ba.Lstr(resource='pluginsAutoEnableNewText'),
|
||||
scale=1.0,
|
||||
maxwidth=308,
|
||||
on_value_change_call=self._update_value,
|
||||
)
|
||||
|
||||
ba.widget(
|
||||
edit=self._back_button, down_widget=self._enable_plugins_button
|
||||
)
|
||||
|
||||
ba.widget(
|
||||
edit=self._disable_plugins_button,
|
||||
left_widget=self._disable_plugins_button,
|
||||
)
|
||||
|
||||
ba.widget(
|
||||
edit=self._enable_new_plugins_check_box,
|
||||
left_widget=self._enable_new_plugins_check_box,
|
||||
right_widget=self._enable_new_plugins_check_box,
|
||||
down_widget=self._enable_new_plugins_check_box,
|
||||
)
|
||||
|
||||
def _enable_all_plugins(self) -> None:
|
||||
cfg = ba.app.config
|
||||
plugs: dict[str, dict] = cfg.setdefault('Plugins', {})
|
||||
for plug in plugs.values():
|
||||
plug['enabled'] = True
|
||||
cfg.apply_and_commit()
|
||||
|
||||
ba.screenmessage(
|
||||
ba.Lstr(resource='settingsWindowAdvanced.mustRestartText'),
|
||||
color=(1.0, 0.5, 0.0),
|
||||
)
|
||||
|
||||
def _disable_all_plugins(self) -> None:
|
||||
cfg = ba.app.config
|
||||
plugs: dict[str, dict] = cfg.setdefault('Plugins', {})
|
||||
for plug in plugs.values():
|
||||
plug['enabled'] = False
|
||||
cfg.apply_and_commit()
|
||||
|
||||
ba.screenmessage(
|
||||
ba.Lstr(resource='settingsWindowAdvanced.mustRestartText'),
|
||||
color=(1.0, 0.5, 0.0),
|
||||
)
|
||||
|
||||
def _update_value(self, val: bool) -> None:
|
||||
cfg = ba.app.config
|
||||
cfg[ba.app.plugins.AUTO_ENABLE_NEW_PLUGINS_CONFIG_KEY] = val
|
||||
cfg.apply_and_commit()
|
||||
|
||||
def _do_back(self) -> None:
|
||||
# pylint: disable=cyclic-import
|
||||
from bastd.ui.settings.plugins import PluginWindow
|
||||
|
||||
ba.containerwidget(
|
||||
edit=self._root_widget, transition=self._transition_out
|
||||
)
|
||||
ba.app.ui.set_main_menu_window(
|
||||
PluginWindow(transition='in_left').get_root_widget()
|
||||
)
|
||||
|
|
@ -1155,7 +1155,6 @@ class StoreBrowserWindow(ba.Window):
|
|||
# Wire this button to the equivalent in the
|
||||
# previous row.
|
||||
if prev_row_buttons is not None:
|
||||
# pylint: disable=unsubscriptable-object
|
||||
if len(prev_row_buttons) > col:
|
||||
ba.widget(
|
||||
edit=btn,
|
||||
|
|
|
|||
49
dist/ba_data/python/efro/cloudshell.py
vendored
Normal file
49
dist/ba_data/python/efro/cloudshell.py
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
# Released under the MIT License. See LICENSE for details.
|
||||
#
|
||||
"""My nifty ssh/mosh/rsync mishmash."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from enum import Enum
|
||||
from dataclasses import dataclass
|
||||
|
||||
from efro.dataclassio import ioprepped
|
||||
|
||||
|
||||
class LockType(Enum):
|
||||
"""Types of locks that can be acquired on a host."""
|
||||
|
||||
HOST = 'host'
|
||||
WORKSPACE = 'workspace'
|
||||
PYCHARM = 'pycharm'
|
||||
CLION = 'clion'
|
||||
|
||||
|
||||
@ioprepped
|
||||
@dataclass
|
||||
class HostConfig:
|
||||
"""Config for a cloud machine to run commands on.
|
||||
|
||||
precommand, if set, will be run before the passed commands.
|
||||
Note that it is not run in interactive mode (when no command is given).
|
||||
"""
|
||||
|
||||
address: str | None = None
|
||||
user: str = 'ubuntu'
|
||||
port: int = 22
|
||||
mosh_port: int | None = None
|
||||
mosh_server_path: str | None = None
|
||||
mosh_shell: str = 'sh'
|
||||
workspaces_root: str = '/home/${USER}/cloudshell_workspaces'
|
||||
sync_perms: bool = True
|
||||
precommand: str | None = None
|
||||
managed: bool = False
|
||||
idle_minutes: int = 5
|
||||
can_sudo_reboot: bool = False
|
||||
max_sessions: int = 3
|
||||
reboot_wait_seconds: int = 20
|
||||
reboot_attempts: int = 1
|
||||
|
||||
def resolved_workspaces_root(self) -> str:
|
||||
"""Returns workspaces_root with standard substitutions."""
|
||||
return self.workspaces_root.replace('${USER}', self.user)
|
||||
158
dist/ba_data/python/efro/log.py
vendored
158
dist/ba_data/python/efro/log.py
vendored
|
|
@ -8,7 +8,9 @@ import time
|
|||
import asyncio
|
||||
import logging
|
||||
import datetime
|
||||
import itertools
|
||||
from enum import Enum
|
||||
from collections import deque
|
||||
from dataclasses import dataclass
|
||||
from typing import TYPE_CHECKING, Annotated
|
||||
from threading import Thread, current_thread, Lock
|
||||
|
|
@ -143,12 +145,14 @@ class LogHandler(logging.Handler):
|
|||
assert cache_size_limit >= 0
|
||||
self._cache_size_limit = cache_size_limit
|
||||
self._cache_time_limit = cache_time_limit
|
||||
self._cache: list[tuple[int, LogEntry]] = []
|
||||
self._cache = deque[tuple[int, LogEntry]]()
|
||||
self._cache_index_offset = 0
|
||||
self._cache_lock = Lock()
|
||||
self._printed_callback_error = False
|
||||
self._thread_bootstrapped = False
|
||||
self._thread = Thread(target=self._log_thread_main, daemon=True)
|
||||
if __debug__:
|
||||
self._last_slow_emit_warning_time: float | None = None
|
||||
self._thread.start()
|
||||
|
||||
# Spin until our thread is up and running; otherwise we could
|
||||
|
|
@ -167,6 +171,12 @@ class LogHandler(logging.Handler):
|
|||
|
||||
def _log_thread_main(self) -> None:
|
||||
self._event_loop = asyncio.new_event_loop()
|
||||
|
||||
# In our background thread event loop we do a fair amount of
|
||||
# slow synchronous stuff such as mucking with the log cache.
|
||||
# Let's avoid getting tons of warnings about this in debug mode.
|
||||
self._event_loop.slow_callback_duration = 2.0 # Default is 0.1
|
||||
|
||||
# NOTE: if we ever use default threadpool at all we should allow
|
||||
# setting it for our loop.
|
||||
asyncio.set_event_loop(self._event_loop)
|
||||
|
|
@ -192,20 +202,15 @@ class LogHandler(logging.Handler):
|
|||
now = utc_now()
|
||||
with self._cache_lock:
|
||||
|
||||
# Quick out: if oldest cache entry is still valid,
|
||||
# don't touch anything.
|
||||
if (
|
||||
# Prune the oldest entry as long as there is a first one that
|
||||
# is too old.
|
||||
while (
|
||||
self._cache
|
||||
and (now - self._cache[0][1].time) < self._cache_time_limit
|
||||
and (now - self._cache[0][1].time) >= self._cache_time_limit
|
||||
):
|
||||
continue
|
||||
|
||||
# Ok; full prune.
|
||||
self._cache = [
|
||||
e
|
||||
for e in self._cache
|
||||
if (now - e[1].time) < self._cache_time_limit
|
||||
]
|
||||
popped = self._cache.popleft()
|
||||
self._cache_size -= popped[0]
|
||||
self._cache_index_offset += 1
|
||||
|
||||
def get_cached(
|
||||
self, start_index: int = 0, max_entries: int | None = None
|
||||
|
|
@ -239,19 +244,40 @@ class LogHandler(logging.Handler):
|
|||
return LogArchive(
|
||||
log_size=self._cache_index_offset + len(self._cache),
|
||||
start_index=start_index + self._cache_index_offset,
|
||||
entries=[e[1] for e in self._cache[start_index:end_index]],
|
||||
entries=self._cache_slice(start_index, end_index),
|
||||
)
|
||||
|
||||
def emit(self, record: logging.LogRecord) -> None:
|
||||
# Called by logging to send us records.
|
||||
# We simply package them up and ship them to our thread.
|
||||
# UPDATE: turns out we CAN get log messages from this thread
|
||||
# (the C++ layer can spit out some performance metrics when
|
||||
# calls take too long/etc.)
|
||||
# assert current_thread() is not self._thread
|
||||
def _cache_slice(
|
||||
self, start: int, end: int, step: int = 1
|
||||
) -> list[LogEntry]:
|
||||
# Deque doesn't natively support slicing but we can do it manually.
|
||||
# It sounds like rotating the deque and pulling from the beginning
|
||||
# is the most efficient way to do this. The downside is the deque
|
||||
# gets temporarily modified in the process so we need to make sure
|
||||
# we're holding the lock.
|
||||
assert self._cache_lock.locked()
|
||||
cache = self._cache
|
||||
cache.rotate(-start)
|
||||
slc = [e[1] for e in itertools.islice(cache, 0, end - start, step)]
|
||||
cache.rotate(start)
|
||||
return slc
|
||||
|
||||
# Special case - filter out this common extra-chatty category.
|
||||
# TODO - should use a standard logging.Filter for this.
|
||||
@classmethod
|
||||
def _is_immutable_log_data(cls, data: Any) -> bool:
|
||||
if isinstance(data, (str, bool, int, float, bytes)):
|
||||
return True
|
||||
if isinstance(data, tuple):
|
||||
return all(cls._is_immutable_log_data(x) for x in data)
|
||||
return False
|
||||
|
||||
def emit(self, record: logging.LogRecord) -> None:
|
||||
if __debug__:
|
||||
starttime = time.monotonic()
|
||||
|
||||
# Called by logging to send us records.
|
||||
|
||||
# Special case: filter out this common extra-chatty category.
|
||||
# TODO - perhaps should use a standard logging.Filter for this.
|
||||
if (
|
||||
self._suppress_non_root_debug
|
||||
and record.name != 'root'
|
||||
|
|
@ -259,13 +285,36 @@ class LogHandler(logging.Handler):
|
|||
):
|
||||
return
|
||||
|
||||
# We want to forward as much as we can along without processing it
|
||||
# (better to do so in a bg thread).
|
||||
# However its probably best to flatten the message string here since
|
||||
# it could cause problems stringifying things in threads where they
|
||||
# didn't expect to be stringified.
|
||||
# Optimization: if our log args are all simple immutable values,
|
||||
# we can just kick the whole thing over to our background thread to
|
||||
# be formatted there at our leisure. If anything is mutable and
|
||||
# thus could possibly change between now and then or if we want
|
||||
# to do immediate file echoing then we need to bite the bullet
|
||||
# and do that stuff here at the call site.
|
||||
fast_path = self._echofile is None and self._is_immutable_log_data(
|
||||
record.args
|
||||
)
|
||||
|
||||
if fast_path:
|
||||
if __debug__:
|
||||
formattime = echotime = time.monotonic()
|
||||
self._event_loop.call_soon_threadsafe(
|
||||
tpartial(
|
||||
self._emit_in_thread,
|
||||
record.name,
|
||||
record.levelno,
|
||||
record.created,
|
||||
record,
|
||||
)
|
||||
)
|
||||
else:
|
||||
# Slow case; do formatting and echoing here at the log call
|
||||
# site.
|
||||
msg = self.format(record)
|
||||
|
||||
if __debug__:
|
||||
formattime = time.monotonic()
|
||||
|
||||
# Also immediately print pretty colored output to our echo file
|
||||
# (generally stderr). We do this part here instead of in our bg
|
||||
# thread because the delay can throw off command line prompts or
|
||||
|
|
@ -277,6 +326,9 @@ class LogHandler(logging.Handler):
|
|||
else:
|
||||
self._echofile.write(f'{msg}\n')
|
||||
|
||||
if __debug__:
|
||||
echotime = time.monotonic()
|
||||
|
||||
self._event_loop.call_soon_threadsafe(
|
||||
tpartial(
|
||||
self._emit_in_thread,
|
||||
|
|
@ -287,10 +339,52 @@ class LogHandler(logging.Handler):
|
|||
)
|
||||
)
|
||||
|
||||
if __debug__:
|
||||
# Make noise if we're taking a significant amount of time here.
|
||||
# Limit the noise to once every so often though; otherwise we
|
||||
# could get a feedback loop where every log emit results in a
|
||||
# warning log which results in another, etc.
|
||||
now = time.monotonic()
|
||||
# noinspection PyUnboundLocalVariable
|
||||
duration = now - starttime
|
||||
# noinspection PyUnboundLocalVariable
|
||||
format_duration = formattime - starttime
|
||||
# noinspection PyUnboundLocalVariable
|
||||
echo_duration = echotime - formattime
|
||||
if duration > 0.05 and (
|
||||
self._last_slow_emit_warning_time is None
|
||||
or now > self._last_slow_emit_warning_time + 10.0
|
||||
):
|
||||
# Logging calls from *within* a logging handler
|
||||
# sounds sketchy, so let's just kick this over to
|
||||
# the bg event loop thread we've already got.
|
||||
self._last_slow_emit_warning_time = now
|
||||
self._event_loop.call_soon_threadsafe(
|
||||
tpartial(
|
||||
logging.warning,
|
||||
'efro.log.LogHandler emit took too long'
|
||||
' (%.2fs total; %.2fs format, %.2fs echo,'
|
||||
' fast_path=%s).',
|
||||
duration,
|
||||
format_duration,
|
||||
echo_duration,
|
||||
fast_path,
|
||||
)
|
||||
)
|
||||
|
||||
def _emit_in_thread(
|
||||
self, name: str, levelno: int, created: float, message: str
|
||||
self,
|
||||
name: str,
|
||||
levelno: int,
|
||||
created: float,
|
||||
message: str | logging.LogRecord,
|
||||
) -> None:
|
||||
try:
|
||||
|
||||
# If they passed a raw record here, bake it down to a string.
|
||||
if isinstance(message, logging.LogRecord):
|
||||
message = self.format(message)
|
||||
|
||||
self._emit_entry(
|
||||
LogEntry(
|
||||
name=name,
|
||||
|
|
@ -409,7 +503,7 @@ class LogHandler(logging.Handler):
|
|||
|
||||
# Prune old until we are back at or under our limit.
|
||||
while self._cache_size > self._cache_size_limit:
|
||||
popped = self._cache.pop(0)
|
||||
popped = self._cache.popleft()
|
||||
self._cache_size -= popped[0]
|
||||
self._cache_index_offset += 1
|
||||
|
||||
|
|
@ -469,6 +563,7 @@ def setup_logging(
|
|||
level: LogLevel,
|
||||
suppress_non_root_debug: bool = False,
|
||||
log_stdout_stderr: bool = False,
|
||||
echo_to_stderr: bool = True,
|
||||
cache_size_limit: int = 0,
|
||||
cache_time_limit: datetime.timedelta | None = None,
|
||||
) -> LogHandler:
|
||||
|
|
@ -499,8 +594,7 @@ def setup_logging(
|
|||
# which would create an infinite loop.
|
||||
loghandler = LogHandler(
|
||||
log_path,
|
||||
# echofile=sys.stderr if sys.stderr.isatty() else None,
|
||||
echofile=sys.stderr,
|
||||
echofile=sys.stderr if echo_to_stderr else None,
|
||||
suppress_non_root_debug=suppress_non_root_debug,
|
||||
cache_size_limit=cache_size_limit,
|
||||
cache_time_limit=cache_time_limit,
|
||||
|
|
|
|||
58
dist/ba_data/python/efro/message/_protocol.py
vendored
58
dist/ba_data/python/efro/message/_protocol.py
vendored
|
|
@ -282,10 +282,13 @@ class MessageProtocol:
|
|||
def _get_module_header(
|
||||
self,
|
||||
part: Literal['sender', 'receiver'],
|
||||
extra_import_code: str | None = None,
|
||||
extra_import_code: str | None,
|
||||
enable_async_sends: bool,
|
||||
) -> str:
|
||||
"""Return common parts of generated modules."""
|
||||
# pylint: disable=too-many-locals, too-many-branches
|
||||
# pylint: disable=too-many-locals
|
||||
# pylint: disable=too-many-branches
|
||||
# pylint: disable=too-many-statements
|
||||
import textwrap
|
||||
|
||||
tpimports: dict[str, list[str]] = {}
|
||||
|
|
@ -342,7 +345,7 @@ class MessageProtocol:
|
|||
|
||||
if part == 'sender':
|
||||
import_lines += (
|
||||
'from efro.message import MessageSender,' ' BoundMessageSender'
|
||||
'from efro.message import MessageSender, BoundMessageSender'
|
||||
)
|
||||
tpimport_typing_extras = ''
|
||||
else:
|
||||
|
|
@ -362,11 +365,18 @@ class MessageProtocol:
|
|||
import_lines += f'\n{extra_import_code}\n'
|
||||
|
||||
ovld = ', overload' if not single_message_type else ''
|
||||
ovld2 = (
|
||||
', cast, Awaitable'
|
||||
if (single_message_type and part == 'sender' and enable_async_sends)
|
||||
else ''
|
||||
)
|
||||
tpimport_lines = textwrap.indent(tpimport_lines, ' ')
|
||||
|
||||
baseimps = ['Any']
|
||||
if part == 'receiver':
|
||||
baseimps.append('Callable')
|
||||
if part == 'sender' and enable_async_sends:
|
||||
baseimps.append('Awaitable')
|
||||
baseimps_s = ', '.join(baseimps)
|
||||
out = (
|
||||
'# Released under the MIT License. See LICENSE for details.\n'
|
||||
|
|
@ -375,7 +385,7 @@ class MessageProtocol:
|
|||
f'\n'
|
||||
f'from __future__ import annotations\n'
|
||||
f'\n'
|
||||
f'from typing import TYPE_CHECKING{ovld}\n'
|
||||
f'from typing import TYPE_CHECKING{ovld}{ovld2}\n'
|
||||
f'\n'
|
||||
f'{import_lines}\n'
|
||||
f'\n'
|
||||
|
|
@ -399,13 +409,16 @@ class MessageProtocol:
|
|||
) -> str:
|
||||
"""Used by create_sender_module(); do not call directly."""
|
||||
# pylint: disable=too-many-locals
|
||||
# pylint: disable=too-many-branches
|
||||
import textwrap
|
||||
|
||||
msgtypes = list(self.message_ids_by_type.keys())
|
||||
|
||||
ppre = '_' if private else ''
|
||||
out = self._get_module_header(
|
||||
'sender', extra_import_code=protocol_module_level_import_code
|
||||
'sender',
|
||||
extra_import_code=protocol_module_level_import_code,
|
||||
enable_async_sends=enable_async_sends,
|
||||
)
|
||||
ccind = textwrap.indent(protocol_create_code, ' ')
|
||||
out += (
|
||||
|
|
@ -438,7 +451,8 @@ class MessageProtocol:
|
|||
continue
|
||||
pfx = 'async ' if async_pass else ''
|
||||
sfx = '_async' if async_pass else ''
|
||||
awt = 'await ' if async_pass else ''
|
||||
# awt = 'await ' if async_pass else ''
|
||||
awt = ''
|
||||
how = 'asynchronously' if async_pass else 'synchronously'
|
||||
|
||||
if len(msgtypes) == 1:
|
||||
|
|
@ -451,22 +465,29 @@ class MessageProtocol:
|
|||
rtypevar = ' | '.join(_filt_tp_name(t) for t in rtypes)
|
||||
else:
|
||||
rtypevar = _filt_tp_name(rtypes[0])
|
||||
if async_pass:
|
||||
rtypevar = f'Awaitable[{rtypevar}]'
|
||||
out += (
|
||||
f'\n'
|
||||
f' {pfx}def send{sfx}(self,'
|
||||
f' def send{sfx}(self,'
|
||||
f' message: {msgtypevar})'
|
||||
f' -> {rtypevar}:\n'
|
||||
f' """Send a message {how}."""\n'
|
||||
f' out = {awt}self._sender.'
|
||||
f'send{sfx}(self._obj, message)\n'
|
||||
f' assert isinstance(out, {rtypevar})\n'
|
||||
f' return out\n'
|
||||
)
|
||||
if not async_pass:
|
||||
out += (
|
||||
f' assert isinstance(out, {rtypevar})\n'
|
||||
' return out\n'
|
||||
)
|
||||
else:
|
||||
out += f' return cast({rtypevar}, out)\n'
|
||||
|
||||
else:
|
||||
|
||||
for msgtype in msgtypes:
|
||||
msgtypevar = msgtype.__name__
|
||||
# rtypes = msgtype.get_response_types()
|
||||
rtypes = msgtype.get_response_types()
|
||||
if len(rtypes) > 1:
|
||||
rtypevar = ' | '.join(
|
||||
|
|
@ -482,10 +503,13 @@ class MessageProtocol:
|
|||
f' -> {rtypevar}:\n'
|
||||
f' ...\n'
|
||||
)
|
||||
rtypevar = 'Response | None'
|
||||
if async_pass:
|
||||
rtypevar = f'Awaitable[{rtypevar}]'
|
||||
out += (
|
||||
f'\n'
|
||||
f' {pfx}def send{sfx}(self, message: Message)'
|
||||
f' -> Response | None:\n'
|
||||
f' def send{sfx}(self, message: Message)'
|
||||
f' -> {rtypevar}:\n'
|
||||
f' """Send a message {how}."""\n'
|
||||
f' return {awt}self._sender.'
|
||||
f'send{sfx}(self._obj, message)\n'
|
||||
|
|
@ -509,7 +533,9 @@ class MessageProtocol:
|
|||
ppre = '_' if private else ''
|
||||
msgtypes = list(self.message_ids_by_type.keys())
|
||||
out = self._get_module_header(
|
||||
'receiver', extra_import_code=protocol_module_level_import_code
|
||||
'receiver',
|
||||
extra_import_code=protocol_module_level_import_code,
|
||||
enable_async_sends=False,
|
||||
)
|
||||
ccind = textwrap.indent(protocol_create_code, ' ')
|
||||
out += (
|
||||
|
|
@ -602,11 +628,11 @@ class MessageProtocol:
|
|||
if is_async:
|
||||
out += (
|
||||
'\n'
|
||||
' async def handle_raw_message(\n'
|
||||
' def handle_raw_message(\n'
|
||||
' self, message: str, raise_unregistered: bool = False\n'
|
||||
' ) -> str:\n'
|
||||
' ) -> Awaitable[str]:\n'
|
||||
' """Asynchronously handle a raw incoming message."""\n'
|
||||
' return await self._receiver.'
|
||||
' return self._receiver.'
|
||||
'handle_raw_message_async(\n'
|
||||
' self._obj, message, raise_unregistered\n'
|
||||
' )\n'
|
||||
|
|
|
|||
129
dist/ba_data/python/efro/message/_receiver.py
vendored
129
dist/ba_data/python/efro/message/_receiver.py
vendored
|
|
@ -62,12 +62,6 @@ class MessageReceiver:
|
|||
[Any, Message | None, Response | SysResponse, dict], None
|
||||
] | None = None
|
||||
|
||||
# TODO: don't currently have async encode equivalent
|
||||
# or either for sender; can add as needed.
|
||||
self._decode_filter_async_call: Callable[
|
||||
[Any, dict, Message], Awaitable[None]
|
||||
] | None = None
|
||||
|
||||
# noinspection PyProtectedMember
|
||||
def register_handler(
|
||||
self, call: Callable[[Any, Message], Response | None]
|
||||
|
|
@ -96,14 +90,17 @@ class MessageReceiver:
|
|||
|
||||
# Make sure we are only given async methods if we are an async handler
|
||||
# and sync ones otherwise.
|
||||
is_async = inspect.iscoroutinefunction(call)
|
||||
if self.is_async != is_async:
|
||||
msg = (
|
||||
'Expected a sync method; found an async one.'
|
||||
if is_async
|
||||
else 'Expected an async method; found a sync one.'
|
||||
)
|
||||
raise ValueError(msg)
|
||||
# UPDATE - can't do this anymore since we now sometimes use
|
||||
# regular functions which return awaitables instead of having
|
||||
# the entire function be async.
|
||||
# is_async = inspect.iscoroutinefunction(call)
|
||||
# if self.is_async != is_async:
|
||||
# msg = (
|
||||
# 'Expected a sync method; found an async one.'
|
||||
# if is_async
|
||||
# else 'Expected an async method; found a sync one.'
|
||||
# )
|
||||
# raise ValueError(msg)
|
||||
|
||||
# Check annotation types to determine what message types we handle.
|
||||
# Return-type annotation can be a Union, but we probably don't
|
||||
|
|
@ -189,19 +186,6 @@ class MessageReceiver:
|
|||
self._decode_filter_call = call
|
||||
return call
|
||||
|
||||
def decode_filter_async_method(
|
||||
self, call: Callable[[Any, dict, Message], Awaitable[None]]
|
||||
) -> Callable[[Any, dict, Message], Awaitable[None]]:
|
||||
"""Function decorator for defining a decode filter.
|
||||
|
||||
Decode filters can be used to extract extra data from incoming
|
||||
message dicts. Note that this version will only work with
|
||||
handle_raw_message_async().
|
||||
"""
|
||||
assert self._decode_filter_async_call is None
|
||||
self._decode_filter_async_call = call
|
||||
return call
|
||||
|
||||
def encode_filter_method(
|
||||
self,
|
||||
call: Callable[
|
||||
|
|
@ -247,24 +231,6 @@ class MessageReceiver:
|
|||
bound_obj, _msg_dict, msg_decoded = self._decode_incoming_message_base(
|
||||
bound_obj=bound_obj, msg=msg
|
||||
)
|
||||
|
||||
# If they've set an async filter but are calling sync
|
||||
# handle_raw_message() its likely a bug.
|
||||
assert self._decode_filter_async_call is None
|
||||
|
||||
return msg_decoded
|
||||
|
||||
async def _decode_incoming_message_async(
|
||||
self, bound_obj: Any, msg: str
|
||||
) -> Message:
|
||||
bound_obj, msg_dict, msg_decoded = self._decode_incoming_message_base(
|
||||
bound_obj=bound_obj, msg=msg
|
||||
)
|
||||
|
||||
if self._decode_filter_async_call is not None:
|
||||
await self._decode_filter_async_call(
|
||||
bound_obj, msg_dict, msg_decoded
|
||||
)
|
||||
return msg_decoded
|
||||
|
||||
def encode_user_response(
|
||||
|
|
@ -316,6 +282,7 @@ class MessageReceiver:
|
|||
"""
|
||||
assert not self.is_async, "can't call sync handler on async receiver"
|
||||
msg_decoded: Message | None = None
|
||||
msgtype: type[Message] | None = None
|
||||
try:
|
||||
msg_decoded = self._decode_incoming_message(bound_obj, msg)
|
||||
msgtype = type(msg_decoded)
|
||||
|
|
@ -335,42 +302,94 @@ class MessageReceiver:
|
|||
bound_obj, msg_decoded, exc
|
||||
)
|
||||
if dolog:
|
||||
if msgtype is not None:
|
||||
logging.exception(
|
||||
'Error handling %s.%s message.',
|
||||
msgtype.__module__,
|
||||
msgtype.__qualname__,
|
||||
)
|
||||
else:
|
||||
logging.exception('Error in efro.message handling.')
|
||||
return rstr
|
||||
|
||||
async def handle_raw_message_async(
|
||||
def handle_raw_message_async(
|
||||
self, bound_obj: Any, msg: str, raise_unregistered: bool = False
|
||||
) -> str:
|
||||
) -> Awaitable[str]:
|
||||
"""Should be called when the receiver gets a message.
|
||||
|
||||
The return value is the raw response to the message.
|
||||
"""
|
||||
|
||||
# Note: This call is synchronous so that the first part of it can
|
||||
# happen synchronously. If the whole call were async we wouldn't be
|
||||
# able to guarantee that messages handlers would be called in the
|
||||
# order the messages were received.
|
||||
|
||||
assert self.is_async, "can't call async handler on sync receiver"
|
||||
msg_decoded: Message | None = None
|
||||
msgtype: type[Message] | None = None
|
||||
try:
|
||||
msg_decoded = await self._decode_incoming_message_async(
|
||||
bound_obj, msg
|
||||
)
|
||||
msg_decoded = self._decode_incoming_message(bound_obj, msg)
|
||||
msgtype = type(msg_decoded)
|
||||
handler = self._handlers.get(msgtype)
|
||||
if handler is None:
|
||||
raise RuntimeError(f'Got unhandled message type: {msgtype}.')
|
||||
response = await handler(bound_obj, msg_decoded)
|
||||
assert isinstance(response, Response | None)
|
||||
return self.encode_user_response(bound_obj, msg_decoded, response)
|
||||
handler_awaitable = handler(bound_obj, msg_decoded)
|
||||
|
||||
except Exception as exc:
|
||||
if raise_unregistered and isinstance(
|
||||
exc, UnregisteredMessageIDError
|
||||
):
|
||||
raise
|
||||
rstr, dolog = self.encode_error_response(
|
||||
bound_obj, msg_decoded, exc
|
||||
return self._handle_raw_message_async_error(
|
||||
bound_obj, msg_decoded, msgtype, exc
|
||||
)
|
||||
|
||||
# Return an awaitable to handle the rest asynchronously.
|
||||
return self._handle_raw_message_async(
|
||||
bound_obj, msg_decoded, msgtype, handler_awaitable
|
||||
)
|
||||
|
||||
async def _handle_raw_message_async_error(
|
||||
self,
|
||||
bound_obj: Any,
|
||||
msg_decoded: Message | None,
|
||||
msgtype: type[Message] | None,
|
||||
exc: Exception,
|
||||
) -> str:
|
||||
rstr, dolog = self.encode_error_response(bound_obj, msg_decoded, exc)
|
||||
if dolog:
|
||||
if msgtype is not None:
|
||||
logging.exception(
|
||||
'Error handling %s.%s message.',
|
||||
msgtype.__module__,
|
||||
msgtype.__qualname__,
|
||||
)
|
||||
else:
|
||||
logging.exception('Error in efro.message handling.')
|
||||
return rstr
|
||||
|
||||
async def _handle_raw_message_async(
|
||||
self,
|
||||
bound_obj: Any,
|
||||
msg_decoded: Message,
|
||||
msgtype: type[Message] | None,
|
||||
handler_awaitable: Awaitable[Response | None],
|
||||
) -> str:
|
||||
"""Should be called when the receiver gets a message.
|
||||
|
||||
The return value is the raw response to the message.
|
||||
"""
|
||||
try:
|
||||
response = await handler_awaitable
|
||||
assert isinstance(response, Response | None)
|
||||
return self.encode_user_response(bound_obj, msg_decoded, response)
|
||||
|
||||
except Exception as exc:
|
||||
return await self._handle_raw_message_async_error(
|
||||
bound_obj, msg_decoded, msgtype, exc
|
||||
)
|
||||
|
||||
|
||||
class BoundMessageReceiver:
|
||||
"""Base bound receiver class."""
|
||||
|
|
|
|||
122
dist/ba_data/python/efro/message/_sender.py
vendored
122
dist/ba_data/python/efro/message/_sender.py
vendored
|
|
@ -44,6 +44,9 @@ class MessageSender:
|
|||
self._send_async_raw_message_call: Callable[
|
||||
[Any, str], Awaitable[str]
|
||||
] | None = None
|
||||
self._send_async_raw_message_ex_call: Callable[
|
||||
[Any, str, Message], Awaitable[str]
|
||||
] | None = None
|
||||
self._encode_filter_call: Callable[
|
||||
[Any, Message, dict], None
|
||||
] | None = None
|
||||
|
|
@ -75,11 +78,32 @@ class MessageSender:
|
|||
CommunicationErrors raised here will be returned to the sender
|
||||
as such; all other exceptions will result in a RuntimeError for
|
||||
the sender.
|
||||
|
||||
IMPORTANT: Generally async send methods should not be implemented
|
||||
as 'async' methods, but instead should be regular methods that
|
||||
return awaitable objects. This way it can be guaranteed that
|
||||
outgoing messages are synchronously enqueued in the correct
|
||||
order, and then async calls can be returned which finish each
|
||||
send. If the entire call is async, they may be enqueued out of
|
||||
order in rare cases.
|
||||
"""
|
||||
assert self._send_async_raw_message_call is None
|
||||
self._send_async_raw_message_call = call
|
||||
return call
|
||||
|
||||
def send_async_ex_method(
|
||||
self, call: Callable[[Any, str, Message], Awaitable[str]]
|
||||
) -> Callable[[Any, str, Message], Awaitable[str]]:
|
||||
"""Function decorator for extended send-async method.
|
||||
|
||||
Version of send_async_method which is also is passed the original
|
||||
unencoded message; can be useful for cases where metadata is sent
|
||||
along with messages referring to their payloads/etc.
|
||||
"""
|
||||
assert self._send_async_raw_message_ex_call is None
|
||||
self._send_async_raw_message_ex_call = call
|
||||
return call
|
||||
|
||||
def encode_filter_method(
|
||||
self, call: Callable[[Any, Message, dict], None]
|
||||
) -> Callable[[Any, Message, dict], None]:
|
||||
|
|
@ -126,17 +150,34 @@ class MessageSender:
|
|||
),
|
||||
)
|
||||
|
||||
async def send_async(
|
||||
def send_async(
|
||||
self, bound_obj: Any, message: Message
|
||||
) -> Response | None:
|
||||
) -> Awaitable[Response | None]:
|
||||
"""Send a message asynchronously."""
|
||||
|
||||
# Note: This call is synchronous so that the first part of it can
|
||||
# happen synchronously. If the whole call were async we wouldn't be
|
||||
# able to guarantee that messages sent in order would actually go
|
||||
# out in order.
|
||||
raw_response_awaitable = self.fetch_raw_response_async(
|
||||
bound_obj=bound_obj,
|
||||
message=message,
|
||||
)
|
||||
# Now return an awaitable that will finish the send.
|
||||
return self._send_async_awaitable(
|
||||
bound_obj, message, raw_response_awaitable
|
||||
)
|
||||
|
||||
async def _send_async_awaitable(
|
||||
self,
|
||||
bound_obj: Any,
|
||||
message: Message,
|
||||
raw_response_awaitable: Awaitable[Response | SysResponse],
|
||||
) -> Response | None:
|
||||
return self.unpack_raw_response(
|
||||
bound_obj=bound_obj,
|
||||
message=message,
|
||||
raw_response=await self.fetch_raw_response_async(
|
||||
bound_obj=bound_obj,
|
||||
message=message,
|
||||
),
|
||||
raw_response=await raw_response_awaitable,
|
||||
)
|
||||
|
||||
def fetch_raw_response(
|
||||
|
|
@ -171,27 +212,68 @@ class MessageSender:
|
|||
return response
|
||||
return self._decode_raw_response(bound_obj, message, response_encoded)
|
||||
|
||||
async def fetch_raw_response_async(
|
||||
def fetch_raw_response_async(
|
||||
self, bound_obj: Any, message: Message
|
||||
) -> Response | SysResponse:
|
||||
"""Fetch a raw message response.
|
||||
) -> Awaitable[Response | SysResponse]:
|
||||
"""Fetch a raw message response awaitable.
|
||||
|
||||
The result of this should be passed to unpack_raw_response() to
|
||||
produce the final message result.
|
||||
The result of this should be awaited and then passed to
|
||||
unpack_raw_response() to produce the final message result.
|
||||
|
||||
Generally you can just call send(); calling fetch and unpack
|
||||
manually is for when message sending and response handling need
|
||||
to happen in different contexts/threads.
|
||||
"""
|
||||
|
||||
if self._send_async_raw_message_call is None:
|
||||
# Note: This call is synchronous so that the first part of it can
|
||||
# happen synchronously. If the whole call were async we wouldn't be
|
||||
# able to guarantee that messages sent in order would actually go
|
||||
# out in order.
|
||||
if (
|
||||
self._send_async_raw_message_call is None
|
||||
and self._send_async_raw_message_ex_call is None
|
||||
):
|
||||
raise RuntimeError('send_async() is unimplemented for this type.')
|
||||
|
||||
msg_encoded = self._encode_message(bound_obj, message)
|
||||
try:
|
||||
response_encoded = await self._send_async_raw_message_call(
|
||||
if self._send_async_raw_message_ex_call is not None:
|
||||
send_awaitable = self._send_async_raw_message_ex_call(
|
||||
bound_obj, msg_encoded, message
|
||||
)
|
||||
else:
|
||||
assert self._send_async_raw_message_call is not None
|
||||
send_awaitable = self._send_async_raw_message_call(
|
||||
bound_obj, msg_encoded
|
||||
)
|
||||
except Exception as exc:
|
||||
return self._error_awaitable(exc)
|
||||
|
||||
# Now return an awaitable to finish the job.
|
||||
return self._fetch_raw_response_awaitable(
|
||||
bound_obj, message, send_awaitable
|
||||
)
|
||||
|
||||
async def _error_awaitable(self, exc: Exception) -> SysResponse:
|
||||
response = ErrorSysResponse(
|
||||
error_message='Error in MessageSender @send_async_method.',
|
||||
error_type=(
|
||||
ErrorSysResponse.ErrorType.COMMUNICATION
|
||||
if isinstance(exc, CommunicationError)
|
||||
else ErrorSysResponse.ErrorType.LOCAL
|
||||
),
|
||||
)
|
||||
# Can include the actual exception since we'll be looking at
|
||||
# this locally; might be helpful.
|
||||
response.set_local_exception(exc)
|
||||
return response
|
||||
|
||||
async def _fetch_raw_response_awaitable(
|
||||
self, bound_obj: Any, message: Message, send_awaitable: Awaitable[str]
|
||||
) -> Response | SysResponse:
|
||||
|
||||
try:
|
||||
response_encoded = await send_awaitable
|
||||
except Exception as exc:
|
||||
response = ErrorSysResponse(
|
||||
error_message='Error in MessageSender @send_async_method.',
|
||||
|
|
@ -354,23 +436,23 @@ class BoundMessageSender:
|
|||
assert self._obj is not None
|
||||
return self._sender.send(bound_obj=self._obj, message=message)
|
||||
|
||||
async def send_async_untyped(self, message: Message) -> Response | None:
|
||||
def send_async_untyped(
|
||||
self, message: Message
|
||||
) -> Awaitable[Response | None]:
|
||||
"""Send a message asynchronously.
|
||||
|
||||
Whenever possible, use the send_async() call provided by generated
|
||||
subclasses instead of this; it will provide better type safety.
|
||||
"""
|
||||
assert self._obj is not None
|
||||
return await self._sender.send_async(
|
||||
bound_obj=self._obj, message=message
|
||||
)
|
||||
return self._sender.send_async(bound_obj=self._obj, message=message)
|
||||
|
||||
async def fetch_raw_response_async_untyped(
|
||||
def fetch_raw_response_async_untyped(
|
||||
self, message: Message
|
||||
) -> Response | SysResponse:
|
||||
) -> Awaitable[Response | SysResponse]:
|
||||
"""Split send (part 1 of 2)."""
|
||||
assert self._obj is not None
|
||||
return await self._sender.fetch_raw_response_async(
|
||||
return self._sender.fetch_raw_response_async(
|
||||
bound_obj=self._obj, message=message
|
||||
)
|
||||
|
||||
|
|
|
|||
55
dist/ba_data/python/efro/rpc.py
vendored
55
dist/ba_data/python/efro/rpc.py
vendored
|
|
@ -9,6 +9,7 @@ import asyncio
|
|||
import logging
|
||||
import weakref
|
||||
from enum import Enum
|
||||
from collections import deque
|
||||
from dataclasses import dataclass
|
||||
from threading import current_thread
|
||||
from typing import TYPE_CHECKING, Annotated
|
||||
|
|
@ -201,7 +202,7 @@ class RPCEndpoint:
|
|||
self._closing = False
|
||||
self._did_wait_closed = False
|
||||
self._event_loop = asyncio.get_running_loop()
|
||||
self._out_packets: list[bytes] = []
|
||||
self._out_packets = deque[bytes]()
|
||||
self._have_out_packets = asyncio.Event()
|
||||
self._run_called = False
|
||||
self._peer_info: _PeerInfo | None = None
|
||||
|
|
@ -323,12 +324,12 @@ class RPCEndpoint:
|
|||
if self.debug_print:
|
||||
self.debug_print_call(f'{self._label}: finished.')
|
||||
|
||||
async def send_message(
|
||||
def send_message(
|
||||
self,
|
||||
message: bytes,
|
||||
timeout: float | None = None,
|
||||
close_on_error: bool = True,
|
||||
) -> bytes:
|
||||
) -> Awaitable[bytes]:
|
||||
"""Send a message to the peer and return a response.
|
||||
|
||||
If timeout is not provided, the default will be used.
|
||||
|
|
@ -340,7 +341,10 @@ class RPCEndpoint:
|
|||
respect to a given endpoint. Pass close_on_error=False to
|
||||
override this for a particular message.
|
||||
"""
|
||||
# pylint: disable=too-many-branches
|
||||
# Note: This call is synchronous so that the first part of it
|
||||
# (enqueueing outgoing messages) happens synchronously. If it were
|
||||
# a pure async call it could be possible for send order to vary
|
||||
# based on how the async tasks get processed.
|
||||
|
||||
if self.debug_print_io:
|
||||
self.debug_print_call(
|
||||
|
|
@ -358,16 +362,6 @@ class RPCEndpoint:
|
|||
f'{self._label}: have peerinfo? {self._peer_info is not None}.'
|
||||
)
|
||||
|
||||
# We need to know their protocol, so if we haven't gotten a handshake
|
||||
# from them yet, just wait.
|
||||
while self._peer_info is None:
|
||||
await asyncio.sleep(0.01)
|
||||
assert self._peer_info is not None
|
||||
|
||||
if self._peer_info.protocol == 1:
|
||||
if len(message) > 65535:
|
||||
raise RuntimeError('Message cannot be larger than 65535 bytes')
|
||||
|
||||
# message_id is a 16 bit looping value.
|
||||
message_id = self._next_message_id
|
||||
self._next_message_id = (self._next_message_id + 1) % 65536
|
||||
|
|
@ -420,8 +414,35 @@ class RPCEndpoint:
|
|||
if timeout is None:
|
||||
timeout = self.DEFAULT_MESSAGE_TIMEOUT
|
||||
assert timeout is not None
|
||||
|
||||
bytes_awaitable = msgobj.wait_task
|
||||
|
||||
# Now complete the send asynchronously.
|
||||
return self._send_message(
|
||||
message, timeout, close_on_error, bytes_awaitable, message_id
|
||||
)
|
||||
|
||||
async def _send_message(
|
||||
self,
|
||||
message: bytes,
|
||||
timeout: float | None,
|
||||
close_on_error: bool,
|
||||
bytes_awaitable: asyncio.Task[bytes],
|
||||
message_id: int,
|
||||
) -> bytes:
|
||||
|
||||
# We need to know their protocol, so if we haven't gotten a handshake
|
||||
# from them yet, just wait.
|
||||
while self._peer_info is None:
|
||||
await asyncio.sleep(0.01)
|
||||
assert self._peer_info is not None
|
||||
|
||||
if self._peer_info.protocol == 1:
|
||||
if len(message) > 65535:
|
||||
raise RuntimeError('Message cannot be larger than 65535 bytes')
|
||||
|
||||
try:
|
||||
return await asyncio.wait_for(msgobj.wait_task, timeout=timeout)
|
||||
return await asyncio.wait_for(bytes_awaitable, timeout=timeout)
|
||||
except asyncio.CancelledError as exc:
|
||||
# Question: we assume this means the above wait_for() was
|
||||
# cancelled; how do we distinguish between this and *us* being
|
||||
|
|
@ -449,7 +470,7 @@ class RPCEndpoint:
|
|||
)
|
||||
|
||||
# Stop waiting on the response.
|
||||
msgobj.wait_task.cancel()
|
||||
bytes_awaitable.cancel()
|
||||
|
||||
# Remove the record of this message.
|
||||
del self._in_flight_messages[message_id]
|
||||
|
|
@ -738,7 +759,7 @@ class RPCEndpoint:
|
|||
await self._have_out_packets.wait()
|
||||
|
||||
assert self._out_packets
|
||||
data = self._out_packets.pop(0)
|
||||
data = self._out_packets.popleft()
|
||||
|
||||
# Important: only clear this once all packets are sent.
|
||||
if not self._out_packets:
|
||||
|
|
|
|||
BIN
dist/bombsquad_headless
vendored
BIN
dist/bombsquad_headless
vendored
Binary file not shown.
BIN
dist/bombsquad_headless_aarch64
vendored
BIN
dist/bombsquad_headless_aarch64
vendored
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue