From a42a2b93de9d599e70dbf5a78207bc8cd354ee8c Mon Sep 17 00:00:00 2001 From: dan63047 Date: Wed, 12 Feb 2025 17:38:18 +0300 Subject: [PATCH] korean locale got implemented + some localization fixes --- README.md | 1 + debian/debian.yaml | 2 +- debian/gui/tetra-stats.desktop | 2 +- lib/gen/strings.g.dart | 2447 ++++++++++++++++++++++++++- lib/views/about_view.dart | 12 +- lib/views/destination_home.dart | 2 +- lib/views/destination_settings.dart | 2 +- lib/widgets/finesse_thingy.dart | 2 +- lib/widgets/user_thingy.dart | 2 +- pubspec.yaml | 2 +- res/i18n/strings.i18n.json | 2 + res/i18n/strings_de-DE.i18n.json | 2 + res/i18n/strings_ko-KR.i18n.json | 933 ++++++++++ res/i18n/strings_ru-RU.i18n.json | 4 +- res/i18n/strings_zh-CN.i18n.json | 32 +- web/index.html | 2 +- 16 files changed, 3383 insertions(+), 66 deletions(-) create mode 100644 res/i18n/strings_ko-KR.i18n.json diff --git a/README.md b/README.md index a47b9d9..c0665e1 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ You can [download an app](https://github.com/dan63047/TetraStats/releases), or [ - **p1nkl0bst3r** — providing players history and peak TR - **neko_ab4093** — Simplified Chinese localization - **founntain** — German localization +- **Tau, ctpw, PyHoKxvx, muqhc, xantho, mazohu, CEL_ESTIAL, pensil** — Korean localization - **osk** and his team — TETR.IO ## Legal notes diff --git a/debian/debian.yaml b/debian/debian.yaml index 366cf5b..af5463f 100644 --- a/debian/debian.yaml +++ b/debian/debian.yaml @@ -6,7 +6,7 @@ flutter_app: control: Package: tetra-stats - Version: 2.0.4 + Version: 2.0.6 Architecture: amd64 Essential: no Priority: optional diff --git a/debian/gui/tetra-stats.desktop b/debian/gui/tetra-stats.desktop index 976c9b1..e16a7b9 100644 --- a/debian/gui/tetra-stats.desktop +++ b/debian/gui/tetra-stats.desktop @@ -1,5 +1,5 @@ [Desktop Entry] -Version=2.0.4 +Version=2.0.6 Name=Tetra Stats GenericName=Tetra Stats Comment=Track your and other player stats in TETR.IO diff --git a/lib/gen/strings.g.dart b/lib/gen/strings.g.dart index f9d0947..5190dc5 100644 --- a/lib/gen/strings.g.dart +++ b/lib/gen/strings.g.dart @@ -3,10 +3,10 @@ /// Original: res/i18n /// To regenerate, run: `dart run slang` /// -/// Locales: 4 -/// Strings: 3068 (767 per locale) +/// Locales: 5 +/// Strings: 3845 (769 per locale) /// -/// Built on 2025-02-10 at 21:23 UTC +/// Built on 2025-02-12 at 14:03 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -27,6 +27,7 @@ const AppLocale _baseLocale = AppLocale.en; enum AppLocale with BaseAppLocale { en(languageCode: 'en', build: Translations.build), deDe(languageCode: 'de', countryCode: 'DE', build: _StringsDeDe.build), + koKr(languageCode: 'ko', countryCode: 'KR', build: _StringsKoKr.build), ruRu(languageCode: 'ru', countryCode: 'RU', build: _StringsRuRu.build), zhCn(languageCode: 'zh', countryCode: 'CN', build: _StringsZhCn.build); @@ -153,6 +154,7 @@ class Translations implements BaseTranslations { Map get locales => { 'en': 'English', 'ru-RU': 'Russian (Русский)', + 'ko-KR': 'Korean (한국인)', 'zh-CN': 'Simplified Chinese (简体中文)', 'de-DE': 'German (Deutsch)', }; @@ -1023,6 +1025,7 @@ class _StringsAboutViewEn { String get inoue => 'Inoue (replay grabber)'; String get zhCNlocale => 'Simplfied Chinese locale'; String get deDElocale => 'German locale'; + String get koKRlocale => 'Korean locale'; String get supportHim => 'Support him!'; } @@ -1695,6 +1698,7 @@ class _StringsDeDe implements Translations { @override Map get locales => { 'en': 'Englisch', 'ru-RU': 'Russisch (Русский)', + 'ko-KR': 'Koreanisch (한국인)', 'zh-CN': 'Vereinfachtes Chinesisch (简体中文)', 'de-DE': 'German (Deutsch)', }; @@ -2564,6 +2568,7 @@ class _StringsAboutViewDeDe implements _StringsAboutViewEn { @override String get inoue => 'Inoue (Wiederholungsschnapper)'; @override String get zhCNlocale => 'Vereinfachtes Chinesisch Übersetzung'; @override String get deDElocale => 'Deutsche Übersetzung'; + @override String get koKRlocale => 'Korean locale'; @override String get supportHim => 'Unterstütze Ihn!'; } @@ -3209,6 +3214,1549 @@ class _StringsStatsLineClearsDeDe implements _StringsStatsLineClearsEn { @override String get penta => 'Pentas'; } +// Path: +class _StringsKoKr implements Translations { + /// You can call this constructor and build your own translation instance of this locale. + /// Constructing via the enum [AppLocale.build] is preferred. + _StringsKoKr.build({Map? overrides, PluralResolver? cardinalResolver, PluralResolver? ordinalResolver}) + : assert(overrides == null, 'Set "translation_overrides: true" in order to enable this feature.'), + $meta = TranslationMetadata( + locale: AppLocale.koKr, + overrides: overrides ?? {}, + cardinalResolver: cardinalResolver, + ordinalResolver: ordinalResolver, + ) { + $meta.setFlatMapFunction(_flatMapFunction); + } + + /// Metadata for the translations of . + @override final TranslationMetadata $meta; + + /// Access flat map + @override dynamic operator[](String key) => $meta.getTranslation(key); + + @override late final _StringsKoKr _root = this; // ignore: unused_field + + // Translations + @override Map get locales => { + 'en': '영어 (English)', + 'ru-RU': '러시아어 (Русский)', + 'ko-KR': '한국어', + 'zh-CN': '중국어 간체 (简体中文)', + 'de-DE': '독일어 (Deutsch)', + }; + @override Map get gamemodes => { + 'league': '테트라 리그', + 'zenith': '퀵 플레이', + 'zenithex': '전문가용 퀵 플레이', + '40l': '40라인', + 'blitz': '블리츠', + '5mblast': '5,000,000 블라스트', + 'zen': '젠', + }; + @override late final _StringsDestinationsKoKr destinations = _StringsDestinationsKoKr._(_root); + @override Map get playerRole => { + 'user': '사용자', + 'banned': '밴', + 'bot': '봇', + 'sysop': '시스템 운영자', + 'admin': '관리자', + 'mod': '운영자', + 'halfmod': '커뮤니티 운영자', + 'anon': '익명', + }; + @override String get goBackButton => '뒤로'; + @override String get nanow => '지금은 사용할 수 없습니다...'; + @override String seasonEnds({required Object countdown}) => '시즌이 ${countdown} 뒤에 종료됩니다'; + @override String get seasonEnded => '시즌이 종료되었습니다'; + @override String overallPB({required Object pb}) => '개인 최고 기록: ${pb} m'; + @override String gamesUntilRanked({required Object left}) => '랭크를 얻으려면 ${left}판을 더 플레이하세요'; + @override String numOfVictories({required Object wins}) => '~${wins}승'; + @override String get promotionOnNextWin => '승리 시 승급'; + @override String numOfdefeats({required Object losses}) => '~${losses}패'; + @override String get demotionOnNextLoss => '패배 시 강등'; + @override String get records => '기록'; + @override String get nerdStats => '세부 스탯'; + @override String get playstyles => '플레이스타일'; + @override String get horoscopes => '천궁도'; + @override String get relatedAchievements => '관련 업적'; + @override String get season => '시즌'; + @override String get smooth => '부드러운'; + @override String get dateAndTime => '날짜 / 시간'; + @override String get TLfullLBnote => '용량이 크지만, 플레이어들을 스탯으로 줄세우거나 랭크로 걸러낼 수 있게 해 줍니다'; + @override String get rank => '랭크'; + @override String verdictGeneral({required Object rank, required Object n, required Object verdict}) => '${rank} 평균보다 ${n} ${verdict}'; + @override String get verdictBetter => '앞섬'; + @override String get verdictWorse => '뒤쳐짐'; + @override String get localStanding => '국가 순위'; + @override late final _StringsXpKoKr xp = _StringsXpKoKr._(_root); + @override late final _StringsGametimeKoKr gametime = _StringsGametimeKoKr._(_root); + @override String get track => '추적하기'; + @override String get stopTracking => '추적 취소하기'; + @override String supporter({required Object tier}) => '서포터 ${tier}티어'; + @override String comparingWith({required Object oldDate, required Object newDate}) => '${oldDate} 와 ${newDate} 의 데이터를 비교 중'; + @override String get compare => '비교하기'; + @override String get comparison => '비교'; + @override String get enterUsername => '입력하세요: 닉네임 혹은 \$avgX (X는 랭크를 의미)'; + @override String get general => '일반'; + @override String get badges => '배지들'; + @override String obtainDate({required Object date}) => '${date}에 얻음'; + @override String get assignedManualy => '이 배지는 TETR.IO 관리자에 의해 부여되었습니다'; + @override String get distinguishment => '타이틀'; + @override String get banned => '밴'; + @override String get bannedSubtext => 'TETR.IO 약관이나 규칙을 어기면 밴이 조치됩니다'; + @override String get badStanding => '나쁜 평판'; + @override String get badStandingSubtext => '최소 한 번 밴을 당한 기록이 있습니다'; + @override String get botAccount => '봇 계정'; + @override String botAccountSubtext({required Object botMaintainers}) => '${botMaintainers}에 의해 운영됨'; + @override String get copiedToClipboard => '클립보드에 복사되었습니다!'; + @override String get bio => '자기소개'; + @override String get news => '뉴스'; + @override late final _StringsMatchResultKoKr matchResult = _StringsMatchResultKoKr._(_root); + @override late final _StringsDistinguishmentsKoKr distinguishments = _StringsDistinguishmentsKoKr._(_root); + @override late final _StringsNewsEntriesKoKr newsEntries = _StringsNewsEntriesKoKr._(_root); + @override String rankupMiddle({required Object r}) => '${r} 랭크'; + @override String get copyUserID => '클릭하여 유저 ID를 복사'; + @override String get searchHint => '닉네임 또는 ID'; + @override String get navMenu => '탐색 메뉴'; + @override String get navMenuTooltip => '메뉴 열기'; + @override String get refresh => '정보 새로고침'; + @override String get searchButton => '검색'; + @override String get trackedPlayers => '추적된 플레이어들'; + @override String get standing => '순위'; + @override String get previousSeasons => '이전 시즌들'; + @override String get recent => '최근'; + @override String get top => '상위'; + @override String get noRecord => '기록 없음'; + @override String sprintAndBlitsRelevance({required Object date}) => '관련성: ${date}'; + @override late final _StringsSnackBarMessagesKoKr snackBarMessages = _StringsSnackBarMessagesKoKr._(_root); + @override late final _StringsErrorsKoKr errors = _StringsErrorsKoKr._(_root); + @override late final _StringsActionsKoKr actions = _StringsActionsKoKr._(_root); + @override late final _StringsGraphsDestinationKoKr graphsDestination = _StringsGraphsDestinationKoKr._(_root); + @override late final _StringsFilterModaleKoKr filterModale = _StringsFilterModaleKoKr._(_root); + @override late final _StringsCutoffsDestinationKoKr cutoffsDestination = _StringsCutoffsDestinationKoKr._(_root); + @override late final _StringsRankViewKoKr rankView = _StringsRankViewKoKr._(_root); + @override late final _StringsStateViewKoKr stateView = _StringsStateViewKoKr._(_root); + @override late final _StringsTlMatchViewKoKr tlMatchView = _StringsTlMatchViewKoKr._(_root); + @override late final _StringsCalcDestinationKoKr calcDestination = _StringsCalcDestinationKoKr._(_root); + @override late final _StringsInfoDestinationKoKr infoDestination = _StringsInfoDestinationKoKr._(_root); + @override late final _StringsLeaderboardsDestinationKoKr leaderboardsDestination = _StringsLeaderboardsDestinationKoKr._(_root); + @override late final _StringsSavedDataDestinationKoKr savedDataDestination = _StringsSavedDataDestinationKoKr._(_root); + @override late final _StringsSettingsDestinationKoKr settingsDestination = _StringsSettingsDestinationKoKr._(_root); + @override late final _StringsHomeNavigationKoKr homeNavigation = _StringsHomeNavigationKoKr._(_root); + @override late final _StringsGraphsNavigationKoKr graphsNavigation = _StringsGraphsNavigationKoKr._(_root); + @override late final _StringsCalcNavigationKoKr calcNavigation = _StringsCalcNavigationKoKr._(_root); + @override late final _StringsFirstTimeViewKoKr firstTimeView = _StringsFirstTimeViewKoKr._(_root); + @override late final _StringsAboutViewKoKr aboutView = _StringsAboutViewKoKr._(_root); + @override late final _StringsStatsKoKr stats = _StringsStatsKoKr._(_root); + @override Map get countries => { + '': '전 세계', + 'AF': '아프가니스탄', + 'AX': '올란드 제도', + 'AL': '알바니아', + 'DZ': '알제리', + 'AS': '미국령 사모아', + 'AD': '안도라', + 'AO': '앙골라', + 'AI': '앵귈라', + 'AQ': '남극', + 'AG': '앤티가 바부다', + 'AR': '아르헨티나', + 'AM': '아르메니아', + 'AW': '아루바', + 'AU': '호주', + 'AT': '오스트리아', + 'AZ': '아제르바이잔', + 'BS': '바하마', + 'BH': '바레인', + 'BD': '방글라데시', + 'BB': '바베이도스', + 'BY': '벨라루스', + 'BE': '벨기에', + 'BZ': '벨리즈', + 'BJ': '베냉', + 'BM': '버뮤다', + 'BT': '부탄', + 'BO': '볼리비아', + 'BA': '보스니아 헤르체고비나', + 'BW': '보츠와나', + 'BV': '부베섬', + 'BR': '브라질', + 'IO': '영국령 인도양 지역', + 'BN': '브루나이', + 'BG': '불가리아', + 'BF': '부르키나파소', + 'BI': '부룬디', + 'KH': '캄보디아', + 'CM': '카메룬', + 'CA': '캐나다', + 'CV': '카보베르데', + 'BQ': '네덜란드령 카리브섬', + 'KY': '케이맨 제도', + 'CF': '중앙아프리카 공화국', + 'TD': '차드', + 'CL': '칠레', + 'CN': '중국', + 'CX': '크리스마스섬', + 'CC': '코코스(킬링)제도', + 'CO': '콜롬비아', + 'KM': '코모로', + 'CG': '콩고', + 'CD': '콩고 민주 공화국', + 'CK': '쿡 제도', + 'CR': '코스타리카', + 'CI': '코트디부아르', + 'HR': '크로아티아', + 'CU': '쿠바', + 'CW': '퀴라소', + 'CY': '키프로스', + 'CZ': '체코', + 'DK': '덴마크', + 'DJ': '지부티', + 'DM': '도미니카', + 'DO': '도미니카 공화국', + 'EC': '에콰도르', + 'EG': '이집트', + 'SV': '엘살바도르', + 'GB-ENG': '잉글랜드', + 'GQ': '적도 기니', + 'ER': '에리트레아', + 'EE': '에스토니아', + 'ET': '에티오피아', + 'EU': '유럽 연합', + 'FK': '포클랜드 제도', + 'FO': '페로 제도', + 'FJ': '피지', + 'FI': '핀란드', + 'FR': '프랑스', + 'GF': '프랑스령 기아나', + 'PF': '프랑스령 폴리네시아', + 'TF': '프랑스령 남방', + 'GA': '가봉', + 'GM': '감비아', + 'GE': '조지아', + 'DE': '독일', + 'GH': '가나', + 'GI': '지브롤터', + 'GR': '그리스', + 'GL': '그린란드', + 'GD': '그레나다', + 'GP': '과들루프', + 'GU': '괌', + 'GT': '과테말라', + 'GG': '건지섬', + 'GN': '기니', + 'GW': '기니비사우', + 'GY': '가이아나', + 'HT': '아이티', + 'HM': '허드 맥도널드 제도', + 'VA': '교황청 (바티칸 시국)', + 'HN': '온두라스', + 'HK': '홍콩', + 'HU': '헝가리', + 'IS': '아이슬란드', + 'IN': '인도', + 'ID': '인도네시아', + 'IR': '이란', + 'IQ': '이라크', + 'IE': '아일랜드', + 'IM': '맨섬', + 'IL': '이스라엘', + 'IT': '이탈리아', + 'JM': '자메이카', + 'JP': '일본', + 'JE': '저지섬', + 'JO': '요르단', + 'KZ': '카자흐스탄', + 'KE': '케냐', + 'KI': '키리바시', + 'KP': '조선민주주의인민공화국', + 'KR': '대한민국', + 'XK': '코소보', + 'KW': '쿠웨이트', + 'KG': '키르기스스탄', + 'LA': '라오스', + 'LV': '라트비아', + 'LB': '레바논', + 'LS': '레소토', + 'LR': '라이베리아', + 'LY': '리비아', + 'LI': '리히텐슈타인', + 'LT': '리투아니아', + 'LU': '룩셈부르크', + 'MO': '마카오', + 'MK': '북마케도니아', + 'MG': '마다가스카르', + 'MW': '말라위', + 'MY': '말레이시아', + 'MV': '몰디브', + 'ML': '말리', + 'MT': '몰타', + 'MH': '마셜 제도', + 'MQ': '마르티니크', + 'MR': '모리타니', + 'MU': '모리셔스', + 'YT': '마요트', + 'MX': '멕시코', + 'FM': '미크로네시아 연방', + 'MD': '몰도바', + 'MC': '모나코', + 'ME': '몬테네그로', + 'MA': '모로코', + 'MN': '몽골', + 'MS': '몬트세랫', + 'MZ': '모잠비크', + 'MM': '미얀마', + 'NA': '나미비아', + 'NR': '나우루', + 'NP': '네팔', + 'NL': '네덜란드', + 'AN': '네덜란드령 안틸레스', + 'NC': '뉴칼레도니아', + 'NZ': '뉴질랜드', + 'NI': '니카라과', + 'NE': '니제르', + 'NG': '나이지리아', + 'NU': '니우에', + 'NF': '노퍽섬', + 'GB-NIR': '북아일랜드', + 'MP': '북마리아나 제도', + 'NO': '노르웨이', + 'OM': '오만', + 'PK': '파키스탄', + 'PW': '팔라우', + 'PS': '팔레스타인', + 'PA': '파나마', + 'PG': '파푸아뉴기니', + 'PY': '파라과이', + 'PE': '페루', + 'PH': '필리핀', + 'PN': '핏케언 제도', + 'PL': '폴란드', + 'PT': '포르투갈', + 'PR': '푸에르토리코', + 'QA': '카타르', + 'RE': '레위니옹', + 'RO': '루마니아', + 'RU': '러시아', + 'RW': '르완다', + 'BL': '생바르텔레미', + 'SH': '세인트헬레나 어센션 트리스탄다쿠냐', + 'KN': '세인트키츠 네비스', + 'LC': '세인트 루시아', + 'MF': '생마르탱', + 'PM': '생피에르 미클롱', + 'VC': '세인트 빈센트 그레나딘', + 'WS': '사모아', + 'SM': '산마리노', + 'ST': '상투메 프린시페', + 'SA': '사우디아라비아', + 'GB-SCT': '스코틀랜드', + 'SN': '세네갈', + 'RS': '세르비아', + 'SC': '세이셸', + 'SL': '시에라리온', + 'SG': '싱가포르', + 'SX': '신트마르턴 (네덜란드령)', + 'SK': '슬로바키아', + 'SI': '슬로베니아', + 'SB': '솔로몬 제도', + 'SO': '소말리아', + 'ZA': '남아프리카 공화국', + 'GS': '사우스조지아 사우스샌드위치 제도', + 'SS': '남수단', + 'ES': '스페인', + 'LK': '스리랑카', + 'SD': '수단', + 'SR': '수리남', + 'SJ': '스발바르 얀마옌 제도', + 'SZ': '에스와티니', + 'SE': '스웨덴', + 'CH': '스위스', + 'SY': '시리아', + 'TW': '대만', + 'TJ': '타지키스탄', + 'TZ': '탄자니아', + 'TH': '태국', + 'TL': '동티모르', + 'TG': '토고', + 'TK': '토켈라우', + 'TO': '통가', + 'TT': '트리니다드 토바고', + 'TN': '튀니지', + 'TR': '튀르키예', + 'TM': '투르크메니스탄', + 'TC': '터크스 케이커스 제도', + 'TV': '투발루', + 'UG': '우간다', + 'UA': '우크라이나', + 'AE': '아랍에미리트', + 'GB': '영국', + 'US': '미국', + 'UY': '우루과이', + 'UM': '미국령 군소 제도', + 'UZ': '우즈베키스탄', + 'VU': '바누아투', + 'VE': '볼리비아 베네수엘라', + 'VN': '베트남', + 'VG': '영국령 버진아일랜드', + 'VI': '미국령 버진아일랜드', + 'GB-WLS': '웨일스', + 'WF': '왈리스 푸투나 제도', + 'EH': '서사하라', + 'YE': '예멘', + 'ZM': '잠비아', + 'ZW': '짐바브웨', + 'XX': '국적 정보 없음', + 'XM': '달', + }; +} + +// Path: destinations +class _StringsDestinationsKoKr implements _StringsDestinationsEn { + _StringsDestinationsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get home => '홈'; + @override String get graphs => '그래프'; + @override String get leaderboards => '리더보드'; + @override String get cutoffs => '커트라인'; + @override String get calc => '계산기'; + @override String get info => '정보'; + @override String get data => '저장된 데이터'; + @override String get settings => '설정'; +} + +// Path: xp +class _StringsXpKoKr implements _StringsXpEn { + _StringsXpKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '경험치 레벨'; + @override String progressToNextLevel({required Object percentage}) => '다음 레벨까지 ${percentage}'; + @override String progressTowardsGoal({required Object goal, required Object percentage, required Object left}) => '0 XP에서 레벨 ${goal}까지 진행도: ${percentage} (${left} XP 남음)'; +} + +// Path: gametime +class _StringsGametimeKoKr implements _StringsGametimeEn { + _StringsGametimeKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '정확한 플레이 시간'; + @override String gametimeAday({required Object gametime}) => '일평균 ${gametime}'; + @override String breakdown({required Object years, required Object months, required Object days, required Object minutes, required Object seconds}) => '${years}년, \n또는 ${months}개월,\n또는 ${days}일,\n또는 ${minutes}분,\n또는 ${seconds}초'; +} + +// Path: matchResult +class _StringsMatchResultKoKr implements _StringsMatchResultEn { + _StringsMatchResultKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get victory => '승리'; + @override String get defeat => '패배'; + @override String get tie => '무승부'; + @override String get dqvictory => '상대의 연결이 끊어짐'; + @override String get dqdefeat => '실격패'; + @override String get nocontest => '경기 취소'; + @override String get nullified => '경기 무효'; +} + +// Path: distinguishments +class _StringsDistinguishmentsKoKr implements _StringsDistinguishmentsEn { + _StringsDistinguishmentsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get noHeader => '헤더를 찾을 수 없음'; + @override String get noFooter => '푸터를 찾을 수 없음'; + @override String get twc => 'TETR.IO 세계 챔피언'; + @override String twcYear({required Object year}) => '${year} TETR.IO 세계 챔피언십'; +} + +// Path: newsEntries +class _StringsNewsEntriesKoKr implements _StringsNewsEntriesEn { + _StringsNewsEntriesKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override TextSpan leaderboard({required InlineSpan gametype, required InlineSpan rank}) => TextSpan(children: [ + gametype, + const TextSpan(text: '에서 '), + rank, + const TextSpan(text: '등을 달성했습니다'), + ]); + @override TextSpan personalbest({required InlineSpan gametype, required InlineSpan pb}) => TextSpan(children: [ + gametype, + const TextSpan(text: '에서 '), + pb, + const TextSpan(text: '의 최고 기록을 달성했습니다'), + ]); + @override TextSpan badge({required InlineSpan badge}) => TextSpan(children: [ + const TextSpan(text: '배지 획득: '), + badge, + ]); + @override TextSpan rankup({required InlineSpan rank}) => TextSpan(children: [ + const TextSpan(text: '테트라 리그 '), + rank, + const TextSpan(text: ' 달성'), + ]); + @override TextSpan supporter({required InlineSpanBuilder s}) => TextSpan(children: [ + s('TETR.IO supporter'), + const TextSpan(text: ' 가 되었습니다'), + ]); + @override TextSpan supporter_gift({required InlineSpanBuilder s}) => TextSpan(children: [ + s('TETR.IO supporter'), + const TextSpan(text: ' 를 선물받았습니다'), + ]); + @override TextSpan unknown({required InlineSpan type}) => TextSpan(children: [ + type, + const TextSpan(text: ' 종류의 확인되지 않은 소식'), + ]); +} + +// Path: snackBarMessages +class _StringsSnackBarMessagesKoKr implements _StringsSnackBarMessagesEn { + _StringsSnackBarMessagesKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String stateRemoved({required Object date}) => '${date} 상태가 데이터베이스에서 제거되었어요!'; + @override String matchRemoved({required Object date}) => '${date} 매치가 데이터베이스에서 제거되었어요!'; + @override String get notForWeb => '웹 버전은 지원하지 않는 기능이에요'; + @override String get importSuccess => '불러오기 성공'; + @override String get importCancelled => '불러오기 거부됨'; +} + +// Path: errors +class _StringsErrorsKoKr implements _StringsErrorsEn { + _StringsErrorsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get noRecords => '기록 없음'; + @override String get notEnoughData => '데이터가 충분하지 않음'; + @override String get noHistorySaved => '저장된 기록 없음'; + @override String connection({required Object code, required Object message}) => '연결 문제 발생: ${code} ${message}'; + @override String get noSuchUser => '사용자를 찾을 수 없습니다'; + @override String get noSuchUserSub => '당신이 오타를 냈거나, 그 계정이 사라졌을 수 있습니다'; + @override String get discordNotAssigned => '주어진 Discord ID에 해당하는 사용자가 없습니다'; + @override String get discordNotAssignedSub => '알맞은 ID를 입력하셨는지 다시 한번 확인해 주세요'; + @override String get history => '기록 찾기 실패'; + @override String get actionSuggestion => '이것을 찾으셨나요?'; + @override String get p1nkl0bst3rTLmatches => '테트라 리그 기록 없음'; + @override String get clientException => '인터넷 연결 없음'; + @override String get forbidden => '당신의 IP주소가 차단되었습니다'; + @override String forbiddenSub({required Object nickname}) => '만약 VPN이나 프록시 우회를 사용하고 계신다면 꺼 주세요. 그래도 문제가 발생하면, ${nickname} 에게 문의해 주세요'; + @override String get tooManyRequests => '레이트 리밋에 걸렸습니다.'; + @override String get tooManyRequestsSub => '잠시 기다렸다가 다시 시도해주세요'; + @override String get internal => 'TETR.IO측에 문제가 일어났습니다'; + @override String get internalSub => '(osk는 이 문제에 대해 이미 알고 있을 것입니다)'; + @override String get internalWebVersion => 'TETR.IO측 (또는 oskware_bridge, 솔직히 잘은 모르겠네요)에 문제가 일어났습니다'; + @override String get internalWebVersionSub => '만약 osk의 서버 상태 페이지(status.osk.sh)에 오류가 없다고 나온다면, dan63047에게 이 문제를 알려주세요'; + @override String get oskwareBridge => 'oskware_bridge에 문제가 일어났습니다'; + @override String get oskwareBridgeSub => 'dan63047에게 이 문제를 알려주세요'; + @override String get p1nkl0bst3rForbidden => '서드 파티 API가 당신의 IP 주소를 차단했습니다'; + @override String get p1nkl0bst3rTooManyRequests => '서드 파티 API에 너무 많은 요청이 들어왔습니다. 나중에 다시 시도해 주세요'; + @override String get p1nkl0bst3rinternal => 'p1nkl0bst3r측에 문제가 일어났습니다'; + @override String get p1nkl0bst3rinternalWebVersion => 'p1nkl0bst3r 측 (또는 oskware_bridge, 솔직히 잘은 모르겠네요)에 문제가 일어났습니다'; + @override String get replayAlreadySaved => '리플레이가 이미 저장됨'; + @override String get replayExpired => '리플레이가 만료되었으며 더 이상 볼 수 없습니다'; + @override String get replayRejected => '서드 파티 API가 당신의 IP 주소를 차단했습니다'; +} + +// Path: actions +class _StringsActionsKoKr implements _StringsActionsEn { + _StringsActionsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get cancel => '취소'; + @override String get submit => '제출'; + @override String get ok => '확인'; + @override String get apply => '적용'; + @override String get refresh => '새로고침'; +} + +// Path: graphsDestination +class _StringsGraphsDestinationKoKr implements _StringsGraphsDestinationEn { + _StringsGraphsDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get fetchAndsaveTLHistory => '기록 불러오기'; + @override String get fetchAndSaveOldTLmatches => '테트라 리그 경기 기록 불러오기'; + @override String fetchAndsaveTLHistoryResult({required Object number}) => '${number}개 상태가 발견됨'; + @override String fetchAndSaveOldTLmatchesResult({required Object number}) => '${number} 개의 경기를 찾았습니다'; + @override String gamesPlayed({required Object games}) => '${games} 판 플레이함'; + @override String get dateAndTime => '날짜 및 시간'; + @override String get filterModaleTitle => '랭크별로 그래프 필터링하기'; +} + +// Path: filterModale +class _StringsFilterModaleKoKr implements _StringsFilterModaleEn { + _StringsFilterModaleKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get all => '모두'; +} + +// Path: cutoffsDestination +class _StringsCutoffsDestinationKoKr implements _StringsCutoffsDestinationEn { + _StringsCutoffsDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '테트라 리그 상황'; + @override String relevance({required Object timestamp}) => '${timestamp} 기준'; + @override String get actual => '실제'; + @override String get target => '목표'; + @override String get cutoffTR => '현재 커트라인'; + @override String get targetTR => '의도된 커트라인'; + @override String get state => '인플레이션/디플레이션'; + @override String get advanced => '고급'; + @override String players({required Object n}) => '플레이어 수 (${n})'; + @override String get moreInfo => '추가 정보'; + @override String NumberOne({required Object tr}) => '현재 1위: ${tr} TR'; + @override String inflated({required Object tr}) => '${tr} TR 인플레이션'; + @override String get notInflated => '인플레이션 없음'; + @override String deflated({required Object tr}) => '${tr} TR 디플레이션'; + @override String get notDeflated => '디플레이션 없음'; + @override String get wellDotDotDot => '음...'; + @override String fromPlace({required Object n}) => '${n}위까지'; + @override String get viewButton => '보기'; +} + +// Path: rankView +class _StringsRankViewKoKr implements _StringsRankViewEn { + _StringsRankViewKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String rankTitle({required Object rank}) => '${rank} 랭크 정보'; + @override String get everyoneTitle => '전체 리더보드'; + @override String get trRange => 'TR 범위'; + @override String get supposedToBe => '의도된 범위'; + @override String gap({required Object value}) => '${value} 범위'; + @override String trGap({required Object value}) => '${value} TR 범위'; + @override String get deflationGap => '디플레이션 범위'; + @override String get inflationGap => '인플레이션 범위'; + @override String get LBposRange => '리더보드 순위 구간'; + @override String overpopulated({required Object players}) => '실제로는 ${players} 더 많음'; + @override String underpopulated({required Object players}) => '실제로는 ${players} 더 적음'; + @override String get PlayersEqualSupposedToBe => '귀엽다'; + @override String get avgStats => '평균 스탯'; + @override String avgForRank({required Object rank}) => '${rank} 랭크 평균'; + @override String get avgNerdStats => '평균 세부 스탯'; + @override String get minimums => '최소'; + @override String get maximums => '최대'; +} + +// Path: stateView +class _StringsStateViewKoKr implements _StringsStateViewEn { + _StringsStateViewKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String title({required Object date}) => '${date} 당시 상태'; +} + +// Path: tlMatchView +class _StringsTlMatchViewKoKr implements _StringsTlMatchViewEn { + _StringsTlMatchViewKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get match => '경기'; + @override String get vs => 'vs'; + @override String get winner => '승자'; + @override String roundNumber({required Object n}) => '라운드 ${n}'; + @override String get statsFor => '스탯의 분야:'; + @override String get numberOfRounds => '라운드 수'; + @override String get matchLength => '경기 길이'; + @override String get roundLength => '라운드 길이'; + @override String get matchStats => '경기 스탯'; + @override String get downloadReplay => '.ttrm 리플레이 다운로드'; + @override String get openReplay => 'TETR.IO에서 리플레이 열기'; +} + +// Path: calcDestination +class _StringsCalcDestinationKoKr implements _StringsCalcDestinationEn { + _StringsCalcDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String placeholders({required Object stat}) => '당신의 ${stat}을 입력하세요'; + @override String get tip => '값을 입력하고 "계산" 버튼을 눌러 세부 스탯을 확인하세요'; + @override String get statsCalcButton => '계산'; + @override String get damageCalcTip => '왼쪽에서 줄 클리어를 눌러 여기 추가하세요'; + @override String get actions => '줄 클리어'; + @override String get results => '결과'; + @override String get rules => '규칙'; + @override String get noSpinClears => '스핀이 아닌 줄 클리어'; + @override String get spins => '스핀'; + @override String get miniSpins => '스핀 미니'; + @override String get noLineclear => '줄 클리어 없음 (콤보 끊김)'; + @override String get custom => '직접 입력'; + @override String get multiplier => '멀티플라이어'; + @override String get pcDamage => '퍼펙트 클리어 데미지'; + @override String get comboTable => '콤보 테이블'; + @override String get b2bChaining => '백투백 체인'; + @override String get surgeStartAtB2B => '서지가 시작되는 백투백'; + @override String get surgeStartAmount => '서지 시작 시 대미지'; + @override String get totalDamage => '총 대미지'; + @override String get lineclears => '지운 줄'; + @override String get combo => '콤보'; + @override String get surge => '서지'; + @override String get pcs => '퍼펙트 클리어'; +} + +// Path: infoDestination +class _StringsInfoDestinationKoKr implements _StringsInfoDestinationEn { + _StringsInfoDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '정보'; + @override String get sprintAndBlitzAverages => '40 라인 & 블리츠 랭크별 평균치'; + @override String get sprintAndBlitzAveragesDescription => '40 라인과 블리츠 평균을 계산하는 것은 고된 작업이기 때문에 가끔씩 업데이트됩니다. 전체 40 라인과 블리츠 평균 표를 보려면 제목을 클릭하세요'; + @override String get tetraStatsWiki => 'Tetra Stats 위키 (영어)'; + @override String get tetraStatsWikiDescription => 'Tetra Stats가 제공하는 기능과 통계에 대한 더 자세한 정보를 알아보세요'; + @override String get about => 'Tetra Stats에 대해'; + @override String get aboutDescription => 'dan63에 의해 제작됨\n'; +} + +// Path: leaderboardsDestination +class _StringsLeaderboardsDestinationKoKr implements _StringsLeaderboardsDestinationEn { + _StringsLeaderboardsDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '리더보드'; + @override String get tl => '테트라 리그 (현재 시즌)'; + @override String get fullTL => '테트라 리그 (현재 시즌, 전체 스탯)'; + @override String get ar => '업적 점수'; +} + +// Path: savedDataDestination +class _StringsSavedDataDestinationKoKr implements _StringsSavedDataDestinationEn { + _StringsSavedDataDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '저장된 정보'; + @override String get tip => '왼쪽의 닉네임을 누르시면 정보가 표시됩니다'; + @override String seasonTLstates({required Object s}) => '시즌 ${s} 테트라 리그 상황'; + @override String get TLrecords => '테트라 리그 기록'; +} + +// Path: settingsDestination +class _StringsSettingsDestinationKoKr implements _StringsSettingsDestinationEn { + _StringsSettingsDestinationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => '설정'; + @override String get general => '일반'; + @override String get customization => '사용자 설정'; + @override String get database => '로컬 데이터베이스'; + @override String get checking => '확인 중...'; + @override String get enterToSubmit => 'Enter 키를 눌러 제출하세요'; + @override String get account => '당신의 TETR.IO 계정'; + @override String get accountDescription => '앱이 실행되면 해당 플레이어의 스탯이 불러와집니다. 나의 (dan63) 스탯을 불러오는 게 기본값입니다. 바꾸려면, 당신의 닉네임을 입력하세요.'; + @override String get done => '완료!'; + @override String get noSuchAccount => '그런 계정이 없음'; + @override String get language => '언어'; + @override String languageDescription({required Object languages}) => 'Tetra Stats는 ${languages}로 번역되었습니다. 기본적으로 이 앱은 사용자의 시스템 언어를 고르지만, 만약 시스템 언어 번역이 지원되지 않는다면 영어를 고릅니다.'; + @override String languages({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '0개의 언어', + one: '${n}개의 언어', + two: '${n}개의 언어', + few: '${n}개의 언어', + many: '${n}개의 언어', + other: '${n}개의 언어', + ); + @override String get updateInTheBackground => '백그라운드에서 정보 업데이트'; + @override String get updateInTheBackgroundDescription => '켜져 있다면, Tetra Stats는 캐시가 만료될 때마다 새로운 정보를 받으려고 시도할 것입니다. 주로 이는 5분마다 일어납니다.'; + @override String get compareStats => '테트라 리그 스탯을 랭크 평균과 비교하기'; + @override String get compareStatsDescription => '켜져 있다면, Tetra Stats는 당신이 당신의 랭크의 평균적인 플레이어와 스탯을 비교할 수 있도록 당신의 스탯을 알맞은 색으로 강조할 것입니다. 스탯 위에 커서를 올려 더 많은 정보를 확인하세요.'; + @override String get showPosition => '리더보드에서 스탯별 순위 표시'; + @override String get showPositionDescription => '켜져 있다면, 로딩 시간이 더 길어지지만 당신의 스탯별 순위를 볼 수 있도록 합니다'; + @override String get accentColor => '강조 색'; + @override String get accentColorDescription => '강조 색은 앱 곳곳에서 주로 상호작용 가능한 요소를 강조하기 위해 사용됩니다.'; + @override String get accentColorModale => '강조 색 고르기'; + @override String get timestamps => '시간 표시 형식'; + @override String timestampsDescriptionPart1({required Object d}) => '시각 표시 형식을 고릅니다. 기본 설정은 협정 세계시 (UTC)기준 시각을 언어에 맞는 형식으로 표시하는 것입니다. 예시: ${d}.'; + @override String timestampsDescriptionPart2({required Object y, required Object r}) => '또한 다음과 같은 시간 표시 형식도 고를 수 있습니다:\n• 언어에 맞는 형식, 사용자의 시간대: ${y}\n• 상대적인 시간 표시: ${r}'; + @override String get timestampsAbsoluteGMT => '협정 세계시 (UTC) 기준'; + @override String get timestampsAbsoluteLocalTime => '사용자의 시간대 기준'; + @override String get timestampsRelative => '상대적인 시간 표시'; + @override String get sheetbotLikeGraphs => '레이더 그래프를 Sheetbot의 형식으로 표시'; + @override String get sheetbotLikeGraphsDescription => '저는 Sheetbot 형식의 레이더 그래프가 별로 정확하지 않다고 판단하였지만, 몇몇 사람들은 -0.5 스트라이딩 스탯이 Sheetbot 그래프에서처럼 표시되지 않는 것을 보고 혼란스러워 했습니다. 따라서, 이 설정이 켜져 있다면, 레이더 그래프의 점들은 스탯이 음수일 때 반대쪽에 나타날 것입니다.'; + @override String get oskKagariGimmick => 'Osk-Kagari 기믹'; + @override String get oskKagariGimmickDescription => '켜져 있다면, osk의 랭크 대신 :kagari:가 표시됩니다.'; + @override String get bytesOfDataStored => '만큼의 데이터가 저장됨'; + @override String get TLrecordsSaved => '테트라 리그 기록 저장됨'; + @override String get TLplayerstatesSaved => '테트라 리그 플레이어스탯 저장됨'; + @override String get fixButton => '수정'; + @override String get compressButton => '압축'; + @override String get exportDB => '로컬 저장소로 내보내기'; + @override String get desktopExportAlertTitle => '데스크탑용 내보내기'; + @override String get desktopExportText => '데스크탑 버전으로 앱을 사용하시는 것 같군요. 문서 폴더로 들어가서, "TetraStats.db"를 찾고, 어딘가로 복사하세요'; + @override String get androidExportAlertTitle => '안드로이드용 내보내기'; + @override String androidExportText({required Object exportedDB}) => '내보내기 완료.\n${exportedDB}'; + @override String get importDB => '로컬 저장소에서 가져오기'; + @override String get importDBDescription => '백업을 복구합니다. 저장되어 있던 데이터베이스가 덮어씌워질 것임을 알려드립니다.'; + @override String get importWrongFileType => '잘못된 파일 형식'; +} + +// Path: homeNavigation +class _StringsHomeNavigationKoKr implements _StringsHomeNavigationEn { + _StringsHomeNavigationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get overview => '둘러보기'; + @override String get standing => '순위'; + @override String get seasons => '시즌'; + @override String get mathces => '매치'; + @override String get pb => '개인 최고 기록'; + @override String get normal => '일반'; + @override String get expert => '전문가'; + @override String get expertRecords => '기록 내보내기'; +} + +// Path: graphsNavigation +class _StringsGraphsNavigationKoKr implements _StringsGraphsNavigationEn { + _StringsGraphsNavigationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get history => '플레이어 기록'; + @override String get league => '리그 현황'; + @override String get cutoffs => '커트라인 기록'; +} + +// Path: calcNavigation +class _StringsCalcNavigationKoKr implements _StringsCalcNavigationEn { + _StringsCalcNavigationKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get stats => '스탯 계산기'; + @override String get damage => '데미지 계산기'; +} + +// Path: firstTimeView +class _StringsFirstTimeViewKoKr implements _StringsFirstTimeViewEn { + _StringsFirstTimeViewKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get welcome => 'Tetra Stats에 오신 것을 환영합니다'; + @override String get description => 'TETR.IO에 대한 다양한 통계를 추적할 수 있는 서비스'; + @override String get nicknameQuestion => '당신의 TETR.IO 닉네임은 무엇인가요?'; + @override String get inpuntHint => '여기 입력해주세요...(3-16자)'; + @override String get emptyInputError => '닉네임을 입력해 주세요'; + @override String niceToSeeYou({required Object n}) => '반갑습니다, ${n}'; + @override String get letsTakeALook => '당신의 통계를 살펴보겠습니다...'; + @override String get skip => '건너뛰기'; +} + +// Path: aboutView +class _StringsAboutViewKoKr implements _StringsAboutViewEn { + _StringsAboutViewKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get title => 'Tetra Stats에 대해'; + @override String get about => 'Tetra Stats는 TETR.IO 테트라 채널의 API를 활용하여 정보를 제공하고, 이 정보에 따른 추가적인 수치를 계산하는 서비스입니다. 이 서비스는 사용자가 테트라 리그에서 어떻게 발전하는지 추적할 수 있는 "추적" 기능을 제공합니다. 이 기능은 모든 테트라 리그에서의 변화를 로컬 데이터베이스에 기록하여(실시간으로 기록되지는 않습니다) 사용자가 이를 그래프로 볼 수 있도록 합니다. \n\nBeanserver Blaster는 Tetra Stats의 일부이며, 서버 사이드 스크립트로 떨어져 나왔습니다. Beanserver Blaster는 테트라 리그의 완전한 리더보드와 랭크 컷 등의 정보를 제공하여 Tetra Stats가 리더보드를 원하는 방식으로 정렬하고, 산점도 그래프를 그릴 수 있도록 돕는 역할을 합니다. 이를 통해 사용자는 테트라 리그의 추세를 분석할 수 있습니다. \n\n앞으로 리플레이 분석과 대회 기록 기능을 추가할 계획이 있으니, 계속해서 이 프로젝트에 관심을 기울여 주세요!\n\n이 서비스는 어떠한 방식으로도 TETR.IO 또는 osk와 직접적으로 연관되어 있지 않습니다.'; + @override String get appVersion => '앱 버전'; + @override String build({required Object build}) => '빌드 ${build}'; + @override String get GHrepo => '깃헙 리포지트리'; + @override String get submitAnIssue => '문제 보고하기'; + @override String get credits => '크레딧'; + @override String get authorAndDeveloper => '제작 & 개발'; + @override String get providedFormulas => '공식 제공'; + @override String get providedS1history => '테트라 리그 시즌 1 기록 제공'; + @override String get inoue => 'Inoue (리플레이 그래버)'; + @override String get zhCNlocale => '중국어 간체 번역'; + @override String get deDElocale => '독일어 번역'; + @override String get koKRlocale => '한국어 번역'; + @override String get supportHim => '후원하기'; +} + +// Path: stats +class _StringsStatsKoKr implements _StringsStatsEn { + _StringsStatsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get registrationDate => '가입일'; + @override String get gametime => '플레이 시간'; + @override String get ogp => '온라인 게임을 플레이함'; + @override String get ogw => '온라인 게임을 이김'; + @override String get followers => '팔로워'; + @override late final _StringsStatsXpKoKr xp = _StringsStatsXpKoKr._(_root); + @override late final _StringsStatsTrKoKr tr = _StringsStatsTrKoKr._(_root); + @override late final _StringsStatsGlickoKoKr glicko = _StringsStatsGlickoKoKr._(_root); + @override late final _StringsStatsRdKoKr rd = _StringsStatsRdKoKr._(_root); + @override late final _StringsStatsGlixareKoKr glixare = _StringsStatsGlixareKoKr._(_root); + @override late final _StringsStatsS1trKoKr s1tr = _StringsStatsS1trKoKr._(_root); + @override late final _StringsStatsGpKoKr gp = _StringsStatsGpKoKr._(_root); + @override late final _StringsStatsGwKoKr gw = _StringsStatsGwKoKr._(_root); + @override late final _StringsStatsWinrateKoKr winrate = _StringsStatsWinrateKoKr._(_root); + @override late final _StringsStatsApmKoKr apm = _StringsStatsApmKoKr._(_root); + @override late final _StringsStatsPpsKoKr pps = _StringsStatsPpsKoKr._(_root); + @override late final _StringsStatsVsKoKr vs = _StringsStatsVsKoKr._(_root); + @override late final _StringsStatsAppKoKr app = _StringsStatsAppKoKr._(_root); + @override late final _StringsStatsVsapmKoKr vsapm = _StringsStatsVsapmKoKr._(_root); + @override late final _StringsStatsDssKoKr dss = _StringsStatsDssKoKr._(_root); + @override late final _StringsStatsDspKoKr dsp = _StringsStatsDspKoKr._(_root); + @override late final _StringsStatsAppdspKoKr appdsp = _StringsStatsAppdspKoKr._(_root); + @override late final _StringsStatsCheeseKoKr cheese = _StringsStatsCheeseKoKr._(_root); + @override late final _StringsStatsGbeKoKr gbe = _StringsStatsGbeKoKr._(_root); + @override late final _StringsStatsNyaappKoKr nyaapp = _StringsStatsNyaappKoKr._(_root); + @override late final _StringsStatsAreaKoKr area = _StringsStatsAreaKoKr._(_root); + @override late final _StringsStatsEtrKoKr etr = _StringsStatsEtrKoKr._(_root); + @override late final _StringsStatsEtraccKoKr etracc = _StringsStatsEtraccKoKr._(_root); + @override late final _StringsStatsOpenerKoKr opener = _StringsStatsOpenerKoKr._(_root); + @override late final _StringsStatsPlonkKoKr plonk = _StringsStatsPlonkKoKr._(_root); + @override late final _StringsStatsStrideKoKr stride = _StringsStatsStrideKoKr._(_root); + @override late final _StringsStatsInfdsKoKr infds = _StringsStatsInfdsKoKr._(_root); + @override late final _StringsStatsAltitudeKoKr altitude = _StringsStatsAltitudeKoKr._(_root); + @override late final _StringsStatsClimbSpeedKoKr climbSpeed = _StringsStatsClimbSpeedKoKr._(_root); + @override late final _StringsStatsPeakClimbSpeedKoKr peakClimbSpeed = _StringsStatsPeakClimbSpeedKoKr._(_root); + @override late final _StringsStatsKosKoKr kos = _StringsStatsKosKoKr._(_root); + @override late final _StringsStatsB2bKoKr b2b = _StringsStatsB2bKoKr._(_root); + @override late final _StringsStatsFinesseKoKr finesse = _StringsStatsFinesseKoKr._(_root); + @override late final _StringsStatsFinesseFaultsKoKr finesseFaults = _StringsStatsFinesseFaultsKoKr._(_root); + @override late final _StringsStatsTotalTimeKoKr totalTime = _StringsStatsTotalTimeKoKr._(_root); + @override late final _StringsStatsLevelKoKr level = _StringsStatsLevelKoKr._(_root); + @override late final _StringsStatsPiecesKoKr pieces = _StringsStatsPiecesKoKr._(_root); + @override late final _StringsStatsSppKoKr spp = _StringsStatsSppKoKr._(_root); + @override late final _StringsStatsKpKoKr kp = _StringsStatsKpKoKr._(_root); + @override late final _StringsStatsKppKoKr kpp = _StringsStatsKppKoKr._(_root); + @override late final _StringsStatsKpsKoKr kps = _StringsStatsKpsKoKr._(_root); + @override String blitzScore({required Object p}) => '${p}점'; + @override String levelUpRequirement({required Object p}) => '레벨업까지 ${p}점'; + @override String get piecesTotal => '놓은 미노 수'; + @override String get piecesWithPerfectFinesse => '피네스를 지킨 미노'; + @override String get score => '점수'; + @override String get lines => '줄'; + @override String get linesShort => '줄'; + @override String get pcs => '퍼펙트 클리어'; + @override String get holds => '홀드'; + @override String get spike => '최고 스파이크'; + @override String top({required Object percentage}) => '상위 ${percentage}'; + @override String topRank({required Object rank}) => '최고 랭크: ${rank}'; + @override String get floor => '층수'; + @override String get split => '부분'; + @override String get total => '전체'; + @override String get sent => '보낸 줄'; + @override String get received => '받은 줄'; + @override String get placement => '위치'; + @override String get peak => '고점'; + @override String qpWithMods({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + one: '1개 모드 사용', + two: '${n}개 모드 사용', + few: '${n}개 모드 사용', + many: '${n}개 모드 사용', + other: '${n}개 모드 사용', + ); + @override String inputs({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '키를 ${n}번 누름', + one: '키를 ${n}번 누름', + two: '키를 ${n}번 누름', + few: '키를 ${n}번 누름', + many: '키를 ${n}번 누름', + other: '키를 ${n}번 누름', + ); + @override String tspinsTotal({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '총 ${n}번의 T스핀 수행', + one: '총 ${n}번의 T스핀 수행', + two: '총 ${n}번의 T스핀 수행', + few: '총 ${n}번의 T스핀 수행', + many: '총 ${n}번의 T스핀 수행', + other: '총 ${n}번의 T스핀 수행', + ); + @override String linesCleared({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '${n}줄 제거', + one: '${n}줄 제거', + two: '${n}줄 제거', + few: '${n}줄 제거', + many: '${n}줄 제거', + other: '${n}줄 제거', + ); + @override late final _StringsStatsGraphsKoKr graphs = _StringsStatsGraphsKoKr._(_root); + @override String players({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '${n} 플레이어', + one: '${n} 플레이어', + two: '${n} 플레이어', + few: '${n} 플레이어', + many: '${n} 플레이어', + other: '${n} 플레이어', + ); + @override String games({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '${n} 게임', + one: '${n} 게임', + two: '${n} 게임', + few: '${n} 게임', + many: '${n} 게임', + other: '${n} 게임', + ); + @override late final _StringsStatsLineClearKoKr lineClear = _StringsStatsLineClearKoKr._(_root); + @override late final _StringsStatsLineClearsKoKr lineClears = _StringsStatsLineClearsKoKr._(_root); + @override String get mini => '미니'; + @override String get tSpin => 'T스핀'; + @override String get tSpins => 'T스핀'; + @override String get spin => '스핀'; + @override String get spins => '스핀'; +} + +// Path: stats.xp +class _StringsStatsXpKoKr implements _StringsStatsXpEn { + _StringsStatsXpKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'XP'; + @override String get full => '경험치'; +} + +// Path: stats.tr +class _StringsStatsTrKoKr implements _StringsStatsTrEn { + _StringsStatsTrKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'TR'; + @override String get full => '테트라 레이팅'; +} + +// Path: stats.glicko +class _StringsStatsGlickoKoKr implements _StringsStatsGlickoEn { + _StringsStatsGlickoKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'Glicko'; + @override String get full => '글리코'; +} + +// Path: stats.rd +class _StringsStatsRdKoKr implements _StringsStatsRdEn { + _StringsStatsRdKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'RD'; + @override String get full => '레이팅 편차'; +} + +// Path: stats.glixare +class _StringsStatsGlixareKoKr implements _StringsStatsGlixareEn { + _StringsStatsGlixareKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'GXE'; + @override String get full => 'GLIXARE'; +} + +// Path: stats.s1tr +class _StringsStatsS1trKoKr implements _StringsStatsS1trEn { + _StringsStatsS1trKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '시즌 1 TR'; + @override String get full => '시즌 1 기준 TR'; +} + +// Path: stats.gp +class _StringsStatsGpKoKr implements _StringsStatsGpEn { + _StringsStatsGpKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'GP'; + @override String get full => '게임을 플레이함'; +} + +// Path: stats.gw +class _StringsStatsGwKoKr implements _StringsStatsGwEn { + _StringsStatsGwKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'GW'; + @override String get full => '게임을 이김'; +} + +// Path: stats.winrate +class _StringsStatsWinrateKoKr implements _StringsStatsWinrateEn { + _StringsStatsWinrateKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'WR%'; + @override String get full => '승률'; +} + +// Path: stats.apm +class _StringsStatsApmKoKr implements _StringsStatsApmEn { + _StringsStatsApmKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'APM'; + @override String get full => '분당 공격'; +} + +// Path: stats.pps +class _StringsStatsPpsKoKr implements _StringsStatsPpsEn { + _StringsStatsPpsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'PPS'; + @override String get full => '초당 미노'; +} + +// Path: stats.vs +class _StringsStatsVsKoKr implements _StringsStatsVsEn { + _StringsStatsVsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'VS'; + @override String get full => '대결 점수'; +} + +// Path: stats.app +class _StringsStatsAppKoKr implements _StringsStatsAppEn { + _StringsStatsAppKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'APP'; + @override String get full => '미노당 공격'; +} + +// Path: stats.vsapm +class _StringsStatsVsapmKoKr implements _StringsStatsVsapmEn { + _StringsStatsVsapmKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'VS/APM'; + @override String get full => 'VS / APM'; +} + +// Path: stats.dss +class _StringsStatsDssKoKr implements _StringsStatsDssEn { + _StringsStatsDssKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'DS/S'; + @override String get full => '초당 깎기'; +} + +// Path: stats.dsp +class _StringsStatsDspKoKr implements _StringsStatsDspEn { + _StringsStatsDspKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'DS/P'; + @override String get full => '미노당 깎기'; +} + +// Path: stats.appdsp +class _StringsStatsAppdspKoKr implements _StringsStatsAppdspEn { + _StringsStatsAppdspKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'APP+DSP'; + @override String get full => 'APP + DSP'; +} + +// Path: stats.cheese +class _StringsStatsCheeseKoKr implements _StringsStatsCheeseEn { + _StringsStatsCheeseKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '치즈'; + @override String get full => '치즈 지수'; +} + +// Path: stats.gbe +class _StringsStatsGbeKoKr implements _StringsStatsGbeEn { + _StringsStatsGbeKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'GbE'; + @override String get full => '쓰레기줄 효율'; +} + +// Path: stats.nyaapp +class _StringsStatsNyaappKoKr implements _StringsStatsNyaappEn { + _StringsStatsNyaappKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'wAPP'; + @override String get full => '가중 APP'; +} + +// Path: stats.area +class _StringsStatsAreaKoKr implements _StringsStatsAreaEn { + _StringsStatsAreaKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'Area'; + @override String get full => '영역'; +} + +// Path: stats.etr +class _StringsStatsEtrKoKr implements _StringsStatsEtrEn { + _StringsStatsEtrKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'eTR'; + @override String get full => '예상 TR'; +} + +// Path: stats.etracc +class _StringsStatsEtraccKoKr implements _StringsStatsEtraccEn { + _StringsStatsEtraccKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '±eTR'; + @override String get full => '예상 TR 오차'; +} + +// Path: stats.opener +class _StringsStatsOpenerKoKr implements _StringsStatsOpenerEn { + _StringsStatsOpenerKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'Opener'; + @override String get full => '오프너'; +} + +// Path: stats.plonk +class _StringsStatsPlonkKoKr implements _StringsStatsPlonkEn { + _StringsStatsPlonkKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'Plonk'; + @override String get full => '플롱크'; +} + +// Path: stats.stride +class _StringsStatsStrideKoKr implements _StringsStatsStrideEn { + _StringsStatsStrideKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'Stride'; + @override String get full => '스트라이드'; +} + +// Path: stats.infds +class _StringsStatsInfdsKoKr implements _StringsStatsInfdsEn { + _StringsStatsInfdsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'Inf. DS'; + @override String get full => '지속 깎기'; +} + +// Path: stats.altitude +class _StringsStatsAltitudeKoKr implements _StringsStatsAltitudeEn { + _StringsStatsAltitudeKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'm'; + @override String get full => '고도'; +} + +// Path: stats.climbSpeed +class _StringsStatsClimbSpeedKoKr implements _StringsStatsClimbSpeedEn { + _StringsStatsClimbSpeedKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '등반 속도'; + @override String get full => '등반 속도'; + @override String get gaugetTitle => '등반\n속도'; +} + +// Path: stats.peakClimbSpeed +class _StringsStatsPeakClimbSpeedKoKr implements _StringsStatsPeakClimbSpeedEn { + _StringsStatsPeakClimbSpeedKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '최고 등반 속도'; + @override String get full => '최고 등반 속도'; + @override String get gaugetTitle => '고점'; +} + +// Path: stats.kos +class _StringsStatsKosKoKr implements _StringsStatsKosEn { + _StringsStatsKosKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '처치'; + @override String get full => '처치한 플레이어'; +} + +// Path: stats.b2b +class _StringsStatsB2bKoKr implements _StringsStatsB2bEn { + _StringsStatsB2bKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'B2B'; + @override String get full => '백투백'; +} + +// Path: stats.finesse +class _StringsStatsFinesseKoKr implements _StringsStatsFinesseEn { + _StringsStatsFinesseKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'F'; + @override String get full => '피네스'; + @override String get widgetTitle => 'inesse'; +} + +// Path: stats.finesseFaults +class _StringsStatsFinesseFaultsKoKr implements _StringsStatsFinesseFaultsEn { + _StringsStatsFinesseFaultsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'FF'; + @override String get full => '피네스 오류'; +} + +// Path: stats.totalTime +class _StringsStatsTotalTimeKoKr implements _StringsStatsTotalTimeEn { + _StringsStatsTotalTimeKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '시간'; + @override String get full => '총 시간'; + @override String get widgetTitle => 'otal Time'; +} + +// Path: stats.level +class _StringsStatsLevelKoKr implements _StringsStatsLevelEn { + _StringsStatsLevelKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => '레벨'; + @override String get full => '레벨'; +} + +// Path: stats.pieces +class _StringsStatsPiecesKoKr implements _StringsStatsPiecesEn { + _StringsStatsPiecesKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'P'; + @override String get full => '미노'; +} + +// Path: stats.spp +class _StringsStatsSppKoKr implements _StringsStatsSppEn { + _StringsStatsSppKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'SPP'; + @override String get full => '미노당 점수'; +} + +// Path: stats.kp +class _StringsStatsKpKoKr implements _StringsStatsKpEn { + _StringsStatsKpKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'KP'; + @override String get full => '키 입력'; +} + +// Path: stats.kpp +class _StringsStatsKppKoKr implements _StringsStatsKppEn { + _StringsStatsKppKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'KPP'; + @override String get full => '미노당 키 입력'; +} + +// Path: stats.kps +class _StringsStatsKpsKoKr implements _StringsStatsKpsEn { + _StringsStatsKpsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get short => 'KPS'; + @override String get full => '초당 키 입력'; +} + +// Path: stats.graphs +class _StringsStatsGraphsKoKr implements _StringsStatsGraphsEn { + _StringsStatsGraphsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get attack => '공격'; + @override String get speed => '속도'; + @override String get defense => '수비'; + @override String get cheese => '치즈'; +} + +// Path: stats.lineClear +class _StringsStatsLineClearKoKr implements _StringsStatsLineClearEn { + _StringsStatsLineClearKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get single => '싱글'; + @override String get double => '더블'; + @override String get triple => '트리플'; + @override String get quad => '쿼드'; + @override String get penta => '펜타'; + @override String get hexa => '헥사'; + @override String get hepta => '헵타'; + @override String get octa => '옥타'; + @override String get ennea => '에니아'; + @override String get deca => '데카'; + @override String get hendeca => '헨데카'; + @override String get dodeca => '도데카'; + @override String get triadeca => '트라이아데카'; + @override String get tessaradeca => '테사라데카'; + @override String get pentedeca => '펜타데카'; + @override String get hexadeca => '헥사데카'; + @override String get heptadeca => '헵타데카'; + @override String get octadeca => '옥타데카'; + @override String get enneadeca => '에니아데카'; + @override String get eicosa => '아이코사'; + @override String get kagaris => '카가리스'; +} + +// Path: stats.lineClears +class _StringsStatsLineClearsKoKr implements _StringsStatsLineClearsEn { + _StringsStatsLineClearsKoKr._(this._root); + + @override final _StringsKoKr _root; // ignore: unused_field + + // Translations + @override String get zero => '제로스'; + @override String get single => '싱글'; + @override String get double => '더블'; + @override String get triple => '트리플'; + @override String get quad => '쿼드'; + @override String get penta => '펜타'; +} + // Path: class _StringsRuRu implements Translations { /// You can call this constructor and build your own translation instance of this locale. @@ -3236,6 +4784,7 @@ class _StringsRuRu implements Translations { @override Map get locales => { 'en': 'Английский (English)', 'ru-RU': 'Русский', + 'ko-KR': 'Корейский (한국인)', 'zh-CN': 'Упрощенный Китайский (简体中文)', 'de-DE': 'Немецкий (Deutsch)', }; @@ -3998,7 +5547,7 @@ class _StringsSettingsDestinationRuRu implements _StringsSettingsDestinationEn { @override String get updateInTheBackground => 'Обновлять данные в фоновом режиме'; @override String get updateInTheBackgroundDescription => 'Пока Tetra Stats работает, он может обновлять статистику самостоятельно когда кэш истекает. Обычно это происходит каждые 5 минут'; @override String get compareStats => 'Сравнивать статистику со средними значениями ранга'; - @override String get compareStatsDescription => 'Если включено, Tetra Stats загрузит средние значения и будет сравнивать вас со средними значениями вашего ранга. В результате этого почти каждый пункт статистики обретёт цвет, наводите курсор, что-бы узнать больше.'; + @override String get compareStatsDescription => 'Если включено, Tetra Stats загрузит средние значения и будет сравнивать вас со средними значениями вашего ранга. В результате этого почти каждый пункт статистики обретёт цвет, наводите курсор, чтобы узнать больше.'; @override String get showPosition => 'Показывать позиции по статам'; @override String get showPositionDescription => 'На загрузку потребуется немного времени (и трафика), но зато вы сможете видеть своё положение в таблице Тетра Лиги, отсортированной по статам'; @override String get accentColor => 'Цветовой акцент'; @@ -4106,6 +5655,7 @@ class _StringsAboutViewRuRu implements _StringsAboutViewEn { @override String get inoue => 'Inoue (достаёт повторы)'; @override String get zhCNlocale => 'Перевёл на упрощённый китайский'; @override String get deDElocale => 'Перевёл на немецкий'; + @override String get koKRlocale => 'Перевели на корейский'; @override String get supportHim => 'Поддержите его!'; } @@ -4778,6 +6328,7 @@ class _StringsZhCn implements Translations { @override Map get locales => { 'en': '英语 (English)', 'ru-RU': '俄语 (Русский)', + 'ko-KR': '韩语 (한국인)', 'zh-CN': '简体中文', 'de-DE': '德语 (Deutsch)', }; @@ -4821,7 +6372,7 @@ class _StringsZhCn implements Translations { @override String get dateAndTime => '日期和时间:'; @override String get TLfullLBnote => '很大,但允许你通过玩家的数据对玩家进行排序,还可以按段位筛选玩家'; @override String get rank => '段位'; - @override String verdictGeneral({required Object rank, required Object n, required Object verdict}) => '比 ${rank} 段平均数据${n} ${verdict}'; + @override String verdictGeneral({required Object rank, required Object verdict, required Object n}) => '比 ${rank} 段平均数据${verdict} ${n}'; @override String get verdictBetter => '好'; @override String get verdictWorse => '差'; @override String get localStanding => '本地'; @@ -4859,7 +6410,7 @@ class _StringsZhCn implements Translations { @override String get refresh => '刷新数据'; @override String get searchButton => '搜索'; @override String get trackedPlayers => '跟踪的玩家'; - @override String get standing => '名次'; + @override String get standing => '排行'; @override String get previousSeasons => '上赛季'; @override String get recent => '最近'; @override String get top => '前'; @@ -5213,7 +6764,7 @@ class _StringsDistinguishmentsZhCn implements _StringsDistinguishmentsEn { // Translations @override String get noHeader => '缺少标题'; - @override String get noFooter => '缺少标题'; + @override String get noFooter => '缺少页脚'; @override String get twc => 'TETR.IO 世界冠军'; @override String twcYear({required Object year}) => '${year} TETR.IO 世界杯'; } @@ -5370,10 +6921,10 @@ class _StringsCutoffsDestinationZhCn implements _StringsCutoffsDestinationEn { @override String players({required Object n}) => '玩家(${n})'; @override String get moreInfo => '更多信息'; @override String NumberOne({required Object tr}) => '№ 1 is ${tr} TR'; - @override String inflated({required Object tr}) => '高于目标 ${tr}'; - @override String get notInflated => '不偏高'; - @override String deflated({required Object tr}) => '低于目标 ${tr}'; - @override String get notDeflated => '不偏低'; + @override String inflated({required Object tr}) => '超标 ${tr}'; + @override String get notInflated => '未超标'; + @override String deflated({required Object tr}) => '未达标 ${tr}'; + @override String get notDeflated => '达标'; @override String get wellDotDotDot => '嗯…'; @override String fromPlace({required Object n}) => '自 № ${n}'; @override String get viewButton => '查看'; @@ -5618,7 +7169,7 @@ class _StringsFirstTimeViewZhCn implements _StringsFirstTimeViewEn { // Translations @override String get welcome => '欢迎使用 Tetra Stats'; - @override String get description => '服务,允许您跟踪TETR.IO的各种数据'; + @override String get description => '您跟踪TETR.IO的各种数据的好帮手'; @override String get nicknameQuestion => '您的昵称是?'; @override String get inpuntHint => '在此处输入... (3-16个符号)'; @override String get emptyInputError => '不能提交空字符串'; @@ -5646,7 +7197,8 @@ class _StringsAboutViewZhCn implements _StringsAboutViewEn { @override String get providedS1history => '提供的 S1 历史'; @override String get inoue => 'Inoue (回放抓取器)'; @override String get zhCNlocale => '简中翻译员'; - @override String get deDElocale => '德国语言环境'; + @override String get deDElocale => '德语翻译员'; + @override String get koKRlocale => '韩语翻译员'; @override String get supportHim => '为他提供支持!'; } @@ -6050,8 +7602,8 @@ class _StringsStatsPlonkZhCn implements _StringsStatsPlonkEn { @override final _StringsZhCn _root; // ignore: unused_field // Translations - @override String get short => '太极'; - @override String get full => '太极'; + @override String get short => '低速'; + @override String get full => '低速'; } // Path: stats.stride @@ -6061,8 +7613,8 @@ class _StringsStatsStrideZhCn implements _StringsStatsStrideEn { @override final _StringsZhCn _root; // ignore: unused_field // Translations - @override String get short => '速度'; - @override String get full => '速度'; + @override String get short => '快速'; + @override String get full => '快速'; } // Path: stats.infds @@ -6106,7 +7658,7 @@ class _StringsStatsPeakClimbSpeedZhCn implements _StringsStatsPeakClimbSpeedEn { @override final _StringsZhCn _root; // ignore: unused_field // Translations - @override String get short => '最高CSP'; + @override String get short => '最高速'; @override String get full => '最高爬行速度'; @override String get gaugetTitle => '最高'; } @@ -6142,7 +7694,7 @@ class _StringsStatsFinesseZhCn implements _StringsStatsFinesseEn { // Translations @override String get short => '极'; @override String get full => '极简率'; - @override String get widgetTitle => '简率'; + @override String get widgetTitle => '极简率'; } // Path: stats.finesseFaults @@ -6300,6 +7852,7 @@ extension on Translations { switch (path) { case 'locales.en': return 'English'; case 'locales.ru-RU': return 'Russian (Русский)'; + case 'locales.ko-KR': return 'Korean (한국인)'; case 'locales.zh-CN': return 'Simplified Chinese (简体中文)'; case 'locales.de-DE': return 'German (Deutsch)'; case 'gamemodes.league': return 'Tetra League'; @@ -6653,6 +8206,7 @@ extension on Translations { case 'aboutView.inoue': return 'Inoue (replay grabber)'; case 'aboutView.zhCNlocale': return 'Simplfied Chinese locale'; case 'aboutView.deDElocale': return 'German locale'; + case 'aboutView.koKRlocale': return 'Korean locale'; case 'aboutView.supportHim': return 'Support him!'; case 'stats.registrationDate': return 'Registration Date'; case 'stats.gametime': return 'Time Played'; @@ -7116,6 +8670,7 @@ extension on _StringsDeDe { switch (path) { case 'locales.en': return 'Englisch'; case 'locales.ru-RU': return 'Russisch (Русский)'; + case 'locales.ko-KR': return 'Koreanisch (한국인)'; case 'locales.zh-CN': return 'Vereinfachtes Chinesisch (简体中文)'; case 'locales.de-DE': return 'German (Deutsch)'; case 'gamemodes.league': return 'Tetra League'; @@ -7468,6 +9023,7 @@ extension on _StringsDeDe { case 'aboutView.inoue': return 'Inoue (Wiederholungsschnapper)'; case 'aboutView.zhCNlocale': return 'Vereinfachtes Chinesisch Übersetzung'; case 'aboutView.deDElocale': return 'Deutsche Übersetzung'; + case 'aboutView.koKRlocale': return 'Korean locale'; case 'aboutView.supportHim': return 'Unterstütze Ihn!'; case 'stats.registrationDate': return 'Registrierungsdatum'; case 'stats.gametime': return 'Spielzeit'; @@ -7926,11 +9482,829 @@ extension on _StringsDeDe { } } +extension on _StringsKoKr { + dynamic _flatMapFunction(String path) { + switch (path) { + case 'locales.en': return '영어 (English)'; + case 'locales.ru-RU': return '러시아어 (Русский)'; + case 'locales.ko-KR': return '한국어'; + case 'locales.zh-CN': return '중국어 간체 (简体中文)'; + case 'locales.de-DE': return '독일어 (Deutsch)'; + case 'gamemodes.league': return '테트라 리그'; + case 'gamemodes.zenith': return '퀵 플레이'; + case 'gamemodes.zenithex': return '전문가용 퀵 플레이'; + case 'gamemodes.40l': return '40라인'; + case 'gamemodes.blitz': return '블리츠'; + case 'gamemodes.5mblast': return '5,000,000 블라스트'; + case 'gamemodes.zen': return '젠'; + case 'destinations.home': return '홈'; + case 'destinations.graphs': return '그래프'; + case 'destinations.leaderboards': return '리더보드'; + case 'destinations.cutoffs': return '커트라인'; + case 'destinations.calc': return '계산기'; + case 'destinations.info': return '정보'; + case 'destinations.data': return '저장된 데이터'; + case 'destinations.settings': return '설정'; + case 'playerRole.user': return '사용자'; + case 'playerRole.banned': return '밴'; + case 'playerRole.bot': return '봇'; + case 'playerRole.sysop': return '시스템 운영자'; + case 'playerRole.admin': return '관리자'; + case 'playerRole.mod': return '운영자'; + case 'playerRole.halfmod': return '커뮤니티 운영자'; + case 'playerRole.anon': return '익명'; + case 'goBackButton': return '뒤로'; + case 'nanow': return '지금은 사용할 수 없습니다...'; + case 'seasonEnds': return ({required Object countdown}) => '시즌이 ${countdown} 뒤에 종료됩니다'; + case 'seasonEnded': return '시즌이 종료되었습니다'; + case 'overallPB': return ({required Object pb}) => '개인 최고 기록: ${pb} m'; + case 'gamesUntilRanked': return ({required Object left}) => '랭크를 얻으려면 ${left}판을 더 플레이하세요'; + case 'numOfVictories': return ({required Object wins}) => '~${wins}승'; + case 'promotionOnNextWin': return '승리 시 승급'; + case 'numOfdefeats': return ({required Object losses}) => '~${losses}패'; + case 'demotionOnNextLoss': return '패배 시 강등'; + case 'records': return '기록'; + case 'nerdStats': return '세부 스탯'; + case 'playstyles': return '플레이스타일'; + case 'horoscopes': return '천궁도'; + case 'relatedAchievements': return '관련 업적'; + case 'season': return '시즌'; + case 'smooth': return '부드러운'; + case 'dateAndTime': return '날짜 / 시간'; + case 'TLfullLBnote': return '용량이 크지만, 플레이어들을 스탯으로 줄세우거나 랭크로 걸러낼 수 있게 해 줍니다'; + case 'rank': return '랭크'; + case 'verdictGeneral': return ({required Object rank, required Object n, required Object verdict}) => '${rank} 평균보다 ${n} ${verdict}'; + case 'verdictBetter': return '앞섬'; + case 'verdictWorse': return '뒤쳐짐'; + case 'localStanding': return '국가 순위'; + case 'xp.title': return '경험치 레벨'; + case 'xp.progressToNextLevel': return ({required Object percentage}) => '다음 레벨까지 ${percentage}'; + case 'xp.progressTowardsGoal': return ({required Object goal, required Object percentage, required Object left}) => '0 XP에서 레벨 ${goal}까지 진행도: ${percentage} (${left} XP 남음)'; + case 'gametime.title': return '정확한 플레이 시간'; + case 'gametime.gametimeAday': return ({required Object gametime}) => '일평균 ${gametime}'; + case 'gametime.breakdown': return ({required Object years, required Object months, required Object days, required Object minutes, required Object seconds}) => '${years}년, \n또는 ${months}개월,\n또는 ${days}일,\n또는 ${minutes}분,\n또는 ${seconds}초'; + case 'track': return '추적하기'; + case 'stopTracking': return '추적 취소하기'; + case 'supporter': return ({required Object tier}) => '서포터 ${tier}티어'; + case 'comparingWith': return ({required Object oldDate, required Object newDate}) => '${oldDate} 와 ${newDate} 의 데이터를 비교 중'; + case 'compare': return '비교하기'; + case 'comparison': return '비교'; + case 'enterUsername': return '입력하세요: 닉네임 혹은 \$avgX (X는 랭크를 의미)'; + case 'general': return '일반'; + case 'badges': return '배지들'; + case 'obtainDate': return ({required Object date}) => '${date}에 얻음'; + case 'assignedManualy': return '이 배지는 TETR.IO 관리자에 의해 부여되었습니다'; + case 'distinguishment': return '타이틀'; + case 'banned': return '밴'; + case 'bannedSubtext': return 'TETR.IO 약관이나 규칙을 어기면 밴이 조치됩니다'; + case 'badStanding': return '나쁜 평판'; + case 'badStandingSubtext': return '최소 한 번 밴을 당한 기록이 있습니다'; + case 'botAccount': return '봇 계정'; + case 'botAccountSubtext': return ({required Object botMaintainers}) => '${botMaintainers}에 의해 운영됨'; + case 'copiedToClipboard': return '클립보드에 복사되었습니다!'; + case 'bio': return '자기소개'; + case 'news': return '뉴스'; + case 'matchResult.victory': return '승리'; + case 'matchResult.defeat': return '패배'; + case 'matchResult.tie': return '무승부'; + case 'matchResult.dqvictory': return '상대의 연결이 끊어짐'; + case 'matchResult.dqdefeat': return '실격패'; + case 'matchResult.nocontest': return '경기 취소'; + case 'matchResult.nullified': return '경기 무효'; + case 'distinguishments.noHeader': return '헤더를 찾을 수 없음'; + case 'distinguishments.noFooter': return '푸터를 찾을 수 없음'; + case 'distinguishments.twc': return 'TETR.IO 세계 챔피언'; + case 'distinguishments.twcYear': return ({required Object year}) => '${year} TETR.IO 세계 챔피언십'; + case 'newsEntries.leaderboard': return ({required InlineSpan gametype, required InlineSpan rank}) => TextSpan(children: [ + gametype, + const TextSpan(text: '에서 '), + rank, + const TextSpan(text: '등을 달성했습니다'), + ]); + case 'newsEntries.personalbest': return ({required InlineSpan gametype, required InlineSpan pb}) => TextSpan(children: [ + gametype, + const TextSpan(text: '에서 '), + pb, + const TextSpan(text: '의 최고 기록을 달성했습니다'), + ]); + case 'newsEntries.badge': return ({required InlineSpan badge}) => TextSpan(children: [ + const TextSpan(text: '배지 획득: '), + badge, + ]); + case 'newsEntries.rankup': return ({required InlineSpan rank}) => TextSpan(children: [ + const TextSpan(text: '테트라 리그 '), + rank, + const TextSpan(text: ' 달성'), + ]); + case 'newsEntries.supporter': return ({required InlineSpanBuilder s}) => TextSpan(children: [ + s('TETR.IO supporter'), + const TextSpan(text: ' 가 되었습니다'), + ]); + case 'newsEntries.supporter_gift': return ({required InlineSpanBuilder s}) => TextSpan(children: [ + s('TETR.IO supporter'), + const TextSpan(text: ' 를 선물받았습니다'), + ]); + case 'newsEntries.unknown': return ({required InlineSpan type}) => TextSpan(children: [ + type, + const TextSpan(text: ' 종류의 확인되지 않은 소식'), + ]); + case 'rankupMiddle': return ({required Object r}) => '${r} 랭크'; + case 'copyUserID': return '클릭하여 유저 ID를 복사'; + case 'searchHint': return '닉네임 또는 ID'; + case 'navMenu': return '탐색 메뉴'; + case 'navMenuTooltip': return '메뉴 열기'; + case 'refresh': return '정보 새로고침'; + case 'searchButton': return '검색'; + case 'trackedPlayers': return '추적된 플레이어들'; + case 'standing': return '순위'; + case 'previousSeasons': return '이전 시즌들'; + case 'recent': return '최근'; + case 'top': return '상위'; + case 'noRecord': return '기록 없음'; + case 'sprintAndBlitsRelevance': return ({required Object date}) => '관련성: ${date}'; + case 'snackBarMessages.stateRemoved': return ({required Object date}) => '${date} 상태가 데이터베이스에서 제거되었어요!'; + case 'snackBarMessages.matchRemoved': return ({required Object date}) => '${date} 매치가 데이터베이스에서 제거되었어요!'; + case 'snackBarMessages.notForWeb': return '웹 버전은 지원하지 않는 기능이에요'; + case 'snackBarMessages.importSuccess': return '불러오기 성공'; + case 'snackBarMessages.importCancelled': return '불러오기 거부됨'; + case 'errors.noRecords': return '기록 없음'; + case 'errors.notEnoughData': return '데이터가 충분하지 않음'; + case 'errors.noHistorySaved': return '저장된 기록 없음'; + case 'errors.connection': return ({required Object code, required Object message}) => '연결 문제 발생: ${code} ${message}'; + case 'errors.noSuchUser': return '사용자를 찾을 수 없습니다'; + case 'errors.noSuchUserSub': return '당신이 오타를 냈거나, 그 계정이 사라졌을 수 있습니다'; + case 'errors.discordNotAssigned': return '주어진 Discord ID에 해당하는 사용자가 없습니다'; + case 'errors.discordNotAssignedSub': return '알맞은 ID를 입력하셨는지 다시 한번 확인해 주세요'; + case 'errors.history': return '기록 찾기 실패'; + case 'errors.actionSuggestion': return '이것을 찾으셨나요?'; + case 'errors.p1nkl0bst3rTLmatches': return '테트라 리그 기록 없음'; + case 'errors.clientException': return '인터넷 연결 없음'; + case 'errors.forbidden': return '당신의 IP주소가 차단되었습니다'; + case 'errors.forbiddenSub': return ({required Object nickname}) => '만약 VPN이나 프록시 우회를 사용하고 계신다면 꺼 주세요. 그래도 문제가 발생하면, ${nickname} 에게 문의해 주세요'; + case 'errors.tooManyRequests': return '레이트 리밋에 걸렸습니다.'; + case 'errors.tooManyRequestsSub': return '잠시 기다렸다가 다시 시도해주세요'; + case 'errors.internal': return 'TETR.IO측에 문제가 일어났습니다'; + case 'errors.internalSub': return '(osk는 이 문제에 대해 이미 알고 있을 것입니다)'; + case 'errors.internalWebVersion': return 'TETR.IO측 (또는 oskware_bridge, 솔직히 잘은 모르겠네요)에 문제가 일어났습니다'; + case 'errors.internalWebVersionSub': return '만약 osk의 서버 상태 페이지(status.osk.sh)에 오류가 없다고 나온다면, dan63047에게 이 문제를 알려주세요'; + case 'errors.oskwareBridge': return 'oskware_bridge에 문제가 일어났습니다'; + case 'errors.oskwareBridgeSub': return 'dan63047에게 이 문제를 알려주세요'; + case 'errors.p1nkl0bst3rForbidden': return '서드 파티 API가 당신의 IP 주소를 차단했습니다'; + case 'errors.p1nkl0bst3rTooManyRequests': return '서드 파티 API에 너무 많은 요청이 들어왔습니다. 나중에 다시 시도해 주세요'; + case 'errors.p1nkl0bst3rinternal': return 'p1nkl0bst3r측에 문제가 일어났습니다'; + case 'errors.p1nkl0bst3rinternalWebVersion': return 'p1nkl0bst3r 측 (또는 oskware_bridge, 솔직히 잘은 모르겠네요)에 문제가 일어났습니다'; + case 'errors.replayAlreadySaved': return '리플레이가 이미 저장됨'; + case 'errors.replayExpired': return '리플레이가 만료되었으며 더 이상 볼 수 없습니다'; + case 'errors.replayRejected': return '서드 파티 API가 당신의 IP 주소를 차단했습니다'; + case 'actions.cancel': return '취소'; + case 'actions.submit': return '제출'; + case 'actions.ok': return '확인'; + case 'actions.apply': return '적용'; + case 'actions.refresh': return '새로고침'; + case 'graphsDestination.fetchAndsaveTLHistory': return '기록 불러오기'; + case 'graphsDestination.fetchAndSaveOldTLmatches': return '테트라 리그 경기 기록 불러오기'; + case 'graphsDestination.fetchAndsaveTLHistoryResult': return ({required Object number}) => '${number}개 상태가 발견됨'; + case 'graphsDestination.fetchAndSaveOldTLmatchesResult': return ({required Object number}) => '${number} 개의 경기를 찾았습니다'; + case 'graphsDestination.gamesPlayed': return ({required Object games}) => '${games} 판 플레이함'; + case 'graphsDestination.dateAndTime': return '날짜 및 시간'; + case 'graphsDestination.filterModaleTitle': return '랭크별로 그래프 필터링하기'; + case 'filterModale.all': return '모두'; + case 'cutoffsDestination.title': return '테트라 리그 상황'; + case 'cutoffsDestination.relevance': return ({required Object timestamp}) => '${timestamp} 기준'; + case 'cutoffsDestination.actual': return '실제'; + case 'cutoffsDestination.target': return '목표'; + case 'cutoffsDestination.cutoffTR': return '현재 커트라인'; + case 'cutoffsDestination.targetTR': return '의도된 커트라인'; + case 'cutoffsDestination.state': return '인플레이션/디플레이션'; + case 'cutoffsDestination.advanced': return '고급'; + case 'cutoffsDestination.players': return ({required Object n}) => '플레이어 수 (${n})'; + case 'cutoffsDestination.moreInfo': return '추가 정보'; + case 'cutoffsDestination.NumberOne': return ({required Object tr}) => '현재 1위: ${tr} TR'; + case 'cutoffsDestination.inflated': return ({required Object tr}) => '${tr} TR 인플레이션'; + case 'cutoffsDestination.notInflated': return '인플레이션 없음'; + case 'cutoffsDestination.deflated': return ({required Object tr}) => '${tr} TR 디플레이션'; + case 'cutoffsDestination.notDeflated': return '디플레이션 없음'; + case 'cutoffsDestination.wellDotDotDot': return '음...'; + case 'cutoffsDestination.fromPlace': return ({required Object n}) => '${n}위까지'; + case 'cutoffsDestination.viewButton': return '보기'; + case 'rankView.rankTitle': return ({required Object rank}) => '${rank} 랭크 정보'; + case 'rankView.everyoneTitle': return '전체 리더보드'; + case 'rankView.trRange': return 'TR 범위'; + case 'rankView.supposedToBe': return '의도된 범위'; + case 'rankView.gap': return ({required Object value}) => '${value} 범위'; + case 'rankView.trGap': return ({required Object value}) => '${value} TR 범위'; + case 'rankView.deflationGap': return '디플레이션 범위'; + case 'rankView.inflationGap': return '인플레이션 범위'; + case 'rankView.LBposRange': return '리더보드 순위 구간'; + case 'rankView.overpopulated': return ({required Object players}) => '실제로는 ${players} 더 많음'; + case 'rankView.underpopulated': return ({required Object players}) => '실제로는 ${players} 더 적음'; + case 'rankView.PlayersEqualSupposedToBe': return '귀엽다'; + case 'rankView.avgStats': return '평균 스탯'; + case 'rankView.avgForRank': return ({required Object rank}) => '${rank} 랭크 평균'; + case 'rankView.avgNerdStats': return '평균 세부 스탯'; + case 'rankView.minimums': return '최소'; + case 'rankView.maximums': return '최대'; + case 'stateView.title': return ({required Object date}) => '${date} 당시 상태'; + case 'tlMatchView.match': return '경기'; + case 'tlMatchView.vs': return 'vs'; + case 'tlMatchView.winner': return '승자'; + case 'tlMatchView.roundNumber': return ({required Object n}) => '라운드 ${n}'; + case 'tlMatchView.statsFor': return '스탯의 분야:'; + case 'tlMatchView.numberOfRounds': return '라운드 수'; + case 'tlMatchView.matchLength': return '경기 길이'; + case 'tlMatchView.roundLength': return '라운드 길이'; + case 'tlMatchView.matchStats': return '경기 스탯'; + case 'tlMatchView.downloadReplay': return '.ttrm 리플레이 다운로드'; + case 'tlMatchView.openReplay': return 'TETR.IO에서 리플레이 열기'; + case 'calcDestination.placeholders': return ({required Object stat}) => '당신의 ${stat}을 입력하세요'; + case 'calcDestination.tip': return '값을 입력하고 "계산" 버튼을 눌러 세부 스탯을 확인하세요'; + case 'calcDestination.statsCalcButton': return '계산'; + case 'calcDestination.damageCalcTip': return '왼쪽에서 줄 클리어를 눌러 여기 추가하세요'; + case 'calcDestination.actions': return '줄 클리어'; + case 'calcDestination.results': return '결과'; + case 'calcDestination.rules': return '규칙'; + case 'calcDestination.noSpinClears': return '스핀이 아닌 줄 클리어'; + case 'calcDestination.spins': return '스핀'; + case 'calcDestination.miniSpins': return '스핀 미니'; + case 'calcDestination.noLineclear': return '줄 클리어 없음 (콤보 끊김)'; + case 'calcDestination.custom': return '직접 입력'; + case 'calcDestination.multiplier': return '멀티플라이어'; + case 'calcDestination.pcDamage': return '퍼펙트 클리어 데미지'; + case 'calcDestination.comboTable': return '콤보 테이블'; + case 'calcDestination.b2bChaining': return '백투백 체인'; + case 'calcDestination.surgeStartAtB2B': return '서지가 시작되는 백투백'; + case 'calcDestination.surgeStartAmount': return '서지 시작 시 대미지'; + case 'calcDestination.totalDamage': return '총 대미지'; + case 'calcDestination.lineclears': return '지운 줄'; + case 'calcDestination.combo': return '콤보'; + case 'calcDestination.surge': return '서지'; + case 'calcDestination.pcs': return '퍼펙트 클리어'; + case 'infoDestination.title': return '정보'; + case 'infoDestination.sprintAndBlitzAverages': return '40 라인 & 블리츠 랭크별 평균치'; + case 'infoDestination.sprintAndBlitzAveragesDescription': return '40 라인과 블리츠 평균을 계산하는 것은 고된 작업이기 때문에 가끔씩 업데이트됩니다. 전체 40 라인과 블리츠 평균 표를 보려면 제목을 클릭하세요'; + case 'infoDestination.tetraStatsWiki': return 'Tetra Stats 위키 (영어)'; + case 'infoDestination.tetraStatsWikiDescription': return 'Tetra Stats가 제공하는 기능과 통계에 대한 더 자세한 정보를 알아보세요'; + case 'infoDestination.about': return 'Tetra Stats에 대해'; + case 'infoDestination.aboutDescription': return 'dan63에 의해 제작됨\n'; + case 'leaderboardsDestination.title': return '리더보드'; + case 'leaderboardsDestination.tl': return '테트라 리그 (현재 시즌)'; + case 'leaderboardsDestination.fullTL': return '테트라 리그 (현재 시즌, 전체 스탯)'; + case 'leaderboardsDestination.ar': return '업적 점수'; + case 'savedDataDestination.title': return '저장된 정보'; + case 'savedDataDestination.tip': return '왼쪽의 닉네임을 누르시면 정보가 표시됩니다'; + case 'savedDataDestination.seasonTLstates': return ({required Object s}) => '시즌 ${s} 테트라 리그 상황'; + case 'savedDataDestination.TLrecords': return '테트라 리그 기록'; + case 'settingsDestination.title': return '설정'; + case 'settingsDestination.general': return '일반'; + case 'settingsDestination.customization': return '사용자 설정'; + case 'settingsDestination.database': return '로컬 데이터베이스'; + case 'settingsDestination.checking': return '확인 중...'; + case 'settingsDestination.enterToSubmit': return 'Enter 키를 눌러 제출하세요'; + case 'settingsDestination.account': return '당신의 TETR.IO 계정'; + case 'settingsDestination.accountDescription': return '앱이 실행되면 해당 플레이어의 스탯이 불러와집니다. 나의 (dan63) 스탯을 불러오는 게 기본값입니다. 바꾸려면, 당신의 닉네임을 입력하세요.'; + case 'settingsDestination.done': return '완료!'; + case 'settingsDestination.noSuchAccount': return '그런 계정이 없음'; + case 'settingsDestination.language': return '언어'; + case 'settingsDestination.languageDescription': return ({required Object languages}) => 'Tetra Stats는 ${languages}로 번역되었습니다. 기본적으로 이 앱은 사용자의 시스템 언어를 고르지만, 만약 시스템 언어 번역이 지원되지 않는다면 영어를 고릅니다.'; + case 'settingsDestination.languages': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '0개의 언어', + one: '${n}개의 언어', + two: '${n}개의 언어', + few: '${n}개의 언어', + many: '${n}개의 언어', + other: '${n}개의 언어', + ); + case 'settingsDestination.updateInTheBackground': return '백그라운드에서 정보 업데이트'; + case 'settingsDestination.updateInTheBackgroundDescription': return '켜져 있다면, Tetra Stats는 캐시가 만료될 때마다 새로운 정보를 받으려고 시도할 것입니다. 주로 이는 5분마다 일어납니다.'; + case 'settingsDestination.compareStats': return '테트라 리그 스탯을 랭크 평균과 비교하기'; + case 'settingsDestination.compareStatsDescription': return '켜져 있다면, Tetra Stats는 당신이 당신의 랭크의 평균적인 플레이어와 스탯을 비교할 수 있도록 당신의 스탯을 알맞은 색으로 강조할 것입니다. 스탯 위에 커서를 올려 더 많은 정보를 확인하세요.'; + case 'settingsDestination.showPosition': return '리더보드에서 스탯별 순위 표시'; + case 'settingsDestination.showPositionDescription': return '켜져 있다면, 로딩 시간이 더 길어지지만 당신의 스탯별 순위를 볼 수 있도록 합니다'; + case 'settingsDestination.accentColor': return '강조 색'; + case 'settingsDestination.accentColorDescription': return '강조 색은 앱 곳곳에서 주로 상호작용 가능한 요소를 강조하기 위해 사용됩니다.'; + case 'settingsDestination.accentColorModale': return '강조 색 고르기'; + case 'settingsDestination.timestamps': return '시간 표시 형식'; + case 'settingsDestination.timestampsDescriptionPart1': return ({required Object d}) => '시각 표시 형식을 고릅니다. 기본 설정은 협정 세계시 (UTC)기준 시각을 언어에 맞는 형식으로 표시하는 것입니다. 예시: ${d}.'; + case 'settingsDestination.timestampsDescriptionPart2': return ({required Object y, required Object r}) => '또한 다음과 같은 시간 표시 형식도 고를 수 있습니다:\n• 언어에 맞는 형식, 사용자의 시간대: ${y}\n• 상대적인 시간 표시: ${r}'; + case 'settingsDestination.timestampsAbsoluteGMT': return '협정 세계시 (UTC) 기준'; + case 'settingsDestination.timestampsAbsoluteLocalTime': return '사용자의 시간대 기준'; + case 'settingsDestination.timestampsRelative': return '상대적인 시간 표시'; + case 'settingsDestination.sheetbotLikeGraphs': return '레이더 그래프를 Sheetbot의 형식으로 표시'; + case 'settingsDestination.sheetbotLikeGraphsDescription': return '저는 Sheetbot 형식의 레이더 그래프가 별로 정확하지 않다고 판단하였지만, 몇몇 사람들은 -0.5 스트라이딩 스탯이 Sheetbot 그래프에서처럼 표시되지 않는 것을 보고 혼란스러워 했습니다. 따라서, 이 설정이 켜져 있다면, 레이더 그래프의 점들은 스탯이 음수일 때 반대쪽에 나타날 것입니다.'; + case 'settingsDestination.oskKagariGimmick': return 'Osk-Kagari 기믹'; + case 'settingsDestination.oskKagariGimmickDescription': return '켜져 있다면, osk의 랭크 대신 :kagari:가 표시됩니다.'; + case 'settingsDestination.bytesOfDataStored': return '만큼의 데이터가 저장됨'; + case 'settingsDestination.TLrecordsSaved': return '테트라 리그 기록 저장됨'; + case 'settingsDestination.TLplayerstatesSaved': return '테트라 리그 플레이어스탯 저장됨'; + case 'settingsDestination.fixButton': return '수정'; + case 'settingsDestination.compressButton': return '압축'; + case 'settingsDestination.exportDB': return '로컬 저장소로 내보내기'; + case 'settingsDestination.desktopExportAlertTitle': return '데스크탑용 내보내기'; + case 'settingsDestination.desktopExportText': return '데스크탑 버전으로 앱을 사용하시는 것 같군요. 문서 폴더로 들어가서, "TetraStats.db"를 찾고, 어딘가로 복사하세요'; + case 'settingsDestination.androidExportAlertTitle': return '안드로이드용 내보내기'; + case 'settingsDestination.androidExportText': return ({required Object exportedDB}) => '내보내기 완료.\n${exportedDB}'; + case 'settingsDestination.importDB': return '로컬 저장소에서 가져오기'; + case 'settingsDestination.importDBDescription': return '백업을 복구합니다. 저장되어 있던 데이터베이스가 덮어씌워질 것임을 알려드립니다.'; + case 'settingsDestination.importWrongFileType': return '잘못된 파일 형식'; + case 'homeNavigation.overview': return '둘러보기'; + case 'homeNavigation.standing': return '순위'; + case 'homeNavigation.seasons': return '시즌'; + case 'homeNavigation.mathces': return '매치'; + case 'homeNavigation.pb': return '개인 최고 기록'; + case 'homeNavigation.normal': return '일반'; + case 'homeNavigation.expert': return '전문가'; + case 'homeNavigation.expertRecords': return '기록 내보내기'; + case 'graphsNavigation.history': return '플레이어 기록'; + case 'graphsNavigation.league': return '리그 현황'; + case 'graphsNavigation.cutoffs': return '커트라인 기록'; + case 'calcNavigation.stats': return '스탯 계산기'; + case 'calcNavigation.damage': return '데미지 계산기'; + case 'firstTimeView.welcome': return 'Tetra Stats에 오신 것을 환영합니다'; + case 'firstTimeView.description': return 'TETR.IO에 대한 다양한 통계를 추적할 수 있는 서비스'; + case 'firstTimeView.nicknameQuestion': return '당신의 TETR.IO 닉네임은 무엇인가요?'; + case 'firstTimeView.inpuntHint': return '여기 입력해주세요...(3-16자)'; + case 'firstTimeView.emptyInputError': return '닉네임을 입력해 주세요'; + case 'firstTimeView.niceToSeeYou': return ({required Object n}) => '반갑습니다, ${n}'; + case 'firstTimeView.letsTakeALook': return '당신의 통계를 살펴보겠습니다...'; + case 'firstTimeView.skip': return '건너뛰기'; + case 'aboutView.title': return 'Tetra Stats에 대해'; + case 'aboutView.about': return 'Tetra Stats는 TETR.IO 테트라 채널의 API를 활용하여 정보를 제공하고, 이 정보에 따른 추가적인 수치를 계산하는 서비스입니다. 이 서비스는 사용자가 테트라 리그에서 어떻게 발전하는지 추적할 수 있는 "추적" 기능을 제공합니다. 이 기능은 모든 테트라 리그에서의 변화를 로컬 데이터베이스에 기록하여(실시간으로 기록되지는 않습니다) 사용자가 이를 그래프로 볼 수 있도록 합니다. \n\nBeanserver Blaster는 Tetra Stats의 일부이며, 서버 사이드 스크립트로 떨어져 나왔습니다. Beanserver Blaster는 테트라 리그의 완전한 리더보드와 랭크 컷 등의 정보를 제공하여 Tetra Stats가 리더보드를 원하는 방식으로 정렬하고, 산점도 그래프를 그릴 수 있도록 돕는 역할을 합니다. 이를 통해 사용자는 테트라 리그의 추세를 분석할 수 있습니다. \n\n앞으로 리플레이 분석과 대회 기록 기능을 추가할 계획이 있으니, 계속해서 이 프로젝트에 관심을 기울여 주세요!\n\n이 서비스는 어떠한 방식으로도 TETR.IO 또는 osk와 직접적으로 연관되어 있지 않습니다.'; + case 'aboutView.appVersion': return '앱 버전'; + case 'aboutView.build': return ({required Object build}) => '빌드 ${build}'; + case 'aboutView.GHrepo': return '깃헙 리포지트리'; + case 'aboutView.submitAnIssue': return '문제 보고하기'; + case 'aboutView.credits': return '크레딧'; + case 'aboutView.authorAndDeveloper': return '제작 & 개발'; + case 'aboutView.providedFormulas': return '공식 제공'; + case 'aboutView.providedS1history': return '테트라 리그 시즌 1 기록 제공'; + case 'aboutView.inoue': return 'Inoue (리플레이 그래버)'; + case 'aboutView.zhCNlocale': return '중국어 간체 번역'; + case 'aboutView.deDElocale': return '독일어 번역'; + case 'aboutView.koKRlocale': return '한국어 번역'; + case 'aboutView.supportHim': return '후원하기'; + case 'stats.registrationDate': return '가입일'; + case 'stats.gametime': return '플레이 시간'; + case 'stats.ogp': return '온라인 게임을 플레이함'; + case 'stats.ogw': return '온라인 게임을 이김'; + case 'stats.followers': return '팔로워'; + case 'stats.xp.short': return 'XP'; + case 'stats.xp.full': return '경험치'; + case 'stats.tr.short': return 'TR'; + case 'stats.tr.full': return '테트라 레이팅'; + case 'stats.glicko.short': return 'Glicko'; + case 'stats.glicko.full': return '글리코'; + case 'stats.rd.short': return 'RD'; + case 'stats.rd.full': return '레이팅 편차'; + case 'stats.glixare.short': return 'GXE'; + case 'stats.glixare.full': return 'GLIXARE'; + case 'stats.s1tr.short': return '시즌 1 TR'; + case 'stats.s1tr.full': return '시즌 1 기준 TR'; + case 'stats.gp.short': return 'GP'; + case 'stats.gp.full': return '게임을 플레이함'; + case 'stats.gw.short': return 'GW'; + case 'stats.gw.full': return '게임을 이김'; + case 'stats.winrate.short': return 'WR%'; + case 'stats.winrate.full': return '승률'; + case 'stats.apm.short': return 'APM'; + case 'stats.apm.full': return '분당 공격'; + case 'stats.pps.short': return 'PPS'; + case 'stats.pps.full': return '초당 미노'; + case 'stats.vs.short': return 'VS'; + case 'stats.vs.full': return '대결 점수'; + case 'stats.app.short': return 'APP'; + case 'stats.app.full': return '미노당 공격'; + case 'stats.vsapm.short': return 'VS/APM'; + case 'stats.vsapm.full': return 'VS / APM'; + case 'stats.dss.short': return 'DS/S'; + case 'stats.dss.full': return '초당 깎기'; + case 'stats.dsp.short': return 'DS/P'; + case 'stats.dsp.full': return '미노당 깎기'; + case 'stats.appdsp.short': return 'APP+DSP'; + case 'stats.appdsp.full': return 'APP + DSP'; + case 'stats.cheese.short': return '치즈'; + case 'stats.cheese.full': return '치즈 지수'; + case 'stats.gbe.short': return 'GbE'; + case 'stats.gbe.full': return '쓰레기줄 효율'; + case 'stats.nyaapp.short': return 'wAPP'; + case 'stats.nyaapp.full': return '가중 APP'; + case 'stats.area.short': return 'Area'; + case 'stats.area.full': return '영역'; + case 'stats.etr.short': return 'eTR'; + case 'stats.etr.full': return '예상 TR'; + case 'stats.etracc.short': return '±eTR'; + case 'stats.etracc.full': return '예상 TR 오차'; + case 'stats.opener.short': return 'Opener'; + case 'stats.opener.full': return '오프너'; + case 'stats.plonk.short': return 'Plonk'; + case 'stats.plonk.full': return '플롱크'; + case 'stats.stride.short': return 'Stride'; + case 'stats.stride.full': return '스트라이드'; + case 'stats.infds.short': return 'Inf. DS'; + case 'stats.infds.full': return '지속 깎기'; + case 'stats.altitude.short': return 'm'; + case 'stats.altitude.full': return '고도'; + case 'stats.climbSpeed.short': return '등반 속도'; + case 'stats.climbSpeed.full': return '등반 속도'; + case 'stats.climbSpeed.gaugetTitle': return '등반\n속도'; + case 'stats.peakClimbSpeed.short': return '최고 등반 속도'; + case 'stats.peakClimbSpeed.full': return '최고 등반 속도'; + case 'stats.peakClimbSpeed.gaugetTitle': return '고점'; + case 'stats.kos.short': return '처치'; + case 'stats.kos.full': return '처치한 플레이어'; + case 'stats.b2b.short': return 'B2B'; + case 'stats.b2b.full': return '백투백'; + case 'stats.finesse.short': return 'F'; + case 'stats.finesse.full': return '피네스'; + case 'stats.finesse.widgetTitle': return 'inesse'; + case 'stats.finesseFaults.short': return 'FF'; + case 'stats.finesseFaults.full': return '피네스 오류'; + case 'stats.totalTime.short': return '시간'; + case 'stats.totalTime.full': return '총 시간'; + case 'stats.totalTime.widgetTitle': return 'otal Time'; + case 'stats.level.short': return '레벨'; + case 'stats.level.full': return '레벨'; + case 'stats.pieces.short': return 'P'; + case 'stats.pieces.full': return '미노'; + case 'stats.spp.short': return 'SPP'; + case 'stats.spp.full': return '미노당 점수'; + case 'stats.kp.short': return 'KP'; + case 'stats.kp.full': return '키 입력'; + case 'stats.kpp.short': return 'KPP'; + case 'stats.kpp.full': return '미노당 키 입력'; + case 'stats.kps.short': return 'KPS'; + case 'stats.kps.full': return '초당 키 입력'; + case 'stats.blitzScore': return ({required Object p}) => '${p}점'; + case 'stats.levelUpRequirement': return ({required Object p}) => '레벨업까지 ${p}점'; + case 'stats.piecesTotal': return '놓은 미노 수'; + case 'stats.piecesWithPerfectFinesse': return '피네스를 지킨 미노'; + case 'stats.score': return '점수'; + case 'stats.lines': return '줄'; + case 'stats.linesShort': return '줄'; + case 'stats.pcs': return '퍼펙트 클리어'; + case 'stats.holds': return '홀드'; + case 'stats.spike': return '최고 스파이크'; + case 'stats.top': return ({required Object percentage}) => '상위 ${percentage}'; + case 'stats.topRank': return ({required Object rank}) => '최고 랭크: ${rank}'; + case 'stats.floor': return '층수'; + case 'stats.split': return '부분'; + case 'stats.total': return '전체'; + case 'stats.sent': return '보낸 줄'; + case 'stats.received': return '받은 줄'; + case 'stats.placement': return '위치'; + case 'stats.peak': return '고점'; + case 'stats.qpWithMods': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + one: '1개 모드 사용', + two: '${n}개 모드 사용', + few: '${n}개 모드 사용', + many: '${n}개 모드 사용', + other: '${n}개 모드 사용', + ); + case 'stats.inputs': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '키를 ${n}번 누름', + one: '키를 ${n}번 누름', + two: '키를 ${n}번 누름', + few: '키를 ${n}번 누름', + many: '키를 ${n}번 누름', + other: '키를 ${n}번 누름', + ); + case 'stats.tspinsTotal': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '총 ${n}번의 T스핀 수행', + one: '총 ${n}번의 T스핀 수행', + two: '총 ${n}번의 T스핀 수행', + few: '총 ${n}번의 T스핀 수행', + many: '총 ${n}번의 T스핀 수행', + other: '총 ${n}번의 T스핀 수행', + ); + case 'stats.linesCleared': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '${n}줄 제거', + one: '${n}줄 제거', + two: '${n}줄 제거', + few: '${n}줄 제거', + many: '${n}줄 제거', + other: '${n}줄 제거', + ); + case 'stats.graphs.attack': return '공격'; + case 'stats.graphs.speed': return '속도'; + case 'stats.graphs.defense': return '수비'; + case 'stats.graphs.cheese': return '치즈'; + case 'stats.players': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '${n} 플레이어', + one: '${n} 플레이어', + two: '${n} 플레이어', + few: '${n} 플레이어', + many: '${n} 플레이어', + other: '${n} 플레이어', + ); + case 'stats.games': return ({required num n}) => (_root.$meta.cardinalResolver ?? PluralResolvers.cardinal('ko'))(n, + zero: '${n} 게임', + one: '${n} 게임', + two: '${n} 게임', + few: '${n} 게임', + many: '${n} 게임', + other: '${n} 게임', + ); + case 'stats.lineClear.single': return '싱글'; + case 'stats.lineClear.double': return '더블'; + case 'stats.lineClear.triple': return '트리플'; + case 'stats.lineClear.quad': return '쿼드'; + case 'stats.lineClear.penta': return '펜타'; + case 'stats.lineClear.hexa': return '헥사'; + case 'stats.lineClear.hepta': return '헵타'; + case 'stats.lineClear.octa': return '옥타'; + case 'stats.lineClear.ennea': return '에니아'; + case 'stats.lineClear.deca': return '데카'; + case 'stats.lineClear.hendeca': return '헨데카'; + case 'stats.lineClear.dodeca': return '도데카'; + case 'stats.lineClear.triadeca': return '트라이아데카'; + case 'stats.lineClear.tessaradeca': return '테사라데카'; + case 'stats.lineClear.pentedeca': return '펜타데카'; + case 'stats.lineClear.hexadeca': return '헥사데카'; + case 'stats.lineClear.heptadeca': return '헵타데카'; + case 'stats.lineClear.octadeca': return '옥타데카'; + case 'stats.lineClear.enneadeca': return '에니아데카'; + case 'stats.lineClear.eicosa': return '아이코사'; + case 'stats.lineClear.kagaris': return '카가리스'; + case 'stats.lineClears.zero': return '제로스'; + case 'stats.lineClears.single': return '싱글'; + case 'stats.lineClears.double': return '더블'; + case 'stats.lineClears.triple': return '트리플'; + case 'stats.lineClears.quad': return '쿼드'; + case 'stats.lineClears.penta': return '펜타'; + case 'stats.mini': return '미니'; + case 'stats.tSpin': return 'T스핀'; + case 'stats.tSpins': return 'T스핀'; + case 'stats.spin': return '스핀'; + case 'stats.spins': return '스핀'; + case 'countries.': return '전 세계'; + case 'countries.AF': return '아프가니스탄'; + case 'countries.AX': return '올란드 제도'; + case 'countries.AL': return '알바니아'; + case 'countries.DZ': return '알제리'; + case 'countries.AS': return '미국령 사모아'; + case 'countries.AD': return '안도라'; + case 'countries.AO': return '앙골라'; + case 'countries.AI': return '앵귈라'; + case 'countries.AQ': return '남극'; + case 'countries.AG': return '앤티가 바부다'; + case 'countries.AR': return '아르헨티나'; + case 'countries.AM': return '아르메니아'; + case 'countries.AW': return '아루바'; + case 'countries.AU': return '호주'; + case 'countries.AT': return '오스트리아'; + case 'countries.AZ': return '아제르바이잔'; + case 'countries.BS': return '바하마'; + case 'countries.BH': return '바레인'; + case 'countries.BD': return '방글라데시'; + case 'countries.BB': return '바베이도스'; + case 'countries.BY': return '벨라루스'; + case 'countries.BE': return '벨기에'; + case 'countries.BZ': return '벨리즈'; + case 'countries.BJ': return '베냉'; + case 'countries.BM': return '버뮤다'; + case 'countries.BT': return '부탄'; + case 'countries.BO': return '볼리비아'; + case 'countries.BA': return '보스니아 헤르체고비나'; + case 'countries.BW': return '보츠와나'; + case 'countries.BV': return '부베섬'; + case 'countries.BR': return '브라질'; + case 'countries.IO': return '영국령 인도양 지역'; + case 'countries.BN': return '브루나이'; + case 'countries.BG': return '불가리아'; + case 'countries.BF': return '부르키나파소'; + case 'countries.BI': return '부룬디'; + case 'countries.KH': return '캄보디아'; + case 'countries.CM': return '카메룬'; + case 'countries.CA': return '캐나다'; + case 'countries.CV': return '카보베르데'; + case 'countries.BQ': return '네덜란드령 카리브섬'; + case 'countries.KY': return '케이맨 제도'; + case 'countries.CF': return '중앙아프리카 공화국'; + case 'countries.TD': return '차드'; + case 'countries.CL': return '칠레'; + case 'countries.CN': return '중국'; + case 'countries.CX': return '크리스마스섬'; + case 'countries.CC': return '코코스(킬링)제도'; + case 'countries.CO': return '콜롬비아'; + case 'countries.KM': return '코모로'; + case 'countries.CG': return '콩고'; + case 'countries.CD': return '콩고 민주 공화국'; + case 'countries.CK': return '쿡 제도'; + case 'countries.CR': return '코스타리카'; + case 'countries.CI': return '코트디부아르'; + case 'countries.HR': return '크로아티아'; + case 'countries.CU': return '쿠바'; + case 'countries.CW': return '퀴라소'; + case 'countries.CY': return '키프로스'; + case 'countries.CZ': return '체코'; + case 'countries.DK': return '덴마크'; + case 'countries.DJ': return '지부티'; + case 'countries.DM': return '도미니카'; + case 'countries.DO': return '도미니카 공화국'; + case 'countries.EC': return '에콰도르'; + case 'countries.EG': return '이집트'; + case 'countries.SV': return '엘살바도르'; + case 'countries.GB-ENG': return '잉글랜드'; + case 'countries.GQ': return '적도 기니'; + case 'countries.ER': return '에리트레아'; + case 'countries.EE': return '에스토니아'; + case 'countries.ET': return '에티오피아'; + case 'countries.EU': return '유럽 연합'; + case 'countries.FK': return '포클랜드 제도'; + case 'countries.FO': return '페로 제도'; + case 'countries.FJ': return '피지'; + case 'countries.FI': return '핀란드'; + case 'countries.FR': return '프랑스'; + case 'countries.GF': return '프랑스령 기아나'; + case 'countries.PF': return '프랑스령 폴리네시아'; + case 'countries.TF': return '프랑스령 남방'; + case 'countries.GA': return '가봉'; + case 'countries.GM': return '감비아'; + case 'countries.GE': return '조지아'; + case 'countries.DE': return '독일'; + case 'countries.GH': return '가나'; + case 'countries.GI': return '지브롤터'; + case 'countries.GR': return '그리스'; + case 'countries.GL': return '그린란드'; + case 'countries.GD': return '그레나다'; + case 'countries.GP': return '과들루프'; + case 'countries.GU': return '괌'; + case 'countries.GT': return '과테말라'; + case 'countries.GG': return '건지섬'; + case 'countries.GN': return '기니'; + case 'countries.GW': return '기니비사우'; + case 'countries.GY': return '가이아나'; + case 'countries.HT': return '아이티'; + case 'countries.HM': return '허드 맥도널드 제도'; + case 'countries.VA': return '교황청 (바티칸 시국)'; + case 'countries.HN': return '온두라스'; + case 'countries.HK': return '홍콩'; + case 'countries.HU': return '헝가리'; + case 'countries.IS': return '아이슬란드'; + case 'countries.IN': return '인도'; + case 'countries.ID': return '인도네시아'; + case 'countries.IR': return '이란'; + case 'countries.IQ': return '이라크'; + case 'countries.IE': return '아일랜드'; + case 'countries.IM': return '맨섬'; + case 'countries.IL': return '이스라엘'; + case 'countries.IT': return '이탈리아'; + case 'countries.JM': return '자메이카'; + case 'countries.JP': return '일본'; + case 'countries.JE': return '저지섬'; + case 'countries.JO': return '요르단'; + case 'countries.KZ': return '카자흐스탄'; + case 'countries.KE': return '케냐'; + case 'countries.KI': return '키리바시'; + case 'countries.KP': return '조선민주주의인민공화국'; + case 'countries.KR': return '대한민국'; + case 'countries.XK': return '코소보'; + case 'countries.KW': return '쿠웨이트'; + case 'countries.KG': return '키르기스스탄'; + case 'countries.LA': return '라오스'; + case 'countries.LV': return '라트비아'; + case 'countries.LB': return '레바논'; + case 'countries.LS': return '레소토'; + case 'countries.LR': return '라이베리아'; + case 'countries.LY': return '리비아'; + case 'countries.LI': return '리히텐슈타인'; + case 'countries.LT': return '리투아니아'; + case 'countries.LU': return '룩셈부르크'; + case 'countries.MO': return '마카오'; + case 'countries.MK': return '북마케도니아'; + case 'countries.MG': return '마다가스카르'; + case 'countries.MW': return '말라위'; + case 'countries.MY': return '말레이시아'; + case 'countries.MV': return '몰디브'; + case 'countries.ML': return '말리'; + case 'countries.MT': return '몰타'; + case 'countries.MH': return '마셜 제도'; + case 'countries.MQ': return '마르티니크'; + case 'countries.MR': return '모리타니'; + case 'countries.MU': return '모리셔스'; + case 'countries.YT': return '마요트'; + case 'countries.MX': return '멕시코'; + case 'countries.FM': return '미크로네시아 연방'; + case 'countries.MD': return '몰도바'; + case 'countries.MC': return '모나코'; + case 'countries.ME': return '몬테네그로'; + case 'countries.MA': return '모로코'; + case 'countries.MN': return '몽골'; + case 'countries.MS': return '몬트세랫'; + case 'countries.MZ': return '모잠비크'; + case 'countries.MM': return '미얀마'; + case 'countries.NA': return '나미비아'; + case 'countries.NR': return '나우루'; + case 'countries.NP': return '네팔'; + case 'countries.NL': return '네덜란드'; + case 'countries.AN': return '네덜란드령 안틸레스'; + case 'countries.NC': return '뉴칼레도니아'; + case 'countries.NZ': return '뉴질랜드'; + case 'countries.NI': return '니카라과'; + case 'countries.NE': return '니제르'; + case 'countries.NG': return '나이지리아'; + case 'countries.NU': return '니우에'; + case 'countries.NF': return '노퍽섬'; + case 'countries.GB-NIR': return '북아일랜드'; + case 'countries.MP': return '북마리아나 제도'; + case 'countries.NO': return '노르웨이'; + case 'countries.OM': return '오만'; + case 'countries.PK': return '파키스탄'; + case 'countries.PW': return '팔라우'; + case 'countries.PS': return '팔레스타인'; + case 'countries.PA': return '파나마'; + case 'countries.PG': return '파푸아뉴기니'; + case 'countries.PY': return '파라과이'; + case 'countries.PE': return '페루'; + case 'countries.PH': return '필리핀'; + case 'countries.PN': return '핏케언 제도'; + case 'countries.PL': return '폴란드'; + case 'countries.PT': return '포르투갈'; + case 'countries.PR': return '푸에르토리코'; + case 'countries.QA': return '카타르'; + case 'countries.RE': return '레위니옹'; + case 'countries.RO': return '루마니아'; + case 'countries.RU': return '러시아'; + case 'countries.RW': return '르완다'; + case 'countries.BL': return '생바르텔레미'; + case 'countries.SH': return '세인트헬레나 어센션 트리스탄다쿠냐'; + case 'countries.KN': return '세인트키츠 네비스'; + case 'countries.LC': return '세인트 루시아'; + case 'countries.MF': return '생마르탱'; + case 'countries.PM': return '생피에르 미클롱'; + case 'countries.VC': return '세인트 빈센트 그레나딘'; + case 'countries.WS': return '사모아'; + case 'countries.SM': return '산마리노'; + case 'countries.ST': return '상투메 프린시페'; + case 'countries.SA': return '사우디아라비아'; + case 'countries.GB-SCT': return '스코틀랜드'; + case 'countries.SN': return '세네갈'; + case 'countries.RS': return '세르비아'; + case 'countries.SC': return '세이셸'; + case 'countries.SL': return '시에라리온'; + case 'countries.SG': return '싱가포르'; + case 'countries.SX': return '신트마르턴 (네덜란드령)'; + case 'countries.SK': return '슬로바키아'; + case 'countries.SI': return '슬로베니아'; + case 'countries.SB': return '솔로몬 제도'; + case 'countries.SO': return '소말리아'; + case 'countries.ZA': return '남아프리카 공화국'; + case 'countries.GS': return '사우스조지아 사우스샌드위치 제도'; + case 'countries.SS': return '남수단'; + case 'countries.ES': return '스페인'; + case 'countries.LK': return '스리랑카'; + case 'countries.SD': return '수단'; + case 'countries.SR': return '수리남'; + case 'countries.SJ': return '스발바르 얀마옌 제도'; + case 'countries.SZ': return '에스와티니'; + case 'countries.SE': return '스웨덴'; + case 'countries.CH': return '스위스'; + case 'countries.SY': return '시리아'; + case 'countries.TW': return '대만'; + case 'countries.TJ': return '타지키스탄'; + case 'countries.TZ': return '탄자니아'; + case 'countries.TH': return '태국'; + case 'countries.TL': return '동티모르'; + case 'countries.TG': return '토고'; + case 'countries.TK': return '토켈라우'; + case 'countries.TO': return '통가'; + case 'countries.TT': return '트리니다드 토바고'; + case 'countries.TN': return '튀니지'; + case 'countries.TR': return '튀르키예'; + case 'countries.TM': return '투르크메니스탄'; + case 'countries.TC': return '터크스 케이커스 제도'; + case 'countries.TV': return '투발루'; + case 'countries.UG': return '우간다'; + case 'countries.UA': return '우크라이나'; + case 'countries.AE': return '아랍에미리트'; + case 'countries.GB': return '영국'; + case 'countries.US': return '미국'; + case 'countries.UY': return '우루과이'; + case 'countries.UM': return '미국령 군소 제도'; + case 'countries.UZ': return '우즈베키스탄'; + case 'countries.VU': return '바누아투'; + case 'countries.VE': return '볼리비아 베네수엘라'; + case 'countries.VN': return '베트남'; + case 'countries.VG': return '영국령 버진아일랜드'; + case 'countries.VI': return '미국령 버진아일랜드'; + case 'countries.GB-WLS': return '웨일스'; + case 'countries.WF': return '왈리스 푸투나 제도'; + case 'countries.EH': return '서사하라'; + case 'countries.YE': return '예멘'; + case 'countries.ZM': return '잠비아'; + case 'countries.ZW': return '짐바브웨'; + case 'countries.XX': return '국적 정보 없음'; + case 'countries.XM': return '달'; + default: return null; + } + } +} + extension on _StringsRuRu { dynamic _flatMapFunction(String path) { switch (path) { case 'locales.en': return 'Английский (English)'; case 'locales.ru-RU': return 'Русский'; + case 'locales.ko-KR': return 'Корейский (한국인)'; case 'locales.zh-CN': return 'Упрощенный Китайский (简体中文)'; case 'locales.de-DE': return 'Немецкий (Deutsch)'; case 'gamemodes.league': return 'Тетра Лига'; @@ -8221,7 +10595,7 @@ extension on _StringsRuRu { case 'settingsDestination.updateInTheBackground': return 'Обновлять данные в фоновом режиме'; case 'settingsDestination.updateInTheBackgroundDescription': return 'Пока Tetra Stats работает, он может обновлять статистику самостоятельно когда кэш истекает. Обычно это происходит каждые 5 минут'; case 'settingsDestination.compareStats': return 'Сравнивать статистику со средними значениями ранга'; - case 'settingsDestination.compareStatsDescription': return 'Если включено, Tetra Stats загрузит средние значения и будет сравнивать вас со средними значениями вашего ранга. В результате этого почти каждый пункт статистики обретёт цвет, наводите курсор, что-бы узнать больше.'; + case 'settingsDestination.compareStatsDescription': return 'Если включено, Tetra Stats загрузит средние значения и будет сравнивать вас со средними значениями вашего ранга. В результате этого почти каждый пункт статистики обретёт цвет, наводите курсор, чтобы узнать больше.'; case 'settingsDestination.showPosition': return 'Показывать позиции по статам'; case 'settingsDestination.showPositionDescription': return 'На загрузку потребуется немного времени (и трафика), но зато вы сможете видеть своё положение в таблице Тетра Лиги, отсортированной по статам'; case 'settingsDestination.accentColor': return 'Цветовой акцент'; @@ -8284,6 +10658,7 @@ extension on _StringsRuRu { case 'aboutView.inoue': return 'Inoue (достаёт повторы)'; case 'aboutView.zhCNlocale': return 'Перевёл на упрощённый китайский'; case 'aboutView.deDElocale': return 'Перевёл на немецкий'; + case 'aboutView.koKRlocale': return 'Перевели на корейский'; case 'aboutView.supportHim': return 'Поддержите его!'; case 'stats.registrationDate': return 'Дата регистрации'; case 'stats.gametime': return 'Время в игре'; @@ -8747,6 +11122,7 @@ extension on _StringsZhCn { switch (path) { case 'locales.en': return '英语 (English)'; case 'locales.ru-RU': return '俄语 (Русский)'; + case 'locales.ko-KR': return '韩语 (한국인)'; case 'locales.zh-CN': return '简体中文'; case 'locales.de-DE': return '德语 (Deutsch)'; case 'gamemodes.league': return 'Tetra 联赛'; @@ -8792,7 +11168,7 @@ extension on _StringsZhCn { case 'dateAndTime': return '日期和时间:'; case 'TLfullLBnote': return '很大,但允许你通过玩家的数据对玩家进行排序,还可以按段位筛选玩家'; case 'rank': return '段位'; - case 'verdictGeneral': return ({required Object rank, required Object n, required Object verdict}) => '比 ${rank} 段平均数据${n} ${verdict}'; + case 'verdictGeneral': return ({required Object rank, required Object verdict, required Object n}) => '比 ${rank} 段平均数据${verdict} ${n}'; case 'verdictBetter': return '好'; case 'verdictWorse': return '差'; case 'localStanding': return '本地'; @@ -8831,7 +11207,7 @@ extension on _StringsZhCn { case 'matchResult.nocontest': return '无竞赛记录'; case 'matchResult.nullified': return '竞赛记录已取消'; case 'distinguishments.noHeader': return '缺少标题'; - case 'distinguishments.noFooter': return '缺少标题'; + case 'distinguishments.noFooter': return '缺少页脚'; case 'distinguishments.twc': return 'TETR.IO 世界冠军'; case 'distinguishments.twcYear': return ({required Object year}) => '${year} TETR.IO 世界杯'; case 'newsEntries.leaderboard': return ({required InlineSpan gametype, required InlineSpan rank}) => TextSpan(children: [ @@ -8875,7 +11251,7 @@ extension on _StringsZhCn { case 'refresh': return '刷新数据'; case 'searchButton': return '搜索'; case 'trackedPlayers': return '跟踪的玩家'; - case 'standing': return '名次'; + case 'standing': return '排行'; case 'previousSeasons': return '上赛季'; case 'recent': return '最近'; case 'top': return '前'; @@ -8939,10 +11315,10 @@ extension on _StringsZhCn { case 'cutoffsDestination.players': return ({required Object n}) => '玩家(${n})'; case 'cutoffsDestination.moreInfo': return '更多信息'; case 'cutoffsDestination.NumberOne': return ({required Object tr}) => '№ 1 is ${tr} TR'; - case 'cutoffsDestination.inflated': return ({required Object tr}) => '高于目标 ${tr}'; - case 'cutoffsDestination.notInflated': return '不偏高'; - case 'cutoffsDestination.deflated': return ({required Object tr}) => '低于目标 ${tr}'; - case 'cutoffsDestination.notDeflated': return '不偏低'; + case 'cutoffsDestination.inflated': return ({required Object tr}) => '超标 ${tr}'; + case 'cutoffsDestination.notInflated': return '未超标'; + case 'cutoffsDestination.deflated': return ({required Object tr}) => '未达标 ${tr}'; + case 'cutoffsDestination.notDeflated': return '达标'; case 'cutoffsDestination.wellDotDotDot': return '嗯…'; case 'cutoffsDestination.fromPlace': return ({required Object n}) => '自 № ${n}'; case 'cutoffsDestination.viewButton': return '查看'; @@ -9079,7 +11455,7 @@ extension on _StringsZhCn { case 'calcNavigation.stats': return '数据计算器'; case 'calcNavigation.damage': return '伤害计算器'; case 'firstTimeView.welcome': return '欢迎使用 Tetra Stats'; - case 'firstTimeView.description': return '服务,允许您跟踪TETR.IO的各种数据'; + case 'firstTimeView.description': return '您跟踪TETR.IO的各种数据的好帮手'; case 'firstTimeView.nicknameQuestion': return '您的昵称是?'; case 'firstTimeView.inpuntHint': return '在此处输入... (3-16个符号)'; case 'firstTimeView.emptyInputError': return '不能提交空字符串'; @@ -9098,7 +11474,8 @@ extension on _StringsZhCn { case 'aboutView.providedS1history': return '提供的 S1 历史'; case 'aboutView.inoue': return 'Inoue (回放抓取器)'; case 'aboutView.zhCNlocale': return '简中翻译员'; - case 'aboutView.deDElocale': return '德国语言环境'; + case 'aboutView.deDElocale': return '德语翻译员'; + case 'aboutView.koKRlocale': return '韩语翻译员'; case 'aboutView.supportHim': return '为他提供支持!'; case 'stats.registrationDate': return '注册时间'; case 'stats.gametime': return '游玩时长'; @@ -9153,10 +11530,10 @@ extension on _StringsZhCn { case 'stats.etracc.full': return '预测实际差量'; case 'stats.opener.short': return '定式'; case 'stats.opener.full': return '定式'; - case 'stats.plonk.short': return '太极'; - case 'stats.plonk.full': return '太极'; - case 'stats.stride.short': return '速度'; - case 'stats.stride.full': return '速度'; + case 'stats.plonk.short': return '低速'; + case 'stats.plonk.full': return '低速'; + case 'stats.stride.short': return '快速'; + case 'stats.stride.full': return '快速'; case 'stats.infds.short': return '挖掘'; case 'stats.infds.full': return '挖掘'; case 'stats.altitude.short': return 'm'; @@ -9164,7 +11541,7 @@ extension on _StringsZhCn { case 'stats.climbSpeed.short': return 'CSP'; case 'stats.climbSpeed.full': return '爬行速度'; case 'stats.climbSpeed.gaugetTitle': return '爬行速度'; - case 'stats.peakClimbSpeed.short': return '最高CSP'; + case 'stats.peakClimbSpeed.short': return '最高速'; case 'stats.peakClimbSpeed.full': return '最高爬行速度'; case 'stats.peakClimbSpeed.gaugetTitle': return '最高'; case 'stats.kos.short': return 'KO\'s'; @@ -9173,7 +11550,7 @@ extension on _StringsZhCn { case 'stats.b2b.full': return '背靠背/满贯'; case 'stats.finesse.short': return '极'; case 'stats.finesse.full': return '极简率'; - case 'stats.finesse.widgetTitle': return '简率'; + case 'stats.finesse.widgetTitle': return '极简率'; case 'stats.finesseFaults.short': return '非极简'; case 'stats.finesseFaults.full': return '非极简操作数'; case 'stats.totalTime.short': return '时长'; diff --git a/lib/views/about_view.dart b/lib/views/about_view.dart index ba91b66..db8abc4 100644 --- a/lib/views/about_view.dart +++ b/lib/views/about_view.dart @@ -21,10 +21,11 @@ class AboutView extends StatefulWidget { class AboutCard extends StatelessWidget{ final String title; final String value; + final bool smallValue; // it's about size lol final String? undervalue; //what? final List endvalue; // ... - const AboutCard(this.title, this.value, this.undervalue, this.endvalue); + const AboutCard(this.title, this.value, this.undervalue, this.endvalue, {this.smallValue=false}); @override Widget build(BuildContext context) { @@ -32,7 +33,7 @@ class AboutCard extends StatelessWidget{ children: [ Text(title, style: Theme.of(context).textTheme.titleMedium, textAlign: TextAlign.center), Divider(), - Text(value, textAlign: TextAlign.center, style: Theme.of(context).textTheme.headlineMedium), + Text(value, textAlign: TextAlign.center, style: smallValue ? null : Theme.of(context).textTheme.headlineMedium), if (undervalue != null) Text(undervalue!, textAlign: TextAlign.center), Divider(), Padding( @@ -124,20 +125,17 @@ class AboutState extends State { TextSpan(text: t.aboutView.supportHim, style: TextStyle(decoration: TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: Theme.of(context).colorScheme.primary), recognizer: TapGestureRecognizer()..onTap = (){launchInBrowser(Uri.https("dan63.by", "donate"));}) ])), FractionallySizedBox(widthFactor: 1/((MediaQuery.of(context).size.width/600).ceil()), child: AboutCard(t.aboutView.providedFormulas, "kerrmunism", null, [ - //TextSpan(text: "Support him!", style: TextStyle(decoration: TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: Theme.of(context).colorScheme.primary), recognizer: TapGestureRecognizer()..onTap = (){launchInBrowser(Uri.https("paypal.com", "paypalme/Kerrmunism"));}) ])), FractionallySizedBox(widthFactor: 1/((MediaQuery.of(context).size.width/600).ceil()), child: AboutCard(t.aboutView.providedS1history, "p1nkl0bst3r", null, [ - //TextSpan(text: "Support him!", style: TextStyle(decoration: TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: Theme.of(context).colorScheme.primary), recognizer: TapGestureRecognizer()..onTap = (){launchInBrowser(Uri.https("paypal.com", "paypalme/Kerrmunism"));}) ])), FractionallySizedBox(widthFactor: 1/((MediaQuery.of(context).size.width/600).ceil()), child: AboutCard(t.aboutView.inoue, "szy", null, [ - //TextSpan(text: "Support him!", style: TextStyle(decoration: TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: Theme.of(context).colorScheme.primary), recognizer: TapGestureRecognizer()..onTap = (){launchInBrowser(Uri.https("paypal.com", "paypalme/Kerrmunism"));}) ])), FractionallySizedBox(widthFactor: 1/((MediaQuery.of(context).size.width/600).ceil()), child: AboutCard(t.aboutView.zhCNlocale, "neko_ab4093", null, [ - //TextSpan(text: "Support him!", style: TextStyle(decoration: TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: Theme.of(context).colorScheme.primary), recognizer: TapGestureRecognizer()..onTap = (){launchInBrowser(Uri.https("paypal.com", "paypalme/Kerrmunism"));}) ])), FractionallySizedBox(widthFactor: 1/((MediaQuery.of(context).size.width/600).ceil()), child: AboutCard(t.aboutView.deDElocale, "founntain", null, [ - //TextSpan(text: "Support him!", style: TextStyle(decoration: TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: Theme.of(context).colorScheme.primary), recognizer: TapGestureRecognizer()..onTap = (){launchInBrowser(Uri.https("paypal.com", "paypalme/Kerrmunism"));}) ])), + FractionallySizedBox(widthFactor: 1/((MediaQuery.of(context).size.width/600).ceil()), child: AboutCard(t.aboutView.koKRlocale, "Tau, ctpw, PyHoKxvx, muqhc,\nxantho, mazohu, CEL_ESTIAL, pensil", null, [ + ], smallValue: true)), ], ), ], diff --git a/lib/views/destination_home.dart b/lib/views/destination_home.dart index d95cdd8..89149c1 100644 --- a/lib/views/destination_home.dart +++ b/lib/views/destination_home.dart @@ -791,7 +791,7 @@ class _DestinationHomeState extends State with SingleTickerProv const Divider(), RecordSummary(record: summaries.blitz, betterThanClosestAverage: blitzBetterThanClosestAverage, betterThanRankAverage: blitzBetterThanRankAverage, closestAverage: closestAverageBlitz, rank: summaries.league.rank), const Divider(), - Text("Level ${summaries.blitz != null ? intf.format(summaries.blitz!.stats.level): "--"} • ${summaries.blitz != null ? f2.format(summaries.blitz!.stats.spp) : "-.--"} SPP • ${summaries.blitz != null ? f2.format(summaries.blitz!.stats.pps) : "-.--"} PPS", style: const TextStyle(color: Colors.grey)) + Text("${t.stats.level.full} ${summaries.blitz != null ? intf.format(summaries.blitz!.stats.level): "--"} • ${summaries.blitz != null ? f2.format(summaries.blitz!.stats.spp) : "-.--"} SPP • ${summaries.blitz != null ? f2.format(summaries.blitz!.stats.pps) : "-.--"} PPS", style: const TextStyle(color: Colors.grey)) ], ), ), diff --git a/lib/views/destination_settings.dart b/lib/views/destination_settings.dart index 440e390..f2e7f12 100644 --- a/lib/views/destination_settings.dart +++ b/lib/views/destination_settings.dart @@ -203,7 +203,7 @@ class _DestinationSettings extends State with SingleTickerP mainAxisSize: MainAxisSize.min, children: [ ListTile( - title: Text("Language", style: Theme.of(context).textTheme.displayLarge), + title: Text("${t.settingsDestination.language} (Language)", style: Theme.of(context).textTheme.displayLarge), trailing: DropdownButton( items: locales, value: LocaleSettings.currentLocale, diff --git a/lib/widgets/finesse_thingy.dart b/lib/widgets/finesse_thingy.dart index 1ccece4..3792f3d 100644 --- a/lib/widgets/finesse_thingy.dart +++ b/lib/widgets/finesse_thingy.dart @@ -32,7 +32,7 @@ class FinesseThingy extends StatelessWidget{ Positioned(left: 25, top: 20, child: Text(t.stats.finesse.widgetTitle, style: TextStyle(fontFamily: "Eurostile Round Extended"))), Positioned( right: 0, top: 20, - child: Text("${finesse != null ? finesse!.faults : "---"}F", style: TextStyle( + child: Text("${finesse != null ? finesse!.faults : "---"}${t.stats.finesseFaults.short}", style: TextStyle( color: getFinesseColor() ))), Padding( diff --git a/lib/widgets/user_thingy.dart b/lib/widgets/user_thingy.dart index 9362cef..d22a3a6 100644 --- a/lib/widgets/user_thingy.dart +++ b/lib/widgets/user_thingy.dart @@ -251,7 +251,7 @@ class _UserThingyState extends State with SingleTickerProviderStateM text: TextSpan( style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white), children: [ - TextSpan(text: "Level ${(widget.player.level.isNegative || widget.player.level.isNaN) ? "---" : intf.format(widget.player.level.floor())}", style: TextStyle(decoration: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: (widget.player.level.isNegative || widget.player.level.isNaN) ? Colors.grey : Colors.white), recognizer: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TapGestureRecognizer()?..onTap = (){ + TextSpan(text: "${t.stats.level.full} ${(widget.player.level.isNegative || widget.player.level.isNaN) ? "---" : intf.format(widget.player.level.floor())}", style: TextStyle(decoration: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: (widget.player.level.isNegative || widget.player.level.isNaN) ? Colors.grey : Colors.white), recognizer: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TapGestureRecognizer()?..onTap = (){ showDialog( context: context, builder: (BuildContext context) => AlertDialog( diff --git a/pubspec.yaml b/pubspec.yaml index aa85bbc..ce54fcb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: tetra_stats description: Track your and other player stats in TETR.IO publish_to: 'none' -version: 2.0.5+46 +version: 2.0.6+47 environment: sdk: '>=3.0.0' diff --git a/res/i18n/strings.i18n.json b/res/i18n/strings.i18n.json index ab1a3ef..0021c4f 100644 --- a/res/i18n/strings.i18n.json +++ b/res/i18n/strings.i18n.json @@ -2,6 +2,7 @@ "locales(map)": { "en": "English", "ru-RU": "Russian (Русский)", + "ko-KR": "Korean (한국인)", "zh-CN": "Simplified Chinese (简体中文)", "de-DE": "German (Deutsch)" }, @@ -382,6 +383,7 @@ "inoue": "Inoue (replay grabber)", "zhCNlocale": "Simplfied Chinese locale", "deDElocale": "German locale", + "koKRlocale": "Korean locale", "supportHim": "Support him!" }, "stats": { diff --git a/res/i18n/strings_de-DE.i18n.json b/res/i18n/strings_de-DE.i18n.json index 4722cba..52b8a77 100644 --- a/res/i18n/strings_de-DE.i18n.json +++ b/res/i18n/strings_de-DE.i18n.json @@ -2,6 +2,7 @@ "locales(map)": { "en": "Englisch", "ru-RU": "Russisch (Русский)", + "ko-KR": "Koreanisch (한국인)", "zh-CN": "Vereinfachtes Chinesisch (简体中文)", "de-DE": "German (Deutsch)" }, @@ -382,6 +383,7 @@ "inoue": "Inoue (Wiederholungsschnapper)", "zhCNlocale": "Vereinfachtes Chinesisch Übersetzung", "deDElocale": "Deutsche Übersetzung", + "koKRlocale": "Korean locale", "supportHim": "Unterstütze Ihn!" }, "stats": { diff --git a/res/i18n/strings_ko-KR.i18n.json b/res/i18n/strings_ko-KR.i18n.json new file mode 100644 index 0000000..2f6d0f3 --- /dev/null +++ b/res/i18n/strings_ko-KR.i18n.json @@ -0,0 +1,933 @@ +{ + "locales(map)": { + "en": "영어 (English)", + "ru-RU": "러시아어 (Русский)", + "ko-KR": "한국어", + "zh-CN": "중국어 간체 (简体中文)", + "de-DE": "독일어 (Deutsch)" + }, + "gamemodes(map)": { + "league": "테트라 리그", + "zenith": "퀵 플레이", + "zenithex": "전문가용 퀵 플레이", + "40l": "40라인", + "blitz": "블리츠", + "5mblast": "5,000,000 블라스트", + "zen": "젠" + }, + "destinations": { + "home": "홈", + "graphs": "그래프", + "leaderboards": "리더보드", + "cutoffs": "커트라인", + "calc": "계산기", + "info": "정보", + "data": "저장된 데이터", + "settings": "설정" + }, + "playerRole(map)": { + "user": "사용자", + "banned": "밴", + "bot": "봇", + "sysop": "시스템 운영자", + "admin": "관리자", + "mod": "운영자", + "halfmod": "커뮤니티 운영자", + "anon": "익명" + }, + "goBackButton": "뒤로", + "nanow": "지금은 사용할 수 없습니다...", + "seasonEnds": "시즌이 ${countdown} 뒤에 종료됩니다", + "seasonEnded": "시즌이 종료되었습니다", + "overallPB": "개인 최고 기록: $pb m", + "gamesUntilRanked": "랭크를 얻으려면 ${left}판을 더 플레이하세요", + "numOfVictories": "~${wins}승", + "promotionOnNextWin": "승리 시 승급", + "numOfdefeats": "~${losses}패", + "demotionOnNextLoss": "패배 시 강등", + "records": "기록", + "nerdStats": "세부 스탯", + "playstyles": "플레이스타일", + "horoscopes": "천궁도", + "relatedAchievements": "관련 업적", + "season": "시즌", + "smooth": "부드러운", + "dateAndTime": "날짜 / 시간", + "TLfullLBnote": "용량이 크지만, 플레이어들을 스탯으로 줄세우거나 랭크로 걸러낼 수 있게 해 줍니다", + "rank": "랭크", + "verdictGeneral": "$rank 평균보다 $n $verdict", + "verdictBetter": "앞섬", + "verdictWorse": "뒤쳐짐", + "localStanding": "국가 순위", + "xp": { + "title": "경험치 레벨", + "progressToNextLevel": "다음 레벨까지 $percentage", + "progressTowardsGoal": "0 XP에서 레벨 $goal까지 진행도: $percentage ($left XP 남음)" + }, + "gametime": { + "title": "정확한 플레이 시간", + "gametimeAday": "일평균 $gametime", + "breakdown": "$years년, \n또는 $months개월,\n또는 $days일,\n또는 $minutes분,\n또는 $seconds초" + }, + "track": "추적하기", + "stopTracking": "추적 취소하기", + "supporter": "서포터 ${tier}티어", + "comparingWith": "${oldDate} 와 ${newDate} 의 데이터를 비교 중", + "compare": "비교하기", + "comparison": "비교", + "enterUsername": "입력하세요: 닉네임 혹은 \\$avgX (X는 랭크를 의미)", + "general": "일반", + "badges": "배지들", + "obtainDate": "${date}에 얻음", + "assignedManualy": "이 배지는 TETR.IO 관리자에 의해 부여되었습니다", + "distinguishment": "타이틀", + "banned": "밴", + "bannedSubtext": "TETR.IO 약관이나 규칙을 어기면 밴이 조치됩니다", + "badStanding": "나쁜 평판", + "badStandingSubtext": "최소 한 번 밴을 당한 기록이 있습니다", + "botAccount": "봇 계정", + "botAccountSubtext": "$botMaintainers에 의해 운영됨", + "copiedToClipboard": "클립보드에 복사되었습니다!", + "bio": "자기소개", + "news": "뉴스", + "matchResult": { + "victory": "승리", + "defeat": "패배", + "tie": "무승부", + "dqvictory": "상대의 연결이 끊어짐", + "dqdefeat": "실격패", + "nocontest": "경기 취소", + "nullified": "경기 무효" + }, + "distinguishments": { + "noHeader": "헤더를 찾을 수 없음", + "noFooter": "푸터를 찾을 수 없음", + "twc": "TETR.IO 세계 챔피언", + "twcYear": "$year TETR.IO 세계 챔피언십" + }, + "newsEntries": { + "leaderboard(rich)": "$gametype에서 $rank등을 달성했습니다", + "personalbest(rich)": "$gametype에서 $pb의 최고 기록을 달성했습니다", + "badge(rich)": "배지 획득: $badge", + "rankup(rich)": "테트라 리그 $rank 달성", + "supporter(rich)": "${s(TETR.IO supporter)} 가 되었습니다", + "supporter_gift(rich)": "${s(TETR.IO supporter)} 를 선물받았습니다", + "unknown(rich)": "$type 종류의 확인되지 않은 소식" + }, + "rankupMiddle": "${r} 랭크", + "copyUserID": "클릭하여 유저 ID를 복사", + "searchHint": "닉네임 또는 ID", + "navMenu": "탐색 메뉴", + "navMenuTooltip": "메뉴 열기", + "refresh": "정보 새로고침", + "searchButton": "검색", + "trackedPlayers": "추적된 플레이어들", + "standing": "순위", + "previousSeasons": "이전 시즌들", + "recent": "최근", + "top": "상위", + "noRecord": "기록 없음", + "sprintAndBlitsRelevance": "관련성: ${date}", + "snackBarMessages": { + "stateRemoved": "${date} 상태가 데이터베이스에서 제거되었어요!", + "matchRemoved": "${date} 매치가 데이터베이스에서 제거되었어요!", + "notForWeb": "웹 버전은 지원하지 않는 기능이에요", + "importSuccess": "불러오기 성공", + "importCancelled": "불러오기 거부됨" + }, + "errors": { + "noRecords": "기록 없음", + "notEnoughData": "데이터가 충분하지 않음", + "noHistorySaved": "저장된 기록 없음", + "connection": "연결 문제 발생: ${code} ${message}", + "noSuchUser": "사용자를 찾을 수 없습니다", + "noSuchUserSub": "당신이 오타를 냈거나, 그 계정이 사라졌을 수 있습니다", + "discordNotAssigned": "주어진 Discord ID에 해당하는 사용자가 없습니다", + "discordNotAssignedSub": "알맞은 ID를 입력하셨는지 다시 한번 확인해 주세요", + "history": "기록 찾기 실패", + "actionSuggestion": "이것을 찾으셨나요?", + "p1nkl0bst3rTLmatches": "테트라 리그 기록 없음", + "clientException": "인터넷 연결 없음", + "forbidden": "당신의 IP주소가 차단되었습니다", + "forbiddenSub": "만약 VPN이나 프록시 우회를 사용하고 계신다면 꺼 주세요. 그래도 문제가 발생하면, $nickname 에게 문의해 주세요", + "tooManyRequests": "레이트 리밋에 걸렸습니다.", + "tooManyRequestsSub": "잠시 기다렸다가 다시 시도해주세요", + "internal": "TETR.IO측에 문제가 일어났습니다", + "internalSub": "(osk는 이 문제에 대해 이미 알고 있을 것입니다)", + "internalWebVersion": "TETR.IO측 (또는 oskware_bridge, 솔직히 잘은 모르겠네요)에 문제가 일어났습니다", + "internalWebVersionSub": "만약 osk의 서버 상태 페이지(status.osk.sh)에 오류가 없다고 나온다면, dan63047에게 이 문제를 알려주세요", + "oskwareBridge": "oskware_bridge에 문제가 일어났습니다", + "oskwareBridgeSub": "dan63047에게 이 문제를 알려주세요", + "p1nkl0bst3rForbidden": "서드 파티 API가 당신의 IP 주소를 차단했습니다", + "p1nkl0bst3rTooManyRequests": "서드 파티 API에 너무 많은 요청이 들어왔습니다. 나중에 다시 시도해 주세요", + "p1nkl0bst3rinternal": "p1nkl0bst3r측에 문제가 일어났습니다", + "p1nkl0bst3rinternalWebVersion": "p1nkl0bst3r 측 (또는 oskware_bridge, 솔직히 잘은 모르겠네요)에 문제가 일어났습니다", + "replayAlreadySaved": "리플레이가 이미 저장됨", + "replayExpired": "리플레이가 만료되었으며 더 이상 볼 수 없습니다", + "replayRejected": "서드 파티 API가 당신의 IP 주소를 차단했습니다" + }, + "actions": { + "cancel": "취소", + "submit": "제출", + "ok": "확인", + "apply": "적용", + "refresh": "새로고침" + }, + "graphsDestination": { + "fetchAndsaveTLHistory": "기록 불러오기", + "fetchAndSaveOldTLmatches": "테트라 리그 경기 기록 불러오기", + "fetchAndsaveTLHistoryResult": "${number}개 상태가 발견됨", + "fetchAndSaveOldTLmatchesResult": "${number} 개의 경기를 찾았습니다", + "gamesPlayed": "$games 판 플레이함", + "dateAndTime": "날짜 및 시간", + "filterModaleTitle": "랭크별로 그래프 필터링하기" + }, + "filterModale": { + "all": "모두" + }, + "cutoffsDestination": { + "title": "테트라 리그 상황", + "relevance": "$timestamp 기준", + "actual": "실제", + "target": "목표", + "cutoffTR": "현재 커트라인", + "targetTR": "의도된 커트라인", + "state": "인플레이션/디플레이션", + "advanced": "고급", + "players": "플레이어 수 ($n)", + "moreInfo": "추가 정보", + "NumberOne": "현재 1위: $tr TR", + "inflated": "$tr TR 인플레이션", + "notInflated": "인플레이션 없음", + "deflated": "$tr TR 디플레이션", + "notDeflated": "디플레이션 없음", + "wellDotDotDot": "음...", + "fromPlace": "$n위까지", + "viewButton": "보기" + }, + "rankView": { + "rankTitle": "$rank 랭크 정보", + "everyoneTitle": "전체 리더보드", + "trRange": "TR 범위", + "supposedToBe": "의도된 범위", + "gap": "$value 범위", + "trGap": "$value TR 범위", + "deflationGap": "디플레이션 범위", + "inflationGap": "인플레이션 범위", + "LBposRange": "리더보드 순위 구간", + "overpopulated": "실제로는 $players 더 많음", + "underpopulated": "실제로는 $players 더 적음", + "PlayersEqualSupposedToBe": "귀엽다", + "avgStats": "평균 스탯", + "avgForRank": "$rank 랭크 평균", + "avgNerdStats": "평균 세부 스탯", + "minimums": "최소", + "maximums": "최대" + }, + "stateView": { + "title": "$date 당시 상태" + }, + "tlMatchView": { + "match": "경기", + "vs": "vs", + "winner": "승자", + "roundNumber": "라운드 $n", + "statsFor": "스탯의 분야:", + "numberOfRounds": "라운드 수", + "matchLength": "경기 길이", + "roundLength": "라운드 길이", + "matchStats": "경기 스탯", + "downloadReplay": ".ttrm 리플레이 다운로드", + "openReplay": "TETR.IO에서 리플레이 열기" + }, + "calcDestination": { + "placeholders": "당신의 $stat을 입력하세요", + "tip": "값을 입력하고 \"계산\" 버튼을 눌러 세부 스탯을 확인하세요", + "statsCalcButton": "계산", + "damageCalcTip": "왼쪽에서 줄 클리어를 눌러 여기 추가하세요", + "actions": "줄 클리어", + "results": "결과", + "rules": "규칙", + "noSpinClears": "스핀이 아닌 줄 클리어", + "spins": "스핀", + "miniSpins": "스핀 미니", + "noLineclear": "줄 클리어 없음 (콤보 끊김)", + "custom": "직접 입력", + "multiplier": "멀티플라이어", + "pcDamage": "퍼펙트 클리어 데미지", + "comboTable": "콤보 테이블", + "b2bChaining": "백투백 체인", + "surgeStartAtB2B": "서지가 시작되는 백투백", + "surgeStartAmount": "서지 시작 시 대미지", + "totalDamage": "총 대미지", + "lineclears": "지운 줄", + "combo": "콤보", + "surge": "서지", + "pcs": "퍼펙트 클리어" + }, + "infoDestination": { + "title": "정보", + "sprintAndBlitzAverages": "40 라인 & 블리츠 랭크별 평균치", + "sprintAndBlitzAveragesDescription": "40 라인과 블리츠 평균을 계산하는 것은 고된 작업이기 때문에 가끔씩 업데이트됩니다. 전체 40 라인과 블리츠 평균 표를 보려면 제목을 클릭하세요", + "tetraStatsWiki": "Tetra Stats 위키 (영어)", + "tetraStatsWikiDescription": "Tetra Stats가 제공하는 기능과 통계에 대한 더 자세한 정보를 알아보세요", + "about": "Tetra Stats에 대해", + "aboutDescription": "dan63에 의해 제작됨\n" + }, + "leaderboardsDestination": { + "title": "리더보드", + "tl": "테트라 리그 (현재 시즌)", + "fullTL": "테트라 리그 (현재 시즌, 전체 스탯)", + "ar": "업적 점수" + }, + "savedDataDestination": { + "title": "저장된 정보", + "tip": "왼쪽의 닉네임을 누르시면 정보가 표시됩니다", + "seasonTLstates": "시즌 $s 테트라 리그 상황", + "TLrecords": "테트라 리그 기록" + }, + "settingsDestination": { + "title": "설정", + "general": "일반", + "customization": "사용자 설정", + "database": "로컬 데이터베이스", + "checking": "확인 중...", + "enterToSubmit": "Enter 키를 눌러 제출하세요", + "account": "당신의 TETR.IO 계정", + "accountDescription": "앱이 실행되면 해당 플레이어의 스탯이 불러와집니다. 나의 (dan63) 스탯을 불러오는 게 기본값입니다. 바꾸려면, 당신의 닉네임을 입력하세요.", + "done": "완료!", + "noSuchAccount": "그런 계정이 없음", + "language": "언어", + "languageDescription": "Tetra Stats는 $languages로 번역되었습니다. 기본적으로 이 앱은 사용자의 시스템 언어를 고르지만, 만약 시스템 언어 번역이 지원되지 않는다면 영어를 고릅니다.", + "languages(plural)": { + "zero": "0개의 언어", + "one": "$n개의 언어", + "two": "$n개의 언어", + "few": "$n개의 언어", + "many": "$n개의 언어", + "other": "$n개의 언어" + }, + "updateInTheBackground": "백그라운드에서 정보 업데이트", + "updateInTheBackgroundDescription": "켜져 있다면, Tetra Stats는 캐시가 만료될 때마다 새로운 정보를 받으려고 시도할 것입니다. 주로 이는 5분마다 일어납니다.", + "compareStats": "테트라 리그 스탯을 랭크 평균과 비교하기", + "compareStatsDescription": "켜져 있다면, Tetra Stats는 당신이 당신의 랭크의 평균적인 플레이어와 스탯을 비교할 수 있도록 당신의 스탯을 알맞은 색으로 강조할 것입니다. 스탯 위에 커서를 올려 더 많은 정보를 확인하세요.", + "showPosition": "리더보드에서 스탯별 순위 표시", + "showPositionDescription": "켜져 있다면, 로딩 시간이 더 길어지지만 당신의 스탯별 순위를 볼 수 있도록 합니다", + "accentColor": "강조 색", + "accentColorDescription": "강조 색은 앱 곳곳에서 주로 상호작용 가능한 요소를 강조하기 위해 사용됩니다.", + "accentColorModale": "강조 색 고르기", + "timestamps": "시간 표시 형식", + "timestampsDescriptionPart1": "시각 표시 형식을 고릅니다. 기본 설정은 협정 세계시 (UTC)기준 시각을 언어에 맞는 형식으로 표시하는 것입니다. 예시: $d.", + "timestampsDescriptionPart2": "또한 다음과 같은 시간 표시 형식도 고를 수 있습니다:\n• 언어에 맞는 형식, 사용자의 시간대: $y\n• 상대적인 시간 표시: $r", + "timestampsAbsoluteGMT": "협정 세계시 (UTC) 기준", + "timestampsAbsoluteLocalTime": "사용자의 시간대 기준", + "timestampsRelative": "상대적인 시간 표시", + "sheetbotLikeGraphs": "레이더 그래프를 Sheetbot의 형식으로 표시", + "sheetbotLikeGraphsDescription": "저는 Sheetbot 형식의 레이더 그래프가 별로 정확하지 않다고 판단하였지만, 몇몇 사람들은 -0.5 스트라이딩 스탯이 Sheetbot 그래프에서처럼 표시되지 않는 것을 보고 혼란스러워 했습니다. 따라서, 이 설정이 켜져 있다면, 레이더 그래프의 점들은 스탯이 음수일 때 반대쪽에 나타날 것입니다.", + "oskKagariGimmick": "Osk-Kagari 기믹", + "oskKagariGimmickDescription": "켜져 있다면, osk의 랭크 대신 :kagari:가 표시됩니다.", + "bytesOfDataStored": "만큼의 데이터가 저장됨", + "TLrecordsSaved": "테트라 리그 기록 저장됨", + "TLplayerstatesSaved": "테트라 리그 플레이어스탯 저장됨", + "fixButton": "수정", + "compressButton": "압축", + "exportDB": "로컬 저장소로 내보내기", + "desktopExportAlertTitle": "데스크탑용 내보내기", + "desktopExportText": "데스크탑 버전으로 앱을 사용하시는 것 같군요. 문서 폴더로 들어가서, \"TetraStats.db\"를 찾고, 어딘가로 복사하세요", + "androidExportAlertTitle": "안드로이드용 내보내기", + "androidExportText": "내보내기 완료.\n${exportedDB}", + "importDB": "로컬 저장소에서 가져오기", + "importDBDescription": "백업을 복구합니다. 저장되어 있던 데이터베이스가 덮어씌워질 것임을 알려드립니다.", + "importWrongFileType": "잘못된 파일 형식" + }, + "homeNavigation": { + "overview": "둘러보기", + "standing": "순위", + "seasons": "시즌", + "mathces": "매치", + "pb": "개인 최고 기록", + "normal": "일반", + "expert": "전문가", + "expertRecords": "기록 내보내기" + }, + "graphsNavigation": { + "history": "플레이어 기록", + "league": "리그 현황", + "cutoffs": "커트라인 기록" + }, + "calcNavigation": { + "stats": "스탯 계산기", + "damage": "데미지 계산기" + }, + "firstTimeView": { + "welcome": "Tetra Stats에 오신 것을 환영합니다", + "description": "TETR.IO에 대한 다양한 통계를 추적할 수 있는 서비스", + "nicknameQuestion": "당신의 TETR.IO 닉네임은 무엇인가요?", + "inpuntHint": "여기 입력해주세요...(3-16자)", + "emptyInputError": "닉네임을 입력해 주세요", + "niceToSeeYou": "반갑습니다, $n", + "letsTakeALook": "당신의 통계를 살펴보겠습니다...", + "skip": "건너뛰기" + }, + "aboutView": { + "title": "Tetra Stats에 대해", + "about": "Tetra Stats는 TETR.IO 테트라 채널의 API를 활용하여 정보를 제공하고, 이 정보에 따른 추가적인 수치를 계산하는 서비스입니다. 이 서비스는 사용자가 테트라 리그에서 어떻게 발전하는지 추적할 수 있는 \"추적\" 기능을 제공합니다. 이 기능은 모든 테트라 리그에서의 변화를 로컬 데이터베이스에 기록하여(실시간으로 기록되지는 않습니다) 사용자가 이를 그래프로 볼 수 있도록 합니다. \n\nBeanserver Blaster는 Tetra Stats의 일부이며, 서버 사이드 스크립트로 떨어져 나왔습니다. Beanserver Blaster는 테트라 리그의 완전한 리더보드와 랭크 컷 등의 정보를 제공하여 Tetra Stats가 리더보드를 원하는 방식으로 정렬하고, 산점도 그래프를 그릴 수 있도록 돕는 역할을 합니다. 이를 통해 사용자는 테트라 리그의 추세를 분석할 수 있습니다. \n\n앞으로 리플레이 분석과 대회 기록 기능을 추가할 계획이 있으니, 계속해서 이 프로젝트에 관심을 기울여 주세요!\n\n이 서비스는 어떠한 방식으로도 TETR.IO 또는 osk와 직접적으로 연관되어 있지 않습니다.", + "appVersion": "앱 버전", + "build": "빌드 $build", + "GHrepo": "깃헙 리포지트리", + "submitAnIssue": "문제 보고하기", + "credits": "크레딧", + "authorAndDeveloper": "제작 & 개발", + "providedFormulas": "공식 제공", + "providedS1history": "테트라 리그 시즌 1 기록 제공", + "inoue": "Inoue (리플레이 그래버)", + "zhCNlocale": "중국어 간체 번역", + "deDElocale": "독일어 번역", + "koKRlocale": "한국어 번역", + "supportHim": "후원하기" + }, + "stats": { + "registrationDate": "가입일", + "gametime": "플레이 시간", + "ogp": "온라인 게임을 플레이함", + "ogw": "온라인 게임을 이김", + "followers": "팔로워", + "xp": { + "short": "XP", + "full": "경험치" + }, + "tr": { + "short": "TR", + "full": "테트라 레이팅" + }, + "glicko": { + "short": "Glicko", + "full": "글리코" + }, + "rd": { + "short": "RD", + "full": "레이팅 편차" + }, + "glixare": { + "short": "GXE", + "full": "GLIXARE" + }, + "s1tr": { + "short": "시즌 1 TR", + "full": "시즌 1 기준 TR" + }, + "gp": { + "short": "GP", + "full": "게임을 플레이함" + }, + "gw": { + "short": "GW", + "full": "게임을 이김" + }, + "winrate": { + "short": "WR%", + "full": "승률" + }, + "apm": { + "short": "APM", + "full": "분당 공격" + }, + "pps": { + "short": "PPS", + "full": "초당 미노" + }, + "vs": { + "short": "VS", + "full": "대결 점수" + }, + "app": { + "short": "APP", + "full": "미노당 공격" + }, + "vsapm": { + "short": "VS/APM", + "full": "VS / APM" + }, + "dss": { + "short": "DS/S", + "full": "초당 깎기" + }, + "dsp": { + "short": "DS/P", + "full": "미노당 깎기" + }, + "appdsp": { + "short": "APP+DSP", + "full": "APP + DSP" + }, + "cheese": { + "short": "치즈", + "full": "치즈 지수" + }, + "gbe": { + "short": "GbE", + "full": "쓰레기줄 효율" + }, + "nyaapp": { + "short": "wAPP", + "full": "가중 APP" + }, + "area": { + "short": "Area", + "full": "영역" + }, + "etr": { + "short": "eTR", + "full": "예상 TR" + }, + "etracc": { + "short": "±eTR", + "full": "예상 TR 오차" + }, + "opener": { + "short": "Opener", + "full": "오프너" + }, + "plonk": { + "short": "Plonk", + "full": "플롱크" + }, + "stride": { + "short": "Stride", + "full": "스트라이드" + }, + "infds": { + "short": "Inf. DS", + "full": "지속 깎기" + }, + "altitude": { + "short": "m", + "full": "고도" + }, + "climbSpeed": { + "short": "등반 속도", + "full": "등반 속도", + "gaugetTitle": "등반\n속도" + }, + "peakClimbSpeed": { + "short": "최고 등반 속도", + "full": "최고 등반 속도", + "gaugetTitle": "고점" + }, + "kos": { + "short": "처치", + "full": "처치한 플레이어" + }, + "b2b": { + "short": "B2B", + "full": "백투백" + }, + "finesse": { + "short": "F", + "full": "피네스", + "widgetTitle": "inesse" + }, + "finesseFaults": { + "short": "FF", + "full": "피네스 오류" + }, + "totalTime": { + "short": "시간", + "full": "총 시간", + "widgetTitle": "otal Time" + }, + "level": { + "short": "레벨", + "full": "레벨" + }, + "pieces": { + "short": "P", + "full": "미노" + }, + "spp": { + "short": "SPP", + "full": "미노당 점수" + }, + "kp": { + "short": "KP", + "full": "키 입력" + }, + "kpp": { + "short": "KPP", + "full": "미노당 키 입력" + }, + "kps": { + "short": "KPS", + "full": "초당 키 입력" + }, + "blitzScore": "$p점", + "levelUpRequirement": "레벨업까지 $p점", + "piecesTotal": "놓은 미노 수", + "piecesWithPerfectFinesse": "피네스를 지킨 미노", + "score": "점수", + "lines": "줄", + "linesShort": "줄", + "pcs": "퍼펙트 클리어", + "holds": "홀드", + "spike": "최고 스파이크", + "top": "상위 $percentage", + "topRank": "최고 랭크: $rank", + "floor": "층수", + "split": "부분", + "total": "전체", + "sent": "보낸 줄", + "received": "받은 줄", + "placement": "위치", + "peak": "고점", + "qpWithMods(plural)": { + "one": "1개 모드 사용", + "two": "$n개 모드 사용", + "few": "$n개 모드 사용", + "many": "$n개 모드 사용", + "other": "$n개 모드 사용" + }, + "inputs(plural)": { + "zero": "키를 $n번 누름", + "one": "키를 $n번 누름", + "two": "키를 $n번 누름", + "few": "키를 $n번 누름", + "many": "키를 $n번 누름", + "other": "키를 $n번 누름" + }, + "tspinsTotal(plural)": { + "zero": "총 $n번의 T스핀 수행", + "one": "총 $n번의 T스핀 수행", + "two": "총 $n번의 T스핀 수행", + "few": "총 $n번의 T스핀 수행", + "many": "총 $n번의 T스핀 수행", + "other": "총 $n번의 T스핀 수행" + }, + "linesCleared(plural)": { + "zero": "$n줄 제거", + "one": "$n줄 제거", + "two": "$n줄 제거", + "few": "$n줄 제거", + "many": "$n줄 제거", + "other": "$n줄 제거" + }, + "graphs": { + "attack": "공격", + "speed": "속도", + "defense": "수비", + "cheese": "치즈" + }, + "players(plural)": { + "zero": "$n 플레이어", + "one": "$n 플레이어", + "two": "$n 플레이어", + "few": "$n 플레이어", + "many": "$n 플레이어", + "other": "$n 플레이어" + }, + "games(plural)": { + "zero": "$n 게임", + "one": "$n 게임", + "two": "$n 게임", + "few": "$n 게임", + "many": "$n 게임", + "other": "$n 게임" + }, + "lineClear": { + "single": "싱글", + "double": "더블", + "triple": "트리플", + "quad": "쿼드", + "penta": "펜타", + "hexa": "헥사", + "hepta": "헵타", + "octa": "옥타", + "ennea": "에니아", + "deca": "데카", + "hendeca": "헨데카", + "dodeca": "도데카", + "triadeca": "트라이아데카", + "tessaradeca": "테사라데카", + "pentedeca": "펜타데카", + "hexadeca": "헥사데카", + "heptadeca": "헵타데카", + "octadeca": "옥타데카", + "enneadeca": "에니아데카", + "eicosa": "아이코사", + "kagaris": "카가리스" + }, + "lineClears": { + "zero": "제로스", + "single": "싱글", + "double": "더블", + "triple": "트리플", + "quad": "쿼드", + "penta": "펜타" + }, + "mini": "미니", + "tSpin": "T스핀", + "tSpins": "T스핀", + "spin": "스핀", + "spins": "스핀" + }, + "countries(map)": { + "": "전 세계", + "AF": "아프가니스탄", + "AX": "올란드 제도", + "AL": "알바니아", + "DZ": "알제리", + "AS": "미국령 사모아", + "AD": "안도라", + "AO": "앙골라", + "AI": "앵귈라", + "AQ": "남극", + "AG": "앤티가 바부다", + "AR": "아르헨티나", + "AM": "아르메니아", + "AW": "아루바", + "AU": "호주", + "AT": "오스트리아", + "AZ": "아제르바이잔", + "BS": "바하마", + "BH": "바레인", + "BD": "방글라데시", + "BB": "바베이도스", + "BY": "벨라루스", + "BE": "벨기에", + "BZ": "벨리즈", + "BJ": "베냉", + "BM": "버뮤다", + "BT": "부탄", + "BO": "볼리비아", + "BA": "보스니아 헤르체고비나", + "BW": "보츠와나", + "BV": "부베섬", + "BR": "브라질", + "IO": "영국령 인도양 지역", + "BN": "브루나이", + "BG": "불가리아", + "BF": "부르키나파소", + "BI": "부룬디", + "KH": "캄보디아", + "CM": "카메룬", + "CA": "캐나다", + "CV": "카보베르데", + "BQ": "네덜란드령 카리브섬", + "KY": "케이맨 제도", + "CF": "중앙아프리카 공화국", + "TD": "차드", + "CL": "칠레", + "CN": "중국", + "CX": "크리스마스섬", + "CC": "코코스(킬링)제도", + "CO": "콜롬비아", + "KM": "코모로", + "CG": "콩고", + "CD": "콩고 민주 공화국", + "CK": "쿡 제도", + "CR": "코스타리카", + "CI": "코트디부아르", + "HR": "크로아티아", + "CU": "쿠바", + "CW": "퀴라소", + "CY": "키프로스", + "CZ": "체코", + "DK": "덴마크", + "DJ": "지부티", + "DM": "도미니카", + "DO": "도미니카 공화국", + "EC": "에콰도르", + "EG": "이집트", + "SV": "엘살바도르", + "GB-ENG": "잉글랜드", + "GQ": "적도 기니", + "ER": "에리트레아", + "EE": "에스토니아", + "ET": "에티오피아", + "EU": "유럽 연합", + "FK": "포클랜드 제도", + "FO": "페로 제도", + "FJ": "피지", + "FI": "핀란드", + "FR": "프랑스", + "GF": "프랑스령 기아나", + "PF": "프랑스령 폴리네시아", + "TF": "프랑스령 남방", + "GA": "가봉", + "GM": "감비아", + "GE": "조지아", + "DE": "독일", + "GH": "가나", + "GI": "지브롤터", + "GR": "그리스", + "GL": "그린란드", + "GD": "그레나다", + "GP": "과들루프", + "GU": "괌", + "GT": "과테말라", + "GG": "건지섬", + "GN": "기니", + "GW": "기니비사우", + "GY": "가이아나", + "HT": "아이티", + "HM": "허드 맥도널드 제도", + "VA": "교황청 (바티칸 시국)", + "HN": "온두라스", + "HK": "홍콩", + "HU": "헝가리", + "IS": "아이슬란드", + "IN": "인도", + "ID": "인도네시아", + "IR": "이란", + "IQ": "이라크", + "IE": "아일랜드", + "IM": "맨섬", + "IL": "이스라엘", + "IT": "이탈리아", + "JM": "자메이카", + "JP": "일본", + "JE": "저지섬", + "JO": "요르단", + "KZ": "카자흐스탄", + "KE": "케냐", + "KI": "키리바시", + "KP": "조선민주주의인민공화국", + "KR": "대한민국", + "XK": "코소보", + "KW": "쿠웨이트", + "KG": "키르기스스탄", + "LA": "라오스", + "LV": "라트비아", + "LB": "레바논", + "LS": "레소토", + "LR": "라이베리아", + "LY": "리비아", + "LI": "리히텐슈타인", + "LT": "리투아니아", + "LU": "룩셈부르크", + "MO": "마카오", + "MK": "북마케도니아", + "MG": "마다가스카르", + "MW": "말라위", + "MY": "말레이시아", + "MV": "몰디브", + "ML": "말리", + "MT": "몰타", + "MH": "마셜 제도", + "MQ": "마르티니크", + "MR": "모리타니", + "MU": "모리셔스", + "YT": "마요트", + "MX": "멕시코", + "FM": "미크로네시아 연방", + "MD": "몰도바", + "MC": "모나코", + "ME": "몬테네그로", + "MA": "모로코", + "MN": "몽골", + "MS": "몬트세랫", + "MZ": "모잠비크", + "MM": "미얀마", + "NA": "나미비아", + "NR": "나우루", + "NP": "네팔", + "NL": "네덜란드", + "AN": "네덜란드령 안틸레스", + "NC": "뉴칼레도니아", + "NZ": "뉴질랜드", + "NI": "니카라과", + "NE": "니제르", + "NG": "나이지리아", + "NU": "니우에", + "NF": "노퍽섬", + "GB-NIR": "북아일랜드", + "MP": "북마리아나 제도", + "NO": "노르웨이", + "OM": "오만", + "PK": "파키스탄", + "PW": "팔라우", + "PS": "팔레스타인", + "PA": "파나마", + "PG": "파푸아뉴기니", + "PY": "파라과이", + "PE": "페루", + "PH": "필리핀", + "PN": "핏케언 제도", + "PL": "폴란드", + "PT": "포르투갈", + "PR": "푸에르토리코", + "QA": "카타르", + "RE": "레위니옹", + "RO": "루마니아", + "RU": "러시아", + "RW": "르완다", + "BL": "생바르텔레미", + "SH": "세인트헬레나 어센션 트리스탄다쿠냐", + "KN": "세인트키츠 네비스", + "LC": "세인트 루시아", + "MF": "생마르탱", + "PM": "생피에르 미클롱", + "VC": "세인트 빈센트 그레나딘", + "WS": "사모아", + "SM": "산마리노", + "ST": "상투메 프린시페", + "SA": "사우디아라비아", + "GB-SCT": "스코틀랜드", + "SN": "세네갈", + "RS": "세르비아", + "SC": "세이셸", + "SL": "시에라리온", + "SG": "싱가포르", + "SX": "신트마르턴 (네덜란드령)", + "SK": "슬로바키아", + "SI": "슬로베니아", + "SB": "솔로몬 제도", + "SO": "소말리아", + "ZA": "남아프리카 공화국", + "GS": "사우스조지아 사우스샌드위치 제도", + "SS": "남수단", + "ES": "스페인", + "LK": "스리랑카", + "SD": "수단", + "SR": "수리남", + "SJ": "스발바르 얀마옌 제도", + "SZ": "에스와티니", + "SE": "스웨덴", + "CH": "스위스", + "SY": "시리아", + "TW": "대만", + "TJ": "타지키스탄", + "TZ": "탄자니아", + "TH": "태국", + "TL": "동티모르", + "TG": "토고", + "TK": "토켈라우", + "TO": "통가", + "TT": "트리니다드 토바고", + "TN": "튀니지", + "TR": "튀르키예", + "TM": "투르크메니스탄", + "TC": "터크스 케이커스 제도", + "TV": "투발루", + "UG": "우간다", + "UA": "우크라이나", + "AE": "아랍에미리트", + "GB": "영국", + "US": "미국", + "UY": "우루과이", + "UM": "미국령 군소 제도", + "UZ": "우즈베키스탄", + "VU": "바누아투", + "VE": "볼리비아 베네수엘라", + "VN": "베트남", + "VG": "영국령 버진아일랜드", + "VI": "미국령 버진아일랜드", + "GB-WLS": "웨일스", + "WF": "왈리스 푸투나 제도", + "EH": "서사하라", + "YE": "예멘", + "ZM": "잠비아", + "ZW": "짐바브웨", + "XX": "국적 정보 없음", + "XM": "달" + } +} diff --git a/res/i18n/strings_ru-RU.i18n.json b/res/i18n/strings_ru-RU.i18n.json index 58511d8..8391fd4 100644 --- a/res/i18n/strings_ru-RU.i18n.json +++ b/res/i18n/strings_ru-RU.i18n.json @@ -2,6 +2,7 @@ "locales(map)": { "en": "Английский (English)", "ru-RU": "Русский", + "ko-KR": "Корейский (한국인)", "zh-CN": "Упрощенный Китайский (简体中文)", "de-DE": "Немецкий (Deutsch)" }, @@ -309,7 +310,7 @@ "updateInTheBackground": "Обновлять данные в фоновом режиме", "updateInTheBackgroundDescription": "Пока Tetra Stats работает, он может обновлять статистику самостоятельно когда кэш истекает. Обычно это происходит каждые 5 минут", "compareStats": "Сравнивать статистику со средними значениями ранга", - "compareStatsDescription": "Если включено, Tetra Stats загрузит средние значения и будет сравнивать вас со средними значениями вашего ранга. В результате этого почти каждый пункт статистики обретёт цвет, наводите курсор, что-бы узнать больше.", + "compareStatsDescription": "Если включено, Tetra Stats загрузит средние значения и будет сравнивать вас со средними значениями вашего ранга. В результате этого почти каждый пункт статистики обретёт цвет, наводите курсор, чтобы узнать больше.", "showPosition": "Показывать позиции по статам", "showPositionDescription": "На загрузку потребуется немного времени (и трафика), но зато вы сможете видеть своё положение в таблице Тетра Лиги, отсортированной по статам", "accentColor": "Цветовой акцент", @@ -382,6 +383,7 @@ "inoue": "Inoue (достаёт повторы)", "zhCNlocale": "Перевёл на упрощённый китайский", "deDElocale": "Перевёл на немецкий", + "koKRlocale": "Перевели на корейский", "supportHim": "Поддержите его!" }, "stats": { diff --git a/res/i18n/strings_zh-CN.i18n.json b/res/i18n/strings_zh-CN.i18n.json index a5b9ede..e55d5c7 100644 --- a/res/i18n/strings_zh-CN.i18n.json +++ b/res/i18n/strings_zh-CN.i18n.json @@ -2,6 +2,7 @@ "locales(map)": { "en": "英语 (English)", "ru-RU": "俄语 (Русский)", + "ko-KR": "韩语 (한국인)", "zh-CN": "简体中文", "de-DE": "德语 (Deutsch)" }, @@ -54,7 +55,7 @@ "dateAndTime": "日期和时间:", "TLfullLBnote": "很大,但允许你通过玩家的数据对玩家进行排序,还可以按段位筛选玩家", "rank": "段位", - "verdictGeneral": "比 $rank 段平均数据$n $verdict", + "verdictGeneral": "比 $rank 段平均数据$verdict $n", "verdictBetter": "好", "verdictWorse": "差", "localStanding": "本地", @@ -100,7 +101,7 @@ }, "distinguishments": { "noHeader": "缺少标题", - "noFooter": "缺少标题", + "noFooter": "缺少页脚", "twc": "TETR.IO 世界冠军", "twcYear": "$year TETR.IO 世界杯" }, @@ -121,7 +122,7 @@ "refresh": "刷新数据", "searchButton": "搜索", "trackedPlayers": "跟踪的玩家", - "standing": "名次", + "standing": "排行", "previousSeasons": "上赛季", "recent": "最近", "top": "前", @@ -196,10 +197,10 @@ "players": "玩家($n)", "moreInfo": "更多信息", "NumberOne": "№ 1 is $tr TR", - "inflated": "高于目标 $tr", - "notInflated": "不偏高", - "deflated": "低于目标 $tr", - "notDeflated": "不偏低", + "inflated": "超标 $tr", + "notInflated": "未超标", + "deflated": "未达标 $tr", + "notDeflated": "达标", "wellDotDotDot": "嗯…", "fromPlace": "自 № $n", "viewButton": "查看" @@ -360,7 +361,7 @@ }, "firstTimeView": { "welcome": "欢迎使用 Tetra Stats", - "description": "服务,允许您跟踪TETR.IO的各种数据", + "description": "您跟踪TETR.IO的各种数据的好帮手", "nicknameQuestion": "您的昵称是?", "inpuntHint": "在此处输入... (3-16个符号)", "emptyInputError": "不能提交空字符串", @@ -381,7 +382,8 @@ "providedS1history": "提供的 S1 历史", "inoue": "Inoue (回放抓取器)", "zhCNlocale": "简中翻译员", - "deDElocale": "德国语言环境", + "deDElocale": "德语翻译员", + "koKRlocale": "韩语翻译员", "supportHim": "为他提供支持!" }, "stats": { @@ -487,12 +489,12 @@ "full": "定式" }, "plonk": { - "short": "太极", - "full": "太极" + "short": "低速", + "full": "低速" }, "stride": { - "short": "速度", - "full": "速度" + "short": "快速", + "full": "快速" }, "infds": { "short": "挖掘", @@ -508,7 +510,7 @@ "gaugetTitle": "爬行速度" }, "peakClimbSpeed": { - "short": "最高CSP", + "short": "最高速", "full": "最高爬行速度", "gaugetTitle": "最高" }, @@ -523,7 +525,7 @@ "finesse": { "short": "极", "full": "极简率", - "widgetTitle": "简率" + "widgetTitle": "极简率" }, "finesseFaults": { "short": "非极简", diff --git a/web/index.html b/web/index.html index c40eb08..08357d9 100644 --- a/web/index.html +++ b/web/index.html @@ -131,7 +131,7 @@ } - +