app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit 5a0bd1e16c4e75a916ccaaa494d0259da4522b82
parent 5f8eb389540f03902543101e3be5ae2a2f1d802b
Author: triesap <tyson@radroots.org>
Date:   Fri, 17 Apr 2026 18:29:20 +0000

i18n: rewrite the radroots_app shell copy contract

- replace the bootstrap home and settings key registry with the current radroots_app shell vocabulary
- localize the native menu labels, placeholder account copy, settings strings, and about placeholders
- trim the desktop launcher and shared text helpers to consume the new typed localization surface
- verify cargo test -p radroots_app_i18n and cargo check -p radroots_app

Diffstat:
Mcrates/launchers/desktop/src/menus.rs | 14++++++++------
Mcrates/launchers/desktop/src/window.rs | 144+++++++++++++------------------------------------------------------------------
Mcrates/shared/i18n/src/keys.rs | 64++++++++++++++++++++++++++++------------------------------------
Mcrates/shared/ui/src/lib.rs | 5++---
Mcrates/shared/ui/src/primitives.rs | 5++++-
Mcrates/shared/ui/src/text.rs | 79+++++++++++++++++++++++++++++--------------------------------------------------
Mcrates/shared/ui/src/theme.rs | 7++++++-
Mi18n/locales/en/messages.json | 76++++++++++++++++++++++++++++++++++------------------------------------------
8 files changed, 134 insertions(+), 260 deletions(-)

diff --git a/crates/launchers/desktop/src/menus.rs b/crates/launchers/desktop/src/menus.rs @@ -1,19 +1,19 @@ use gpui::{ - App, AppContext, Bounds, KeyBinding, Menu, MenuItem, WindowBounds, WindowOptions, actions, px, - size, + App, AppContext, Bounds, KeyBinding, Menu, MenuItem, SystemMenuType, WindowBounds, + WindowOptions, actions, px, size, }; use radroots_app_i18n::{AppTextKey, app_text}; use radroots_app_ui::APP_UI_THEME; use crate::window::{SettingsPanelViewKey, SettingsWindowView, settings_titlebar_options}; -actions!(radroots_app, [OpenSettingsWindow, QuitApp]); +actions!(radroots_app, [OpenAboutWindow, QuitApp]); pub fn install_native_app_menu(cx: &mut App) { - cx.on_action(|_: &OpenSettingsWindow, cx| open_settings_window(cx)); + cx.on_action(|_: &OpenAboutWindow, cx| open_settings_window(cx)); cx.on_action(|_: &QuitApp, cx| cx.quit()); cx.bind_keys([ - KeyBinding::new("cmd-,", OpenSettingsWindow, None), + KeyBinding::new("cmd-,", OpenAboutWindow, None), KeyBinding::new("cmd-q", QuitApp, None), ]); @@ -21,7 +21,9 @@ pub fn install_native_app_menu(cx: &mut App) { cx.set_menus(vec![Menu { name: app_name.into(), items: vec![ - MenuItem::action(app_text(AppTextKey::MenuSettings), OpenSettingsWindow), + MenuItem::action(app_text(AppTextKey::MenuAbout), OpenAboutWindow), + MenuItem::separator(), + MenuItem::os_submenu(app_text(AppTextKey::MenuServices), SystemMenuType::Services), MenuItem::separator(), MenuItem::action(app_text(AppTextKey::MenuQuit), QuitApp), ], diff --git a/crates/launchers/desktop/src/window.rs b/crates/launchers/desktop/src/window.rs @@ -6,13 +6,10 @@ use radroots_app_core::AppRuntimeSnapshot; use radroots_app_i18n::AppTextKey; use radroots_app_ui::{ APP_UI_THEME, LabelValueRow, app_card, app_shared_text, app_window_shell, label_value_list, - runtime_metadata_rows, section_divider, settings_about_build_rows, settings_about_status_rows, - settings_account_profile_rows, settings_account_runtime_rows, settings_preferences_device_rows, - settings_preferences_general_rows, utility_title_row, + runtime_metadata_rows, section_divider, settings_about_status_rows, + settings_account_profile_rows, settings_preferences_general_rows, utility_title_row, }; -use crate::menus::OpenSettingsWindow; - pub fn home_titlebar_options() -> gpui::TitlebarOptions { gpui::TitlebarOptions { title: None, @@ -32,7 +29,7 @@ pub fn settings_titlebar_options() -> gpui::TitlebarOptions { #[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] pub enum SettingsPanelViewKey { #[default] - Accounts, + Account, Settings, About, } @@ -40,23 +37,14 @@ pub enum SettingsPanelViewKey { impl SettingsPanelViewKey { fn label_key(self) -> AppTextKey { match self { - Self::Accounts => AppTextKey::SettingsNavAccounts, + Self::Account => AppTextKey::SettingsNavAccounts, Self::Settings => AppTextKey::SettingsNavSettings, Self::About => AppTextKey::SettingsNavAbout, } } - - fn summary_key(self) -> AppTextKey { - match self { - Self::Accounts => AppTextKey::SettingsAccountsSummary, - Self::Settings => AppTextKey::SettingsPreferencesSummary, - Self::About => AppTextKey::SettingsAboutSummary, - } - } } pub struct HomeView { - snapshot: AppRuntimeSnapshot, metadata_rows: Vec<LabelValueRow>, } @@ -64,10 +52,7 @@ impl HomeView { pub fn new(snapshot: AppRuntimeSnapshot) -> Self { let metadata_rows = runtime_metadata_rows(&snapshot); - Self { - snapshot, - metadata_rows, - } + Self { metadata_rows } } } @@ -87,60 +72,14 @@ impl Render for HomeView { .p(px(APP_UI_THEME.layout.home_window_padding_px)) .flex() .flex_col() - .justify_between() .child( - div() - .flex() - .flex_col() - .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child( - div() - .text_size(px(APP_UI_THEME.typography.brand_text_px)) - .font_weight(gpui::FontWeight::SEMIBOLD) - .text_color(rgb(APP_UI_THEME.text.primary)) - .child(app_shared_text(AppTextKey::HomeBrand)), - ) - .child( - div() - .text_size(px(APP_UI_THEME.typography.body_text_px)) - .text_color(rgb(APP_UI_THEME.text.secondary)) - .child(app_shared_text(AppTextKey::HomeTitle)), - ), - ) - .child( - div() - .flex() - .flex_col() - .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child( - div() - .text_size(px(APP_UI_THEME - .typography - .utility_title_text_px)) - .text_color(rgb(APP_UI_THEME.text.secondary)) - .child(format!("v{}", self.snapshot.host.app_version)), - ) - .child( - div() - .id("home-open-settings") - .w_full() - .px(px(APP_UI_THEME - .layout - .settings_navigation_row_padding_px)) - .py(px(APP_UI_THEME - .layout - .settings_navigation_row_padding_px)) - .bg(rgb(APP_UI_THEME.surfaces.card_background)) - .rounded(px(8.0)) - .cursor_pointer() - .text_size(px(APP_UI_THEME.typography.body_text_px)) - .text_color(rgb(APP_UI_THEME.text.primary)) - .child(app_shared_text(AppTextKey::SettingsTitle)) - .on_click(|_, window, cx| { - window - .dispatch_action(Box::new(OpenSettingsWindow), cx); - }), - ), + div().flex().child( + div() + .text_size(px(APP_UI_THEME.typography.brand_text_px)) + .font_weight(gpui::FontWeight::SEMIBOLD) + .text_color(rgb(APP_UI_THEME.text.primary)) + .child(app_shared_text(AppTextKey::HomeBrand)), + ), ), ) .child( @@ -166,11 +105,6 @@ impl Render for HomeView { .w_full() .flex() .flex_col() - .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child(utility_title_row(app_shared_text( - AppTextKey::HomeMetadataTitle, - ))) - .child(section_divider()) .child(label_value_list(self.metadata_rows.clone())), )), ), @@ -225,7 +159,7 @@ impl SettingsWindowView { .text_color(rgb(foreground)) .child(app_shared_text(view.label_key())) .id(match view { - SettingsPanelViewKey::Accounts => "settings-nav-accounts", + SettingsPanelViewKey::Account => "settings-nav-accounts", SettingsPanelViewKey::Settings => "settings-nav-settings", SettingsPanelViewKey::About => "settings-nav-about", }) @@ -234,25 +168,6 @@ impl SettingsWindowView { })) } - fn summary_card(&self, view: SettingsPanelViewKey) -> impl IntoElement { - app_card( - div() - .w_full() - .flex() - .flex_col() - .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child(utility_title_row(app_shared_text(view.label_key()))) - .child(section_divider()) - .child( - div() - .w_full() - .text_size(px(APP_UI_THEME.typography.body_text_px)) - .text_color(rgb(APP_UI_THEME.text.secondary)) - .child(app_shared_text(view.summary_key())), - ), - ) - } - fn detail_card(&self, title: AppTextKey, rows: Vec<LabelValueRow>) -> impl IntoElement { app_card( div() @@ -278,14 +193,9 @@ impl SettingsWindowView { .flex() .flex_col() .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child(self.summary_card(SettingsPanelViewKey::Accounts)) .child(self.detail_card( - AppTextKey::SettingsAccountsProfileTitle, + AppTextKey::SettingsNavAccounts, settings_account_profile_rows(), - )) - .child(self.detail_card( - AppTextKey::SettingsAccountsRuntimeTitle, - settings_account_runtime_rows(), )), ) } @@ -302,14 +212,9 @@ impl SettingsWindowView { .flex() .flex_col() .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child(self.summary_card(SettingsPanelViewKey::Settings)) .child(self.detail_card( - AppTextKey::SettingsPreferencesGeneralTitle, + AppTextKey::SettingsGeneralSectionLabel, settings_preferences_general_rows(), - )) - .child(self.detail_card( - AppTextKey::SettingsPreferencesDeviceTitle, - settings_preferences_device_rows(), )), ) } @@ -326,21 +231,18 @@ impl SettingsWindowView { .flex() .flex_col() .gap(px(APP_UI_THEME.layout.home_stack_gap_px)) - .child(self.summary_card(SettingsPanelViewKey::About)) - .child(self.detail_card( - AppTextKey::SettingsAboutBuildTitle, - settings_about_build_rows(), - )) - .child(self.detail_card( - AppTextKey::SettingsAboutStatusTitle, - settings_about_status_rows(), - )), + .child( + self.detail_card( + AppTextKey::SettingsNavAbout, + settings_about_status_rows(), + ), + ), ) } fn settings_panel_content(&self) -> AnyElement { match self.selected_view { - SettingsPanelViewKey::Accounts => self.accounts_panel().into_any_element(), + SettingsPanelViewKey::Account => self.accounts_panel().into_any_element(), SettingsPanelViewKey::Settings => self.settings_panel().into_any_element(), SettingsPanelViewKey::About => self.about_panel().into_any_element(), } @@ -408,7 +310,7 @@ impl Render for SettingsWindowView { .flex_col() .gap(px(APP_UI_THEME.layout.settings_navigation_row_gap_px)) .bg(rgb(APP_UI_THEME.surfaces.panel_background)) - .child(self.navigation_button(SettingsPanelViewKey::Accounts, cx)) + .child(self.navigation_button(SettingsPanelViewKey::Account, cx)) .child(self.navigation_button(SettingsPanelViewKey::Settings, cx)) .child(self.navigation_button(SettingsPanelViewKey::About, cx)), ) diff --git a/crates/shared/i18n/src/keys.rs b/crates/shared/i18n/src/keys.rs @@ -22,47 +22,37 @@ macro_rules! define_app_text_keys { define_app_text_keys! { AppName => "app.name", HomeBrand => "home.brand", - HomeTitle => "home.title", - HomeMetadataTitle => "home.metadata_title", - MenuSettings => "menu.settings", MenuQuit => "menu.quit", + MenuAbout => "menu.about", + MenuServices => "menu.services", SettingsTitle => "settings.title", SettingsNavAccounts => "settings.nav.accounts", SettingsNavSettings => "settings.nav.settings", SettingsNavAbout => "settings.nav.about", - SettingsAccountsSummary => "settings.accounts.summary", - SettingsAccountsProfileTitle => "settings.accounts.profile.title", - SettingsAccountsIdentityLabel => "settings.accounts.identity.label", - SettingsAccountsIdentityValue => "settings.accounts.identity.value", - SettingsAccountsStatusLabel => "settings.accounts.status.label", - SettingsAccountsStatusValue => "settings.accounts.status.value", - SettingsAccountsRuntimeTitle => "settings.accounts.runtime.title", - SettingsAccountsSyncLabel => "settings.accounts.sync.label", - SettingsAccountsSyncValue => "settings.accounts.sync.value", - SettingsAccountsRecoveryLabel => "settings.accounts.recovery.label", - SettingsAccountsRecoveryValue => "settings.accounts.recovery.value", - SettingsPreferencesSummary => "settings.preferences.summary", - SettingsPreferencesGeneralTitle => "settings.preferences.general.title", - SettingsPreferencesLaunchLabel => "settings.preferences.launch.label", - SettingsPreferencesLaunchValue => "settings.preferences.launch.value", - SettingsPreferencesNetworkLabel => "settings.preferences.network.label", - SettingsPreferencesNetworkValue => "settings.preferences.network.value", - SettingsPreferencesDeviceTitle => "settings.preferences.device.title", - SettingsPreferencesNotificationsLabel => "settings.preferences.notifications.label", - SettingsPreferencesNotificationsValue => "settings.preferences.notifications.value", - SettingsPreferencesDiagnosticsLabel => "settings.preferences.diagnostics.label", - SettingsPreferencesDiagnosticsValue => "settings.preferences.diagnostics.value", - SettingsAboutSummary => "settings.about.summary", - SettingsAboutBuildTitle => "settings.about.build.title", - SettingsAboutShellLabel => "settings.about.shell.label", - SettingsAboutShellValue => "settings.about.shell.value", - SettingsAboutLicenseLabel => "settings.about.license.label", - SettingsAboutLicenseValue => "settings.about.license.value", - SettingsAboutStatusTitle => "settings.about.status.title", - SettingsAboutPostureLabel => "settings.about.posture.label", - SettingsAboutPostureValue => "settings.about.posture.value", - SettingsAboutMilestoneLabel => "settings.about.milestone.label", - SettingsAboutMilestoneValue => "settings.about.milestone.value", + SettingsAccountProfileLabel => "settings.account.profile.label", + SettingsAccountStatusLabel => "settings.account.status.label", + SettingsAccountStatusLoggedIn => "settings.account.status.logged_in", + SettingsAccountStatusLoggedOut => "settings.account.status.logged_out", + SettingsAccountPlaceholderName => "settings.account.placeholder_name", + SettingsAccountPlaceholderHandle => "settings.account.placeholder_handle", + SettingsAccountAddAction => "settings.account.action.add_account", + SettingsAccountLogOutAction => "settings.account.action.log_out", + SettingsAccountAdminConsoleAction => "settings.account.action.admin_console", + SettingsViewAccount => "settings.view.account", + SettingsViewSettings => "settings.view.settings", + SettingsViewAbout => "settings.view.about", + SettingsGeneralSectionLabel => "settings.general.section.label", + SettingsGeneralAllowRelayConnections => "settings.general.allow_relay_connections", + SettingsGeneralUseMediaServers => "settings.general.use_media_servers", + SettingsGeneralUseNip05 => "settings.general.use_nip05", + SettingsGeneralLaunchAtLogin => "settings.general.launch_at_login", + SettingsGeneralManageAction => "settings.general.action.manage", + SettingsGeneralUseNip05Note => "settings.general.use_nip05.note", + SettingsAboutPlaceholderTopPrimary => "settings.about.placeholder.top_primary", + SettingsAboutPlaceholderTopSecondary => "settings.about.placeholder.top_secondary", + SettingsAboutPlaceholderTopTertiary => "settings.about.placeholder.top_tertiary", + SettingsAboutPlaceholderMiddle => "settings.about.placeholder.middle", + SettingsAboutPlaceholderBottom => "settings.about.placeholder.bottom", MetadataCorePackage => "metadata.core_package", MetadataCoreVersion => "metadata.core_version", MetadataCoreAuthors => "metadata.core_authors", @@ -83,6 +73,8 @@ define_app_text_keys! { MetadataRuntimeMode => "metadata.runtime_mode", MetadataRunId => "metadata.run_id", ValueNone => "value.none", + ValueEnabled => "value.enabled", + ValueDisabled => "value.disabled", ValueRuntimeModeDevelopment => "value.runtime_mode.development", ValueRuntimeModeProduction => "value.runtime_mode.production", } diff --git a/crates/shared/ui/src/lib.rs b/crates/shared/ui/src/lib.rs @@ -11,9 +11,8 @@ pub use primitives::{ status_indicator, utility_title_row, }; pub use text::{ - app_shared_text, runtime_metadata_rows, settings_about_build_rows, settings_about_status_rows, - settings_account_profile_rows, settings_account_runtime_rows, settings_preferences_device_rows, - settings_preferences_general_rows, + app_shared_label_text, app_shared_text, runtime_metadata_rows, settings_about_status_rows, + settings_account_profile_rows, settings_preferences_general_rows, }; pub use theme::{ APP_UI_THEME, ActionButtonColors, ActionButtonSizing, ActionButtonTokens, AppControlTokens, diff --git a/crates/shared/ui/src/primitives.rs b/crates/shared/ui/src/primitives.rs @@ -431,6 +431,9 @@ mod tests { assert_eq!(spec.id, "launch"); assert_eq!(spec.label.as_ref(), "Launch at login"); - assert_eq!(spec.note.as_ref().map(|note| note.as_ref()), Some("Optional note")); + assert_eq!( + spec.note.as_ref().map(|note| note.as_ref()), + Some("Optional note") + ); } } diff --git a/crates/shared/ui/src/text.rs b/crates/shared/ui/src/text.rs @@ -8,6 +8,10 @@ pub fn app_shared_text(key: AppTextKey) -> SharedString { app_text(key).into() } +pub fn app_shared_label_text(key: AppTextKey) -> SharedString { + format!("{}:", app_text(key)).into() +} + pub fn runtime_metadata_rows(snapshot: &AppRuntimeSnapshot) -> Vec<LabelValueRow> { vec![ metadata_row( @@ -90,25 +94,12 @@ pub fn runtime_metadata_rows(snapshot: &AppRuntimeSnapshot) -> Vec<LabelValueRow pub fn settings_account_profile_rows() -> Vec<LabelValueRow> { vec![ text_row( - AppTextKey::SettingsAccountsIdentityLabel, - AppTextKey::SettingsAccountsIdentityValue, + AppTextKey::SettingsAccountProfileLabel, + AppTextKey::SettingsAccountPlaceholderHandle, ), text_row( - AppTextKey::SettingsAccountsStatusLabel, - AppTextKey::SettingsAccountsStatusValue, - ), - ] -} - -pub fn settings_account_runtime_rows() -> Vec<LabelValueRow> { - vec![ - text_row( - AppTextKey::SettingsAccountsSyncLabel, - AppTextKey::SettingsAccountsSyncValue, - ), - text_row( - AppTextKey::SettingsAccountsRecoveryLabel, - AppTextKey::SettingsAccountsRecoveryValue, + AppTextKey::SettingsAccountStatusLabel, + AppTextKey::SettingsAccountStatusLoggedIn, ), ] } @@ -116,51 +107,37 @@ pub fn settings_account_runtime_rows() -> Vec<LabelValueRow> { pub fn settings_preferences_general_rows() -> Vec<LabelValueRow> { vec![ text_row( - AppTextKey::SettingsPreferencesLaunchLabel, - AppTextKey::SettingsPreferencesLaunchValue, + AppTextKey::SettingsGeneralAllowRelayConnections, + AppTextKey::ValueEnabled, ), text_row( - AppTextKey::SettingsPreferencesNetworkLabel, - AppTextKey::SettingsPreferencesNetworkValue, + AppTextKey::SettingsGeneralUseMediaServers, + AppTextKey::ValueEnabled, ), - ] -} - -pub fn settings_preferences_device_rows() -> Vec<LabelValueRow> { - vec![ text_row( - AppTextKey::SettingsPreferencesNotificationsLabel, - AppTextKey::SettingsPreferencesNotificationsValue, + AppTextKey::SettingsGeneralUseNip05, + AppTextKey::ValueEnabled, ), text_row( - AppTextKey::SettingsPreferencesDiagnosticsLabel, - AppTextKey::SettingsPreferencesDiagnosticsValue, + AppTextKey::SettingsGeneralLaunchAtLogin, + AppTextKey::ValueDisabled, ), ] } -pub fn settings_about_build_rows() -> Vec<LabelValueRow> { +pub fn settings_about_status_rows() -> Vec<LabelValueRow> { vec![ text_row( - AppTextKey::SettingsAboutShellLabel, - AppTextKey::SettingsAboutShellValue, - ), - text_row( - AppTextKey::SettingsAboutLicenseLabel, - AppTextKey::SettingsAboutLicenseValue, + AppTextKey::SettingsViewAbout, + AppTextKey::SettingsAboutPlaceholderTopPrimary, ), - ] -} - -pub fn settings_about_status_rows() -> Vec<LabelValueRow> { - vec![ text_row( - AppTextKey::SettingsAboutPostureLabel, - AppTextKey::SettingsAboutPostureValue, + AppTextKey::SettingsGeneralSectionLabel, + AppTextKey::SettingsAboutPlaceholderMiddle, ), text_row( - AppTextKey::SettingsAboutMilestoneLabel, - AppTextKey::SettingsAboutMilestoneValue, + AppTextKey::SettingsAccountProfileLabel, + AppTextKey::SettingsAboutPlaceholderBottom, ), ] } @@ -231,10 +208,12 @@ mod tests { assert!( general_rows .iter() - .any(|row| row.label == "launch behavior" && row.value == "manual launch only") + .any(|row| row.label == "allow relay connections" && row.value == "enabled") + ); + assert!( + about_rows + .iter() + .any(|row| { row.label == "about" && row.value == "About placeholder primary" }) ); - assert!(about_rows.iter().any(|row| { - row.label == "next milestone" && row.value == "interactive account flows" - })); } } diff --git a/crates/shared/ui/src/theme.rs b/crates/shared/ui/src/theme.rs @@ -302,7 +302,12 @@ mod tests { assert_eq!(APP_UI_THEME.layout.settings_chrome_height_px, 88.0); assert_eq!(APP_UI_THEME.layout.settings_content_padding_px, 24.0); assert_eq!(APP_UI_THEME.layout.settings_account_sidebar_width_px, 200.0); - assert_eq!(APP_UI_THEME.layout.settings_account_sidebar_button_height_px, 42.0); + assert_eq!( + APP_UI_THEME + .layout + .settings_account_sidebar_button_height_px, + 42.0 + ); } #[test] diff --git a/i18n/locales/en/messages.json b/i18n/locales/en/messages.json @@ -1,47 +1,37 @@ { - "app.name": "radroots", + "app.name": "Radroots", "home.brand": "radroots", - "home.title": "home", - "home.metadata_title": "runtime metadata", - "menu.settings": "settings", - "menu.quit": "quit radroots", - "settings.title": "settings", - "settings.nav.accounts": "accounts", - "settings.nav.settings": "settings", - "settings.nav.about": "about", - "settings.accounts.summary": "prepare local identity, sign-in, and recovery flows for future radroots releases.", - "settings.accounts.profile.title": "profile", - "settings.accounts.identity.label": "local identity", - "settings.accounts.identity.value": "radroots local profile", - "settings.accounts.status.label": "sign-in state", - "settings.accounts.status.value": "not signed in", - "settings.accounts.runtime.title": "runtime", - "settings.accounts.sync.label": "sync posture", - "settings.accounts.sync.value": "single-device placeholder", - "settings.accounts.recovery.label": "recovery", - "settings.accounts.recovery.value": "not configured", - "settings.preferences.summary": "configure app behavior, device defaults, and diagnostics posture as these controls land.", - "settings.preferences.general.title": "general", - "settings.preferences.launch.label": "launch behavior", - "settings.preferences.launch.value": "manual launch only", - "settings.preferences.network.label": "network posture", - "settings.preferences.network.value": "default runtime transport", - "settings.preferences.device.title": "device state", - "settings.preferences.notifications.label": "notifications", - "settings.preferences.notifications.value": "not requested", - "settings.preferences.diagnostics.label": "diagnostics", - "settings.preferences.diagnostics.value": "runtime metadata only", - "settings.about.summary": "this app is a native radroots runtime under active development.", - "settings.about.build.title": "build", - "settings.about.shell.label": "shell", - "settings.about.shell.value": "gpui native macos window", - "settings.about.license.label": "license", - "settings.about.license.value": "gpl-3.0", - "settings.about.status.title": "status", - "settings.about.posture.label": "current posture", - "settings.about.posture.value": "bootstrap placeholder shell", - "settings.about.milestone.label": "next milestone", - "settings.about.milestone.value": "interactive account flows", + "menu.about": "About Radroots", + "menu.services": "Services", + "menu.quit": "Quit Radroots", + "settings.title": "Radroots Settings", + "settings.nav.accounts": "Accounts", + "settings.nav.settings": "Settings", + "settings.nav.about": "About", + "settings.account.profile.label": "Profile", + "settings.account.status.label": "Status", + "settings.account.status.logged_in": "Logged In", + "settings.account.status.logged_out": "Logged Out", + "settings.account.placeholder_name": "Test User", + "settings.account.placeholder_handle": "test.user", + "settings.account.action.add_account": "Add Account...", + "settings.account.action.log_out": "Log Out", + "settings.account.action.admin_console": "Admin Console...", + "settings.view.account": "account", + "settings.view.settings": "settings", + "settings.view.about": "about", + "settings.general.section.label": "General", + "settings.general.allow_relay_connections": "Allow relay connections", + "settings.general.use_media_servers": "Use Radroots media servers", + "settings.general.use_nip05": "Use Radroots NIP-05", + "settings.general.launch_at_login": "Launch Radroots at login", + "settings.general.action.manage": "Manage...", + "settings.general.use_nip05.note": "A kind-0 metadata event will be posted including your NIP-05 profile name and a request will be sent to radroots over NIP-96 to reserve your configured username", + "settings.about.placeholder.top_primary": "About placeholder primary", + "settings.about.placeholder.top_secondary": "About placeholder secondary", + "settings.about.placeholder.top_tertiary": "About placeholder tertiary", + "settings.about.placeholder.middle": "About placeholder middle section", + "settings.about.placeholder.bottom": "About placeholder bottom section", "metadata.core_package": "core package", "metadata.core_version": "core version", "metadata.core_authors": "core authors", @@ -62,6 +52,8 @@ "metadata.runtime_mode": "runtime mode", "metadata.run_id": "run id", "value.none": "none", + "value.enabled": "enabled", + "value.disabled": "disabled", "value.runtime_mode.development": "development", "value.runtime_mode.production": "production" }