this repo has no description
0
fork

Configure Feed

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

Experimental language selector in Compose field

+1048 -3
+20
scripts/fetch-supported-languages.js
··· 1 + import fs from 'fs'; 2 + 3 + const url = 'https://mastodon.social/'; 4 + 5 + const html = await fetch(url).then((res) => res.text()); 6 + 7 + // Extract the JSON between <script id="initial-state" type="application/json"></script> 8 + const json = html.match( 9 + /<script id="initial-state" type="application\/json">(.*)<\/script>/, 10 + )[1]; 11 + 12 + const initialState = JSON.parse(json); 13 + const { languages } = initialState; 14 + 15 + console.log(`Found ${languages.length} languages`); 16 + 17 + // Write to file 18 + const path = './src/data/status-supported-languages.json'; 19 + fs.writeFileSync(path, JSON.stringify(languages, null, '\t'), 'utf8'); 20 + console.log(`Wrote ${path}`);
+9
src/components/compose.css
··· 184 184 filter: brightness(0.8); 185 185 } 186 186 187 + #compose-container .toolbar-button .icon-text { 188 + display: inline-block; 189 + font-size: 14px; 190 + font-weight: 500; 191 + text-overflow: ellipsis; 192 + overflow: hidden; 193 + max-width: 100%; 194 + } 195 + 187 196 #compose-container text-expander { 188 197 position: relative; 189 198 }
+48 -2
src/components/compose.jsx
··· 4 4 import { useEffect, useMemo, useRef, useState } from 'preact/hooks'; 5 5 import stringLength from 'string-length'; 6 6 7 + import supportedLanguages from '../data/status-supported-languages'; 7 8 import urlRegex from '../data/url-regex'; 8 9 import emojifyText from '../utils/emojify-text'; 9 10 import openCompose from '../utils/open-compose'; ··· 14 15 import Icon from './icon'; 15 16 import Loader from './loader'; 16 17 import Status from './status'; 18 + 19 + const supportedLanguagesMap = supportedLanguages.reduce((acc, l) => { 20 + const [code, common, native] = l; 21 + acc[code] = { 22 + common, 23 + native, 24 + }; 25 + return acc; 26 + }, {}); 17 27 18 28 /* NOTES: 19 29 - Max character limit includes BOTH status text and Content Warning text ··· 93 103 const spoilerTextRef = useRef(); 94 104 const [visibility, setVisibility] = useState('public'); 95 105 const [sensitive, setSensitive] = useState(false); 106 + const [language, setLanguage] = useState( 107 + store.session.get('currentLanguage') || 'en', 108 + ); 96 109 const [mediaAttachments, setMediaAttachments] = useState([]); 97 110 const [poll, setPoll] = useState(null); 98 111 ··· 122 135 123 136 useEffect(() => { 124 137 if (replyToStatus) { 125 - const { spoilerText, visibility, sensitive } = replyToStatus; 138 + const { spoilerText, visibility, language, sensitive } = replyToStatus; 126 139 if (spoilerText && spoilerTextRef.current) { 127 140 spoilerTextRef.current.value = spoilerText; 128 141 } ··· 141 154 } 142 155 focusTextarea(); 143 156 setVisibility(visibility); 157 + setLanguage(language); 144 158 setSensitive(sensitive); 145 159 } 146 160 if (draftStatus) { ··· 148 162 status, 149 163 spoilerText, 150 164 visibility, 165 + language, 151 166 sensitive, 152 167 poll, 153 168 mediaAttachments, ··· 162 177 focusTextarea(); 163 178 spoilerTextRef.current.value = spoilerText; 164 179 setVisibility(visibility); 180 + setLanguage(language); 165 181 setSensitive(sensitive); 166 182 setPoll(composablePoll); 167 183 setMediaAttachments(mediaAttachments); 168 184 } else if (editStatus) { 169 - const { visibility, sensitive, poll, mediaAttachments } = editStatus; 185 + const { visibility, language, sensitive, poll, mediaAttachments } = 186 + editStatus; 170 187 const composablePoll = !!poll?.options && { 171 188 ...poll, 172 189 options: poll.options.map((o) => o?.title || o), ··· 186 203 focusTextarea(); 187 204 spoilerTextRef.current.value = spoilerText; 188 205 setVisibility(visibility); 206 + setLanguage(language); 189 207 setSensitive(sensitive); 190 208 setPoll(composablePoll); 191 209 setMediaAttachments(mediaAttachments); ··· 465 483 status: textareaRef.current.value, 466 484 spoilerText: spoilerTextRef.current.value, 467 485 visibility, 486 + language, 468 487 sensitive, 469 488 poll, 470 489 mediaAttachments: mediaAttachmentsWithIDs, ··· 539 558 status: textareaRef.current.value, 540 559 spoilerText: spoilerTextRef.current.value, 541 560 visibility, 561 + language, 542 562 sensitive, 543 563 poll, 544 564 mediaAttachments: mediaAttachmentsWithIDs, ··· 675 695 status, 676 696 // spoilerText, 677 697 spoiler_text: spoilerText, 698 + language, 678 699 sensitive, 679 700 poll, 680 701 // mediaIds: mediaAttachments.map((attachment) => attachment.id), ··· 932 953 />{' '} 933 954 </> 934 955 )} 956 + <label class="toolbar-button"> 957 + <span class="icon-text"> 958 + {supportedLanguagesMap[language].native} 959 + </span> 960 + <select 961 + name="language" 962 + value={language} 963 + onChange={(e) => { 964 + const { value } = e.target; 965 + setLanguage(value); 966 + store.session.set('language', value); 967 + }} 968 + disabled={uiState === 'loading'} 969 + > 970 + {supportedLanguages 971 + .sort(([, commonA], [, commonB]) => { 972 + return commonA.localeCompare(commonB); 973 + }) 974 + .map(([code, common, native]) => ( 975 + <option value={code}> 976 + {common} ({native}) 977 + </option> 978 + ))} 979 + </select> 980 + </label>{' '} 935 981 <button type="submit" class="large" disabled={uiState === 'loading'}> 936 982 {replyToStatus ? 'Reply' : editStatus ? 'Update' : 'Post'} 937 983 </button>
+1
src/components/icon.jsx
··· 45 45 reply: ['mingcute:share-forward-line', '180deg', 'horizontal'], 46 46 thread: 'mingcute:route-line', 47 47 group: 'mingcute:group-line', 48 + bot: 'mingcute:android-2-line', 48 49 }; 49 50 50 51 function Icon({ icon, size = 'm', alt, title, class: className = '' }) {
+3 -1
src/components/status.jsx
··· 385 385 /> 386 386 {!!poll && ( 387 387 <Poll 388 + lang={language} 388 389 poll={poll} 389 390 readOnly={readOnly} 390 391 onUpdate={(newPoll) => { ··· 926 927 } 927 928 } 928 929 929 - function Poll({ poll, readOnly, onUpdate = () => {} }) { 930 + function Poll({ poll, lang, readOnly, onUpdate = () => {} }) { 930 931 const [uiState, setUIState] = useState('default'); 931 932 932 933 const { ··· 980 981 981 982 return ( 982 983 <div 984 + lang={lang} 983 985 class={`poll ${readOnly ? 'read-only' : ''} ${ 984 986 uiState === 'loading' ? 'loading' : '' 985 987 }`}
+967
src/data/status-supported-languages.json
··· 1 + [ 2 + [ 3 + "aa", 4 + "Afar", 5 + "Afaraf" 6 + ], 7 + [ 8 + "ab", 9 + "Abkhaz", 10 + "аҧсуа бызшәа" 11 + ], 12 + [ 13 + "ae", 14 + "Avestan", 15 + "avesta" 16 + ], 17 + [ 18 + "af", 19 + "Afrikaans", 20 + "Afrikaans" 21 + ], 22 + [ 23 + "ak", 24 + "Akan", 25 + "Akan" 26 + ], 27 + [ 28 + "am", 29 + "Amharic", 30 + "አማርኛ" 31 + ], 32 + [ 33 + "an", 34 + "Aragonese", 35 + "aragonés" 36 + ], 37 + [ 38 + "ar", 39 + "Arabic", 40 + "اللغة العربية" 41 + ], 42 + [ 43 + "as", 44 + "Assamese", 45 + "অসমীয়া" 46 + ], 47 + [ 48 + "av", 49 + "Avaric", 50 + "авар мацӀ" 51 + ], 52 + [ 53 + "ay", 54 + "Aymara", 55 + "aymar aru" 56 + ], 57 + [ 58 + "az", 59 + "Azerbaijani", 60 + "azərbaycan dili" 61 + ], 62 + [ 63 + "ba", 64 + "Bashkir", 65 + "башҡорт теле" 66 + ], 67 + [ 68 + "be", 69 + "Belarusian", 70 + "беларуская мова" 71 + ], 72 + [ 73 + "bg", 74 + "Bulgarian", 75 + "български език" 76 + ], 77 + [ 78 + "bh", 79 + "Bihari", 80 + "भोजपुरी" 81 + ], 82 + [ 83 + "bi", 84 + "Bislama", 85 + "Bislama" 86 + ], 87 + [ 88 + "bm", 89 + "Bambara", 90 + "bamanankan" 91 + ], 92 + [ 93 + "bn", 94 + "Bengali", 95 + "বাংলা" 96 + ], 97 + [ 98 + "bo", 99 + "Tibetan", 100 + "བོད་ཡིག" 101 + ], 102 + [ 103 + "br", 104 + "Breton", 105 + "brezhoneg" 106 + ], 107 + [ 108 + "bs", 109 + "Bosnian", 110 + "bosanski jezik" 111 + ], 112 + [ 113 + "ca", 114 + "Catalan", 115 + "Català" 116 + ], 117 + [ 118 + "ce", 119 + "Chechen", 120 + "нохчийн мотт" 121 + ], 122 + [ 123 + "ch", 124 + "Chamorro", 125 + "Chamoru" 126 + ], 127 + [ 128 + "co", 129 + "Corsican", 130 + "corsu" 131 + ], 132 + [ 133 + "cr", 134 + "Cree", 135 + "ᓀᐦᐃᔭᐍᐏᐣ" 136 + ], 137 + [ 138 + "cs", 139 + "Czech", 140 + "čeština" 141 + ], 142 + [ 143 + "cu", 144 + "Old Church Slavonic", 145 + "ѩзыкъ словѣньскъ" 146 + ], 147 + [ 148 + "cv", 149 + "Chuvash", 150 + "чӑваш чӗлхи" 151 + ], 152 + [ 153 + "cy", 154 + "Welsh", 155 + "Cymraeg" 156 + ], 157 + [ 158 + "da", 159 + "Danish", 160 + "dansk" 161 + ], 162 + [ 163 + "de", 164 + "German", 165 + "Deutsch" 166 + ], 167 + [ 168 + "dv", 169 + "Divehi", 170 + "Dhivehi" 171 + ], 172 + [ 173 + "dz", 174 + "Dzongkha", 175 + "རྫོང་ཁ" 176 + ], 177 + [ 178 + "ee", 179 + "Ewe", 180 + "Eʋegbe" 181 + ], 182 + [ 183 + "el", 184 + "Greek", 185 + "Ελληνικά" 186 + ], 187 + [ 188 + "en", 189 + "English", 190 + "English" 191 + ], 192 + [ 193 + "eo", 194 + "Esperanto", 195 + "Esperanto" 196 + ], 197 + [ 198 + "es", 199 + "Spanish", 200 + "Español" 201 + ], 202 + [ 203 + "et", 204 + "Estonian", 205 + "eesti" 206 + ], 207 + [ 208 + "eu", 209 + "Basque", 210 + "euskara" 211 + ], 212 + [ 213 + "fa", 214 + "Persian", 215 + "فارسی" 216 + ], 217 + [ 218 + "ff", 219 + "Fula", 220 + "Fulfulde" 221 + ], 222 + [ 223 + "fi", 224 + "Finnish", 225 + "suomi" 226 + ], 227 + [ 228 + "fj", 229 + "Fijian", 230 + "Vakaviti" 231 + ], 232 + [ 233 + "fo", 234 + "Faroese", 235 + "føroyskt" 236 + ], 237 + [ 238 + "fr", 239 + "French", 240 + "Français" 241 + ], 242 + [ 243 + "fy", 244 + "Western Frisian", 245 + "Frysk" 246 + ], 247 + [ 248 + "ga", 249 + "Irish", 250 + "Gaeilge" 251 + ], 252 + [ 253 + "gd", 254 + "Scottish Gaelic", 255 + "Gàidhlig" 256 + ], 257 + [ 258 + "gl", 259 + "Galician", 260 + "galego" 261 + ], 262 + [ 263 + "gu", 264 + "Gujarati", 265 + "ગુજરાતી" 266 + ], 267 + [ 268 + "gv", 269 + "Manx", 270 + "Gaelg" 271 + ], 272 + [ 273 + "ha", 274 + "Hausa", 275 + "هَوُسَ" 276 + ], 277 + [ 278 + "he", 279 + "Hebrew", 280 + "עברית" 281 + ], 282 + [ 283 + "hi", 284 + "Hindi", 285 + "हिन्दी" 286 + ], 287 + [ 288 + "ho", 289 + "Hiri Motu", 290 + "Hiri Motu" 291 + ], 292 + [ 293 + "hr", 294 + "Croatian", 295 + "Hrvatski" 296 + ], 297 + [ 298 + "ht", 299 + "Haitian", 300 + "Kreyòl ayisyen" 301 + ], 302 + [ 303 + "hu", 304 + "Hungarian", 305 + "magyar" 306 + ], 307 + [ 308 + "hy", 309 + "Armenian", 310 + "Հայերեն" 311 + ], 312 + [ 313 + "hz", 314 + "Herero", 315 + "Otjiherero" 316 + ], 317 + [ 318 + "ia", 319 + "Interlingua", 320 + "Interlingua" 321 + ], 322 + [ 323 + "id", 324 + "Indonesian", 325 + "Bahasa Indonesia" 326 + ], 327 + [ 328 + "ie", 329 + "Interlingue", 330 + "Interlingue" 331 + ], 332 + [ 333 + "ig", 334 + "Igbo", 335 + "Asụsụ Igbo" 336 + ], 337 + [ 338 + "ii", 339 + "Nuosu", 340 + "ꆈꌠ꒿ Nuosuhxop" 341 + ], 342 + [ 343 + "ik", 344 + "Inupiaq", 345 + "Iñupiaq" 346 + ], 347 + [ 348 + "io", 349 + "Ido", 350 + "Ido" 351 + ], 352 + [ 353 + "is", 354 + "Icelandic", 355 + "Íslenska" 356 + ], 357 + [ 358 + "it", 359 + "Italian", 360 + "Italiano" 361 + ], 362 + [ 363 + "iu", 364 + "Inuktitut", 365 + "ᐃᓄᒃᑎᑐᑦ" 366 + ], 367 + [ 368 + "ja", 369 + "Japanese", 370 + "日本語" 371 + ], 372 + [ 373 + "jv", 374 + "Javanese", 375 + "basa Jawa" 376 + ], 377 + [ 378 + "ka", 379 + "Georgian", 380 + "ქართული" 381 + ], 382 + [ 383 + "kg", 384 + "Kongo", 385 + "Kikongo" 386 + ], 387 + [ 388 + "ki", 389 + "Kikuyu", 390 + "Gĩkũyũ" 391 + ], 392 + [ 393 + "kj", 394 + "Kwanyama", 395 + "Kuanyama" 396 + ], 397 + [ 398 + "kk", 399 + "Kazakh", 400 + "қазақ тілі" 401 + ], 402 + [ 403 + "kl", 404 + "Kalaallisut", 405 + "kalaallisut" 406 + ], 407 + [ 408 + "km", 409 + "Khmer", 410 + "ខេមរភាសា" 411 + ], 412 + [ 413 + "kn", 414 + "Kannada", 415 + "ಕನ್ನಡ" 416 + ], 417 + [ 418 + "ko", 419 + "Korean", 420 + "한국어" 421 + ], 422 + [ 423 + "kr", 424 + "Kanuri", 425 + "Kanuri" 426 + ], 427 + [ 428 + "ks", 429 + "Kashmiri", 430 + "कश्मीरी" 431 + ], 432 + [ 433 + "ku", 434 + "Kurmanji (Kurdish)", 435 + "Kurmancî" 436 + ], 437 + [ 438 + "kv", 439 + "Komi", 440 + "коми кыв" 441 + ], 442 + [ 443 + "kw", 444 + "Cornish", 445 + "Kernewek" 446 + ], 447 + [ 448 + "ky", 449 + "Kyrgyz", 450 + "Кыргызча" 451 + ], 452 + [ 453 + "la", 454 + "Latin", 455 + "latine" 456 + ], 457 + [ 458 + "lb", 459 + "Luxembourgish", 460 + "Lëtzebuergesch" 461 + ], 462 + [ 463 + "lg", 464 + "Ganda", 465 + "Luganda" 466 + ], 467 + [ 468 + "li", 469 + "Limburgish", 470 + "Limburgs" 471 + ], 472 + [ 473 + "ln", 474 + "Lingala", 475 + "Lingála" 476 + ], 477 + [ 478 + "lo", 479 + "Lao", 480 + "ລາວ" 481 + ], 482 + [ 483 + "lt", 484 + "Lithuanian", 485 + "lietuvių kalba" 486 + ], 487 + [ 488 + "lu", 489 + "Luba-Katanga", 490 + "Tshiluba" 491 + ], 492 + [ 493 + "lv", 494 + "Latvian", 495 + "latviešu valoda" 496 + ], 497 + [ 498 + "mg", 499 + "Malagasy", 500 + "fiteny malagasy" 501 + ], 502 + [ 503 + "mh", 504 + "Marshallese", 505 + "Kajin M̧ajeļ" 506 + ], 507 + [ 508 + "mi", 509 + "Māori", 510 + "te reo Māori" 511 + ], 512 + [ 513 + "mk", 514 + "Macedonian", 515 + "македонски јазик" 516 + ], 517 + [ 518 + "ml", 519 + "Malayalam", 520 + "മലയാളം" 521 + ], 522 + [ 523 + "mn", 524 + "Mongolian", 525 + "Монгол хэл" 526 + ], 527 + [ 528 + "mr", 529 + "Marathi", 530 + "मराठी" 531 + ], 532 + [ 533 + "ms", 534 + "Malay", 535 + "Bahasa Melayu" 536 + ], 537 + [ 538 + "mt", 539 + "Maltese", 540 + "Malti" 541 + ], 542 + [ 543 + "my", 544 + "Burmese", 545 + "ဗမာစာ" 546 + ], 547 + [ 548 + "na", 549 + "Nauru", 550 + "Ekakairũ Naoero" 551 + ], 552 + [ 553 + "nb", 554 + "Norwegian Bokmål", 555 + "Norsk bokmål" 556 + ], 557 + [ 558 + "nd", 559 + "Northern Ndebele", 560 + "isiNdebele" 561 + ], 562 + [ 563 + "ne", 564 + "Nepali", 565 + "नेपाली" 566 + ], 567 + [ 568 + "ng", 569 + "Ndonga", 570 + "Owambo" 571 + ], 572 + [ 573 + "nl", 574 + "Dutch", 575 + "Nederlands" 576 + ], 577 + [ 578 + "nn", 579 + "Norwegian Nynorsk", 580 + "Norsk Nynorsk" 581 + ], 582 + [ 583 + "no", 584 + "Norwegian", 585 + "Norsk" 586 + ], 587 + [ 588 + "nr", 589 + "Southern Ndebele", 590 + "isiNdebele" 591 + ], 592 + [ 593 + "nv", 594 + "Navajo", 595 + "Diné bizaad" 596 + ], 597 + [ 598 + "ny", 599 + "Chichewa", 600 + "chiCheŵa" 601 + ], 602 + [ 603 + "oc", 604 + "Occitan", 605 + "occitan" 606 + ], 607 + [ 608 + "oj", 609 + "Ojibwe", 610 + "ᐊᓂᔑᓈᐯᒧᐎᓐ" 611 + ], 612 + [ 613 + "om", 614 + "Oromo", 615 + "Afaan Oromoo" 616 + ], 617 + [ 618 + "or", 619 + "Oriya", 620 + "ଓଡ଼ିଆ" 621 + ], 622 + [ 623 + "os", 624 + "Ossetian", 625 + "ирон æвзаг" 626 + ], 627 + [ 628 + "pa", 629 + "Panjabi", 630 + "ਪੰਜਾਬੀ" 631 + ], 632 + [ 633 + "pi", 634 + "Pāli", 635 + "पाऴि" 636 + ], 637 + [ 638 + "pl", 639 + "Polish", 640 + "Polski" 641 + ], 642 + [ 643 + "ps", 644 + "Pashto", 645 + "پښتو" 646 + ], 647 + [ 648 + "pt", 649 + "Portuguese", 650 + "Português" 651 + ], 652 + [ 653 + "qu", 654 + "Quechua", 655 + "Runa Simi" 656 + ], 657 + [ 658 + "rm", 659 + "Romansh", 660 + "rumantsch grischun" 661 + ], 662 + [ 663 + "rn", 664 + "Kirundi", 665 + "Ikirundi" 666 + ], 667 + [ 668 + "ro", 669 + "Romanian", 670 + "Română" 671 + ], 672 + [ 673 + "ru", 674 + "Russian", 675 + "Русский" 676 + ], 677 + [ 678 + "rw", 679 + "Kinyarwanda", 680 + "Ikinyarwanda" 681 + ], 682 + [ 683 + "sa", 684 + "Sanskrit", 685 + "संस्कृतम्" 686 + ], 687 + [ 688 + "sc", 689 + "Sardinian", 690 + "sardu" 691 + ], 692 + [ 693 + "sd", 694 + "Sindhi", 695 + "सिन्धी" 696 + ], 697 + [ 698 + "se", 699 + "Northern Sami", 700 + "Davvisámegiella" 701 + ], 702 + [ 703 + "sg", 704 + "Sango", 705 + "yângâ tî sängö" 706 + ], 707 + [ 708 + "si", 709 + "Sinhala", 710 + "සිංහල" 711 + ], 712 + [ 713 + "sk", 714 + "Slovak", 715 + "slovenčina" 716 + ], 717 + [ 718 + "sl", 719 + "Slovenian", 720 + "slovenščina" 721 + ], 722 + [ 723 + "sn", 724 + "Shona", 725 + "chiShona" 726 + ], 727 + [ 728 + "so", 729 + "Somali", 730 + "Soomaaliga" 731 + ], 732 + [ 733 + "sq", 734 + "Albanian", 735 + "Shqip" 736 + ], 737 + [ 738 + "sr", 739 + "Serbian", 740 + "српски језик" 741 + ], 742 + [ 743 + "ss", 744 + "Swati", 745 + "SiSwati" 746 + ], 747 + [ 748 + "st", 749 + "Southern Sotho", 750 + "Sesotho" 751 + ], 752 + [ 753 + "su", 754 + "Sundanese", 755 + "Basa Sunda" 756 + ], 757 + [ 758 + "sv", 759 + "Swedish", 760 + "Svenska" 761 + ], 762 + [ 763 + "sw", 764 + "Swahili", 765 + "Kiswahili" 766 + ], 767 + [ 768 + "ta", 769 + "Tamil", 770 + "தமிழ்" 771 + ], 772 + [ 773 + "te", 774 + "Telugu", 775 + "తెలుగు" 776 + ], 777 + [ 778 + "tg", 779 + "Tajik", 780 + "тоҷикӣ" 781 + ], 782 + [ 783 + "th", 784 + "Thai", 785 + "ไทย" 786 + ], 787 + [ 788 + "ti", 789 + "Tigrinya", 790 + "ትግርኛ" 791 + ], 792 + [ 793 + "tk", 794 + "Turkmen", 795 + "Türkmen" 796 + ], 797 + [ 798 + "tl", 799 + "Tagalog", 800 + "Wikang Tagalog" 801 + ], 802 + [ 803 + "tn", 804 + "Tswana", 805 + "Setswana" 806 + ], 807 + [ 808 + "to", 809 + "Tonga", 810 + "faka Tonga" 811 + ], 812 + [ 813 + "tr", 814 + "Turkish", 815 + "Türkçe" 816 + ], 817 + [ 818 + "ts", 819 + "Tsonga", 820 + "Xitsonga" 821 + ], 822 + [ 823 + "tt", 824 + "Tatar", 825 + "татар теле" 826 + ], 827 + [ 828 + "tw", 829 + "Twi", 830 + "Twi" 831 + ], 832 + [ 833 + "ty", 834 + "Tahitian", 835 + "Reo Tahiti" 836 + ], 837 + [ 838 + "ug", 839 + "Uyghur", 840 + "ئۇيغۇرچە‎" 841 + ], 842 + [ 843 + "uk", 844 + "Ukrainian", 845 + "Українська" 846 + ], 847 + [ 848 + "ur", 849 + "Urdu", 850 + "اردو" 851 + ], 852 + [ 853 + "uz", 854 + "Uzbek", 855 + "Ўзбек" 856 + ], 857 + [ 858 + "ve", 859 + "Venda", 860 + "Tshivenḓa" 861 + ], 862 + [ 863 + "vi", 864 + "Vietnamese", 865 + "Tiếng Việt" 866 + ], 867 + [ 868 + "vo", 869 + "Volapük", 870 + "Volapük" 871 + ], 872 + [ 873 + "wa", 874 + "Walloon", 875 + "walon" 876 + ], 877 + [ 878 + "wo", 879 + "Wolof", 880 + "Wollof" 881 + ], 882 + [ 883 + "xh", 884 + "Xhosa", 885 + "isiXhosa" 886 + ], 887 + [ 888 + "yi", 889 + "Yiddish", 890 + "ייִדיש" 891 + ], 892 + [ 893 + "yo", 894 + "Yoruba", 895 + "Yorùbá" 896 + ], 897 + [ 898 + "za", 899 + "Zhuang", 900 + "Saɯ cueŋƅ" 901 + ], 902 + [ 903 + "zh", 904 + "Chinese", 905 + "中文" 906 + ], 907 + [ 908 + "zu", 909 + "Zulu", 910 + "isiZulu" 911 + ], 912 + [ 913 + "ast", 914 + "Asturian", 915 + "Asturianu" 916 + ], 917 + [ 918 + "ckb", 919 + "Sorani (Kurdish)", 920 + "سۆرانی" 921 + ], 922 + [ 923 + "jbo", 924 + "Lojban", 925 + "la .lojban." 926 + ], 927 + [ 928 + "kab", 929 + "Kabyle", 930 + "Taqbaylit" 931 + ], 932 + [ 933 + "kmr", 934 + "Kurmanji (Kurdish)", 935 + "Kurmancî" 936 + ], 937 + [ 938 + "ldn", 939 + "Láadan", 940 + "Láadan" 941 + ], 942 + [ 943 + "lfn", 944 + "Lingua Franca Nova", 945 + "lingua franca nova" 946 + ], 947 + [ 948 + "sco", 949 + "Scots", 950 + "Scots" 951 + ], 952 + [ 953 + "tok", 954 + "Toki Pona", 955 + "toki pona" 956 + ], 957 + [ 958 + "zba", 959 + "Balaibalan", 960 + "باليبلن" 961 + ], 962 + [ 963 + "zgh", 964 + "Standard Moroccan Tamazight", 965 + "ⵜⴰⵎⴰⵣⵉⵖⵜ" 966 + ] 967 + ]