updated to 1.7.20

This commit is contained in:
Ayush Saini 2023-01-30 23:35:08 +05:30
parent 0dfe2de8e5
commit dab1db4141
67 changed files with 5236 additions and 2272 deletions

View file

@ -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"
]
}

View file

@ -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حقوق التأليف والنشر ل"
},

View file

@ -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版权所有"
},

View file

@ -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版權擁有©"
},

View file

@ -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"
},

View file

@ -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, Googles 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"
},

View file

@ -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",

View file

@ -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.\nDi 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"
},

View file

@ -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"
},

View file

@ -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,

View file

@ -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,

View file

@ -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"
},

View file

@ -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": "डार्विन रिमोट कॉपीराइट"
},

View file

@ -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",

View file

@ -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"
},

View file

@ -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,

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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"
},

View file

@ -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"
},

View file

@ -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"

View file

@ -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": "Лучшее в мире время",

View file

@ -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",

View file

@ -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"
}

View file

@ -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",

View file

@ -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": "டார்வின் ரிமோட் பதிப்புரிமை"
},

View file

@ -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"
},

View file

@ -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"
}

View file

@ -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": "Світові результати недоступні.",

View file

@ -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 del 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 del 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"
},

View file

@ -1,4 +1,4 @@
from .core import contents, where
__all__ = ["contents", "where"]
__version__ = "2022.09.14"
__version__ = "2022.12.07"

View file

@ -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"

View file

@ -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

View file

@ -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',

View file

@ -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:

View file

@ -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
View 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

View file

@ -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

View file

@ -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(

View file

@ -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.

View file

@ -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:

View file

@ -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),
)

View file

@ -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,
)

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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]

View file

@ -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:
"""

View file

@ -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',
},
)
)

View file

@ -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:

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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

View 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()
)

View file

@ -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
View 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)

View file

@ -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,

View file

@ -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'

View file

@ -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."""

View file

@ -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
)

View file

@ -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:

Binary file not shown.

Binary file not shown.