summaryrefslogtreecommitdiff
path: root/tools/builds.pm
diff options
context:
space:
mode:
Diffstat (limited to 'tools/builds.pm')
-rw-r--r--tools/builds.pm168
1 files changed, 132 insertions, 36 deletions
diff --git a/tools/builds.pm b/tools/builds.pm
index 518fb01e49..0b7c768888 100644
--- a/tools/builds.pm
+++ b/tools/builds.pm
@@ -10,12 +10,13 @@ $releasenotes="/wiki/ReleaseNotes315";
10# 'modelname' => { 10# 'modelname' => {
11# name => 'Full Name', 11# name => 'Full Name',
12# status => 1, # 0=retired, 1=unusable, 2=unstable, 3=stable 12# status => 1, # 0=retired, 1=unusable, 2=unstable, 3=stable
13# sim = 1, # optional (defaults 1 for status 2/3 and 0 for status 1)
13# ram => 2, # optional (used?) 14# ram => 2, # optional (used?)
14# manual => 'modelname2', # optional (uses modelname2's manual) 15# manual => 'modelname2', # optional (uses modelname2's manual)
15# icon => 'modelname3', # optional (uses modelname3's icon) 16# icon => 'modelname3', # optional (uses modelname3's icon)
16# voice => 'modelname4' # optional (uses modelname4's voice) 17# voice => 'modelname4' # optional (uses modelname4's voice)
17# release => '3.14', # optional (final release version, if different from above) 18# release => '3.14', # optional (final release version, if different from above)
18# manualok => 1, # optional (builds manual even if target is not stable) 19# manualok => 1, # optional (defaults 1 for status 3 and 0 for rest)
19# } 20# }
20 21
21%builds = ( 22%builds = (
@@ -70,10 +71,12 @@ $releasenotes="/wiki/ReleaseNotes315";
70 }, 71 },
71 'gogearhdd1630' => { 72 'gogearhdd1630' => {
72 name => 'Philips GoGear HDD1630', 73 name => 'Philips GoGear HDD1630',
74 manualok => 0,
73 status => 3, 75 status => 3,
74 }, 76 },
75 'gogearhdd6330' => { 77 'gogearhdd6330' => {
76 name => 'Philips GoGear HDD6330', 78 name => 'Philips GoGear HDD6330',
79 manualok => 0,
77 status => 3, 80 status => 3,
78 }, 81 },
79 'gogearsa9200' => { 82 'gogearsa9200' => {
@@ -82,26 +85,32 @@ $releasenotes="/wiki/ReleaseNotes315";
82 }, 85 },
83 'hifietma9' => { 86 'hifietma9' => {
84 name => 'HiFi E.T MA9', 87 name => 'HiFi E.T MA9',
88 sim => 0,
85 status => 2, 89 status => 2,
86 }, 90 },
87 'hifietma9c' => { 91 'hifietma9c' => {
88 name => 'HiFi E.T MA9C', 92 name => 'HiFi E.T MA9C',
93 sim => 0,
89 status => 2, 94 status => 2,
90 }, 95 },
91 'hifietma8' => { 96 'hifietma8' => {
92 name => 'HiFi E.T MA8', 97 name => 'HiFi E.T MA8',
93 status => 2, 98 status => 2,
99 sim => 0,
94 }, 100 },
95 'hifietma8c' => { 101 'hifietma8c' => {
96 name => 'HiFi E.T MA8C', 102 name => 'HiFi E.T MA8C',
97 status => 2, 103 status => 2,
104 sim => 0,
98 }, 105 },
99 'hifimanhm60x' => { 106 'hifimanhm60x' => {
100 name => 'HiFiMAN HM-60x', 107 name => 'HiFiMAN HM-60x',
108 sim => 0,
101 status => 2, 109 status => 2,
102 }, 110 },
103 'hifimanhm801' => { 111 'hifimanhm801' => {
104 name => 'HiFiMAN HM-801', 112 name => 'HiFiMAN HM-801',
113 sim => 0,
105 status => 2, 114 status => 2,
106 }, 115 },
107 'iaudiom3' => { 116 'iaudiom3' => {
@@ -118,10 +127,12 @@ $releasenotes="/wiki/ReleaseNotes315";
118 }, 127 },
119 'ibassodx50' => { 128 'ibassodx50' => {
120 name => 'iBasso DX50', 129 name => 'iBasso DX50',
130 sim => 0,
121 status => 2, 131 status => 2,
122 }, 132 },
123 'ibassodx90' => { 133 'ibassodx90' => {
124 name => 'iBasso DX90', 134 name => 'iBasso DX90',
135 sim => 0,
125 status => 2, 136 status => 2,
126 }, 137 },
127 'ipod1g2g' => { 138 'ipod1g2g' => {
@@ -219,10 +230,12 @@ $releasenotes="/wiki/ReleaseNotes315";
219 'ondavx747' => { 230 'ondavx747' => {
220 name => 'Onda VX747', 231 name => 'Onda VX747',
221 status => 1, 232 status => 1,
233 sim => 1,
222 }, 234 },
223 'ondavx747p' => { 235 'ondavx747p' => {
224 name => 'Onda VX747+', 236 name => 'Onda VX747+',
225 status => 1, 237 status => 1,
238 sim => 1,
226 }, 239 },
227 'ondavx767' => { 240 'ondavx767' => {
228 name => 'Onda VX767', 241 name => 'Onda VX767',
@@ -231,6 +244,7 @@ $releasenotes="/wiki/ReleaseNotes315";
231 'ondavx777' => { 244 'ondavx777' => {
232 name => 'Onda VX777', 245 name => 'Onda VX777',
233 status => 1, 246 status => 1,
247 sim => 1,
234 }, 248 },
235 'rk27generic' => { 249 'rk27generic' => {
236 name => 'Rockchip rk27xx', 250 name => 'Rockchip rk27xx',
@@ -254,6 +268,7 @@ $releasenotes="/wiki/ReleaseNotes315";
254 }, 268 },
255 'samsungypr1' => { 269 'samsungypr1' => {
256 name => 'Samsung YP-R1', 270 name => 'Samsung YP-R1',
271 sim => 0,
257 status => 2, 272 status => 2,
258 }, 273 },
259 'samsungyps3' => { 274 'samsungyps3' => {
@@ -316,6 +331,7 @@ $releasenotes="/wiki/ReleaseNotes315";
316 'sansam200v4' => { 331 'sansam200v4' => {
317 name => 'SanDisk Sansa m200 v4', 332 name => 'SanDisk Sansa m200 v4',
318 status => 1, 333 status => 1,
334 sim => 1,
319 }, 335 },
320 'sansaview' => { 336 'sansaview' => {
321 name => 'SanDisk Sansa View', 337 name => 'SanDisk Sansa View',
@@ -328,14 +344,17 @@ $releasenotes="/wiki/ReleaseNotes315";
328 'zenvision' => { 344 'zenvision' => {
329 name => 'Creative Zen Vision', 345 name => 'Creative Zen Vision',
330 status => 1, 346 status => 1,
347 sim => 1,
331 }, 348 },
332 'zenvisionm30gb' => { 349 'zenvisionm30gb' => {
333 name => 'Creative Zen Vision:M 30GB', 350 name => 'Creative Zen Vision:M 30GB',
334 status => 1, 351 status => 1,
352 sim => 1,
335 }, 353 },
336 'zenvisionm60gb' => { 354 'zenvisionm60gb' => {
337 name => 'Creative Zen Vision:M 60GB', 355 name => 'Creative Zen Vision:M 60GB',
338 status => 1, 356 status => 1,
357 sim => 1,
339 }, 358 },
340 'mpiohd200' => { 359 'mpiohd200' => {
341 name => 'MPIO HD200', 360 name => 'MPIO HD200',
@@ -352,41 +371,51 @@ $releasenotes="/wiki/ReleaseNotes315";
352 'creativezenxfi3' => { 371 'creativezenxfi3' => {
353 name => 'Creative Zen X-Fi3', 372 name => 'Creative Zen X-Fi3',
354 status => 3, 373 status => 3,
374 manualok => 0,
355 }, 375 },
356 'sonynwze350' => { 376 'sonynwze350' => {
357 name => 'Sony NWZ-E350', 377 name => 'Sony NWZ-E350',
378 sim => 0,
358 status => 2, 379 status => 2,
359 }, 380 },
360 'sonynwze360' => { 381 'sonynwze360' => {
361 name => 'Sony NWZ-E360', 382 name => 'Sony NWZ-E360',
362 status => 3, 383 status => 3,
384 manualok => 0,
363 }, 385 },
364 'sonynwze370' => { 386 'sonynwze370' => {
365 name => 'Sony NWZ-E370/E380', 387 name => 'Sony NWZ-E370/E380',
366 status => 3, 388 status => 3,
389 manualok => 0,
367 }, 390 },
368 'sonynwze450' => { 391 'sonynwze450' => {
369 name => 'Sony NWZ-E450', 392 name => 'Sony NWZ-E450',
393 sim => 0,
370 status => 2, 394 status => 2,
371 }, 395 },
372 'sonynwze460' => { 396 'sonynwze460' => {
373 name => 'Sony NWZ-E460', 397 name => 'Sony NWZ-E460',
398 sim => 0,
374 status => 2, 399 status => 2,
375 }, 400 },
376 'sonynwze470' => { 401 'sonynwze470' => {
377 name => 'Sony NWZ-E470', 402 name => 'Sony NWZ-E470',
403 sim => 0,
378 status => 2, 404 status => 2,
379 }, 405 },
380 'sonynwze580' => { 406 'sonynwze580' => {
381 name => 'Sony NWZ-E580', 407 name => 'Sony NWZ-E580',
408 sim => 0,
382 status => 2, 409 status => 2,
383 }, 410 },
384 'sonynwza10' => { 411 'sonynwza10' => {
385 name => 'Sony NWZ-A10', 412 name => 'Sony NWZ-A10',
413 sim => 0,
386 status => 2, 414 status => 2,
387 }, 415 },
388 'sonynwa20' => { 416 'sonynwa20' => {
389 name => 'Sony NW-A20', 417 name => 'Sony NW-A20',
418 sim => 0,
390 status => 2, 419 status => 2,
391 }, 420 },
392 'sonynwza860' => { 421 'sonynwza860' => {
@@ -396,14 +425,17 @@ $releasenotes="/wiki/ReleaseNotes315";
396 'sonynwzs750' => { 425 'sonynwzs750' => {
397 name => 'Sony NWZ-S750', 426 name => 'Sony NWZ-S750',
398 status => 2, 427 status => 2,
428 sim => 0,
399 }, 429 },
400 'creativezenxfi' => { 430 'creativezenxfi' => {
401 name => 'Creative Zen X-Fi', 431 name => 'Creative Zen X-Fi',
402 status => 3 432 status => 3,
433 manualok => 0,
403 }, 434 },
404 'creativezenxfistyle' => { 435 'creativezenxfistyle' => {
405 name => 'Creative Zen X-Fi Style', 436 name => 'Creative Zen X-Fi Style',
406 status => 3 437 status => 3,
438 manualok => 0,
407 }, 439 },
408 'creativezen' => { 440 'creativezen' => {
409 name => 'Creative Zen', 441 name => 'Creative Zen',
@@ -411,24 +443,30 @@ $releasenotes="/wiki/ReleaseNotes315";
411 }, 443 },
412 'creativezenmozaic' => { 444 'creativezenmozaic' => {
413 name => 'Creative Zen Mozaic', 445 name => 'Creative Zen Mozaic',
414 status => 3 446 status => 3,
447 manualok => 0,
415 }, 448 },
416 'agptekrocker' => { 449 'agptekrocker' => {
417 name => 'Agptek Rocker', 450 name => 'Agptek Rocker',
418 status => 2, 451 status => 3,
419 manualok => 1, # Remove once status moves to 3 452 release => '4.0', # Remove once 4.0 lands
420 }, 453 },
421 'xduoox3' => { 454 'xduoox3' => {
422 name => 'xDuoo X3', 455 name => 'xDuoo X3',
423 status => 3, 456 status => 3,
457 release => '4.0', # Remove once 4.0 lands
424 }, 458 },
425 'xduoox3ii' => { 459 'xduoox3ii' => {
426 name => 'xDuoo X3ii', 460 name => 'xDuoo X3ii',
427 status => 2, 461 manualok => 0, # Remove when manual is written
462 status => 3,
463 release => '4.0', # Remove once 4.0 lands
428 }, 464 },
429 'xduoox20' => { 465 'xduoox20' => {
430 name => 'xDuoo X20', 466 name => 'xDuoo X20',
431 status => 2, 467 manualok => 0, # Remove when manual is written
468 status => 3,
469 release => '4.0', # Remove once 4.0 lands
432 }, 470 },
433 'fiiom3klinux' => { 471 'fiiom3klinux' => {
434 name => 'FiiO M3K (Linux)', 472 name => 'FiiO M3K (Linux)',
@@ -436,16 +474,17 @@ $releasenotes="/wiki/ReleaseNotes315";
436 }, 474 },
437 'fiiom3k' => { 475 'fiiom3k' => {
438 name => 'FiiO M3K', 476 name => 'FiiO M3K',
439 status => 2, 477 status => 3,
440 manualok => 1, # Remove once status moves to 3 478 release => '4.0', # Remove once 4.0 lands
441 }, 479 },
442 'aigoerosq' => { 480 'aigoerosq' => {
443 name => 'AIGO EROS Q / K (Hosted)', 481 name => 'AIGO EROS Q / K (Hosted)',
444 status => 2, 482 status => 2, # Do we promote this to stable?
445 }, 483 },
446 'erosqnative' => { 484 'erosqnative' => {
447 name => 'AIGO EROS Q / K (Native)', 485 name => 'AIGO EROS Q / K (Native)',
448 status => 2, 486 status => 3,
487 release => '4.0', # Remove once 4.0 lands
449 }, 488 },
450 'ihifi770' => { 489 'ihifi770' => {
451 name => 'Xuelin iHIFI 770', 490 name => 'Xuelin iHIFI 770',
@@ -461,8 +500,8 @@ $releasenotes="/wiki/ReleaseNotes315";
461 }, 500 },
462 'shanlingq1' => { 501 'shanlingq1' => {
463 name => 'Shanling Q1', 502 name => 'Shanling Q1',
464 status => 2, 503 status => 3,
465 manualok => 1, # Remove once status moves to 3 504 release => '4.0', # Remove once 4.0 lands
466 }, 505 },
467); 506);
468 507
@@ -486,7 +525,18 @@ sub usablebuilds {
486 my @list; 525 my @list;
487 526
488 for my $b (sort byname keys %builds) { 527 for my $b (sort byname keys %builds) {
489 push @list, $b if ($builds{$b}{status} >= 2 || defined($builds{$b}{manualok})); 528 push @list, $b if ($builds{$b}{status} >= 2);
529 }
530
531 return @list;
532}
533
534sub manualbuilds {
535 my @list;
536
537 for my $b (sort byname keys %builds) {
538 push @list, $b if (($builds{$b}{status} > 2 && !defined($builds{$b}{manualok})) ||
539 (defined($builds{$b}{manualok}) && ($builds{$b}{manualok} > 0)));
490 } 540 }
491 541
492 return @list; 542 return @list;
@@ -512,6 +562,17 @@ sub allbuilds {
512 return @list; 562 return @list;
513} 563}
514 564
565sub simbuilds {
566 my @list;
567
568 for my $b (&allbuilds) {
569 push @list, $b if (defined($builds{$b}{sim}) and $builds{$b}{sim});
570 push @list, $b if (!defined($builds{$b}{sim}) and $builds{$b}{status} > 1);
571 }
572
573 return @list;
574}
575
515################################################################ 576################################################################
516 577
517# 'voicename' => { 578# 'voicename' => {
@@ -536,21 +597,45 @@ sub allbuilds {
536 'lang' => 'english', 597 'lang' => 'english',
537 'name' => 'UK English', 598 'name' => 'UK English',
538 'short' => 'en-gb', 599 'short' => 'en-gb',
539 'defengine' => 'espeak', 600 'defengine' => 'piper',
540 'engines' => { 601 'engines' => {
541 'festival' => '--language english', 602 'festival' => '--language english',
542 'espeak' => '-ven-gb -k 5', 603 'espeak' => '-ven-gb -k 5',
543 'gtts' => '-l en -t co.uk', 604 'gtts' => '-l en -t co.uk',
544 'piper' => 'en_GB-cori-high.onnx', 605 'piper' => 'en_GB-semaine-medium.onnx',
545 }, 606 },
546 'enabled' => 1, 607 'enabled' => 1,
547 }, 608 },
548 # Everything else in alphabetical order 609 # Everything else in alphabetical order
610 'bulgarian' => {
611 'lang' => 'bulgarian',
612 'name' => 'Български (Bulgarian)',
613 'short' => 'bg',
614 'defengine' => 'espeak', # XXX Switch to gtts when buildserver is updated
615 'engines' => {
616 'espeak' => '-vbg',
617 'gtts' => '-l bg',
618 # No piper voice yet.
619 },
620 'enabled' => 1,
621 },
622 'chinese-simp' => { # Mandarin?
623 'lang' => 'chinese-simp',
624 'name' => '简体中文 (Chinese Simplified)',
625 'short' => 'zh_cn',
626 'defengine' => 'piper',
627 'engines' => {
628 'espeak' => '-vzh',
629 'gtts' => '-l zh',
630 'piper' => 'zh_CN-huayan-medium.onnx',
631 },
632 'enabled' => 1,
633 },
549 'czech' => { 634 'czech' => {
550 'lang' => 'czech', 635 'lang' => 'czech',
551 'name' => 'Čeština (Czech)', 636 'name' => 'Čeština (Czech)',
552 'short' => 'cs', 637 'short' => 'cs',
553 'defengine' => 'espeak', 638 'defengine' => 'piper',
554 'engines' => { 639 'engines' => {
555 'espeak' => '-vcs', 640 'espeak' => '-vcs',
556 'gtts' => '-l cs', 641 'gtts' => '-l cs',
@@ -562,7 +647,7 @@ sub allbuilds {
562 'lang' => 'dansk', 647 'lang' => 'dansk',
563 'name' => 'Dansk (Danish)', 648 'name' => 'Dansk (Danish)',
564 'short' => 'da', 649 'short' => 'da',
565 'defengine' => 'espeak', 650 'defengine' => 'piper',
566 'engines' => { 651 'engines' => {
567 'espeak' => '-vda', 652 'espeak' => '-vda',
568 'gtts' => '-l da', 653 'gtts' => '-l da',
@@ -574,7 +659,7 @@ sub allbuilds {
574 'lang' => 'deutsch', 659 'lang' => 'deutsch',
575 'name' => 'Deutsch (German)', 660 'name' => 'Deutsch (German)',
576 'short' => 'de', 661 'short' => 'de',
577 'defengine' => 'espeak', 662 'defengine' => 'piper',
578 'engines' => { 663 'engines' => {
579 'espeak' => '-vde', 664 'espeak' => '-vde',
580 'gtts' => '-l de', 665 'gtts' => '-l de',
@@ -598,7 +683,7 @@ sub allbuilds {
598 'lang' => 'english-us', 683 'lang' => 'english-us',
599 'name' => 'American English', 684 'name' => 'American English',
600 'short' => 'en-us', 685 'short' => 'en-us',
601 'defengine' => 'espeak', 686 'defengine' => 'piper',
602 'engines' => { 687 'engines' => {
603 'festival' => '--language english', 688 'festival' => '--language english',
604 'espeak' => '-ven-us -k 5', 689 'espeak' => '-ven-us -k 5',
@@ -611,7 +696,7 @@ sub allbuilds {
611 'lang' => 'espanol', 696 'lang' => 'espanol',
612 'name' => 'Spanish (Peninsular)', 697 'name' => 'Spanish (Peninsular)',
613 'short' => 'es-es', 698 'short' => 'es-es',
614 'defengine' => 'espeak', 699 'defengine' => 'piper',
615 'engines' => { 700 'engines' => {
616 'festival' => '--language spanish', 701 'festival' => '--language spanish',
617 'espeak' => '-ves -k 5', 702 'espeak' => '-ves -k 5',
@@ -636,7 +721,7 @@ sub allbuilds {
636 'lang' => 'francais', 721 'lang' => 'francais',
637 'name' => 'Français (French)', 722 'name' => 'Français (French)',
638 'short' => 'fr', 723 'short' => 'fr',
639 'defengine' => 'espeak', 724 'defengine' => 'piper',
640 'engines' => { 725 'engines' => {
641 'espeak' => '-vfr-fr', 726 'espeak' => '-vfr-fr',
642 'gtts' => '-l fr', 727 'gtts' => '-l fr',
@@ -648,7 +733,7 @@ sub allbuilds {
648 'lang' => 'greek', 733 'lang' => 'greek',
649 'name' => 'Ελληνικά (Greek)', 734 'name' => 'Ελληνικά (Greek)',
650 'short' => 'el', 735 'short' => 'el',
651 'defengine' => 'espeak', 736 'defengine' => 'piper',
652 'engines' => { 737 'engines' => {
653 'espeak' => '-vel', 738 'espeak' => '-vel',
654 'gtts' => '-l el', 739 'gtts' => '-l el',
@@ -660,7 +745,7 @@ sub allbuilds {
660 'lang' => 'italiano', 745 'lang' => 'italiano',
661 'name' => 'Italiano (Italian)', 746 'name' => 'Italiano (Italian)',
662 'short' => 'it', 747 'short' => 'it',
663 'defengine' => 'espeak', 748 'defengine' => 'piper',
664 'engines' => { 749 'engines' => {
665 'espeak' => '-vit', 750 'espeak' => '-vit',
666 'gtts' => '-l it', 751 'gtts' => '-l it',
@@ -668,11 +753,22 @@ sub allbuilds {
668 }, 753 },
669 'enabled' => 1, 754 'enabled' => 1,
670 }, 755 },
756 'korean' => { #
757 'lang' => 'korean',
758 'name' => '한국어 (Korean)',
759 'short' => 'ko',
760 'defengine' => 'espeak',
761 'engines' => {
762 'espeak' => '-vko',
763 'gtts' => '-l ko',
764 },
765 'enabled' => 1,
766 },
671 'nederlands' => { 767 'nederlands' => {
672 'lang' => 'nederlands', 768 'lang' => 'nederlands',
673 'name' => 'Nederlands (Dutch)', 769 'name' => 'Nederlands (Dutch)',
674 'short' => 'nl', 770 'short' => 'nl',
675 'defengine' => 'espeak', 771 'defengine' => 'piper',
676 'engines' => { 772 'engines' => {
677 'espeak' => '-vnl', 773 'espeak' => '-vnl',
678 'gtts' => '-l nl', 774 'gtts' => '-l nl',
@@ -684,7 +780,7 @@ sub allbuilds {
684 'lang' => 'norsk', 780 'lang' => 'norsk',
685 'name' => 'Norsk (Norwegian)', 781 'name' => 'Norsk (Norwegian)',
686 'short' => 'no', 782 'short' => 'no',
687 'defengine' => 'espeak', 783 'defengine' => 'piper',
688 'engines' => { 784 'engines' => {
689 'espeak' => '-vno', 785 'espeak' => '-vno',
690 'gtts' => '-l no', 786 'gtts' => '-l no',
@@ -696,7 +792,7 @@ sub allbuilds {
696 'lang' => 'polski', 792 'lang' => 'polski',
697 'name' => 'Polski (Polish)', 793 'name' => 'Polski (Polish)',
698 'short' => 'pl', 794 'short' => 'pl',
699 'defengine' => 'espeak', 795 'defengine' => 'piper',
700 'engines' => { 796 'engines' => {
701 'espeak' => '-vpl', 797 'espeak' => '-vpl',
702 'gtts' => '-l pl', 798 'gtts' => '-l pl',
@@ -708,7 +804,7 @@ sub allbuilds {
708 'lang' => 'russian', 804 'lang' => 'russian',
709 'name' => 'Русский (Russian)', 805 'name' => 'Русский (Russian)',
710 'short' => 'ru', 806 'short' => 'ru',
711 'defengine' => 'espeak', 807 'defengine' => 'piper',
712 'engines' => { 808 'engines' => {
713 'espeak' => '-vru', 809 'espeak' => '-vru',
714 'gtts' => '-l ru', 810 'gtts' => '-l ru',
@@ -732,7 +828,7 @@ sub allbuilds {
732 'lang' => 'srpski', 828 'lang' => 'srpski',
733 'name' => 'српски (Serbian)', 829 'name' => 'српски (Serbian)',
734 'short' => 'sr', 830 'short' => 'sr',
735 'defengine' => 'espeak', 831 'defengine' => 'piper',
736 'engines' => { 832 'engines' => {
737 'espeak' => '-vsr', 833 'espeak' => '-vsr',
738 'gtts' => '-l sr', 834 'gtts' => '-l sr',
@@ -744,7 +840,7 @@ sub allbuilds {
744 'lang' => 'svenska', 840 'lang' => 'svenska',
745 'name' => 'Svenska (Swedish)', 841 'name' => 'Svenska (Swedish)',
746 'short' => 'sr', 842 'short' => 'sr',
747 'defengine' => 'espeak', 843 'defengine' => 'piper',
748 'engines' => { 844 'engines' => {
749 'espeak' => '-vsv', 845 'espeak' => '-vsv',
750 'gtts' => '-l sv', 846 'gtts' => '-l sv',
@@ -756,7 +852,7 @@ sub allbuilds {
756 'lang' => 'turkce', 852 'lang' => 'turkce',
757 'name' => 'Türkçe (Turkish)', 853 'name' => 'Türkçe (Turkish)',
758 'short' => 'tr', 854 'short' => 'tr',
759 'defengine' => 'espeak', 855 'defengine' => 'piper',
760 'engines' => { 856 'engines' => {
761 'espeak' => '-vtr', 857 'espeak' => '-vtr',
762 'gtts' => '-l tr', 858 'gtts' => '-l tr',
@@ -766,14 +862,14 @@ sub allbuilds {
766 }, 862 },
767); 863);
768 864
769sub bylang { 865sub byshortname {
770 return uc $voices{$a}{lang} cmp uc $voices{$b}{lang}; 866 return uc $voices{$a}{short} cmp uc $voices{$b}{short};
771} 867}
772 868
773sub allvoices { 869sub allvoices {
774 my @list; 870 my @list;
775 871
776 for my $b (sort bylang keys %voices) { 872 for my $b (sort byshortname keys %voices) {
777 push @list, $b if (defined($voices{$b}->{enabled}) && $voices{$b}->{enabled}); 873 push @list, $b if (defined($voices{$b}->{enabled}) && $voices{$b}->{enabled});
778 } 874 }
779 875
@@ -784,7 +880,7 @@ sub voicesforlang($) {
784 my $l = shift @_; 880 my $l = shift @_;
785 my @list; 881 my @list;
786 882
787 for my $b (sort bylang keys %voices) { 883 for my $b (sort byshortname keys %voices) {
788 push @list, $b if ($voices{$b}{lang} eq $b && defined($voices{$b}->{enabled}) && $voices{$b}->{enabled}); 884 push @list, $b if ($voices{$b}{lang} eq $b && defined($voices{$b}->{enabled}) && $voices{$b}->{enabled});
789 } 885 }
790 886