chore(core): add N4W1 backup-related translations
What changed, and why it matters
This commit only adds new on-screen text strings for a future backup feature called N4W1. It does not change any security logic, cryptographic code, or user-accessible behavior. There is no indication of a vulnerability or security fix.
No security action required. Treat as routine localization/translation maintenance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit is a localization-only change. It registers seven new translation keys (n4w1__footer_first, n4w1__footer_last, n4w1__footer_next, n4w1__hold_first, n4w1__hold_last, n4w1__hold_next, n4w1__writing) in the Rust translation enum, qstr header, Python mock, English translation JSON, ordering file, and updates the signed translation metadata. Only the Eckhart layout has non-empty English strings; other layouts are blank placeholders. No executable behavior is modified.
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 +305 / −4
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index b99827c5..3d5701c9 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -473,6 +473,13 @@ static void _librust_qstrs(void) {
MP_QSTR_modify_fee__transaction_fee;
MP_QSTR_more_info_callback;
MP_QSTR_multiple_pages_texts;
+ MP_QSTR_n4w1__footer_first;
+ MP_QSTR_n4w1__footer_last;
+ MP_QSTR_n4w1__footer_next;
+ MP_QSTR_n4w1__hold_first;
+ MP_QSTR_n4w1__hold_last;
+ MP_QSTR_n4w1__hold_next;
+ MP_QSTR_n4w1__writing;
MP_QSTR_notification;
MP_QSTR_page_count;
MP_QSTR_page_counter;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index 7452933b..088e0268 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1573,6 +1573,13 @@ pub enum TranslatedString {
ethereum__confirm_contract = 1183, // "Confirm contract"
words__intent = 1184, // "Intent"
suite_sync__rotate_key = 1185, // "You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?"
+ n4w1__footer_first = 1186, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Start with any tag"}
+ n4w1__footer_last = 1187, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Use the last remaining tag"}
+ n4w1__footer_next = 1188, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Use any remaining tag"}
+ n4w1__hold_first = 1189, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Hold the first tag to the back of this Trezor."}
+ n4w1__hold_last = 1190, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Hold the last tag to the back of this Trezor."}
+ n4w1__hold_next = 1191, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Hold the next tag to the back of this Trezor."}
+ n4w1__writing = 1192, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Writing to tag..."}
}
impl TranslatedString {
@@ -2766,6 +2773,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -3957,6 +3971,13 @@ impl TranslatedString {
21455,
21461,
21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -5147,6 +5168,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -6338,6 +6366,13 @@ impl TranslatedString {
21455,
21461,
21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -7528,6 +7563,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -8719,6 +8761,13 @@ impl TranslatedString {
21455,
21461,
21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -9909,6 +9958,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -11100,6 +11156,13 @@ impl TranslatedString {
21455,
21461,
21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
+ 21592,
];
} else if #[cfg(feature = "layout_caesar")] {
@@ -12291,6 +12354,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -13482,6 +13552,13 @@ impl TranslatedString {
18683,
18689,
18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -14672,6 +14749,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -15863,6 +15947,13 @@ impl TranslatedString {
18683,
18689,
18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -17053,6 +17144,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -18244,6 +18342,13 @@ impl TranslatedString {
18683,
18689,
18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -19434,6 +19539,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -20625,6 +20737,13 @@ impl TranslatedString {
18683,
18689,
18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
+ 18820,
];
} else if #[cfg(feature = "layout_delizia")] {
@@ -21816,6 +21935,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -23007,6 +23133,13 @@ impl TranslatedString {
20539,
20545,
20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -24197,6 +24330,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -25388,6 +25528,13 @@ impl TranslatedString {
20539,
20545,
20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -26578,6 +26725,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -27769,6 +27923,13 @@ impl TranslatedString {
20539,
20545,
20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -28959,6 +29120,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -30150,6 +30318,13 @@ impl TranslatedString {
20539,
20545,
20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
+ 20676,
];
} else if #[cfg(feature = "layout_eckhart")] {
@@ -31341,6 +31516,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "Start with any tag",
+ "Use the last remaining tag",
+ "Use any remaining tag",
+ "Hold the first tag to the back of this Trezor.",
+ "Hold the last tag to the back of this Trezor.",
+ "Hold the next tag to the back of this Trezor.",
+ "Writing to tag...",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -32532,6 +32714,13 @@ impl TranslatedString {
21248,
21254,
21385,
+ 21403,
+ 21429,
+ 21450,
+ 21496,
+ 21541,
+ 21586,
+ 21603,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -33722,6 +33911,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "Start with any tag",
+ "Use the last remaining tag",
+ "Use any remaining tag",
+ "Hold the first tag to the back of this Trezor.",
+ "Hold the last tag to the back of this Trezor.",
+ "Hold the next tag to the back of this Trezor.",
+ "Writing to tag...",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -34913,6 +35109,13 @@ impl TranslatedString {
21248,
21254,
21385,
+ 21403,
+ 21429,
+ 21450,
+ 21496,
+ 21541,
+ 21586,
+ 21603,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -36103,6 +36306,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "Start with any tag",
+ "Use the last remaining tag",
+ "Use any remaining tag",
+ "Hold the first tag to the back of this Trezor.",
+ "Hold the last tag to the back of this Trezor.",
+ "Hold the next tag to the back of this Trezor.",
+ "Writing to tag...",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -37294,6 +37504,13 @@ impl TranslatedString {
21248,
21254,
21385,
+ 21403,
+ 21429,
+ 21450,
+ 21496,
+ 21541,
+ 21586,
+ 21603,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -38484,6 +38701,13 @@ impl TranslatedString {
"Confirm contract",
"Intent",
"You are about to rotate the delegated identity key used for Suite Sync. This will invalidate previous keys. Do you want to proceed?",
+ "Start with any tag",
+ "Use the last remaining tag",
+ "Use any remaining tag",
+ "Hold the first tag to the back of this Trezor.",
+ "Hold the last tag to the back of this Trezor.",
+ "Hold the next tag to the back of this Trezor.",
+ "Writing to tag...",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -39675,6 +39899,13 @@ impl TranslatedString {
21248,
21254,
21385,
+ 21403,
+ 21429,
+ 21450,
+ 21496,
+ 21541,
+ 21586,
+ 21603,
];
}
@@ -40439,6 +40670,13 @@ impl TranslatedString {
(Qstr::MP_QSTR_monero__wanna_start_refresh, Self::monero__wanna_start_refresh),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_monero__wanna_sync_key_images, Self::monero__wanna_sync_key_images),
+ (Qstr::MP_QSTR_n4w1__footer_first, Self::n4w1__footer_first),
+ (Qstr::MP_QSTR_n4w1__footer_last, Self::n4w1__footer_last),
+ (Qstr::MP_QSTR_n4w1__footer_next, Self::n4w1__footer_next),
+ (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__writing, Self::n4w1__writing),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_nem__absolute, Self::nem__absolute),
#[cfg(feature = "universal_fw")]
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 2a850e66..018b04f6 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -501,6 +501,13 @@ class TR:
monero__wanna_export_watchkey: str = "Do you really want to export watch-only credentials?"
monero__wanna_start_refresh: str = "Do you really want to\nstart refresh?"
monero__wanna_sync_key_images: str = "Do you really want to\nsync key images?"
+ n4w1__footer_first: str = "Start with any tag"
+ n4w1__footer_last: str = "Use the last remaining tag"
+ n4w1__footer_next: str = "Use any remaining tag"
+ 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__writing: str = "Writing to tag..."
nem__absolute: str = "absolute"
nem__activate: str = "Activate"
nem__add: str = "Add"
diff --git a/core/translations/en.json b/core/translations/en.json
index f734812a..28369796 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -1053,6 +1053,48 @@
"monero__wanna_export_watchkey": "Do you really want to export watch-only credentials?",
"monero__wanna_start_refresh": "Do you really want to\nstart refresh?",
"monero__wanna_sync_key_images": "Do you really want to\nsync key images?",
+ "n4w1__footer_first": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Start with any tag"
+ },
+ "n4w1__footer_last": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Use the last remaining tag"
+ },
+ "n4w1__footer_next": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Use any remaining tag"
+ },
+ "n4w1__hold_first": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Hold the first tag to the back of this Trezor."
+ },
+ "n4w1__hold_last": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Hold the last tag to the back of this Trezor."
+ },
+ "n4w1__hold_next": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Hold the next tag to the back of this Trezor."
+ },
+ "n4w1__writing": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "",
+ "Eckhart": "Writing to tag..."
+ },
"nem__absolute": {
"Bolt": "absolute",
"Caesar": "",
diff --git a/core/translations/order.json b/core/translations/order.json
index 6d019455..9aae7af4 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1184,5 +1184,12 @@
"1182": "words__voting",
"1183": "ethereum__confirm_contract",
"1184": "words__intent",
- "1185": "suite_sync__rotate_key"
+ "1185": "suite_sync__rotate_key",
+ "1186": "n4w1__footer_first",
+ "1187": "n4w1__footer_last",
+ "1188": "n4w1__footer_next",
+ "1189": "n4w1__hold_first",
+ "1190": "n4w1__hold_last",
+ "1191": "n4w1__hold_next",
+ "1192": "n4w1__writing"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 5a927c81..a10dcaca 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "e875770bb1cbb1197ad6c38d02a7839bbfe5dbace5a33d91567d285d784f7d1d",
- "datetime": "2026-03-24T17:33:01.682981+00:00",
- "commit": "a4a7c535fe37c4ba25bd1f44115144b9dad5cb55"
+ "merkle_root": "118a658df23b09ba4576a363183f3ebce3955af6dd04c9573444190a872d11f2",
+ "datetime": "2026-03-26T12:10:00.241113+00:00",
+ "commit": "79bd613973da8c41bde76b330079bce0822eca09"
},
"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.