diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 3f10fd0..d9029dd 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -11,14 +11,14 @@ body: attributes: label: What happened? description: Describe the issue you are experiencing right now - placeholder: Tell us what you see! + placeholder: This thing doesn't work as intended under certain circumstances validations: required: true - type: textarea id: reproducing attributes: label: How did that happened? - description: Describe in details what do do to get this issue + description: Describe in details what to do to get this issue placeholder: "Steps to reproduce:\n1. Go here\n2. Click this\n3. Do that\netc..." validations: required: true @@ -31,7 +31,7 @@ body: - type: checkboxes id: platform attributes: - label: On which platform you encountered this issue? + label: On which platforms you encountered this issue? description: Tick the ones, where this issue can be reproduced options: - label: Web (ts.dan63.by) @@ -47,6 +47,8 @@ body: label: What version of Tetra Stats did you used? description: You can find that info in Information Center -> About Tetra Stats placeholder: "2.0.0" + validations: + required: true - type: textarea id: additional-info attributes: diff --git a/lib/data_objects/tetrio_constants.dart b/lib/data_objects/tetrio_constants.dart index e3c3bb3..918e93e 100644 --- a/lib/data_objects/tetrio_constants.dart +++ b/lib/data_objects/tetrio_constants.dart @@ -223,8 +223,7 @@ const Map blitzAverages = { List seasonStarts = [ DateTime.utc(2020, DateTime.april, 18, 4), // Source = twitter or something - DateTime.utc( - 2024, DateTime.august, 16, 18, 41, 10) // Source = osk status page + DateTime.utc(2024, DateTime.august, 16, 18, 41, 10) // Source = osk status page ]; List seasonEnds = [ diff --git a/res/i18n/old_strings.i18n.json b/res/i18n/old_strings.i18n.json new file mode 100644 index 0000000..65505ed --- /dev/null +++ b/res/i18n/old_strings.i18n.json @@ -0,0 +1,666 @@ +{ + "locales(map)": { + "en": "English", + "ru": "Russian (Русский)", + "zh-CN": "Simplified Chinese (简体中文)" + }, + "tetraLeague": "Tetra League", + "tlRecords": "TL Records", + "history": "History", + "sprint": "40 Lines", + "blitz": "Blitz", + "recent": "Recent", + "recentRuns": "Recent runs", + "blitzScore": "$p points", + "openSPreplay": "Open replay in TETR.IO", + "downloadSPreplay": "Download replay", + "other": "Other", + "distinguishment": "Distinguishment", + "zen": "Zen", + "bio": "Bio", + "news": "News", + "newsParts":{ + "leaderboardStart": "Got ", + "leaderboardMiddle": "on ", + "personalbest": "Got a new PB in ", + "personalbestMiddle": "of ", + "badgeStart": "Obtained a ", + "badgeEnd": "badge", + "rankupStart": "Obtained ", + "rankupMiddle": "${r} rank ", + "rankupEnd": "in Tetra League", + "tetoSupporter": "TETR.IO supporter", + "supporterStart": "Become a ", + "supporterGiftStart": "Received the gift of ", + "unknownNews": "Unknown news of type ${type}" + }, + "openSearch": "Search player", + "closeSearch": "Close search", + "searchHint": "Nickname, ID or Discord userID (with \"ds:\" prefix)", + "refresh": "Refresh", + "fetchAndsaveTLHistory": "Get player history", + "fetchAndSaveOldTLmatches": "Get Tetra League matches history", + "fetchAndsaveTLHistoryResult": "${number} states was found", + "fetchAndSaveOldTLmatchesResult": "${number} matches was found", + "showStoredData": "Show stored data", + "statsCalc": "Stats Calculator", + "settings": "Settings", + "track": "Track", + "stopTracking": "Stop\ntracking", + "becameTracked": "Added to tracking list!", + "compare": "Compare", + "stoppedBeingTracked": "Removed from tracking list!", + "tlLeaderboard": "Tetra League leaderboard", + "noRecords": "No records", + "noOldRecords": { + "zero": "No records", + "one": "Only $n record", + "two": "Only $n records", + "few": "Only $n records", + "many": "Only $n records", + "other": "Only $n records" + }, + "noRecord": "No record", + "botRecord": "Bots are not allowed to set records", + "anonRecord": "Guests are not allowed to set records", + "notEnoughData": "Not enough data", + "noHistorySaved": "No history saved", + "pseudoTooltipHeaderInit": "Hover over point", + "pseudoTooltipFooterInit": "to see detailed data", + "obtainDate": "Obtained ${date}", + "fetchDate": "Fetched ${date}", + "exactGametime": "Exact gametime", + "bigRedBanned": "BANNED", + "normalBanned": "Banned", + "bigRedBadStanding": "BAD STANDING", + "copiedToClipboard": "Copied to clipboard!", + "playerRoleAccount": " account ", + "wasFromBeginning": "that was from very beginning", + "created": "created", + "botCreatedBy": "by", + "notSupporter": "Not a supporter", + "assignedManualy": "That badge was assigned manualy by TETR.IO admins", + "supporter": "Supporter tier ${tier}", + "comparingWith": "Data from ${newDate} comparing with ${oldDate}", + "top": "Top", + "topRank": "Top rank", + "verdictGeneral": "$n $verdict $rank rank avg", + "verdictBetter": "better", + "verdictWorse": "worse", + "smooth": "Smooth", + "postSeason": "Off-season", + "seasonStarts": "Season starts in:", + "nanow": "Not avaliable for now...", + "seasonEnds": "Season ends in ${countdown}", + "seasonEnded": "Season has ended", + "gamesUntilRanked": "${left} games until being ranked", + "numOfVictories": "~${wins} victories", + "promotionOnNextWin": "Promotion on next win", + "numOfdefeats": "~${losses} defeats", + "demotionOnNextLoss": "Demotion on next loss", + "nerdStats": "Nerd Stats", + "playersYouTrack": "Players you track", + "formula": "Formula", + "exactValue": "Exact value", + "neverPlayedTL": "That user never played Tetra League", + "botTL": "Bots are not allowed to play Tetra League", + "anonTL": "Guests are not allowed to play Tetra League", + "quickPlay": "Quick Play", + "expert": "Expert", + "withMods": "With mods", + "withModsPlural":{ + "zero": "with $n mods", + "one": "with $n mod", + "two": "with $n mods", + "few": "with $n mods", + "many": "with $n mods", + "other": "with $n mods" + }, + "exportDB": "Export local database", + "exportDBDescription": "It contains states and Tetra League records of the tracked players and list of tracked players.", + "desktopExportAlertTitle": "Desktop export", + "desktopExportText": "It seems like you using this app on desktop. Check your documents folder, you should find \"TetraStats.db\". Copy it somewhere", + "androidExportAlertTitle": "Android export", + "androidExportText": "Exported.\n${exportedDB}", + "importDB": "Import local database", + "importDBDescription": "Restore your backup. Notice that already stored database will be overwritten.", + "importWrongFileType": "Wrong file type", + "importCancelled": "Operation was cancelled", + "importSuccess": "Import successful", + "yourID": "Your TETR.IO account", + "yourIDAlertTitle": "Your nickname in TETR.IO", + "yourIDText": "When app loads, it will retrieve data for this account", + "language": "Language", + "updateInBackground": "Update stats in the background", + "updateInBackgroundDescription": "While Tetra Stats is running, it can update stats of the current player when cache expires", + "customization": "Customization", + "customizationDescription": "Change appearance of different things in Tetra Stats UI", + "oskKagari": "Osk Kagari gimmick", + "oskKagariDescription": "If on, osk's rank on main view will be rendered as :kagari:", + "AccentColor": "Accent color", + "AccentColorDescription": "Almost all interactive UI elements highlighted with this color", + "timestamps": "Timestamps", + "timestampsDescription": "You can choose, in which way timestamps shows time", + "timestampsAbsoluteGMT": "Absolute (GMT)", + "timestampsAbsoluteLocalTime": "Absolute (Your timezone)", + "timestampsRelative": "Relative", + "rating": "Main representation of rating", + "ratingDescription": "TR is not linear, while Glicko does not have boundaries and percentile is volatile", + "ratingLBposition": "LB position", + "sheetbotGraphs": "Sheetbot-like behavior for radar graphs", + "sheetbotGraphsDescription": "If on, points on the graphs can appear on the opposite half of the graph if value is negative", + "lbStats": "Show leaderboard based stats", + "lbStatsDescription": "That will impact on loading times, but will allow you to see position on LB by stats and comparison with average values", + "aboutApp": "About app", + "aboutAppText": "${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r\nTETR.IO replay grabber API by szy", + "stateViewTitle": "${nickname} account on ${date}", + "statesViewTitle": "${number} states of ${nickname} account", + "matchesViewTitle": "${nickname} TL matches", + "statesViewEntry": "${level} TR, ${glicko}±${rd} Glicko, ${games} игр сыграно", + "stateRemoved": "${date} state was removed from database!", + "matchRemoved": "${date} match was removed from database!", + "viewAllMatches": "View all matches", + "trackedPlayersViewTitle": "Stored data", + "trackedPlayersZeroEntrys": "Empty list. Press \"Track\" button in previous view to add current player here", + "trackedPlayersOneEntry": "There is only one player", + "trackedPlayersManyEntrys": "There are ${numberOfPlayers} players", + "trackedPlayersEntry": "${nickname}: ${numberOfStates} states", + "trackedPlayersDescription": "From ${firstStateDate} until ${lastStateDate}", + "trackedPlayersStatesDeleted": "${nickname} states was removed from database!", + "duplicatedFix": "Remove duplicated TL mathces", + "compressDB": "Compress DB", + "SpaceSaved": "Space saved: ${size}", + "averageXrank": "Average ${rankLetter} rank", + "vs": "vs", + "inTLmatch": "in TL match", + "downloadReplay": "Download .ttrm replay", + "openReplay": "Open replay in TETR.IO", + "replaySaved": "Replay saved to ${path}", + "match": "Match", + "timeWeightedmatch": "Match (time-weighted)", + "roundNumber": "Round $n", + "statsFor": "Stats for", + "numberOfRounds": "Number of rounds", + "matchLength": "Match Length", + "roundLength": "Round Length", + "matchStats": "Match stats", + "timeWeightedmatchStats": "Time-weighted match stats", + "replayIssue": "Can't process replay", + "matchIsTooOld": "Replay is not available", + "winner": "Winner", + "registred": "Registred", + "playedTL": "Played Tetra League", + "winChance": "Win Chance", + "byGlicko": "By Glicko", + "byEstTR": "By Est. TR", + "compareViewNoValues": "Please, enter username, user ID, APM-PPS-VS values (divider doesn't matter, only order matter) or $avgR (where R is rank) to both fields", + "compareViewWrongValue": "Falied to assign ${value}", + "mostRecentOne": "Most recent one", + "yes": "Yes", + "no": "No", + "daysLater": "days later", + "dayseBefore": "days before", + "fromBeginning": "From beginning", + "calc": "Calc", + "calcViewNoValues": "Enter values to calculate the stats", + "rankAveragesViewTitle": "Ranks cutoffs", + "sprintAndBlitsViewTitle": "40 lines and Blitz averages", + "sprintAndBlitsRelevance": "Relevance: ${date}", + "rank": "Rank", + "averages": "Averages", + "lbViewZeroEntrys": "Empty list", + "lbViewOneEntry": "There is only one player", + "lbViewManyEntrys": "There are ${numberOfPlayers}", + "everyoneAverages": "Values for leaderboard", + "sortBy": "Sort by", + "reversed": "Reversed", + "country": "Country", + "rankAverages": "Values for $rank rank", + "players":{ + "zero": "$n players", + "one": "$n player", + "two": "$n players", + "few": "$n players", + "many": "$n players", + "other": "$n players" + }, + "games": { + "zero": "$n games", + "one": "$n game", + "two": "$n games", + "few": "$n games", + "many": "$n games", + "other": "$n games" + }, + "gamesPlayed": "$games played", + "chart": "Chart", + "entries": "Entries", + "minimums": "Minimums", + "maximums": "Maximums", + "lowestValues": "Lowest Values", + "averageValues": "Average Values", + "highestValues": "Highest Values", + "forPlayer": "for player $username", + "currentAxis": "$axis axis:", + "p1nkl0bst3rAlert": "That data was retrived from third party API maintained by p1nkl0bst3r", + "notForWeb": "Function is not available for web version", + "graphs": { + "attack": "Attack", + "speed": "Speed", + "defense": "Defense", + "cheese": "Cheese" + }, + "statCellNum":{ + "xpLevel": "XP Level", + "xpProgress": "Progress to next level", + "xpFrom0ToLevel": "Progress from 0 XP to level $n", + "xpLeft": "XP left", + "hoursPlayed": "Hours\nPlayed", + "onlineGames": "Online\nGames", + "gamesWon": "Games\nWon", + "totalGames": "Total Games Played", + "totalWon": "Total Games Won", + "friends": "Friends", + "apm": "Attack\nPer Minute", + "vs": "Versus\nScore", + "recordLB": "Leaderboard placement", + "lbp": "Leaderboard\nplacement", + "lbpShort": "№ in LB", + "lbpc": "Country LB\nplacement", + "lbpcShort": "№ in local LB", + "gamesPlayed": "Games\nplayed", + "gamesWonTL": "Games\nWon", + "winrate": "Winrate", + "level": "Level", + "score": "Score", + "spp": "Score\nPer Piece", + "pieces": "Pieces\nPlaced", + "pps": "Pieces\nPer Second", + "finesseFaults": "Finesse\nFaults", + "finessePercentage": "Finesse\nPercentage", + "keys": "Key\nPresses", + "kpp": "KP Per\nPiece", + "kps": "KP Per\nSecond", + "tr": "Tetra Rating", + "rd": "Rating Deviation", + "app": "Attack Per Piece", + "appDescription": "(Abbreviated as APP) Main efficiency metric. Tells how many attack you producing per piece", + "vsapmDescription": "Basically, tells how much and how efficient you using garbage in your attacks", + "dss": "Downstack\nPer Second", + "dssDescription": "(Abbreviated as DS/S) Downstack per Second measures how many garbage lines you clear in a second.", + "dsp": "Downstack\nPer Piece", + "dspDescription": "(Abbreviated as DS/P) Downstack per Piece measures how many garbage lines you clear per piece.", + "appdsp": "APP + DS/P", + "appdspDescription": "Just a sum of Attack per Piece and Downstack per Piece.", + "cheese": "Cheese\nIndex", + "cheeseDescription": "(Abbreviated as Cheese) Cheese Index is an approximation how much clean / cheese garbage player sends. Lower = more clean. Higher = more cheese.\nInvented by kerrmunism", + "gbe": "Garbage\nEfficiency", + "gbeDescription": "(Abbreviated as Gb Eff.) Garbage Efficiency measures how well player uses their garbage. Higher = better or they use their garbage more. Lower = they mostly send their garbage back at cheese or rarely clear garbage.\nInvented by Zepheniah and Dragonboy.", + "nyaapp": "Weighted\nAPP", + "nyaappDescription": "(Abbreviated as wAPP) Essentially, a measure of your ability to send cheese while still maintaining a high APP.\nInvented by Wertj.", + "area": "Area", + "areaDescription": "How much space your shape takes up on the graph, if you exclude the cheese and vs/apm sections", + "estOfTR": "Estimated TR", + "estOfTRShort": "Est. TR", + "accOfEst": "Accuracy", + "accOfEstShort": "Acc." + }, + "playerRole(map)": { + "user": "User", + "banned": "Banned", + "bot": "Bot", + "sysop": "System operator", + "admin": "Admin", + "mod": "Moderator", + "halfmod": "Community moderator", + "anon": "Anonymous" + }, + "numOfGameActions":{ + "pc": "All Clears", + "hold": "Holds", + "inputs": { + "zero": "$n key presses", + "one": "$n key press", + "two": "$n key presses", + "few": "$n key presses", + "many": "$n key presses", + "other": "$n key presses" + }, + "tspinsTotal": { + "zero": "$n T-spins total", + "one": "$n T-spin total", + "two": "$n T-spins total", + "few": "$n T-spins total", + "many": "$n T-spins total", + "other": "$n T-spins total" + }, + "lineClears": { + "zero": "$n lines cleared", + "one": "$n line cleared", + "two": "$n lines cleared", + "few": "$n lines cleared", + "many": "$n lines cleared", + "other": "$n lines cleared" + } + }, + "popupActions":{ + "cancel": "Cancel", + "submit": "Submit", + "ok": "OK" + }, + "errors":{ + "connection": "Some issue with connection: ${code} ${message}", + "noSuchUser": "No such user", + "noSuchUserSub": "Either you mistyped something, or the account no longer exists", + "discordNotAssigned": "No user assigned to given Discord ID", + "discordNotAssignedSub": "Make sure you provided valid ID", + "history": "History for that player is missing", + "actionSuggestion": "Perhaps, you want to", + "p1nkl0bst3rTLmatches": "No Tetra League matches was found", + "clientException": "No internet connection", + "forbidden": "Your IP address is blocked", + "forbiddenSub": "If you are using VPN or Proxy, turn it off. If this does not help, reach out to $nickname", + "tooManyRequests": "You have been rate limited.", + "tooManyRequestsSub": "Wait a few moments and try again", + "internal": "Something happened on the tetr.io side", + "internalSub": "osk, probably, already aware about it", + "internalWebVersion": "Something happened on the tetr.io side (or on oskware_bridge, idk honestly)", + "internalWebVersionSub": "If osk status page says that everything is ok, let dan63047 know about this issue", + "oskwareBridge": "Something happened with oskware_bridge", + "oskwareBridgeSub": "Let dan63047 know", + "p1nkl0bst3rForbidden": "Third party API blocked your IP address", + "p1nkl0bst3rTooManyRequests": "Too many requests to third party API. Try again later", + "p1nkl0bst3rinternal": "Something happened on the p1nkl0bst3r side", + "p1nkl0bst3rinternalWebVersion": "Something happened on the p1nkl0bst3r side (or on oskware_bridge, idk honestly)", + "replayAlreadySaved": "Replay already saved", + "replayExpired": "Replay expired and not available anymore", + "replayRejected": "Third party API blocked your IP address" + }, + "countries(map)": { + "": "Worldwide", + + "AF": "Afghanistan", + "AX": "\u00c5land Islands", + "AL": "Albania", + "DZ": "Algeria", + "AS": "American Samoa", + "AD": "Andorra", + "AO": "Angola", + "AI": "Anguilla", + "AQ": "Antarctica", + "AG": "Antigua and Barbuda", + "AR": "Argentina", + "AM": "Armenia", + "AW": "Aruba", + "AU": "Australia", + "AT": "Austria", + "AZ": "Azerbaijan", + + "BS": "Bahamas", + "BH": "Bahrain", + "BD": "Bangladesh", + "BB": "Barbados", + "BY": "Belarus", + "BE": "Belgium", + "BZ": "Belize", + "BJ": "Benin", + "BM": "Bermuda", + "BT": "Bhutan", + "BO": "Bolivia, Plurinational State of", + "BA": "Bosnia and Herzegovina", + "BW": "Botswana", + "BV": "Bouvet Island", + "BR": "Brazil", + "IO": "British Indian Ocean Territory", + "BN": "Brunei Darussalam", + "BG": "Bulgaria", + "BF": "Burkina Faso", + "BI": "Burundi", + + "KH": "Cambodia", + "CM": "Cameroon", + "CA": "Canada", + "CV": "Cape Verde", + "BQ": "Caribbean Netherlands", + "KY": "Cayman Islands", + "CF": "Central African Republic", + "TD": "Chad", + "CL": "Chile", + "CN": "China", + "CX": "Christmas Island", + "CC": "Cocos (Keeling) Islands", + "CO": "Colombia", + "KM": "Comoros", + "CG": "Congo", + "CD": "Congo, the Democratic Republic of the", + "CK": "Cook Islands", + "CR": "Costa Rica", + "CI": "C\u00f4te d'Ivoire", + "HR": "Croatia", + "CU": "Cuba", + "CW": "Cura\u00e7ao", + "CY": "Cyprus", + "CZ": "Czech Republic", + + "DK": "Denmark", + "DJ": "Djibouti", + "DM": "Dominica", + "DO": "Dominican Republic", + + "EC": "Ecuador", + "EG": "Egypt", + "SV": "El Salvador", + "GB-ENG": "England", + "GQ": "Equatorial Guinea", + "ER": "Eritrea", + "EE": "Estonia", + "ET": "Ethiopia", + "EU": "Europe", + + "FK": "Falkland Islands (Malvinas)", + "FO": "Faroe Islands", + "FJ": "Fiji", + "FI": "Finland", + "FR": "France", + "GF": "French Guiana", + "PF": "French Polynesia", + "TF": "French Southern Territories", + + "GA": "Gabon", + "GM": "Gambia", + "GE": "Georgia", + "DE": "Germany", + "GH": "Ghana", + "GI": "Gibraltar", + "GR": "Greece", + "GL": "Greenland", + "GD": "Grenada", + "GP": "Guadeloupe", + "GU": "Guam", + "GT": "Guatemala", + "GG": "Guernsey", + "GN": "Guinea", + "GW": "Guinea-Bissau", + "GY": "Guyana", + + "HT": "Haiti", + "HM": "Heard Island and McDonald Islands", + "VA": "Holy See (Vatican City State)", + "HN": "Honduras", + "HK": "Hong Kong", + "HU": "Hungary", + + "IS": "Iceland", + "IN": "India", + "ID": "Indonesia", + "IR": "Iran, Islamic Republic of", + "IQ": "Iraq", + "IE": "Ireland", + "IM": "Isle of Man", + "IL": "Israel", + "IT": "Italy", + + "JM": "Jamaica", + "JP": "Japan", + "JE": "Jersey", + "JO": "Jordan", + + "KZ": "Kazakhstan", + "KE": "Kenya", + "KI": "Kiribati", + "KP": "Korea, Democratic People's Republic of", + "KR": "Korea, Republic of", + "XK": "Kosovo", + "KW": "Kuwait", + "KG": "Kyrgyzstan", + + "LA": "Lao People's Democratic Republic", + "LV": "Latvia", + "LB": "Lebanon", + "LS": "Lesotho", + "LR": "Liberia", + "LY": "Libya", + "LI": "Liechtenstein", + "LT": "Lithuania", + "LU": "Luxembourg", + + "MO": "Macao", + "MK": "Macedonia, the former Yugoslav Republic of", + "MG": "Madagascar", + "MW": "Malawi", + "MY": "Malaysia", + "MV": "Maldives", + "ML": "Mali", + "MT": "Malta", + "MH": "Marshall Islands", + "MQ": "Martinique", + "MR": "Mauritania", + "MU": "Mauritius", + "YT": "Mayotte", + "MX": "Mexico", + "FM": "Micronesia, Federated States of", + "MD": "Moldova, Republic of", + "MC": "Monaco", + "ME": "Montenegro", + "MA": "Morocco", + "MN": "Mongolia", + "MS": "Montserrat", + "MZ": "Mozambique", + "MM": "Myanmar", + + "NA": "Namibia", + "NR": "Nauru", + "NP": "Nepal", + "NL": "Netherlands", + "AN": "Netherlands Antilles", + "NC": "New Caledonia", + "NZ": "New Zealand", + "NI": "Nicaragua", + "NE": "Niger", + "NG": "Nigeria", + "NU": "Niue", + "NF": "Norfolk Island", + "GB-NIR": "Northern Ireland", + "MP": "Northern Mariana Islands", + "NO": "Norway", + + "OM": "Oman", + + "PK": "Pakistan", + "PW": "Palau", + "PS": "Palestine", + "PA": "Panama", + "PG": "Papua New Guinea", + "PY": "Paraguay", + "PE": "Peru", + "PH": "Philippines", + "PN": "Pitcairn", + "PL": "Poland", + "PT": "Portugal", + "PR": "Puerto Rico", + + "QA": "Qatar", + + "RE": "Réunion", + "RO": "Romania", + "RU": "Russian Federation", + "RW": "Rwanda", + + "BL": "Saint Barthélemy", + "SH": "Saint Helena, Ascension and Tristan da Cunha", + "KN": "Saint Kitts and Nevis", + "LC": "Saint Lucia", + "MF": "Saint Martin", + "PM": "Saint Pierre and Miquelon", + "VC": "Saint Vincent and the Grenadines", + "WS": "Samoa", + "SM": "San Marino", + "ST": "Sao Tome and Principe", + "SA": "Saudi Arabia", + "GB-SCT": "Scotland", + "SN": "Senegal", + "RS": "Serbia", + "SC": "Seychelles", + "SL": "Sierra Leone", + "SG": "Singapore", + "SX": "Sint Maarten (Dutch part)", + "SK": "Slovakia", + "SI": "Slovenia", + "SB": "Solomon Islands", + "SO": "Somalia", + "ZA": "South Africa", + "GS": "South Georgia and the South Sandwich Islands", + "SS": "South Sudan", + "ES": "Spain", + "LK": "Sri Lanka", + "SD": "Sudan", + "SR": "Suriname", + "SJ": "Svalbard and Jan Mayen Islands", + "SZ": "Swaziland", + "SE": "Sweden", + "CH": "Switzerland", + "SY": "Syrian Arab Republic", + + "TW": "Taiwan", + "TJ": "Tajikistan", + "TZ": "Tanzania, United Republic of", + "TH": "Thailand", + "TL": "Timor-Leste", + "TG": "Togo", + "TK": "Tokelau", + "TO": "Tonga", + "TT": "Trinidad and Tobago", + "TN": "Tunisia", + "TR": "Turkey", + "TM": "Turkmenistan", + "TC": "Turks and Caicos Islands", + "TV": "Tuvalu", + + "UG": "Uganda", + "UA": "Ukraine", + "AE": "United Arab Emirates", + "GB": "United Kingdom", + "US": "United States", + "UY": "Uruguay", + "UM": "US Minor Outlying Islands", + "UZ": "Uzbekistan", + + "VU": "Vanuatu", + "VE": "Venezuela, Bolivarian Republic of", + "VN": "Vietnam", + "VG": "Virgin Islands, British", + "VI": "Virgin Islands, U.S.", + + "GB-WLS": "Wales", + "WF": "Wallis and Futuna Islands", + "EH": "Western Sahara", + + "YE": "Yemen", + + "ZM": "Zambia", + "ZW": "Zimbabwe", + + "XX": "Unknown", + "XM": "The Moon" + } + } diff --git a/res/i18n/strings.i18n.json b/res/i18n/strings.i18n.json index 65505ed..901cc39 100644 --- a/res/i18n/strings.i18n.json +++ b/res/i18n/strings.i18n.json @@ -4,19 +4,67 @@ "ru": "Russian (Русский)", "zh-CN": "Simplified Chinese (简体中文)" }, - "tetraLeague": "Tetra League", - "tlRecords": "TL Records", - "history": "History", - "sprint": "40 Lines", - "blitz": "Blitz", - "recent": "Recent", - "recentRuns": "Recent runs", - "blitzScore": "$p points", - "openSPreplay": "Open replay in TETR.IO", - "downloadSPreplay": "Download replay", - "other": "Other", + "gamemodes":{ + "tl": "Tetra League", + "zenith": "Quick Play", + "zenithex": "Quick Play Expert", + "40l": "40 Lines", + "blitz": "Blitz", + "5mblast": "5,000,000 Blast" + }, + "destinations": { + "home": "Home", + "graphs": "Graphs", + "leaderboards": "Leaderboards", + "cutoffs": "Cutoffs", + "calc": "Calculator", + "info": "Info Center", + "data": "Saved Data", + "settings": "Settings" + }, + "goBackButton": "Go Back", + "nanow": "Not avaliable for now...", + "seasonEnds": "Season ends in ${countdown}", + "seasonEnded": "Season has ended", + "gamesUntilRanked": "${left} games until being ranked", + "numOfVictories": "~${wins} victories", + "promotionOnNextWin": "Promotion on next win", + "numOfdefeats": "~${losses} defeats", + "demotionOnNextLoss": "Demotion on next loss", + "records": "Records", + "nerdStats": "Nerd Stats", + "horoscopes": "Horoscopes", + "season": "Season", + "smooth": "Smooth", + "dateAndTime": "Date & Time", + "TLfullLBnote": "Heavy, but allows you to sort players by their stats and filter them by ranks", + "rank": "Rank", + "verdictGeneral": "$n $verdict of $rank rank avg", + "verdictBetter": "ahead", + "verdictWorse": "behind", + "localStanding": "local", + "xpProgressToNextLevel": "Progress to next level: $percentage", + "xpProgressTowardsGoal": "Progress from 0 XP to level $goal: $percentage ($left xp left)", + "gametime":{ + "title": "Exact gametime", + "gametimeAday": "$gametime a day in average", + "breakdown": "It's $years years,\nor $months months,\nor $days days,\nor$minutes minutes\nor $seconds seconds" + }, + "track": "Track", + "stopTracking": "Stop tracking", + "supporter": "Supporter tier ${tier}", + "comparingWith": "Data from ${newDate} comparing with ${oldDate}", + "compare": "Compare", + "comparison": "Comparison", + "general": "General", + "badges": "Badges", + "obtainDate": "Obtained ${date}", + "assignedManualy": "That badge was assigned manualy by TETR.IO admins", "distinguishment": "Distinguishment", - "zen": "Zen", + "bigRedBanned": "BANNED", + "normalBanned": "Banned", + "bigRedBadStanding": "BAD STANDING", + "copiedToClipboard": "Copied to clipboard!", "bio": "Bio", "news": "News", "newsParts":{ @@ -34,321 +82,18 @@ "supporterGiftStart": "Received the gift of ", "unknownNews": "Unknown news of type ${type}" }, - "openSearch": "Search player", - "closeSearch": "Close search", - "searchHint": "Nickname, ID or Discord userID (with \"ds:\" prefix)", - "refresh": "Refresh", - "fetchAndsaveTLHistory": "Get player history", - "fetchAndSaveOldTLmatches": "Get Tetra League matches history", - "fetchAndsaveTLHistoryResult": "${number} states was found", - "fetchAndSaveOldTLmatchesResult": "${number} matches was found", - "showStoredData": "Show stored data", - "statsCalc": "Stats Calculator", - "settings": "Settings", - "track": "Track", - "stopTracking": "Stop\ntracking", - "becameTracked": "Added to tracking list!", - "compare": "Compare", - "stoppedBeingTracked": "Removed from tracking list!", - "tlLeaderboard": "Tetra League leaderboard", - "noRecords": "No records", - "noOldRecords": { - "zero": "No records", - "one": "Only $n record", - "two": "Only $n records", - "few": "Only $n records", - "many": "Only $n records", - "other": "Only $n records" - }, - "noRecord": "No record", - "botRecord": "Bots are not allowed to set records", - "anonRecord": "Guests are not allowed to set records", - "notEnoughData": "Not enough data", - "noHistorySaved": "No history saved", - "pseudoTooltipHeaderInit": "Hover over point", - "pseudoTooltipFooterInit": "to see detailed data", - "obtainDate": "Obtained ${date}", - "fetchDate": "Fetched ${date}", - "exactGametime": "Exact gametime", - "bigRedBanned": "BANNED", - "normalBanned": "Banned", - "bigRedBadStanding": "BAD STANDING", - "copiedToClipboard": "Copied to clipboard!", - "playerRoleAccount": " account ", - "wasFromBeginning": "that was from very beginning", - "created": "created", - "botCreatedBy": "by", - "notSupporter": "Not a supporter", - "assignedManualy": "That badge was assigned manualy by TETR.IO admins", - "supporter": "Supporter tier ${tier}", - "comparingWith": "Data from ${newDate} comparing with ${oldDate}", + "copyUserID": "Click to copy user ID", + "searchHint": "Username or ID", + "searchButton": "Search", + "trackedPlayers": "Tracked Players", + "standing": "Standing", + "previousSeasons": "Previous Seasons", + "recent": "Recent", "top": "Top", - "topRank": "Top rank", - "verdictGeneral": "$n $verdict $rank rank avg", - "verdictBetter": "better", - "verdictWorse": "worse", - "smooth": "Smooth", - "postSeason": "Off-season", - "seasonStarts": "Season starts in:", - "nanow": "Not avaliable for now...", - "seasonEnds": "Season ends in ${countdown}", - "seasonEnded": "Season has ended", - "gamesUntilRanked": "${left} games until being ranked", - "numOfVictories": "~${wins} victories", - "promotionOnNextWin": "Promotion on next win", - "numOfdefeats": "~${losses} defeats", - "demotionOnNextLoss": "Demotion on next loss", - "nerdStats": "Nerd Stats", - "playersYouTrack": "Players you track", - "formula": "Formula", - "exactValue": "Exact value", - "neverPlayedTL": "That user never played Tetra League", - "botTL": "Bots are not allowed to play Tetra League", - "anonTL": "Guests are not allowed to play Tetra League", - "quickPlay": "Quick Play", - "expert": "Expert", - "withMods": "With mods", - "withModsPlural":{ - "zero": "with $n mods", - "one": "with $n mod", - "two": "with $n mods", - "few": "with $n mods", - "many": "with $n mods", - "other": "with $n mods" - }, - "exportDB": "Export local database", - "exportDBDescription": "It contains states and Tetra League records of the tracked players and list of tracked players.", - "desktopExportAlertTitle": "Desktop export", - "desktopExportText": "It seems like you using this app on desktop. Check your documents folder, you should find \"TetraStats.db\". Copy it somewhere", - "androidExportAlertTitle": "Android export", - "androidExportText": "Exported.\n${exportedDB}", - "importDB": "Import local database", - "importDBDescription": "Restore your backup. Notice that already stored database will be overwritten.", - "importWrongFileType": "Wrong file type", - "importCancelled": "Operation was cancelled", - "importSuccess": "Import successful", - "yourID": "Your TETR.IO account", - "yourIDAlertTitle": "Your nickname in TETR.IO", - "yourIDText": "When app loads, it will retrieve data for this account", - "language": "Language", - "updateInBackground": "Update stats in the background", - "updateInBackgroundDescription": "While Tetra Stats is running, it can update stats of the current player when cache expires", - "customization": "Customization", - "customizationDescription": "Change appearance of different things in Tetra Stats UI", - "oskKagari": "Osk Kagari gimmick", - "oskKagariDescription": "If on, osk's rank on main view will be rendered as :kagari:", - "AccentColor": "Accent color", - "AccentColorDescription": "Almost all interactive UI elements highlighted with this color", - "timestamps": "Timestamps", - "timestampsDescription": "You can choose, in which way timestamps shows time", - "timestampsAbsoluteGMT": "Absolute (GMT)", - "timestampsAbsoluteLocalTime": "Absolute (Your timezone)", - "timestampsRelative": "Relative", - "rating": "Main representation of rating", - "ratingDescription": "TR is not linear, while Glicko does not have boundaries and percentile is volatile", - "ratingLBposition": "LB position", - "sheetbotGraphs": "Sheetbot-like behavior for radar graphs", - "sheetbotGraphsDescription": "If on, points on the graphs can appear on the opposite half of the graph if value is negative", - "lbStats": "Show leaderboard based stats", - "lbStatsDescription": "That will impact on loading times, but will allow you to see position on LB by stats and comparison with average values", - "aboutApp": "About app", - "aboutAppText": "${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r\nTETR.IO replay grabber API by szy", - "stateViewTitle": "${nickname} account on ${date}", - "statesViewTitle": "${number} states of ${nickname} account", - "matchesViewTitle": "${nickname} TL matches", - "statesViewEntry": "${level} TR, ${glicko}±${rd} Glicko, ${games} игр сыграно", - "stateRemoved": "${date} state was removed from database!", - "matchRemoved": "${date} match was removed from database!", - "viewAllMatches": "View all matches", - "trackedPlayersViewTitle": "Stored data", - "trackedPlayersZeroEntrys": "Empty list. Press \"Track\" button in previous view to add current player here", - "trackedPlayersOneEntry": "There is only one player", - "trackedPlayersManyEntrys": "There are ${numberOfPlayers} players", - "trackedPlayersEntry": "${nickname}: ${numberOfStates} states", - "trackedPlayersDescription": "From ${firstStateDate} until ${lastStateDate}", - "trackedPlayersStatesDeleted": "${nickname} states was removed from database!", - "duplicatedFix": "Remove duplicated TL mathces", - "compressDB": "Compress DB", - "SpaceSaved": "Space saved: ${size}", - "averageXrank": "Average ${rankLetter} rank", - "vs": "vs", - "inTLmatch": "in TL match", - "downloadReplay": "Download .ttrm replay", - "openReplay": "Open replay in TETR.IO", - "replaySaved": "Replay saved to ${path}", - "match": "Match", - "timeWeightedmatch": "Match (time-weighted)", - "roundNumber": "Round $n", - "statsFor": "Stats for", - "numberOfRounds": "Number of rounds", - "matchLength": "Match Length", - "roundLength": "Round Length", - "matchStats": "Match stats", - "timeWeightedmatchStats": "Time-weighted match stats", - "replayIssue": "Can't process replay", - "matchIsTooOld": "Replay is not available", - "winner": "Winner", - "registred": "Registred", - "playedTL": "Played Tetra League", - "winChance": "Win Chance", - "byGlicko": "By Glicko", - "byEstTR": "By Est. TR", - "compareViewNoValues": "Please, enter username, user ID, APM-PPS-VS values (divider doesn't matter, only order matter) or $avgR (where R is rank) to both fields", - "compareViewWrongValue": "Falied to assign ${value}", - "mostRecentOne": "Most recent one", - "yes": "Yes", - "no": "No", - "daysLater": "days later", - "dayseBefore": "days before", - "fromBeginning": "From beginning", - "calc": "Calc", - "calcViewNoValues": "Enter values to calculate the stats", - "rankAveragesViewTitle": "Ranks cutoffs", - "sprintAndBlitsViewTitle": "40 lines and Blitz averages", - "sprintAndBlitsRelevance": "Relevance: ${date}", - "rank": "Rank", - "averages": "Averages", - "lbViewZeroEntrys": "Empty list", - "lbViewOneEntry": "There is only one player", - "lbViewManyEntrys": "There are ${numberOfPlayers}", - "everyoneAverages": "Values for leaderboard", - "sortBy": "Sort by", - "reversed": "Reversed", - "country": "Country", - "rankAverages": "Values for $rank rank", - "players":{ - "zero": "$n players", - "one": "$n player", - "two": "$n players", - "few": "$n players", - "many": "$n players", - "other": "$n players" - }, - "games": { - "zero": "$n games", - "one": "$n game", - "two": "$n games", - "few": "$n games", - "many": "$n games", - "other": "$n games" - }, - "gamesPlayed": "$games played", - "chart": "Chart", - "entries": "Entries", - "minimums": "Minimums", - "maximums": "Maximums", - "lowestValues": "Lowest Values", - "averageValues": "Average Values", - "highestValues": "Highest Values", - "forPlayer": "for player $username", - "currentAxis": "$axis axis:", - "p1nkl0bst3rAlert": "That data was retrived from third party API maintained by p1nkl0bst3r", - "notForWeb": "Function is not available for web version", - "graphs": { - "attack": "Attack", - "speed": "Speed", - "defense": "Defense", - "cheese": "Cheese" - }, - "statCellNum":{ - "xpLevel": "XP Level", - "xpProgress": "Progress to next level", - "xpFrom0ToLevel": "Progress from 0 XP to level $n", - "xpLeft": "XP left", - "hoursPlayed": "Hours\nPlayed", - "onlineGames": "Online\nGames", - "gamesWon": "Games\nWon", - "totalGames": "Total Games Played", - "totalWon": "Total Games Won", - "friends": "Friends", - "apm": "Attack\nPer Minute", - "vs": "Versus\nScore", - "recordLB": "Leaderboard placement", - "lbp": "Leaderboard\nplacement", - "lbpShort": "№ in LB", - "lbpc": "Country LB\nplacement", - "lbpcShort": "№ in local LB", - "gamesPlayed": "Games\nplayed", - "gamesWonTL": "Games\nWon", - "winrate": "Winrate", - "level": "Level", - "score": "Score", - "spp": "Score\nPer Piece", - "pieces": "Pieces\nPlaced", - "pps": "Pieces\nPer Second", - "finesseFaults": "Finesse\nFaults", - "finessePercentage": "Finesse\nPercentage", - "keys": "Key\nPresses", - "kpp": "KP Per\nPiece", - "kps": "KP Per\nSecond", - "tr": "Tetra Rating", - "rd": "Rating Deviation", - "app": "Attack Per Piece", - "appDescription": "(Abbreviated as APP) Main efficiency metric. Tells how many attack you producing per piece", - "vsapmDescription": "Basically, tells how much and how efficient you using garbage in your attacks", - "dss": "Downstack\nPer Second", - "dssDescription": "(Abbreviated as DS/S) Downstack per Second measures how many garbage lines you clear in a second.", - "dsp": "Downstack\nPer Piece", - "dspDescription": "(Abbreviated as DS/P) Downstack per Piece measures how many garbage lines you clear per piece.", - "appdsp": "APP + DS/P", - "appdspDescription": "Just a sum of Attack per Piece and Downstack per Piece.", - "cheese": "Cheese\nIndex", - "cheeseDescription": "(Abbreviated as Cheese) Cheese Index is an approximation how much clean / cheese garbage player sends. Lower = more clean. Higher = more cheese.\nInvented by kerrmunism", - "gbe": "Garbage\nEfficiency", - "gbeDescription": "(Abbreviated as Gb Eff.) Garbage Efficiency measures how well player uses their garbage. Higher = better or they use their garbage more. Lower = they mostly send their garbage back at cheese or rarely clear garbage.\nInvented by Zepheniah and Dragonboy.", - "nyaapp": "Weighted\nAPP", - "nyaappDescription": "(Abbreviated as wAPP) Essentially, a measure of your ability to send cheese while still maintaining a high APP.\nInvented by Wertj.", - "area": "Area", - "areaDescription": "How much space your shape takes up on the graph, if you exclude the cheese and vs/apm sections", - "estOfTR": "Estimated TR", - "estOfTRShort": "Est. TR", - "accOfEst": "Accuracy", - "accOfEstShort": "Acc." - }, - "playerRole(map)": { - "user": "User", - "banned": "Banned", - "bot": "Bot", - "sysop": "System operator", - "admin": "Admin", - "mod": "Moderator", - "halfmod": "Community moderator", - "anon": "Anonymous" - }, - "numOfGameActions":{ - "pc": "All Clears", - "hold": "Holds", - "inputs": { - "zero": "$n key presses", - "one": "$n key press", - "two": "$n key presses", - "few": "$n key presses", - "many": "$n key presses", - "other": "$n key presses" - }, - "tspinsTotal": { - "zero": "$n T-spins total", - "one": "$n T-spin total", - "two": "$n T-spins total", - "few": "$n T-spins total", - "many": "$n T-spins total", - "other": "$n T-spins total" - }, - "lineClears": { - "zero": "$n lines cleared", - "one": "$n line cleared", - "two": "$n lines cleared", - "few": "$n lines cleared", - "many": "$n lines cleared", - "other": "$n lines cleared" - } - }, - "popupActions":{ - "cancel": "Cancel", - "submit": "Submit", - "ok": "OK" - }, - "errors":{ + "errors": { + "noRecords": "No records", + "notEnoughData": "Not enough data", + "noHistorySaved": "No history saved", "connection": "Some issue with connection: ${code} ${message}", "noSuchUser": "No such user", "noSuchUserSub": "Either you mistyped something, or the account no longer exists", @@ -376,6 +121,283 @@ "replayExpired": "Replay expired and not available anymore", "replayRejected": "Third party API blocked your IP address" }, + "actions":{ + "cancel": "Cancel", + "submit": "Submit", + "ok": "OK", + "refresh": "Refresh" + }, + "cutoffsDestination": { + "title": "Tetra League State", + "relevance": "as of $timestamp", + "actual": "Actual", + "target": "Target", + "cutoffTR": "Cutoff TR", + "targetTR": "Target TR", + "state": "State", + "advanced": "Advanced", + "players": "Players ($n)", + "moreInfo": "More Info", + "NumberOne": "№ 1 is $tr TR", + "inflated": "Inflated on $tr TR", + "deflated": "Deflated on $tr TR", + "wellDotDotDot": "Well...", + "fromPlace": "from № $n", + "viewButton": "View" + }, + "rankView":{ + "rankTitle": "$rank rank data", + "everyoneTitle": "Entire leaderboard", + "trRange": "TR Range", + "supposedToBe": "Supposed to be", + "gap": "$value gap", + "deflationGap": "Deflation gap", + "inflationGap": "Inflation gap", + "LBposRange": "LB pos range", + "overpopulated": "Overpopulated by a $players", + "underpopulated": "Underpopulated by a $players", + "PlayersEqualSupposedToBe": "cute", + "avgStats": "Average Stats", + "avgNerdStats": "Average Nerd Stats", + "minimums": "Minimums", + "maximums": "Maximums" + }, + "calcDestination": { + "tip": "Enter values and press \"Calc\" to see Nerd Stats for them" + }, + "homeNavigation": { + "overview": "Overview", + "standing": "Standing", + "seasons": "Seasons", + "mathces": "Matches", + "pb": "PB", + "normal": "Normal", + "expert": "Expert", + "expertRecords": "Ex Records" + }, + "graphsNavigation": { + "history": "Player History", + "league": "League State", + "cutoffs": "Cutoffs History" + }, + "calcNavigation": { + "stats": "Stats Calculator", + "damage": "Damage Calculator" + }, + "stats": { + "tr": { + "short": "TR", + "full": "Tetra Rating" + }, + "glicko": { + "short": "Glicko", + "full": "Glicko" + }, + "rd":{ + "short": "RD", + "full": "Rating Deviation" + }, + "glixare": { + "short": "GXE", + "full": "GLIXARE" + }, + "gp":{ + "short": "GP", + "full": "Games Played" + }, + "gw":{ + "short": "GW", + "full": "Games Won" + }, + "winrate":{ + "short": "WR%", + "full": "Win Rate" + }, + "apm":{ + "short": "APM", + "full": "Attack Per Minute" + }, + "pps":{ + "short": "PPS", + "full": "Pieces Per Second" + }, + "vs":{ + "short": "VS", + "full": "Versus Score" + }, + "app":{ + "short": "APP", + "full": "Attack Per Piece" + }, + "dss":{ + "short": "DS/S", + "full": "Downstack Per Second" + }, + "dsp":{ + "short": "DS/P", + "full": "Downstack Per Piece" + }, + "cheese":{ + "short": "Cheese", + "full": "Cheese Index" + }, + "gbe":{ + "short": "GbE", + "full": "Garbage Efficiency" + }, + "nyaapp":{ + "short": "wAPP", + "full": "Weigente APP" + }, + "area":{ + "short": "Area", + "full": "Area" + }, + "etr":{ + "short": "eTR", + "full": "Estimated TR" + }, + "etracc":{ + "short": "±eTR", + "full": "Accuracy of Estimated TR" + }, + "opener":{ + "short": "Opener", + "full": "Opener" + }, + "plonk":{ + "short": "Plonk", + "full": "Plonk" + }, + "stride":{ + "short": "Stride", + "full": "Stride" + }, + "infds":{ + "short": "Inf. DS", + "full": "Infinite Downstack" + }, + "altitude": { + "short": "m", + "full": "Altitude" + }, + "climbSpeed": { + "short": "CSP", + "full": "Climb Speed", + "gaugetTitle": "Climb\nSpeed" + }, + "peakClimbSpeed": { + "short": "Peak CSP", + "full": "Peak Climb Speed", + "gaugetTitle": "Peak" + }, + "kos": { + "short": "KO's", + "full": "Knockouts" + }, + "b2b":{ + "short": "B2B", + "full": "Back-To-Back" + }, + "finesse":{ + "short": "F", + "full": "Finesse", + "widgetTitle": "inesse" + }, + "totalTime":{ + "short": "Time", + "full": "Total Time", + "widgetTitle": "otal Time" + }, + "level": { + "short": "Lvl", + "full": "Level" + }, + "spike": "Top Spike", + "top": "Top $percentage", + "topRank": "Top rank: $rank", + "floor": "Floor", + "split": "Split", + "total": "Total", + "qpWithMods(plural)": { + "one": "With 1 mod", + "two": "With $n mods", + "few": "With $n mods", + "many": "With $n mods", + "other": "With $n mods" + }, + "inputs(plural)": { + "zero": "$n key presses", + "one": "$n key press", + "two": "$n key presses", + "few": "$n key presses", + "many": "$n key presses", + "other": "$n key presses" + }, + "tspinsTotal(plural)": { + "zero": "$n T-spins total", + "one": "$n T-spin total", + "two": "$n T-spins total", + "few": "$n T-spins total", + "many": "$n T-spins total", + "other": "$n T-spins total" + }, + "lineClears(plural)": { + "zero": "$n lines cleared", + "one": "$n line cleared", + "two": "$n lines cleared", + "few": "$n lines cleared", + "many": "$n lines cleared", + "other": "$n lines cleared" + }, + "graphs": { + "attack": "Attack", + "speed": "Speed", + "defense": "Defense", + "cheese": "Cheese" + }, + "players(plural)":{ + "zero": "$n players", + "one": "$n player", + "two": "$n players", + "few": "$n players", + "many": "$n players", + "other": "$n players" + }, + "games(plural)": { + "zero": "$n games", + "one": "$n game", + "two": "$n games", + "few": "$n games", + "many": "$n games", + "other": "$n games" + }, + "lineClears(map)": { + "single": "Single", + "double": "Double", + "triple": "Triple", + "quad": "Quad", + "penta": "Penta", + "hexa": "Hexa", + "hepta": "Hepta", + "octa": "Octa", + "ennea": "Ennea", + "deca": "Deca", + "hendeca": "Hendeca", + "dodeca": "Dodeca", + "triadeca": "Triadeca", + "tessaradeca": "Tessaradeca", + "pentedeca": "Pentedeca", + "hexadeca": "Hexadeca", + "heptadeca": "Heptadeca", + "octadeca": "Octadeca", + "enneadeca": "Enneadeca", + "eicosa": "Eicosa", + "kagaris": "Kagaris" + }, + "tSpin": "T-spin", + "spin": "Spin" + }, "countries(map)": { "": "Worldwide",