Fork i18n + search + filtering- v0.2

finalised migration of admin pages to use i18n

+5
i18n/en-us/actions.ftl
··· 39 39 manage-denylist = Manage blocked identities 40 40 view-events = View all events ordered by recent updates 41 41 view-rsvps = View all RSVPs ordered by recent updates 42 + import-rsvp = Import RSVP 43 + nuke-identity = Nuke Identity 44 + 45 + # Admin confirmations and warnings 46 + confirm-nuke-identity = Are you sure you want to nuke this identity? This will delete all records and add the handle, PDS, and DID to the denylist. 42 47 43 48 # Event actions 44 49 planned = Planned
+38
i18n/en-us/ui.ftl
··· 117 117 page-title-admin = Admin 118 118 page-title-admin-denylist = Admin - Denylist 119 119 page-title-admin-events = Events - Smoke Signal Admin 120 + page-title-admin-rsvps = RSVPs - Smoke Signal Admin 121 + page-title-admin-rsvp = RSVP Record - Smoke Signal Admin 122 + page-title-admin-event = Event Record - Smoke Signal Admin 123 + page-title-admin-handles = Handles - Smoke Signal Admin 120 124 page-title-create-event = Create Event 121 125 page-title-create-rsvp = Create RSVP 122 126 ··· 124 128 heading-admin = Admin 125 129 heading-admin-denylist = Denylist 126 130 heading-admin-events = Event Records 131 + heading-admin-rsvps = RSVP Records 132 + heading-admin-rsvp = RSVP Record 133 + heading-admin-event = Event Record 134 + heading-admin-handles = Handle Records 127 135 heading-create-event = Create Event 128 136 heading-create-rsvp = Create RSVP 129 137 heading-import-event = Import Event by AT-URI 138 + heading-import-rsvp = Import RSVP 139 + heading-rsvp-details = RSVP Details 140 + heading-rsvp-json = RSVP JSON 130 141 131 142 # Status and notification messages 132 143 message-rsvp-recorded = The RSVP has been recorded! 144 + message-rsvp-import-success = RSVP imported successfully! 145 + message-view-rsvp = View RSVP 133 146 134 147 # Navigation and breadcrumbs 135 148 nav-home = Home 136 149 nav-events = Events 150 + nav-rsvps = RSVPs 137 151 nav-admin = Admin 138 152 nav-denylist = Denylist 153 + nav-handles = Handles 154 + nav-rsvp-record = RSVP Record 155 + nav-event-record = Event Record 139 156 140 157 # Table headers 141 158 header-name = Name 142 159 header-updated = Updated 143 160 header-actions = Actions 161 + header-rsvp = RSVP 162 + header-event = Event 163 + header-status = Status 164 + header-did = DID 165 + header-handle = Handle 166 + header-pds = PDS 167 + header-language = Language 168 + header-timezone = Timezone 144 169 145 170 # Descriptions and subtitles 146 171 subtitle-admin-events = View all events ordered by recent updates 172 + subtitle-admin-rsvps = View all RSVPs ordered by recent updates 173 + subtitle-admin-handles = View known handles 147 174 help-import-aturi = Enter the full AT-URI of the event to import 175 + help-import-rsvp-aturi = Enter the AT-URI of an RSVP to import - supports both "community.lexicon.calendar.rsvp" and "events.smokesignal.calendar.rsvp" collections 148 176 149 177 # Common UI elements 150 178 greeting = Hello ··· 154 182 [one] ({ $count }) 155 183 *[other] ({ $count }) 156 184 } 185 + 186 + # Technical labels and identifiers 187 + label-aturi = AT-URI 188 + label-cid = CID 189 + label-did = DID 190 + label-lexicon = Lexicon 191 + label-event-aturi = Event AT-URI 192 + label-event-cid = Event CID 193 + label-rsvp-details = RSVP Details 194 + label-rsvp-json = RSVP JSON
+11
i18n/fr-ca/actions.ftl
··· 41 41 location-type-address = Adresse 42 42 location-type-coordinates = Coordonnées 43 43 location-type-virtual = Virtuel 44 + 45 + # Actions d'administration 46 + manage-handles = Gérer les identifiants connus 47 + manage-denylist = Gérer les identités bloquées 48 + view-events = Voir tous les événements ordonnés par mises à jour récentes 49 + view-rsvps = Voir toutes les réponses ordonnées par mises à jour récentes 50 + import-rsvp = Importer une réponse 51 + nuke-identity = Éliminer l'identité 52 + 53 + # Confirmations et avertissements d'administration 54 + confirm-nuke-identity = Êtes-vous sûr de vouloir éliminer cette identité? Cela supprimera tous les enregistrements et ajoutera l'identifiant, le PDS et le DID à la liste de refus.
+45
i18n/fr-ca/ui.ftl
··· 4 4 page-title-admin = Administration 5 5 page-title-admin-denylist = Administration - Liste de refus 6 6 page-title-admin-events = Événements - Administration Smoke Signal 7 + page-title-admin-rsvps = RSVP - Administration Smoke Signal 8 + page-title-admin-rsvp = Enregistrement RSVP - Administration Smoke Signal 9 + page-title-admin-event = Enregistrement d'événement - Administration Smoke Signal 10 + page-title-admin-handles = Identifiants - Administration Smoke Signal 7 11 page-title-create-event = Créer un événement 8 12 page-title-create-rsvp = Créer une réponse 9 13 ··· 11 15 heading-admin = Administration 12 16 heading-admin-denylist = Liste de refus 13 17 heading-admin-events = Registres d'événements 18 + heading-admin-rsvps = Registres de réponses 19 + heading-admin-rsvp = Enregistrement de réponse 20 + heading-admin-event = Enregistrement d'événement 21 + heading-admin-handles = Registres d'identifiants 14 22 heading-create-event = Créer un événement 15 23 heading-create-rsvp = Créer une réponse 16 24 heading-import-event = Importer un événement par URI AT 25 + heading-import-rsvp = Importer une réponse 26 + heading-rsvp-details = Détails de la réponse 27 + heading-rsvp-json = JSON de la réponse 17 28 18 29 # Messages de statut et de notification 19 30 message-rsvp-recorded = La réponse a été enregistrée! 31 + message-rsvp-import-success = Réponse importée avec succès! 32 + message-view-rsvp = Voir la réponse 33 + subtitle-admin-events = Voir tous les événements ordonnés par mises à jour récentes 34 + subtitle-admin-rsvps = Voir toutes les réponses ordonnées par mises à jour récentes 35 + subtitle-admin-handles = Voir les identifiants connus 36 + help-import-aturi = Entrer l'URI AT complet de l'événement à importer 37 + help-import-rsvp-aturi = Entrer l'URI AT de la réponse à importer - supporte les collections "community.lexicon.calendar.rsvp" et "events.smokesignal.calendar.rsvp" 20 38 21 39 # Navigation et fil d'Ariane 22 40 nav-home = Accueil 23 41 nav-events = Événements 42 + nav-rsvps = Réponses 24 43 nav-profile = Profil 25 44 nav-settings = Paramètres 26 45 nav-admin = Administration 27 46 nav-denylist = Liste de refus 47 + nav-handles = Identifiants 48 + nav-rsvp-record = Enregistrement de réponse 49 + nav-event-record = Enregistrement d'événement 28 50 29 51 # Messages de contenu 30 52 member-since = Membre depuis ··· 66 88 [one] ({ $count }) 67 89 *[other] ({ $count }) 68 90 } 91 + 92 + # En-têtes de tableau 93 + header-name = Nom 94 + header-updated = Mis à jour 95 + header-actions = Actions 96 + header-rsvp = Réponse 97 + header-event = Événement 98 + header-status = Statut 99 + header-did = DID 100 + header-handle = Identifiant 101 + header-pds = PDS 102 + header-language = Langue 103 + header-timezone = Fuseau horaire 104 + 105 + # Étiquettes techniques et identifiants 106 + label-aturi = URI AT 107 + label-cid = CID 108 + label-did = DID 109 + label-lexicon = Lexicon 110 + label-event-aturi = URI AT de l'événement 111 + label-event-cid = CID de l'événement 112 + label-rsvp-details = Détails de la réponse 113 + label-rsvp-json = JSON de la réponse
+5 -5
templates/admin_event.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 - {% block title %}Event Record - Smoke Signal Admin{% endblock %} 2 + {% block title %}{{ t(key="page-title-admin-event", locale=locale) }}{% endblock %} 3 3 {% block head %} 4 4 <style> 5 5 pre { ··· 14 14 <div class="container"> 15 15 <nav class="breadcrumb" aria-label="breadcrumbs"> 16 16 <ul> 17 - <li><a href="/admin">Admin</a></li> 18 - <li><a href="/admin/events">Events</a></li> 19 - <li class="is-active"><a href="#" aria-current="page">Event Record</a></li> 17 + <li><a href="/admin">{{ t(key="nav-admin", locale=locale) }}</a></li> 18 + <li><a href="/admin/events">{{ t(key="nav-events", locale=locale) }}</a></li> 19 + <li class="is-active"><a href="#" aria-current="page">{{ t(key="nav-event-record", locale=locale) }}</a></li> 20 20 </ul> 21 21 </nav> 22 22 </div> ··· 24 24 <section class="section"> 25 25 <div class="container"> 26 26 <div class="content"> 27 - <h1 class="title">Event Record</h1> 27 + <h1 class="title">{{ t(key="heading-admin-event", locale=locale) }}</h1> 28 28 <div class="box"> 29 29 <pre><code>{{ event_json }}</code></pre> 30 30 </div>
+14 -14
templates/admin_handles.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 2 {% include 'pagination.html' %} 3 - {% block title %}Handles - Smoke Signal Admin{% endblock %} 3 + {% block title %}{{ t(key="page-title-admin-handles", locale=locale) }}{% endblock %} 4 4 {% block head %}{% endblock %} 5 5 {% block content %} 6 6 <section class="section"> 7 7 <div class="container"> 8 8 <nav class="breadcrumb" aria-label="breadcrumbs"> 9 9 <ul> 10 - <li><a href="/admin">Admin</a></li> 11 - <li class="is-active"><a href="#" aria-current="page">Handles</a></li> 10 + <li><a href="/admin">{{ t(key="nav-admin", locale=locale) }}</a></li> 11 + <li class="is-active"><a href="#" aria-current="page">{{ t(key="nav-handles", locale=locale) }}</a></li> 12 12 </ul> 13 13 </nav> 14 14 </div> ··· 16 16 <section class="section"> 17 17 <div class="container"> 18 18 <div class="content"> 19 - <h1 class="title">Handle Records ({{ total_count }})</h1> 20 - <p class="subtitle">View known handles</p> 19 + <h1 class="title">{{ t(key="heading-admin-handles", locale=locale) }} {{ t(key="total-count", count=total_count, locale=locale) }}</h1> 20 + <p class="subtitle">{{ t(key="subtitle-admin-handles", locale=locale) }}</p> 21 21 22 22 <table class="table is-fullwidth"> 23 23 <thead> 24 24 <tr> 25 - <th>DID</th> 26 - <th>Handle</th> 27 - <th>PDS</th> 28 - <th>Language</th> 29 - <th>Timezone</th> 30 - <th>Updated</th> 31 - <th>Actions</th> 25 + <th>{{ t(key="header-did", locale=locale) }}</th> 26 + <th>{{ t(key="header-handle", locale=locale) }}</th> 27 + <th>{{ t(key="header-pds", locale=locale) }}</th> 28 + <th>{{ t(key="header-language", locale=locale) }}</th> 29 + <th>{{ t(key="header-timezone", locale=locale) }}</th> 30 + <th>{{ t(key="header-updated", locale=locale) }}</th> 31 + <th>{{ t(key="header-actions", locale=locale) }}</th> 32 32 </tr> 33 33 </thead> 34 34 <tbody> ··· 43 43 <td> 44 44 <button class="button is-danger is-small" 45 45 hx-post="/admin/handles/nuke/{{ handle.did }}" 46 - hx-confirm="Are you sure you want to nuke this identity? This will delete all records and add the handle, PDS, and DID to the denylist." 46 + hx-confirm="{{ t(key="confirm-nuke-identity", locale=locale) }}" 47 47 hx-target="body" 48 48 data-loading-disable 49 49 data-loading-class="is-loading"> 50 - Nuke Identity 50 + {{ t(key="nuke-identity", locale=locale) }} 51 51 </button> 52 52 </td> 53 53 </tr>
+15 -15
templates/admin_rsvp.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 - {% block title %}RSVP Record - Smoke Signal Admin{% endblock %} 2 + {% block title %}{{ t(key="page-title-admin-rsvp", locale=locale) }}{% endblock %} 3 3 {% block head %} 4 4 <style> 5 5 pre { ··· 14 14 <div class="container"> 15 15 <nav class="breadcrumb" aria-label="breadcrumbs"> 16 16 <ul> 17 - <li><a href="/admin">Admin</a></li> 18 - <li><a href="/admin/rsvps">RSVPs</a></li> 19 - <li class="is-active"><a href="#" aria-current="page">RSVP Record</a></li> 17 + <li><a href="/admin">{{ t(key="nav-admin", locale=locale) }}</a></li> 18 + <li><a href="/admin/rsvps">{{ t(key="nav-rsvps", locale=locale) }}</a></li> 19 + <li class="is-active"><a href="#" aria-current="page">{{ t(key="nav-rsvp-record", locale=locale) }}</a></li> 20 20 </ul> 21 21 </nav> 22 22 </div> ··· 24 24 <section class="section"> 25 25 <div class="container"> 26 26 <div class="content"> 27 - <h1 class="title">RSVP Record</h1> 27 + <h1 class="title">{{ t(key="heading-admin-rsvp", locale=locale) }}</h1> 28 28 29 29 <div class="columns"> 30 30 <div class="column is-half"> 31 31 <div class="box"> 32 - <h2 class="subtitle">RSVP Details</h2> 32 + <h2 class="subtitle">{{ t(key="heading-rsvp-details", locale=locale) }}</h2> 33 33 <table class="table is-fullwidth"> 34 34 <tbody> 35 35 <tr> 36 - <th>AT-URI</th> 36 + <th>{{ t(key="label-aturi", locale=locale) }}</th> 37 37 <td><code>{{ rsvp.aturi }}</code></td> 38 38 </tr> 39 39 <tr> 40 - <th>CID</th> 40 + <th>{{ t(key="label-cid", locale=locale) }}</th> 41 41 <td><code>{{ rsvp.cid }}</code></td> 42 42 </tr> 43 43 <tr> 44 - <th>DID</th> 44 + <th>{{ t(key="label-did", locale=locale) }}</th> 45 45 <td><a href="/{{ rsvp.did }}"><code>{{ rsvp.did }}</code></a></td> 46 46 </tr> 47 47 <tr> 48 - <th>Lexicon</th> 48 + <th>{{ t(key="label-lexicon", locale=locale) }}</th> 49 49 <td><code>{{ rsvp.lexicon }}</code></td> 50 50 </tr> 51 51 <tr> 52 - <th>Status</th> 52 + <th>{{ t(key="header-status", locale=locale) }}</th> 53 53 <td>{{ rsvp.status }}</td> 54 54 </tr> 55 55 <tr> 56 - <th>Event AT-URI</th> 56 + <th>{{ t(key="label-event-aturi", locale=locale) }}</th> 57 57 <td><a href="/admin/event?aturi={{ rsvp.event_aturi }}"><code>{{ rsvp.event_aturi }}</code></a></td> 58 58 </tr> 59 59 <tr> 60 - <th>Event CID</th> 60 + <th>{{ t(key="label-event-cid", locale=locale) }}</th> 61 61 <td><code>{{ rsvp.event_cid }}</code></td> 62 62 </tr> 63 63 <tr> 64 - <th>Updated</th> 64 + <th>{{ t(key="header-updated", locale=locale) }}</th> 65 65 <td>{{ rsvp.updated_at }}</td> 66 66 </tr> 67 67 </tbody> ··· 70 70 </div> 71 71 <div class="column is-half"> 72 72 <div class="box"> 73 - <h2 class="subtitle">RSVP JSON</h2> 73 + <h2 class="subtitle">{{ t(key="heading-rsvp-json", locale=locale) }}</h2> 74 74 <pre><code>{{ rsvp_json }}</code></pre> 75 75 </div> 76 76 </div>
+16 -16
templates/admin_rsvps.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 2 {% include 'pagination.html' %} 3 - {% block title %}RSVPs - Smoke Signal Admin{% endblock %} 3 + {% block title %}{{ t(key="page-title-admin-rsvps", locale=locale) }}{% endblock %} 4 4 {% block head %}{% endblock %} 5 5 {% block content %} 6 6 <section class="section"> 7 7 <div class="container"> 8 8 <nav class="breadcrumb" aria-label="breadcrumbs"> 9 9 <ul> 10 - <li><a href="/admin">Admin</a></li> 11 - <li class="is-active"><a href="#" aria-current="page">RSVPs</a></li> 10 + <li><a href="/admin">{{ t(key="nav-admin", locale=locale) }}</a></li> 11 + <li class="is-active"><a href="#" aria-current="page">{{ t(key="nav-rsvps", locale=locale) }}</a></li> 12 12 </ul> 13 13 </nav> 14 14 </div> ··· 17 17 <section class="section"> 18 18 <div class="container"> 19 19 <div class="content"> 20 - <h1 class="title">RSVP Records ({{ total_count }})</h1> 21 - <p class="subtitle">View all RSVPs ordered by recent updates</p> 20 + <h1 class="title">{{ t(key="heading-admin-rsvps", locale=locale) }} {{ t(key="total-count", count=total_count, locale=locale) }}</h1> 21 + <p class="subtitle">{{ t(key="subtitle-admin-rsvps", locale=locale) }}</p> 22 22 23 23 {% if import_success %} 24 24 <article class="message is-success"> ··· 27 27 <span class="icon"> 28 28 <i class="fas fa-check-circle"></i> 29 29 </span> 30 - <span>RSVP imported successfully! <a href="/admin/rsvp?aturi={{ imported_aturi }}">View RSVP</a></span> 30 + <span>{{ t(key="message-rsvp-import-success", locale=locale) }} <a href="/admin/rsvp?aturi={{ imported_aturi }}">{{ t(key="message-view-rsvp", locale=locale) }}</a></span> 31 31 </span> 32 32 </div> 33 33 </article> 34 34 {% endif %} 35 35 36 36 <div class="box"> 37 - <h2 class="subtitle">Import RSVP</h2> 37 + <h2 class="subtitle">{{ t(key="heading-import-rsvp", locale=locale) }}</h2> 38 38 <form method="post" action="/admin/rsvps/import"> 39 39 <div class="field"> 40 - <label class="label">RSVP AT-URI</label> 40 + <label class="label">{{ t(key="label-rsvp-aturi", locale=locale) }}</label> 41 41 <div class="control"> 42 42 <input class="input" type="text" name="aturi" placeholder="at://did:plc:abcdef/community.lexicon.calendar.rsvp/3jizzrxoalv2h" required> 43 43 </div> 44 - <p class="help">Enter the AT-URI of an RSVP to import - supports both "community.lexicon.calendar.rsvp" and "events.smokesignal.calendar.rsvp" collections</p> 44 + <p class="help">{{ t(key="help-import-rsvp-aturi", locale=locale) }}</p> 45 45 </div> 46 46 <div class="field"> 47 47 <div class="control"> 48 - <button class="button is-primary" type="submit">Import RSVP</button> 48 + <button class="button is-primary" type="submit">{{ t(key="import-rsvp", locale=locale) }}</button> 49 49 </div> 50 50 </div> 51 51 </form> ··· 54 54 <table class="table is-fullwidth"> 55 55 <thead> 56 56 <tr> 57 - <th>RSVP</th> 58 - <th>Event</th> 59 - <th>Status</th> 60 - <th>Updated</th> 61 - <th>Actions</th> 57 + <th>{{ t(key="header-rsvp", locale=locale) }}</th> 58 + <th>{{ t(key="header-event", locale=locale) }}</th> 59 + <th>{{ t(key="header-status", locale=locale) }}</th> 60 + <th>{{ t(key="header-updated", locale=locale) }}</th> 61 + <th>{{ t(key="header-actions", locale=locale) }}</th> 62 62 </tr> 63 63 </thead> 64 64 <tbody> ··· 71 71 <td> 72 72 <div class="buttons"> 73 73 <a href="/admin/rsvp?aturi={{ rsvp.aturi }}" class="button is-small is-info"> 74 - View 74 + {{ t(key="view", locale=locale) }} 75 75 </a> 76 76 </div> 77 77 </td>
+1 -1
templates/nav.en-us.html
··· 20 20 <div id="navbarMenuMain" class="navbar-menu"> 21 21 <div class="navbar-start"> 22 22 <a class="navbar-item" href="/" hx-boost="true"> 23 - Home 23 + {{ t(key="nav-home", locale=locale) }} 24 24 </a> 25 25 <a class="navbar-item" href="/"> 26 26 Help