diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs index 456a644b64..e8d911d514 100644 --- a/core/embed/rust/src/translations/generated/translated_string.rs +++ b/core/embed/rust/src/translations/generated/translated_string.rs @@ -851,7 +851,7 @@ pub enum TranslatedString { reset__recovery_share_title_template = 567, // "Recovery share #{0}" reset__required_number_of_groups = 568, // "The required number of groups for recovery." reset__select_correct_word = 569, // "Select the correct word for each position." - reset__select_word_template = 570, // {"Bolt": "Select {0} word", "Caesar": "Select {0} word", "Delizia": "Select {0} word", "Eckhart": "Select word #{0} from your wallet backup"} + reset__select_word_template = 570, // {"Bolt": "Select {0} word", "Caesar": "Select {0} word", "Delizia": "Select {0} word", "Eckhart": "Select word no. {0} from your wallet backup"} reset__select_word_x_of_y_template = 571, // "Select word {0} of {1}:" reset__set_it_to_count_template = 572, // "Set it to {0} and you will need " reset__share_checked_successfully_template = 573, // "Share #{0} checked successfully." @@ -1273,7 +1273,7 @@ pub enum TranslatedString { auto_lock__turned_on = 879, // "Auto-lock turned on" backup__info_multi_share_backup = 880, // "Your wallet backup contains multiple lists of words in a specific order (shares)." backup__info_single_share_backup = 881, // "Your wallet backup contains {0} words in a specific order." - backup__title_backup_completed = 882, // "Wallet backup completed" + backup__title_backup_completed = 882, // {"Bolt": "Wallet backup completed", "Caesar": "Wallet backup completed", "Delizia": "Wallet backup completed", "Eckhart": "Wallet backup completed."} backup__title_create_wallet_backup = 883, // "Create wallet backup" haptic_feedback__disable = 884, // "Disable haptic feedback?" haptic_feedback__enable = 885, // "Enable haptic feedback?" @@ -1297,7 +1297,7 @@ pub enum TranslatedString { recovery__info_about_disconnect = 904, // "It's safe to disconnect your Trezor while recovering your wallet and continue later." recovery__share_does_not_match = 905, // "Share doesn't match" reset__cancel_create_wallet = 906, // "Cancel create wallet" - reset__incorrect_word_selected = 907, // "Incorrect word selected" + reset__incorrect_word_selected = 907, // {"Bolt": "Incorrect word selected", "Caesar": "Incorrect word selected", "Delizia": "Incorrect word selected", "Eckhart": "Incorrect word selected."} reset__more_at = 908, // "More at" reset__num_of_shares_how_many = 909, // "How many wallet backup shares do you want to create?" reset__num_of_shares_long_info_template = 910, // "Each backup share is a sequence of {0} words. Store each wordlist in a separate, safe location or share with trusted individuals. Collect as needed to recover your wallet." @@ -1316,7 +1316,7 @@ pub enum TranslatedString { words__good_to_know = 927, // "Good to know" words__operation_cancelled = 928, // "Operation cancelled" words__settings = 929, // "Settings" - words__try_again = 930, // "Try again." + words__try_again = 930, // {"Bolt": "Try again.", "Caesar": "Try again.", "Delizia": "Try again.", "Eckhart": "Try again"} reset__slip39_checklist_num_groups_x_template = 931, // "Number of groups: {0}" brightness__title = 932, // "Display brightness" recovery__title_unlock_repeated_backup = 933, // "Multi-share backup" @@ -2273,7 +2273,7 @@ impl TranslatedString { #[cfg(feature = "layout_delizia")] Self::reset__select_word_template => "Select {0} word", #[cfg(feature = "layout_eckhart")] - Self::reset__select_word_template => "Select word #{0} from your wallet backup", + Self::reset__select_word_template => "Select word no. {0} from your wallet backup", Self::reset__select_word_x_of_y_template => "Select word {0} of {1}:", Self::reset__set_it_to_count_template => "Set it to {0} and you will need ", Self::reset__share_checked_successfully_template => "Share #{0} checked successfully.", @@ -2709,7 +2709,14 @@ impl TranslatedString { Self::auto_lock__turned_on => "Auto-lock turned on", Self::backup__info_multi_share_backup => "Your wallet backup contains multiple lists of words in a specific order (shares).", Self::backup__info_single_share_backup => "Your wallet backup contains {0} words in a specific order.", + #[cfg(feature = "layout_bolt")] Self::backup__title_backup_completed => "Wallet backup completed", + #[cfg(feature = "layout_caesar")] + Self::backup__title_backup_completed => "Wallet backup completed", + #[cfg(feature = "layout_delizia")] + Self::backup__title_backup_completed => "Wallet backup completed", + #[cfg(feature = "layout_eckhart")] + Self::backup__title_backup_completed => "Wallet backup completed.", Self::backup__title_create_wallet_backup => "Create wallet backup", Self::haptic_feedback__disable => "Disable haptic feedback?", Self::haptic_feedback__enable => "Enable haptic feedback?", @@ -2740,7 +2747,14 @@ impl TranslatedString { Self::recovery__info_about_disconnect => "It's safe to disconnect your Trezor while recovering your wallet and continue later.", Self::recovery__share_does_not_match => "Share doesn't match", Self::reset__cancel_create_wallet => "Cancel create wallet", + #[cfg(feature = "layout_bolt")] Self::reset__incorrect_word_selected => "Incorrect word selected", + #[cfg(feature = "layout_caesar")] + Self::reset__incorrect_word_selected => "Incorrect word selected", + #[cfg(feature = "layout_delizia")] + Self::reset__incorrect_word_selected => "Incorrect word selected", + #[cfg(feature = "layout_eckhart")] + Self::reset__incorrect_word_selected => "Incorrect word selected.", Self::reset__more_at => "More at", Self::reset__num_of_shares_how_many => "How many wallet backup shares do you want to create?", Self::reset__num_of_shares_long_info_template => "Each backup share is a sequence of {0} words. Store each wordlist in a separate, safe location or share with trusted individuals. Collect as needed to recover your wallet.", @@ -2759,7 +2773,14 @@ impl TranslatedString { Self::words__good_to_know => "Good to know", Self::words__operation_cancelled => "Operation cancelled", Self::words__settings => "Settings", + #[cfg(feature = "layout_bolt")] Self::words__try_again => "Try again.", + #[cfg(feature = "layout_caesar")] + Self::words__try_again => "Try again.", + #[cfg(feature = "layout_delizia")] + Self::words__try_again => "Try again.", + #[cfg(feature = "layout_eckhart")] + Self::words__try_again => "Try again", Self::reset__slip39_checklist_num_groups_x_template => "Number of groups: {0}", Self::brightness__title => "Display brightness", Self::recovery__title_unlock_repeated_backup => "Multi-share backup", diff --git a/core/embed/rust/src/ui/layout_eckhart/component/select_word_screen.rs b/core/embed/rust/src/ui/layout_eckhart/component/select_word_screen.rs index ba25df94b0..2e4bc2ef7e 100644 --- a/core/embed/rust/src/ui/layout_eckhart/component/select_word_screen.rs +++ b/core/embed/rust/src/ui/layout_eckhart/component/select_word_screen.rs @@ -27,10 +27,10 @@ pub enum SelectWordMsg { } impl SelectWordScreen { - const INSET: i16 = 24; - const DESCRIPTION_HEIGHT: i16 = 52; - const BUTTON_RADIUS: u8 = 12; - + const DESCRIPTION_HEIGHT: i16 = 58; + const MENU_HEIGHT: i16 = 360; + const DESCRIPTION_PADDING: i16 = 24; + const MENU_PADDING: i16 = 12; pub fn new( share_words_vec: [TString<'static>; MAX_WORD_QUIZ_ITEMS], description: TString<'static>, @@ -41,14 +41,14 @@ impl SelectWordScreen { menu = menu.item( Button::with_text(word) .styled(theme::button_select_word()) - .with_radius(Self::BUTTON_RADIUS), + .with_radius(12), ); } Self { header: Header::new(TString::empty()), description: Label::new(description, Alignment::Start, theme::TEXT_MEDIUM) - .vertically_centered(), + .top_aligned(), menu, } } @@ -69,10 +69,10 @@ impl Component for SelectWordScreen { let (header_area, rest) = bounds.split_top(Header::HEADER_HEIGHT); let (description_area, rest) = rest.split_top(Self::DESCRIPTION_HEIGHT); - let (_, rest) = rest.split_top(Self::INSET); - let (menu_area, _) = rest.split_bottom(Self::INSET); + let (menu_area, _) = rest.split_top(Self::MENU_HEIGHT); - let description_area = description_area.inset(Insets::sides(Self::INSET)); + let description_area = description_area.inset(Insets::sides(Self::DESCRIPTION_PADDING)); + let menu_area = menu_area.inset(Insets::sides(Self::MENU_PADDING)); self.menu.place(menu_area); self.description.place(description_area); @@ -106,3 +106,19 @@ impl crate::trace::Trace for SelectWordScreen { t.component("SelectWordScreen"); } } + +#[cfg(test)] +mod tests { + use super::{super::super::constant::SCREEN, *}; + + #[test] + fn test_component_heights_fit_screen() { + assert!( + SelectWordScreen::DESCRIPTION_HEIGHT + + SelectWordScreen::MENU_HEIGHT + + Header::HEADER_HEIGHT + <= SCREEN.height(), + "Components overflow the screen height", + ); + } +} diff --git a/core/embed/rust/src/ui/layout_eckhart/component/share_words.rs b/core/embed/rust/src/ui/layout_eckhart/component/share_words.rs index 3742648a3e..d3f73c341e 100644 --- a/core/embed/rust/src/ui/layout_eckhart/component/share_words.rs +++ b/core/embed/rust/src/ui/layout_eckhart/component/share_words.rs @@ -88,11 +88,8 @@ impl<'a> ShareWordsScreen<'a> { // Update hint content based on the current page - // First word gets a special hint - if self.content.pager().is_first() { - self.hint = Hint::new_instruction(TR::reset__share_words_first, Some(theme::ICON_INFO)); // Repeated words get a special hint - } else if self.content.is_repeated() { + if self.content.is_repeated() { self.hint = Hint::new_instruction_green( TR::reset__the_word_is_repeated, Some(theme::ICON_INFO), diff --git a/core/embed/rust/src/ui/layout_eckhart/flow/show_share_words.rs b/core/embed/rust/src/ui/layout_eckhart/flow/show_share_words.rs index fbf582beb9..f2f6f624ac 100644 --- a/core/embed/rust/src/ui/layout_eckhart/flow/show_share_words.rs +++ b/core/embed/rust/src/ui/layout_eckhart/flow/show_share_words.rs @@ -4,11 +4,8 @@ use crate::{ translations::TR, ui::{ component::{ - text::{ - op::OpTextLayout, - paragraphs::{Paragraph, ParagraphSource}, - }, - ComponentExt, FormattedText, + text::paragraphs::{Paragraph, ParagraphSource, ParagraphVecShort}, + ComponentExt, }, flow::{ base::{Decision, DecisionBuilder as _}, @@ -24,7 +21,7 @@ use super::super::{ component::{ ActionBar, Button, Header, ShareWordsScreen, ShareWordsScreenMsg, TextScreen, TextScreenMsg, }, - fonts, theme, + theme, }; #[derive(Copy, Clone, PartialEq, Eq)] @@ -32,6 +29,7 @@ pub enum ShowShareWords { Instruction, ShareWords, Confirm, + CheckBackupIntro, } impl FlowController for ShowShareWords { @@ -53,7 +51,8 @@ impl FlowController for ShowShareWords { (Self::ShareWords, FlowMsg::Cancelled) => Self::Instruction.goto(), (Self::ShareWords, FlowMsg::Confirmed) => Self::Confirm.goto(), (Self::Confirm, FlowMsg::Cancelled) => Self::ShareWords.goto(), - (Self::Confirm, FlowMsg::Confirmed) => self.return_msg(FlowMsg::Confirmed), + (Self::Confirm, FlowMsg::Confirmed) => Self::CheckBackupIntro.goto(), + (Self::CheckBackupIntro, FlowMsg::Confirmed) => self.return_msg(FlowMsg::Confirmed), _ => self.do_nothing(), } } @@ -62,19 +61,18 @@ impl FlowController for ShowShareWords { pub fn new_show_share_words_flow( words: Vec, 33>, _subtitle: TString<'static>, - instruction: Paragraph<'static>, + instructions_paragraphs: ParagraphVecShort<'static>, text_confirm: TString<'static>, ) -> Result { let instruction = TextScreen::new( - instruction + instructions_paragraphs .into_paragraphs() - .with_placement(LinearPlacement::vertical()), + .with_placement(LinearPlacement::vertical().with_spacing(24)), ) .with_header(Header::new(TR::reset__recovery_wallet_backup_title.into())) - .with_action_bar(ActionBar::new_double( - Button::with_icon(theme::ICON_CHEVRON_UP), - Button::with_text(TR::buttons__continue.into()), - )) + .with_action_bar(ActionBar::new_single(Button::with_text( + TR::buttons__continue.into(), + ))) .map(|msg| match msg { TextScreenMsg::Cancelled => Some(FlowMsg::Cancelled), TextScreenMsg::Confirmed => Some(FlowMsg::Confirmed), @@ -86,13 +84,14 @@ pub fn new_show_share_words_flow( ShareWordsScreenMsg::Confirmed => Some(FlowMsg::Confirmed), }); - let op_confirm = - OpTextLayout::new(theme::TEXT_NORMAL).text(text_confirm, fonts::FONT_SATOSHI_REGULAR_38); + let confirm_paragraphs = Paragraph::new(&theme::TEXT_REGULAR, text_confirm) + .into_paragraphs() + .with_placement(LinearPlacement::vertical()); - let confirm = TextScreen::new(FormattedText::new(op_confirm)) + let confirm = TextScreen::new(confirm_paragraphs) .with_header(Header::new(TR::reset__recovery_wallet_backup_title.into())) .with_action_bar(ActionBar::new_double( - Button::with_icon(theme::ICON_CHEVRON_LEFT), + Button::with_icon(theme::ICON_CHEVRON_UP), Button::with_text(TR::buttons__hold_to_confirm.into()) .styled(theme::button_confirm()) .with_long_press(theme::CONFIRM_HOLD_DURATION), @@ -103,9 +102,25 @@ pub fn new_show_share_words_flow( TextScreenMsg::Menu => Some(FlowMsg::Cancelled), }); + let check_backup_paragraphs = + Paragraph::new(&theme::TEXT_REGULAR, TR::reset__check_backup_instructions) + .into_paragraphs() + .with_placement(LinearPlacement::vertical()); + + let check_backup_intro = TextScreen::new(check_backup_paragraphs) + .with_header(Header::new(TR::reset__check_wallet_backup_title.into())) + .with_action_bar(ActionBar::new_single(Button::with_text( + TR::buttons__continue.into(), + ))) + .map(|msg| match msg { + TextScreenMsg::Confirmed => Some(FlowMsg::Confirmed), + _ => None, + }); + let res = SwipeFlow::new(&ShowShareWords::Instruction)? .with_page(&ShowShareWords::Instruction, instruction)? .with_page(&ShowShareWords::ShareWords, share_words)? - .with_page(&ShowShareWords::Confirm, confirm)?; + .with_page(&ShowShareWords::Confirm, confirm)? + .with_page(&ShowShareWords::CheckBackupIntro, check_backup_intro)?; Ok(res) } diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs index 8e69186fca..6699214ba6 100644 --- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs +++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs @@ -12,6 +12,7 @@ use crate::{ }, Empty, FormattedText, }, + geometry::LinearPlacement, layout::{ obj::{LayoutMaybeTrace, LayoutObj, RootComponent}, util::{ConfirmValueParams, RecoveryType, StrOrBytes}, @@ -420,10 +421,7 @@ impl FirmwareUI for UIEckhart { description: TString<'static>, words: [TString<'static>; MAX_WORD_QUIZ_ITEMS], ) -> Result { - let component = SelectWordScreen::new(words, description).with_header( - Header::new(title) - .with_right_button(Button::with_icon(theme::ICON_MENU), HeaderMsg::Cancelled), - ); + let component = SelectWordScreen::new(words, description).with_header(Header::new(title)); let layout = RootComponent::new(component); @@ -628,17 +626,16 @@ impl FirmwareUI for UIEckhart { _text_footer: Option>, text_confirm: TString<'static>, ) -> Result { - // TODO: add support for multiple instructions - let instruction: TString = IterBuf::new() - .try_iterate(instructions)? - .next() - .unwrap() - .try_into()?; + let mut instructions_paragraphs = ParagraphVecShort::new(); + for item in IterBuf::new().try_iterate(instructions)? { + let text: TString = item.try_into()?; + instructions_paragraphs.add(Paragraph::new(&theme::TEXT_REGULAR, text)); + } let flow = flow::show_share_words::new_show_share_words_flow( words, subtitle.unwrap_or(TString::empty()), - Paragraph::new(&theme::TEXT_REGULAR, instruction), + instructions_paragraphs, text_confirm, )?; Ok(flow) @@ -674,8 +671,12 @@ impl FirmwareUI for UIEckhart { allow_cancel: bool, _time_ms: u32, ) -> Result, Error> { - let paragraphs = Paragraph::new(&theme::TEXT_REGULAR, description).into_paragraphs(); - let header = Header::new(title).with_icon(theme::ICON_DONE, theme::GREEN_LIGHT); + let paragraphs = Paragraph::new(&theme::TEXT_REGULAR, description) + .into_paragraphs() + .with_placement(LinearPlacement::vertical()); + let header = Header::new(title) + .with_icon(theme::ICON_DONE, theme::GREEN_LIGHT) + .with_text_style(theme::label_title_confirm()); let action_bar = if allow_cancel { ActionBar::new_double( Button::with_icon(theme::ICON_CROSS), @@ -704,18 +705,27 @@ impl FirmwareUI for UIEckhart { value: TString<'static>, description: TString<'static>, allow_cancel: bool, - _danger: bool, // TODO: review if `danger` needed in all layouts since we have show_danger + danger: bool, ) -> Result, Error> { let paragraphs = ParagraphVecShort::from_iter([ Paragraph::new(&theme::TEXT_SMALL, description), Paragraph::new(&theme::TEXT_REGULAR, value), ]) - .into_paragraphs(); + .into_paragraphs() + .with_placement(LinearPlacement::vertical()); - let header = Header::new(title).with_icon(theme::ICON_INFO, theme::GREEN_LIGHT); + let (color, style) = if danger { + (theme::ORANGE, theme::label_title_danger()) + } else { + (theme::YELLOW, theme::label_title_warning()) + }; + + let header = Header::new(title) + .with_icon(theme::ICON_INFO, color) + .with_text_style(style); let action_bar = if allow_cancel { ActionBar::new_double( - Button::with_icon(theme::ICON_CROSS), + Button::with_icon(theme::ICON_CROSS).styled(theme::button_cancel()), Button::with_text(button), ) } else { diff --git a/core/src/trezor/ui/layouts/eckhart/__init__.py b/core/src/trezor/ui/layouts/eckhart/__init__.py index 5468ea9412..4baade25ee 100644 --- a/core/src/trezor/ui/layouts/eckhart/__init__.py +++ b/core/src/trezor/ui/layouts/eckhart/__init__.py @@ -95,7 +95,12 @@ def confirm_reset_device(recovery: bool = False) -> Awaitable[None]: async def show_wallet_created_success() -> None: await interact( - trezorui_api.show_success(title=TR.backup__new_wallet_created, button=""), + trezorui_api.show_success( + title=TR.words__title_done, + description=TR.backup__new_wallet_created, + button=TR.buttons__continue, + allow_cancel=False, + ), "backup_device", ButtonRequestType.ResetDevice, ) diff --git a/core/src/trezor/ui/layouts/eckhart/reset.py b/core/src/trezor/ui/layouts/eckhart/reset.py index 459a44ec14..8e691755c1 100644 --- a/core/src/trezor/ui/layouts/eckhart/reset.py +++ b/core/src/trezor/ui/layouts/eckhart/reset.py @@ -27,8 +27,10 @@ def show_share_words( words_count = len(share_words) description = None # Eckhart currently has only one instruction, other are shown in the hint area - instructions = [TR.reset__write_down_words_template.format(words_count)] - assert len(instructions) == 1 + instructions = [ + TR.reset__write_down_words_template.format(words_count), + TR.reset__words_may_repeat, + ] text_confirm = TR.reset__words_written_down_template.format(words_count) return raise_if_not_confirmed( @@ -283,6 +285,7 @@ async def show_intro_backup(single_share: bool, num_of_words: int | None) -> Non trezorui_api.show_info( title=TR.backup__title_create_wallet_backup, description=description, + button=TR.buttons__continue ), "backup_intro", ButtonRequestType.ResetDevice, @@ -294,7 +297,7 @@ def show_warning_backup() -> Awaitable[ui.UiResult]: trezorui_api.show_warning( title=TR.words__important, value=TR.reset__never_make_digital_copy, - button="", + button=TR.buttons__continue, allow_cancel=False, danger=False, # Use a less severe icon color ), @@ -307,6 +310,8 @@ def show_success_backup() -> Awaitable[None]: return show_success( "success_backup", TR.backup__title_backup_completed, + TR.words__title_done, + TR.buttons__continue, ) @@ -320,9 +325,9 @@ def show_reset_warning( return raise_if_not_confirmed( trezorui_api.show_warning( title=subheader or "", - description=content, - value="", - button="", + description="", + value=content, + button=button or "", allow_cancel=False, danger=True, ), @@ -338,40 +343,41 @@ async def show_share_confirmation_success( ) -> None: if share_index is None or num_of_shares is None: # it is a BIP39 or a 1-of-1 SLIP39 backup - # mercury UI shows only final wallet backup confirmation screen later + # delizia and eckhart UIs show only final wallet backup confirmation screen later return # TODO: super-shamir copy not done if share_index == num_of_shares - 1: - title = TR.reset__share_completed_template.format(share_index + 1) + content = TR.reset__share_completed_template.format(share_index + 1) if group_index is None: - footer_description = "" + title = TR.words__title_done else: - footer_description = TR.reset__finished_verifying_group_template.format( - group_index + 1 - ) + title = TR.reset__finished_verifying_group_template.format(group_index + 1) else: if group_index is None: - title = TR.reset__share_completed_template.format(share_index + 1) - footer_description = ( - TR.instructions__shares_continue_with_x_template.format(share_index + 2) + content = TR.reset__share_completed_template.format(share_index + 1) + title = TR.instructions__shares_continue_with_x_template.format( + share_index + 2 ) else: - title = TR.reset__continue_with_next_share - footer_description = ( - TR.reset__group_share_checked_successfully_template.format( - group_index + 1, share_index + 1 - ) + content = TR.reset__continue_with_next_share + title = TR.reset__group_share_checked_successfully_template.format( + group_index + 1, share_index + 1 ) - await show_success("success_recovery", title, subheader=footer_description) + await show_success( + "success_recovery", + content, + subheader=title, + button=TR.buttons__continue, + ) def show_share_confirmation_failure() -> Awaitable[None]: return show_reset_warning( "warning_backup_check", - TR.words__try_again, TR.reset__incorrect_word_selected, - "", + TR.words__pay_attention, + TR.words__try_again, ButtonRequestType.ResetDevice, ) diff --git a/core/translations/en.json b/core/translations/en.json index 2380bd1403..1ee76179c5 100644 --- a/core/translations/en.json +++ b/core/translations/en.json @@ -49,7 +49,12 @@ "backup__new_wallet_created": "Wallet created.\n", "backup__new_wallet_successfully_created": "Wallet created successfully.", "backup__recover_anytime": "You can use your backup to recover your wallet at any time.", - "backup__title_backup_completed": "Wallet backup completed", + "backup__title_backup_completed": { + "Bolt": "Wallet backup completed", + "Caesar": "Wallet backup completed", + "Delizia": "Wallet backup completed", + "Eckhart": "Wallet backup completed." + }, "backup__title_backup_wallet": "Back up wallet", "backup__title_create_wallet_backup": "Create wallet backup", "backup__title_skip": "Skip backup", @@ -654,7 +659,12 @@ "reset__group_info": "Each group has a set number of shares and its own threshold. In the next steps you will set the numbers of shares and the thresholds.", "reset__group_share_checked_successfully_template": "Group {0} - Share {1} checked successfully.", "reset__group_share_title_template": "Group {0} - share {1}", - "reset__incorrect_word_selected": "Incorrect word selected", + "reset__incorrect_word_selected": { + "Bolt": "Incorrect word selected", + "Caesar": "Incorrect word selected", + "Delizia": "Incorrect word selected", + "Eckhart": "Incorrect word selected." + }, "reset__more_at": "More at", "reset__more_info_at": "More info at", "reset__need_all_share_template": "For recovery you need all {0} of the shares.", @@ -681,7 +691,7 @@ "Bolt": "Select {0} word", "Caesar": "Select {0} word", "Delizia": "Select {0} word", - "Eckhart": "Select word #{0} from your wallet backup" + "Eckhart": "Select word no. {0} from your wallet backup" }, "reset__select_word_x_of_y_template": "Select word {0} of {1}:", "reset__set_it_to_count_template": "Set it to {0} and you will need ", @@ -1013,7 +1023,12 @@ "words__title_success": "Success", "words__title_summary": "Summary", "words__title_threshold": "Threshold", - "words__try_again": "Try again.", + "words__try_again": { + "Bolt": "Try again.", + "Caesar": "Try again.", + "Delizia": "Try again.", + "Eckhart": "Try again" + }, "words__unknown": "Unknown", "words__warning": "Warning", "words__writable": "Writable",