What changed, and why it matters
This commit only adds new user-facing text strings for a wallet backup feature called 'N4W1' (for example, prompts asking the user what kind of backup they want and a 'Reading tag...' message). It updates translation files, generated Rust translation code, and a mock file used for testing. There is no executable logic change, no bug fix, and no security-related change.
No security action needed. This is a routine UI string addition. Review can be limited to verifying the new strings are appropriate for the N4W1 backup user flow.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff is a pure localization/data change: it introduces three new translation keys (backup__type_create, backup__type_have, n4w1__reading) and two new qstr identifiers (backup__type_create, backup__type_have) in the MicroPython qstr table. It also refreshes the translations signature metadata (merkle_root, datetime, commit). No code behavior is modified; no parsing, cryptography, memory handling, or trust boundary logic is touched.
Changed components
core/embed/rust/librust_qstr.hcore/embed/rust/src/translations/generated/translated_string.rscore/mocks/trezortranslate_keys.pyicore/translations/en.jsoncore/translations/order.jsoncore/translations/signatures.jsonInspect captured patch +133 / −4
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 9881b74c..cdfe5783 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -155,6 +155,8 @@ static void _librust_qstrs(void) {
MP_QSTR_backup__title_backup_wallet;
MP_QSTR_backup__title_create_wallet_backup;
MP_QSTR_backup__title_skip;
+ MP_QSTR_backup__type_create;
+ MP_QSTR_backup__type_have;
MP_QSTR_backup__type_n4w1;
MP_QSTR_backup__type_wordlist;
MP_QSTR_backup__want_to_skip;
@@ -480,6 +482,7 @@ static void _librust_qstrs(void) {
MP_QSTR_n4w1__hold_first;
MP_QSTR_n4w1__hold_last;
MP_QSTR_n4w1__hold_next;
+ MP_QSTR_n4w1__reading;
MP_QSTR_n4w1__writing;
MP_QSTR_notification;
MP_QSTR_page_count;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index ff9a3be6..52403ab9 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1615,6 +1615,9 @@ pub enum TranslatedString {
ethereum__title_input_data_bytes = 1218, // {"Bolt": "Data:\n{0} / {1} bytes", "Caesar": "Data: {0} / {1} bytes", "Delizia": "Data", "Eckhart": "Data:\n{0} / {1} bytes"}
#[cfg(feature = "universal_fw")]
ethereum__calldata_suffix = 1219, // "Calldata suffix"
+ backup__type_create = 1220, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Select the type of wallet backup you want to create."}
+ backup__type_have = 1221, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Which type of wallet backup do you have?"}
+ n4w1__reading = 1222, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Reading tag..."}
}
impl TranslatedString {
@@ -2842,6 +2845,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -4067,6 +4073,9 @@ impl TranslatedString {
20224,
20245,
20260,
+ 20260,
+ 20260,
+ 20260,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -5291,6 +5300,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -6516,6 +6528,9 @@ impl TranslatedString {
20224,
20245,
20260,
+ 20260,
+ 20260,
+ 20260,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -7740,6 +7755,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -8965,6 +8983,9 @@ impl TranslatedString {
20224,
20245,
20260,
+ 20260,
+ 20260,
+ 20260,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -10189,6 +10210,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -11414,6 +11438,9 @@ impl TranslatedString {
20224,
20245,
20260,
+ 20260,
+ 20260,
+ 20260,
];
} else if #[cfg(feature = "layout_caesar")] {
@@ -12639,6 +12666,9 @@ impl TranslatedString {
"",
"Data: {0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -13864,6 +13894,9 @@ impl TranslatedString {
18249,
18270,
18285,
+ 18285,
+ 18285,
+ 18285,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -15088,6 +15121,9 @@ impl TranslatedString {
"",
"Data: {0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -16313,6 +16349,9 @@ impl TranslatedString {
18249,
18270,
18285,
+ 18285,
+ 18285,
+ 18285,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -17537,6 +17576,9 @@ impl TranslatedString {
"",
"Data: {0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -18762,6 +18804,9 @@ impl TranslatedString {
18249,
18270,
18285,
+ 18285,
+ 18285,
+ 18285,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -19986,6 +20031,9 @@ impl TranslatedString {
"",
"Data: {0} / {1} bytes",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -21211,6 +21259,9 @@ impl TranslatedString {
18249,
18270,
18285,
+ 18285,
+ 18285,
+ 18285,
];
} else if #[cfg(feature = "layout_delizia")] {
@@ -22436,6 +22487,9 @@ impl TranslatedString {
"{0} / {1} bytes",
"Data",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -23661,6 +23715,9 @@ impl TranslatedString {
19487,
19491,
19506,
+ 19506,
+ 19506,
+ 19506,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -24885,6 +24942,9 @@ impl TranslatedString {
"{0} / {1} bytes",
"Data",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -26110,6 +26170,9 @@ impl TranslatedString {
19487,
19491,
19506,
+ 19506,
+ 19506,
+ 19506,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -27334,6 +27397,9 @@ impl TranslatedString {
"{0} / {1} bytes",
"Data",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -28559,6 +28625,9 @@ impl TranslatedString {
19487,
19491,
19506,
+ 19506,
+ 19506,
+ 19506,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -29783,6 +29852,9 @@ impl TranslatedString {
"{0} / {1} bytes",
"Data",
"Calldata suffix",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -31008,6 +31080,9 @@ impl TranslatedString {
19487,
19491,
19506,
+ 19506,
+ 19506,
+ 19506,
];
} else if #[cfg(feature = "layout_eckhart")] {
@@ -32233,6 +32308,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "Select the type of wallet backup you want to create.",
+ "Which type of wallet backup do you have?",
+ "Reading tag...",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -33458,6 +33536,9 @@ impl TranslatedString {
20554,
20575,
20590,
+ 20642,
+ 20682,
+ 20696,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -34682,6 +34763,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "Select the type of wallet backup you want to create.",
+ "Which type of wallet backup do you have?",
+ "Reading tag...",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -35907,6 +35991,9 @@ impl TranslatedString {
20554,
20575,
20590,
+ 20642,
+ 20682,
+ 20696,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -37131,6 +37218,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "Select the type of wallet backup you want to create.",
+ "Which type of wallet backup do you have?",
+ "Reading tag...",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -38356,6 +38446,9 @@ impl TranslatedString {
20554,
20575,
20590,
+ 20642,
+ 20682,
+ 20696,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -39580,6 +39673,9 @@ impl TranslatedString {
"",
"Data:\n{0} / {1} bytes",
"Calldata suffix",
+ "Select the type of wallet backup you want to create.",
+ "Which type of wallet backup do you have?",
+ "Reading tag...",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -40805,6 +40901,9 @@ impl TranslatedString {
20554,
20575,
20590,
+ 20642,
+ 20682,
+ 20696,
];
}
@@ -40860,6 +40959,8 @@ impl TranslatedString {
(Qstr::MP_QSTR_backup__title_backup_wallet, Self::backup__title_backup_wallet),
(Qstr::MP_QSTR_backup__title_create_wallet_backup, Self::backup__title_create_wallet_backup),
(Qstr::MP_QSTR_backup__title_skip, Self::backup__title_skip),
+ (Qstr::MP_QSTR_backup__type_create, Self::backup__type_create),
+ (Qstr::MP_QSTR_backup__type_have, Self::backup__type_have),
(Qstr::MP_QSTR_backup__type_n4w1, Self::backup__type_n4w1),
(Qstr::MP_QSTR_backup__type_wordlist, Self::backup__type_wordlist),
(Qstr::MP_QSTR_backup__want_to_skip, Self::backup__want_to_skip),
@@ -41613,6 +41714,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_n4w1__hold_first, Self::n4w1__hold_first),
(Qstr::MP_QSTR_n4w1__hold_last, Self::n4w1__hold_last),
(Qstr::MP_QSTR_n4w1__hold_next, Self::n4w1__hold_next),
+ (Qstr::MP_QSTR_n4w1__reading, Self::n4w1__reading),
(Qstr::MP_QSTR_n4w1__writing, Self::n4w1__writing),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_nem__absolute, Self::nem__absolute),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 9be4bead..c9d6aa14 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -48,6 +48,8 @@ class TR:
backup__title_backup_wallet: str = "Back up wallet"
backup__title_create_wallet_backup: str = "Create wallet backup"
backup__title_skip: str = "Skip backup"
+ backup__type_create: str = "Select the type of wallet backup you want to create."
+ backup__type_have: str = "Which type of wallet backup do you have?"
backup__type_n4w1: str = "N4W1 backup"
backup__type_wordlist: str = "Wordlist backup"
backup__want_to_skip: str = "Are you sure you want to skip the backup?"
@@ -525,6 +527,7 @@ class TR:
n4w1__hold_first: str = "Hold the first tag to the back of this Trezor."
n4w1__hold_last: str = "Hold the last tag to the back of this Trezor."
n4w1__hold_next: str = "Hold the next tag to the back of this Trezor."
+ n4w1__reading: str = "Reading tag..."
n4w1__writing: str = "Writing to tag..."
nem__absolute: str = "absolute"
nem__activate: str = "Activate"
diff --git a/core/translations/en.json b/core/translations/en.json
index 84e8e7ca..57e4376c 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -115,6 +115,18 @@
},
"backup__title_create_wallet_backup": "Create wallet backup",
"backup__title_skip": "Skip backup",
+ "backup__type_create": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Select the type of wallet backup you want to create."
+ },
+ "backup__type_have": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Which type of wallet backup do you have?"
+ },
"backup__type_n4w1": {
"Bolt": "",
"Caesar": "",
@@ -1207,6 +1219,12 @@
"Delizia": "",
"Eckhart": "Hold the next tag to the back of this Trezor."
},
+ "n4w1__reading": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Reading tag..."
+ },
"n4w1__writing": {
"Bolt": "",
"Caesar": "",
diff --git a/core/translations/order.json b/core/translations/order.json
index 78c9b3da..4c7690b4 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1218,5 +1218,8 @@
"1216": "ethereum__withdraw_to",
"1217": "ethereum__subtitle_input_data_bytes",
"1218": "ethereum__title_input_data_bytes",
- "1219": "ethereum__calldata_suffix"
+ "1219": "ethereum__calldata_suffix",
+ "1220": "backup__type_create",
+ "1221": "backup__type_have",
+ "1222": "n4w1__reading"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 4890b414..c9cb7f4a 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "e0cf6b76ae8d344ab40c44180b6d304517d0e3c57426ff19c1571eb5f5d6b5c7",
- "datetime": "2026-04-28T11:23:11.455002+00:00",
- "commit": "7513c7539ce0d5d450461e54371b37cacbe7ca30"
+ "merkle_root": "f75391446191bd522e508480c4c8f6e4b280228960833c719f2e0042b8fdc961",
+ "datetime": "2026-04-28T13:36:20.223292+00:00",
+ "commit": "195382bf5f96fa3f2668bf5df91d7e15314219a3"
},
"history": [
{
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.