this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Show list of i18n volunteers in readme

+593 -1
+34
.github/workflows/i18n-update-readme.yml
··· 1 + name: Update README with list of i18n volunteers 2 + 3 + on: 4 + schedule: 5 + # Every week 6 + - cron: '0 0 * * 0' 7 + workflow_dispatch: 8 + 9 + jobs: 10 + update-readme: 11 + runs-on: ubuntu-latest 12 + steps: 13 + - uses: actions/checkout@v4 14 + - uses: actions/setup-node@v4 15 + with: 16 + node-version: 20 17 + - run: npm ci 18 + - run: | 19 + npm run fetch-i18n-volunteers 20 + npm run readme:i18n-volunteers 21 + 22 + # Commit & push if there are changes 23 + if git diff --quiet README.md; then 24 + echo "No changes to README.md" 25 + else 26 + echo "Changes to README.md" 27 + git config --global user.email "github-actions[bot]@users.noreply.github.com" 28 + git config --global user.name "github-actions[bot]" 29 + git add README.md 30 + git commit -m "Update README.md" 31 + git push 32 + fi 33 + env: 34 + CROWDIN_ACCESS_TOKEN: ${{ secrets.CROWDIN_ACCESS_TOKEN }}
+53
README.md
··· 292 292 293 293 [![Contributors](https://contrib.rocks/image?repo=cheeaun/phanpy)](https://github.com/cheeaun/phanpy/graphs/contributors) 294 294 295 + ### Translation volunteers 296 + 297 + <!-- i18n volunteers start --> 298 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/12571163/medium/9f3ea938f4243f5ffe2a43f814ddc9e8_default.png" alt="" width="16" height="16" /> alidsds11 (Arabic) 299 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/13170041/medium/603136896af17fc005fd592ce3f48717_default.png" alt="" width="16" height="16" /> BoFFire (Arabic, French, Kabyle) 300 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/12898464/medium/d3758a76b894bade4bf271c9b32ea69b.png" alt="" width="16" height="16" /> Brawaru (Russian) 301 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15460040/medium/1cfcfe5f5511b783b5d9f2b968bad819.png" alt="" width="16" height="16" /> cbasje (Dutch) 302 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15525631/medium/51293156034d0236f1a1020c10f7d539_default.png" alt="" width="16" height="16" /> cbo92 (French) 303 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15910131/medium/67fab7eeab5551853450e76e2ef19e59.jpeg" alt="" width="16" height="16" /> CDN (Chinese Simplified) 304 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16556801/medium/ed5e501ca1f3cc6525d2da28db646346.jpeg" alt="" width="16" height="16" /> dannypsnl (Chinese Traditional) 305 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/3711/medium/d95ddd44e8dcb3a039f8a3463aed781d_default.png" alt="" width="16" height="16" /> databio (Catalan) 306 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/12618120/medium/ccb11bd042bbf4c7189033f7af2dbd32_default.png" alt="" width="16" height="16" /> drydenwu (Chinese Traditional) 307 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/13557465/medium/8feebf3677fa80c01e8c54c4fbe097e0_default.png" alt="" width="16" height="16" /> elissarc (French) 308 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16528627/medium/9036f6eced0257f4e1ea4c5bd499de2d_default.png" alt="" width="16" height="16" /> ElPamplina (Spanish) 309 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14277386/medium/29b30d2c73a214000e3941c9978f49e4_default.png" alt="" width="16" height="16" /> Fitik (Esperanto, Hebrew) 310 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14444512/medium/99d0e7a3076deccbdfe0aa0b0612308c.jpeg" alt="" width="16" height="16" /> Freeesia (Japanese) 311 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/medium/a201650da44fed28890b0e0d8477a663.jpg" alt="" width="16" height="16" /> ghose (Galician) 312 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15248754/medium/0dac6334ea0f4e8d4194a605c0a5594a.jpeg" alt="" width="16" height="16" /> hongminhee (Korean) 313 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/13454728/medium/1f78b7124b3c962bc4ae55e8d701fc91_default.png" alt="" width="16" height="16" /> isard (Catalan) 314 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16532403/medium/4cefb19623bcc44d7cdb9e25aebf5250.jpeg" alt="" width="16" height="16" /> karlafej (Czech) 315 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15791971/medium/88bdda3090339f16f6083390d32bb434_default.png" alt="" width="16" height="16" /> katullo11 (Italian) 316 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14677260/medium/e53420d200961f48602324e18c091bdc.png" alt="" width="16" height="16" /> Kytta (German) 317 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16529521/medium/ae6add93a901b0fefa2d9b1077920d73.png" alt="" width="16" height="16" /> llun (Thai) 318 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16291756/medium/e1c4210f15537394cc764b8bc2dffe37.jpg" alt="" width="16" height="16" /> lucasofchirst (Occitan, Portuguese, Portuguese, Brazilian) 319 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16537713/medium/825f0bf1a14fc545a76891a52839d86e_default.png" alt="" width="16" height="16" /> marcin.kozinski (Polish) 320 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/12882812/medium/77744d8db46e9a3e09030e1a02b7a572.jpeg" alt="" width="16" height="16" /> mojosoeun (Korean) 321 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/13613969/medium/c7834ddc0ada84a79671697a944bb274.png" alt="" width="16" height="16" /> moreal (Korean) 322 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14158861/medium/ba1ff31dc5743b067ea6685f735229a5_default.png" alt="" width="16" height="16" /> MrWillCom (Chinese Simplified) 323 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15652333/medium/7f36f289f9e2fe41d89ad534a1047f0e.png" alt="" width="16" height="16" /> nclm (French) 324 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16539461/medium/2f41b9f0b802c1d200a6ab62167a7229_default.png" alt="" width="16" height="16" /> pazpi (Italian) 325 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15106977/medium/54bf93b19af8bbfdee579ea51685bafa.jpeg" alt="" width="16" height="16" /> punkrockgirl (Basque) 326 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16536247/medium/f010c8e718a36229733a8b58f6bad2a4_default.png" alt="" width="16" height="16" /> radecos (French) 327 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16538917/medium/092ec03f56f9dd1cbce94379fa4d4d38.png" alt="" width="16" height="16" /> Razem (Czech) 328 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14345134/medium/89a299239890c79a1d791d08ec3951dc.png" alt="" width="16" height="16" /> realpixelcode (German) 329 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16527325/medium/37ebb27e7a50f7f85ae93beafc7028a2.jpg" alt="" width="16" height="16" /> rezahosseinzadeh (Persian) 330 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/13422319/medium/66632a98d73d48e36753d94ebcec9d4f.png" alt="" width="16" height="16" /> rwmpelstilzchen (Esperanto, Hebrew) 331 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16538605/medium/bcdb6e3286b7d6237923f3a9383eed29.png" alt="" width="16" height="16" /> SadmL (Russian) 332 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14565190/medium/79100599131b7776e9803e4b696915a3_default.png" alt="" width="16" height="16" /> Sky_NiniKo (French) 333 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16532441/medium/1a47e8d80c95636e02d2260f6e233ca5.png" alt="" width="16" height="16" /> Su5hicz (Czech) 334 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16533843/medium/7314c15492ef90118c33a80a427e6c87_default.png" alt="" width="16" height="16" /> Talos00 (Italian) 335 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16530049/medium/683f3581620c6b4a5c753b416ed695a7.jpeg" alt="" width="16" height="16" /> tferrermo (Spanish) 336 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16527851/medium/649e5a9a8a8cc61ced670d89e9cca082.png" alt="" width="16" height="16" /> tux93 (German) 337 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16529833/medium/2991a65722acd721849656223014cd49.png" alt="" width="16" height="16" /> Urbestro (Esperanto, Spanish) 338 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16539171/medium/db6fb87481026c72b895adfb94e17d2c_default.png" alt="" width="16" height="16" /> UsualUsername (Russian) 339 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14427566/medium/ab733b5044c21867fc5a9d1b22cd2c03.png" alt="" width="16" height="16" /> Vac31. (Lithuanian) 340 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16026914/medium/e3ca187f354a298ef0c9d02a0ed17be7.jpg" alt="" width="16" height="16" /> valtlai (Finnish) 341 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/15982109/medium/9c03062bdc1d3c6d384dbfead97c26ba.jpeg" alt="" width="16" height="16" /> xabi_itzultzaile (Basque) 342 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16556017/medium/216e0f7a0c35b079920366939a3aaca7_default.png" alt="" width="16" height="16" /> xen4n (Ukrainian) 343 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16532657/medium/f309f319266e1ff95f3070eab0c9a9d9_default.png" alt="" width="16" height="16" /> xqueralt (Catalan) 344 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/14041603/medium/6ab77a0467b06aeb49927c6d9c409f89.jpg" alt="" width="16" height="16" /> ZiriSut (Kabyle) 345 + - <img src="https://crowdin-static.downloads.crowdin.com/avatar/16530601/medium/e1b6d5c24953b6405405c1ab33c0fa46.jpeg" alt="" width="16" height="16" /> zkreml (Czech) 346 + <!-- i18n volunteers end --> 347 + 295 348 ## Backstory 296 349 297 350 I am one of the earliest users of Twitter. Twitter was launched on [15 July 2006](https://en.wikipedia.org/wiki/Twitter). I joined on December 2006 and my [first tweet](https://twitter.com/cheeaun/status/1298723) was posted on 18 December 2006.
+345
i18n-volunteers.json
··· 1 + [ 2 + { 3 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12571163/medium/9f3ea938f4243f5ffe2a43f814ddc9e8_default.png", 4 + "username": "alidsds11", 5 + "languages": [ 6 + "Arabic" 7 + ] 8 + }, 9 + { 10 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13170041/medium/603136896af17fc005fd592ce3f48717_default.png", 11 + "username": "BoFFire", 12 + "languages": [ 13 + "Arabic", 14 + "French", 15 + "Kabyle" 16 + ] 17 + }, 18 + { 19 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12898464/medium/d3758a76b894bade4bf271c9b32ea69b.png", 20 + "username": "Brawaru", 21 + "languages": [ 22 + "Russian" 23 + ] 24 + }, 25 + { 26 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15460040/medium/1cfcfe5f5511b783b5d9f2b968bad819.png", 27 + "username": "cbasje", 28 + "languages": [ 29 + "Dutch" 30 + ] 31 + }, 32 + { 33 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15525631/medium/51293156034d0236f1a1020c10f7d539_default.png", 34 + "username": "cbo92", 35 + "languages": [ 36 + "French" 37 + ] 38 + }, 39 + { 40 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15910131/medium/67fab7eeab5551853450e76e2ef19e59.jpeg", 41 + "username": "CDN", 42 + "languages": [ 43 + "Chinese Simplified" 44 + ] 45 + }, 46 + { 47 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16556801/medium/ed5e501ca1f3cc6525d2da28db646346.jpeg", 48 + "username": "dannypsnl", 49 + "languages": [ 50 + "Chinese Traditional" 51 + ] 52 + }, 53 + { 54 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/3711/medium/d95ddd44e8dcb3a039f8a3463aed781d_default.png", 55 + "username": "databio", 56 + "languages": [ 57 + "Catalan" 58 + ] 59 + }, 60 + { 61 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12618120/medium/ccb11bd042bbf4c7189033f7af2dbd32_default.png", 62 + "username": "drydenwu", 63 + "languages": [ 64 + "Chinese Traditional" 65 + ] 66 + }, 67 + { 68 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13557465/medium/8feebf3677fa80c01e8c54c4fbe097e0_default.png", 69 + "username": "elissarc", 70 + "languages": [ 71 + "French" 72 + ] 73 + }, 74 + { 75 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16528627/medium/9036f6eced0257f4e1ea4c5bd499de2d_default.png", 76 + "username": "ElPamplina", 77 + "languages": [ 78 + "Spanish" 79 + ] 80 + }, 81 + { 82 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14277386/medium/29b30d2c73a214000e3941c9978f49e4_default.png", 83 + "username": "Fitik", 84 + "languages": [ 85 + "Esperanto", 86 + "Hebrew" 87 + ] 88 + }, 89 + { 90 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14444512/medium/99d0e7a3076deccbdfe0aa0b0612308c.jpeg", 91 + "username": "Freeesia", 92 + "languages": [ 93 + "Japanese" 94 + ] 95 + }, 96 + { 97 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12617257/medium/a201650da44fed28890b0e0d8477a663.jpg", 98 + "username": "ghose", 99 + "languages": [ 100 + "Galician" 101 + ] 102 + }, 103 + { 104 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15248754/medium/0dac6334ea0f4e8d4194a605c0a5594a.jpeg", 105 + "username": "hongminhee", 106 + "languages": [ 107 + "Korean" 108 + ] 109 + }, 110 + { 111 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13454728/medium/1f78b7124b3c962bc4ae55e8d701fc91_default.png", 112 + "username": "isard", 113 + "languages": [ 114 + "Catalan" 115 + ] 116 + }, 117 + { 118 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16532403/medium/4cefb19623bcc44d7cdb9e25aebf5250.jpeg", 119 + "username": "karlafej", 120 + "languages": [ 121 + "Czech" 122 + ] 123 + }, 124 + { 125 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15791971/medium/88bdda3090339f16f6083390d32bb434_default.png", 126 + "username": "katullo11", 127 + "languages": [ 128 + "Italian" 129 + ] 130 + }, 131 + { 132 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14677260/medium/e53420d200961f48602324e18c091bdc.png", 133 + "username": "Kytta", 134 + "languages": [ 135 + "German" 136 + ] 137 + }, 138 + { 139 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16529521/medium/ae6add93a901b0fefa2d9b1077920d73.png", 140 + "username": "llun", 141 + "languages": [ 142 + "Thai" 143 + ] 144 + }, 145 + { 146 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16291756/medium/e1c4210f15537394cc764b8bc2dffe37.jpg", 147 + "username": "lucasofchirst", 148 + "languages": [ 149 + "Occitan", 150 + "Portuguese", 151 + "Portuguese, Brazilian" 152 + ] 153 + }, 154 + { 155 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16537713/medium/825f0bf1a14fc545a76891a52839d86e_default.png", 156 + "username": "marcin.kozinski", 157 + "languages": [ 158 + "Polish" 159 + ] 160 + }, 161 + { 162 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12882812/medium/77744d8db46e9a3e09030e1a02b7a572.jpeg", 163 + "username": "mojosoeun", 164 + "languages": [ 165 + "Korean" 166 + ] 167 + }, 168 + { 169 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13613969/medium/c7834ddc0ada84a79671697a944bb274.png", 170 + "username": "moreal", 171 + "languages": [ 172 + "Korean" 173 + ] 174 + }, 175 + { 176 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14158861/medium/ba1ff31dc5743b067ea6685f735229a5_default.png", 177 + "username": "MrWillCom", 178 + "languages": [ 179 + "Chinese Simplified" 180 + ] 181 + }, 182 + { 183 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15652333/medium/7f36f289f9e2fe41d89ad534a1047f0e.png", 184 + "username": "nclm", 185 + "languages": [ 186 + "French" 187 + ] 188 + }, 189 + { 190 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16539461/medium/2f41b9f0b802c1d200a6ab62167a7229_default.png", 191 + "username": "pazpi", 192 + "languages": [ 193 + "Italian" 194 + ] 195 + }, 196 + { 197 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15106977/medium/54bf93b19af8bbfdee579ea51685bafa.jpeg", 198 + "username": "punkrockgirl", 199 + "languages": [ 200 + "Basque" 201 + ] 202 + }, 203 + { 204 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16536247/medium/f010c8e718a36229733a8b58f6bad2a4_default.png", 205 + "username": "radecos", 206 + "languages": [ 207 + "French" 208 + ] 209 + }, 210 + { 211 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16538917/medium/092ec03f56f9dd1cbce94379fa4d4d38.png", 212 + "username": "Razem", 213 + "languages": [ 214 + "Czech" 215 + ] 216 + }, 217 + { 218 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14345134/medium/89a299239890c79a1d791d08ec3951dc.png", 219 + "username": "realpixelcode", 220 + "languages": [ 221 + "German" 222 + ] 223 + }, 224 + { 225 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16527325/medium/37ebb27e7a50f7f85ae93beafc7028a2.jpg", 226 + "username": "rezahosseinzadeh", 227 + "languages": [ 228 + "Persian" 229 + ] 230 + }, 231 + { 232 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13422319/medium/66632a98d73d48e36753d94ebcec9d4f.png", 233 + "username": "rwmpelstilzchen", 234 + "languages": [ 235 + "Esperanto", 236 + "Hebrew" 237 + ] 238 + }, 239 + { 240 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16538605/medium/bcdb6e3286b7d6237923f3a9383eed29.png", 241 + "username": "SadmL", 242 + "languages": [ 243 + "Russian" 244 + ] 245 + }, 246 + { 247 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14565190/medium/79100599131b7776e9803e4b696915a3_default.png", 248 + "username": "Sky_NiniKo", 249 + "languages": [ 250 + "French" 251 + ] 252 + }, 253 + { 254 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16532441/medium/1a47e8d80c95636e02d2260f6e233ca5.png", 255 + "username": "Su5hicz", 256 + "languages": [ 257 + "Czech" 258 + ] 259 + }, 260 + { 261 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16533843/medium/7314c15492ef90118c33a80a427e6c87_default.png", 262 + "username": "Talos00", 263 + "languages": [ 264 + "Italian" 265 + ] 266 + }, 267 + { 268 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16530049/medium/683f3581620c6b4a5c753b416ed695a7.jpeg", 269 + "username": "tferrermo", 270 + "languages": [ 271 + "Spanish" 272 + ] 273 + }, 274 + { 275 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16527851/medium/649e5a9a8a8cc61ced670d89e9cca082.png", 276 + "username": "tux93", 277 + "languages": [ 278 + "German" 279 + ] 280 + }, 281 + { 282 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16529833/medium/2991a65722acd721849656223014cd49.png", 283 + "username": "Urbestro", 284 + "languages": [ 285 + "Esperanto", 286 + "Spanish" 287 + ] 288 + }, 289 + { 290 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16539171/medium/db6fb87481026c72b895adfb94e17d2c_default.png", 291 + "username": "UsualUsername", 292 + "languages": [ 293 + "Russian" 294 + ] 295 + }, 296 + { 297 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14427566/medium/ab733b5044c21867fc5a9d1b22cd2c03.png", 298 + "username": "Vac31.", 299 + "languages": [ 300 + "Lithuanian" 301 + ] 302 + }, 303 + { 304 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16026914/medium/e3ca187f354a298ef0c9d02a0ed17be7.jpg", 305 + "username": "valtlai", 306 + "languages": [ 307 + "Finnish" 308 + ] 309 + }, 310 + { 311 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15982109/medium/9c03062bdc1d3c6d384dbfead97c26ba.jpeg", 312 + "username": "xabi_itzultzaile", 313 + "languages": [ 314 + "Basque" 315 + ] 316 + }, 317 + { 318 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16556017/medium/216e0f7a0c35b079920366939a3aaca7_default.png", 319 + "username": "xen4n", 320 + "languages": [ 321 + "Ukrainian" 322 + ] 323 + }, 324 + { 325 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16532657/medium/f309f319266e1ff95f3070eab0c9a9d9_default.png", 326 + "username": "xqueralt", 327 + "languages": [ 328 + "Catalan" 329 + ] 330 + }, 331 + { 332 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14041603/medium/6ab77a0467b06aeb49927c6d9c409f89.jpg", 333 + "username": "ZiriSut", 334 + "languages": [ 335 + "Kabyle" 336 + ] 337 + }, 338 + { 339 + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16530601/medium/e1b6d5c24953b6405405c1ab33c0fa46.jpeg", 340 + "username": "zkreml", 341 + "languages": [ 342 + "Czech" 343 + ] 344 + } 345 + ]
+3 -1
package.json
··· 11 11 "bundle-visualizer": "npx vite-bundle-visualizer", 12 12 "messages:extract": "lingui extract", 13 13 "messages:extract:clean": "lingui extract --locale en --clean", 14 - "messages:compile": "lingui compile" 14 + "messages:compile": "lingui compile", 15 + "fetch-i18n-volunteers": "env $(cat .env.local | grep -v \"#\" | xargs) node scripts/fetch-i18n-volunteers.js", 16 + "readme:i18n-volunteers": "node scripts/update-i18n-volunteers-readme.js" 15 17 }, 16 18 "dependencies": { 17 19 "@formatjs/intl-localematcher": "~0.5.4",
+131
scripts/fetch-i18n-volunteers.js
··· 1 + import fs from 'fs'; 2 + 3 + const { CROWDIN_ACCESS_TOKEN } = process.env; 4 + 5 + const PROJECT_ID = '703337'; 6 + 7 + if (!CROWDIN_ACCESS_TOKEN) { 8 + throw new Error('CROWDIN_ACCESS_TOKEN is not set'); 9 + } 10 + 11 + // Generate Report 12 + 13 + let REPORT_ID = null; 14 + { 15 + const response = await fetch( 16 + `https://api.crowdin.com/api/v2/projects/${PROJECT_ID}/reports`, 17 + { 18 + headers: { 19 + Authorization: `Bearer ${CROWDIN_ACCESS_TOKEN}`, 20 + 'Content-Type': 'application/json', 21 + }, 22 + method: 'POST', 23 + body: JSON.stringify({ 24 + name: 'top-members', 25 + schema: { 26 + format: 'json', 27 + }, 28 + }), 29 + }, 30 + ); 31 + const json = await response.json(); 32 + console.log(`Report ID: ${json?.data?.identifier}`); 33 + REPORT_ID = json?.data?.identifier; 34 + } 35 + 36 + if (!REPORT_ID) { 37 + throw new Error('Report ID is not found'); 38 + } 39 + 40 + // Check Report Generation Status 41 + let finished = false; 42 + { 43 + let maxPolls = 10; 44 + do { 45 + maxPolls--; 46 + if (maxPolls < 0) break; 47 + 48 + // Wait for 1 second 49 + await new Promise((resolve) => setTimeout(resolve, 1000)); 50 + 51 + const status = await fetch( 52 + `https://api.crowdin.com/api/v2/projects/${PROJECT_ID}/reports/${REPORT_ID}`, 53 + { 54 + headers: { 55 + Authorization: `Bearer ${CROWDIN_ACCESS_TOKEN}`, 56 + 'Content-Type': 'application/json', 57 + }, 58 + }, 59 + ); 60 + const json = await status.json(); 61 + const progress = json?.data?.progress; 62 + console.log(`Progress: ${progress}% (${maxPolls} retries left)`); 63 + finished = json?.data?.status === 'finished'; 64 + } while (!finished); 65 + } 66 + 67 + if (!finished) { 68 + throw new Error('Failed to generate report'); 69 + } 70 + 71 + // Download Report 72 + let reportURL = null; 73 + { 74 + const response = await fetch( 75 + `https://api.crowdin.com/api/v2/projects/${PROJECT_ID}/reports/${REPORT_ID}/download`, 76 + { 77 + headers: { 78 + Authorization: `Bearer ${CROWDIN_ACCESS_TOKEN}`, 79 + 'Content-Type': 'application/json', 80 + }, 81 + }, 82 + ); 83 + const json = await response.json(); 84 + reportURL = json?.data?.url; 85 + console.log(`Report URL: ${reportURL}`); 86 + } 87 + 88 + if (!reportURL) { 89 + throw new Error('Report URL is not found'); 90 + } 91 + 92 + // Actually download the report 93 + let members = null; 94 + { 95 + const response = await fetch(reportURL); 96 + const json = await response.json(); 97 + 98 + const { data } = json; 99 + 100 + if (!data?.length) { 101 + throw new Error('No data found'); 102 + } 103 + 104 + // Sort by 'user.fullName' 105 + data.sort((a, b) => a.user.username.localeCompare(b.user.username)); 106 + members = data 107 + .filter((item) => { 108 + const isMyself = item.user.username === 'cheeaun'; 109 + const translatedMoreThanZero = item.translated > 0; 110 + 111 + return !isMyself && translatedMoreThanZero; 112 + }) 113 + .map((item) => ({ 114 + avatarUrl: item.user.avatarUrl, 115 + username: item.user.username, 116 + languages: item.languages.map((lang) => lang.name), 117 + })); 118 + 119 + console.log(members); 120 + 121 + if (members?.length) { 122 + fs.writeFileSync( 123 + 'i18n-volunteers.json', 124 + JSON.stringify(members, null, '\t'), 125 + ); 126 + } 127 + } 128 + 129 + if (!members?.length) { 130 + throw new Error('No members found'); 131 + }
+27
scripts/update-i18n-volunteers-readme.js
··· 1 + // Find for <!-- i18n volunteers start --><!-- i18n volunteers end --> and inject list of i18n volunteers in between 2 + 3 + import fs from 'fs'; 4 + 5 + const i18nVolunteers = JSON.parse(fs.readFileSync('i18n-volunteers.json')); 6 + 7 + const readme = fs.readFileSync('README.md', 'utf8'); 8 + 9 + const i18nVolunteersStart = '<!-- i18n volunteers start -->'; 10 + const i18nVolunteersEnd = '<!-- i18n volunteers end -->'; 11 + 12 + const i18nVolunteersList = i18nVolunteers 13 + .map((member) => { 14 + return `- <img src="${member.avatarUrl}" alt="" width="16" height="16" /> ${ 15 + member.username 16 + } (${member.languages.join(', ')})`; 17 + }) 18 + .join('\n'); 19 + 20 + const readmeUpdated = readme.replace( 21 + new RegExp(`${i18nVolunteersStart}.*${i18nVolunteersEnd}`, 's'), 22 + `${i18nVolunteersStart}\n${i18nVolunteersList}\n${i18nVolunteersEnd}`, 23 + ); 24 + 25 + fs.writeFileSync('README.md', readmeUpdated); 26 + 27 + console.log('Updated README.md');