- Timestamp:
- 08/16/2026 01:53:01 PM (3 weeks ago)
- Branches:
- main
- Children:
- aebde2b
- Parents:
- d8f7d9c
- Location:
- src
- Files:
-
- 3 edited
-
assets/js/mod/playlist-editor.js (modified) (20 diffs)
-
services/i18n.js (modified) (3 diffs)
-
views/partials/playlist-editor.ejs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/assets/js/mod/playlist-editor.js
rd8f7d9c rd68ee3a 6 6 7 7 import { pageData } from './lib.js'; 8 9 /** 10 * De teksten van deze modal, uit het gegevensblok van partials/playlist-editor.ejs. 11 * 12 * EIGEN BLOK en niet pageData(): die pakt met querySelector er EEN, en deze 13 * modal hangt onder pagina's die er zelf al een hebben. Een tweede blok zou 14 * daar genegeerd worden. 15 * 16 * De terugval is bewust de sleutelnaam en niet de Nederlandse tekst: ontbreekt 17 * er iets, dan zie je DAT er iets ontbreekt in plaats van een pagina die er 18 * half vertaald uitziet en waarvan niemand merkt welke helft. 19 */ 20 let _T = null; 21 function T(sleutel) { 22 if (_T === null) { 23 try { 24 const el = document.querySelector('script[type="application/json"][data-playlist-editor-i18n]'); 25 _T = el ? (JSON.parse(el.textContent) || {}) : {}; 26 } catch (e) { _T = {}; } 27 } 28 return _T[sleutel] != null ? _T[sleutel] : sleutel; 29 } 8 30 9 31 (function() { … … 54 76 if (Array.isArray(j.tracks)) tracks = j.tracks; 55 77 } catch (e) { 56 alert( 'Tracks ophalen mislukt');78 alert(T('e_tracks')); 57 79 return; 58 80 } 59 81 if (!tracks.length) { 60 alert( 'Geen audio-tracks beschikbaar. Upload eerst tracks via Admin → Audio.');82 alert(T('e_geen_tracks')); 61 83 return; 62 84 } … … 75 97 backdrop.className = 'pl-modal-backdrop'; 76 98 backdrop.innerHTML = ` 77 <div class="pl-modal" role="dialog" aria-label=" Playlist editor">99 <div class="pl-modal" role="dialog" aria-label="${T('dialoog')}"> 78 100 <div class="pl-modal-header"> 79 <h3>${isEdit ? '✎ Playlist bewerken' : '+ Nieuwe playlist'}</h3>80 <button type="button" class="pl-modal-close" aria-label=" Sluiten">×</button>101 <h3>${isEdit ? '✎ ' + T('t_edit') : '+ ' + T('t_new')}</h3> 102 <button type="button" class="pl-modal-close" aria-label="${T('sluiten')}">×</button> 81 103 </div> 82 104 <div class="pl-modal-body"> … … 85 107 <div class="pl-meta-grid"> 86 108 <label class="pl-field pl-field-full"> 87 <span> Titel *</span>109 <span>${T('titel')}</span> 88 110 <input type="text" id="pli-title" maxlength="200" autofocus value="${esc(initial.title)}"> 89 111 </label> 90 112 <label class="pl-field"> 91 <span> Artiest</span>113 <span>${T('artiest')}</span> 92 114 <input type="text" id="pli-artist" maxlength="200" value="${esc(initial.artist)}"> 93 115 </label> 94 116 <label class="pl-field"> 95 <span> Jaar</span>117 <span>${T('jaar')}</span> 96 118 <input type="number" id="pli-year" min="1900" max="2099" value="${initial.year || ''}"> 97 119 </label> 98 120 <label class="pl-field"> 99 <span> Type</span>121 <span>${T('type')}</span> 100 122 <select id="pli-kind"> 101 <option value="album" ${initial.kind === 'album' ? 'selected' : ''}>💿 Album (genummerd)</option>102 <option value="playlist" ${initial.kind === 'playlist' ? 'selected' : ''}>📃 Playlist (track-covers)</option>123 <option value="album" ${initial.kind === 'album' ? 'selected' : ''}>💿 ${T('k_album')}</option> 124 <option value="playlist" ${initial.kind === 'playlist' ? 'selected' : ''}>📃 ${T('k_playlist')}</option> 103 125 </select> 104 126 </label> 105 127 <label class="pl-field pl-uitgave"> 106 <span> Uitgavedatum</span>128 <span>${T('uitgave')}</span> 107 129 <input type="date" id="pli-release-date" value="${esc(initial.release_date || '')}"> 108 130 </label> 109 131 <label class="pl-field pl-uitgave"> 110 <span> MusicBrainz release-id</span>132 <span>${T('mb_release')}</span> 111 133 <input type="text" id="pli-mb-release" maxlength="36" spellcheck="false" 112 134 placeholder="00000000-0000-0000-0000-000000000000" … … 114 136 </label> 115 137 <div class="pl-field pl-field-full"> 116 <span> Cover</span>138 <span>${T('cover')}</span> 117 139 <div class="pl-cover-row"> 118 140 <span class="pl-cover-thumb" id="pli-cover-thumb"> … … 121 143 : `<span class="pl-cover-empty">🎨</span>`} 122 144 </span> 123 <input type="text" id="pli-cover" placeholder=" https://… of upload" value="${esc(initial.cover)}" style="flex:1">145 <input type="text" id="pli-cover" placeholder="${T('cover_url')}" value="${esc(initial.cover)}" style="flex:1"> 124 146 </div> 125 147 <div class="pl-cover-upload-row"> 126 148 <input type="file" id="pli-cover-file" accept="image/jpeg,image/png,image/webp,image/gif" hidden> 127 <button type="button" class="pl-btn-small" id="pli-cover-pick">📷 Foto kiezen…</button>149 <button type="button" class="pl-btn-small" id="pli-cover-pick">📷 ${T('cover_kies')}</button> 128 150 <span class="pl-cover-status" id="pli-cover-status"></span> 129 151 </div> … … 131 153 </div> 132 154 <div class="pl-section-title"> 133 Tracks in playlist<span class="pl-track-count" id="pli-count">0</span>134 <small> (sleep ⠿ om te ordenen)</small>155 ${T('tracks_in')} <span class="pl-track-count" id="pli-count">0</span> 156 <small>${T('sleep_hint')}</small> 135 157 </div> 136 158 <div id="pli-selected" class="pl-selected-list"></div> 137 159 </div> 138 160 <div class="pl-editor-right"> 139 <div class="pl-section-title"> Beschikbare tracks</div>140 <input type="search" id="pli-search" placeholder=" Zoek..." class="pl-search-input">161 <div class="pl-section-title">${T('beschikbaar')}</div> 162 <input type="search" id="pli-search" placeholder="${T('zoek')}" class="pl-search-input"> 141 163 <div id="pli-available" class="pl-available-list"></div> 142 164 </div> … … 144 166 </div> 145 167 <div class="pl-modal-footer"> 146 <button type="button" class="btn" id="pli-cancel"> Annuleren</button>168 <button type="button" class="btn" id="pli-cancel">${T('annuleren')}</button> 147 169 <button type="button" class="btn btn-primary" id="pli-save" disabled> 148 ${isEdit ? 'Opslaan' : 'Aanmaken'}170 ${isEdit ? T('opslaan') : T('aanmaken')} 149 171 </button> 150 172 </div> … … 199 221 // requireAuth) dat een /media/-URL teruggeeft — dat heeft GEEN playlist-id 200 222 // nodig, dus uploaden kan ook al vóór het aanmaken. De URL belandt in het 201 // cover-veld en wordt bij 'Aanmaken'/'Opslaan'met de playlist meegestuurd.223 // cover-veld en wordt bij het opslaan met de playlist meegestuurd. 202 224 const coverFileInput = $('#pli-cover-file'); 203 225 const coverPickBtn = $('#pli-cover-pick'); … … 210 232 if (!file) return; 211 233 if (!/^image\//.test(file.type)) { 212 coverStatus.textContent = 'Alleen afbeeldingen';234 coverStatus.textContent = T('e_alleen_afb'); 213 235 coverStatus.className = 'pl-cover-status is-error'; 214 236 return; 215 237 } 216 coverStatus.textContent = 'Uploaden…';238 coverStatus.textContent = T('bezig'); 217 239 coverStatus.className = 'pl-cover-status'; 218 240 const fd = new FormData(); … … 223 245 ); 224 246 const j = await r.json(); 225 if (!r.ok || !j.url) throw new Error(j.error || 'Upload mislukt');247 if (!r.ok || !j.url) throw new Error(j.error || T('e_upload')); 226 248 const url = j.url || ''; 227 249 coverEl.value = url; … … 232 254 coverStatus.className = 'pl-cover-status is-ok'; 233 255 } catch (err) { 234 coverStatus.textContent = 'Mislukt: '+ err.message;256 coverStatus.textContent = T('e_mislukt') + err.message; 235 257 coverStatus.className = 'pl-cover-status is-error'; 236 258 } … … 245 267 countEl.textContent = selected.length; 246 268 if (selected.length === 0) { 247 selectedEl.innerHTML = '<div class="pl-empty"> Klik tracks rechts om toe te voegen.</div>';269 selectedEl.innerHTML = '<div class="pl-empty">' + T('leeg_sel') + '</div>'; 248 270 updateSaveBtn(); 249 271 return; … … 256 278 : `<span class="pl-row-cover pl-row-cover-empty">♪</span>`; 257 279 return `<div class="pl-row" data-id="${esc(id)}" data-pos="${i}"> 258 <span class="pl-row-handle" aria-label=" Verslepen">⠿</span>280 <span class="pl-row-handle" aria-label="${T('versleep')}">⠿</span> 259 281 <span class="pl-row-num">${i + 1}</span> 260 282 ${cover} … … 263 285 ${t.artist ? `<span class="pl-row-artist">${esc(t.artist)}</span>` : ''} 264 286 </span> 265 <button type="button" class="pl-row-x" data-id="${esc(id)}" aria-label=" Verwijderen">×</button>287 <button type="button" class="pl-row-x" data-id="${esc(id)}" aria-label="${T('verwijder')}">×</button> 266 288 </div>`; 267 289 }).join(''); … … 286 308 }); 287 309 if (matches.length === 0) { 288 availEl.innerHTML = '<div class="pl-empty"> Geen resultaten.</div>';310 availEl.innerHTML = '<div class="pl-empty">' + T('geen_res') + '</div>'; 289 311 return; 290 312 } … … 297 319 ? `<span class="pl-row-cover"><img src="${esc(t.cover)}" alt=""></span>` 298 320 : `<span class="pl-row-cover pl-row-cover-empty">♪</span>`; 299 return `<div class="${cls.join(' ')}" data-id="${esc(t.id)}" ${t.playable ? '' : 'title="Track heeft geen audio-bestand"'}>321 return `<div class="${cls.join(' ')}" data-id="${esc(t.id)}" ${t.playable ? '' : `title="${T('geen_audio')}"`}> 300 322 ${cover} 301 323 <span class="pl-row-info"> … … 391 413 const orig = saveBtn.textContent; 392 414 saveBtn.disabled = true; 393 saveBtn.textContent = 'Opslaan...';415 saveBtn.textContent = T('bezig_opslaan'); 394 416 395 417 const payload = { … … 410 432 const j = await api('POST', url, payload); 411 433 if (!j.ok) { 412 alert( 'Opslaan mislukt: '+ (j.error || 'onbekend'));434 alert(T('e_opslaan') + (j.error || 'onbekend')); 413 435 saveBtn.disabled = false; 414 436 saveBtn.textContent = orig; … … 421 443 } 422 444 } catch (err) { 423 alert( 'Opslaan mislukt: '+ err.message);445 alert(T('e_opslaan') + err.message); 424 446 saveBtn.disabled = false; 425 447 saveBtn.textContent = orig; -
src/services/i18n.js
rd8f7d9c rd68ee3a 85 85 'alis.lis_count': 'luisteraar(s)', 86 86 'alis.lis_error': 'bezorging mislukt', 87 'ple.titel': 'Titel *', 88 'ple.artiest': 'Artiest', 89 'ple.jaar': 'Jaar', 90 'ple.type': 'Type', 91 'ple.k_album': 'Album (genummerd)', 92 'ple.k_playlist': 'Playlist (track-covers)', 93 'ple.uitgave': 'Uitgavedatum', 94 'ple.mb_release': 'MusicBrainz release-id', 95 'ple.cover': 'Cover', 96 'ple.cover_kies': 'Foto kiezen…', 97 'ple.cover_url': 'https://… of upload', 98 'ple.tracks_in': 'Tracks in playlist', 99 'ple.sleep_hint': '(sleep ⠿ om te ordenen)', 100 'ple.beschikbaar': 'Beschikbare tracks', 101 'ple.zoek': 'Zoek…', 102 'ple.geen_res': 'Geen resultaten.', 103 'ple.leeg_sel': 'Klik tracks rechts om toe te voegen.', 104 'ple.t_edit': 'Playlist bewerken', 105 'ple.t_new': 'Nieuwe playlist', 106 'ple.dialoog': 'Playlist-editor', 107 'ple.sluiten': 'Sluiten', 108 'ple.annuleren': 'Annuleren', 109 'ple.opslaan': 'Opslaan', 110 'ple.bezig_opslaan': 'Opslaan…', 111 'ple.aanmaken': 'Aanmaken', 112 'ple.versleep': 'Verslepen', 113 'ple.verwijder': 'Verwijderen', 114 'ple.geen_audio': 'Track heeft geen audio-bestand', 115 'ple.e_geen_tracks': 'Geen audio-tracks beschikbaar. Upload eerst tracks via Beheer → Audio.', 116 'ple.e_tracks': 'Tracks ophalen mislukt', 117 'ple.e_opslaan': 'Opslaan mislukt: ', 118 'ple.e_mislukt': 'Mislukt: ', 119 'ple.e_alleen_afb': 'Alleen afbeeldingen', 120 'ple.bezig': 'Uploaden…', 121 'ple.e_upload': 'Upload mislukt', 87 122 'admin.b_settings': '⚙️ Instellingen', "mig.title": "Migreren", "mig.plan_new": "op je nieuwe Klonkt", "mig.plan_from_old": "Je kijkt naar de instantie die VERTREKT. Stap 1, 3 en 4 doe je op je nieuwe Klonkt.", "mig.plan_title": "Zo gaat een verhuizing", "mig.plan_hint": "De volgorde is niet vrijblijvend. Stap 2 moet voor stap 3, want je oude Klonkt geeft niets af aan een adres dat hij niet als zijn opvolger kent. Werk je met een zip, dan mag je 2 juist tot het laatst bewaren: een bestand vraagt niemand om toestemming.", "mig.plan_here": "hier", "mig.plan_old": "op je oude Klonkt", "mig.plan_1": "Je vorige account koppelen", "mig.plan_1_why": "Doe je dit niet, dan weigert je oude Klonkt de verhuizing.", "mig.plan_2": "De verhuizing aankondigen", "mig.plan_2_why": "Je volgers verhuizen mee. Daarna gaat je oude account op slot: posten, volgen en reageren kan daar niet meer.", "mig.plan_3": "Je berichten en muziek ophalen", "mig.plan_3_why": "Rechtstreeks van je oude Klonkt, of via een zip als die al offline is.", "mig.plan_4": "Je volglijst terugzetten", "mig.plan_5": "Later: als je het oude domein opzegt", "mig.plan_5_why": "Verwijder daar eerst je oude berichten. Dan verdwijnt een boost van iemand anders netjes, in plaats van te blijven staan als een kapotte kaart met een dode link. Haal daarna hierboven bij stap 1 je vorige account weg: dat adres beheer je dan niet meer. Hier zit nog geen knop voor.", "mig.follows_note": "Of plak de inhoud van je CSV hierboven. Het bestand wint als je allebei invult.", "asite.moved_to_migrate": "Aliassen en verhuizen staan nu bij Migreren, samen met exporteren, importeren en ophalen.", "mig.alias_title": "Stap 1: je vorige account koppelen", "mig.alias_hint": "Vertel welk account vroeger van jou was. Je oude Klonkt kijkt hiernaar voordat hij je volgers laat verhuizen, en de ophaalknop hieronder heeft het ook nodig.", "mig.alias_label": "Je vorige accounts, één per regel", "mig.alias_note": "Zoals je ze aan iemand zou geven: @jij@mastodon.social. Maximaal vijf.", "mig.alias_btn": "Opslaan", "mig.move_title": "Stap 2: de verhuizing aankondigen", "mig.move_hint": "Dit vertelt al je volgers dat je account voortaan ergens anders woont. Zij verhuizen mee, en dit account gaat daarna op slot: posten, volgen, liken en reageren kan niet meer.", "mig.move_label": "Je nieuwe adres", "mig.move_warn": "Dit is de enige knop op deze pagina die je niet kunt terugdraaien. Je oude account gaat er daarna van op slot. Werk je met de ophaalknop, dan MOET dit eerst: anders geeft je oude Klonkt niets af.", "mig.move_btn": "Verhuizing aankondigen", "mig.move_confirm": "Dit kondigt je verhuizing aan bij al je volgers en zet dit account op slot. Zeker weten?", "mig.move_done": "Dit account is al verhuisd naar", "mig.r_links_fixed": "berichten waarvan de links nu naar hier wijzen", "mig.r_posts_updated": "berichten gerepareerd (plaatjes lokaal gemaakt)", "mig.r_tracks_updated": "nummers aangevuld", "mig.r_tracks_missing": "{n} nummer(s) zijn NIET aangekomen, want het geluidsbestand ontbrak. Ze zijn met opzet niet aangemaakt: een nummer dat in de lijst staat en niet afspeelt is erger dan een nummer dat er niet is.", "mig.c_tracks": "nummers", "mig.c_playlists": "playlists", "mig.audio_missing": "Let op: van {n} nummer(s) is het geluidsbestand niet te vinden. Die gaan niet mee.", "mig.audio_none": "Let op: deze site heeft muziek, maar er gaat geen enkel nummer mee. Waarschijnlijk staan de bestanden ergens anders dan de database denkt.", "mig.pull_title": "Ophalen bij je oude Klonkt", "mig.pull_hint": "Ben je al verhuisd, dan haalt deze Klonkt je berichten rechtstreeks bij de oude op. Je hoeft niets over te typen: dat je verhuisd bent is het bewijs.", "mig.pull_source": "Je oude account", "mig.pull_source_hint": "Overgenomen uit stap 1. Klopt het niet, pas het hier aan.", "mig.pull_btn": "Berichten ophalen", "mig.pull_done": "Opgehaald", "mig.pull_failed": "Ophalen lukte niet", "mig.r_blocks": "blokkades overgenomen", "mig.state": "{n} berichten hebben een verwijzing van hun oude adres.", "mig.state_done": "De lijst is compleet.", "mig.state_busy": "De lijst is nog niet compleet.", "mig.e_no_source": "Er is geen oud account bekend. Vul het adres hierboven in.", "mig.e_unreachable": "De oude Klonkt is niet bereikbaar.", "mig.e_not_moved_here": "Dat account is niet naar hier verhuisd. Kondig de verhuizing eerst aan op je oude Klonkt.", "mig.e_no_backreference": "Dit account zegt nergens dat dat oude account van jou was. Vul het eerst in bij stap 1 hierboven, anders kan je oude Klonkt niet zien dat jij het bent.", "mig.e_no_outbox": "De oude Klonkt heeft geen berichtenlijst.", "mig.e_partial": "Halverwege gestopt. Wat binnen is blijft staan; probeer het nog eens.", "mig.e_config": "Deze Klonkt weet zijn eigen adres niet.", "mig.e_crash": "Er ging iets onverwachts mis.", "mig.e_points_at": "Dat account wijst naar:", "mig.lead": "Neem je berichten, muziek en foto’s mee naar een andere Klonkt, of haal ze hiernaartoe.", "mig.export_title": "Meenemen", "mig.export_hint": "Dit maakt een zip met je berichten, de reacties erop, en de media die erbij hoort.", "mig.c_posts": "berichten", "mig.c_replies": "reacties", "mig.c_media": "mediabestanden", "mig.c_following": "volgingen", "mig.c_size": "groot", "mig.missing": "Let op: van {n} mediaverwijzing(en) staat het bestand niet meer op schijf. Die gaan dus niet mee.", "mig.too_big": "Dit archief is te groot voor de webinterface. Gebruik scripts/export-archive.mjs op de server.", "mig.export_btn": "Archief downloaden (.zip)", "mig.export_none": "Er valt nog niets te exporteren.", "mig.import_title": "Hierheen halen", "mig.import_hint": "Kies je bestand. Je krijgt eerst te zien wat er zou gebeuren; er verandert nog niets.", "mig.file_label": "Je archiefbestand (.zip)", "mig.overwrite_label": "Berichten die er al staan vervangen", "mig.overwrite_hint": "Normaal blijft alles wat hier al staat met rust. Zet je dit aan, dan wordt een bericht met dezelfde naam vervangen, ook als het iets anders was. Dat komt niet terug.", "mig.check_btn": "Controleren", "mig.check_hint": "Dit verandert nog niets. Je krijgt eerst te zien wat er zou gebeuren.", "mig.r_dry": "Wat er zou gebeuren", "mig.r_done": "Ge\u00efmporteerd", "mig.r_would": "zouden erbij komen", "mig.r_imported": "erbij gekomen", "mig.r_skipped": "overgeslagen (staan er al)", "mig.r_overwritten": "overschreven", "mig.r_media": "mediabestanden", "mig.r_media_missing": "media ontbrak in het archief", "mig.r_new_ids": "Dit archief komt van een ander webadres. Je berichten staan hier dus op een nieuw adres. Andere servers weten dat nog niet, dus reacties en boosts die daar naar het oude adres wijzen blijven daar staan.", "mig.r_confirm_hint": "Ziet het er goed uit? Kies hetzelfde bestand nog een keer om het echt te doen.", "mig.r_confirm_btn": "Nu echt importeren", "mig.follows_title": "Wie je volgt", "mig.follows_hint": "Je volglijst zit ook in het archief, en je kunt hem los downloaden en terugzetten bij Connect.", "mig.follows_btn": "Naar Connect", "admin.b_migrate": "\ud83d\udce6 Migreren", 'admin.b_newpost': '✍️ Nieuwe post', 'admin.b_look': '🎨 Uiterlijk', 88 123 'admin.t_admin': 'Beheer', 'admin.t_settings': 'Instellingen', 'admin.t_audio': 'Audiotracks', 'admin.t_epk': 'Perskit bewerken', 'admin.t_newsletter': 'Nieuwsbrief', 'admin.t_playlists': 'Afspeellijsten', 'admin.t_seo': 'SEO', 'admin.t_shows': 'Agenda', 'admin.t_sites': 'Sites', 'admin.t_newsite': 'Nieuwe site', 'admin.t_editsite': 'Bewerken: {title}', 'admin.t_stats': 'Statistieken', 'admin.t_updates': 'Updates', 'admin.t_users': 'Gebruikers', 'admin.t_hub': 'Mijn Klonkt Hub', 'admin.t_manual': 'Handleiding', 'aset.premium_gate': '{feature} is premium — koppel Patreon in Beheer → Instellingen.', … … 1062 1097 'alis.lis_count': 'listener(s)', 1063 1098 'alis.lis_error': 'delivery failed', 1099 'ple.titel': 'Title *', 1100 'ple.artiest': 'Artist', 1101 'ple.jaar': 'Year', 1102 'ple.type': 'Type', 1103 'ple.k_album': 'Album (numbered)', 1104 'ple.k_playlist': 'Playlist (track covers)', 1105 'ple.uitgave': 'Release date', 1106 'ple.mb_release': 'MusicBrainz release ID', 1107 'ple.cover': 'Cover', 1108 'ple.cover_kies': 'Choose image…', 1109 'ple.cover_url': 'https://… or upload', 1110 'ple.tracks_in': 'Tracks in playlist', 1111 'ple.sleep_hint': '(drag ⠿ to reorder)', 1112 'ple.beschikbaar': 'Available tracks', 1113 'ple.zoek': 'Search…', 1114 'ple.geen_res': 'No results.', 1115 'ple.leeg_sel': 'Click tracks on the right to add them.', 1116 'ple.t_edit': 'Edit playlist', 1117 'ple.t_new': 'New playlist', 1118 'ple.dialoog': 'Playlist editor', 1119 'ple.sluiten': 'Close', 1120 'ple.annuleren': 'Cancel', 1121 'ple.opslaan': 'Save', 1122 'ple.bezig_opslaan': 'Saving…', 1123 'ple.aanmaken': 'Create', 1124 'ple.versleep': 'Drag', 1125 'ple.verwijder': 'Remove', 1126 'ple.geen_audio': 'Track has no audio file', 1127 'ple.e_geen_tracks': 'No audio tracks available. Upload some first via Admin → Audio.', 1128 'ple.e_tracks': 'Could not load tracks', 1129 'ple.e_opslaan': 'Saving failed: ', 1130 'ple.e_mislukt': 'Failed: ', 1131 'ple.e_alleen_afb': 'Images only', 1132 'ple.bezig': 'Uploading…', 1133 'ple.e_upload': 'Upload failed', 1064 1134 'admin.b_settings': '⚙️ Settings', "mig.title": "Migrate", "mig.plan_new": "on your new Klonkt", "mig.plan_from_old": "You are looking at the instance that is LEAVING. Steps 1, 3 and 4 happen on your new Klonkt.", "mig.plan_title": "How a move works", "mig.plan_hint": "The order matters. Step 2 must come before step 3, because your old Klonkt gives nothing to an address it does not know as its successor. Working from a zip? Then step 2 can wait until last: a file asks nobody for permission.", "mig.plan_here": "here", "mig.plan_old": "on your old Klonkt", "mig.plan_1": "Link your previous account", "mig.plan_1_why": "Skip this and your old Klonkt refuses the move.", "mig.plan_2": "Announce the move", "mig.plan_2_why": "Your followers come along. Your old account locks afterwards: no more posting, following or replying there.", "mig.plan_3": "Fetch your posts and music", "mig.plan_3_why": "Straight from your old Klonkt, or from a zip if it is already offline.", "mig.plan_4": "Restore your following list", "mig.plan_5": "Later: when you give up the old domain", "mig.plan_5_why": "Delete your old posts there first. Then someone else’s boost disappears cleanly instead of sitting there as a broken card with a dead link. After that, remove your previous account at step 1 above: you no longer control that address. There is no button for this yet.", "mig.follows_note": "Or paste the contents of your CSV above. The file wins if you fill in both.", "asite.moved_to_migrate": "Aliases and moving now live under Migrate, together with export, import and fetch.", "mig.alias_title": "Step 1: link your previous account", "mig.alias_hint": "Tell us which account used to be yours. Your old Klonkt checks this before it moves your followers, and the fetch button below needs it too.", "mig.alias_label": "Your previous accounts, one per line", "mig.alias_note": "The way you would give them to someone: @you@mastodon.social. Five at most.", "mig.alias_btn": "Save", "mig.move_title": "Step 2: announce the move", "mig.move_hint": "This tells all your followers that your account now lives elsewhere. They move with you, and this account locks afterwards: no more posting, following, liking or replying.", "mig.move_label": "Your new address", "mig.move_warn": "This is the only button on this page you cannot undo. Your old account locks afterwards. Using the fetch button? Then this MUST come first: otherwise your old Klonkt hands over nothing.", "mig.move_btn": "Announce the move", "mig.move_confirm": "This announces your move to all your followers and locks this account. Are you sure?", "mig.move_done": "This account already moved to", "mig.r_links_fixed": "posts whose links now point here", "mig.r_posts_updated": "posts repaired (images made local)", "mig.r_tracks_updated": "tracks completed", "mig.r_tracks_missing": "{n} track(s) did NOT arrive, because the audio file was absent. They were deliberately not created: a track that sits in the list and will not play is worse than one that is missing.", "mig.c_tracks": "tracks", "mig.c_playlists": "playlists", "mig.audio_missing": "Note: for {n} track(s) the audio file cannot be found. Those will not travel.", "mig.audio_none": "Note: this site has music, but not a single track is travelling. The files are probably somewhere other than the database thinks.", "mig.pull_title": "Fetch from your old Klonkt", "mig.pull_hint": "If you already moved, this Klonkt fetches your posts straight from the old one. Nothing to type over: having moved is the proof.", "mig.pull_source": "Your old account", "mig.pull_source_hint": "Taken from step 1. Change it here if it is wrong.", "mig.pull_btn": "Fetch posts", "mig.pull_done": "Fetched", "mig.pull_failed": "Fetching did not work", "mig.r_blocks": "blocks carried over", "mig.state": "{n} posts have a pointer from their old address.", "mig.state_done": "The list is complete.", "mig.state_busy": "The list is not complete yet.", "mig.e_no_source": "No old account is known. Fill in the address above.", "mig.e_unreachable": "The old Klonkt cannot be reached.", "mig.e_not_moved_here": "That account has not moved here. Announce the move on your old Klonkt first.", "mig.e_no_backreference": "This account does not say anywhere that the old account was yours. Fill it in at step 1 above, otherwise your old Klonkt cannot tell it is you.", "mig.e_no_outbox": "The old Klonkt has no post list.", "mig.e_partial": "Stopped halfway. What arrived stays; try again.", "mig.e_config": "This Klonkt does not know its own address.", "mig.e_crash": "Something unexpected went wrong.", "mig.e_points_at": "That account points at:", "mig.lead": "Take your posts, music and photos to another Klonkt, or bring them here.", "mig.export_title": "Take with you", "mig.export_hint": "This builds a zip with your posts, their replies, and the media that belongs to them.", "mig.c_posts": "posts", "mig.c_replies": "replies", "mig.c_media": "media files", "mig.c_following": "follows", "mig.c_size": "in size", "mig.missing": "Note: for {n} media reference(s) the file is no longer on disk. Those will not travel.", "mig.too_big": "This archive is too large for the web interface. Use scripts/export-archive.mjs on the server.", "mig.export_btn": "Download archive (.zip)", "mig.export_none": "Nothing to export yet.", "mig.import_title": "Bring here", "mig.import_hint": "Pick your file. You will see what would happen first; nothing changes yet.", "mig.file_label": "Your archive file (.zip)", "mig.overwrite_label": "Replace posts that are already here", "mig.overwrite_hint": "Normally everything already here is left alone. Turn this on and a post with the same name gets replaced, even if it was something else. That does not come back.", "mig.check_btn": "Check", "mig.check_hint": "This changes nothing yet. You will see what would happen first.", "mig.r_dry": "What would happen", "mig.r_done": "Imported", "mig.r_would": "would be added", "mig.r_imported": "added", "mig.r_skipped": "skipped (already here)", "mig.r_overwritten": "overwritten", "mig.r_media": "media files", "mig.r_media_missing": "media missing from the archive", "mig.r_new_ids": "This archive comes from a different web address, so your posts live at a new address here. Other servers do not know that yet, so replies and boosts pointing at the old address stay where they are.", "mig.r_confirm_hint": "Looks right? Pick the same file once more to actually do it.", "mig.r_confirm_btn": "Import for real", "mig.follows_title": "Who you follow", "mig.follows_hint": "Your following list is in the archive too, and you can download and restore it separately under Connect.", "mig.follows_btn": "Go to Connect", "admin.b_migrate": "\ud83d\udce6 Migrate", 'admin.b_newpost': '✍️ New post', 'admin.b_look': '🎨 Appearance', 1065 1135 'admin.t_admin': 'Admin', 'admin.t_settings': 'Settings', 'admin.t_audio': 'Audio tracks', 'admin.t_epk': 'Edit press kit', 'admin.t_newsletter': 'Newsletter', 'admin.t_playlists': 'Playlists', 'admin.t_seo': 'SEO', 'admin.t_shows': 'Agenda', 'admin.t_sites': 'Sites', 'admin.t_newsite': 'New site', 'admin.t_editsite': 'Edit: {title}', 'admin.t_stats': 'Statistics', 'admin.t_updates': 'Updates', 'admin.t_users': 'Users', 'admin.t_hub': 'My Klonkt Hub', 'admin.t_manual': 'Manual', 'aset.premium_gate': '{feature} is a premium feature — connect Patreon in Admin → Settings.', … … 2033 2103 'alis.lis_count': 'Hörer', 2034 2104 'alis.lis_error': 'Zustellung fehlgeschlagen', 2105 'ple.titel': 'Titel *', 2106 'ple.artiest': 'Künstler', 2107 'ple.jaar': 'Jahr', 2108 'ple.type': 'Typ', 2109 'ple.k_album': 'Album (nummeriert)', 2110 'ple.k_playlist': 'Playlist (Titelbilder)', 2111 'ple.uitgave': 'Veröffentlichungsdatum', 2112 'ple.mb_release': 'MusicBrainz-Release-ID', 2113 'ple.cover': 'Cover', 2114 'ple.cover_kies': 'Bild wählen…', 2115 'ple.cover_url': 'https://… oder hochladen', 2116 'ple.tracks_in': 'Titel in der Playlist', 2117 'ple.sleep_hint': '(⠿ ziehen zum Sortieren)', 2118 'ple.beschikbaar': 'Verfügbare Titel', 2119 'ple.zoek': 'Suchen…', 2120 'ple.geen_res': 'Keine Ergebnisse.', 2121 'ple.leeg_sel': 'Klicke rechts auf Titel, um sie hinzuzufügen.', 2122 'ple.t_edit': 'Playlist bearbeiten', 2123 'ple.t_new': 'Neue Playlist', 2124 'ple.dialoog': 'Playlist-Editor', 2125 'ple.sluiten': 'Schließen', 2126 'ple.annuleren': 'Abbrechen', 2127 'ple.opslaan': 'Speichern', 2128 'ple.bezig_opslaan': 'Speichern…', 2129 'ple.aanmaken': 'Anlegen', 2130 'ple.versleep': 'Ziehen', 2131 'ple.verwijder': 'Entfernen', 2132 'ple.geen_audio': 'Titel hat keine Audiodatei', 2133 'ple.e_geen_tracks': 'Keine Audiotitel vorhanden. Lade zuerst welche über Verwaltung → Audio hoch.', 2134 'ple.e_tracks': 'Titel konnten nicht geladen werden', 2135 'ple.e_opslaan': 'Speichern fehlgeschlagen: ', 2136 'ple.e_mislukt': 'Fehlgeschlagen: ', 2137 'ple.e_alleen_afb': 'Nur Bilder', 2138 'ple.bezig': 'Wird hochgeladen…', 2139 'ple.e_upload': 'Upload fehlgeschlagen', 2035 2140 'admin.b_settings': '⚙️ Einstellungen', "mig.title": "Migrieren", "mig.plan_new": "auf deinem neuen Klonkt", "mig.plan_from_old": "Du siehst die Instanz, die WEGGEHT. Schritt 1, 3 und 4 machst du auf deinem neuen Klonkt.", "mig.plan_title": "So l\u00e4uft ein Umzug", "mig.plan_hint": "Die Reihenfolge ist nicht beliebig. Schritt 2 muss vor Schritt 3, denn dein altes Klonkt gibt nichts an eine Adresse heraus, die es nicht als Nachfolger kennt. Mit einem Zip darf Schritt 2 dagegen zuletzt: eine Datei fragt niemanden.", "mig.plan_here": "hier", "mig.plan_old": "auf deinem alten Klonkt", "mig.plan_1": "Dein früheres Konto verknüpfen", "mig.plan_1_why": "Ohne das verweigert dein altes Klonkt den Umzug.", "mig.plan_2": "Den Umzug ank\u00fcndigen", "mig.plan_2_why": "Deine Follower ziehen mit. Danach wird das alte Konto gesperrt: kein Posten, Folgen oder Antworten mehr.", "mig.plan_3": "Beitr\u00e4ge und Musik holen", "mig.plan_3_why": "Direkt vom alten Klonkt, oder aus einem Zip, wenn es schon offline ist.", "mig.plan_4": "Deine Folgeliste zur\u00fcckspielen", "mig.plan_5": "Sp\u00e4ter: wenn du die alte Domain aufgibst", "mig.plan_5_why": "Lösche dort zuerst deine alten Beiträge. Dann verschwindet ein fremder Boost sauber, statt als kaputte Karte mit totem Link stehen zu bleiben. Entferne danach oben bei Schritt 1 dein früheres Konto: diese Adresse kontrollierst du dann nicht mehr. Dafür gibt es noch keinen Knopf.", "mig.follows_note": "Oder f\u00fcge den Inhalt deiner CSV oben ein. Die Datei gewinnt, wenn du beides ausf\u00fcllst.", "asite.moved_to_migrate": "Aliasse und Umzug stehen jetzt unter Migrieren, zusammen mit Export, Import und Holen.", "mig.alias_title": "Schritt 1: dein früheres Konto verknüpfen", "mig.alias_hint": "Sag, welches Konto früher deins war. Dein altes Klonkt prüft das, bevor es deine Follower umzieht, und der Hol-Knopf unten braucht es auch.", "mig.alias_label": "Deine früheren Konten, eines pro Zeile", "mig.alias_note": "So, wie du sie jemandem geben würdest: @du@mastodon.social. Höchstens fünf.", "mig.alias_btn": "Speichern", "mig.move_title": "Schritt 2: den Umzug ank\u00fcndigen", "mig.move_hint": "Das sagt allen Followern, dass dein Konto jetzt woanders wohnt. Sie ziehen mit um, und dieses Konto wird danach gesperrt: kein Posten, Folgen, Liken oder Antworten mehr.", "mig.move_label": "Deine neue Adresse", "mig.move_warn": "Das ist der einzige Knopf auf dieser Seite, den du nicht r\u00fcckg\u00e4ngig machen kannst. Dein altes Konto wird danach gesperrt. Nutzt du den Hol-Knopf, MUSS das zuerst: sonst gibt dein altes Klonkt nichts heraus.", "mig.move_btn": "Umzug ank\u00fcndigen", "mig.move_confirm": "Das k\u00fcndigt deinen Umzug allen Followern an und sperrt dieses Konto. Sicher?", "mig.move_done": "Dieses Konto ist bereits umgezogen nach", "mig.r_links_fixed": "Beitr\u00e4ge, deren Links jetzt hierher zeigen", "mig.r_posts_updated": "Beitr\u00e4ge repariert (Bilder lokal geholt)", "mig.r_tracks_updated": "Titel erg\u00e4nzt", "mig.r_tracks_missing": "{n} Titel sind NICHT angekommen, weil die Audiodatei fehlte. Sie wurden bewusst nicht angelegt: ein Titel, der in der Liste steht und nicht spielt, ist schlimmer als ein fehlender.", "mig.c_tracks": "Titel", "mig.c_playlists": "Playlists", "mig.audio_missing": "Achtung: Bei {n} Titel(n) ist die Audiodatei nicht auffindbar. Die kommen nicht mit.", "mig.audio_none": "Achtung: Diese Seite hat Musik, aber es kommt kein einziger Titel mit. Die Dateien liegen vermutlich woanders als die Datenbank denkt.", "mig.pull_title": "Von deinem alten Klonkt holen", "mig.pull_hint": "Bist du schon umgezogen, holt dieses Klonkt deine Beiträge direkt beim alten. Nichts abzutippen: dass du umgezogen bist, ist der Beweis.", "mig.pull_source": "Dein altes Konto", "mig.pull_source_hint": "Aus Schritt 1 übernommen. Stimmt es nicht, ändere es hier.", "mig.pull_btn": "Beitr\u00e4ge holen", "mig.pull_done": "Geholt", "mig.pull_failed": "Holen hat nicht geklappt", "mig.r_blocks": "Blockierungen \u00fcbernommen", "mig.state": "{n} Beitr\u00e4ge haben einen Verweis von ihrer alten Adresse.", "mig.state_done": "Die Liste ist vollst\u00e4ndig.", "mig.state_busy": "Die Liste ist noch nicht vollst\u00e4ndig.", "mig.e_no_source": "Es ist kein altes Konto bekannt. Trage die Adresse oben ein.", "mig.e_unreachable": "Das alte Klonkt ist nicht erreichbar.", "mig.e_not_moved_here": "Dieses Konto ist nicht hierher umgezogen. Kündige den Umzug zuerst auf deinem alten Klonkt an.", "mig.e_no_backreference": "Dieses Konto sagt nirgends, dass das alte Konto deins war. Trage es oben bei Schritt 1 ein, sonst kann dein altes Klonkt nicht erkennen, dass du es bist.", "mig.e_no_outbox": "Das alte Klonkt hat keine Beitragsliste.", "mig.e_partial": "Auf halbem Weg gestoppt. Was da ist, bleibt; versuche es noch einmal.", "mig.e_config": "Dieses Klonkt kennt seine eigene Adresse nicht.", "mig.e_crash": "Etwas Unerwartetes ist schiefgegangen.", "mig.e_points_at": "Dieses Konto verweist auf:", "mig.lead": "Nimm deine Beiträge, Musik und Fotos zu einem anderen Klonkt mit, oder hole sie hierher.", "mig.export_title": "Mitnehmen", "mig.export_hint": "Das erstellt ein Zip mit deinen Beitr\u00e4gen, den Antworten darauf und den zugeh\u00f6rigen Medien.", "mig.c_posts": "Beitr\u00e4ge", "mig.c_replies": "Antworten", "mig.c_media": "Mediendateien", "mig.c_following": "Folge ich", "mig.c_size": "gro\u00df", "mig.missing": "Achtung: Bei {n} Medienverweis(en) liegt die Datei nicht mehr auf der Platte. Die kommen nicht mit.", "mig.too_big": "Dieses Archiv ist zu gro\u00df f\u00fcr die Weboberfl\u00e4che. Nutze scripts/export-archive.mjs auf dem Server.", "mig.export_btn": "Archiv herunterladen (.zip)", "mig.export_none": "Noch nichts zu exportieren.", "mig.import_title": "Hierher holen", "mig.import_hint": "Wähle deine Datei. Du siehst zuerst, was passieren würde; es ändert sich noch nichts.", "mig.file_label": "Deine Archivdatei (.zip)", "mig.overwrite_label": "Beiträge ersetzen, die schon hier sind", "mig.overwrite_hint": "Normalerweise bleibt alles, was hier steht, unangetastet. Schaltest du das ein, wird ein Beitrag mit demselben Namen ersetzt, auch wenn es etwas anderes war. Das kommt nicht zurück.", "mig.check_btn": "Pr\u00fcfen", "mig.check_hint": "Das \u00e4ndert noch nichts. Du siehst zuerst, was passieren w\u00fcrde.", "mig.r_dry": "Was passieren w\u00fcrde", "mig.r_done": "Importiert", "mig.r_would": "k\u00e4men dazu", "mig.r_imported": "dazugekommen", "mig.r_skipped": "\u00fcbersprungen (schon vorhanden)", "mig.r_overwritten": "\u00fcberschrieben", "mig.r_media": "Mediendateien", "mig.r_media_missing": "Medien fehlten im Archiv", "mig.r_new_ids": "Dieses Archiv kommt von einer anderen Webadresse, deine Beiträge liegen hier also unter einer neuen Adresse. Andere Server wissen das noch nicht, also bleiben Antworten und Boosts auf die alte Adresse dort stehen.", "mig.r_confirm_hint": "Sieht gut aus? W\u00e4hle dieselbe Datei noch einmal, um es wirklich zu tun.", "mig.r_confirm_btn": "Jetzt wirklich importieren", "mig.follows_title": "Wem du folgst", "mig.follows_hint": "Deine Folgeliste ist auch im Archiv, und du kannst sie unter Connect separat herunterladen und zur\u00fcckspielen.", "mig.follows_btn": "Zu Connect", "admin.b_migrate": "\ud83d\udce6 Migrieren", 'admin.b_newpost': '✍️ Neuer Beitrag', 'admin.b_look': '🎨 Aussehen', 2036 2141 'admin.t_admin': 'Verwaltung', 'admin.t_settings': 'Einstellungen', 'admin.t_audio': 'Audiotracks', 'admin.t_epk': 'Pressemappe bearbeiten', 'admin.t_newsletter': 'Newsletter', 'admin.t_playlists': 'Playlists', 'admin.t_seo': 'SEO', 'admin.t_shows': 'Termine', 'admin.t_sites': 'Sites', 'admin.t_newsite': 'Neue Site', 'admin.t_editsite': 'Bearbeiten: {title}', 'admin.t_stats': 'Statistiken', 'admin.t_updates': 'Updates', 'admin.t_users': 'Benutzer', 'admin.t_hub': 'Mein Klonkt Hub', 'admin.t_manual': 'Handbuch', 'aset.premium_gate': '{feature} ist eine Premium-Funktion — verbinde Patreon in Verwaltung → Einstellungen.', -
src/views/partials/playlist-editor.ejs
rd8f7d9c rd68ee3a 284 284 </style> 285 285 286 <%# Het script staat in assets/js/mod/playlist-editor.js; de gegevens via partials/page-data.ejs (shaer-bqr). %> 286 <%# Het script staat in assets/js/mod/playlist-editor.js. 287 288 EIGEN GEGEVENSBLOK, niet dat van partials/page-data.ejs. pageData() pakt met 289 querySelector EEN blok, en deze modal wordt ingesloten op pagina's die er al 290 zelf een hebben (admin-playlists, post-edit) -- een tweede blok zou daar 291 stilzwijgend genegeerd worden en dan stond de hele modal weer in het 292 Nederlands. Eigen kenmerk, eigen lezer. 293 294 De teksten stonden hier tot 16-8 hard in het script. Dat viel niet op omdat 295 het toevallig de brontaal was: een Engelse of Duitse beheerder kreeg een 296 Nederlandse modal midden in een vertaalde pagina. %> 297 <script type="application/json" data-playlist-editor-i18n><%- JSON.stringify({ 298 titel: t('ple.titel'), artiest: t('ple.artiest'), jaar: t('ple.jaar'), type: t('ple.type'), 299 k_album: t('ple.k_album'), k_playlist: t('ple.k_playlist'), 300 uitgave: t('ple.uitgave'), mb_release: t('ple.mb_release'), 301 cover: t('ple.cover'), cover_kies: t('ple.cover_kies'), cover_url: t('ple.cover_url'), 302 tracks_in: t('ple.tracks_in'), sleep_hint: t('ple.sleep_hint'), 303 beschikbaar: t('ple.beschikbaar'), zoek: t('ple.zoek'), geen_res: t('ple.geen_res'), 304 leeg_sel: t('ple.leeg_sel'), 305 t_edit: t('ple.t_edit'), t_new: t('ple.t_new'), dialoog: t('ple.dialoog'), 306 sluiten: t('ple.sluiten'), annuleren: t('ple.annuleren'), 307 opslaan: t('ple.opslaan'), aanmaken: t('ple.aanmaken'), 308 bezig_opslaan: t('ple.bezig_opslaan'), 309 versleep: t('ple.versleep'), verwijder: t('ple.verwijder'), 310 geen_audio: t('ple.geen_audio'), e_geen_tracks: t('ple.e_geen_tracks'), 311 e_tracks: t('ple.e_tracks'), e_opslaan: t('ple.e_opslaan'), e_mislukt: t('ple.e_mislukt'), 312 e_alleen_afb: t('ple.e_alleen_afb'), bezig: t('ple.bezig'), e_upload: t('ple.e_upload'), 313 }).replace(/</g, '\\u003c') %></script>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)