Aggiunto
- Un tema mostra la scelta della lingua in una riga:
nf_selecteur_langue(), accanto anf_selecteur_theme()enf_liens_legaux(). I temi inclusi ne copiavano ciascuno il modulo. - La documentazione e le note di rilascio, in tutte e sei le lingue. Le guide della wiki — installazione, primi passi, amministrazione, marketplace, sito multilingue, bot Discord, framework, creare un tema, un modulo o un widget — esistevano solo in francese e in inglese: ora sono scritte anche in tedesco, spagnolo, italiano e portoghese, con le etichette esatte che lo schermo mostra in ogni lingua, e la wiki le serve nella lingua del visitatore. Le note di rilascio seguono: la pagina «Note di rilascio» della wiki e i post del Blog si leggono in tutte e sei le lingue. Il francese resta il riferimento; un test rifiuta una traduzione che salti una versione o la dati diversamente.
- Le miniature dei moduli e dei widget, ridisegnate. In Temi & addon e nel marketplace, l'anteprima di un'estensione era una sua foto al lavoro — illeggibile quando non aveva dati da mostrare: una cornice, un titolo, qualche riga. Ogni modulo e ogni widget riceve ora una scheda disegnata nel linguaggio visivo del progetto: la sua icona, il suo nome e ciò che fa, leggibili a qualsiasi dimensione. I temi conservano la foto della loro home page: un tema si mostra da sé.
- Le librerie incluse aggiornate, e una salvaguardia perché lo restino. L'editor di testo passa a TinyMCE 8 (la linea 7 perdeva il supporto il 14 novembre, e la 8.9.3 correggeva una falla del suo plugin «media») e le icone a Font Awesome 7 — le 363 icone usate dal sito sono state confrontate con la nuova collezione prima del passaggio, e non ne manca nessuna. I file di font doppi (.ttf) spariscono: la versione 7 serve solo il formato moderno, 715 KB in meno nel pacchetto. Soprattutto, un nuovo controllo vigila: non lancia l'allarme a ogni rilascio dei progetti a monte, ma rifiuta quando le versioni distribuite non sono state confrontate con il registro da più di tre mesi. Una dipendenza non diventa pericolosa di colpo — va alla deriva, e ora la deriva si vede.
- Le notifiche push. Un membro può ricevere le sue notifiche nel browser, anche a sito chiuso: un messaggio del forum, una reazione, un promemoria di un evento. L'amministratore lo propone (Impostazioni → Preferenze generali → Notifiche push); ogni membro lo attiva poi dispositivo per dispositivo, nelle sue preferenze di notifica, sceglie tipo per tipo ciò che riceve così, e può inviarsi una prova. Senza librerie aggiunte: il messaggio è cifrato per quel solo browser (RFC 8291) e firmato a nome del sito (VAPID, RFC 8292) — il servizio push del browser lo trasporta senza poterlo leggere. Il server scrive solo a servizi push noti (Google, Mozilla, Apple, Microsoft), mai a un indirizzo che un membro potrebbe essersi inventato.
- Nebula e il tema vetrina hanno la loro pagina dei colori, e gli otto temi un'anteprima dal vivo. Accento, sfondo, testo: le palette di Nebula e della vetrina erano scritte nei loro fogli di stile; ora si regolano come quelle degli altri sei temi, con lo stesso rifiuto di un colore illeggibile. E sotto i selettori di ogni tema, una vera pagina del sito — la home, le notizie o il forum — prende i colori man mano che li si sceglie, senza salvare nulla, con i contrasti misurati dal vivo: si vede il risultato prima di cliccare su «Salva».
- I link dei menu, le stanze pubbliche, il titolo dato a un widget e le pagine della wiki si traducono. Con loro, nessun testo scritto dal gestore del sito resta più senza lingua. Una pagina della wiki tiene una cronologia PER LINGUA: tradurre in italiano non archivia nulla della versione francese, e la cronologia italiana mostra solo le sue revisioni. Una conversazione tra membri mantiene un solo nome per tutti i partecipanti — si traducono solo le stanze pubbliche. La pagina «Note di rilascio» della wiki esiste ora anche in inglese.
- Il negozio, le donazioni, la pubblicità, i pacchetti di pagamento e il reclutamento si traducono. Il nome e la descrizione di un articolo del negozio, il titolo e la descrizione di una campagna di donazioni, il titolo di un annuncio pubblicitario, l'etichetta di un pacchetto e un'intera offerta di reclutamento — titolo, introduzione, descrizione, requisiti e le domande del suo modulo di candidatura — si scrivono ora lingua per lingua. Le domande non avevano una schermata per modificarle (si potevano solo aggiungere o eliminare): ora le apre una matita, ed è lì che si traducono. Resta comune ciò che non è testo: il prezzo, la scorta, l'indirizzo di una campagna, il codice di un circuito pubblicitario, il ruolo dato nella squadra — e le risposte dei candidati, che conservano la domanda così come l'hanno letta.
- Le modalità di gioco, le mappe, le trasmissioni della web radio e i campi del profilo si traducono. «Compétitif 5v5» diventa «Competitive 5v5» per un visitatore anglofono, «Le réveil du serveur» diventa «The server wake-up», e l'etichetta di un campo del profilo si scrive in ogni lingua. Il nome di una mappa resta un nome proprio, ma anche lui si scrive per lingua, per chi vuole tradurre «Faille de l'invocateur». È stata fatta una scelta, e la schermata lo dice: l'ELENCO DELLE OPZIONI di un campo del profilo resta comune — un'opzione è salvata così com'è nella risposta del membro, e tradurla renderebbe introvabili le risposte già date.
- I tipi di evento, i ruoli di squadra e le rubriche degli annunci si traducono. «Torneo», «Capitano», «Hardware»: tre nomi brevi che scrive il gestore del sito, e che un sito in sei lingue mostrava in una sola. Ora si scrivono lingua per lingua, e il visitatore li vede nella sua ovunque compaiano — l'elenco degli eventi e le loro schede, il calendario, la formazione di una squadra, l'elenco degli annunci e le schermate dell'amministrazione.
- Un sondaggio si modifica senza perdere i suoi voti — e si traduce. Finora, salvare un sondaggio cancellava tutte le sue risposte per ricrearle, e tutti i VOTI con loro: correggere una virgola nella domanda costava l'intero sondaggio (la schermata lo diceva, il che non lo rendeva meno costoso). Ora una risposta conserva i suoi voti finché resta nell'elenco — corretta, spostata o tradotta; solo una risposta RIMOSSA perde i suoi, e la schermata lo dice contandoli. È ciò che permette finalmente di tradurre un sondaggio: la domanda, la sua descrizione e l'etichetta di ogni risposta si scrivono lingua per lingua, e scrivere la versione italiana non tocca più quella francese.
- I download, i link utili e le FAQ si traducono. Il titolo e la descrizione di un file o di un link, la domanda e la sua risposta, e i titoli delle loro categorie, non avevano lingua: un sito in sei lingue li mostrava in una sola — lo si vedeva sulla demo in inglese, che annunciava «Pack de fonds d'écran» e «Chaîne Twitch». Ora si scrivono lingua per lingua, come le notizie o gli eventi: la schermata di modifica apre la lingua in cui si lavora e dice quale, e il visitatore li vede nella sua lingua — nella libreria, nell'elenco dei link, nei widget e nei blocchi. Ciò che non ha lingua (indirizzo, dimensione, tipo, versione, contatori) resta comune, e ciò che è scritto in una sola lingua resta visibile nelle altre cinque.
- Un colore del tema che renderebbe il sito illeggibile viene rifiutato. I sei temi che permettono di scegliere il colore d'accento, del testo e dello sfondo accettavano qualsiasi cosa: un accento quasi identico allo sfondo, e link e pulsanti sparivano; un testo troppo pallido, e la pagina non si leggeva più. Nulla lo segnalava, e bisognava ritrovare da sé il colore di prima. Ogni colore è ora misurato rispetto agli altri due — quelli salvati, dato che i due moduli si salvano separatamente — e rifiutato, con il suo valore, quando non risalta abbastanza: 4,5 a 1 per il testo, 3 a 1 per un accento, come richiede la norma sull'accessibilità. I colori originali dei nove temi passano tutti.
- Le librerie incluse aggiornate. L'editor di testo (TinyMCE 7.6.1 → 7.9.3, che include un sanificatore HTML più recente), i grafici delle statistiche (Chart.js 4.4.7 → 4.5.1) e gli elenchi a discesa (Tom Select 2.6.1 → 2.6.2). Le altre tre — Bootstrap, flatpickr, Sortable — erano già all'ultima versione pubblicata. Le traduzioni dell'editor, corrette a mano, sono conservate.
- Trentuno titoli di schermata parlavano francese in tutte e sei le lingue. «Aggiornamenti», «Nuova mappa», «Il mio parere sulla candidatura», «Gestisci il mio account», «Partner», «Offerte di reclutamento»…: i titoli di pannelli, finestre e pulsanti non passavano per le traduzioni, e apparivano in francese qualunque fosse la lingua del sito. La loro traduzione esisteva già, in tutte e sei le lingue: mancava solo la chiamata. Il controllo che vigila sui testi scritti nel codice li lasciava passare perché supponeva che quei titoli fossero tradotti dal prodotto — cosa che fanno davvero solo le etichette dei MODULI; ora distingue i due casi.
- Tre schermate ritrovano il design del loro tema. Il foglio di stile di un widget è servito dopo quello del tema: dove entrambi dicevano la stessa cosa con lo stesso peso, vinceva il widget, e il tema disegnava nel vuoto — una schermata presentabile, un design voluto mai servito, e niente che lo dicesse. Il pannello destro di Extend (chi è online, la chat) e le sue grandi cifre riprendono il suo carattere e i suoi colori; le schede del profilo di Forge tornano quadrate, sottolineate e in maiuscolo, come nei temi fratelli; e l'indicatore di salute del Monitoraggio sta finalmente dentro il suo cerchio, invece di uscirne. Un controllo rifiuta ora qualsiasi dichiarazione di tema che non potrebbe mai applicarsi.
- Gli eventi si traducono. Il titolo di un evento, la sua descrizione, la sua descrizione privata e il suo luogo non avevano lingua: un sito in sei lingue li mostrava in una sola. Ora si scrivono lingua per lingua — la schermata di modifica apre la lingua in cui si lavora, e dice quale. Il visitatore vede un evento nella sua lingua ovunque compaia: l'elenco, la scheda, il calendario, i promemoria via e-mail, la sitemap e il widget. Ciò che non ha lingua (le date, il tipo, l'immagine, l'autore, i partecipanti) resta comune; un evento scritto in una sola lingua resta visibile nelle altre cinque.
- Il palmarès si traduce. Il nome di un titolo vinto, il suo luogo e il suo racconto non avevano lingua: un sito in sei lingue li mostrava in una sola. Ora si scrivono lingua per lingua, come il resto — la schermata di modifica apre la lingua in cui si lavora, e dice quale. Ciò che non ha lingua (la data, il piazzamento, il numero di partecipanti, la piattaforma, la squadra, il gioco) resta comune.
- Lo slideshow si traduce. Il titolo e la didascalia di una slide non avevano lingua: un sito in sei lingue li mostrava in una sola. Ora si scrivono lingua per lingua, come una pagina o una categoria — l'amministrazione scrive nella lingua in cui lavora, e lo dice sopra il campo. Il visitatore vede la slide nella sua lingua; una slide tradotta in una sola lingua resta visibile nelle altre cinque (il testo della lingua richiesta, altrimenti il francese, altrimenti il primo scritto), e una slide senza alcun testo conserva la sua immagine. Nulla si perde con l'aggiornamento: il testo di oggi è copiato in tutte le lingue installate, dato che è ciò che ogni visitatore vede oggi.
- Le sanzioni del sito seguono il membro su Discord. Con il bot 0.3.0 e la sua funzione Sanzioni collegate (spenta all'inizio), i silenziamenti e i ban di tutto il sito si applicano all'account Discord collegato del membro — un timeout per un silenziamento, un ban per un ban — e vengono revocati su Discord quando li si revoca sul sito. Un avvertimento, una restrizione o uno shadow ban non passano mai. Nel senso opposto, e solo se lo si accende: un moderatore il cui account Discord è collegato a un account del sito che ne ha il diritto può bannare o mettere in timeout su Discord, e il sito riceve la sanzione e la giudica di nuovo come se fosse stata pronunciata da lui. L'elenco delle sanzioni dice ora da dove viene ciascuna.
- I collettivi. Un nuovo modulo riunisce dei membri attorno a un progetto, al riparo dagli altri: una redazione, una squadra di moderazione, un gruppo di creatori. Creato nell'amministrazione (Community → Collettivi), un collettivo riceve una sezione privata del forum, che leggono solo i suoi membri, e — con il bot 0.3.0 e la sua funzione Collettivi — un ruolo e un canale privato su Discord. Il suo responsabile aggiunge i membri e dà loro un grado (amministratore, moderatore, membro) dalla pagina del collettivo, senza essere amministratore del sito; i moderatori moderano la sua sezione. Se un collettivo viene eliminato, la sua sezione e il suo canale restano, riservati agli amministratori: nulla di ciò che vi è stato scritto va perso.
- Le quote associative. Un'associazione incassa le sue quote sul sito: un membro paga online (Stripe) — oppure l'amministrazione registra una quota pagata in contanti o con assegno — e diventa iscritto per il periodo scelto. Riceve il ruolo «Iscritto», che si può aprire a ciò che si vuole (una sezione riservata del forum, delle pagine), e il badge del gruppo «Iscritti». Sette giorni prima della scadenza viene avvisato; alla scadenza, il ruolo gli viene tolto. Le quote non hanno bisogno del modulo Gamification, che finora i pagamenti richiedevano.
- Le donazioni fatte altrove si registrano da sole. Ko-fi, HelloAsso, TipeeeStream e il pulsante PayPal delle campagne: ogni donazione arriva nella campagna scelta, una sola volta, e la barra di avanzamento si muove senza inserimento manuale. Nulla si registra senza prova — il token di Ko-fi, l'ordine riletto su HelloAsso, la conferma di PayPal. Un'adesione pagata su HelloAsso rende iscritto il membro del sito che ha lo stesso indirizzo e-mail. I nomi dei donatori di HelloAsso e PayPal non vengono mostrati pubblicamente.
Sicurezza
- Il bot Discord segnala di essere amministratore del server. Non ne ha bisogno — il link di invito non lo chiede —, ma un ruolo assegnato a mano poteva concedergli quel diritto, e un bot amministratore il cui token trapela apre l'intero server. Ogni volta che entra nel server, il registro del bot, che l'amministrazione mostra, lo dice, e nomina i permessi che mancano al suo ruolo.
- Il link di «/forum account link» non collegava sempre l'account giusto. Chi riceveva quel link da qualcun altro collegava l'account Discord di quella persona al PROPRIO account del sito — e dato che un account collegato permette di accedere, chi aveva inviato il link poteva poi entrare nell'account della sua vittima. Il collegamento ora si conferma presso Discord: il sito confronta l'identificativo che Discord gli restituisce con quello che il link nomina, e non collega nulla se differiscono. Un avvertimento sostituiva questo controllo; non bastava.
Corretto
- L'impostazione «Carattere del sito» diceva che i caratteri erano forniti da Google Fonts. Li fornisce il sito stesso da quando nessun visitatore viene più mandato a Google: ora la descrizione lo dice.
- Un aggiornamento di addon rieseguiva tutte le sue migrazioni. La lettura delle migrazioni già fatte tornava
sempre vuota: a ogni aggiornamento di un modulo, di un widget o di un tema — dal marketplace o tramite un archivio
—, tutte le sue migrazioni venivano rieseguite, e quelle che scrivono dati li scrivevano una seconda volta. Ora
vengono eseguite solo le nuove.
check-db-querysorveglia la forma che causava il difetto: una query preparata senza essere inviata. - Il conto alla rovescia degli eventi in arrivo restava vuoto. Il suo script viveva in un tema rimosso: l'elenco degli eventi e la pagina di un evento mostravano una clessidra accanto al nulla, in tutti i temi. Ora vive con il modulo, e scrive il tempo che manca nella lingua della pagina («11gg 7h 22min», «11d 7h 22m»).
- Subito dopo un aggiornamento, il sito poteva ancora servire il vecchio codice. La cache di PHP (OPcache) conserva il codice compilato di un file finché non lo ricontrolla: due secondi di solito, e fino al riavvio di PHP presso gli hosting che disattivano questo controllo. L'aggiornamento del nucleo, quello di un addon dal marketplace e l'invio di un archivio con «Aggiungi» non la avvisavano: una pagina di un modulo aggiornato rispondeva «pagina non trovata» finché i suoi nuovi indirizzi non venivano riletti, e un sito poteva girare con un misto di codice vecchio e nuovo. Tutti e tre ora avvisano la cache di ogni file che scrivono.
- Aggiornare un addon inviandone l'archivio saltava le sue migrazioni — e cancellava la disposizione di un tema. «Aggiungi», in Temi & addon, reinstallava l'addon invece di aggiornarlo: le modifiche al suo database venivano segnate come fatte senza esserlo, e un tema perdeva tutte le sue disposizioni con i loro widget, sostituite dalla disposizione originale. Un archivio più recente ora si aggiorna come dal marketplace: il database segue, e la disposizione resta quella dell'amministratore.
- Nell'editor live di Nebula, le anteprime degli stili erano quelle di Forge: arancione su marrone. Ora prendono i colori di Nebula, quelli scelti dall'amministratore. Stessa correzione per il tema vetrina.
- Un widget di navigazione che mostrava un menu ne teneva una copia congelata. Copiava i link del menu al momento del salvataggio, e dimenticava persino quale menu fosse stato scelto: un link aggiunto o rinominato in seguito non arrivava mai nella navigazione. Il menu viene ora riletto a ogni visualizzazione, nella lingua della pagina.
- Un link a una sezione di una pagina della wiki portava in cima alla pagina. Solo i titoli di primo livello avevano un'ancora: un link a un sottotitolo non trovava nulla, e la documentazione, che rimanda spesso a una sezione precisa («vedi Indicizzazione»), lasciava il lettore all'inizio della pagina, in tutte le lingue. I sottotitoli hanno ora la loro ancora, e ogni rimando della documentazione porta al titolo che nomina.
- Una pagina della wiki messa sotto una delle sue stesse sottopagine spariva dal sommario, con tutta la sua sezione: la schermata proponeva le sottopagine come pagina madre. Non lo fa più, e un ciclo del genere inviato comunque viene rifiutato.
- Il modulo di candidatura rispondeva «Errore 500» appena un'offerta poneva una domanda facoltativa. Una regola «nessuna» scritta come testo vuoto non era capita dalla libreria dei moduli, e l'intera pagina cadeva. Trovato provando la traduzione delle domande.
- Il widget Reclutamento nascondeva le offerte senza candidature — cioè ogni offerta appena aperta. Il modulo era stato corretto; il widget no.
- Una conferma di eliminazione aperta a pagina intera non mostrava nulla. Nell'amministrazione, seguire un link «Elimina» in una nuova scheda — o senza JavaScript — portava a una pagina vuota: niente messaggio, niente pulsante, niente ritorno. Ora mostra ciò che sta per eliminare, il pulsante che lo fa e un link per tornare al modulo.
- Le pagine Moderazione e Monitoraggio non avevano l'aspetto del resto dell'amministrazione. Le loro schede di cifre, le loro intestazioni e il battito dell'indicatore di salute venivano da un foglio di stile di riserva — pensato per i siti che mostrano quelle schermate fuori dall'amministrazione — che, servito per ultimo, sovrascriveva il tema. La riserva si applica ora solo dove il tema non dice nulla.
- In portoghese, un account non si poteva eliminare. La schermata chiedeva di digitare «EXCLUIR» e il sito si aspettava «ELIMINAR»: la conferma falliva ogni volta. Le altre cinque lingue erano corrette. Un controllo rifiuta ora un'istruzione che citi una parola diversa da quella che il sito si aspetta.
- Il portoghese mescolava Brasile e Portogallo. Ottanta espressioni riviste: usuário diventa utilizador, senha diventa palavra-passe, excluir diventa eliminar, registro diventa registo, e arquivo diventa ficheiro quando indica un file — e resta arquivo quando indica un archivio.
- Alcune frasi inglesi maldestre: «All posts will be also deleted» diventa «will also be deleted», nei quattro messaggi di eliminazione in cui restava.
- Tradurre un contenuto per la prima volta: il testo andava perso, senza una parola. Scrivere una notizia in francese, passare l'amministrazione all'inglese, tradurla e salvare: non veniva conservato nulla. La riga di quella lingua non esisteva ancora, e il salvataggio non toccava nessuna riga — in silenzio. Valeva per notizie, post del blog, pagine, categorie, gallerie, giochi, squadre, gruppi e partner. Una traduzione crea ora la sua riga.
- Un contenuto non ancora tradotto era introvabile nell'amministrazione di quella lingua. Gli elenchi di notizie, post del blog e pagine mostravano solo ciò che esisteva nella lingua in cui si lavora: il resto era invisibile, quindi impossibile da aprire per tradurlo. Gli elenchi mostrano ora tutto, con il miglior titolo disponibile, e la schermata di modifica si apre con i campi vuoti, pronti per la traduzione.
- Rinominare un gruppo cancellava tutte le sue traduzioni. Il salvataggio non puntava a nessuna lingua in particolare: scriveva lo stesso titolo su tutte le righe del gruppo — e falliva appena il sito ne aveva più di una.
- Un partner poteva avere una sola lingua. La tabella delle traduzioni del modulo Partner aveva come chiave solo il numero del partner: una seconda lingua veniva rifiutata o sovrascriveva la prima. Ora ha una riga per lingua, come le altre sedici tabelle di traduzione, e descrivere un partner in una nuova lingua crea la sua riga invece di non scrivere nulla.
- Il prossimo appuntamento: il giorno della settimana incollato al numero del giorno. Nella casella della data del widget Il prossimo appuntamento, le tre righe — giorno della settimana, numero del giorno, mese — si toccavano, e si sovrapponevano appena un tema applicava il suo carattere da titoli: le cifre uscivano da un'altezza di riga più bassa del loro inchiostro. Le tre righe mantengono ora la loro distanza nei sette temi, in modalità chiara e scura. Stessa correzione per i grandi numeri del widget Il sito in cifre.
- Pulse disegna finalmente i suoi widget. Il tema prevedeva un proprio aspetto per la casella della data del calendario, i numeri de Il sito in cifre, la settimana e le miniature della galleria: nessuno si vedeva, perché il foglio di stile del widget è servito dopo quello del tema e vinceva a parità di specificità. La piastrella di Pulse (angoli arrotondati, cifre grandi, grigio ardesia) appare ora come la mostrava il bozzetto.