various fixes

This commit is contained in:
bkfox 2022-12-12 12:29:05 +01:00
parent a53a37021c
commit d2a65bd1fe
9 changed files with 282 additions and 200 deletions

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Aircox 0.1\n" "Project-Id-Version: Aircox 0.1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-10-08 11:44+0000\n" "POT-Creation-Date: 2022-12-12 10:15+0000\n"
"PO-Revision-Date: 2016-10-10 16:00+02\n" "PO-Revision-Date: 2016-10-10 16:00+02\n"
"Last-Translator: Aarys\n" "Last-Translator: Aarys\n"
"Language-Team: Aircox's translators team\n" "Language-Team: Aircox's translators team\n"
@ -18,13 +18,13 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: aircox/admin/episode.py:29 aircox/models/episode.py:183 #: aircox/admin/episode.py:27 aircox/models/episode.py:183
#: aircox/models/log.py:82 #: aircox/models/log.py:82
msgid "start" msgid "start"
msgstr "début" msgstr "début"
#: aircox/admin/episode.py:33 aircox/models/episode.py:184 #: aircox/admin/episode.py:31 aircox/models/episode.py:184
#: aircox/models/program.py:473 #: aircox/models/program.py:469
msgid "end" msgid "end"
msgstr "fin" msgstr "fin"
@ -52,7 +52,7 @@ msgstr "Tout"
msgid "Publication Settings" msgid "Publication Settings"
msgstr "Paramètre de la publication" msgstr "Paramètre de la publication"
#: aircox/admin/program.py:40 aircox/models/program.py:286 #: aircox/admin/program.py:40 aircox/models/program.py:282
msgid "Schedule" msgid "Schedule"
msgstr "Horaire" msgstr "Horaire"
@ -60,7 +60,7 @@ msgstr "Horaire"
msgid "Program Settings" msgid "Program Settings"
msgstr "Paramètres de l'émission" msgstr "Paramètres de l'émission"
#: aircox/admin/program.py:64 aircox/models/program.py:122 #: aircox/admin/program.py:64 aircox/models/program.py:118
msgid "Program" msgid "Program"
msgstr "Émission" msgstr "Émission"
@ -68,23 +68,25 @@ msgstr "Émission"
msgid "Day" msgid "Day"
msgstr "Jour" msgstr "Jour"
#: aircox/admin/sound.py:35 aircox/admin/sound.py:67 #: aircox/admin/sound.py:37 aircox/admin/sound.py:71
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: aircox/admin/sound.py:63 #: aircox/admin/sound.py:65
msgid "Program / Episode" msgid "Program / Episode"
msgstr "Émission / Épisode" msgstr "Émission / Épisode"
#: aircox/admin/sound.py:81 aircox/templates/aircox/episode_detail.html:36 #: aircox/admin/sound.py:100
#: aircox/templates/admin/aircox/playlist_inline.html:20
#: aircox/templates/aircox/episode_detail.html:36
msgid "Playlist" msgid "Playlist"
msgstr "Playlist" msgstr "Playlist"
#: aircox/admin/sound.py:82 #: aircox/admin/sound.py:102
msgid "Info" msgid "Info"
msgstr "Info" msgstr "Info"
#: aircox/admin/sound.py:96 aircox/models/sound.py:243 #: aircox/admin/sound.py:116 aircox/models/sound.py:240
msgid "timestamp" msgid "timestamp"
msgstr "temps" msgstr "temps"
@ -92,8 +94,8 @@ msgstr "temps"
msgid "Statistics" msgid "Statistics"
msgstr "Statistiques" msgstr "Statistiques"
#: aircox/filters.py:8 aircox/templates/admin/base.html:81 #: aircox/filters.py:8 aircox/templates/admin/base.html:84
#: aircox/templates/admin/base.html:95 aircox/templates/admin/base.html:109 #: aircox/templates/admin/base.html:98 aircox/templates/admin/base.html:112
#: aircox/templates/aircox/base.html:78 #: aircox/templates/aircox/base.html:78
#: aircox/templates/aircox/page_list.html:15 #: aircox/templates/aircox/page_list.html:15
msgid "Search" msgid "Search"
@ -103,24 +105,24 @@ msgstr "Chercher"
msgid "Podcast" msgid "Podcast"
msgstr "Podcast" msgstr "Podcast"
#: aircox/management/commands/sounds_monitor.py:204 #: aircox/management/commands/sounds_monitor.py:205
msgid "unknown" msgid "unknown"
msgstr "inconnu" msgstr "inconnu"
#: aircox/models/article.py:14 #: aircox/models/article.py:16
msgid "Article" msgid "Article"
msgstr "Article" msgstr "Article"
#: aircox/models/article.py:15 aircox/templates/admin/base.html:92 #: aircox/models/article.py:17 aircox/templates/admin/base.html:95
#: aircox/templates/aircox/program_detail.html:19 #: aircox/templates/aircox/program_detail.html:19
msgid "Articles" msgid "Articles"
msgstr "Articles" msgstr "Articles"
#: aircox/models/episode.py:52 #: aircox/models/episode.py:52 aircox/templates/admin/aircox/statistics.html:23
msgid "Episode" msgid "Episode"
msgstr "Épisode" msgstr "Épisode"
#: aircox/models/episode.py:53 aircox/templates/admin/base.html:106 #: aircox/models/episode.py:53 aircox/templates/admin/base.html:109
msgid "Episodes" msgid "Episodes"
msgstr "Épisodes" msgstr "Épisodes"
@ -136,8 +138,8 @@ msgstr "non confirmé"
msgid "cancelled" msgid "cancelled"
msgstr "annulé" msgstr "annulé"
#: aircox/models/episode.py:174 aircox/models/sound.py:102 #: aircox/models/episode.py:174 aircox/models/sound.py:99
#: aircox/models/sound.py:233 aircox/templates/admin/aircox/statistics.html:23 #: aircox/models/sound.py:230
msgid "episode" msgid "episode"
msgstr "épisode" msgstr "épisode"
@ -146,7 +148,7 @@ msgid "schedule"
msgstr "horaire" msgstr "horaire"
#: aircox/models/episode.py:181 aircox/models/log.py:91 #: aircox/models/episode.py:181 aircox/models/log.py:91
#: aircox/models/sound.py:105 aircox/models/station.py:142 #: aircox/models/sound.py:102 aircox/models/station.py:142
msgid "type" msgid "type"
msgstr "type" msgstr "type"
@ -171,12 +173,12 @@ msgstr "rediffusion"
msgid "stop" msgid "stop"
msgstr "stop" msgstr "stop"
#: aircox/models/log.py:84 aircox/models/sound.py:89 #: aircox/models/log.py:84 aircox/models/sound.py:86
msgid "other" msgid "other"
msgstr "autre" msgstr "autre"
#: aircox/models/log.py:89 aircox/models/page.py:248 #: aircox/models/log.py:89 aircox/models/page.py:248
#: aircox/models/program.py:55 aircox/models/station.py:139 #: aircox/models/program.py:54 aircox/models/station.py:139
msgid "station" msgid "station"
msgstr "station" msgstr "station"
@ -184,7 +186,7 @@ msgstr "station"
msgid "related station" msgid "related station"
msgstr "station relative" msgstr "station relative"
#: aircox/models/log.py:92 aircox/models/program.py:254 #: aircox/models/log.py:92 aircox/models/program.py:250
msgid "date" msgid "date"
msgstr "date" msgstr "date"
@ -200,11 +202,12 @@ msgstr "identifiant de la source relative à ce log"
msgid "comment" msgid "comment"
msgstr "commentaire" msgstr "commentaire"
#: aircox/models/log.py:107 aircox/models/sound.py:146 #: aircox/models/log.py:107 aircox/models/sound.py:143
msgid "Sound" msgid "Sound"
msgstr "Son" msgstr "Son"
#: aircox/models/log.py:112 aircox/models/sound.py:259 #: aircox/models/log.py:112 aircox/models/sound.py:259
#: aircox/templates/admin/aircox/statistics.html:24
msgid "Track" msgid "Track"
msgstr "Morceau" msgstr "Morceau"
@ -217,7 +220,7 @@ msgid "Logs"
msgstr "Logs" msgstr "Logs"
#: aircox/models/page.py:30 aircox/models/page.py:251 #: aircox/models/page.py:30 aircox/models/page.py:251
#: aircox/models/sound.py:247 #: aircox/models/sound.py:244
msgid "title" msgid "title"
msgstr "titre" msgstr "titre"
@ -338,8 +341,8 @@ msgstr "Commentaires"
msgid "menu" msgid "menu"
msgstr "menu" msgstr "menu"
#: aircox/models/page.py:250 aircox/models/sound.py:107 #: aircox/models/page.py:250 aircox/models/sound.py:104
#: aircox/models/sound.py:240 #: aircox/models/sound.py:237
msgid "order" msgid "order"
msgstr "ordre" msgstr "ordre"
@ -359,234 +362,239 @@ msgstr "Élément du menu"
msgid "Menu items" msgid "Menu items"
msgstr "Éléments de menu" msgstr "Éléments de menu"
#: aircox/models/program.py:57 aircox/models/station.py:52 #: aircox/models/program.py:56 aircox/models/station.py:52
#: aircox/models/station.py:144 #: aircox/models/station.py:144
msgid "active" msgid "active"
msgstr "actif" msgstr "actif"
#: aircox/models/program.py:59 #: aircox/models/program.py:58
msgid "if not checked this program is no longer active" msgid "if not checked this program is no longer active"
msgstr "si selectionné, cette émission n'est plus active" msgstr "si selectionné, cette émission n'est plus active"
#: aircox/models/program.py:62 #: aircox/models/program.py:61
msgid "syncronise" msgid "syncronise"
msgstr "synchroniser" msgstr "synchroniser"
#: aircox/models/program.py:64 #: aircox/models/program.py:63
msgid "update later diffusions according to schedule changes" msgid "update later diffusions according to schedule changes"
msgstr "met à jour les dates de diffusion à venir lorsque l'horaire change" msgstr "met à jour les dates de diffusion à venir lorsque l'horaire change"
#: aircox/models/program.py:123 aircox/templates/admin/base.html:78 #: aircox/models/program.py:119 aircox/templates/admin/base.html:81
msgid "Programs" msgid "Programs"
msgstr "Émissions" msgstr "Émissions"
#: aircox/models/program.py:178 aircox/models/program.py:461 #: aircox/models/program.py:174 aircox/models/program.py:457
msgid "related program" msgid "related program"
msgstr "émission apparentée" msgstr "émission apparentée"
#: aircox/models/program.py:182 #: aircox/models/program.py:178
msgid "rerun of" msgid "rerun of"
msgstr "rediffusion de" msgstr "rediffusion de"
#: aircox/models/program.py:226 #: aircox/models/program.py:222
msgid "rerun must happen after original" msgid "rerun must happen after original"
msgstr "la rediffusion doit être après l'original" msgstr "la rediffusion doit être après l'original"
#: aircox/models/program.py:254 #: aircox/models/program.py:250
msgid "date of the first diffusion" msgid "date of the first diffusion"
msgstr "date de la première diffusion" msgstr "date de la première diffusion"
#: aircox/models/program.py:257 #: aircox/models/program.py:253
#: aircox/templates/admin/aircox/statistics.html:22
msgid "time" msgid "time"
msgstr "heure" msgstr "heure"
#: aircox/models/program.py:257 #: aircox/models/program.py:253
msgid "start time" msgid "start time"
msgstr "heure de début" msgstr "heure de début"
#: aircox/models/program.py:260 #: aircox/models/program.py:256
msgid "timezone" msgid "timezone"
msgstr "zone horaire" msgstr "zone horaire"
#: aircox/models/program.py:263 #: aircox/models/program.py:259
msgid "timezone used for the date" msgid "timezone used for the date"
msgstr "zone horaire utilisée pour la date" msgstr "zone horaire utilisée pour la date"
#: aircox/models/program.py:266 aircox/models/sound.py:120 #: aircox/models/program.py:262 aircox/models/sound.py:117
msgid "duration" msgid "duration"
msgstr "durée" msgstr "durée"
#: aircox/models/program.py:267 #: aircox/models/program.py:263
msgid "regular duration" msgid "regular duration"
msgstr "durée normale" msgstr "durée normale"
#: aircox/models/program.py:270 #: aircox/models/program.py:266
msgid "frequency" msgid "frequency"
msgstr "fréquence" msgstr "fréquence"
#: aircox/models/program.py:272 #: aircox/models/program.py:268
msgid "ponctual" msgid "ponctual"
msgstr "ponctuel" msgstr "ponctuel"
#: aircox/models/program.py:273 #: aircox/models/program.py:269
#, python-brace-format #, python-brace-format
msgid "1st {day} of the month" msgid "1st {day} of the month"
msgstr "1er {day} du mois" msgstr "1er {day} du mois"
#: aircox/models/program.py:274 #: aircox/models/program.py:270
#, python-brace-format #, python-brace-format
msgid "2nd {day} of the month" msgid "2nd {day} of the month"
msgstr "2ème {day} du mois" msgstr "2ème {day} du mois"
#: aircox/models/program.py:275 #: aircox/models/program.py:271
#, python-brace-format #, python-brace-format
msgid "3rd {day} of the month" msgid "3rd {day} of the month"
msgstr "3ème {day} du mois" msgstr "3ème {day} du mois"
#: aircox/models/program.py:276 #: aircox/models/program.py:272
#, python-brace-format #, python-brace-format
msgid "4th {day} of the month" msgid "4th {day} of the month"
msgstr "4ème {day} du mois" msgstr "4ème {day} du mois"
#: aircox/models/program.py:277 #: aircox/models/program.py:273
#, python-brace-format #, python-brace-format
msgid "last {day} of the month" msgid "last {day} of the month"
msgstr "dernier {day} du mois" msgstr "dernier {day} du mois"
#: aircox/models/program.py:278 #: aircox/models/program.py:274
#, python-brace-format #, python-brace-format
msgid "1st and 3rd {day} of the month" msgid "1st and 3rd {day} of the month"
msgstr "1er et 3ème {day} du mois" msgstr "1er et 3ème {day} du mois"
#: aircox/models/program.py:279 #: aircox/models/program.py:275
#, python-brace-format #, python-brace-format
msgid "2nd and 4th {day} of the month" msgid "2nd and 4th {day} of the month"
msgstr "2ème et 4ème {day} du mois" msgstr "2ème et 4ème {day} du mois"
#: aircox/models/program.py:280 #: aircox/models/program.py:276
#, fuzzy, python-brace-format
#| msgid "every {day}"
msgid "{day}" msgid "{day}"
msgstr "{day}" msgstr "{day}"
#: aircox/models/program.py:281 #: aircox/models/program.py:277
#, python-brace-format #, python-brace-format
msgid "one {day} on two" msgid "one {day} on two"
msgstr "un {day} sur deux" msgstr "un {day} sur deux"
#: aircox/models/program.py:287 #: aircox/models/program.py:283
msgid "Schedules" msgid "Schedules"
msgstr "Horaires" msgstr "Horaires"
#: aircox/models/program.py:464 #: aircox/models/program.py:460
msgid "delay" msgid "delay"
msgstr "délai" msgstr "délai"
#: aircox/models/program.py:465 #: aircox/models/program.py:461
msgid "minimal delay between two sound plays" msgid "minimal delay between two sound plays"
msgstr "délai minimum entre deux sons joués" msgstr "délai minimum entre deux sons joués"
#: aircox/models/program.py:468 #: aircox/models/program.py:464
msgid "begin" msgid "begin"
msgstr "début" msgstr "début"
#: aircox/models/program.py:469 aircox/models/program.py:475 #: aircox/models/program.py:465 aircox/models/program.py:471
msgid "used to define a time range this stream is played" msgid "used to define a time range this stream is played"
msgstr "" msgstr ""
"utilisé pour définir un intervalle de temps pendant lequel ce stream est joué" "utilisé pour définir un intervalle de temps pendant lequel ce stream est joué"
#: aircox/models/sound.py:89 #: aircox/models/sound.py:86
msgid "archive" msgid "archive"
msgstr "archive" msgstr "archive"
#: aircox/models/sound.py:90 #: aircox/models/sound.py:87
msgid "excerpt" msgid "excerpt"
msgstr "extrait" msgstr "extrait"
#: aircox/models/sound.py:90 #: aircox/models/sound.py:87
msgid "removed" msgid "removed"
msgstr "supprimé" msgstr "supprimé"
#: aircox/models/sound.py:93 aircox/models/station.py:37 #: aircox/models/sound.py:90 aircox/models/station.py:37
msgid "name" msgid "name"
msgstr "nom" msgstr "nom"
#: aircox/models/sound.py:96 #: aircox/models/sound.py:93
msgid "program" msgid "program"
msgstr "émission" msgstr "émission"
#: aircox/models/sound.py:97 #: aircox/models/sound.py:94
msgid "program related to it" msgid "program related to it"
msgstr "émission apparentée à celui-ci" msgstr "émission apparentée à celui-ci"
#: aircox/models/sound.py:107 aircox/models/sound.py:240 #: aircox/models/sound.py:104 aircox/models/sound.py:237
msgid "position in the playlist" msgid "position in the playlist"
msgstr "position dans la playlist" msgstr "position dans la playlist"
#: aircox/models/sound.py:116 aircox/models/station.py:135 #: aircox/models/sound.py:113 aircox/models/station.py:135
msgid "file" msgid "file"
msgstr "fichier" msgstr "fichier"
#: aircox/models/sound.py:122 #: aircox/models/sound.py:119
msgid "duration of the sound" msgid "duration of the sound"
msgstr "durée du son" msgstr "durée du son"
#: aircox/models/sound.py:125 #: aircox/models/sound.py:122
msgid "modification time" msgid "modification time"
msgstr "dernière modification" msgstr "dernière modification"
#: aircox/models/sound.py:127 #: aircox/models/sound.py:124
msgid "last modification date and time" msgid "last modification date and time"
msgstr "date et heure de la dernière modification" msgstr "date et heure de la dernière modification"
#: aircox/models/sound.py:130 #: aircox/models/sound.py:127
msgid "good quality" msgid "good quality"
msgstr "bonne qualité" msgstr "bonne qualité"
#: aircox/models/sound.py:130 #: aircox/models/sound.py:127
msgid "sound meets quality requirements" msgid "sound meets quality requirements"
msgstr "le son rencontre les exigences de qualité" msgstr "le son rencontre les exigences de qualité"
#: aircox/models/sound.py:134 #: aircox/models/sound.py:131
msgid "public" msgid "public"
msgstr "publique" msgstr "publique"
#: aircox/models/sound.py:134 #: aircox/models/sound.py:131
msgid "whether it is publicly available as podcast" msgid "whether it is publicly available as podcast"
msgstr "coché pour rendre le podcast public" msgstr "coché pour rendre le podcast public"
#: aircox/models/sound.py:138 #: aircox/models/sound.py:135
msgid "downloadable" msgid "downloadable"
msgstr "téléchargeable" msgstr "téléchargeable"
#: aircox/models/sound.py:139 #: aircox/models/sound.py:136
msgid "" msgid ""
"whether it can be publicly downloaded by visitors (sound must be public)" "whether it can be publicly downloaded by visitors (sound must be public)"
msgstr "" msgstr ""
"coché pour permettre le téléchargement public (le podcast doit être " "coché pour permettre le téléchargement public (le podcast doit être "
"disponible publiquement)" "disponible publiquement)"
#: aircox/models/sound.py:147 #: aircox/models/sound.py:144
msgid "Sounds" msgid "Sounds"
msgstr "Sons" msgstr "Sons"
#: aircox/models/sound.py:237 #: aircox/models/sound.py:234
msgid "sound" msgid "sound"
msgstr "son" msgstr "son"
#: aircox/models/sound.py:245 #: aircox/models/sound.py:242
msgid "position (in seconds)" msgid "position (in seconds)"
msgstr "position (en secondes)" msgstr "position (en secondes)"
#: aircox/models/sound.py:248 #: aircox/models/sound.py:245
msgid "artist" msgid "artist"
msgstr "artiste" msgstr "artiste"
#: aircox/models/sound.py:249 aircox/templates/admin/aircox/statistics.html:25 #: aircox/models/sound.py:246
msgid "album"
msgstr "album"
#: aircox/models/sound.py:247
msgid "tags" msgid "tags"
msgstr "tags" msgstr "tags"
#: aircox/models/sound.py:248
msgid "year"
msgstr "année"
#: aircox/models/sound.py:251 #: aircox/models/sound.py:251
msgid "information" msgid "information"
msgstr "information" msgstr "information"
@ -677,6 +685,18 @@ msgstr ""
"liste des paramètres disponibles séparés par des virgules; placé dans le " "liste des paramètres disponibles séparés par des virgules; placé dans le "
"fichier de configuration en tant que code brut; relatif au plugin utilisé" "fichier de configuration en tant que code brut; relatif au plugin utilisé"
#: aircox/models/user_settings.py:11
msgid "User"
msgstr "Utilisateur"
#: aircox/models/user_settings.py:14
msgid "Playlist Editor Columns"
msgstr "Colonnes de l'éditeur de playlist"
#: aircox/models/user_settings.py:16
msgid "Playlist Editor Separator"
msgstr "Séparateur de l'éditeur de playlist"
#: aircox/templates/admin/aircox/filters/filter.html:2 #: aircox/templates/admin/aircox/filters/filter.html:2
#, python-format #, python-format
msgid " By %(filter_title)s " msgid " By %(filter_title)s "
@ -684,7 +704,7 @@ msgstr "Par %(filter_title)s "
#: aircox/templates/admin/aircox/page_change_form.html:9 #: aircox/templates/admin/aircox/page_change_form.html:9
#: aircox/templates/admin/aircox/page_change_list.html:7 #: aircox/templates/admin/aircox/page_change_list.html:7
#: aircox/templates/admin/base.html:163 #: aircox/templates/admin/base.html:166
#: aircox/templates/admin/change_list.html:30 #: aircox/templates/admin/change_list.html:30
#: aircox/templates/aircox/base.html:54 #: aircox/templates/aircox/base.html:54
msgid "Home" msgid "Home"
@ -715,36 +735,46 @@ msgstr "Sauvegarder et continuer"
msgid "Publish" msgid "Publish"
msgstr "Publier" msgstr "Publier"
#: aircox/templates/admin/aircox/statistics.html:24 #: aircox/templates/admin/aircox/playlist_inline.html:33
msgid "track" #: aircox/templates/admin/aircox/playlist_inline.html:34
msgstr "piste" msgid "Track Position"
msgstr "Position dans la playlist"
#: aircox/templates/admin/aircox/statistics.html:22
msgid "Time"
msgstr "Heure"
#: aircox/templates/admin/aircox/statistics.html:25
#: aircox/templatetags/aircox_admin.py:52
msgid "Tags"
msgstr "Étiquettes"
#: aircox/templates/admin/aircox/statistics.html:67 #: aircox/templates/admin/aircox/statistics.html:67
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: aircox/templates/admin/base.html:65 aircox/templates/admin/index.html:11 #: aircox/templates/admin/base.html:68 aircox/templates/admin/index.html:11
#: aircox/templates/aircox/home.html:47 #: aircox/templates/aircox/home.html:47
msgid "Today" msgid "Today"
msgstr "Aujourd'hui" msgstr "Aujourd'hui"
#: aircox/templates/admin/base.html:121 #: aircox/templates/admin/base.html:124
msgid "Tools" msgid "Tools"
msgstr "Outils" msgstr "Outils"
#: aircox/templates/admin/base.html:137 #: aircox/templates/admin/base.html:140
msgid "View site" msgid "View site"
msgstr "Voir le site" msgstr "Voir le site"
#: aircox/templates/admin/base.html:142 #: aircox/templates/admin/base.html:145
msgid "Documentation" msgid "Documentation"
msgstr "Documentation" msgstr "Documentation"
#: aircox/templates/admin/base.html:146 #: aircox/templates/admin/base.html:149
msgid "Change password" msgid "Change password"
msgstr "Changer le mot de passe" msgstr "Changer le mot de passe"
#: aircox/templates/admin/base.html:149 #: aircox/templates/admin/base.html:152
msgid "Log out" msgid "Log out"
msgstr "Se déconnecter" msgstr "Se déconnecter"
@ -958,67 +988,108 @@ msgstr "Épisode en ce moment sur les ondes"
msgid "Currently playing" msgid "Currently playing"
msgstr "En ce moment" msgstr "En ce moment"
#: aircox/urls.py:40 #: aircox/templatetags/aircox_admin.py:51
msgid "Artist"
msgstr "Artiste"
#: aircox/templatetags/aircox_admin.py:51
msgid "Album"
msgstr "Album"
#: aircox/templatetags/aircox_admin.py:51
msgid "Title"
msgstr "Titre"
#: aircox/templatetags/aircox_admin.py:52
msgid "Year"
msgstr "Année"
#: aircox/templatetags/aircox_admin.py:53
msgid "Save Settings"
msgstr "Enregistrer la configuration"
#: aircox/templatetags/aircox_admin.py:54
msgid "Discard changes"
msgstr "Annuler les changements"
#: aircox/templatetags/aircox_admin.py:55
msgid "Columns"
msgstr "Colonnes"
#: aircox/templatetags/aircox_admin.py:56
msgid "Add a track"
msgstr "Ajouter un morceau"
#: aircox/templatetags/aircox_admin.py:57
msgid "Remove"
msgstr "Supprimer"
#: aircox/templatetags/aircox_admin.py:58
#| msgid "timestamp"
msgid "Timestamp"
msgstr "Temps"
#: aircox/urls.py:44
msgid "articles/" msgid "articles/"
msgstr "articles/" msgstr "articles/"
#: aircox/urls.py:43 #: aircox/urls.py:47
msgid "articles/<slug:slug>/" msgid "articles/<slug:slug>/"
msgstr "articles/<slug:slug>/" msgstr "articles/<slug:slug>/"
#: aircox/urls.py:47 #: aircox/urls.py:51
msgid "episodes/" msgid "episodes/"
msgstr "episodes/" msgstr "episodes/"
#: aircox/urls.py:49 #: aircox/urls.py:53
msgid "episodes/<slug:slug>/" msgid "episodes/<slug:slug>/"
msgstr "episodes/<slug:slug>/" msgstr "episodes/<slug:slug>/"
#: aircox/urls.py:51 #: aircox/urls.py:55
msgid "week/" msgid "week/"
msgstr "semaine/" msgstr "semaine/"
#: aircox/urls.py:53 #: aircox/urls.py:57
msgid "week/<date:date>/" msgid "week/<date:date>/"
msgstr "semaine/<date:date>/" msgstr "semaine/<date:date>/"
#: aircox/urls.py:56 #: aircox/urls.py:60
msgid "logs/" msgid "logs/"
msgstr "logs/" msgstr "logs/"
#: aircox/urls.py:57 #: aircox/urls.py:61
msgid "logs/<date:date>/" msgid "logs/<date:date>/"
msgstr "logs/<date:date>/" msgstr "logs/<date:date>/"
#: aircox/urls.py:60 #: aircox/urls.py:64
msgid "publications/" msgid "publications/"
msgstr "publications/" msgstr "publications/"
#: aircox/urls.py:63 #: aircox/urls.py:67
msgid "pages/" msgid "pages/"
msgstr "pages/" msgstr "pages/"
#: aircox/urls.py:69 #: aircox/urls.py:73
msgid "pages/<slug:slug>/" msgid "pages/<slug:slug>/"
msgstr "pages/<slug:slug>/" msgstr "pages/<slug:slug>/"
#: aircox/urls.py:76 #: aircox/urls.py:80
msgid "programs/" msgid "programs/"
msgstr "emissions/" msgstr "emissions/"
#: aircox/urls.py:78 #: aircox/urls.py:82
msgid "programs/<slug:slug>/" msgid "programs/<slug:slug>/"
msgstr "emissions/<slug:slug>/" msgstr "emissions/<slug:slug>/"
#: aircox/urls.py:80 #: aircox/urls.py:84
msgid "programs/<slug:parent_slug>/episodes/" msgid "programs/<slug:parent_slug>/episodes/"
msgstr "emissions/<slug:parent_slug>/episodes/" msgstr "emissions/<slug:parent_slug>/episodes/"
#: aircox/urls.py:82 #: aircox/urls.py:86
msgid "programs/<slug:parent_slug>/articles/" msgid "programs/<slug:parent_slug>/articles/"
msgstr "emissions/<slug:parent_slug>/articles/" msgstr "emissions/<slug:parent_slug>/articles/"
#: aircox/urls.py:84 #: aircox/urls.py:88
msgid "programs/<slug:parent_slug>/publications/" msgid "programs/<slug:parent_slug>/publications/"
msgstr "emissions/<slug:parent_slug>/publications/" msgstr "emissions/<slug:parent_slug>/publications/"
@ -1026,6 +1097,9 @@ msgstr "emissions/<slug:parent_slug>/publications/"
msgid "comments are not allowed" msgid "comments are not allowed"
msgstr "les commentaires ne sont pas autorisés" msgstr "les commentaires ne sont pas autorisés"
#~ msgid "track"
#~ msgstr "morceau"
#~ msgid "if it can be podcasted from the server" #~ msgid "if it can be podcasted from the server"
#~ msgstr "s'il peut être podcasté depuis le serveur" #~ msgstr "s'il peut être podcasté depuis le serveur"

File diff suppressed because one or more lines are too long

View File

@ -10,9 +10,6 @@
<a-playlist-editor <a-playlist-editor
:labels="{% track_inline_labels %}" :labels="{% track_inline_labels %}"
:init-data="{% track_inline_data formset=formset %}" :init-data="{% track_inline_data formset=formset %}"
{% if not track_timestamp %}
:hide-columns="['timestamp']"
{% endif %}
settings-url="{% url "api:user-settings" %}" settings-url="{% url "api:user-settings" %}"
data-prefix="{{ formset.prefix }}-"> data-prefix="{{ formset.prefix }}-">
<template #title> <template #title>
@ -70,6 +67,7 @@
{% endif %} {% endif %}
:name="'{{ formset.prefix }}-' + cell.row + '-{{ field.name }}'" :name="'{{ formset.prefix }}-' + cell.row + '-{{ field.name }}'"
v-model="item.data[attr]" v-model="item.data[attr]"
title="{{ field.help }}"
@change="emit('change', col)"/> @change="emit('change', col)"/>
{% if field.name not in 'artist,title,album' %} {% if field.name not in 'artist,title,album' %}
</div> </div>

View File

@ -18,10 +18,10 @@
<table class="table is-hoverable is-fullwidth"> <table class="table is-hoverable is-fullwidth">
<thead> <thead>
<tr> <tr>
<th>{% translate "time" %}</th> <th>{% translate "Time" %}</th>
<th>{% translate "episode" %}</th> <th>{% translate "Episode" %}</th>
<th>{% translate "track" %}</th> <th>{% translate "Track" %}</th>
<th>{% translate "tags" %}</th> <th>{% translate "Tags" %}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View File

@ -2,7 +2,7 @@ import json
from django import template from django import template
from django.contrib import admin from django.contrib import admin
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _, gettext as __ from django.utils.translation import gettext_lazy as _
from aircox.serializers.admin import UserSettingsSerializer from aircox.serializers.admin import UserSettingsSerializer
@ -47,17 +47,19 @@ def do_track_inline_data(context, formset, safe_string=False):
return safe_string and mark_safe(source) or source return safe_string and mark_safe(source) or source
track_inline_labels_ = {
'artist': _('Artist'), 'album': _('Album'), 'title': _('Title'),
'tags': _('Tags'), 'year': _('Year'),
'save_settings': _('Save Settings'),
'discard_changes': _('Discard changes'),
'columns': _('Columns'),
'add_track': _('Add a track'),
'remove_track': _('Remove'),
'timestamp': _('Timestamp'),
}
@register.simple_tag(name='track_inline_labels') @register.simple_tag(name='track_inline_labels')
def do_track_inline_labels(): def do_track_inline_labels():
""" Return labels for columns in playlist editor as dict """ """ Return labels for columns in playlist editor as dict """
return json.dumps({ return json.dumps({k: str(v) for k, v in track_inline_labels_.items()})
'artist': __('Artist'), 'album': __('Album'), 'title': __('Title'),
'tags': __('Tags'), 'year': __('Year'),
'save_settings': __('Save Settings'),
'discard_changes': __('Discard changes'),
'columns': __('Columns'),
'add_track': __('Add a track'),
'remove_track': __('Remove'),
'timestamp': __('Timestamp'),
})

View File

@ -59,6 +59,18 @@
</section> </section>
<div class="mt-2"> <div class="mt-2">
<div class="float-right">
<a class="button is-warning p-2 ml-2"
@click="loadData({items: this.initData.items},true)">
<span class="icon"><i class="fa fa-rotate" /></span>
<span>{{ labels.discard_changes }}</span>
</a>
<a class="button is-primary p-2 ml-2" t-if="page == page.List"
@click="this.set.push(new this.set.model())">
<span class="icon"><i class="fa fa-plus"/></span>
<span>{{ labels.add_track }}</span>
</a>
</div>
<div class="field is-inline-block is-vcentered mr-3"> <div class="field is-inline-block is-vcentered mr-3">
<label class="label is-inline mr-2" <label class="label is-inline mr-2"
style="vertical-align: middle"> style="vertical-align: middle">
@ -101,18 +113,6 @@
{{ labels.save_settings }} {{ labels.save_settings }}
</a-action-button> </a-action-button>
</div> </div>
<div class="float-right">
<a class="button is-warning p-2 ml-2"
@click="loadData({items: this.initData.items},true)">
<span class="icon"><i class="fa fa-rotate" /></span>
<span>{{ labels.discard_changes }}</span>
</a>
<a class="button is-primary p-2 ml-2" t-if="page == page.List"
@click="this.set.push(new this.set.model())">
<span class="icon"><i class="fa fa-plus"/></span>
<span>{{ labels.add_track }}</span>
</a>
</div>
</div> </div>
<slot name="bottom" :set="set" :columns="columns" :items="items"/> <slot name="bottom" :set="set" :columns="columns" :items="items"/>
</div> </div>
@ -181,7 +181,9 @@ export default {
value = cols.concat(left) value = cols.concat(left)
this.settings.playlist_editor_columns = value this.settings.playlist_editor_columns = value
}, },
get() { return this.settings.playlist_editor_columns } get() {
return this.settings.playlist_editor_columns
}
}, },
items() { items() {
@ -205,12 +207,12 @@ export default {
formatMove({from, to}) { formatMove({from, to}) {
const value = this.columns[from] const value = this.columns[from]
this.columns.splice(from, 1) this.settings.playlist_editor_columns.splice(from, 1)
this.columns.splice(to, 0, value) this.settings.playlist_editor_columns.splice(to, 0, value)
if(this.page == Page.Text) if(this.page == Page.Text)
this.updateList() this.updateList()
else else
this.updateText() this.updateInput()
}, },
columnMove({from, to}) { columnMove({from, to}) {

View File

@ -30,20 +30,34 @@ export default {
emit: ['move', 'cell'], emit: ['move', 'cell'],
props: { props: {
//! Item to display in row
item: Object, item: Object,
//! Columns to display, as items' attributes
columns: Array, columns: Array,
//! Default cell's info
cell: {type: Object, default() { return {row: 0}}}, cell: {type: Object, default() { return {row: 0}}},
//! Cell component tag
cellTag: {type: String, default: 'td'}, cellTag: {type: String, default: 'td'},
//! If true, can reorder cell by drag & drop
orderable: {type: Boolean, default: false}, orderable: {type: Boolean, default: false},
}, },
computed: { computed: {
row() { return this.cell && this.cell.row }, /**
* Row index
*/
row() { return this.cell && this.cell.row || 0 },
/**
* Item's data if model instance, otherwise item
*/
itemData() { itemData() {
return this.item instanceof Model ? this.item.data : this.item; return this.item instanceof Model ? this.item.data : this.item;
}, },
/**
* Computed cell infos
*/
cells() { cells() {
const cell = isReactive(this.cell) && toRefs(this.cell) || this.cell || {} const cell = isReactive(this.cell) && toRefs(this.cell) || this.cell || {}
const cells = [] const cells = []
@ -51,19 +65,16 @@ export default {
cells.push({...cell, col: Number(col)}) cells.push({...cell, col: Number(col)})
return cells return cells
}, },
cellEls() {
return [...this.$el.querySelectorAll(self.cellTag)].filter(x => x.dataset.col)
},
}, },
methods: { methods: {
/// Emit a 'cell' event. /**
/// Event data: `{name, data, item, attr}` * Emit a 'cell' event.
/// * Event data: `{name, cell, data, item}`
/// @param {Number} col: cell column's index * @param {Number} col: cell column's index
/// @param {String} name: cell's event name * @param {String} name: cell's event name
/// @param {} data: cell's event data * @param {} data: cell's event data
*/
cellEmit(name, cell, data) { cellEmit(name, cell, data) {
this.$emit('cell', { this.$emit('cell', {
name, cell, data, name, cell, data,
@ -83,6 +94,9 @@ export default {
ev.dataTransfer.dropEffect = 'move' ev.dataTransfer.dropEffect = 'move'
}, },
/**
* Handle drop event, emit `'move': { from, to }`.
*/
onDrop(ev) { onDrop(ev) {
const data = ev.dataTransfer.getData("text/cell") const data = ev.dataTransfer.getData("text/cell")
if(!data || !data.startsWith('cell:')) if(!data || !data.startsWith('cell:'))
@ -95,14 +109,28 @@ export default {
}) })
}, },
/**
* Return DOM node for cells at provided position `col`
*/
getCellEl(col) {
const els = this.$el.querySelectorAll(this.cellTag)
for(var el of els)
if(col == Number(el.dataset.col))
return el;
return null
},
/**
* Focus cell's form input. If from is provided, related focus
*/
focus(col, from) { focus(col, from) {
if(from) if(from)
col += from.col col += from.col
const target = this.cellEls[col] const target = this.getCellEl(col)
if(!target) if(!target)
return return
const control = target.querySelector('input') || const control = target.querySelector('input:not([type="hidden"])') ||
target.querySelector('button') || target.querySelector('button') ||
target.querySelector('select') || target.querySelector('select') ||
target.querySelector('a'); target.querySelector('a');

View File

@ -16,6 +16,7 @@
<template v-for="(item,row) in items" :key="row"> <template v-for="(item,row) in items" :key="row">
<!-- data-index comes from AList component drag & drop --> <!-- data-index comes from AList component drag & drop -->
<a-row :item="item" :cell="{row}" :columns="columns" :data-index="row" <a-row :item="item" :cell="{row}" :columns="columns" :data-index="row"
:data-row="row"
:draggable="orderable" :draggable="orderable"
@dragstart="onDragStart" @dragover="onDragOver" @drop="onDrop" @dragstart="onDragStart" @dragover="onDragOver" @drop="onDrop"
@cell="onCellEvent(row, $event)"> @cell="onCellEvent(row, $event)">
@ -24,7 +25,7 @@
<slot :name="name" v-bind="data"/> <slot :name="name" v-bind="data"/>
</template> </template>
<template v-else> <template v-else>
<div @keydown.ctrl="onControlKey($event, data.cell)"> <div>
<slot :name="name" v-bind="data"/> <slot :name="name" v-bind="data"/>
</div> </div>
</template> </template>
@ -65,11 +66,6 @@ const Component = {
cells.push({row}) cells.push({row})
}, },
rows() {
return [...this.$el.querySelectorAll('tr')].filter(x => x.__row)
.map(x => x.__row)
},
rowSlots() { rowSlots() {
return Object.keys(this.$slots).filter(x => x.startsWith('row-')) return Object.keys(this.$slots).filter(x => x.startsWith('row-'))
.map(x => [x, x.slice(4)]) .map(x => [x, x.slice(4)])
@ -77,27 +73,6 @@ const Component = {
}, },
methods: { methods: {
onControlKey(event, cell) {
switch(event.key) {
case "ArrowUp": this.focus(-1, 0, cell)
event.stopPropagation()
event.preventDefault()
break;
case "ArrowDown": this.focus(1, 0, cell)
event.stopPropagation()
event.preventDefault()
break;
case "ArrowLeft": this.focus(0, -1, cell)
event.stopPropagation()
event.preventDefault()
break;
case "ArrowRight": this.focus(0, 1, cell)
event.stopPropagation()
event.preventDefault()
break;
}
},
/** /**
* React on 'cell' event, re-emitting it with additional values: * React on 'cell' event, re-emitting it with additional values:
* - `set`: data set * - `set`: data set
@ -108,27 +83,30 @@ const Component = {
*/ */
onCellEvent(row, event) { onCellEvent(row, event) {
if(event.name == 'focus') if(event.name == 'focus')
this.cellFocus(event.data, event.cell) this.focus(event.data, event.cell)
this.$emit('cell', { this.$emit('cell', {
...event, row, ...event, row,
set: this.set set: this.set
}) })
}, },
getCellNode(row, col) { /**
const el = this.$refs[row] * Return row component at provided index
return el && el.cellEls(col) */
getRow(row) {
const els = this.$el.querySelectorAll('tr')
for(var el of els)
if(el.__row && row == Number(el.dataset.row))
return el.__row
}, },
/** /**
* Focus on a cell * Focus on a cell
*/ */
focus(row, col, from=null) { focus(row, col, from=null) {
if(from) if(from)
row += from.row row += from.row
row = this.getRow(row)
row = this.rows[row]
row && row.focus(col, from) row && row.focus(col, from)
}, },
}, },