diff --git a/docs/i18n.md b/docs/i18n.md index e13d7c3..1bc4749 100644 --- a/docs/i18n.md +++ b/docs/i18n.md @@ -32,8 +32,8 @@ Core entity names used throughout the application. These are referenced by other | `nodes` | Nodes | Mesh network nodes (plural) | | `node` | Node | Single mesh network node | | `node_detail` | Node Detail | Node details page | -| `advertisements` | Advertisements | Network advertisements (plural) | -| `advertisement` | Advertisement | Single advertisement | +| `advertisements` | Adverts | Network advertisements (plural, used in nav menus and hero cards) | +| `advertisement` | Advert | Single advertisement | | `messages` | Messages | Network messages (plural) | | `message` | Message | Single message | | `map` | Map | Network map page | @@ -251,7 +251,7 @@ Homepage-specific content: | `spreading_factor` | Spreading Factor | LoRa spreading factor label | | `coding_rate` | Coding Rate | LoRa coding rate label | | `tx_power` | TX Power | Transmit power label | -| `advertisements` | Advertisements | Homepage stat label | +| `advertisements` | Adverts | Homepage stat label | | `messages` | Messages | Homepage stat label | **Note:** MeshCore tagline "Off-Grid, Open-Source Encrypted Messaging" is hardcoded in English and should not be translated (trademark). @@ -376,7 +376,27 @@ Members page content: | `empty_state_description` | No members yet. | Empty state heading | | `empty_description` | Members will appear here once users log in and adopt nodes. | Empty state description | -### 14. `not_found` +### 14. `channels` + +Channel management and filter UI: + +| Key | English | Context | +|-----|---------|---------| +| `title` | Channels | Page title | +| `add_channel` | Add Channel | Add button label | +| `edit_channel` | Edit Channel | Edit modal title | +| `delete_channel` | Delete Channel | Delete modal title | +| `delete_confirm` | Are you sure you want to delete channel {{name}}? | Delete confirmation message | +| `name_label` | Channel Name | Form label | +| `key_label` | Channel Key (hex) | Form label | +| `visibility_label` | Visibility | Form label | +| `enabled_label` | Enabled | Form label | +| `channel_hash_label` | Hash | Column header | +| `disabled` | Disabled | Disabled channel badge | +| `optgroup_standard` | Standard | Optgroup label for built-in channels (Public, Test) in channel filter dropdown | +| `optgroup_custom` | Custom | Optgroup label for user-defined channels in channel filter dropdown | + +### 15. `not_found` 404 page content: @@ -384,7 +404,7 @@ Members page content: |-----|---------|---------| | `description` | The page you're looking for doesn't exist or has been moved. | 404 description | -### 15. `custom_page` +### 16. `custom_page` Custom markdown page errors: @@ -392,7 +412,7 @@ Custom markdown page errors: |-----|---------|---------| | `failed_to_load` | Failed to load page | Page load error | -### 16. `auth` +### 17. `auth` Authentication UI: @@ -408,7 +428,7 @@ Authentication UI: | `role_admin` | admin | Admin role badge text | | `role_member` | member | Member role badge text | -### 17. `footer` +### 18. `footer` Footer content: @@ -416,7 +436,7 @@ Footer content: |-----|---------|---------| | `powered_by` | Powered by | "Powered by" attribution | -### 18. `user_profile` +### 19. `user_profile` User profile page (OIDC authenticated users): diff --git a/src/meshcore_hub/collector/letsmesh_decoder.py b/src/meshcore_hub/collector/letsmesh_decoder.py index 51533e3..6de1ecb 100644 --- a/src/meshcore_hub/collector/letsmesh_decoder.py +++ b/src/meshcore_hub/collector/letsmesh_decoder.py @@ -32,7 +32,7 @@ class LetsMeshPacketDecoder: BUILTIN_CHANNEL_KEYS: tuple[tuple[str, str], ...] = ( ("Public", "8B3387E9C5CDEA6AC9E5EDBAA115CD72"), - ("test", "9CD8FCF22A47333B591D96A2B848B73F"), + ("Test", "9CD8FCF22A47333B591D96A2B848B73F"), ) TEST_CHANNEL_HASH: str = "D9" diff --git a/src/meshcore_hub/web/static/js/spa/app.js b/src/meshcore_hub/web/static/js/spa/app.js index 9b9855d..e1fef91 100644 --- a/src/meshcore_hub/web/static/js/spa/app.js +++ b/src/meshcore_hub/web/static/js/spa/app.js @@ -71,12 +71,12 @@ if (features.nodes !== false) { router.navigate(`/nodes/${params.prefix}`, true); }); } -if (features.messages !== false) { - router.addRoute('/messages', pageHandler(pages.messages)); -} if (features.channels !== false) { router.addRoute('/channels', pageHandler(pages.channels)); } +if (features.messages !== false) { + router.addRoute('/messages', pageHandler(pages.messages)); +} if (features.advertisements !== false) { router.addRoute('/advertisements', pageHandler(pages.advertisements)); } @@ -153,8 +153,8 @@ function updatePageTitle(pathname) { // Add feature-dependent titles if (features.dashboard !== false) titles['/dashboard'] = composePageTitle('entities.dashboard'); if (features.nodes !== false) titles['/nodes'] = composePageTitle('entities.nodes'); - if (features.messages !== false) titles['/messages'] = composePageTitle('entities.messages'); if (features.channels !== false) titles['/channels'] = composePageTitle('entities.channels'); + if (features.messages !== false) titles['/messages'] = composePageTitle('entities.messages'); if (features.advertisements !== false) titles['/advertisements'] = composePageTitle('entities.advertisements'); if (features.map !== false) titles['/map'] = composePageTitle('entities.map'); if (features.members !== false) titles['/members'] = composePageTitle('entities.members'); @@ -203,12 +203,12 @@ function renderMobileNav(config) { if (features.advertisements !== false) { items.push(html`