refactor(core): upper titles and buttons for TT/TR

New models might not have titles or button labels in
all uppercase as TT and TR do so the translation strings
must be written in normal case.
Instead we uppercases the strings during generation.
In the future, we might want to get rid of separated
translated_string.rs and instead modify the font data.

[no changelog]

refactor(core): upper titles and buttons for TT/TR

WIP

New models might not have titles or button labels in
all uppercase as TT and TR do so the translation strings
must be written in normal case.
Instead we uppercases the strings during generation.
In the future, we might want to get rid of separated
translated_string.rs and instead modify the font data.

[no changelog]
obrusvit/3600-unicode-font-uppercasing-issues-by-generating
obrusvit 4 weeks ago
parent c7832c39ab
commit 9ec8bc6524

@ -30,8 +30,8 @@ static void _librust_qstrs(void) {
MP_QSTR_addr_mismatch__wrong_derivation_path;
MP_QSTR_addr_mismatch__xpub_mismatch;
MP_QSTR_address;
MP_QSTR_address__public_key;
MP_QSTR_address__title_cosigner;
MP_QSTR_address__title_public_key;
MP_QSTR_address__title_receive_address;
MP_QSTR_address__title_yours;
MP_QSTR_address_details__derivation_path;
@ -328,10 +328,10 @@ static void _librust_qstrs(void) {
MP_QSTR_progress__loading_transaction;
MP_QSTR_progress__locking_device;
MP_QSTR_progress__one_second_left;
MP_QSTR_progress__please_wait;
MP_QSTR_progress__refreshing;
MP_QSTR_progress__signing_transaction;
MP_QSTR_progress__syncing;
MP_QSTR_progress__title_please_wait;
MP_QSTR_progress__x_seconds_left_template;
MP_QSTR_progress_event;
MP_QSTR_prompt;
@ -374,7 +374,7 @@ static void _librust_qstrs(void) {
MP_QSTR_recovery__wanna_cancel_dry_run;
MP_QSTR_recovery__wanna_cancel_recovery;
MP_QSTR_recovery__word_count_template;
MP_QSTR_recovery__word_x_of_y_template;
MP_QSTR_recovery__word_x_of_y_title_template;
MP_QSTR_recovery__x_more_items_starting_template_plural;
MP_QSTR_recovery__x_more_shares_needed_template_plural;
MP_QSTR_recovery__x_of_y_entered_template;
@ -421,7 +421,7 @@ static void _librust_qstrs(void) {
MP_QSTR_reset__recovery_share_title_template;
MP_QSTR_reset__required_number_of_groups;
MP_QSTR_reset__select_correct_word;
MP_QSTR_reset__select_word_template;
MP_QSTR_reset__select_word_title_template;
MP_QSTR_reset__select_word_x_of_y_template;
MP_QSTR_reset__set_it_to_count_template;
MP_QSTR_reset__share_checked_successfully_template;
@ -531,16 +531,16 @@ static void _librust_qstrs(void) {
MP_QSTR_show_warning;
MP_QSTR_sign;
MP_QSTR_sign_message__bytes_template;
MP_QSTR_sign_message__confirm_address;
MP_QSTR_sign_message__confirm_message;
MP_QSTR_sign_message__message_size;
MP_QSTR_sign_message__verify_address;
MP_QSTR_sign_message__title_confirm_address;
MP_QSTR_sign_message__title_confirm_message;
MP_QSTR_sign_message__title_verify_address;
MP_QSTR_skip_first_paint;
MP_QSTR_spending_amount;
MP_QSTR_storage_msg__processing;
MP_QSTR_storage_msg__starting;
MP_QSTR_storage_msg__verifying_pin;
MP_QSTR_storage_msg__wrong_pin;
MP_QSTR_storage_msg__title_processing;
MP_QSTR_storage_msg__title_starting;
MP_QSTR_storage_msg__title_verifying_pin;
MP_QSTR_storage_msg__title_wrong_pin;
MP_QSTR_subprompt;
MP_QSTR_subtitle;
MP_QSTR_text_mono;
@ -623,12 +623,12 @@ static void _librust_qstrs(void) {
MP_QSTR_words__please_check_again;
MP_QSTR_words__please_try_again;
MP_QSTR_words__really_wanna;
MP_QSTR_words__recipient;
MP_QSTR_words__sign;
MP_QSTR_words__signer;
MP_QSTR_words__title_check;
MP_QSTR_words__title_group;
MP_QSTR_words__title_information;
MP_QSTR_words__title_recipient;
MP_QSTR_words__title_remember;
MP_QSTR_words__title_share;
MP_QSTR_words__title_shares;
@ -819,13 +819,13 @@ static void _librust_qstrs(void) {
MP_QSTR_ethereum__show_full_message;
MP_QSTR_ethereum__show_full_struct;
MP_QSTR_ethereum__sign_eip712;
MP_QSTR_ethereum__staking_claim;
MP_QSTR_ethereum__staking_claim_address;
MP_QSTR_ethereum__staking_claim_intro;
MP_QSTR_ethereum__staking_stake;
MP_QSTR_ethereum__staking_stake_address;
MP_QSTR_ethereum__staking_stake_intro;
MP_QSTR_ethereum__staking_unstake;
MP_QSTR_ethereum__staking_title_claim;
MP_QSTR_ethereum__staking_title_claim_address;
MP_QSTR_ethereum__staking_title_stake;
MP_QSTR_ethereum__staking_title_stake_address;
MP_QSTR_ethereum__staking_title_unstake;
MP_QSTR_ethereum__staking_unstake_intro;
MP_QSTR_ethereum__title_confirm_data;
MP_QSTR_ethereum__title_confirm_domain;

@ -0,0 +1 @@
cargo doc --features ui,model_mercury,micropython,translations,dma2d,ui_debug,touch --no-default-features --open

@ -1 +1,9 @@
pub mod translated_string;
#[cfg(feature = "model_mercury")]
mod translated_string;
#[cfg(feature = "model_mercury")]
pub use translated_string::TranslatedString;
#[cfg(any(feature = "model_tr", feature = "model_tt"))]
mod translated_string_upper;
#[cfg(any(feature = "model_tr", feature = "model_tt"))]
pub use translated_string_upper::TranslatedString;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,75 @@
//! generated from ${THIS_FILE.name}
//! (by running `make templates` in `core`)
//! do not edit manually!
#![cfg_attr(rustfmt, rustfmt_skip)]
<%
import json
from trezorlib._internal.translations import uppercase_titles_and_buttons
ALTCOIN_PREFIXES = (
"binance",
"cardano",
"eos",
"ethereum",
"fido",
"monero",
"nem",
"ripple",
"solana",
"stellar",
"tezos",
"u2f",
)
TR_DIR = ROOT / "core" / "translations"
order_file = TR_DIR / "order.json"
order_index_name = json.loads(order_file.read_text())
order = {int(k): v for k, v in order_index_name.items()}
en_file = TR_DIR / "en.json"
en_data = json.loads(en_file.read_text())["translations"]
%>\
#[cfg(feature = "micropython")]
use crate::micropython::qstr::Qstr;
#[derive(Debug, Copy, Clone, FromPrimitive, PartialEq, Eq)]
#[repr(u16)]
#[allow(non_camel_case_types)]
pub enum TranslatedString {
% for idx, name in order.items():
%if any(name.startswith(prefix + "__") for prefix in ALTCOIN_PREFIXES):
#[cfg(feature = "universal_fw")]
%endif
${name} = ${idx}, // ${json.dumps(en_data.get(name, '""'))}
% endfor
}
impl TranslatedString {
pub fn untranslated(self) -> &'static str {
match self {
% for name in order.values():
%if any(name.startswith(prefix + "__") for prefix in ALTCOIN_PREFIXES):
#[cfg(feature = "universal_fw")]
%endif
Self::${name} => ${uppercase_titles_and_buttons(json.dumps(en_data.get(name, '""')), name, "T2T1")},
% endfor
}
}
#[cfg(feature = "micropython")]
pub fn from_qstr(qstr: Qstr) -> Option<Self> {
match qstr {
% for name in order.values():
%if any(name.startswith(prefix + "__") for prefix in ALTCOIN_PREFIXES):
#[cfg(feature = "universal_fw")]
%endif
Qstr::MP_QSTR_${name} => Some(Self::${name}),
% endfor
_ => None,
}
}
}

@ -1,7 +1,7 @@
use crate::strutil::TString;
use super::blob::Translations;
pub use super::generated::translated_string::TranslatedString;
pub use super::generated::TranslatedString;
impl TranslatedString {
pub(super) fn translate<'a>(self, source: Option<&'a Translations>) -> &'a str {

@ -122,7 +122,7 @@ impl Glyph {
}
/// Font constants. Keep in sync with FONT_ definitions in
/// `extmod/modtrezorui/fonts/fonts.h`.
/// `embed/lib/fonts/fonts.h`.
#[derive(Copy, Clone, PartialEq, Eq, FromPrimitive)]
#[repr(u8)]
pub enum Font {

@ -8,25 +8,25 @@ class TR:
addr_mismatch__support_url: str = "trezor.io/support"
addr_mismatch__wrong_derivation_path: str = "Wrong derivation path for selected account."
addr_mismatch__xpub_mismatch: str = "XPUB mismatch?"
address__public_key: str = "Public key"
address__title_cosigner: str = "COSIGNER"
address__title_receive_address: str = "RECEIVE ADDRESS"
address__title_yours: str = "YOURS"
address__title_cosigner: str = "Cosigner"
address__title_public_key: str = "Public key"
address__title_receive_address: str = "Receive address"
address__title_yours: str = "Yours"
address_details__derivation_path: str = "Derivation path:"
address_details__title_receive_address: str = "RECEIVE ADDRESS"
address_details__title_receiving_to: str = "RECEIVING TO"
address_details__title_receive_address: str = "Receive address"
address_details__title_receiving_to: str = "Receiving to"
authenticate__confirm_template: str = "Allow connected computer to confirm your {0} is genuine?"
authenticate__header: str = "Authenticate device"
auto_lock__change_template: str = "Auto-lock your Trezor after {0} of inactivity?"
auto_lock__title: str = "AUTO-LOCK DELAY"
auto_lock__title: str = "Auto-lock delay"
backup__can_back_up_anytime: str = "You can back up your Trezor once, at any time."
backup__it_should_be_backed_up: str = "You should back up your new wallet right now."
backup__it_should_be_backed_up_now: str = "It should be backed up now!"
backup__new_wallet_created: str = "New wallet created.\n"
backup__new_wallet_successfully_created: str = "New wallet created successfully."
backup__recover_anytime: str = "You can use your backup to recover your wallet at any time."
backup__title_backup_wallet: str = "BACK UP WALLET"
backup__title_skip: str = "SKIP BACKUP"
backup__title_backup_wallet: str = "Back up wallet"
backup__title_skip: str = "Skip backup"
backup__want_to_skip: str = "Are you sure you want to skip the backup?"
binance__buy: str = "Buy"
binance__confirm_cancel: str = "Confirm cancel"
@ -52,59 +52,59 @@ class TR:
bitcoin__new_fee_rate: str = "New fee rate:"
bitcoin__simple_send_of: str = "Simple send of"
bitcoin__ticket_amount: str = "Ticket amount:"
bitcoin__title_confirm_details: str = "CONFIRM DETAILS"
bitcoin__title_finalize_transaction: str = "FINALIZE TRANSACTION"
bitcoin__title_high_mining_fee: str = "HIGH MINING FEE"
bitcoin__title_meld_transaction: str = "MELD TRANSACTIONS"
bitcoin__title_modify_amount: str = "MODIFY AMOUNT"
bitcoin__title_payjoin: str = "PAYJOIN"
bitcoin__title_proof_of_ownership: str = "PROOF OF OWNERSHIP"
bitcoin__title_purchase_ticket: str = "PURCHASE TICKET"
bitcoin__title_update_transaction: str = "UPDATE TRANSACTION"
bitcoin__title_confirm_details: str = "Confirm details"
bitcoin__title_finalize_transaction: str = "Finalize transaction"
bitcoin__title_high_mining_fee: str = "High mining fee"
bitcoin__title_meld_transaction: str = "Meld transactions"
bitcoin__title_modify_amount: str = "Modify amount"
bitcoin__title_payjoin: str = "Payjoin"
bitcoin__title_proof_of_ownership: str = "Proof of ownership"
bitcoin__title_purchase_ticket: str = "Purchase ticket"
bitcoin__title_update_transaction: str = "Update transaction"
bitcoin__unknown_path: str = "Unknown path"
bitcoin__unknown_transaction: str = "Unknown transaction"
bitcoin__unusually_high_fee: str = "Unusually high fee."
bitcoin__unverified_external_inputs: str = "The transaction contains unverified external inputs."
bitcoin__valid_signature: str = "The signature is valid."
bitcoin__voting_rights: str = "Voting rights to:"
buttons__abort: str = "ABORT"
buttons__access: str = "ACCESS"
buttons__again: str = "AGAIN"
buttons__allow: str = "ALLOW"
buttons__back: str = "BACK"
buttons__back_up: str = "BACK UP"
buttons__cancel: str = "CANCEL"
buttons__change: str = "CHANGE"
buttons__check: str = "CHECK"
buttons__check_again: str = "CHECK AGAIN"
buttons__close: str = "CLOSE"
buttons__confirm: str = "CONFIRM"
buttons__continue: str = "CONTINUE"
buttons__details: str = "DETAILS"
buttons__enable: str = "ENABLE"
buttons__enter: str = "ENTER"
buttons__enter_share: str = "ENTER SHARE"
buttons__export: str = "EXPORT"
buttons__format: str = "FORMAT"
buttons__go_back: str = "GO BACK"
buttons__hold_to_confirm: str = "HOLD TO CONFIRM"
buttons__info: str = "INFO"
buttons__install: str = "INSTALL"
buttons__more_info: str = "MORE INFO"
buttons__ok_i_understand: str = "OK, I UNDERSTAND"
buttons__purchase: str = "PURCHASE"
buttons__quit: str = "QUIT"
buttons__restart: str = "RESTART"
buttons__retry: str = "RETRY"
buttons__select: str = "SELECT"
buttons__set: str = "SET"
buttons__show_all: str = "SHOW ALL"
buttons__show_details: str = "SHOW DETAILS"
buttons__show_words: str = "SHOW WORDS"
buttons__skip: str = "SKIP"
buttons__try_again: str = "TRY AGAIN"
buttons__turn_off: str = "TURN OFF"
buttons__turn_on: str = "TURN ON"
buttons__abort: str = "Abort"
buttons__access: str = "Access"
buttons__again: str = "Again"
buttons__allow: str = "Allow"
buttons__back: str = "Back"
buttons__back_up: str = "Back up"
buttons__cancel: str = "Cancel"
buttons__change: str = "Change"
buttons__check: str = "Check"
buttons__check_again: str = "Check again"
buttons__close: str = "Close"
buttons__confirm: str = "Confirm"
buttons__continue: str = "Continue"
buttons__details: str = "Details"
buttons__enable: str = "Enable"
buttons__enter: str = "Enter"
buttons__enter_share: str = "Enter share"
buttons__export: str = "Export"
buttons__format: str = "Format"
buttons__go_back: str = "Go back"
buttons__hold_to_confirm: str = "Hold to confirm"
buttons__info: str = "Info"
buttons__install: str = "Install"
buttons__more_info: str = "More info"
buttons__ok_i_understand: str = "Ok, i understand"
buttons__purchase: str = "Purchase"
buttons__quit: str = "Quit"
buttons__restart: str = "Restart"
buttons__retry: str = "Retry"
buttons__select: str = "Select"
buttons__set: str = "Set"
buttons__show_all: str = "Show all"
buttons__show_details: str = "Show details"
buttons__show_words: str = "Show words"
buttons__skip: str = "Skip"
buttons__try_again: str = "Try again"
buttons__turn_off: str = "Turn off"
buttons__turn_on: str = "Turn on"
cardano__addr_base: str = "Base"
cardano__addr_enterprise: str = "Enterprise"
cardano__addr_legacy: str = "Legacy"
@ -218,21 +218,21 @@ class TR:
coinjoin__do_not_disconnect: str = "Do not disconnect your Trezor!"
coinjoin__max_mining_fee: str = "Max mining fee"
coinjoin__max_rounds: str = "Max rounds"
coinjoin__title: str = "AUTHORIZE COINJOIN"
coinjoin__title_do_not_disconnect: str = "DO NOT DISCONNECT YOUR TREZOR!"
coinjoin__title_progress: str = "COINJOIN IN PROGRESS"
coinjoin__title: str = "Authorize coinjoin"
coinjoin__title_do_not_disconnect: str = "Do not disconnect your trezor!"
coinjoin__title_progress: str = "Coinjoin in progress"
coinjoin__waiting_for_others: str = "Waiting for others"
confirm_total__fee_rate: str = "Fee rate:"
confirm_total__sending_from_account: str = "Sending from account:"
confirm_total__title_fee: str = "FEE INFORMATION"
confirm_total__title_sending_from: str = "SENDING FROM"
confirm_total__title_fee: str = "Fee information"
confirm_total__title_sending_from: str = "Sending from"
debug__loading_seed: str = "Loading seed"
debug__loading_seed_not_recommended: str = "Loading private seed is not recommended."
device_name__change_template: str = "Change device name to {0}?"
device_name__title: str = "DEVICE NAME"
device_name__title: str = "Device name"
entropy__send: str = "Do you really want to send entropy?"
entropy__title: str = "INTERNAL ENTROPY"
entropy__title_confirm: str = "CONFIRM ENTROPY"
entropy__title: str = "Internal entropy"
entropy__title_confirm: str = "Confirm entropy"
eos__about_to_sign_template: str = "You are about to sign {0}."
eos__action_name: str = "Action Name:"
eos__arbitrary_data: str = "Arbitrary data"
@ -288,26 +288,26 @@ class TR:
ethereum__show_full_message: str = "Show full message"
ethereum__show_full_struct: str = "Show full struct"
ethereum__sign_eip712: str = "Really sign EIP-712 typed data?"
ethereum__staking_claim: str = "CLAIM"
ethereum__staking_claim_address: str = "CLAIM ADDRESS"
ethereum__staking_claim_intro: str = "Claim ETH from Everstake?"
ethereum__staking_stake: str = "STAKE"
ethereum__staking_stake_address: str = "STAKE ADDRESS"
ethereum__staking_stake_intro: str = "Stake ETH on Everstake?"
ethereum__staking_unstake: str = "UNSTAKE"
ethereum__staking_title_claim: str = "Claim"
ethereum__staking_title_claim_address: str = "Claim address"
ethereum__staking_title_stake: str = "Stake"
ethereum__staking_title_stake_address: str = "Stake address"
ethereum__staking_title_unstake: str = "Unstake"
ethereum__staking_unstake_intro: str = "Unstake ETH from Everstake?"
ethereum__title_confirm_data: str = "CONFIRM DATA"
ethereum__title_confirm_domain: str = "CONFIRM DOMAIN"
ethereum__title_confirm_message: str = "CONFIRM MESSAGE"
ethereum__title_confirm_struct: str = "CONFIRM STRUCT"
ethereum__title_confirm_typed_data: str = "CONFIRM TYPED DATA"
ethereum__title_signing_address: str = "SIGNING ADDRESS"
ethereum__title_confirm_data: str = "Confirm data"
ethereum__title_confirm_domain: str = "Confirm domain"
ethereum__title_confirm_message: str = "Confirm message"
ethereum__title_confirm_struct: str = "Confirm struct"
ethereum__title_confirm_typed_data: str = "Confirm typed data"
ethereum__title_signing_address: str = "Signing address"
ethereum__units_template: str = "{0} units"
ethereum__unknown_token: str = "Unknown token"
ethereum__valid_signature: str = "The signature is valid."
experimental_mode__enable: str = "Enable experimental features?"
experimental_mode__only_for_dev: str = "Only for development and beta testing!"
experimental_mode__title: str = "EXPERIMENTAL MODE"
experimental_mode__title: str = "Experimental mode"
fido__already_registered: str = "Already registered"
fido__device_already_registered: str = "This device is already registered with this application."
fido__device_already_registered_with_template: str = "This device is already registered with {0}."
@ -318,61 +318,61 @@ class TR:
fido__not_registered: str = "Not registered"
fido__not_registered_with_template: str = "This device is not registered with\n{0}."
fido__please_enable_pin_protection: str = "Please enable PIN protection."
fido__title_authenticate: str = "FIDO2 AUTHENTICATE"
fido__title_import_credential: str = "IMPORT CREDENTIAL"
fido__title_list_credentials: str = "LIST CREDENTIALS"
fido__title_register: str = "FIDO2 REGISTER"
fido__title_remove_credential: str = "REMOVE CREDENTIAL"
fido__title_reset: str = "FIDO2 RESET"
fido__title_u2f_auth: str = "U2F AUTHENTICATE"
fido__title_u2f_register: str = "U2F REGISTER"
fido__title_verify_user: str = "FIDO2 VERIFY USER"
fido__title_authenticate: str = "Fido2 authenticate"
fido__title_import_credential: str = "Import credential"
fido__title_list_credentials: str = "List credentials"
fido__title_register: str = "Fido2 register"
fido__title_remove_credential: str = "Remove credential"
fido__title_reset: str = "FIDO2 reset"
fido__title_u2f_auth: str = "U2F authenticate"
fido__title_u2f_register: str = "U2F register"
fido__title_verify_user: str = "FIDO2 verify user"
fido__unable_to_verify_user: str = "Unable to verify user."
fido__wanna_erase_credentials: str = "Do you really want to erase all credentials?"
firmware_update__title: str = "UPDATE FIRMWARE"
firmware_update__title_fingerprint: str = "FW FINGERPRINT"
firmware_update__title: str = "Update firmware"
firmware_update__title_fingerprint: str = "FW fingerprint"
homescreen__click_to_connect: str = "Click to Connect"
homescreen__click_to_unlock: str = "Click to Unlock"
homescreen__title_backup_failed: str = "BACKUP FAILED"
homescreen__title_backup_needed: str = "BACKUP NEEDED"
homescreen__title_coinjoin_authorized: str = "COINJOIN AUTHORIZED"
homescreen__title_experimental_mode: str = "EXPERIMENTAL MODE"
homescreen__title_no_usb_connection: str = "NO USB CONNECTION"
homescreen__title_pin_not_set: str = "PIN NOT SET"
homescreen__title_seedless: str = "SEEDLESS"
homescreen__title_set: str = "CHANGE HOMESCREEN?"
inputs__back: str = "BACK"
inputs__cancel: str = "CANCEL"
inputs__delete: str = "DELETE"
inputs__enter: str = "ENTER"
inputs__previous: str = "PREVIOUS"
inputs__return: str = "RETURN"
inputs__show: str = "SHOW"
inputs__space: str = "SPACE"
joint__title: str = "JOINT TRANSACTION"
homescreen__title_backup_failed: str = "Backup failed"
homescreen__title_backup_needed: str = "Backup needed"
homescreen__title_coinjoin_authorized: str = "Coinjoin authorized"
homescreen__title_experimental_mode: str = "Experimental mode"
homescreen__title_no_usb_connection: str = "No USB connection"
homescreen__title_pin_not_set: str = "PIN not set"
homescreen__title_seedless: str = "Seedless"
homescreen__title_set: str = "Change homescreen?"
inputs__back: str = "Back"
inputs__cancel: str = "Cancel"
inputs__delete: str = "Delete"
inputs__enter: str = "Enter"
inputs__previous: str = "Previous"
inputs__return: str = "Return"
inputs__show: str = "Show"
inputs__space: str = "Space"
joint__title: str = "Joint transaction"
joint__to_the_total_amount: str = "To the total amount:"
joint__you_are_contributing: str = "You are contributing:"
language__change_to_template: str = "Change language to {0}?"
language__changed: str = "Language changed successfully"
language__progress: str = "Changing language"
language__title: str = "LANGUAGE SETTINGS"
language__title: str = "Language settings"
lockscreen__tap_to_connect: str = "Tap to connect"
lockscreen__tap_to_unlock: str = "Tap to unlock"
lockscreen__title_locked: str = "LOCKED"
lockscreen__title_not_connected: str = "NOT CONNECTED"
lockscreen__title_locked: str = "Locked"
lockscreen__title_not_connected: str = "Not connected"
misc__decrypt_value: str = "Decrypt value"
misc__encrypt_value: str = "Encrypt value"
misc__title_suite_labeling: str = "SUITE LABELING"
misc__title_suite_labeling: str = "Suite labeling"
modify_amount__decrease_amount: str = "Decrease amount by:"
modify_amount__increase_amount: str = "Increase amount by:"
modify_amount__new_amount: str = "New amount:"
modify_amount__title: str = "MODIFY AMOUNT"
modify_amount__title: str = "Modify amount"
modify_fee__decrease_fee: str = "Decrease fee by:"
modify_fee__fee_rate: str = "Fee rate:"
modify_fee__increase_fee: str = "Increase fee by:"
modify_fee__new_transaction_fee: str = "New transaction fee:"
modify_fee__no_change: str = "Fee did not change.\n"
modify_fee__title: str = "MODIFY FEE"
modify_fee__title: str = "Modify fee"
modify_fee__transaction_fee: str = "Transaction fee:"
monero__confirm_export: str = "Confirm export"
monero__confirm_ki_sync: str = "Confirm ki sync"
@ -451,11 +451,11 @@ class TR:
passphrase__next_screen_will_show_passphrase: str = "Next screen will show the passphrase."
passphrase__please_enter: str = "Please enter your passphrase."
passphrase__revoke_on_device: str = "Do you want to revoke the passphrase on device setting?"
passphrase__title_confirm: str = "CONFIRM PASSPHRASE"
passphrase__title_enter: str = "ENTER PASSPHRASE"
passphrase__title_hide: str = "HIDE PASSPHRASE"
passphrase__title_settings: str = "PASSPHRASE SETTINGS"
passphrase__title_source: str = "PASSPHRASE SOURCE"
passphrase__title_confirm: str = "Confirm passphrase"
passphrase__title_enter: str = "Enter passphrase"
passphrase__title_hide: str = "Hide passphrase"
passphrase__title_settings: str = "Passphrase settings"
passphrase__title_source: str = "Passphrase source"
passphrase__turn_off: str = "Turn off passphrase protection?"
passphrase__turn_on: str = "Turn on passphrase protection?"
pin__change: str = "Change PIN?"
@ -476,9 +476,9 @@ class TR:
pin__reenter_new: str = "Re-enter new PIN"
pin__reenter_to_confirm: str = "Please re-enter PIN to confirm."
pin__should_be_long: str = "PIN should be 4-50 digits long."
pin__title_check_pin: str = "CHECK PIN"
pin__title_settings: str = "PIN SETTINGS"
pin__title_wrong_pin: str = "WRONG PIN"
pin__title_check_pin: str = "Check PIN"
pin__title_settings: str = "PIN settings"
pin__title_wrong_pin: str = "Wrong PIN"
pin__tries_left: str = "tries left"
pin__turn_off: str = "Are you sure you want to turn off PIN protection?"
pin__turn_on: str = "Turn on PIN protection?"
@ -497,14 +497,14 @@ class TR:
progress__loading_transaction: str = "Loading transaction..."
progress__locking_device: str = "Locking the device..."
progress__one_second_left: str = "1 second left"
progress__please_wait: str = "PLEASE WAIT"
progress__refreshing: str = "Refreshing..."
progress__signing_transaction: str = "Signing transaction..."
progress__syncing: str = "Syncing..."
progress__title_please_wait: str = "Please wait"
progress__x_seconds_left_template: str = "{0} seconds left"
reboot_to_bootloader__just_a_moment: str = "Just a moment..."
reboot_to_bootloader__restart: str = "Trezor will restart in bootloader mode."
reboot_to_bootloader__title: str = "GO TO BOOTLOADER"
reboot_to_bootloader__title: str = "Go to bootloader"
reboot_to_bootloader__version_by_template: str = "Firmware version {0}\nby {1}"
recovery__cancel_dry_run: str = "Cancel backup check"
recovery__check_dry_run: str = "Check your backup?"
@ -529,18 +529,18 @@ class TR:
recovery__share_already_entered: str = "Share already entered"
recovery__share_from_another_shamir: str = "You have entered a share from another Shamir Backup."
recovery__share_num_template: str = "Share {0}"
recovery__title: str = "RECOVER WALLET"
recovery__title_cancel_dry_run: str = "CANCEL BACKUP CHECK"
recovery__title_cancel_recovery: str = "CANCEL RECOVERY"
recovery__title_dry_run: str = "BACKUP CHECK"
recovery__title_recover: str = "RECOVER WALLET"
recovery__title_remaining_shares: str = "REMAINING SHARES"
recovery__title: str = "Recover wallet"
recovery__title_cancel_dry_run: str = "Cancel backup check"
recovery__title_cancel_recovery: str = "Cancel recovery"
recovery__title_dry_run: str = "Backup check"
recovery__title_recover: str = "Recover wallet"
recovery__title_remaining_shares: str = "Remaining shares"
recovery__type_word_x_of_y_template: str = "Type word {0} of {1}"
recovery__wallet_recovered: str = "Wallet recovered successfully"
recovery__wanna_cancel_dry_run: str = "Are you sure you want to cancel the backup check?"
recovery__wanna_cancel_recovery: str = "Are you sure you want to cancel the recovery process?"
recovery__word_count_template: str = "({0} words)"
recovery__word_x_of_y_template: str = "WORD {0} OF {1}"
recovery__word_x_of_y_title_template: str = "Word {0} of {1}"
recovery__x_more_items_starting_template_plural: str = "{count} more {plural} starting"
recovery__x_more_shares_needed_template_plural: str = "{count} more {plural} needed."
recovery__x_of_y_entered_template: str = "{0} of {1} shares entered successfully."
@ -548,13 +548,13 @@ class TR:
reset__advanced_group_threshold_info: str = "The group threshold specifies the number of groups required to recover your wallet."
reset__all_x_of_y_template: str = "all {0} of {1} shares"
reset__any_x_of_y_template: str = "any {0} of {1} shares"
reset__button_create: str = "CREATE WALLET"
reset__button_recover: str = "RECOVER WALLET"
reset__button_create: str = "Create wallet"
reset__button_recover: str = "Recover wallet"
reset__by_continuing: str = "By continuing you agree to Trezor Company's terms and conditions."
reset__check_backup_title: str = "CHECK BACKUP"
reset__check_group_share_title_template: str = "CHECK G{0} - SHARE {1}"
reset__check_seed_title: str = "CHECK SEED"
reset__check_share_title_template: str = "CHECK SHARE #{0}"
reset__check_backup_title: str = "Check backup"
reset__check_group_share_title_template: str = "Check g{0} - share {1}"
reset__check_seed_title: str = "Check seed"
reset__check_share_title_template: str = "Check share #{0}"
reset__continue_with_next_share: str = "Continue with the next share."
reset__continue_with_share_template: str = "Continue with share #{0}."
reset__finished_verifying_group_template: str = "You have finished verifying your recovery shares for group {0}."
@ -563,7 +563,7 @@ class TR:
reset__group_description: str = "A group is made up of recovery shares."
reset__group_info: str = "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: str = "Group {0} - Share {1} checked successfully."
reset__group_share_title_template: str = "GROUP {0} - SHARE {1}"
reset__group_share_title_template: str = "Group {0} - share {1}"
reset__more_info_at: str = "More info at"
reset__need_all_share_template: str = "For recovery you need all {0} of the shares."
reset__need_any_share_template: str = "For recovery you need any {0} of the shares."
@ -577,15 +577,15 @@ class TR:
reset__number_of_shares_info: str = "= total number of unique word lists used for wallet backup."
reset__one_share: str = "1 share"
reset__only_one_share_will_be_created: str = "Only one share will be created."
reset__recovery_seed_title: str = "RECOVERY SEED"
reset__recovery_share_title_template: str = "RECOVERY SHARE #{0}"
reset__recovery_seed_title: str = "Recovery seed"
reset__recovery_share_title_template: str = "Recovery share #{0}"
reset__required_number_of_groups: str = "The required number of groups for recovery."
reset__select_correct_word: str = "Select the correct word for each position."
reset__select_word_template: str = "SELECT {0} WORD"
reset__select_word_title_template: str = "Select {0} word"
reset__select_word_x_of_y_template: str = "Select word {0} of {1}:"
reset__set_it_to_count_template: str = "Set it to {0} and you will need "
reset__share_checked_successfully_template: str = "Recovery share #{0} checked successfully."
reset__share_words_title: str = "STANDARD BACKUP"
reset__share_words_title: str = "Standard backup"
reset__slip39_checklist_num_groups: str = "Number of groups"
reset__slip39_checklist_num_shares: str = "Number of shares"
reset__slip39_checklist_set_num_groups: str = "Set number of groups"
@ -593,21 +593,21 @@ class TR:
reset__slip39_checklist_set_sizes: str = "Set sizes and thresholds"
reset__slip39_checklist_set_sizes_longer: str = "Set size and threshold for each group"
reset__slip39_checklist_set_threshold: str = "Set threshold"
reset__slip39_checklist_title: str = "BACKUP CHECKLIST"
reset__slip39_checklist_title: str = "Backup checklist"
reset__slip39_checklist_write_down: str = "Write down and check all shares"
reset__slip39_checklist_write_down_recovery: str = "Write down and check all recovery shares"
reset__the_threshold_sets_the_number_of_shares: str = "The threshold sets the number of shares "
reset__threshold_info: str = "= minimum number of unique word lists used for recovery."
reset__title_backup_is_done: str = "BACKUP IS DONE"
reset__title_create_wallet: str = "CREATE WALLET"
reset__title_create_wallet_shamir: str = "CREATE WALLET (SHAMIR)"
reset__title_group_threshold: str = "GROUP THRESHOLD"
reset__title_number_of_groups: str = "NUMBER OF GROUPS"
reset__title_number_of_shares: str = "NUMBER OF SHARES"
reset__title_set_group_threshold: str = "SET GROUP THRESHOLD"
reset__title_set_number_of_groups: str = "SET NUMBER OF GROUPS"
reset__title_set_number_of_shares: str = "SET NUMBER OF SHARES"
reset__title_set_threshold: str = "SET THRESHOLD"
reset__title_backup_is_done: str = "Backup is done"
reset__title_create_wallet: str = "Create wallet"
reset__title_create_wallet_shamir: str = "Create wallet (shamir)"
reset__title_group_threshold: str = "Group threshold"
reset__title_number_of_groups: str = "Number of groups"
reset__title_number_of_shares: str = "Number of shares"
reset__title_set_group_threshold: str = "Set group threshold"
reset__title_set_number_of_groups: str = "Set number of groups"
reset__title_set_number_of_shares: str = "Set number of shares"
reset__title_set_threshold: str = "Set threshold"
reset__to_form_group_template: str = "to form Group {0}."
reset__tos_link: str = "trezor.io/tos"
reset__total_number_of_shares_in_group_template: str = "Set the total number of shares in Group {0}."
@ -622,13 +622,13 @@ class TR:
rotation__east: str = "east"
rotation__north: str = "north"
rotation__south: str = "south"
rotation__title_change: str = "CHANGE ROTATION"
rotation__title_change: str = "Change rotation"
rotation__west: str = "west"
safety_checks__approve_unsafe_always: str = "Trezor will allow you to approve some actions which might be unsafe."
safety_checks__approve_unsafe_temporary: str = "Trezor will temporarily allow you to approve some actions which might be unsafe."
safety_checks__enforce_strict: str = "Do you really want to enforce strict safety checks (recommended)?"
safety_checks__title: str = "SAFETY CHECKS"
safety_checks__title_safety_override: str = "SAFETY OVERRIDE"
safety_checks__title: str = "Safety checks"
safety_checks__title_safety_override: str = "Safety override"
sd_card__all_data_will_be_lost: str = "All data on the SD card will be lost."
sd_card__card_required: str = "SD card required."
sd_card__disable: str = "Do you really want to remove SD card protection from your device?"
@ -644,25 +644,25 @@ class TR:
sd_card__refresh: str = "Do you really want to replace the current SD card secret with a newly generated one?"
sd_card__refreshed: str = "You have successfully refreshed SD protection."
sd_card__restart: str = "Do you want to restart Trezor in bootloader mode?"
sd_card__title: str = "SD CARD PROTECTION"
sd_card__title_problem: str = "SD CARD PROBLEM"
sd_card__title: str = "SD card protection"
sd_card__title_problem: str = "SD card problem"
sd_card__unknown_filesystem: str = "Unknown filesystem."
sd_card__unplug_and_insert_correct: str = "Please unplug the device and insert the correct SD card."
sd_card__use_different_card: str = "Use a different card or format the SD card to the FAT32 filesystem."
sd_card__wanna_format: str = "Do you really want to format the SD card?"
sd_card__wrong_sd_card: str = "Wrong SD card."
send__address_path: str = "address path"
send__confirm_sending: str = "SENDING AMOUNT"
send__confirm_sending: str = "Sending amount"
send__from_multiple_accounts: str = "Sending from multiple accounts."
send__including_fee: str = "Including fee:"
send__maximum_fee: str = "Maximum fee:"
send__receiving_to_multisig: str = "Receiving to a multisig address."
send__title_confirm_sending: str = "CONFIRM SENDING"
send__title_joint_transaction: str = "JOINT TRANSACTION"
send__title_receiving_to: str = "RECEIVING TO"
send__title_sending: str = "SENDING"
send__title_sending_amount: str = "SENDING AMOUNT"
send__title_sending_to: str = "SENDING TO"
send__title_confirm_sending: str = "Confirm sending"
send__title_joint_transaction: str = "Joint transaction"
send__title_receiving_to: str = "Receiving to"
send__title_sending: str = "Sending"
send__title_sending_amount: str = "Sending amount"
send__title_sending_to: str = "Sending to"
send__to_the_total_amount: str = "To the total amount:"
send__total_amount: str = "Total amount:"
send__transaction_id: str = "Transaction ID:"
@ -670,10 +670,10 @@ class TR:
share_words__words_in_order: str = " words in order."
share_words__wrote_down_all: str = "I wrote down all "
sign_message__bytes_template: str = "{0} Bytes"
sign_message__confirm_address: str = "SIGNING ADDRESS"
sign_message__confirm_message: str = "CONFIRM MESSAGE"
sign_message__message_size: str = "Message size:"
sign_message__verify_address: str = "VERIFY ADDRESS"
sign_message__title_confirm_address: str = "Signing address"
sign_message__title_confirm_message: str = "Confirm message"
sign_message__title_verify_address: str = "Verify address"
solana__account_index: str = "Account index"
solana__associated_token_account: str = "Associated token account"
solana__confirm_multisig: str = "Confirm multisig"
@ -755,10 +755,10 @@ class TR:
stellar__value_sha256: str = "Value (SHA-256):"
stellar__wanna_clean_value_key_template: str = "Do you want to clear value key {0}?"
stellar__your_account: str = " your account"
storage_msg__processing: str = "PROCESSING"
storage_msg__starting: str = "STARTING UP"
storage_msg__verifying_pin: str = "VERIFYING PIN"
storage_msg__wrong_pin: str = "WRONG PIN"
storage_msg__title_processing: str = "Processing"
storage_msg__title_starting: str = "Starting up"
storage_msg__title_verifying_pin: str = "Verifying pin"
storage_msg__title_wrong_pin: str = "Wrong pin"
tezos__baker_address: str = "Baker address:"
tezos__balance: str = "Balance:"
tezos__ballot: str = "Ballot:"
@ -784,10 +784,10 @@ class TR:
tutorial__welcome_press_right: str = "Welcome to Trezor. Press right to continue."
u2f__get: str = "Increase and retrieve the U2F counter?"
u2f__set_template: str = "Set the U2F counter to {0}?"
u2f__title_get: str = "GET U2F COUNTER"
u2f__title_set: str = "SET U2F COUNTER"
u2f__title_get: str = "Get U2F counter"
u2f__title_set: str = "Set U2F counter"
wipe__info: str = "All data will be erased."
wipe__title: str = "WIPE DEVICE"
wipe__title: str = "Wipe device"
wipe__want_to_wipe: str = "Do you really want to wipe the device?\n"
wipe_code__change: str = "Change wipe code?"
wipe_code__changed: str = "Wipe code changed."
@ -800,13 +800,13 @@ class TR:
wipe_code__mismatch: str = "The wipe codes you entered do not match."
wipe_code__reenter: str = "Re-enter wipe code"
wipe_code__reenter_to_confirm: str = "Please re-enter wipe code to confirm."
wipe_code__title_check: str = "CHECK WIPE CODE"
wipe_code__title_invalid: str = "INVALID WIPE CODE"
wipe_code__title_settings: str = "WIPE CODE SETTINGS"
wipe_code__title_check: str = "Check wipe code"
wipe_code__title_invalid: str = "Invalid wipe code"
wipe_code__title_settings: str = "Wipe code settings"
wipe_code__turn_off: str = "Turn off wipe code protection?"
wipe_code__turn_on: str = "Turn on wipe code protection?"
wipe_code__wipe_code_mismatch: str = "Wipe code mismatch"
word_count__title: str = "NUMBER OF WORDS"
word_count__title: str = "Number of words"
words__account: str = "Account"
words__account_colon: str = "Account:"
words__address: str = "Address"
@ -831,18 +831,18 @@ class TR:
words__please_check_again: str = "Please check again"
words__please_try_again: str = "Please try again"
words__really_wanna: str = "Do you really want to"
words__recipient: str = "Recipient"
words__sign: str = "Sign"
words__signer: str = "Signer"
words__title_check: str = "CHECK"
words__title_group: str = "GROUP"
words__title_information: str = "INFORMATION"
words__title_remember: str = "REMEMBER"
words__title_share: str = "SHARE"
words__title_shares: str = "SHARES"
words__title_success: str = "SUCCESS"
words__title_summary: str = "SUMMARY"
words__title_threshold: str = "THRESHOLD"
words__title_check: str = "Check"
words__title_group: str = "Group"
words__title_information: str = "Information"
words__title_recipient: str = "Recipient"
words__title_remember: str = "Remember"
words__title_share: str = "Share"
words__title_shares: str = "Shares"
words__title_success: str = "Success"
words__title_summary: str = "Summary"
words__title_threshold: str = "Threshold"
words__unknown: str = "Unknown"
words__warning: str = "Warning"
words__writable: str = "Writable"

@ -304,7 +304,7 @@ async def handle_UnlockPath(msg: UnlockPath) -> protobuf.MessageType:
else:
await confirm_action(
"confirm_coinjoin_access",
title="Coinjoin",
title="COINJOIN",
description=TR.coinjoin__access_account,
verb=TR.buttons__access,
)

@ -40,7 +40,7 @@ async def get_public_key(
from apps.common.paths import address_n_to_str
path = address_n_to_str(address_n)
await show_pubkey(key.xpub, TR.address__public_key, path=path)
await show_pubkey(key.xpub, TR.address__title_public_key, path=path)
return key

@ -58,13 +58,13 @@ async def require_confirm_stake(
addr_str = address_from_bytes(addr_bytes, network)
total_amount = format_ethereum_amount(value, None, network)
await confirm_ethereum_staking_tx(
TR.ethereum__staking_stake, # title
TR.ethereum__staking_title_stake, # title
TR.ethereum__staking_stake_intro, # intro_question
TR.ethereum__staking_stake, # verb
TR.ethereum__staking_title_stake, # verb
total_amount, # total_amount
maximum_fee, # maximum_fee
addr_str, # address
TR.ethereum__staking_stake_address, # address_title
TR.ethereum__staking_title_stake_address, # address_title
fee_info_items, # info_items
chunkify=chunkify,
)
@ -83,13 +83,13 @@ async def require_confirm_unstake(
total_amount = format_ethereum_amount(value, None, network)
await confirm_ethereum_staking_tx(
TR.ethereum__staking_unstake, # title
TR.ethereum__staking_title_unstake, # title
TR.ethereum__staking_unstake_intro, # intro_question
TR.ethereum__staking_unstake, # verb
TR.ethereum__staking_title_unstake, # verb
total_amount, # total_amount
maximum_fee, # maximum_fee
addr_str, # address
TR.ethereum__staking_stake_address, # address_title
TR.ethereum__staking_title_stake_address, # address_title
fee_info_items, # info_items
chunkify=chunkify,
)
@ -105,13 +105,13 @@ async def require_confirm_claim(
addr_str = address_from_bytes(addr_bytes, network)
await confirm_ethereum_staking_tx(
TR.ethereum__staking_claim, # title
TR.ethereum__staking_title_claim, # title
TR.ethereum__staking_claim_intro, # intro_question
TR.ethereum__staking_claim, # verb
TR.ethereum__staking_title_claim, # verb
"", # total_amount
maximum_fee, # maximum_fee
addr_str, # address
TR.ethereum__staking_claim_address, # address_title
TR.ethereum__staking_title_claim_address, # address_title
fee_info_items, # info_items
chunkify=chunkify,
)

@ -266,7 +266,7 @@ async def confirm_system_transfer(
blockhash: bytes,
) -> None:
await confirm_value(
title=TR.words__recipient,
title=TR.words__title_recipient,
value=base58.encode(transfer_instruction.recipient_account[0]),
description="",
br_type="confirm_recipient",
@ -295,7 +295,7 @@ async def confirm_token_transfer(
blockhash: bytes,
):
await confirm_value(
title=TR.words__recipient,
title=TR.words__title_recipient,
value=base58.encode(destination_account),
description="",
br_type="confirm_recipient",

@ -18,13 +18,13 @@ def _storage_message_to_str(message: config.StorageMessage | None) -> str | None
if message == config.StorageMessage.NO_MSG:
return ""
if message == config.StorageMessage.VERIFYING_PIN_MSG:
return TR.storage_msg__verifying_pin
return TR.storage_msg__title_verifying_pin
if message == config.StorageMessage.PROCESSING_MSG:
return TR.storage_msg__processing
return TR.storage_msg__title_processing
if message == config.StorageMessage.STARTING_MSG:
return TR.storage_msg__starting
return TR.storage_msg__title_starting
if message == config.StorageMessage.WRONG_PIN_MSG:
return TR.storage_msg__wrong_pin
return TR.storage_msg__title_wrong_pin
raise RuntimeError # unknown message
@ -56,14 +56,13 @@ def progress(
indeterminate: bool = False,
) -> ProgressLayout:
if description is None:
description = TR.progress__please_wait # def_arg
if title is not None:
title = title.upper()
elif not utils.MODEL_IS_T2B1:
# on TT, uppercase the description which ends up on top of the screen
# when no title is set
description = description.upper()
description = TR.progress__title_please_wait # def_arg
# elif not utils.MODEL_IS_T2B1:
# TODO: keep this?
# # on TT, uppercase the description which ends up on top of the screen
# # when no title is set
# description = description.upper()
return RustProgress(
layout=trezorui2.show_progress(

@ -403,7 +403,7 @@ def confirm_reset_device(
interact(
RustLayout(
trezorui2.confirm_reset_device(
title=title.upper(),
title=title,
button=button,
)
),
@ -563,7 +563,7 @@ def show_pubkey(
mismatch_title: str | None = None,
br_type: str = "show_pubkey",
) -> Awaitable[None]:
title = title or TR.address__public_key # def_arg
title = title or TR.address__title_public_key # def_arg
mismatch_title = mismatch_title or TR.addr_mismatch__key_mismatch # def_arg
return show_address(
address=pubkey,
@ -691,8 +691,8 @@ async def confirm_output(
output_index: int | None = None,
chunkify: bool = False,
) -> None:
title = title or TR.send__confirm_sending # def_arg
address_title = TR.words__recipient
title = title or TR.send__title_sending_amount # def_arg
address_title = TR.words__title_recipient
if output_index is not None:
address_title += f" #{output_index + 1}"
amount_title = TR.words__amount
@ -748,7 +748,7 @@ async def should_show_payment_request_details(
memos_str = "\n".join(memos)
await _placeholder_confirm(
"confirm_payment_request",
TR.send__title_confirm_sending,
TR.send__title_sending_amount,
description=f"{amount} to\n{recipient_name}\n{memos_str}",
br_code=ButtonRequestType.ConfirmOutput,
)
@ -1107,7 +1107,7 @@ if not utils.BITCOIN_ONLY:
)
# confirmation
if verb == TR.ethereum__staking_claim:
if verb == TR.ethereum__staking_title_claim:
amount_title = verb
amount_value = ""
else:
@ -1183,7 +1183,7 @@ if not utils.BITCOIN_ONLY:
# Allowing going back and forth between recipient and summary/details
await confirm_blob(
br_type,
TR.words__recipient,
TR.words__title_recipient,
recipient,
verb=TR.buttons__continue,
chunkify=chunkify,
@ -1365,7 +1365,7 @@ async def confirm_signverify(
while True:
await confirm_blob(
br_type,
TR.sign_message__confirm_address,
TR.sign_message__title_confirm_address,
address,
verb=TR.buttons__continue,
br_code=BR_TYPE_OTHER,
@ -1374,7 +1374,7 @@ async def confirm_signverify(
try:
await confirm_blob(
br_type,
TR.sign_message__confirm_message,
TR.sign_message__title_confirm_message,
message,
verb_cancel="^",
br_code=BR_TYPE_OTHER,

@ -23,7 +23,7 @@ async def request_word(
) -> str:
from trezor.wire.context import wait
prompt = TR.recovery__word_x_of_y_template.format(word_index + 1, word_count)
prompt = TR.recovery__word_x_of_y_title_template.format(word_index + 1, word_count)
can_go_back = word_index > 0

@ -93,7 +93,7 @@ async def select_word(
RustLayout(
trezorui2.select_word(
title="",
description=TR.reset__select_word_template.format(word_ordinal),
description=TR.reset__select_word_title_template.format(word_ordinal),
words=(words[0].lower(), words[1].lower(), words[2].lower()),
)
)

@ -256,11 +256,6 @@ def confirm_action(
exc: ExceptionType = ActionCancelled,
br_code: ButtonRequestType = BR_TYPE_OTHER,
) -> Awaitable[None]:
if verb is not None:
verb = verb.upper()
if verb_cancel is not None:
verb_cancel = verb_cancel.upper()
if description is not None and description_param is not None:
description = description.format(description_param)
@ -268,7 +263,7 @@ def confirm_action(
interact(
RustLayout(
trezorui2.confirm_action(
title=title.upper(),
title=title,
action=action,
description=description,
verb=verb,
@ -292,8 +287,6 @@ def confirm_single(
description_param: str | None = None,
verb: str | None = None,
) -> Awaitable[None]:
if verb is not None:
verb = verb.upper()
description_param = description_param or ""
# Placeholders are coming from translations in form of {0}
@ -306,7 +299,7 @@ def confirm_single(
interact(
RustLayout(
trezorui2.confirm_emphasized(
title=title.upper(),
title=title,
items=(begin, (True, description_param), end),
verb=verb,
)
@ -327,7 +320,7 @@ def confirm_reset_device(title: str, recovery: bool = False) -> Awaitable[None]:
interact(
RustLayout(
trezorui2.confirm_reset_device(
title=title.upper(),
title=title,
button=button,
)
),
@ -362,7 +355,7 @@ async def prompt_backup() -> bool:
result = await interact(
RustLayout(
trezorui2.confirm_action(
title=TR.words__warning.upper(),
title=TR.words__warning,
action=TR.backup__want_to_skip,
description=TR.backup__can_back_up_anytime,
verb=TR.buttons__back_up,
@ -511,11 +504,11 @@ def show_pubkey(
mismatch_title: str | None = None,
br_type: str = "show_pubkey",
) -> Awaitable[None]:
title = title or TR.address__public_key # def_arg
title = title or TR.address__title_public_key # def_arg
mismatch_title = mismatch_title or TR.addr_mismatch__key_mismatch # def_arg
return show_address(
address=pubkey,
title=title.upper(),
title=title,
account=account,
path=path,
br_type=br_type,
@ -538,7 +531,7 @@ async def show_error_and_raise(
trezorui2.show_error(
title=subheader or "",
description=content,
button=button.upper(),
button=button,
allow_cancel=False,
)
),
@ -562,7 +555,7 @@ def show_warning(
trezorui2.show_warning(
title=content,
description=subheader or "",
button=button.upper(),
button=button,
)
),
br_type,
@ -584,7 +577,7 @@ def show_success(
trezorui2.show_success(
title=content,
description=subheader or "",
button=button.upper(),
button=button,
allow_cancel=False,
)
),
@ -612,16 +605,16 @@ async def confirm_output(
recipient_title = title
elif output_index is not None:
amount_title = f"{TR.words__amount} #{output_index + 1}"
recipient_title = f"{TR.words__recipient} #{output_index + 1}"
recipient_title = f"{TR.words__title_recipient} #{output_index + 1}"
else:
amount_title = TR.send__confirm_sending
amount_title = TR.send__title_sending_amount
recipient_title = TR.send__title_sending_to
while True:
result = await interact(
RustLayout(
trezorui2.confirm_value(
title=recipient_title.upper(),
title=recipient_title,
subtitle=address_label,
description=None,
value=address,
@ -640,7 +633,7 @@ async def confirm_output(
result = await interact(
RustLayout(
trezorui2.confirm_value(
title=amount_title.upper(),
title=amount_title,
subtitle=None,
description=None,
value=amount,
@ -709,10 +702,10 @@ async def should_show_more(
result = await interact(
RustLayout(
trezorui2.confirm_with_info(
title=title.upper(),
title=title,
items=para,
button=confirm.upper(),
info_button=button_text.upper(),
button=confirm,
info_button=button_text,
)
),
br_type,
@ -780,7 +773,7 @@ def confirm_blob(
chunkify: bool = False,
) -> Awaitable[None]:
verb = verb or TR.buttons__confirm # def_arg
title = title.upper()
title = title
layout = RustLayout(
trezorui2.confirm_blob(
title=title,
@ -881,7 +874,7 @@ def confirm_value(
raise ValueError("Either verb or hold=True must be set")
if verb:
verb = verb.upper()
verb = verb
info_items = info_items or []
info_layout = RustLayout(
@ -896,7 +889,7 @@ def confirm_value(
with_info(
RustLayout(
trezorui2.confirm_value(
title=title.upper(),
title=title,
subtitle=subtitle,
description=description,
value=value,
@ -927,7 +920,7 @@ def confirm_properties(
interact(
RustLayout(
trezorui2.confirm_properties(
title=title.upper(),
title=title,
items=items,
hold=hold,
)
@ -984,7 +977,7 @@ def confirm_summary(
total_layout = RustLayout(
trezorui2.confirm_total(
title=title.upper(),
title=title,
items=items,
info_button=bool(info_items),
)
@ -992,7 +985,7 @@ def confirm_summary(
info_items = info_items or []
info_layout = RustLayout(
trezorui2.show_info_with_cancel(
title=info_title.upper() if info_title else TR.words__title_information,
title=info_title if info_title else TR.words__title_information,
items=info_items,
)
)
@ -1034,7 +1027,7 @@ if not utils.BITCOIN_ONLY:
# Allowing going back and forth between recipient and summary/details
await confirm_blob(
br_type,
TR.words__recipient.upper(),
TR.words__title_recipient,
recipient,
verb=TR.buttons__continue,
chunkify=chunkify,
@ -1077,7 +1070,7 @@ if not utils.BITCOIN_ONLY:
)
# confirmation
if verb == TR.ethereum__staking_claim:
if verb == TR.ethereum__staking_title_claim:
items = ((TR.send__maximum_fee, maximum_fee),)
else:
items = (
@ -1144,11 +1137,11 @@ def confirm_metadata(
verb = verb or TR.buttons__continue # def_arg
return confirm_action(
br_type,
title=title.upper(),
title=title,
action="",
description=content,
description_param=param,
verb=verb.upper(),
verb=verb,
hold=hold,
br_code=br_code,
)
@ -1157,7 +1150,7 @@ def confirm_metadata(
def confirm_replacement(title: str, txid: str) -> Awaitable[None]:
return confirm_blob(
"confirm_replacement",
title.upper(),
title,
txid,
TR.send__transaction_id,
TR.buttons__continue,
@ -1244,7 +1237,7 @@ def confirm_modify_fee(
) -> Awaitable[None]:
fee_layout = RustLayout(
trezorui2.confirm_modify_fee(
title=title.upper(),
title=title,
sign=sign,
user_fee_change=user_fee_change,
total_fee_new=total_fee_new,
@ -1302,10 +1295,10 @@ async def confirm_signverify(
chunkify: bool = False,
) -> None:
if verify:
address_title = TR.sign_message__verify_address
address_title = TR.sign_message__title_verify_address
br_type = "verify_message"
else:
address_title = TR.sign_message__confirm_address
address_title = TR.sign_message__title_confirm_address
br_type = "sign_message"
address_layout = RustLayout(
@ -1341,7 +1334,7 @@ async def confirm_signverify(
message_layout = RustLayout(
trezorui2.confirm_blob(
title=TR.sign_message__confirm_message,
title=TR.sign_message__title_confirm_message,
description=None,
data=message,
extra=None,
@ -1499,7 +1492,7 @@ def confirm_set_new_pin(
interact(
RustLayout(
trezorui2.confirm_emphasized(
title=title.upper(),
title=title,
items=(
(True, description + "\n\n"),
information,

@ -56,7 +56,7 @@ async def confirm_fido(
"""Webauthn confirmation for one or more credentials."""
confirm = _RustFidoLayout(
trezorui2.confirm_fido(
title=header.upper(),
title=header,
app_name=app_name,
icon_name=icon_name,
accounts=accounts,

@ -132,7 +132,7 @@ async def continue_recovery(
trezorui2.confirm_recovery(
title=text,
description=description,
button=button_label.upper(),
button=button_label,
info_button=info_func is not None,
dry_run=dry_run,
)
@ -161,7 +161,7 @@ async def show_recovery_warning(
trezorui2.show_warning(
title=content,
description=subheader or "",
button=button.upper(),
button=button,
allow_cancel=False,
)
),

@ -158,7 +158,7 @@ async def _prompt_number(
) -> int:
num_input = RustLayout(
trezorui2.request_number(
title=title.upper(),
title=title,
description=description,
count=count,
min_count=min_count,
@ -359,7 +359,7 @@ async def show_reset_warning(
trezorui2.show_warning(
title=subheader or "",
description=content,
button=button.upper(),
button=button,
allow_cancel=False,
)
),

@ -1,6 +1,6 @@
#!/usr/bin/env python3
# script used to generate /embed/extmod/modtrezorui/font_*_*.c
# script used to generate /embed/lib/fonts/font_*_*.c
from __future__ import annotations

@ -5,7 +5,7 @@
"addr_mismatch__support_url": "text,1",
"addr_mismatch__wrong_derivation_path": "text,2",
"addr_mismatch__xpub_mismatch": "text,1",
"address__public_key": "text,1",
"address__title_public_key": "text,1",
"address__title_cosigner": "title,1",
"address__title_receive_address": "title,1",
"address__title_yours": "title,1",
@ -487,7 +487,7 @@
"progress__loading_transaction": "text,1",
"progress__locking_device": "text,1",
"progress__one_second_left": "text,1",
"progress__please_wait": "text,1",
"progress__title_please_wait": "text,1",
"progress__processing": "text,1",
"progress__refreshing": "text,1",
"progress__signing_transaction": "text,1",
@ -531,7 +531,7 @@
"recovery__wanna_cancel_dry_run": "text,3",
"recovery__wanna_cancel_recovery": "text,3",
"recovery__word_count_template": "text,1",
"recovery__word_x_of_y_template": "text,1",
"recovery__word_x_of_y_title_template": "text,1",
"recovery__x_more_items_starting_template_plural": "text,2",
"recovery__x_more_shares_needed_template_plural": "text,2",
"recovery__x_of_y_entered_template": "text,2",
@ -572,7 +572,7 @@
"reset__recovery_share_title_template": "title,1",
"reset__required_number_of_groups": "text,3",
"reset__select_correct_word": "text,3",
"reset__select_word_template": "text,1",
"reset__select_word_title_template": "text,1",
"reset__select_word_x_of_y_template": "text,1",
"reset__set_it_to_count_template": "text,2",
"reset__share_checked_successfully_template": "text,2",
@ -661,10 +661,10 @@
"share_words__words_in_order": "text,2",
"share_words__wrote_down_all": "text,2",
"sign_message__bytes_template": "text,1",
"sign_message__confirm_address": "title,1",
"sign_message__confirm_message": "title,1",
"sign_message__title_confirm_address": "title,1",
"sign_message__title_confirm_message": "title,1",
"sign_message__message_size": "text,1",
"sign_message__verify_address": "text,1",
"sign_message__title_verify_address": "text,1",
"solana__account_index": "text,1",
"solana__associated_token_account": "text,2",
"solana__confirm_multisig": "text,1",

@ -33,7 +33,7 @@
"addr_mismatch__support_url": "trezor.io/support",
"addr_mismatch__wrong_derivation_path": "Chybná derivační cesta pro vybraný účet.",
"addr_mismatch__xpub_mismatch": "Neshoduje se XPUB?",
"address__public_key": "Veřejný klíč",
"address__title_public_key": "Veřejný klíč",
"address__title_cosigner": "DALŠÍ PODEPISUJÍCÍ",
"address__title_receive_address": "PŘIJÍMACÍ ADRESA",
"address__title_yours": "VAŠE",
@ -322,13 +322,13 @@
"ethereum__units_template": "Jednotky: {0}",
"ethereum__unknown_token": "Neznámý token",
"ethereum__valid_signature": "Podpis je platný.",
"ethereum__staking_stake": "STAKE",
"ethereum__staking_stake_address": "STAKE ADRESA",
"ethereum__staking_title_stake": "STAKE",
"ethereum__staking_title_stake_address": "STAKE ADRESA",
"ethereum__staking_stake_intro": "Stakovat ETH na Everstake?",
"ethereum__staking_unstake": "ZRUŠIT STAKOVÁNÍ",
"ethereum__staking_title_unstake": "ZRUŠIT STAKOVÁNÍ",
"ethereum__staking_unstake_intro": "Zrušit stakování ETH z Everstake?",
"ethereum__staking_claim": "NÁROKOVAT",
"ethereum__staking_claim_address": "NÁROKOVAT ADRESU",
"ethereum__staking_title_claim": "NÁROKOVAT",
"ethereum__staking_title_claim_address": "NÁROKOVAT ADRESU",
"ethereum__staking_claim_intro": "Nárokovat ETH z Everstake?",
"experimental_mode__enable": "Povolit experimentální funkce?",
"experimental_mode__only_for_dev": "Pouze pro vývoj a beta testování!",
@ -522,7 +522,7 @@
"progress__loading_transaction": "Načítání transakce...",
"progress__locking_device": "Zamykání zařízení...",
"progress__one_second_left": "Zbývá 1 s",
"progress__please_wait": "POČKEJTE",
"progress__title_please_wait": "POČKEJTE",
"progress__refreshing": "Obnovování...",
"progress__signing_transaction": "Podpis transakce...",
"progress__syncing": "Synchronizace...",
@ -565,7 +565,7 @@
"recovery__wanna_cancel_dry_run": "Opravdu chcete zrušit kontrolu zálohy?",
"recovery__wanna_cancel_recovery": "Opravdu chcete proces obnovy zrušit?",
"recovery__word_count_template": "(slova: {0})",
"recovery__word_x_of_y_template": "SLOVO {0} Z {1}",
"recovery__word_x_of_y_title_template": "SLOVO {0} Z {1}",
"recovery__x_more_items_starting_template_plural": "Zahajuje se dalších {count} {plural}",
"recovery__x_more_shares_needed_template_plural": "Je potřeba dalších {count} {plural}.",
"recovery__x_of_y_entered_template": "Zadáno {0} částí z {1}.",
@ -606,7 +606,7 @@
"reset__recovery_share_title_template": "ČÁST ZÁLOHY Č. {0}",
"reset__required_number_of_groups": "Požadovaný počet skupin pro obnovení.",
"reset__select_correct_word": "Pro každou pozici vyberte správné slovo.",
"reset__select_word_template": "VYBRAT SLOVO {0}",
"reset__select_word_title_template": "VYBRAT SLOVO {0}",
"reset__select_word_x_of_y_template": "Vyb. slovo {0} z {1}:",
"reset__set_it_to_count_template": "Nastavte {0} a budete potřebovat ",
"reset__share_checked_successfully_template": "Proběhla kontrola {0}. části zálohy.",
@ -695,10 +695,10 @@
"share_words__words_in_order": " slova v pořadí.",
"share_words__wrote_down_all": "Zapsal/a jsem si všechna ",
"sign_message__bytes_template": "{0} bajtů",
"sign_message__confirm_address": "PODEPISOVÁNÍ ADRESY",
"sign_message__confirm_message": "POTVRDIT ZPRÁVU",
"sign_message__title_confirm_address": "PODEPISOVÁNÍ ADRESY",
"sign_message__title_confirm_message": "POTVRDIT ZPRÁVU",
"sign_message__message_size": "Velikost zprávy:",
"sign_message__verify_address": "OVĚŘIT ADRESU",
"sign_message__title_verify_address": "OVĚŘIT ADRESU",
"solana__account_index": "Index účtu",
"solana__associated_token_account": "Přidružený tokenový účet",
"solana__confirm_multisig": "Potvrďte multisig",
@ -780,10 +780,10 @@
"stellar__value_sha256": "Hodnota (SHA-256):",
"stellar__wanna_clean_value_key_template": "Chcete vymazat klíč hodnoty {0}?",
"stellar__your_account": " váš účet",
"storage_msg__verifying_pin": "OVĚŘOVÁNÍ PINU",
"storage_msg__processing": "ZPRACOVÁVÁNÍ",
"storage_msg__starting": "SPOUŠTĚNÍ",
"storage_msg__wrong_pin": "ŠPATNÝ PIN",
"storage_msg__title_verifying_pin": "OVĚŘOVÁNÍ PINU",
"storage_msg__title_processing": "ZPRACOVÁVÁNÍ",
"storage_msg__title_starting": "SPOUŠTĚNÍ",
"storage_msg__title_wrong_pin": "ŠPATNÝ PIN",
"tezos__baker_address": "Adresa bakera:",
"tezos__balance": "Zůstatek:",
"tezos__ballot": "Hlasování:",
@ -856,7 +856,7 @@
"words__please_check_again": "Zkontrolujte to znovu",
"words__please_try_again": "Zkuste to znovu",
"words__really_wanna": "Opravdu chcete",
"words__recipient": "Příjemce",
"words__title_recipient": "Příjemce",
"words__sign": "Podepsat",
"words__signer": "Podepisující osoba",
"words__title_check": "ZKONTROLOVAT",

@ -33,7 +33,7 @@
"addr_mismatch__support_url": "trezor.io/support",
"addr_mismatch__wrong_derivation_path": "Ableitungspfad für gewähltes Konto falsch.",
"addr_mismatch__xpub_mismatch": "XPUB passt nicht?",
"address__public_key": "Public Key",
"address__title_public_key": "Public Key",
"address__title_cosigner": "MITUNTERZEICH.",
"address__title_receive_address": "EMPFÄNG-ADRESSE",
"address__title_yours": "DEINER",
@ -322,13 +322,13 @@
"ethereum__units_template": "{0} Einheiten",
"ethereum__unknown_token": "Ungültiger Token",
"ethereum__valid_signature": "Die Signatur ist gültig.",
"ethereum__staking_stake": "STAKE",
"ethereum__staking_stake_address": "STAKING ADRESSE",
"ethereum__staking_title_stake": "STAKE",
"ethereum__staking_title_stake_address": "STAKING ADRESSE",
"ethereum__staking_stake_intro": "ETH auf Everstake staken?",
"ethereum__staking_unstake": "ENTSTAKEN",
"ethereum__staking_title_unstake": "ENTSTAKEN",
"ethereum__staking_unstake_intro": "ETH von Everstake entstaken?",
"ethereum__staking_claim": "EINLÖSEN",
"ethereum__staking_claim_address": "ADRESSE ZUM EINLÖSEN",
"ethereum__staking_title_claim": "EINLÖSEN",
"ethereum__staking_title_claim_address": "ADRESSE ZUM EINLÖSEN",
"ethereum__staking_claim_intro": "ETH von Everstake einlösen?",
"experimental_mode__enable": "Experimentelle Funktionen aktivieren?",
"experimental_mode__only_for_dev": "Nur für Entwicklung und Beta-Tests.",
@ -522,7 +522,7 @@
"progress__loading_transaction": "Transakt. lädt...",
"progress__locking_device": "Das Gerät sperren...",
"progress__one_second_left": "1 Sekunde verbleibend",
"progress__please_wait": "BITTE WARTEN",
"progress__title_please_wait": "BITTE WARTEN",
"progress__refreshing": "Wird aktualisiert...",
"progress__signing_transaction": "Transakt. wird signiert",
"progress__syncing": "Wird synchronisiert...",
@ -565,7 +565,7 @@
"recovery__wanna_cancel_dry_run": "Möchtest du die Backup-Überprüfung wirklich abbrechen?",
"recovery__wanna_cancel_recovery": "Möchtest du die Wiederherstellung wirklich abbrechen?",
"recovery__word_count_template": "({0} Wörter)",
"recovery__word_x_of_y_template": "WORT {0} VON {1}",
"recovery__word_x_of_y_title_template": "WORT {0} VON {1}",
"recovery__x_more_items_starting_template_plural": "{count} mehr {plural} gestartet",
"recovery__x_more_shares_needed_template_plural": "{count} mehr {plural} erforderlich.",
"recovery__x_of_y_entered_template": "{0} von {1} Shares erfolgreich eingegeben.",
@ -606,7 +606,7 @@
"reset__recovery_share_title_template": "RECOVERY SHARE #{0}",
"reset__required_number_of_groups": "Zur Wiederherstellung erforderliche Anzahl von Gruppen.",
"reset__select_correct_word": "Wähle für jede Position das richtige Wort.",
"reset__select_word_template": "{0} WORT AUSWÄHLEN",
"reset__select_word_title_template": "{0} WORT AUSWÄHLEN",
"reset__select_word_x_of_y_template": "Wort {0} von {1}:",
"reset__set_it_to_count_template": "Bei {0} benötigst du ",
"reset__share_checked_successfully_template": "Recovery Share #{0} erfolgreich geprüft.",
@ -695,10 +695,10 @@
"share_words__words_in_order": " Wörter der Reihe nach notiert.",
"share_words__wrote_down_all": "Ich habe alle ",
"sign_message__bytes_template": "{0} Bytes",
"sign_message__confirm_address": "SIGNIERADRESSE",
"sign_message__confirm_message": "NACHR. BESTÄTIGEN",
"sign_message__title_confirm_address": "SIGNIERADRESSE",
"sign_message__title_confirm_message": "NACHR. BESTÄTIGEN",
"sign_message__message_size": "Größe der Nachricht:",
"sign_message__verify_address": "ADRESSE VERIFIZIEREN",
"sign_message__title_verify_address": "ADRESSE VERIFIZIEREN",
"solana__account_index": "Konto-Index",
"solana__associated_token_account": "Zugehöriges Token-Konto",
"solana__confirm_multisig": "Multisig bestätigen",
@ -780,10 +780,10 @@
"stellar__value_sha256": "Wert (SHA-256):",
"stellar__wanna_clean_value_key_template": "Möchtest du den Wert-Key {0} löschen?",
"stellar__your_account": " dein Konto",
"storage_msg__verifying_pin": "PIN ÜBERPRÜFEN",
"storage_msg__processing": "VERARBEITUNG",
"storage_msg__starting": "STARTVORGANG",
"storage_msg__wrong_pin": "FALSCHER PIN",
"storage_msg__title_verifying_pin": "PIN ÜBERPRÜFEN",
"storage_msg__title_processing": "VERARBEITUNG",
"storage_msg__title_starting": "STARTVORGANG",
"storage_msg__title_wrong_pin": "FALSCHER PIN",
"tezos__baker_address": "Baker-Adresse:",
"tezos__balance": "Guthaben:",
"tezos__ballot": "Abstimmung:",
@ -856,7 +856,7 @@
"words__please_check_again": "Noch einmal prüfen",
"words__please_try_again": "Noch einmal versuchen",
"words__really_wanna": "Möchtest du wirklich",
"words__recipient": "Empfänger",
"words__title_recipient": "Empfänger",
"words__sign": "Signieren",
"words__signer": "Unterzeichner",
"words__title_check": "PRÜFEN",

@ -10,25 +10,25 @@
"addr_mismatch__support_url": "trezor.io/support",
"addr_mismatch__wrong_derivation_path": "Wrong derivation path for selected account.",
"addr_mismatch__xpub_mismatch": "XPUB mismatch?",
"address__public_key": "Public key",
"address__title_cosigner": "COSIGNER",
"address__title_receive_address": "RECEIVE ADDRESS",
"address__title_yours": "YOURS",
"address__title_public_key": "Public key",
"address__title_cosigner": "Cosigner",
"address__title_receive_address": "Receive address",
"address__title_yours": "Yours",
"address_details__derivation_path": "Derivation path:",
"address_details__title_receive_address": "RECEIVE ADDRESS",
"address_details__title_receiving_to": "RECEIVING TO",
"address_details__title_receive_address": "Receive address",
"address_details__title_receiving_to": "Receiving to",
"authenticate__confirm_template": "Allow connected computer to confirm your {0} is genuine?",
"authenticate__header": "Authenticate device",
"auto_lock__change_template": "Auto-lock your Trezor after {0} of inactivity?",
"auto_lock__title": "AUTO-LOCK DELAY",
"auto_lock__title": "Auto-lock delay",
"backup__can_back_up_anytime": "You can back up your Trezor once, at any time.",
"backup__it_should_be_backed_up": "You should back up your new wallet right now.",
"backup__it_should_be_backed_up_now": "It should be backed up now!",
"backup__new_wallet_created": "New wallet created.\n",
"backup__new_wallet_successfully_created": "New wallet created successfully.",
"backup__recover_anytime": "You can use your backup to recover your wallet at any time.",
"backup__title_backup_wallet": "BACK UP WALLET",
"backup__title_skip": "SKIP BACKUP",
"backup__title_backup_wallet": "Back up wallet",
"backup__title_skip": "Skip backup",
"backup__want_to_skip": "Are you sure you want to skip the backup?",
"binance__buy": "Buy",
"binance__confirm_cancel": "Confirm cancel",
@ -54,59 +54,59 @@
"bitcoin__new_fee_rate": "New fee rate:",
"bitcoin__simple_send_of": "Simple send of",
"bitcoin__ticket_amount": "Ticket amount:",
"bitcoin__title_confirm_details": "CONFIRM DETAILS",
"bitcoin__title_finalize_transaction": "FINALIZE TRANSACTION",
"bitcoin__title_high_mining_fee": "HIGH MINING FEE",
"bitcoin__title_meld_transaction": "MELD TRANSACTIONS",
"bitcoin__title_modify_amount": "MODIFY AMOUNT",
"bitcoin__title_payjoin": "PAYJOIN",
"bitcoin__title_proof_of_ownership": "PROOF OF OWNERSHIP",
"bitcoin__title_purchase_ticket": "PURCHASE TICKET",
"bitcoin__title_update_transaction": "UPDATE TRANSACTION",
"bitcoin__title_confirm_details": "Confirm details",
"bitcoin__title_finalize_transaction": "Finalize transaction",
"bitcoin__title_high_mining_fee": "High mining fee",
"bitcoin__title_meld_transaction": "Meld transactions",
"bitcoin__title_modify_amount": "Modify amount",
"bitcoin__title_payjoin": "Payjoin",
"bitcoin__title_proof_of_ownership": "Proof of ownership",
"bitcoin__title_purchase_ticket": "Purchase ticket",
"bitcoin__title_update_transaction": "Update transaction",
"bitcoin__unknown_path": "Unknown path",
"bitcoin__unknown_transaction": "Unknown transaction",
"bitcoin__unusually_high_fee": "Unusually high fee.",
"bitcoin__unverified_external_inputs": "The transaction contains unverified external inputs.",
"bitcoin__valid_signature": "The signature is valid.",
"bitcoin__voting_rights": "Voting rights to:",
"buttons__abort": "ABORT",
"buttons__access": "ACCESS",
"buttons__again": "AGAIN",
"buttons__allow": "ALLOW",
"buttons__back": "BACK",
"buttons__back_up": "BACK UP",
"buttons__cancel": "CANCEL",
"buttons__change": "CHANGE",
"buttons__check": "CHECK",
"buttons__check_again": "CHECK AGAIN",
"buttons__close": "CLOSE",
"buttons__confirm": "CONFIRM",
"buttons__continue": "CONTINUE",
"buttons__details": "DETAILS",
"buttons__enable": "ENABLE",
"buttons__enter": "ENTER",
"buttons__enter_share": "ENTER SHARE",
"buttons__export": "EXPORT",
"buttons__format": "FORMAT",
"buttons__go_back": "GO BACK",
"buttons__hold_to_confirm": "HOLD TO CONFIRM",
"buttons__info": "INFO",
"buttons__install": "INSTALL",
"buttons__more_info": "MORE INFO",
"buttons__ok_i_understand": "OK, I UNDERSTAND",
"buttons__purchase": "PURCHASE",
"buttons__quit": "QUIT",
"buttons__restart": "RESTART",
"buttons__retry": "RETRY",
"buttons__select": "SELECT",
"buttons__set": "SET",
"buttons__show_all": "SHOW ALL",
"buttons__show_details": "SHOW DETAILS",
"buttons__show_words": "SHOW WORDS",
"buttons__skip": "SKIP",
"buttons__try_again": "TRY AGAIN",
"buttons__turn_off": "TURN OFF",
"buttons__turn_on": "TURN ON",
"buttons__abort": "Abort",
"buttons__access": "Access",
"buttons__again": "Again",
"buttons__allow": "Allow",
"buttons__back": "Back",
"buttons__back_up": "Back up",
"buttons__cancel": "Cancel",
"buttons__change": "Change",
"buttons__check": "Check",
"buttons__check_again": "Check again",
"buttons__close": "Close",
"buttons__confirm": "Confirm",
"buttons__continue": "Continue",
"buttons__details": "Details",
"buttons__enable": "Enable",
"buttons__enter": "Enter",
"buttons__enter_share": "Enter share",
"buttons__export": "Export",
"buttons__format": "Format",
"buttons__go_back": "Go back",
"buttons__hold_to_confirm": "Hold to confirm",
"buttons__info": "Info",
"buttons__install": "Install",
"buttons__more_info": "More info",
"buttons__ok_i_understand": "Ok, i understand",
"buttons__purchase": "Purchase",
"buttons__quit": "Quit",
"buttons__restart": "Restart",
"buttons__retry": "Retry",
"buttons__select": "Select",
"buttons__set": "Set",
"buttons__show_all": "Show all",
"buttons__show_details": "Show details",
"buttons__show_words": "Show words",
"buttons__skip": "Skip",
"buttons__try_again": "Try again",
"buttons__turn_off": "Turn off",
"buttons__turn_on": "Turn on",
"cardano__addr_base": "Base",
"cardano__addr_enterprise": "Enterprise",
"cardano__addr_legacy": "Legacy",
@ -220,21 +220,21 @@
"coinjoin__do_not_disconnect": "Do not disconnect your Trezor!",
"coinjoin__max_mining_fee": "Max mining fee",
"coinjoin__max_rounds": "Max rounds",
"coinjoin__title": "AUTHORIZE COINJOIN",
"coinjoin__title_do_not_disconnect": "DO NOT DISCONNECT YOUR TREZOR!",
"coinjoin__title_progress": "COINJOIN IN PROGRESS",
"coinjoin__title": "Authorize coinjoin",
"coinjoin__title_do_not_disconnect": "Do not disconnect your trezor!",
"coinjoin__title_progress": "Coinjoin in progress",
"coinjoin__waiting_for_others": "Waiting for others",
"confirm_total__fee_rate": "Fee rate:",
"confirm_total__sending_from_account": "Sending from account:",
"confirm_total__title_fee": "FEE INFORMATION",
"confirm_total__title_sending_from": "SENDING FROM",
"confirm_total__title_fee": "Fee information",
"confirm_total__title_sending_from": "Sending from",
"debug__loading_seed": "Loading seed",
"debug__loading_seed_not_recommended": "Loading private seed is not recommended.",
"device_name__change_template": "Change device name to {0}?",
"device_name__title": "DEVICE NAME",
"device_name__title": "Device name",
"entropy__send": "Do you really want to send entropy?",
"entropy__title": "INTERNAL ENTROPY",
"entropy__title_confirm": "CONFIRM ENTROPY",
"entropy__title": "Internal entropy",
"entropy__title_confirm": "Confirm entropy",
"eos__about_to_sign_template": "You are about to sign {0}.",
"eos__action_name": "Action Name:",
"eos__arbitrary_data": "Arbitrary data",
@ -290,26 +290,26 @@
"ethereum__show_full_message": "Show full message",
"ethereum__show_full_struct": "Show full struct",
"ethereum__sign_eip712": "Really sign EIP-712 typed data?",
"ethereum__title_confirm_data": "CONFIRM DATA",
"ethereum__title_confirm_domain": "CONFIRM DOMAIN",
"ethereum__title_confirm_message": "CONFIRM MESSAGE",
"ethereum__title_confirm_struct": "CONFIRM STRUCT",
"ethereum__title_confirm_typed_data": "CONFIRM TYPED DATA",
"ethereum__title_signing_address": "SIGNING ADDRESS",
"ethereum__title_confirm_data": "Confirm data",
"ethereum__title_confirm_domain": "Confirm domain",
"ethereum__title_confirm_message": "Confirm message",
"ethereum__title_confirm_struct": "Confirm struct",
"ethereum__title_confirm_typed_data": "Confirm typed data",
"ethereum__title_signing_address": "Signing address",
"ethereum__units_template": "{0} units",
"ethereum__unknown_token": "Unknown token",
"ethereum__valid_signature": "The signature is valid.",
"ethereum__staking_stake": "STAKE",
"ethereum__staking_stake_address": "STAKE ADDRESS",
"ethereum__staking_title_stake": "Stake",
"ethereum__staking_title_stake_address": "Stake address",
"ethereum__staking_stake_intro": "Stake ETH on Everstake?",
"ethereum__staking_unstake": "UNSTAKE",
"ethereum__staking_title_unstake": "Unstake",
"ethereum__staking_unstake_intro": "Unstake ETH from Everstake?",
"ethereum__staking_claim": "CLAIM",
"ethereum__staking_claim_address": "CLAIM ADDRESS",
"ethereum__staking_title_claim": "Claim",
"ethereum__staking_title_claim_address": "Claim address",
"ethereum__staking_claim_intro": "Claim ETH from Everstake?",
"experimental_mode__enable": "Enable experimental features?",
"experimental_mode__only_for_dev": "Only for development and beta testing!",
"experimental_mode__title": "EXPERIMENTAL MODE",
"experimental_mode__title": "Experimental mode",
"fido__already_registered": "Already registered",
"fido__device_already_registered": "This device is already registered with this application.",
"fido__device_already_registered_with_template": "This device is already registered with {0}.",
@ -320,61 +320,61 @@
"fido__not_registered": "Not registered",
"fido__not_registered_with_template": "This device is not registered with\n{0}.",
"fido__please_enable_pin_protection": "Please enable PIN protection.",
"fido__title_authenticate": "FIDO2 AUTHENTICATE",
"fido__title_import_credential": "IMPORT CREDENTIAL",
"fido__title_list_credentials": "LIST CREDENTIALS",
"fido__title_register": "FIDO2 REGISTER",
"fido__title_remove_credential": "REMOVE CREDENTIAL",
"fido__title_reset": "FIDO2 RESET",
"fido__title_u2f_auth": "U2F AUTHENTICATE",
"fido__title_u2f_register": "U2F REGISTER",
"fido__title_verify_user": "FIDO2 VERIFY USER",
"fido__title_authenticate": "Fido2 authenticate",
"fido__title_import_credential": "Import credential",
"fido__title_list_credentials": "List credentials",
"fido__title_register": "Fido2 register",
"fido__title_remove_credential": "Remove credential",
"fido__title_reset": "FIDO2 reset",
"fido__title_u2f_auth": "U2F authenticate",
"fido__title_u2f_register": "U2F register",
"fido__title_verify_user": "FIDO2 verify user",
"fido__unable_to_verify_user": "Unable to verify user.",
"fido__wanna_erase_credentials": "Do you really want to erase all credentials?",
"firmware_update__title": "UPDATE FIRMWARE",
"firmware_update__title_fingerprint": "FW FINGERPRINT",
"firmware_update__title": "Update firmware",
"firmware_update__title_fingerprint": "FW fingerprint",
"homescreen__click_to_connect": "Click to Connect",
"homescreen__click_to_unlock": "Click to Unlock",
"homescreen__title_backup_failed": "BACKUP FAILED",
"homescreen__title_backup_needed": "BACKUP NEEDED",
"homescreen__title_coinjoin_authorized": "COINJOIN AUTHORIZED",
"homescreen__title_experimental_mode": "EXPERIMENTAL MODE",
"homescreen__title_no_usb_connection": "NO USB CONNECTION",
"homescreen__title_pin_not_set": "PIN NOT SET",
"homescreen__title_seedless": "SEEDLESS",
"homescreen__title_set": "CHANGE HOMESCREEN?",
"inputs__back": "BACK",
"inputs__cancel": "CANCEL",
"inputs__delete": "DELETE",
"inputs__enter": "ENTER",
"inputs__return": "RETURN",
"inputs__previous": "PREVIOUS",
"inputs__show": "SHOW",
"inputs__space": "SPACE",
"joint__title": "JOINT TRANSACTION",
"homescreen__title_backup_failed": "Backup failed",
"homescreen__title_backup_needed": "Backup needed",
"homescreen__title_coinjoin_authorized": "Coinjoin authorized",
"homescreen__title_experimental_mode": "Experimental mode",
"homescreen__title_no_usb_connection": "No USB connection",
"homescreen__title_pin_not_set": "PIN not set",
"homescreen__title_seedless": "Seedless",
"homescreen__title_set": "Change homescreen?",
"inputs__back": "Back",
"inputs__cancel": "Cancel",
"inputs__delete": "Delete",
"inputs__enter": "Enter",
"inputs__return": "Return",
"inputs__previous": "Previous",
"inputs__show": "Show",
"inputs__space": "Space",
"joint__title": "Joint transaction",
"joint__to_the_total_amount": "To the total amount:",
"joint__you_are_contributing": "You are contributing:",
"language__change_to_template": "Change language to {0}?",
"language__changed": "Language changed successfully",
"language__progress": "Changing language",
"language__title": "LANGUAGE SETTINGS",
"language__title": "Language settings",
"lockscreen__tap_to_connect": "Tap to connect",
"lockscreen__tap_to_unlock": "Tap to unlock",
"lockscreen__title_locked": "LOCKED",
"lockscreen__title_not_connected": "NOT CONNECTED",
"lockscreen__title_locked": "Locked",
"lockscreen__title_not_connected": "Not connected",
"misc__decrypt_value": "Decrypt value",
"misc__encrypt_value": "Encrypt value",
"misc__title_suite_labeling": "SUITE LABELING",
"misc__title_suite_labeling": "Suite labeling",
"modify_amount__decrease_amount": "Decrease amount by:",
"modify_amount__increase_amount": "Increase amount by:",
"modify_amount__new_amount": "New amount:",
"modify_amount__title": "MODIFY AMOUNT",
"modify_amount__title": "Modify amount",
"modify_fee__decrease_fee": "Decrease fee by:",
"modify_fee__fee_rate": "Fee rate:",
"modify_fee__increase_fee": "Increase fee by:",
"modify_fee__new_transaction_fee": "New transaction fee:",
"modify_fee__no_change": "Fee did not change.\n",
"modify_fee__title": "MODIFY FEE",
"modify_fee__title": "Modify fee",
"modify_fee__transaction_fee": "Transaction fee:",
"monero__confirm_export": "Confirm export",
"monero__confirm_ki_sync": "Confirm ki sync",
@ -453,11 +453,11 @@
"passphrase__next_screen_will_show_passphrase": "Next screen will show the passphrase.",
"passphrase__please_enter": "Please enter your passphrase.",
"passphrase__revoke_on_device": "Do you want to revoke the passphrase on device setting?",
"passphrase__title_confirm": "CONFIRM PASSPHRASE",
"passphrase__title_enter": "ENTER PASSPHRASE",
"passphrase__title_hide": "HIDE PASSPHRASE",
"passphrase__title_settings": "PASSPHRASE SETTINGS",
"passphrase__title_source": "PASSPHRASE SOURCE",
"passphrase__title_confirm": "Confirm passphrase",
"passphrase__title_enter": "Enter passphrase",
"passphrase__title_hide": "Hide passphrase",
"passphrase__title_settings": "Passphrase settings",
"passphrase__title_source": "Passphrase source",
"passphrase__turn_off": "Turn off passphrase protection?",
"passphrase__turn_on": "Turn on passphrase protection?",
"pin__change": "Change PIN?",
@ -478,9 +478,9 @@
"pin__reenter_new": "Re-enter new PIN",
"pin__reenter_to_confirm": "Please re-enter PIN to confirm.",
"pin__should_be_long": "PIN should be 4-50 digits long.",
"pin__title_check_pin": "CHECK PIN",
"pin__title_settings": "PIN SETTINGS",
"pin__title_wrong_pin": "WRONG PIN",
"pin__title_check_pin": "Check PIN",
"pin__title_settings": "PIN settings",
"pin__title_wrong_pin": "Wrong PIN",
"pin__tries_left": "tries left",
"pin__turn_off": "Are you sure you want to turn off PIN protection?",
"pin__turn_on": "Turn on PIN protection?",
@ -499,13 +499,13 @@
"progress__loading_transaction": "Loading transaction...",
"progress__locking_device": "Locking the device...",
"progress__one_second_left": "1 second left",
"progress__please_wait": "PLEASE WAIT",
"progress__title_please_wait": "Please wait",
"progress__refreshing": "Refreshing...",
"progress__signing_transaction": "Signing transaction...",
"progress__syncing": "Syncing...",
"progress__x_seconds_left_template": "{0} seconds left",
"reboot_to_bootloader__restart": "Trezor will restart in bootloader mode.",
"reboot_to_bootloader__title": "GO TO BOOTLOADER",
"reboot_to_bootloader__title": "Go to bootloader",
"reboot_to_bootloader__version_by_template": "Firmware version {0}\nby {1}",
"reboot_to_bootloader__just_a_moment": "Just a moment...",
"recovery__cancel_dry_run": "Cancel backup check",
@ -531,18 +531,18 @@
"recovery__share_already_entered": "Share already entered",
"recovery__share_from_another_shamir": "You have entered a share from another Shamir Backup.",
"recovery__share_num_template": "Share {0}",
"recovery__title": "RECOVER WALLET",
"recovery__title_cancel_dry_run": "CANCEL BACKUP CHECK",
"recovery__title_cancel_recovery": "CANCEL RECOVERY",
"recovery__title_dry_run": "BACKUP CHECK",
"recovery__title_recover": "RECOVER WALLET",
"recovery__title_remaining_shares": "REMAINING SHARES",
"recovery__title": "Recover wallet",
"recovery__title_cancel_dry_run": "Cancel backup check",
"recovery__title_cancel_recovery": "Cancel recovery",
"recovery__title_dry_run": "Backup check",
"recovery__title_recover": "Recover wallet",
"recovery__title_remaining_shares": "Remaining shares",
"recovery__type_word_x_of_y_template": "Type word {0} of {1}",
"recovery__wallet_recovered": "Wallet recovered successfully",
"recovery__wanna_cancel_dry_run": "Are you sure you want to cancel the backup check?",
"recovery__wanna_cancel_recovery": "Are you sure you want to cancel the recovery process?",
"recovery__word_count_template": "({0} words)",
"recovery__word_x_of_y_template": "WORD {0} OF {1}",
"recovery__word_x_of_y_title_template": "Word {0} of {1}",
"recovery__x_more_items_starting_template_plural": "{count} more {plural} starting",
"recovery__x_more_shares_needed_template_plural": "{count} more {plural} needed.",
"recovery__x_of_y_entered_template": "{0} of {1} shares entered successfully.",
@ -550,13 +550,13 @@
"reset__advanced_group_threshold_info": "The group threshold specifies the number of groups required to recover your wallet.",
"reset__all_x_of_y_template": "all {0} of {1} shares",
"reset__any_x_of_y_template": "any {0} of {1} shares",
"reset__button_create": "CREATE WALLET",
"reset__button_recover": "RECOVER WALLET",
"reset__button_create": "Create wallet",
"reset__button_recover": "Recover wallet",
"reset__by_continuing": "By continuing you agree to Trezor Company's terms and conditions.",
"reset__check_backup_title": "CHECK BACKUP",
"reset__check_group_share_title_template": "CHECK G{0} - SHARE {1}",
"reset__check_seed_title": "CHECK SEED",
"reset__check_share_title_template": "CHECK SHARE #{0}",
"reset__check_backup_title": "Check backup",
"reset__check_group_share_title_template": "Check g{0} - share {1}",
"reset__check_seed_title": "Check seed",
"reset__check_share_title_template": "Check share #{0}",
"reset__continue_with_next_share": "Continue with the next share.",
"reset__continue_with_share_template": "Continue with share #{0}.",
"reset__finished_verifying_group_template": "You have finished verifying your recovery shares for group {0}.",
@ -565,7 +565,7 @@
"reset__group_description": "A group is made up of recovery shares.",
"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__group_share_title_template": "Group {0} - share {1}",
"reset__more_info_at": "More info at",
"reset__need_all_share_template": "For recovery you need all {0} of the shares.",
"reset__need_any_share_template": "For recovery you need any {0} of the shares.",
@ -579,15 +579,15 @@
"reset__number_of_shares_info": "= total number of unique word lists used for wallet backup.",
"reset__one_share": "1 share",
"reset__only_one_share_will_be_created": "Only one share will be created.",
"reset__recovery_seed_title": "RECOVERY SEED",
"reset__recovery_share_title_template": "RECOVERY SHARE #{0}",
"reset__recovery_seed_title": "Recovery seed",
"reset__recovery_share_title_template": "Recovery share #{0}",
"reset__required_number_of_groups": "The required number of groups for recovery.",
"reset__select_correct_word": "Select the correct word for each position.",
"reset__select_word_template": "SELECT {0} WORD",
"reset__select_word_title_template": "Select {0} word",
"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 ",
"reset__share_checked_successfully_template": "Recovery share #{0} checked successfully.",
"reset__share_words_title": "STANDARD BACKUP",
"reset__share_words_title": "Standard backup",
"reset__slip39_checklist_num_groups": "Number of groups",
"reset__slip39_checklist_num_shares": "Number of shares",
"reset__slip39_checklist_set_num_groups": "Set number of groups",
@ -595,21 +595,21 @@
"reset__slip39_checklist_set_sizes": "Set sizes and thresholds",
"reset__slip39_checklist_set_sizes_longer": "Set size and threshold for each group",
"reset__slip39_checklist_set_threshold": "Set threshold",
"reset__slip39_checklist_title": "BACKUP CHECKLIST",
"reset__slip39_checklist_title": "Backup checklist",
"reset__slip39_checklist_write_down": "Write down and check all shares",
"reset__slip39_checklist_write_down_recovery": "Write down and check all recovery shares",
"reset__the_threshold_sets_the_number_of_shares": "The threshold sets the number of shares ",
"reset__threshold_info": "= minimum number of unique word lists used for recovery.",
"reset__title_backup_is_done": "BACKUP IS DONE",
"reset__title_create_wallet": "CREATE WALLET",
"reset__title_create_wallet_shamir": "CREATE WALLET (SHAMIR)",
"reset__title_group_threshold": "GROUP THRESHOLD",
"reset__title_number_of_groups": "NUMBER OF GROUPS",
"reset__title_number_of_shares": "NUMBER OF SHARES",
"reset__title_set_group_threshold": "SET GROUP THRESHOLD",
"reset__title_set_number_of_groups": "SET NUMBER OF GROUPS",
"reset__title_set_number_of_shares": "SET NUMBER OF SHARES",
"reset__title_set_threshold": "SET THRESHOLD",
"reset__title_backup_is_done": "Backup is done",
"reset__title_create_wallet": "Create wallet",
"reset__title_create_wallet_shamir": "Create wallet (shamir)",
"reset__title_group_threshold": "Group threshold",
"reset__title_number_of_groups": "Number of groups",
"reset__title_number_of_shares": "Number of shares",
"reset__title_set_group_threshold": "Set group threshold",
"reset__title_set_number_of_groups": "Set number of groups",
"reset__title_set_number_of_shares": "Set number of shares",
"reset__title_set_threshold": "Set threshold",
"reset__to_form_group_template": "to form Group {0}.",
"reset__tos_link": "trezor.io/tos",
"reset__total_number_of_shares_in_group_template": "Set the total number of shares in Group {0}.",
@ -624,13 +624,13 @@
"rotation__east": "east",
"rotation__north": "north",
"rotation__south": "south",
"rotation__title_change": "CHANGE ROTATION",
"rotation__title_change": "Change rotation",
"rotation__west": "west",
"safety_checks__approve_unsafe_always": "Trezor will allow you to approve some actions which might be unsafe.",
"safety_checks__approve_unsafe_temporary": "Trezor will temporarily allow you to approve some actions which might be unsafe.",
"safety_checks__enforce_strict": "Do you really want to enforce strict safety checks (recommended)?",
"safety_checks__title": "SAFETY CHECKS",
"safety_checks__title_safety_override": "SAFETY OVERRIDE",
"safety_checks__title": "Safety checks",
"safety_checks__title_safety_override": "Safety override",
"sd_card__all_data_will_be_lost": "All data on the SD card will be lost.",
"sd_card__card_required": "SD card required.",
"sd_card__disable": "Do you really want to remove SD card protection from your device?",
@ -646,25 +646,25 @@
"sd_card__refresh": "Do you really want to replace the current SD card secret with a newly generated one?",
"sd_card__refreshed": "You have successfully refreshed SD protection.",
"sd_card__restart": "Do you want to restart Trezor in bootloader mode?",
"sd_card__title": "SD CARD PROTECTION",
"sd_card__title_problem": "SD CARD PROBLEM",
"sd_card__title": "SD card protection",
"sd_card__title_problem": "SD card problem",
"sd_card__unknown_filesystem": "Unknown filesystem.",
"sd_card__unplug_and_insert_correct": "Please unplug the device and insert the correct SD card.",
"sd_card__use_different_card": "Use a different card or format the SD card to the FAT32 filesystem.",
"sd_card__wanna_format": "Do you really want to format the SD card?",
"sd_card__wrong_sd_card": "Wrong SD card.",
"send__address_path": "address path",
"send__confirm_sending": "SENDING AMOUNT",
"send__confirm_sending": "Sending amount",
"send__from_multiple_accounts": "Sending from multiple accounts.",
"send__including_fee": "Including fee:",
"send__maximum_fee": "Maximum fee:",
"send__receiving_to_multisig": "Receiving to a multisig address.",
"send__title_confirm_sending": "CONFIRM SENDING",
"send__title_joint_transaction": "JOINT TRANSACTION",
"send__title_receiving_to": "RECEIVING TO",
"send__title_sending": "SENDING",
"send__title_sending_amount": "SENDING AMOUNT",
"send__title_sending_to": "SENDING TO",
"send__title_confirm_sending": "Confirm sending",
"send__title_joint_transaction": "Joint transaction",
"send__title_receiving_to": "Receiving to",
"send__title_sending": "Sending",
"send__title_sending_amount": "Sending amount",
"send__title_sending_to": "Sending to",
"send__to_the_total_amount": "To the total amount:",
"send__total_amount": "Total amount:",
"send__transaction_id": "Transaction ID:",
@ -672,14 +672,14 @@
"share_words__words_in_order": " words in order.",
"share_words__wrote_down_all": "I wrote down all ",
"sign_message__bytes_template": "{0} Bytes",
"sign_message__confirm_address": "SIGNING ADDRESS",
"sign_message__confirm_message": "CONFIRM MESSAGE",
"sign_message__title_confirm_address": "Signing address",
"sign_message__title_confirm_message": "Confirm message",
"sign_message__message_size": "Message size:",
"sign_message__verify_address": "VERIFY ADDRESS",
"storage_msg__verifying_pin": "VERIFYING PIN",
"storage_msg__processing": "PROCESSING",
"storage_msg__starting": "STARTING UP",
"storage_msg__wrong_pin": "WRONG PIN",
"sign_message__title_verify_address": "Verify address",
"storage_msg__title_verifying_pin": "Verifying pin",
"storage_msg__title_processing": "Processing",
"storage_msg__title_starting": "Starting up",
"storage_msg__title_wrong_pin": "Wrong pin",
"solana__account_index": "Account index",
"solana__associated_token_account": "Associated token account",
"solana__confirm_multisig": "Confirm multisig",
@ -786,10 +786,10 @@
"tutorial__welcome_press_right": "Welcome to Trezor. Press right to continue.",
"u2f__get": "Increase and retrieve the U2F counter?",
"u2f__set_template": "Set the U2F counter to {0}?",
"u2f__title_get": "GET U2F COUNTER",
"u2f__title_set": "SET U2F COUNTER",
"u2f__title_get": "Get U2F counter",
"u2f__title_set": "Set U2F counter",
"wipe__info": "All data will be erased.",
"wipe__title": "WIPE DEVICE",
"wipe__title": "Wipe device",
"wipe__want_to_wipe": "Do you really want to wipe the device?\n",
"wipe_code__change": "Change wipe code?",
"wipe_code__changed": "Wipe code changed.",
@ -802,13 +802,13 @@
"wipe_code__mismatch": "The wipe codes you entered do not match.",
"wipe_code__reenter": "Re-enter wipe code",
"wipe_code__reenter_to_confirm": "Please re-enter wipe code to confirm.",
"wipe_code__title_check": "CHECK WIPE CODE",
"wipe_code__title_invalid": "INVALID WIPE CODE",
"wipe_code__title_settings": "WIPE CODE SETTINGS",
"wipe_code__title_check": "Check wipe code",
"wipe_code__title_invalid": "Invalid wipe code",
"wipe_code__title_settings": "Wipe code settings",
"wipe_code__turn_off": "Turn off wipe code protection?",
"wipe_code__turn_on": "Turn on wipe code protection?",
"wipe_code__wipe_code_mismatch": "Wipe code mismatch",
"word_count__title": "NUMBER OF WORDS",
"word_count__title": "Number of words",
"words__account": "Account",
"words__account_colon": "Account:",
"words__address": "Address",
@ -833,18 +833,18 @@
"words__please_check_again": "Please check again",
"words__please_try_again": "Please try again",
"words__really_wanna": "Do you really want to",
"words__recipient": "Recipient",
"words__title_recipient": "Recipient",
"words__sign": "Sign",
"words__signer": "Signer",
"words__title_check": "CHECK",
"words__title_group": "GROUP",
"words__title_information": "INFORMATION",
"words__title_remember": "REMEMBER",
"words__title_share": "SHARE",
"words__title_shares": "SHARES",
"words__title_success": "SUCCESS",
"words__title_summary": "SUMMARY",
"words__title_threshold": "THRESHOLD",
"words__title_check": "Check",
"words__title_group": "Group",
"words__title_information": "Information",
"words__title_remember": "Remember",
"words__title_share": "Share",
"words__title_shares": "Shares",
"words__title_success": "Success",
"words__title_summary": "Summary",
"words__title_threshold": "Threshold",
"words__unknown": "Unknown",
"words__warning": "Warning",
"words__writable": "Writable",

@ -33,7 +33,7 @@
"addr_mismatch__support_url": "trezor.io/support",
"addr_mismatch__wrong_derivation_path": "Cuenta seleccionada: Derivación incorrecta",
"addr_mismatch__xpub_mismatch": "¿La XPUB no coincide?",
"address__public_key": "Clave pública",
"address__title_public_key": "Clave pública",
"address__title_cosigner": "COFIRMANTE",
"address__title_receive_address": "DIRECCIÓN DESTINO",
"address__title_yours": "TUYO",
@ -322,13 +322,13 @@
"ethereum__units_template": "{0} unidades",
"ethereum__unknown_token": "Token desconocido",
"ethereum__valid_signature": "La firma es válida.",
"ethereum__staking_stake": "HACER STAKE",
"ethereum__staking_stake_address": "DIRECCIÓN DE STAKE",
"ethereum__staking_title_stake": "HACER STAKE",
"ethereum__staking_title_stake_address": "DIRECCIÓN DE STAKE",
"ethereum__staking_stake_intro": "¿Hacer stake de ETH en Everstake?",
"ethereum__staking_unstake": "RETIRAR STAKE",
"ethereum__staking_title_unstake": "RETIRAR STAKE",
"ethereum__staking_unstake_intro": "¿Retirar ETH de Everstake?",
"ethereum__staking_claim": "RECLAMAR",
"ethereum__staking_claim_address": "DIR. DE RECLAMO",
"ethereum__staking_title_claim": "RECLAMAR",
"ethereum__staking_title_claim_address": "DIR. DE RECLAMO",
"ethereum__staking_claim_intro": "¿Reclamar ETH de Everstake?",
"experimental_mode__enable": "¿Activar funciones experimentales?",
"experimental_mode__only_for_dev": "Solo para desarrollo y pruebas beta.",
@ -522,7 +522,7 @@
"progress__loading_transaction": "Cargando transacc...",
"progress__locking_device": "Bloq. el dispositivo...",
"progress__one_second_left": "Queda 1 segundo",
"progress__please_wait": "ESPERA",
"progress__title_please_wait": "ESPERA",
"progress__refreshing": "Actualizando...",
"progress__signing_transaction": "Firmando transacción...",
"progress__syncing": "Sincronizando...",
@ -565,7 +565,7 @@
"recovery__wanna_cancel_dry_run": "¿Quieres anular la revisión de la copia de seguridad?",
"recovery__wanna_cancel_recovery": "¿Quieres anular el proceso de recuperación?",
"recovery__word_count_template": "({0} palabras)",
"recovery__word_x_of_y_template": "PALABRA {0} DE {1}",
"recovery__word_x_of_y_title_template": "PALABRA {0} DE {1}",
"recovery__x_more_items_starting_template_plural": "Se están iniciando {count} {plural} más",
"recovery__x_more_shares_needed_template_plural": "Se necesitan {count} {plural} más.",
"recovery__x_of_y_entered_template": "Rec. comp. introducidos: {0} de {1}.",
@ -606,7 +606,7 @@
"reset__recovery_share_title_template": "REC. RECUP. nro.{0}",
"reset__required_number_of_groups": "El nro.de grupos necesario para la recuperación.",
"reset__select_correct_word": "Selecciona la palabra correcta para cada posición.",
"reset__select_word_template": "USAR {0} PALABRA",
"reset__select_word_title_template": "USAR {0} PALABRA",
"reset__select_word_x_of_y_template": "Palabra {0} de {1}:",
"reset__set_it_to_count_template": "Ajústalo en {0} y necesitarás ",
"reset__share_checked_successfully_template": "Verificado: Rec de recuperación nro.{0}.",
@ -695,10 +695,10 @@
"share_words__words_in_order": " palabras en orden.",
"share_words__wrote_down_all": "Escribí las ",
"sign_message__bytes_template": "{0} bytes",
"sign_message__confirm_address": "DIRECCIÓN FIRMA",
"sign_message__confirm_message": "VALIDAR MENSAJE",
"sign_message__title_confirm_address": "DIRECCIÓN FIRMA",
"sign_message__title_confirm_message": "VALIDAR MENSAJE",
"sign_message__message_size": "Tamaño del mensaje:",
"sign_message__verify_address": "VERIFICAR DIRECCIÓN",
"sign_message__title_verify_address": "VERIFICAR DIRECCIÓN",
"solana__account_index": "Índice de la cuenta",
"solana__associated_token_account": "Cuenta de token asociada",
"solana__confirm_multisig": "Confirmar multifirma",
@ -780,10 +780,10 @@
"stellar__value_sha256": "Valor (SHA-256):",
"stellar__wanna_clean_value_key_template": "¿Quieres borrar la clave de valor {0}?",
"stellar__your_account": " tu cuenta",
"storage_msg__verifying_pin": "VERIFICANDO PIN",
"storage_msg__processing": "PROCESANDO",
"storage_msg__starting": "INICIANDO",
"storage_msg__wrong_pin": "PIN INCORRECTO",
"storage_msg__title_verifying_pin": "VERIFICANDO PIN",
"storage_msg__title_processing": "PROCESANDO",
"storage_msg__title_starting": "INICIANDO",
"storage_msg__title_wrong_pin": "PIN INCORRECTO",
"tezos__baker_address": "Dirección de panadero:",
"tezos__balance": "Saldo:",
"tezos__ballot": "Papeleta:",
@ -856,7 +856,7 @@
"words__please_check_again": "Vuelve a comprobarlo",
"words__please_try_again": "Inténtalo de nuevo",
"words__really_wanna": "¿Seguro que quieres",
"words__recipient": "Destinatario",
"words__title_recipient": "Destinatario",
"words__sign": "Firmar",
"words__signer": "Firmante",
"words__title_check": "REVISAR",

@ -33,7 +33,7 @@
"addr_mismatch__support_url": "trezor.io/support",
"addr_mismatch__wrong_derivation_path": "Chemin dériv. incorrect du compte sélectionné.",
"addr_mismatch__xpub_mismatch": "Err. clé publ. (XPUB) ?",
"address__public_key": "Clé publique",
"address__title_public_key": "Clé publique",
"address__title_cosigner": "COSIGNATAIRE",
"address__title_receive_address": "ADR. DE RÉCEP.",
"address__title_yours": "LA VÔTRE",
@ -322,13 +322,13 @@
"ethereum__units_template": "{0} unités",
"ethereum__unknown_token": "Jeton inconnu",
"ethereum__valid_signature": "Signature valide.",
"ethereum__staking_stake": "STAKE",
"ethereum__staking_stake_address": "ADRESSE DE STAKING",
"ethereum__staking_title_stake": "STAKE",
"ethereum__staking_title_stake_address": "ADRESSE DE STAKING",
"ethereum__staking_stake_intro": "Staker de l'ETH sur Everstake?",
"ethereum__staking_unstake": "UNSTAKE",
"ethereum__staking_title_unstake": "UNSTAKE",
"ethereum__staking_unstake_intro": "Terminer le Staking de l'ETH sur Everstake?",
"ethereum__staking_claim": "RETIRER",
"ethereum__staking_claim_address": "ADRESSE DE RETRAIT",
"ethereum__staking_title_claim": "RETIRER",
"ethereum__staking_title_claim_address": "ADRESSE DE RETRAIT",
"ethereum__staking_claim_intro": "Retirer l'ETH d'Everstake?",
"experimental_mode__enable": "Activer les fonct. expérimentales ?",
"experimental_mode__only_for_dev": "Uniquement pour le dév. et les tests bêta !",
@ -522,7 +522,7 @@
"progress__loading_transaction": "Charg. de la trans...",
"progress__locking_device": "Verrouill. l'appareil...",
"progress__one_second_left": "1 seconde restante",
"progress__please_wait": "PATIENTEZ",
"progress__title_please_wait": "PATIENTEZ",
"progress__refreshing": "Actualisation en cours",
"progress__signing_transaction": "Signature en cours...",
"progress__syncing": "Synch. en cours",
@ -565,7 +565,7 @@
"recovery__wanna_cancel_dry_run": "Voulez-vous vraiment annuler la vér. de la sauv. ?",
"recovery__wanna_cancel_recovery": "Voulez-vous vraiment annuler le processus de récup. ?",
"recovery__word_count_template": "({0} mots)",
"recovery__word_x_of_y_template": "MOT {0} SUR {1}",
"recovery__word_x_of_y_title_template": "MOT {0} SUR {1}",
"recovery__x_more_items_starting_template_plural": "{count} plus {plural} ont commencé",
"recovery__x_more_shares_needed_template_plural": "{count} plus {plural} sont nécessaires.",
"recovery__x_of_y_entered_template": "{0} fragm. sur {1} saisis avec succès.",
@ -606,7 +606,7 @@
"reset__recovery_share_title_template": "FRAGM. DE RÉCUP. #{0}",
"reset__required_number_of_groups": "Le nbre de groupes requis pour la récup.",
"reset__select_correct_word": "Sélect. le mot correct par emplacement.",
"reset__select_word_template": "SÉLECTIONNER {0} MOT",
"reset__select_word_tile_template": "SÉLECTIONNER {0} MOT",
"reset__select_word_x_of_y_template": "Mot {0} sur {1}:",
"reset__set_it_to_count_template": "Définissez-le sur {0} et vous aurez besoin ",
"reset__share_checked_successfully_template": "Le fragm. de récup. #{0} a été vérifié.",
@ -695,10 +695,10 @@
"share_words__words_in_order": " mots dans l'ordre.",
"share_words__wrote_down_all": "J'ai noté tous les ",
"sign_message__bytes_template": "{0} octets",
"sign_message__confirm_address": "ADR. DE SIGNATURE",
"sign_message__confirm_message": "CONF. MESSAGE",
"sign_message__title_confirm_address": "ADR. DE SIGNATURE",
"sign_message__title_confirm_message": "CONF. MESSAGE",
"sign_message__message_size": "Taille du message :",
"sign_message__verify_address": "VÉRIFIER L'ADR.",
"sign_message__title_verify_address": "VÉRIFIER L'ADR.",
"solana__account_index": "Index du compte",
"solana__associated_token_account": "Compte de jetons associé",
"solana__confirm_multisig": "Conf. multisignatures",
@ -781,10 +781,10 @@
"stellar__wanna_clean_value_key_template": "Voulez-vous effacer la clé de valeur {0} ?",
"stellar__your_account": " votre compte",
"tezos__baker_address": "Adr. du baker :",
"storage_msg__verifying_pin": "VÉRIFICATION DU PIN",
"storage_msg__processing": "TRAITEMENT",
"storage_msg__starting": "DÉMARRAGE",
"storage_msg__wrong_pin": "PIN INCORRECT",
"storage_msg__title_verifying_pin": "VÉRIFICATION DU PIN",
"storage_msg__title_processing": "TRAITEMENT",
"storage_msg__title_starting": "DÉMARRAGE",
"storage_msg__title_wrong_pin": "PIN INCORRECT",
"tezos__balance": "Solde :",
"tezos__ballot": "Bulletin de vote :",
"tezos__confirm_delegation": "Conf. délégation",
@ -856,7 +856,7 @@
"words__please_check_again": "Revérifiez",
"words__please_try_again": "Réessayez",
"words__really_wanna": "Voulez-vous vraiment",
"words__recipient": "Destinataire",
"words__title_recipient": "Destinataire",
"words__sign": "Signer",
"words__signer": "Signataire",
"words__title_check": "VÉRIFIER",

@ -5,7 +5,7 @@
"3": "addr_mismatch__support_url",
"4": "addr_mismatch__wrong_derivation_path",
"5": "addr_mismatch__xpub_mismatch",
"6": "address__public_key",
"6": "address__title_public_key",
"7": "address__title_cosigner",
"8": "address__title_receive_address",
"9": "address__title_yours",
@ -485,8 +485,8 @@
"483": "progress__loading_transaction",
"484": "progress__locking_device",
"485": "progress__one_second_left",
"486": "progress__please_wait",
"487": "storage_msg__processing",
"486": "progress__title_please_wait",
"487": "storage_msg__title_processing",
"488": "progress__refreshing",
"489": "progress__signing_transaction",
"490": "progress__syncing",
@ -528,7 +528,7 @@
"526": "recovery__wanna_cancel_dry_run",
"527": "recovery__wanna_cancel_recovery",
"528": "recovery__word_count_template",
"529": "recovery__word_x_of_y_template",
"529": "recovery__word_x_of_y_title_template",
"530": "recovery__x_more_items_starting_template_plural",
"531": "recovery__x_more_shares_needed_template_plural",
"532": "recovery__x_of_y_entered_template",
@ -569,7 +569,7 @@
"567": "reset__recovery_share_title_template",
"568": "reset__required_number_of_groups",
"569": "reset__select_correct_word",
"570": "reset__select_word_template",
"570": "reset__select_word_title_template",
"571": "reset__select_word_x_of_y_template",
"572": "reset__set_it_to_count_template",
"573": "reset__share_checked_successfully_template",
@ -658,10 +658,10 @@
"656": "share_words__words_in_order",
"657": "share_words__wrote_down_all",
"658": "sign_message__bytes_template",
"659": "sign_message__confirm_address",
"660": "sign_message__confirm_message",
"659": "sign_message__title_confirm_address",
"660": "sign_message__title_confirm_message",
"661": "sign_message__message_size",
"662": "sign_message__verify_address",
"662": "sign_message__title_verify_address",
"663": "solana__account_index",
"664": "solana__associated_token_account",
"665": "solana__confirm_multisig",
@ -815,7 +815,7 @@
"813": "words__please_check_again",
"814": "words__please_try_again",
"815": "words__really_wanna",
"816": "words__recipient",
"816": "words__title_recipient",
"817": "words__sign",
"818": "words__signer",
"819": "words__title_check",
@ -833,15 +833,15 @@
"831": "words__yes",
"832": "reboot_to_bootloader__just_a_moment",
"833": "inputs__previous",
"834": "ethereum__staking_claim",
"835": "ethereum__staking_claim_address",
"834": "ethereum__staking_title_claim",
"835": "ethereum__staking_title_claim_address",
"836": "ethereum__staking_claim_intro",
"837": "ethereum__staking_stake",
"838": "ethereum__staking_stake_address",
"837": "ethereum__staking_title_stake",
"838": "ethereum__staking_title_stake_address",
"839": "ethereum__staking_stake_intro",
"840": "ethereum__staking_unstake",
"840": "ethereum__staking_title_unstake",
"841": "ethereum__staking_unstake_intro",
"842": "storage_msg__starting",
"843": "storage_msg__verifying_pin",
"844": "storage_msg__wrong_pin"
"842": "storage_msg__title_starting",
"843": "storage_msg__title_verifying_pin",
"844": "storage_msg__title_wrong_pin"
}

@ -1,8 +1,8 @@
{
"current": {
"merkle_root": "83f62541670df59f347bfdf577f36c1ef504f769fd8a498c0f76aa78f9021cda",
"datetime": "2024-03-30T11:28:31.004037",
"commit": "1c36c0927c33fd05b4eff4b3a020940e33074b54"
"merkle_root": "4622d85e1e3c9b634b4d4f900a2ab06e2aa5e0f62fc9d4e5ed4a83917cc460d3",
"datetime": "2024-04-14T12:45:50.699461",
"commit": "73a2f276878a95b6f736281a52e93699843e9f9a"
},
"history": [
{

@ -293,6 +293,61 @@ class TranslationsBlob(Struct):
# ====================
def uppercase_titles_and_buttons(s: str, key: str, model_internal_name: str) -> str:
# strings used in titles and button labels are uppercased for model T and model R
MODELS_WITH_UPPER_TITLES_AND_BUTTONS = ("T2T1", "T2B1")
# KEY_SUBSTR_UPPER_MODELS_T_AND_R = ("_title", "_button", "buttons__", "inputs__")
KEY_SUBSTR_UPPER_MODELS_T_AND_R = (
"_title",
"_button",
"buttons__",
"inputs__",
# FIXME: below are strings which should contain '_title' or `_button`. This is just to test if it's sufficient
"stellar__confirm_issuer",
"stellar__confirm_stellar",
"stellar__confirm_issuer",
"stellar__revoke_trust",
"stellar__confirm_memo",
"nem__final_confirm",
"bitcoin__confirm_locktime",
"binance__confirm_cancel",
"binance__confirm_input",
"binance__confirm_order",
"binance__confirm_output",
"cardano__verify_script",
"cardano__sending", # should include many cardano__...
# "progress__loading_transaction",
# "progress__signing_transaction",
"language__progress",
# FIXME: words might be used in multiple places, consider creating more versions, e.g. "words__title_amount", etc.
"words__amount",
"words__confirm",
"words__sign",
"words__warning",
"debug__loading_seed",
"passphrase__hidden_wallet",
"sd_card__error",
"sd_card__format_card",
"misc__decrypt_value",
"misc__encrypt_value",
"misc__title_suite_labeling",
)
KEY_SKIP = (
"debug__loading_seed_not_recommended",
)
should_upper: bool = (
model_internal_name in MODELS_WITH_UPPER_TITLES_AND_BUTTONS
and any(sub in key for sub in KEY_SUBSTR_UPPER_MODELS_T_AND_R)
and key not in KEY_SKIP
)
if should_upper:
return s.upper()
else:
return s
def order_from_json(json_order: dict[str, str]) -> Order:
return {int(k): v for k, v in json_order.items()}
@ -306,10 +361,14 @@ def blob_from_defs(
) -> TranslationsBlob:
json_header: JsonHeader = lang_data["header"]
# order translations -- python dicts keep insertion order
translations_ordered: list[str] = [
lang_data["translations"].get(key, "") for _, key in sorted(order.items())
]
# order translations -- dicts keep insertion order as of Python 3.7
translations_ordered: list[str] = [] * len(order)
for _, key in sorted(order.items()):
translation: str = lang_data["translations"].get(key, "")
translation = uppercase_titles_and_buttons(
translation, key, model.internal_name
)
translations_ordered.append(translation)
translations = TranslatedStrings.from_items(translations_ordered)

@ -310,7 +310,7 @@ class EthereumFlow:
go_back_from_summary: bool = False,
) -> BRGeneratorType:
yield
TR.assert_equals(self.debug.wait_layout().title(), "words__recipient")
TR.assert_equals(self.debug.wait_layout().title(), "words__title_recipient")
if self.client.model in (models.T2T1, models.T3T1):
if cancel:
@ -374,9 +374,9 @@ class EthereumFlow:
TR.assert_equals_multiple(
self.debug.wait_layout().title(),
[
"ethereum__staking_stake",
"ethereum__staking_unstake",
"ethereum__staking_claim",
"ethereum__staking_title_stake",
"ethereum__staking_title_unstake",
"ethereum__staking_title_claim",
],
)
TR.assert_equals_multiple(
@ -394,8 +394,8 @@ class EthereumFlow:
TR.assert_equals_multiple(
self.debug.wait_layout().title(),
[
"ethereum__staking_stake_address",
"ethereum__staking_claim_address",
"ethereum__staking_title_stake_address",
"ethereum__staking_title_claim_address",
],
)
self.debug.press_no(wait=True)
@ -421,8 +421,8 @@ class EthereumFlow:
TR.assert_equals_multiple(
self.debug.wait_layout().title(),
[
"ethereum__staking_stake_address",
"ethereum__staking_claim_address",
"ethereum__staking_title_stake_address",
"ethereum__staking_title_claim_address",
],
)
self.debug.press_left(wait=True)

Loading…
Cancel
Save