@stats-forge/github-stats-forge-core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/build/api/contributed-to.js +1 -1
  2. package/build/api/gist.js +1 -1
  3. package/build/api/index.d.ts +1 -0
  4. package/build/api/index.d.ts.map +1 -1
  5. package/build/api/index.js +1 -0
  6. package/build/api/organization.d.ts +29 -0
  7. package/build/api/organization.d.ts.map +1 -0
  8. package/build/api/organization.js +53 -0
  9. package/build/api/params.js +1 -1
  10. package/build/api/pin.js +1 -1
  11. package/build/api/stats.js +1 -1
  12. package/build/api/top-langs.js +1 -1
  13. package/build/api/wakatime.js +1 -1
  14. package/build/cards/{contributed-to.d.ts → contributed-to/index.d.ts} +3 -3
  15. package/build/cards/contributed-to/index.d.ts.map +1 -0
  16. package/build/cards/{contributed-to.js → contributed-to/index.js} +31 -30
  17. package/build/cards/contributed-to/locales.d.ts +38 -0
  18. package/build/cards/contributed-to/locales.d.ts.map +1 -0
  19. package/build/cards/contributed-to/locales.js +39 -0
  20. package/build/cards/{gist.d.ts → gist/index.d.ts} +3 -3
  21. package/build/cards/gist/index.d.ts.map +1 -0
  22. package/build/cards/{gist.js → gist/index.js} +20 -15
  23. package/build/cards/gist/locales.d.ts +14 -0
  24. package/build/cards/gist/locales.d.ts.map +1 -0
  25. package/build/cards/gist/locales.js +15 -0
  26. package/build/cards/organization/index.d.ts +36 -0
  27. package/build/cards/organization/index.d.ts.map +1 -0
  28. package/build/cards/organization/index.js +225 -0
  29. package/build/cards/organization/locales.d.ts +47 -0
  30. package/build/cards/organization/locales.d.ts.map +1 -0
  31. package/build/cards/organization/locales.js +47 -0
  32. package/build/cards/{repo.d.ts → repo/index.d.ts} +3 -3
  33. package/build/cards/repo/index.d.ts.map +1 -0
  34. package/build/cards/{repo.js → repo/index.js} +20 -23
  35. package/build/cards/repo/locales.d.ts +129 -0
  36. package/build/cards/repo/locales.d.ts.map +1 -0
  37. package/build/cards/repo/locales.js +129 -0
  38. package/build/cards/{stats.d.ts → stats/index.d.ts} +3 -3
  39. package/build/cards/stats/index.d.ts.map +1 -0
  40. package/build/cards/{stats.js → stats/index.js} +38 -42
  41. package/build/cards/stats/locales.d.ts +621 -0
  42. package/build/cards/stats/locales.d.ts.map +1 -0
  43. package/build/cards/stats/locales.js +623 -0
  44. package/build/cards/{top-languages.d.ts → top-languages/index.d.ts} +3 -3
  45. package/build/cards/top-languages/index.d.ts.map +1 -0
  46. package/build/cards/{top-languages.js → top-languages/index.js} +13 -16
  47. package/build/cards/top-languages/locales.d.ts +103 -0
  48. package/build/cards/top-languages/locales.d.ts.map +1 -0
  49. package/build/cards/top-languages/locales.js +103 -0
  50. package/build/cards/{wakatime.d.ts → wakatime/index.d.ts} +3 -3
  51. package/build/cards/wakatime/index.d.ts.map +1 -0
  52. package/build/cards/{wakatime.js → wakatime/index.js} +22 -23
  53. package/build/cards/wakatime/locales.d.ts +250 -0
  54. package/build/cards/wakatime/locales.d.ts.map +1 -0
  55. package/build/cards/wakatime/locales.js +250 -0
  56. package/build/common/brand.d.ts +1 -0
  57. package/build/common/brand.d.ts.map +1 -1
  58. package/build/common/brand.js +1 -0
  59. package/build/common/error.d.ts +3 -1
  60. package/build/common/error.d.ts.map +1 -1
  61. package/build/common/error.js +3 -1
  62. package/build/common/icons.d.ts +5 -0
  63. package/build/common/icons.d.ts.map +1 -1
  64. package/build/common/icons.js +19 -4
  65. package/build/common/locales.d.ts +59 -0
  66. package/build/common/locales.d.ts.map +1 -0
  67. package/build/common/locales.js +59 -0
  68. package/build/common/localize.d.ts +60 -0
  69. package/build/common/localize.d.ts.map +1 -0
  70. package/build/common/localize.js +163 -0
  71. package/build/fetchers/index.d.ts +2 -1
  72. package/build/fetchers/index.d.ts.map +1 -1
  73. package/build/fetchers/index.js +1 -0
  74. package/build/fetchers/organization.d.ts +15 -0
  75. package/build/fetchers/organization.d.ts.map +1 -0
  76. package/build/fetchers/organization.js +115 -0
  77. package/build/fetchers/types.d.ts +38 -0
  78. package/build/fetchers/types.d.ts.map +1 -1
  79. package/build/graphql/generated/organization.d.ts +88 -0
  80. package/build/graphql/generated/organization.d.ts.map +1 -0
  81. package/build/graphql/generated/organization.js +59 -0
  82. package/package.json +1 -1
  83. package/src/api/contributed-to.ts +1 -1
  84. package/src/api/gist.ts +1 -1
  85. package/src/api/index.ts +1 -0
  86. package/src/api/organization.ts +90 -0
  87. package/src/api/params.ts +1 -1
  88. package/src/api/pin.ts +1 -1
  89. package/src/api/stats.ts +1 -1
  90. package/src/api/top-langs.ts +1 -1
  91. package/src/api/wakatime.ts +1 -1
  92. package/src/cards/{contributed-to.ts → contributed-to/index.ts} +42 -39
  93. package/src/cards/contributed-to/locales.ts +41 -0
  94. package/src/cards/{gist.ts → gist/index.ts} +23 -20
  95. package/src/cards/gist/locales.ts +17 -0
  96. package/src/cards/organization/index.ts +358 -0
  97. package/src/cards/organization/locales.ts +49 -0
  98. package/src/cards/{repo.ts → repo/index.ts} +23 -26
  99. package/src/cards/repo/locales.ts +131 -0
  100. package/src/cards/{stats.ts → stats/index.ts} +48 -56
  101. package/src/cards/stats/locales.ts +625 -0
  102. package/src/cards/{top-languages.ts → top-languages/index.ts} +17 -20
  103. package/src/cards/top-languages/locales.ts +105 -0
  104. package/src/cards/{wakatime.ts → wakatime/index.ts} +26 -27
  105. package/src/cards/wakatime/locales.ts +252 -0
  106. package/src/common/brand.ts +1 -0
  107. package/src/common/error.ts +4 -0
  108. package/src/common/icons.ts +20 -4
  109. package/src/common/locales.ts +61 -0
  110. package/src/common/localize.ts +251 -0
  111. package/src/fetchers/index.ts +2 -0
  112. package/src/fetchers/organization.ts +153 -0
  113. package/src/fetchers/types.ts +36 -0
  114. package/src/graphql/generated/organization.ts +109 -0
  115. package/src/graphql/queries/organization.graphql +57 -0
  116. package/build/cards/contributed-to.d.ts.map +0 -1
  117. package/build/cards/gist.d.ts.map +0 -1
  118. package/build/cards/repo.d.ts.map +0 -1
  119. package/build/cards/stats.d.ts.map +0 -1
  120. package/build/cards/top-languages.d.ts.map +0 -1
  121. package/build/cards/wakatime.d.ts.map +0 -1
  122. package/build/common/I18n.d.ts +0 -21
  123. package/build/common/I18n.d.ts.map +0 -1
  124. package/build/common/I18n.js +0 -34
  125. package/build/translations.d.ts +0 -1212
  126. package/build/translations.d.ts.map +0 -1
  127. package/build/translations.js +0 -1213
  128. package/src/common/I18n.ts +0 -50
  129. package/src/translations.ts +0 -1239
@@ -0,0 +1,129 @@
1
+ import { defineLocales } from '../../common/localize.js';
2
+ /** The repo card's labels in the locales they have been translated into. */
3
+ const repoCardLocales = defineLocales({
4
+ noDescription: {
5
+ en: 'No description provided',
6
+ },
7
+ unspecifiedLanguage: {
8
+ en: 'Unspecified',
9
+ },
10
+ template: {
11
+ en: 'Template',
12
+ ar: 'قالب',
13
+ az: 'Şablon',
14
+ bg: 'Шаблон',
15
+ bn: 'টেমপ্লেট',
16
+ ca: 'Plantilla',
17
+ cn: '模板',
18
+ 'zh-tw': '模板',
19
+ cs: 'Šablona',
20
+ de: 'Vorlage',
21
+ sw: 'Kigezo',
22
+ ur: 'سانچہ',
23
+ es: 'Plantilla',
24
+ fa: 'الگو',
25
+ fi: 'Malli',
26
+ fr: 'Modèle',
27
+ hi: 'खाका',
28
+ sa: 'प्रारूपम्',
29
+ hu: 'Sablon',
30
+ it: 'Template',
31
+ ja: 'テンプレート',
32
+ kr: '템플릿',
33
+ nl: 'Sjabloon',
34
+ 'pt-pt': 'Modelo',
35
+ 'pt-br': 'Modelo',
36
+ np: 'टेम्पलेट',
37
+ el: 'Πρότυπο',
38
+ ro: 'Șablon',
39
+ ru: 'Шаблон',
40
+ 'uk-ua': 'Шаблон',
41
+ id: 'Pola',
42
+ ml: 'ടെംപ്ലേറ്റ്',
43
+ my: 'ပုံစံ',
44
+ ta: `டெம்ப்ளேட்`,
45
+ sk: 'Šablóna',
46
+ tr: 'Şablon',
47
+ pl: 'Szablony',
48
+ uz: 'Shablon',
49
+ vi: 'Mẫu',
50
+ se: 'Mall',
51
+ he: 'תבנית',
52
+ fil: 'Suleras',
53
+ th: 'เทมเพลต',
54
+ sr: 'Шаблон',
55
+ 'sr-latn': 'Šablon',
56
+ no: 'Mal',
57
+ be: 'Шаблон',
58
+ },
59
+ archived: {
60
+ en: 'Archived',
61
+ ar: 'مُؤرشف',
62
+ az: 'Arxiv',
63
+ bg: 'Архивирани',
64
+ bn: 'আর্কাইভড',
65
+ ca: 'Arxivats',
66
+ cn: '已归档',
67
+ 'zh-tw': '已封存',
68
+ cs: 'Archivováno',
69
+ de: 'Archiviert',
70
+ sw: 'Hifadhiwa kwenye kumbukumbu',
71
+ ur: 'محفوظ شدہ',
72
+ es: 'Archivados',
73
+ fa: 'بایگانی‌شده',
74
+ fi: 'Arkistoitu',
75
+ fr: 'Archivé',
76
+ hi: 'संग्रहीत',
77
+ sa: 'संगृहीतम्',
78
+ hu: 'Archivált',
79
+ it: 'Archiviata',
80
+ ja: 'アーカイブ済み',
81
+ kr: '보관됨',
82
+ nl: 'Gearchiveerd',
83
+ 'pt-pt': 'Arquivados',
84
+ 'pt-br': 'Arquivados',
85
+ np: 'अभिलेख राखियो',
86
+ el: 'Αρχειοθετημένα',
87
+ ro: 'Arhivat',
88
+ ru: 'Архивирован',
89
+ 'uk-ua': 'Архивований',
90
+ id: 'Arsip',
91
+ ml: 'ശേഖരിച്ചത്',
92
+ my: 'သိုလှောင်ပြီး',
93
+ ta: `காப்பகப்படுத்தப்பட்டது`,
94
+ sk: 'Archivované',
95
+ tr: 'Arşiv',
96
+ pl: 'Zarchiwizowano',
97
+ uz: 'Arxivlangan',
98
+ vi: 'Đã Lưu Trữ',
99
+ se: 'Arkiverade',
100
+ he: 'גנוז',
101
+ fil: 'Naka-arkibo',
102
+ th: 'เก็บถาวร',
103
+ sr: 'Архивирано',
104
+ 'sr-latn': 'Arhivirano',
105
+ no: 'Arkivert',
106
+ be: 'Архіваваны',
107
+ },
108
+ prsAuthored: {
109
+ en: 'my created PRs',
110
+ 'zh-tw': '我所創建的拉取請求',
111
+ },
112
+ prsCommented: {
113
+ en: 'my commented PRs',
114
+ 'zh-tw': '我所參與的拉取請求',
115
+ },
116
+ prsReviewed: {
117
+ en: 'my reviewed PRs',
118
+ 'zh-tw': '我所審核的拉取請求',
119
+ },
120
+ issuesAuthored: {
121
+ en: 'my created issues',
122
+ 'zh-tw': '我所創建的議題',
123
+ },
124
+ issuesCommented: {
125
+ en: 'my commented issues',
126
+ 'zh-tw': '我所參與的議題',
127
+ },
128
+ });
129
+ export { repoCardLocales };
@@ -1,5 +1,5 @@
1
- import type { StatsData } from '../fetchers/types.ts';
2
- import type { CardOptions, CommonCardOptions } from './options.ts';
1
+ import type { StatsData } from '../../fetchers/types.ts';
2
+ import type { CardOptions, CommonCardOptions } from '../options.ts';
3
3
  /** Rank indicators the card can draw; the api validates `rank_icon` against this. */
4
4
  declare const RANK_ICONS: readonly ['default', 'github', 'percentile'];
5
5
  type RankIcon = (typeof RANK_ICONS)[number];
@@ -41,4 +41,4 @@ declare const renderStatsCard: typeof renderCard & {
41
41
  };
42
42
  };
43
43
  export { renderStatsCard };
44
- //# sourceMappingURL=stats.d.ts.map
44
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cards/stats/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAuBpE,qFAAqF;AACrF,QAAA,MAAM,UAAU,YAAI,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAU,CAAC;AAChE,KAAK,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AA0B5C,UAAU,eAAgB,SAAQ,iBAAiB;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,QAAQ,CAAC;IACpB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACrB;AA8ID;;;;GAIG;AACH,QAAA,MAAM,UAAU,UACP,SAAS,YACP,WAAW,CAAC,eAAe,CAAC,aAC1B,MAAM,SACX,KAAK,CAAC,MAAM,CAAC,UACZ,KAAK,CAAC,MAAM,CAAC,KACnB,MAoWF,CAAC;AAEF;;;;GAIG;AACH,QAAA,MAAM,eAAe;;QAEjB,SAAS;QACT,IAAI;QACJ,IAAI;QACJ,aAAa;;CAEf,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,14 +1,15 @@
1
- import { CARD_ICON, CARD_WIDTH, FONT_SIZE, FONT_WEIGHT, firefoxFontSize, font, } from '../common/brand.js';
2
- import { Card } from '../common/Card.js';
3
- import { getLightDarkColors } from '../common/color.js';
4
- import { formatRange } from '../common/date.js';
5
- import { CardError } from '../common/error.js';
6
- import { I18n } from '../common/I18n.js';
7
- import { icons, rankIcon } from '../common/icons.js';
8
- import { buildSearchFilter, clampValue } from '../common/ops.js';
9
- import { NUMBER_FORMATS, createTextNode, flexLayout, measureText } from '../common/render.js';
10
- import { atRule, cssComment, el, rule } from '../markup/index.js';
11
- import { statCardLocales, wakatimeCardLocales } from '../translations.js';
1
+ import { CARD_ICON, CARD_WIDTH, FONT_SIZE, FONT_WEIGHT, firefoxFontSize, font, } from '../../common/brand.js';
2
+ import { Card } from '../../common/Card.js';
3
+ import { getLightDarkColors } from '../../common/color.js';
4
+ import { formatRange } from '../../common/date.js';
5
+ import { CardError } from '../../common/error.js';
6
+ import { icons, rankIcon } from '../../common/icons.js';
7
+ import { commonLocales } from '../../common/locales.js';
8
+ import { localize } from '../../common/localize.js';
9
+ import { buildSearchFilter, clampValue } from '../../common/ops.js';
10
+ import { NUMBER_FORMATS, createTextNode, flexLayout, measureText } from '../../common/render.js';
11
+ import { atRule, cssComment, el, rule } from '../../markup/index.js';
12
+ import { statCardLocales } from './locales.js';
12
13
  const CARD_MIN_WIDTH = 287;
13
14
  const CARD_DEFAULT_WIDTH = CARD_WIDTH.compact;
14
15
  const RANK_CARD_DEFAULT_WIDTH = CARD_WIDTH.wide;
@@ -142,11 +143,11 @@ const getStyles = ({ textColor, iconColor, ringColor, show_icons, progress, }) =
142
143
  /**
143
144
  * @returns What the commit count covers, for the stat's label.
144
145
  */
145
- const getTotalCommitsRangeLabel = (include_all_commits, commitsRange, i18n) => include_all_commits
146
+ const getTotalCommitsRangeLabel = (include_all_commits, commitsRange, commonT) => include_all_commits
146
147
  ? ''
147
148
  : commitsRange
148
149
  ? ` (${formatRange(commitsRange)})`
149
- : ` (${i18n.t('wakatimecard.lastyear')})`;
150
+ : ` (${commonT.lastYear()})`;
150
151
  /**
151
152
  * Renders the stats card.
152
153
  *
@@ -160,18 +161,13 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
160
161
  // Typed against the exported list, so a stat drawn here cannot be missing from it.
161
162
  const shows = (stat) => show.includes(stat);
162
163
  const apostrophe = /s$/i.test(name.trim()) ? '' : 's';
163
- const i18n = new I18n({
164
- locale,
165
- translations: {
166
- ...statCardLocales({ name, apostrophe }),
167
- ...wakatimeCardLocales,
168
- },
169
- });
164
+ const t = localize(statCardLocales, locale);
165
+ const commonT = localize(commonLocales, locale);
170
166
  // Meta data for creating text nodes with createTextNode function
171
167
  const STATS = {
172
168
  stars: {
173
169
  icon: icons.star,
174
- label: i18n.t('statcard.totalstars'),
170
+ label: t.totalStars(),
175
171
  value: totalStars,
176
172
  id: 'stars',
177
173
  },
@@ -179,27 +175,27 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
179
175
  if (shows('contributions')) {
180
176
  STATS['contributions'] = {
181
177
  icon: icons.contributions,
182
- label: i18n.t('statcard.contributions'),
178
+ label: t.contributions(),
183
179
  value: totalContributions,
184
180
  id: 'contributions',
185
181
  };
186
182
  }
187
183
  STATS['commits'] = {
188
184
  icon: icons.commits,
189
- label: `${i18n.t('statcard.commits')}${getTotalCommitsRangeLabel(include_all_commits, commitsRange, i18n)}`,
185
+ label: `${t.commits()}${getTotalCommitsRangeLabel(include_all_commits, commitsRange, commonT)}`,
190
186
  value: totalCommits,
191
187
  id: 'commits',
192
188
  };
193
189
  STATS['prs'] = {
194
190
  icon: icons.prs,
195
- label: i18n.t('statcard.prs'),
191
+ label: t.prs(),
196
192
  value: totalPRs,
197
193
  id: 'prs',
198
194
  };
199
195
  if (shows('prs_merged')) {
200
196
  STATS['prs_merged'] = {
201
197
  icon: icons.prs_merged,
202
- label: i18n.t('statcard.prs-merged'),
198
+ label: t.prsMerged(),
203
199
  value: totalPRsMerged,
204
200
  id: 'prs_merged',
205
201
  };
@@ -207,7 +203,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
207
203
  if (shows('prs_merged_percentage')) {
208
204
  STATS['prs_merged_percentage'] = {
209
205
  icon: icons.prs_merged_percentage,
210
- label: i18n.t('statcard.prs-merged-percentage'),
206
+ label: t.prsMergedPercentage(),
211
207
  value: mergedPRsPercentage.toFixed(number_precision !== undefined && Number.isFinite(number_precision)
212
208
  ? clampValue(number_precision, 0, 2)
213
209
  : 2),
@@ -218,21 +214,21 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
218
214
  if (shows('reviews')) {
219
215
  STATS['reviews'] = {
220
216
  icon: icons.reviews,
221
- label: i18n.t('statcard.reviews'),
217
+ label: t.reviews(),
222
218
  value: totalReviews,
223
219
  id: 'reviews',
224
220
  };
225
221
  }
226
222
  STATS['issues'] = {
227
223
  icon: icons.issues,
228
- label: i18n.t('statcard.issues'),
224
+ label: t.issues(),
229
225
  value: totalIssues,
230
226
  id: 'issues',
231
227
  };
232
228
  if (shows('discussions_started')) {
233
229
  STATS['discussions_started'] = {
234
230
  icon: icons.discussions_started,
235
- label: i18n.t('statcard.discussions-started'),
231
+ label: t.discussionsStarted(),
236
232
  value: totalDiscussionsStarted,
237
233
  id: 'discussions_started',
238
234
  };
@@ -240,7 +236,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
240
236
  if (shows('discussions_answered')) {
241
237
  STATS['discussions_answered'] = {
242
238
  icon: icons.discussions_answered,
243
- label: i18n.t('statcard.discussions-answered'),
239
+ label: t.discussionsAnswered(),
244
240
  value: totalDiscussionsAnswered,
245
241
  id: 'discussions_answered',
246
242
  };
@@ -250,7 +246,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
250
246
  if (shows('prs_authored')) {
251
247
  STATS['prs_authored'] = {
252
248
  icon: icons.prs,
253
- label: i18n.t('statcard.prs-authored'),
249
+ label: t.prsAuthored(),
254
250
  value: totalPRsAuthored,
255
251
  id: 'prs_authored',
256
252
  link: `https://github.com/search?q=${repoFilter}author%3A${encodedUsername}&type=pullrequests`,
@@ -259,7 +255,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
259
255
  if (shows('prs_commented')) {
260
256
  STATS['prs_commented'] = {
261
257
  icon: icons.comments,
262
- label: i18n.t('statcard.prs-commented'),
258
+ label: t.prsCommented(),
263
259
  value: totalPRsCommented,
264
260
  id: 'prs_commented',
265
261
  link: `https://github.com/search?q=${repoFilter}commenter%3A${encodedUsername}+-author%3A${encodedUsername}&type=pullrequests`,
@@ -268,7 +264,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
268
264
  if (shows('prs_reviewed')) {
269
265
  STATS['prs_reviewed'] = {
270
266
  icon: icons.reviews,
271
- label: i18n.t('statcard.prs-reviewed'),
267
+ label: t.prsReviewed(),
272
268
  value: totalPRsReviewed,
273
269
  id: 'prs_reviewed',
274
270
  link: `https://github.com/search?q=${repoFilter}reviewed-by%3A${encodedUsername}+-author%3A${encodedUsername}&type=pullrequests`,
@@ -277,7 +273,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
277
273
  if (shows('issues_authored')) {
278
274
  STATS['issues_authored'] = {
279
275
  icon: icons.issues,
280
- label: i18n.t('statcard.issues-authored'),
276
+ label: t.issuesAuthored(),
281
277
  value: totalIssuesAuthored,
282
278
  id: 'issues_authored',
283
279
  link: `https://github.com/search?q=${repoFilter}author%3A${encodedUsername}&type=issues`,
@@ -286,7 +282,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
286
282
  if (shows('issues_commented')) {
287
283
  STATS['issues_commented'] = {
288
284
  icon: icons.discussions_started,
289
- label: i18n.t('statcard.issues-commented'),
285
+ label: t.issuesCommented(),
290
286
  value: totalIssuesCommented,
291
287
  id: 'issues_commented',
292
288
  link: `https://github.com/search?q=${repoFilter}commenter%3A${encodedUsername}+-author%3A${encodedUsername}&type=issues`,
@@ -294,14 +290,14 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
294
290
  }
295
291
  STATS['contribs'] = {
296
292
  icon: icons.repo,
297
- label: i18n.t('statcard.contribs'),
293
+ label: t.contribs(),
298
294
  value: contributedTo,
299
295
  id: 'contribs',
300
296
  };
301
297
  if (shows('all_time_contribs')) {
302
298
  STATS['all_time_contribs'] = {
303
299
  icon: icons.repo,
304
- label: i18n.t('statcard.all-time-contribs'),
300
+ label: t.allTimeContribs(),
305
301
  value: allTimeContributedTo,
306
302
  id: 'all_time_contribs',
307
303
  };
@@ -316,13 +312,13 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
316
312
  });
317
313
  }
318
314
  // check if all used labels are short
315
+ const defaultTitle = visibleStats.length > 0 ? t.title({ name, apostrophe }) : t.rankTitle({ name, apostrophe });
319
316
  const longLabels = visibleStats.some(([, stat]) => stat.label.length > 18);
320
317
  // The rank ring sets the floor: 150 beside the stats, 180 when it is the whole card.
321
318
  const height = Math.max(45 + (visibleStats.length + 1) * lheight, hide_rank ? 0 : visibleStats.length > 0 ? 150 : 180);
322
319
  // the lower the user's percentile the better
323
320
  const progress = 100 - rank.percentile;
324
- const calculateTextWidth = () => measureText(custom_title ||
325
- (visibleStats.length > 0 ? i18n.t('statcard.title') : i18n.t('statcard.ranktitle')));
321
+ const calculateTextWidth = () => measureText(custom_title || defaultTitle);
326
322
  const iconWidth = show_icons && visibleStats.length > 0 ? 16 + /* padding */ 1 : 0;
327
323
  // The icons ride inside the step's own slack, so a default card lands on the width grid;
328
324
  // only the minimum, which has no slack, still has to make room for them.
@@ -363,7 +359,7 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
363
359
  }));
364
360
  const card = new Card({
365
361
  customTitle: custom_title,
366
- defaultTitle: visibleStats.length > 0 ? i18n.t('statcard.title') : i18n.t('statcard.ranktitle'),
362
+ defaultTitle,
367
363
  titlePrefixIcon: CARD_ICON.stats,
368
364
  width,
369
365
  height,
@@ -396,13 +392,13 @@ const renderCard = (stats, options = {}, username, repo = [], owner = []) => {
396
392
  const labels = visibleStats
397
393
  .map(([key, stat]) => {
398
394
  if (key === 'commits') {
399
- return `${i18n.t('statcard.commits')} ${getTotalCommitsRangeLabel(include_all_commits, commitsRange, i18n)} : ${stat.value}`;
395
+ return `${t.commits()} ${getTotalCommitsRangeLabel(include_all_commits, commitsRange, commonT)} : ${stat.value}`;
400
396
  }
401
397
  return `${stat.label}: ${stat.value}`;
402
398
  })
403
399
  .join(', ');
404
400
  card.setAccessibilityLabel({
405
- title: `${card.title}, ${i18n.t('statcard.rank')}: ${rank.level}`,
401
+ title: t.accessibilityTitle({ title: card.title, level: rank.level }),
406
402
  desc: labels,
407
403
  });
408
404
  return card.render([