R7 custom emoji in decePub: the server's own, administered, picked, suggested and shown

Administration has a Custom emoji section (EmojiPanel, data-admin-section=emoji): the server's emoji by category, added
with a picture streamed from the file, changed (category, picker, disabled, picture; never the shortcode) and deleted,
asked first, with PrivaPub's 409 and 422 in the dialog. EmojiService reads /clientapi/admin/emoji and, for everyone,
/api/v1/custom_emojis, kept a day in localStorage (CustomEmojiCache) and read again after a change here. EmojiPicker
(a DDropdown sheet on a phone, rendered only while open) offers them by category with common unicode emoji, searchable:
the composer writes the choice at the caret, a card and the announcements banner react with it. The composer suggests
custom emoji after `:` and two letters. Custom reactions toggle as :shortcode: and show their picture, notifications of
one too; located posts, announcements and NavMenu's persona names render the server's emoji.

Verified: Release build, 0 errors (the 3 warnings were there before). Not run against PrivaPub or in the pasture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-18 08:24:43 +02:00
1 parent c572471b88
commit 566b0e33ea
26 files changed
+1385 -56

No files matched your search

+117
View File
@@ -3482,4 +3482,121 @@
<data name="Delete for good" xml:space="preserve">
<value>Elimina per sempre</value>
</data>
<data name="Custom emoji" xml:space="preserve">
<value>Emoji personalizzate</value>
</data>
<data name="Add an emoji" xml:space="preserve">
<value>Aggiungi un'emoji</value>
</data>
<data name="No custom emoji yet." xml:space="preserve">
<value>Ancora nessuna emoji personalizzata.</value>
</data>
<data name="No category" xml:space="preserve">
<value>Nessuna categoria</value>
</data>
<data name="Shortcode" xml:space="preserve">
<value>Codice</value>
</data>
<data name="Category" xml:space="preserve">
<value>Categoria</value>
</data>
<data name="In the picker" xml:space="preserve">
<value>Nel selettore</value>
</data>
<data name="Disabled" xml:space="preserve">
<value>Disattivata</value>
</data>
<data name="Not in the picker" xml:space="preserve">
<value>Non nel selettore</value>
</data>
<data name="Animated" xml:space="preserve">
<value>Animata</value>
</data>
<data name="New emoji" xml:space="preserve">
<value>Nuova emoji</value>
</data>
<data name="Edit :{0}:" xml:space="preserve">
<value>Modifica :{0}:</value>
</data>
<data name="Delete :{0}:?" xml:space="preserve">
<value>Eliminare :{0}:?</value>
</data>
<data name="Emoji added." xml:space="preserve">
<value>Emoji aggiunta.</value>
</data>
<data name="Emoji saved." xml:space="preserve">
<value>Emoji salvata.</value>
</data>
<data name="Emoji deleted." xml:space="preserve">
<value>Emoji eliminata.</value>
</data>
<data name="Choose a picture." xml:space="preserve">
<value>Scegli un'immagine.</value>
</data>
<data name="Everyone here can use them in posts, names and reactions, and other servers show them. The picker offers those in it; one written out as :shortcode: works too, unless it is disabled." xml:space="preserve">
<value>Chiunque qui può usarle nei post, nei nomi e nelle reazioni, e gli altri server le mostrano. Il selettore offre quelle che vi sono; scritta come :codice:, un'emoji funziona comunque, a meno che sia disattivata.</value>
</data>
<data name="It is offered no more, and the posts and profiles that use it show the text :{0}: instead. Other servers keep their copy until they read those posts again." xml:space="preserve">
<value>Non viene più offerta, e i post e i profili che la usano mostrano al suo posto il testo :{0}:. Gli altri server ne tengono la copia finché non rileggono quei post.</value>
</data>
<data name="Letters, digits and underscores, 2 to 64 of them. It never changes: other servers know the emoji by it." xml:space="preserve">
<value>Lettere, cifre e trattini bassi, da 2 a 64. Non cambia mai: gli altri server conoscono l'emoji con questo codice.</value>
</data>
<data name="A shortcode never changes: other servers know the emoji by it." xml:space="preserve">
<value>Il codice non cambia mai: gli altri server conoscono l'emoji con esso.</value>
</data>
<data name="The picker groups the emoji by it." xml:space="preserve">
<value>Il selettore raggruppa le emoji per categoria.</value>
</data>
<data name="PNG, GIF, WebP or JPEG, {0} at most. The server fits it within 256 px and keeps a GIF's animation." xml:space="preserve">
<value>PNG, GIF, WebP o JPEG, al massimo {0}. Il server la adatta entro 256 px e mantiene l'animazione di una GIF.</value>
</data>
<data name="Without a new one, it keeps its picture." xml:space="preserve">
<value>Senza una nuova, mantiene la sua immagine.</value>
</data>
<data name="Offered in the picker of every client. Out of it, it is still taken when its shortcode is written." xml:space="preserve">
<value>Offerta nel selettore di ogni client. Fuori da esso, viene comunque riconosciuta quando se ne scrive il codice.</value>
</data>
<data name="Kept, but offered nowhere, taken into no new post and shown in none." xml:space="preserve">
<value>Conservata, ma non offerta da nessuna parte, non usata nei nuovi post e mostrata in nessuno.</value>
</data>
<data name="Search emoji" xml:space="preserve">
<value>Cerca emoji</value>
</data>
<data name="No emoji matches." xml:space="preserve">
<value>Nessuna emoji corrisponde.</value>
</data>
<data name="Often used" xml:space="preserve">
<value>Usate spesso</value>
</data>
<data name="This server's emoji" xml:space="preserve">
<value>Emoji di questo server</value>
</data>
<data name="Smileys" xml:space="preserve">
<value>Faccine</value>
</data>
<data name="Animals and nature" xml:space="preserve">
<value>Animali e natura</value>
</data>
<data name="Food and drink" xml:space="preserve">
<value>Cibo e bevande</value>
</data>
<data name="Activities" xml:space="preserve">
<value>Attività</value>
</data>
<data name="Travel and places" xml:space="preserve">
<value>Viaggi e luoghi</value>
</data>
<data name="Objects" xml:space="preserve">
<value>Oggetti</value>
</data>
<data name="Symbols" xml:space="preserve">
<value>Simboli</value>
</data>
<data name="Insert an emoji" xml:space="preserve">
<value>Inserisci un'emoji</value>
</data>
<data name="{0} reacted with" xml:space="preserve">
<value>{0} ha reagito con</value>
</data>
</root>