Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

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

Database view is fully translatable and entries can be voiced.

* All tagnavi.config entries pulled into language files
* Database viewer looks up LANG_IDs from the entries
* If we find a match, we can translate and voice these entries
* Add (disabled) mechanism to allow voicing database metadata

Original patch by Paul Sauro
Modifications by William Wingus
Further modifications by Solomon Peachy

Todo/Problems:

* Current Tagnavi headers are rather awkward in English
* Can't voice the "By first letter" alphabetic entries
* No mechanism for generating talk clips for DB metadata

Change-Id: Ic276ccda1bd8aae550d38be852bae4c6f697cd47

authored by

Paul Sauro and committed by
William Wilgus
fa5d2f3e 3b850e0c

+996 -42
+434
apps/lang/english.lang
··· 16510 16510 </voice> 16511 16511 </phrase> 16512 16512 <phrase> 16513 + id: LANG_SHOW_FIRST_LETTER 16514 + desc: Database menu 16515 + user: core 16516 + <source> 16517 + *: "First Letter" 16518 + </source> 16519 + <dest> 16520 + *: "First Letter" 16521 + </dest> 16522 + <voice> 16523 + *: "First Letter" 16524 + </voice> 16525 + </phrase> 16526 + <phrase> 16527 + id: LANG_SHOW_BY_FIRST_LETTER 16528 + desc: Database menu 16529 + user: core 16530 + <source> 16531 + *: "By First Letter..." 16532 + </source> 16533 + <dest> 16534 + *: "By First Letter..." 16535 + </dest> 16536 + <voice> 16537 + *: "By First Letter" 16538 + </voice> 16539 + </phrase> 16540 + <phrase> 16541 + id: LANG_SHOW_ARTISTS_BY_FIRST_LETTER 16542 + desc: Database menu 16543 + user: core 16544 + <source> 16545 + *: "Artists by First Letter" 16546 + </source> 16547 + <dest> 16548 + *: "Artists by First Letter" 16549 + </dest> 16550 + <voice> 16551 + *: "Artists by First Letter" 16552 + </voice> 16553 + </phrase> 16554 + <phrase> 16555 + id: LANG_SHOW_ALBUMS_BY_FIRST_LETTER 16556 + desc: Database menu 16557 + user: core 16558 + <source> 16559 + *: "Albums by First Letter" 16560 + </source> 16561 + <dest> 16562 + *: "Albums by First Letter" 16563 + </dest> 16564 + <voice> 16565 + *: "Albums by First Letter" 16566 + </voice> 16567 + </phrase> 16568 + <phrase> 16569 + id: LANG_SHOW_TRACKS_BY_FIRST_LETTER 16570 + desc: Database menu 16571 + user: core 16572 + <source> 16573 + *: "Tracks by First Letter" 16574 + </source> 16575 + <dest> 16576 + *: "Tracks by First Letter" 16577 + </dest> 16578 + <voice> 16579 + *: "Tracks by First Letter" 16580 + </voice> 16581 + </phrase> 16582 + <phrase> 16583 + id: LANG_ARTISTS 16584 + desc: Database menu 16585 + user: core 16586 + <source> 16587 + *: "Artists" 16588 + </source> 16589 + <dest> 16590 + *: "Artists" 16591 + </dest> 16592 + <voice> 16593 + *: "Artists" 16594 + </voice> 16595 + </phrase> 16596 + <phrase> 16597 + id: LANG_ALBUMS 16598 + desc: Database menu 16599 + user: core 16600 + <source> 16601 + *: "Albums" 16602 + </source> 16603 + <dest> 16604 + *: "Albums" 16605 + </dest> 16606 + <voice> 16607 + *: "Albums" 16608 + </voice> 16609 + </phrase> 16610 + <phrase> 16611 + id: LANG_TRACKS 16612 + desc: Database menu 16613 + user: core 16614 + <source> 16615 + *: "Tracks" 16616 + </source> 16617 + <dest> 16618 + *: "Tracks" 16619 + </dest> 16620 + <voice> 16621 + *: "Tracks" 16622 + </voice> 16623 + </phrase> 16624 + <phrase> 16625 + id: LANG_SHUFFLE_SONGS 16626 + desc: Database menu 16627 + user: core 16628 + <source> 16629 + *: "Shuffle Songs" 16630 + </source> 16631 + <dest> 16632 + *: "Shuffle Songs" 16633 + </dest> 16634 + <voice> 16635 + *: "Shuffle Songs" 16636 + </voice> 16637 + </phrase> 16638 + <phrase> 16639 + id: LANG_FILENAME 16640 + desc: Database and recording menus 16641 + user: core 16642 + <source> 16643 + *: "Filename" 16644 + </source> 16645 + <dest> 16646 + *: "Filename" 16647 + </dest> 16648 + <voice> 16649 + *: "Filename" 16650 + </voice> 16651 + </phrase> 16652 + <phrase> 16653 + id: LANG_TITLE_WITH_DURATION 16654 + desc: Database menu 16655 + user: core 16656 + <source> 16657 + *: "Title (with track duration)" 16658 + </source> 16659 + <dest> 16660 + *: "Title (with track duration)" 16661 + </dest> 16662 + <voice> 16663 + *: "Title with track duration" 16664 + </voice> 16665 + </phrase> 16666 + <phrase> 16667 + id: LANG_USER_RATING 16668 + desc: Database menu 16669 + user: core 16670 + <source> 16671 + *: "User Rating" 16672 + </source> 16673 + <dest> 16674 + *: "User Rating" 16675 + </dest> 16676 + <voice> 16677 + *: "User Rating" 16678 + </voice> 16679 + </phrase> 16680 + <phrase> 16681 + id: LANG_SEARCH 16682 + desc: Database menu 16683 + user: core 16684 + <source> 16685 + *: "Search" 16686 + </source> 16687 + <dest> 16688 + *: "Search" 16689 + </dest> 16690 + <voice> 16691 + *: "Search" 16692 + </voice> 16693 + </phrase> 16694 + <phrase> 16695 + id: LANG_SEARCH_BY 16696 + desc: Database menu 16697 + user: core 16698 + <source> 16699 + *: "Search by..." 16700 + </source> 16701 + <dest> 16702 + *: "Search by..." 16703 + </dest> 16704 + <voice> 16705 + *: "Search by" 16706 + </voice> 16707 + </phrase> 16708 + <phrase> 16709 + id: LANG_RECENTLY_ADDED 16710 + desc: Database menu 16711 + user: core 16712 + <source> 16713 + *: "Recently Added" 16714 + </source> 16715 + <dest> 16716 + *: "Recently Added" 16717 + </dest> 16718 + <voice> 16719 + *: "Recently Added" 16720 + </voice> 16721 + </phrase> 16722 + <phrase> 16723 + id: LANG_PLAYBACK_HISTORY 16724 + desc: Database menu 16725 + user: core 16726 + <source> 16727 + *: "Playback History" 16728 + </source> 16729 + <dest> 16730 + *: "Playback History" 16731 + </dest> 16732 + <voice> 16733 + *: "Playback History" 16734 + </voice> 16735 + </phrase> 16736 + <phrase> 16737 + id: LANG_CUSTOM_MENU 16738 + desc: Database menu 16739 + user: core 16740 + <source> 16741 + *: "Custom menu" 16742 + </source> 16743 + <dest> 16744 + *: "Custom menu" 16745 + </dest> 16746 + <voice> 16747 + *: "Custom menu" 16748 + </voice> 16749 + </phrase> 16750 + <phrase> 16751 + id: LANG_SAME_AS_CURRENT 16752 + desc: Database menu 16753 + user: core 16754 + <source> 16755 + *: "Same as currently played track" 16756 + </source> 16757 + <dest> 16758 + *: "Same as currently played track" 16759 + </dest> 16760 + <voice> 16761 + *: "Same as currently played track" 16762 + </voice> 16763 + </phrase> 16764 + <phrase> 16765 + id: LANG_DIRECTORY 16766 + desc: Database menu 16767 + user: core 16768 + <source> 16769 + *: "Directory" 16770 + </source> 16771 + <dest> 16772 + *: "Directory" 16773 + </dest> 16774 + <voice> 16775 + *: "Directory" 16776 + </voice> 16777 + </phrase> 16778 + <phrase> 16779 + id: LANG_ALBUMS_BY_YEAR 16780 + desc: Database menu 16781 + user: core 16782 + <source> 16783 + *: "Albums by Year" 16784 + </source> 16785 + <dest> 16786 + *: "Albums by Year" 16787 + </dest> 16788 + <voice> 16789 + *: "Albums by Year" 16790 + </voice> 16791 + </phrase> 16792 + <phrase> 16793 + id: LANG_ALBUMS_BETWEEN_YEARS 16794 + desc: Database menu 16795 + user: core 16796 + <source> 16797 + *: "Albums between Years" 16798 + </source> 16799 + <dest> 16800 + *: "Albums between Years" 16801 + </dest> 16802 + <voice> 16803 + *: "Albums between Years" 16804 + </voice> 16805 + </phrase> 16806 + <phrase> 16807 + id: LANG_ARTISTS_BETWEEN_YEARS 16808 + desc: Database menu 16809 + user: core 16810 + <source> 16811 + *: "Artists between Years" 16812 + </source> 16813 + <dest> 16814 + *: "Artists between Years" 16815 + </dest> 16816 + <voice> 16817 + *: "Artists between Years" 16818 + </voice> 16819 + </phrase> 16820 + <phrase> 16821 + id: LANG_HISTORY_MOST_PLAYED 16822 + desc: Database menu 16823 + user: core 16824 + <source> 16825 + *: "Most played (Plays|Score)" 16826 + </source> 16827 + <dest> 16828 + *: "Most played (Plays|Score)" 16829 + </dest> 16830 + <voice> 16831 + *: "Most played by Plays then by Score" 16832 + </voice> 16833 + </phrase> 16834 + <phrase> 16835 + id: LANG_HISTORY_RECENTLY_PLAYED_TRACKS 16836 + desc: Database menu 16837 + user: core 16838 + <source> 16839 + *: "Recently played tracks" 16840 + </source> 16841 + <dest> 16842 + *: "Recently played tracks" 16843 + </dest> 16844 + <voice> 16845 + *: "Recently played tracks" 16846 + </voice> 16847 + </phrase> 16848 + <phrase> 16849 + id: LANG_HISTORY_NEVER_PLAYED_TRACKS 16850 + desc: Database menu 16851 + user: core 16852 + <source> 16853 + *: "Never played tracks" 16854 + </source> 16855 + <dest> 16856 + *: "Never played tracks" 16857 + </dest> 16858 + <voice> 16859 + *: "Never played tracks" 16860 + </voice> 16861 + </phrase> 16862 + <phrase> 16863 + id: LANG_HISTORY_FAVOURITE_ARTISTS 16864 + desc: Database menu 16865 + user: core 16866 + <source> 16867 + *: "Favourite artists" 16868 + </source> 16869 + <dest> 16870 + *: "Favourite artists" 16871 + </dest> 16872 + <voice> 16873 + *: "Favourite artists" 16874 + </voice> 16875 + </phrase> 16876 + <phrase> 16877 + id: LANG_HISTORY_FAVOURITE_ALBUMS 16878 + desc: Database menu 16879 + user: core 16880 + <source> 16881 + *: "Favourite albums" 16882 + </source> 16883 + <dest> 16884 + *: "Favourite albums" 16885 + </dest> 16886 + <voice> 16887 + *: "Favourite albums" 16888 + </voice> 16889 + </phrase> 16890 + <phrase> 16891 + id: LANG_HISTORY_RECENT_FAVOURITES 16892 + desc: Database menu 16893 + user: core 16894 + <source> 16895 + *: "Recent favourites" 16896 + </source> 16897 + <dest> 16898 + *: "Recent favourites" 16899 + </dest> 16900 + <voice> 16901 + *: "Recent favourites" 16902 + </voice> 16903 + </phrase> 16904 + <phrase> 16905 + id: LANG_HISTORY_NEW_FAVOURITES 16906 + desc: Database menu 16907 + user: core 16908 + <source> 16909 + *: "New favourites" 16910 + </source> 16911 + <dest> 16912 + *: "New favourites" 16913 + </dest> 16914 + <voice> 16915 + *: "New favourites" 16916 + </voice> 16917 + </phrase> 16918 + <phrase> 16919 + id: LANG_HISTORY_FORGOTTEN_FAVOURITES 16920 + desc: Database menu 16921 + user: core 16922 + <source> 16923 + *: "Forgotten favourites" 16924 + </source> 16925 + <dest> 16926 + *: "Forgotten favourites" 16927 + </dest> 16928 + <voice> 16929 + *: "Forgotten favourites" 16930 + </voice> 16931 + </phrase> 16932 + <phrase> 16933 + id: LANG_TRACKS_BY 16934 + desc: Database menu 16935 + user: core 16936 + <source> 16937 + *: "Tracks by" 16938 + </source> 16939 + <dest> 16940 + *: "Tracks by" 16941 + </dest> 16942 + <voice> 16943 + *: "Tracks by" 16944 + </voice> 16945 + </phrase> 16946 + <phrase> 16513 16947 id: LANG_VIEW_ALBUMART 16514 16948 desc: WPS context menu 16515 16949 user: core
+435 -2
apps/lang/francais.lang
··· 373 373 *: "Now Playing" 374 374 </source> 375 375 <dest> 376 - *: "Lecture en cours" 376 + *: "En lecture" 377 377 </dest> 378 378 <voice> 379 - *: "Lecture en cours" 379 + *: "En lecture" 380 380 </voice> 381 381 </phrase> 382 382 <phrase> ··· 16417 16417 </voice> 16418 16418 </phrase> 16419 16419 <phrase> 16420 + id: LANG_SHOW_FIRST_LETTER 16421 + desc: Database menu 16422 + user: core 16423 + <source> 16424 + *: "First Letter" 16425 + </source> 16426 + <dest> 16427 + *: "Première Lettre" 16428 + </dest> 16429 + <voice> 16430 + *: "Première Lettre" 16431 + </voice> 16432 + </phrase> 16433 + <phrase> 16434 + id: LANG_SHOW_BY_FIRST_LETTER 16435 + desc: Database menu 16436 + user: core 16437 + <source> 16438 + *: "By First Letter..." 16439 + </source> 16440 + <dest> 16441 + *: "Par Première Lettre..." 16442 + </dest> 16443 + <voice> 16444 + *: "Par Première Lettre" 16445 + </voice> 16446 + </phrase> 16447 + <phrase> 16448 + id: LANG_SHOW_ARTISTS_BY_FIRST_LETTER 16449 + desc: Database menu 16450 + user: core 16451 + <source> 16452 + *: "Artists by First Letter" 16453 + </source> 16454 + <dest> 16455 + *: "Artistes par Première Lettre" 16456 + </dest> 16457 + <voice> 16458 + *: "Artistes par Première Lettre" 16459 + </voice> 16460 + </phrase> 16461 + <phrase> 16462 + id: LANG_SHOW_ALBUMS_BY_FIRST_LETTER 16463 + desc: Database menu 16464 + user: core 16465 + <source> 16466 + *: "Albums by First Letter" 16467 + </source> 16468 + <dest> 16469 + *: "Albums par Première Lettre" 16470 + </dest> 16471 + <voice> 16472 + *: "Albums par Première Lettre" 16473 + </voice> 16474 + </phrase> 16475 + <phrase> 16476 + id: LANG_SHOW_TRACKS_BY_FIRST_LETTER 16477 + desc: Database menu 16478 + user: core 16479 + <source> 16480 + *: "Tracks by First Letter" 16481 + </source> 16482 + <dest> 16483 + *: "Pistes par Première Lettre" 16484 + </dest> 16485 + <voice> 16486 + *: "Pistes par Première Lettre" 16487 + </voice> 16488 + </phrase> 16489 + <phrase> 16490 + id: LANG_ARTISTS 16491 + desc: Database menu 16492 + user: core 16493 + <source> 16494 + *: "Artists" 16495 + </source> 16496 + <dest> 16497 + *: "Artistes" 16498 + </dest> 16499 + <voice> 16500 + *: "Artistes" 16501 + </voice> 16502 + </phrase> 16503 + <phrase> 16504 + id: LANG_ALBUMS 16505 + desc: Database menu 16506 + user: core 16507 + <source> 16508 + *: "Albums" 16509 + </source> 16510 + <dest> 16511 + *: "Albums" 16512 + </dest> 16513 + <voice> 16514 + *: "Albums" 16515 + </voice> 16516 + </phrase> 16517 + <phrase> 16518 + id: LANG_TRACKS 16519 + desc: Database menu 16520 + user: core 16521 + <source> 16522 + *: "Tracks" 16523 + </source> 16524 + <dest> 16525 + *: "Pistes" 16526 + </dest> 16527 + <voice> 16528 + *: "Pistes" 16529 + </voice> 16530 + </phrase> 16531 + <phrase> 16532 + id: LANG_SHUFFLE_SONGS 16533 + desc: Database menu 16534 + user: core 16535 + <source> 16536 + *: "Shuffle Songs" 16537 + </source> 16538 + <dest> 16539 + *: "Mix de morceaux" 16540 + </dest> 16541 + <voice> 16542 + *: "Mix de morceaux" 16543 + </voice> 16544 + </phrase> 16545 + <phrase> 16546 + id: LANG_FILENAME 16547 + desc: Database menu 16548 + user: core 16549 + <source> 16550 + *: "Filename" 16551 + </source> 16552 + <dest> 16553 + *: "Nom du fichier" 16554 + </dest> 16555 + <voice> 16556 + *: "Nom du fichier" 16557 + </voice> 16558 + </phrase> 16559 + <phrase> 16560 + id: LANG_TITLE_WITH_DURATION 16561 + desc: Database menu 16562 + user: core 16563 + <source> 16564 + *: "Title (with track duration)" 16565 + </source> 16566 + <dest> 16567 + *: "Titre (avec durée de la piste)" 16568 + </dest> 16569 + <voice> 16570 + *: "Titre avec durée de la piste" 16571 + </voice> 16572 + </phrase> 16573 + <phrase> 16574 + id: LANG_USER_RATING 16575 + desc: Database menu 16576 + user: core 16577 + <source> 16578 + *: "User Rating" 16579 + </source> 16580 + <dest> 16581 + *: "Note Utilisateur" 16582 + </dest> 16583 + <voice> 16584 + *: "Note Utilisateur" 16585 + </voice> 16586 + </phrase> 16587 + <phrase> 16588 + id: LANG_SEARCH 16589 + desc: Database menu 16590 + user: core 16591 + <source> 16592 + *: "Search" 16593 + </source> 16594 + <dest> 16595 + *: "Rechercher" 16596 + </dest> 16597 + <voice> 16598 + *: "Rechercher" 16599 + </voice> 16600 + </phrase> 16601 + <phrase> 16602 + id: LANG_SEARCH_BY 16603 + desc: Database menu 16604 + user: core 16605 + <source> 16606 + *: "Search by..." 16607 + </source> 16608 + <dest> 16609 + *: "Rechercher par..." 16610 + </dest> 16611 + <voice> 16612 + *: "Rechercher par" 16613 + </voice> 16614 + </phrase> 16615 + <phrase> 16616 + id: LANG_RECENTLY_ADDED 16617 + desc: Database menu 16618 + user: core 16619 + <source> 16620 + *: "Recently Added" 16621 + </source> 16622 + <dest> 16623 + *: "Récemment Ajoutées" 16624 + </dest> 16625 + <voice> 16626 + *: "Récemment Ajoutées" 16627 + </voice> 16628 + </phrase> 16629 + <phrase> 16630 + id: LANG_PLAYBACK_HISTORY 16631 + desc: Database menu 16632 + user: core 16633 + <source> 16634 + *: "Playback History" 16635 + </source> 16636 + <dest> 16637 + *: "Historique des lectures" 16638 + </dest> 16639 + <voice> 16640 + *: "Historique des lectures" 16641 + </voice> 16642 + </phrase> 16643 + <phrase> 16644 + id: LANG_CUSTOM_MENU 16645 + desc: Database menu 16646 + user: core 16647 + <source> 16648 + *: "Custom menu" 16649 + </source> 16650 + <dest> 16651 + *: "Menu personnalisé" 16652 + </dest> 16653 + <voice> 16654 + *: "Menu personnalisé" 16655 + </voice> 16656 + </phrase> 16657 + <phrase> 16658 + id: LANG_SAME_AS_CURRENT 16659 + desc: Database menu 16660 + user: core 16661 + <source> 16662 + *: "Same as currently played track" 16663 + </source> 16664 + <dest> 16665 + *: "Semblable à la piste en cours de lecture" 16666 + </dest> 16667 + <voice> 16668 + *: "Semblable à la piste en cours de lecture" 16669 + </voice> 16670 + </phrase> 16671 + <phrase> 16672 + id: LANG_DIRECTORY 16673 + desc: Database menu 16674 + user: core 16675 + <source> 16676 + *: "Directory" 16677 + </source> 16678 + <dest> 16679 + *: "Répertoire" 16680 + </dest> 16681 + <voice> 16682 + *: "Répertoire" 16683 + </voice> 16684 + </phrase> 16685 + <phrase> 16686 + id: LANG_ALBUMS_BY_YEAR 16687 + desc: Database menu 16688 + user: core 16689 + <source> 16690 + *: "Albums by Year" 16691 + </source> 16692 + <dest> 16693 + *: "Albums par Année" 16694 + </dest> 16695 + <voice> 16696 + *: "Albums par Année" 16697 + </voice> 16698 + </phrase> 16699 + <phrase> 16700 + id: LANG_ALBUMS_BETWEEN_YEARS 16701 + desc: Database menu 16702 + user: core 16703 + <source> 16704 + *: "Albums between Years" 16705 + </source> 16706 + <dest> 16707 + *: "Albums entre des Années" 16708 + </dest> 16709 + <voice> 16710 + *: "Albums entre des Années" 16711 + </voice> 16712 + </phrase> 16713 + <phrase> 16714 + id: LANG_ARTISTS_BETWEEN_YEARS 16715 + desc: Database menu 16716 + user: core 16717 + <source> 16718 + *: "Artists between Years" 16719 + </source> 16720 + <dest> 16721 + *: "Artistes entre des Années" 16722 + </dest> 16723 + <voice> 16724 + *: "Artistes entre des Années" 16725 + </voice> 16726 + </phrase> 16727 + <phrase> 16728 + id: LANG_HISTORY_MOST_PLAYED 16729 + desc: Database menu 16730 + user: core 16731 + <source> 16732 + *: "Most played (Plays|Score)" 16733 + </source> 16734 + <dest> 16735 + *: "Les plus jouées (Nombre|Score)" 16736 + </dest> 16737 + <voice> 16738 + *: "Les plus jouées par Nombre puis par Score" 16739 + </voice> 16740 + </phrase> 16741 + <phrase> 16742 + id: LANG_HISTORY_RECENTLY_PLAYED_TRACKS 16743 + desc: Database menu 16744 + user: core 16745 + <source> 16746 + *: "Recently played tracks" 16747 + </source> 16748 + <dest> 16749 + *: "Pistes récemment jouées" 16750 + </dest> 16751 + <voice> 16752 + *: "Pistes récemment jouées" 16753 + </voice> 16754 + </phrase> 16755 + <phrase> 16756 + id: LANG_HISTORY_NEVER_PLAYED_TRACKS 16757 + desc: Database menu 16758 + user: core 16759 + <source> 16760 + *: "Never played tracks" 16761 + </source> 16762 + <dest> 16763 + *: "Pistes jamais jouées" 16764 + </dest> 16765 + <voice> 16766 + *: "Pistes jamais jouées" 16767 + </voice> 16768 + </phrase> 16769 + <phrase> 16770 + id: LANG_HISTORY_FAVOURITE_ARTISTS 16771 + desc: Database menu 16772 + user: core 16773 + <source> 16774 + *: "Favourite artists" 16775 + </source> 16776 + <dest> 16777 + *: "Artistes favoris" 16778 + </dest> 16779 + <voice> 16780 + *: "Artistes favoris" 16781 + </voice> 16782 + </phrase> 16783 + <phrase> 16784 + id: LANG_HISTORY_FAVOURITE_ALBUMS 16785 + desc: Database menu 16786 + user: core 16787 + <source> 16788 + *: "Favourite albums" 16789 + </source> 16790 + <dest> 16791 + *: "Albums favoris" 16792 + </dest> 16793 + <voice> 16794 + *: "Albums favoris" 16795 + </voice> 16796 + </phrase> 16797 + <phrase> 16798 + id: LANG_HISTORY_RECENT_FAVOURITES 16799 + desc: Database menu 16800 + user: core 16801 + <source> 16802 + *: "Recent favourites" 16803 + </source> 16804 + <dest> 16805 + *: "Favoris récents" 16806 + </dest> 16807 + <voice> 16808 + *: "Favoris récents" 16809 + </voice> 16810 + </phrase> 16811 + <phrase> 16812 + id: LANG_HISTORY_NEW_FAVOURITES 16813 + desc: Database menu 16814 + user: core 16815 + <source> 16816 + *: "New favourites" 16817 + </source> 16818 + <dest> 16819 + *: "Nouveaux favoris" 16820 + </dest> 16821 + <voice> 16822 + *: "Nouveaux favoris" 16823 + </voice> 16824 + </phrase> 16825 + <phrase> 16826 + id: LANG_HISTORY_FORGOTTEN_FAVOURITES 16827 + desc: Database menu 16828 + user: core 16829 + <source> 16830 + *: "Forgotten favourites" 16831 + </source> 16832 + <dest> 16833 + *: "Favoris oubliés" 16834 + </dest> 16835 + <voice> 16836 + *: "Favoris oubliés" 16837 + </voice> 16838 + </phrase> 16839 + <phrase> 16840 + id: LANG_TRACKS_BY 16841 + desc: Database menu 16842 + user: core 16843 + <source> 16844 + *: "Tracks by" 16845 + </source> 16846 + <dest> 16847 + *: "Pistes par" 16848 + </dest> 16849 + <voice> 16850 + *: "Pistes par" 16851 + </voice> 16852 + </phrase> 16420 16853 id: LANG_RESET_EQUALIZER 16421 16854 desc: in the equalizer settings menu 16422 16855 user: core
+25 -22
apps/tagnavi.config
··· 8 8 # If you only want to add menus and don't need to modify the default 9 9 # ones, you can edit "/.rockbox/tagnavi_custom.config" instead, which 10 10 # is included by this file and will not be overwritten automatically. 11 + # 12 + # Please note that modifying any menu labels/titles may result in them 13 + # not being translated or voiced. 11 14 12 15 # Basic format declarations 13 16 %format "fmt_title" "%s - %02d:%02d (%s)" basename Lm Ls filename ? title == "[Untagged]" ··· 26 29 %include "/.rockbox/tagnavi_custom.config" 27 30 28 31 # 29 - # === Begin of "A to Z" sub menus 32 + # === Begin of "First Letter" sub menus 30 33 # 31 34 32 - # Define the A to Z Artist sub menu 33 - %byfirstletter "custom_artist" "Artist A to Z" "canonicalartist" 34 - # Define the A to Z album sub menu 35 - %byfirstletter "custom_album" "Album A to Z" "album" 36 - # Define the A to Z track sub menu 37 - %byfirstletter "custom_track" "Track A to Z" "title" 35 + # Define the First Letter Artist sub menu 36 + %byfirstletter "custom_artist" "Artists by First Letter" "canonicalartist" 37 + # Define the First Letter album sub menu 38 + %byfirstletter "custom_album" "Albums by First Letter" "album" 39 + # Define the First Letter track sub menu 40 + %byfirstletter "custom_track" "Tracks by First Letter" "title" 38 41 39 42 # ^ An empy line ends the menu 40 43 41 - # Define the A to Z sub menu 42 - %menu_start "a2z" "A to Z..." 44 + # Define the First Letter sub menu 45 + %menu_start "a2z" "By First Letter..." 43 46 "Artists" ==> "custom_artist" 44 47 "Albums" ==> "custom_album" 45 48 "Tracks" ==> "custom_track" ··· 54 57 "Album Artist" -> albumartist ? albumartist ~ "" -> album -> title = "fmt_title" 55 58 "Album" -> album ? album ~ "" -> title = "fmt_title" 56 59 "Title" -> title = "fmt_title" ? title ~ "" 57 - "Album by year" -> album ? year = "" -> title = "fmt_title" 58 - "Artist between years" -> canonicalartist ? year >= "" & year <= "" -> album -> title = "fmt_title" 59 - "Album between years" -> album ? year >= "" & year <= "" -> title = "fmt_title" 60 + "Albums by Year" -> album ? year = "" -> title = "fmt_title" 61 + "Albums between Years" -> album ? year >= "" & year <= "" -> title = "fmt_title" 62 + "Artists between Years" -> canonicalartist ? year >= "" & year <= "" -> album -> title = "fmt_title" 60 63 "Filename" -> filename ? filename ~ "" 61 64 "Score" -> title = "fmt_score" ? autoscore > "" 62 65 "User Rating" -> title = "fmt_rating" ? rating > "" 63 66 "Comment" -> album ? comment ~ "" -> title = "fmt_title" 64 67 65 - # Define the "same as current" sub menu 66 - %menu_start "same" "Same as current" 68 + # Define the "Same as currently played track" sub menu 69 + %menu_start "same" "Same as currently played track" 67 70 "Directory" -> title ? filename ^ "#directory#" 68 71 "Title" -> title = "fmt_title" ? title = "#title#" 69 - "Artist" -> album ? artist = "#artist#" | artist = "#albumartist#" | albumartist = "#artist#" | albumartist = "#albumartist#" -> title = "fmt_title" 72 + "Artist" -> album ? artist = "#artist#" | artist = "#albumartist#" | albumartist = "#artist#" | albumartist = "#albumartist#" -> title = "fmt_title" 70 73 "Album" -> title = "fmt_title" ? album = "#album#" 71 74 "Composer" -> title = "fmt_title" ? composer = "#composer#" 72 75 73 76 # Define the runtime sub menu 74 - %menu_start "runtime" "Play history" 77 + %menu_start "runtime" "Playback History" 75 78 "Most played (Plays|Score)" -> title = "fmt_mostplayed" ? playcount > "0" 76 79 "Recently played tracks" -> title = "fmt_lastplayed" ? playcount > "0" 77 80 "Never played tracks" -> canonicalartist ? playcount == "0" -> album -> title = "fmt_title" ··· 85 88 %menu_start "track" "Tracks by" 86 89 "Filename" -> basename 87 90 "Title" -> title 88 - "Title mm:ss" -> title = "fmt_alphanum_title" 91 + "Title (with track duration)" -> title = "fmt_alphanum_title" 89 92 90 93 # 91 94 # === Begin of main menu ··· 99 102 "Genre" -> genre -> canonicalartist -> album -> title = "fmt_title" 100 103 "Year" -> year ? year > "0" -> canonicalartist -> album -> title = "fmt_title" 101 104 "Composer" -> composer -> album -> title = "fmt_title" 102 - "A to Z" ==> "a2z" 103 - "Track" ==> "track" 105 + "First Letter" ==> "a2z" 106 + "Tracks by" ==> "track" 104 107 "Shuffle Songs" ~> title = "fmt_title" 105 108 "Search" ==> "search" 106 109 "User Rating" -> rating -> title = "fmt_title" 107 110 "Recently Added" -> album ? entryage < "4" & commitid > "0" -> title = "fmt_title" 108 - "History" ==> "runtime" 109 - "Same as current" ==> "same" 110 - "Custom view" ==> "custom" 111 + "Playback History" ==> "runtime" 112 + "Same as currently played track" ==> "same" 113 + "Custom menu" ==> "custom" 111 114 112 115 # And finally set main menu as our root menu 113 116 %root_menu "main"
+74 -15
apps/tagtree.c
··· 24 24 * support the tag cache interface. 25 25 */ 26 26 27 - /*#define LOGF_ENABLE*/ 27 + //#define LOGF_ENABLE 28 28 29 29 #include <stdio.h> 30 30 #include <stdlib.h> ··· 58 58 #include "panic.h" 59 59 #include "onplay.h" 60 60 #include "plugin.h" 61 + #include "language.h" 61 62 62 63 #define str_or_empty(x) (x ? x : "(NULL)") 63 64 ··· 176 177 177 178 #define MENUENTRY_MAX_NAME 64 178 179 struct menu_entry { 179 - char name[MENUENTRY_MAX_NAME]; 180 + char _name[MENUENTRY_MAX_NAME]; 181 + const unsigned char *name; 180 182 int type; 181 183 struct search_instruction { 182 184 char name[MENUENTRY_MAX_NAME]; ··· 191 193 }; 192 194 193 195 struct menu_root { 194 - char title[MENUENTRY_MAX_NAME]; 196 + char _title[MENUENTRY_MAX_NAME]; 197 + const unsigned char *title; 195 198 char id[MAX_MENU_ID_SIZE]; 196 199 int itemcount; 197 200 struct menu_entry *items[TAGMENU_MAX_ITEMS]; ··· 228 231 ptrdiff_t diff = new - current; 229 232 230 233 if (menu) 234 + { 235 + if ((char *) menu->title == (char *) menu->_title) 236 + UPDATE(menu->title, diff); 231 237 UPDATE(menu, diff); 238 + } 232 239 233 240 if (csi) 234 241 UPDATE(csi, diff); ··· 251 258 UPDATE(mentry->si.clause[k][l], diff); 252 259 } 253 260 } 261 + if ((char *) menuroot->items[j]->name == (char *) menuroot->items[j]->_name) 262 + UPDATE(menuroot->items[j]->name, diff); 254 263 UPDATE(menuroot->items[j], diff); 255 264 } 265 + if ((char *) menus[i]->title == (char *) menus[i]->_title) 266 + UPDATE(menus[i]->title, diff); 256 267 UPDATE(menus[i], diff); 257 268 } 258 269 ··· 796 807 strp = str; 797 808 798 809 /* Parse entry name */ 799 - if (get_token_str(entry->name, sizeof entry->name) < 0) 810 + if (get_token_str(entry->_name, sizeof entry->_name) < 0) 800 811 { 801 812 logf("No name found."); 802 813 return false; 803 814 } 804 815 816 + /* Attempt to entry name to lang_id for voicing/translation 817 + (excepted for single character entries like those in the 'First Letter' menus) 818 + */ 819 + if (entry->_name[0] != '\0' && entry->_name[1] != '\0') 820 + { 821 + int lang_id = lang_english_to_id(entry->_name); 822 + if (lang_id >= 0) 823 + entry->name = ID2P(lang_id); 824 + else 825 + entry->name = entry->_name; 826 + } 827 + else 828 + entry->name = entry->_name; 829 + 805 830 /* Parse entry type */ 806 831 if (get_tag(&entry->type) <= 0) 807 832 return false; ··· 1223 1248 strmemccpy(menu->id, data, MAX_MENU_ID_SIZE); 1224 1249 } 1225 1250 1226 - if (get_token_str(menu->title, sizeof(menu->title)) < 0) 1251 + if (get_token_str(menu->_title, sizeof(menu->_title)) < 0) 1227 1252 { 1228 1253 logf("%%menu_start title empty"); 1229 1254 return 0; 1230 1255 } 1231 - logf("menu: %s", menu->title); 1256 + 1257 + /* Attempt to match title to lang_id for voicing/translation */ 1258 + int lang_id = lang_english_to_id(menu->_title); 1259 + if (lang_id >= 0) 1260 + menu->title = ID2P(lang_id); 1261 + else 1262 + menu->title = menu->_title; 1263 + 1264 + logf("menu: %s id: %ld", P2STR(menu->title), P2ID(menu->title)); 1232 1265 1233 1266 if (variable == menu_byfirstletter) 1234 1267 { ··· 1355 1388 tree_unlock_cache(c); 1356 1389 } 1357 1390 1358 - static bool initialize_tagtree(void) /* also used when user selects 'Reload' in 'custom view'*/ 1391 + static bool initialize_tagtree(void) /* also used when user selects 'Reload' in 'custom menu'*/ 1359 1392 { 1360 1393 max_history_level = 0; 1361 1394 format_count = 0; ··· 1635 1668 if (offset == 0) 1636 1669 { 1637 1670 dptr->newtable = TABLE_ALLSUBENTRIES; 1638 - dptr->name = str(LANG_TAGNAVI_ALL_TRACKS); 1671 + dptr->name = ID2P(LANG_TAGNAVI_ALL_TRACKS); 1639 1672 dptr->customaction = ONPLAY_NO_CUSTOMACTION; 1640 1673 dptr++; 1641 1674 current_entry_count++; ··· 1644 1677 if (offset <= 1) 1645 1678 { 1646 1679 dptr->newtable = TABLE_NAVIBROWSE; 1647 - dptr->name = str(LANG_TAGNAVI_RANDOM); 1680 + dptr->name = ID2P(LANG_TAGNAVI_RANDOM); 1648 1681 dptr->extraseek = -1; 1649 1682 dptr->customaction = ONPLAY_NO_CUSTOMACTION; 1650 1683 dptr++; ··· 1864 1897 1865 1898 for (i = 0; i < menu->itemcount; i++) 1866 1899 { 1867 - dptr->name = menu->items[i]->name; 1900 + 1901 + dptr->name = (char*)menu->items[i]->name; 1902 + 1903 + logf( "%s loading menu %d name: %s, lang_id %ld", __func__, i, 1904 + P2STR((unsigned char*)dptr->name),P2ID((unsigned char*)dptr->name)); 1905 + 1868 1906 switch (menu->items[i]->type) 1869 1907 { 1870 1908 case menu_next: ··· 2062 2100 csi = &menu->items[seek]->si; 2063 2101 c->currextra = 0; 2064 2102 2065 - strmemccpy(current_title[c->currextra], dptr->name, 2103 + unsigned char *name = dptr->name; 2104 + 2105 + strmemccpy(current_title[c->currextra], P2STR(name), 2066 2106 sizeof(current_title[0])); 2107 + 2108 + logf("%s (ROOT) current title %s", __func__, P2STR(name)); 2067 2109 2068 2110 /* Read input as necessary. */ 2069 2111 for (i = 0; i < csi->tagorder_count; i++) ··· 2157 2199 else 2158 2200 c->dirlevel--; 2159 2201 2202 + unsigned char *name = dptr->name; 2203 + name = P2STR(name); 2204 + logf("%s (NAVI/ALLSUB) current title %s", __func__, name); 2160 2205 /* Update the statusbar title */ 2161 - strmemccpy(current_title[c->currextra], dptr->name, 2162 - sizeof(current_title[0])); 2206 + strmemccpy(current_title[c->currextra], name, sizeof(current_title[0])); 2163 2207 break; 2164 2208 2165 2209 default: ··· 2328 2372 } 2329 2373 2330 2374 fill_randomly = n > slots_remaining; 2331 - 2375 + 2332 2376 if (fill_randomly) 2333 2377 { 2334 2378 srand(current_tick); ··· 2648 2692 struct tagentry *entry = tagtree_get_entry(c, id); 2649 2693 if (!entry) 2650 2694 return NULL; 2695 + 2696 + unsigned char *name = entry->name; 2697 + 2698 + int lang_id = P2ID(name); 2699 + logf("%s: '%s' id: %d\n", __func__, 2700 + P2STR(name), lang_id); 2701 + if (lang_id >= 0) 2702 + { 2703 + strmemccpy(buf,P2STR(name), bufsize); 2704 + return entry->name; 2705 + } 2706 + 2651 2707 strmemccpy(buf, entry->name, bufsize); 2652 2708 return buf; 2653 2709 } ··· 2658 2714 switch (c->currtable) 2659 2715 { 2660 2716 case TABLE_ROOT: 2661 - return menu->title; 2717 + logf("%s (ROOT) %s", __func__, P2STR(menu->title)); 2718 + return P2STR(menu->title); 2662 2719 2663 2720 case TABLE_NAVIBROWSE: 2664 2721 case TABLE_ALLSUBENTRIES: 2722 + logf("%s (NAVI/ALLSUB) idx: %d %s", __func__, 2723 + c->currextra, current_title[c->currextra]); 2665 2724 return current_title[c->currextra]; 2666 2725 } 2667 2726
+28 -3
apps/tree.c
··· 210 210 static int tree_voice_cb(int selected_item, void * data) 211 211 { 212 212 struct tree_context * local_tc=(struct tree_context *)data; 213 - char *name; 213 + unsigned char *name; 214 214 int attr=0; 215 215 int customaction = ONPLAY_NO_CUSTOMACTION; 216 216 #ifdef HAVE_TAGCACHE ··· 222 222 attr = tagtree_get_attr(local_tc); 223 223 name = tagtree_get_entry_name(local_tc, selected_item, buf, sizeof(buf)); 224 224 customaction = tagtree_get_custom_action(local_tc); 225 + 226 + /* See if name is an encoded ID, if it is, then speak it normally */ 227 + int lang_id = P2ID(name); 228 + /*debugf("%s Found name %s id %d\n", __func__, P2STR(name), lang_id);*/ 229 + if (lang_id >= 0) 230 + { 231 + talk_id(lang_id, true); 232 + return 0; 233 + } 234 + 235 + /* Otherwise, it is either a custom "header" or a database entry, 236 + so try to look up a talk clip for it. */ 237 + 238 + // XXX this needs further work, so disable it for now 239 + // -- need to distinguish between "headers" and entries 240 + // each entry type ("artist", "album", etc) should be delineated 241 + // so we can split the clips into subdirs. 242 + #if 0 243 + if (talk_file(LANG_DIR"/database/", NULL, 244 + P2STR(name), file_thumbnail_ext, NULL, true) > 0) 245 + { 246 + return 0; 247 + } 248 + // XXX fall back to spelling it out? 249 + #endif 225 250 } 226 251 else 227 252 #endif ··· 479 504 if (*title == '\0') 480 505 { 481 506 /* Display "Files" for the root dir */ 482 - title = str(LANG_DIR_BROWSER); 507 + title = ID2P(LANG_DIR_BROWSER); 483 508 } 484 509 icon = filetype_get_icon(ATTR_DIRECTORY); 485 510 } ··· 489 514 490 515 /* set title and icon, if nothing is set, clear the title 491 516 * with NULL and icon as NOICON as the list is reused */ 492 - gui_synclist_set_title(list, title, icon); 517 + gui_synclist_set_title(list, P2STR((unsigned char*)title), icon); 493 518 494 519 gui_synclist_set_nb_items(list, tc.filesindir); 495 520 gui_synclist_set_icon_callback(list,