chore(core/eckhart): device menu translations
What changed, and why it matters
This commit is a routine UI translation update for the Trezor hardware wallet's device menu. It replaces hard-coded English text strings with references to the device's translation system so the menu can be displayed in multiple languages. There are no security fixes or functional behavior changes.
No security action required. This is a localization-only change.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit ‘chore(core/eckhart): device menu translations’ converts literal English strings in the Eckhart layout device menu screen to TranslatedString (TR::) references. It adds new translation keys (e.g., ble__manage_paired, words__about, words__security) to the generated Rust translation enum, QSTR mapping, Python mock, English JSON, order file, and signatures metadata. It also renames the Python import alias from ‘storage.device’ to ‘storage_device’ for clarity. No logic, authorization, cryptography, or input handling is changed.
Changed components
core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rscore/embed/rust/src/translations/generated/translated_string.rscore/embed/rust/librust_qstr.hcore/mocks/trezortranslate_keys.pyicore/src/apps/homescreen/device_menu.pycore/translations/en.jsoncore/translations/order.jsoncore/translations/signatures.jsonInspect captured patch +127 / −38
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 8656b5a6..a336fe73 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -160,6 +160,9 @@ static void _librust_qstrs(void) {
MP_QSTR_bitcoin__unverified_external_inputs;
MP_QSTR_bitcoin__valid_signature;
MP_QSTR_bitcoin__voting_rights;
+ MP_QSTR_ble__manage_paired;
+ MP_QSTR_ble__pair_new;
+ MP_QSTR_ble__pair_title;
MP_QSTR_ble__unpair_all;
MP_QSTR_ble__unpair_current;
MP_QSTR_ble__unpair_title;
@@ -316,6 +319,7 @@ static void _librust_qstrs(void) {
MP_QSTR_hold_danger;
MP_QSTR_homescreen__click_to_connect;
MP_QSTR_homescreen__click_to_unlock;
+ MP_QSTR_homescreen__firmware_version;
MP_QSTR_homescreen__set_default;
MP_QSTR_homescreen__settings_subtitle;
MP_QSTR_homescreen__settings_title;
@@ -872,6 +876,7 @@ static void _librust_qstrs(void) {
MP_QSTR_wipe_code__wipe_code_mismatch;
MP_QSTR_word_count__title;
MP_QSTR_words;
+ MP_QSTR_words__about;
MP_QSTR_words__account;
MP_QSTR_words__account_colon;
MP_QSTR_words__address;
@@ -888,10 +893,13 @@ static void _librust_qstrs(void) {
MP_QSTR_words__chain;
MP_QSTR_words__confirm;
MP_QSTR_words__confirm_fee;
+ MP_QSTR_words__connected;
MP_QSTR_words__contains;
MP_QSTR_words__continue_anyway;
MP_QSTR_words__continue_anyway_question;
MP_QSTR_words__continue_with;
+ MP_QSTR_words__device;
+ MP_QSTR_words__disconnect;
MP_QSTR_words__error;
MP_QSTR_words__fee;
MP_QSTR_words__from;
@@ -900,6 +908,8 @@ static void _librust_qstrs(void) {
MP_QSTR_words__instructions;
MP_QSTR_words__keep_it_safe;
MP_QSTR_words__know_what_your_doing;
+ MP_QSTR_words__led;
+ MP_QSTR_words__manage;
MP_QSTR_words__my_trezor;
MP_QSTR_words__name;
MP_QSTR_words__no;
@@ -914,6 +924,8 @@ static void _librust_qstrs(void) {
MP_QSTR_words__receive;
MP_QSTR_words__recipient;
MP_QSTR_words__recovery_share;
+ MP_QSTR_words__review;
+ MP_QSTR_words__security;
MP_QSTR_words__send;
MP_QSTR_words__settings;
MP_QSTR_words__sign;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index bad20620..18f81661 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1462,6 +1462,18 @@ pub enum TranslatedString {
regulatory_certification__title = 1078, // "Regulatory certification"
words__name = 1079, // "Name"
device_name__changed = 1080, // "Device name changed."
+ ble__manage_paired = 1081, // "Manage paired devices"
+ ble__pair_new = 1082, // "Pair new device"
+ ble__pair_title = 1083, // "Pair & connect"
+ homescreen__firmware_version = 1084, // "Firmware version"
+ words__about = 1085, // "About"
+ words__connected = 1086, // "Connected"
+ words__device = 1087, // "Device"
+ words__disconnect = 1088, // "Disconnect"
+ words__led = 1089, // "LED"
+ words__manage = 1090, // "Manage"
+ words__review = 1091, // "Review"
+ words__security = 1092, // "Security"
}
impl TranslatedString {
@@ -3243,6 +3255,18 @@ impl TranslatedString {
(Self::regulatory_certification__title, "Regulatory certification"),
(Self::words__name, "Name"),
(Self::device_name__changed, "Device name changed."),
+ (Self::ble__manage_paired, "Manage paired devices"),
+ (Self::ble__pair_new, "Pair new device"),
+ (Self::ble__pair_title, "Pair & connect"),
+ (Self::homescreen__firmware_version, "Firmware version"),
+ (Self::words__about, "About"),
+ (Self::words__connected, "Connected"),
+ (Self::words__device, "Device"),
+ (Self::words__disconnect, "Disconnect"),
+ (Self::words__led, "LED"),
+ (Self::words__manage, "Manage"),
+ (Self::words__review, "Review"),
+ (Self::words__security, "Security"),
];
#[cfg(feature = "micropython")]
@@ -3320,6 +3344,9 @@ impl TranslatedString {
(Qstr::MP_QSTR_bitcoin__unverified_external_inputs, Self::bitcoin__unverified_external_inputs),
(Qstr::MP_QSTR_bitcoin__valid_signature, Self::bitcoin__valid_signature),
(Qstr::MP_QSTR_bitcoin__voting_rights, Self::bitcoin__voting_rights),
+ (Qstr::MP_QSTR_ble__manage_paired, Self::ble__manage_paired),
+ (Qstr::MP_QSTR_ble__pair_new, Self::ble__pair_new),
+ (Qstr::MP_QSTR_ble__pair_title, Self::ble__pair_title),
(Qstr::MP_QSTR_ble__unpair_all, Self::ble__unpair_all),
(Qstr::MP_QSTR_ble__unpair_current, Self::ble__unpair_current),
(Qstr::MP_QSTR_ble__unpair_title, Self::ble__unpair_title),
@@ -3856,6 +3883,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_haptic_feedback__title, Self::haptic_feedback__title),
(Qstr::MP_QSTR_homescreen__click_to_connect, Self::homescreen__click_to_connect),
(Qstr::MP_QSTR_homescreen__click_to_unlock, Self::homescreen__click_to_unlock),
+ (Qstr::MP_QSTR_homescreen__firmware_version, Self::homescreen__firmware_version),
(Qstr::MP_QSTR_homescreen__set_default, Self::homescreen__set_default),
(Qstr::MP_QSTR_homescreen__settings_subtitle, Self::homescreen__settings_subtitle),
(Qstr::MP_QSTR_homescreen__settings_title, Self::homescreen__settings_title),
@@ -4631,6 +4659,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_wipe_code__turn_on, Self::wipe_code__turn_on),
(Qstr::MP_QSTR_wipe_code__wipe_code_mismatch, Self::wipe_code__wipe_code_mismatch),
(Qstr::MP_QSTR_word_count__title, Self::word_count__title),
+ (Qstr::MP_QSTR_words__about, Self::words__about),
(Qstr::MP_QSTR_words__account, Self::words__account),
(Qstr::MP_QSTR_words__account_colon, Self::words__account_colon),
(Qstr::MP_QSTR_words__address, Self::words__address),
@@ -4647,10 +4676,13 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__chain, Self::words__chain),
(Qstr::MP_QSTR_words__confirm, Self::words__confirm),
(Qstr::MP_QSTR_words__confirm_fee, Self::words__confirm_fee),
+ (Qstr::MP_QSTR_words__connected, Self::words__connected),
(Qstr::MP_QSTR_words__contains, Self::words__contains),
(Qstr::MP_QSTR_words__continue_anyway, Self::words__continue_anyway),
(Qstr::MP_QSTR_words__continue_anyway_question, Self::words__continue_anyway_question),
(Qstr::MP_QSTR_words__continue_with, Self::words__continue_with),
+ (Qstr::MP_QSTR_words__device, Self::words__device),
+ (Qstr::MP_QSTR_words__disconnect, Self::words__disconnect),
(Qstr::MP_QSTR_words__error, Self::words__error),
(Qstr::MP_QSTR_words__fee, Self::words__fee),
(Qstr::MP_QSTR_words__from, Self::words__from),
@@ -4659,6 +4691,8 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__instructions, Self::words__instructions),
(Qstr::MP_QSTR_words__keep_it_safe, Self::words__keep_it_safe),
(Qstr::MP_QSTR_words__know_what_your_doing, Self::words__know_what_your_doing),
+ (Qstr::MP_QSTR_words__led, Self::words__led),
+ (Qstr::MP_QSTR_words__manage, Self::words__manage),
(Qstr::MP_QSTR_words__my_trezor, Self::words__my_trezor),
(Qstr::MP_QSTR_words__name, Self::words__name),
(Qstr::MP_QSTR_words__no, Self::words__no),
@@ -4673,6 +4707,8 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__receive, Self::words__receive),
(Qstr::MP_QSTR_words__recipient, Self::words__recipient),
(Qstr::MP_QSTR_words__recovery_share, Self::words__recovery_share),
+ (Qstr::MP_QSTR_words__review, Self::words__review),
+ (Qstr::MP_QSTR_words__security, Self::words__security),
(Qstr::MP_QSTR_words__send, Self::words__send),
(Qstr::MP_QSTR_words__settings, Self::words__settings),
(Qstr::MP_QSTR_words__sign, Self::words__sign),
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
index 50fcbf16..93d5d4eb 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
@@ -14,7 +14,7 @@ use crate::{
},
Component, Event, EventCtx,
},
- geometry::Rect,
+ geometry::{LinearPlacement, Rect},
shape::Renderer,
},
};
@@ -222,7 +222,7 @@ impl<'a> DeviceMenuScreen<'a> {
let mut item_device = MenuItem::new(*device, Some(Action::GoTo(idx)));
// TODO: this should be a boolean feature of the device
item_device.with_subtext(Some((
- "Connected".into(),
+ TR::words__connected.into(),
Some(&theme::TEXT_MENU_ITEM_SUBTITLE_GREEN),
)));
unwrap!(items.push(item_device));
@@ -239,7 +239,7 @@ impl<'a> DeviceMenuScreen<'a> {
) -> usize {
let mut items: Vec<MenuItem, SHORT_MENU_ITEMS> = Vec::new();
let mut manage_paired_item = MenuItem::new(
- "Manage paired devices".into(),
+ TR::ble__manage_paired.into(),
Some(Action::GoTo(manage_devices_index)),
);
manage_paired_item.with_subtext(
@@ -247,7 +247,7 @@ impl<'a> DeviceMenuScreen<'a> {
);
unwrap!(items.push(manage_paired_item));
unwrap!(items.push(MenuItem::new(
- "Pair new device".into(),
+ TR::ble__pair_new.into(),
Some(Action::Return(DeviceMenuMsg::DevicePair)),
)));
@@ -258,11 +258,11 @@ impl<'a> DeviceMenuScreen<'a> {
fn add_settings_menu(&mut self, security_index: usize, device_index: usize) -> usize {
let mut items: Vec<MenuItem, SHORT_MENU_ITEMS> = Vec::new();
unwrap!(items.push(MenuItem::new(
- "Security".into(),
+ TR::words__security.into(),
Some(Action::GoTo(security_index))
)));
unwrap!(items.push(MenuItem::new(
- "Device".into(),
+ TR::words__device.into(),
Some(Action::GoTo(device_index))
)));
@@ -273,11 +273,11 @@ impl<'a> DeviceMenuScreen<'a> {
fn add_security_menu(&mut self) -> usize {
let mut items: Vec<MenuItem, SHORT_MENU_ITEMS> = Vec::new();
unwrap!(items.push(MenuItem::new(
- "Check backup".into(),
+ TR::reset__check_backup_title.into(),
Some(Action::Return(DeviceMenuMsg::CheckBackup)),
)));
unwrap!(items.push(MenuItem::new(
- "Wipe device".into(),
+ TR::wipe__title.into(),
Some(Action::Return(DeviceMenuMsg::WipeDevice))
)));
@@ -303,13 +303,13 @@ impl<'a> DeviceMenuScreen<'a> {
}
unwrap!(items.push(MenuItem::new(
- "Screen brightness".into(),
+ TR::brightness__title.into(),
Some(Action::Return(DeviceMenuMsg::ScreenBrightness)),
)));
if has_pin() {
let mut autolock_delay_item = MenuItem::new(
- "Auto-lock delay".into(),
+ TR::auto_lock__title.into(),
Some(Action::Return(DeviceMenuMsg::AutoLockDelay)),
);
autolock_delay_item.with_subtext(Some((auto_lock_delay, None)));
@@ -322,7 +322,7 @@ impl<'a> DeviceMenuScreen<'a> {
)));
unwrap!(items.push(MenuItem::new(
- "About".into(),
+ TR::words__about.into(),
Some(Action::GoTo(about_index))
)));
@@ -340,15 +340,15 @@ impl<'a> DeviceMenuScreen<'a> {
let mut items: Vec<MenuItem, SHORT_MENU_ITEMS> = Vec::new();
if failed_backup {
let mut item_backup_failed = MenuItem::new(
- "Backup failed".into(),
+ TR::homescreen__title_backup_failed.into(),
Some(Action::Return(DeviceMenuMsg::BackupFailed)),
);
- item_backup_failed.with_subtext(Some(("Review".into(), None)));
+ item_backup_failed.with_subtext(Some((TR::words__review.into(), None)));
item_backup_failed.with_stylesheet(MENU_ITEM_TITLE_STYLE_SHEET);
unwrap!(items.push(item_backup_failed));
}
let mut item_pair_and_connect = MenuItem::new(
- "Pair & connect".into(),
+ TR::ble__pair_title.into(),
Some(Action::GoTo(pair_and_connect_index)),
);
item_pair_and_connect.with_subtext(
@@ -356,7 +356,7 @@ impl<'a> DeviceMenuScreen<'a> {
);
unwrap!(items.push(item_pair_and_connect));
unwrap!(items.push(MenuItem::new(
- "Settings".into(),
+ TR::words__settings.into(),
Some(Action::GoTo(settings_index)),
)));
@@ -416,12 +416,12 @@ impl<'a> DeviceMenuScreen<'a> {
let mut menu = VerticalMenu::empty();
menu.item(Button::new_menu_item(device, theme::menu_item_title()));
menu.item(Button::new_menu_item(
- "Disconnect".into(),
+ TR::words__disconnect.into(),
theme::menu_item_title_red(),
));
*self.active_screen.deref_mut() = ActiveScreen::Menu(
VerticalMenuScreen::new(menu).with_header(
- Header::new("Manage".into())
+ Header::new(TR::words__manage.into())
.with_close_button()
.with_left_button(
Button::with_icon(theme::ICON_CHEVRON_LEFT),
@@ -432,13 +432,18 @@ impl<'a> DeviceMenuScreen<'a> {
}
Subscreen::AboutScreen => {
let about_content = Paragraphs::new([
- Paragraph::new(&theme::firmware::TEXT_REGULAR, "Firmware version"),
+ Paragraph::new(
+ &theme::firmware::TEXT_SMALL_LIGHT,
+ TR::homescreen__firmware_version,
+ )
+ .with_bottom_padding(theme::PROP_INNER_SPACING),
Paragraph::new(&theme::firmware::TEXT_REGULAR, self.firmware_version),
- ]);
+ ])
+ .with_placement(LinearPlacement::vertical());
*self.active_screen.deref_mut() = ActiveScreen::About(
TextScreen::new(about_content)
- .with_header(Header::new("About".into()).with_close_button()),
+ .with_header(Header::new(TR::words__about.into()).with_close_button()),
);
}
Subscreen::RegulatoryScreen => {
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 08e69695..9d8aa122 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -75,6 +75,9 @@ class TR:
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"
+ ble__manage_paired: str = "Manage paired devices"
+ ble__pair_new: str = "Pair new device"
+ ble__pair_title: str = "Pair & connect"
ble__unpair_all: str = "Unpair all bluetooth devices"
ble__unpair_current: str = "Unpair connected device"
ble__unpair_title: str = "Unpair"
@@ -382,6 +385,7 @@ class TR:
haptic_feedback__title: str = "Haptic feedback"
homescreen__click_to_connect: str = "Click to Connect"
homescreen__click_to_unlock: str = "Click to Unlock"
+ homescreen__firmware_version: str = "Firmware version"
homescreen__set_default: str = "Change wallpaper to default image?"
homescreen__settings_subtitle: str = "Settings"
homescreen__settings_title: str = "Homescreen"
@@ -975,6 +979,7 @@ class TR:
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"
+ words__about: str = "About"
words__account: str = "Account"
words__account_colon: str = "Account:"
words__address: str = "Address"
@@ -991,10 +996,13 @@ class TR:
words__chain: str = "Chain"
words__confirm: str = "Confirm"
words__confirm_fee: str = "Confirm fee"
+ words__connected: str = "Connected"
words__contains: str = "Contains"
words__continue_anyway: str = "Continue anyway"
words__continue_anyway_question: str = "Continue anyway?"
words__continue_with: str = "Continue with"
+ words__device: str = "Device"
+ words__disconnect: str = "Disconnect"
words__error: str = "Error"
words__fee: str = "Fee"
words__from: str = "from"
@@ -1003,6 +1011,8 @@ class TR:
words__instructions: str = "Instructions"
words__keep_it_safe: str = "Keep it safe!"
words__know_what_your_doing: str = "Continue only if you know what you are doing!"
+ words__led: str = "LED"
+ words__manage: str = "Manage"
words__my_trezor: str = "My Trezor"
words__name: str = "Name"
words__no: str = "No"
@@ -1017,6 +1027,8 @@ class TR:
words__receive: str = "Receive"
words__recipient: str = "Recipient"
words__recovery_share: str = "Recovery share"
+ words__review: str = "Review"
+ words__security: str = "Security"
words__send: str = "Send"
words__settings: str = "Settings"
words__sign: str = "Sign"
diff --git a/core/src/apps/homescreen/device_menu.py b/core/src/apps/homescreen/device_menu.py
index 2f81e522..d512b1f2 100644
--- a/core/src/apps/homescreen/device_menu.py
+++ b/core/src/apps/homescreen/device_menu.py
@@ -1,4 +1,4 @@
-import storage.device
+import storage.device as storage_device
import trezorble as ble
import trezorui_api
from trezor import TR, config, log, utils
@@ -11,9 +11,9 @@ async def _prompt_auto_lock_delay() -> int:
auto_lock_delay_ms = await interact(
trezorui_api.request_duration(
title=TR.auto_lock__title,
- duration_ms=storage.device.get_autolock_delay_ms(),
- min_ms=storage.device.AUTOLOCK_DELAY_MINIMUM,
- max_ms=storage.device.AUTOLOCK_DELAY_MAXIMUM,
+ duration_ms=storage_device.get_autolock_delay_ms(),
+ min_ms=storage_device.AUTOLOCK_DELAY_MINIMUM,
+ max_ms=storage_device.AUTOLOCK_DELAY_MAXIMUM,
description=TR.auto_lock__description,
),
br_name=None,
@@ -21,8 +21,8 @@ async def _prompt_auto_lock_delay() -> int:
if auto_lock_delay_ms is not trezorui_api.CANCELLED:
assert isinstance(auto_lock_delay_ms, int)
- assert auto_lock_delay_ms >= storage.device.AUTOLOCK_DELAY_MINIMUM
- assert auto_lock_delay_ms <= storage.device.AUTOLOCK_DELAY_MAXIMUM
+ assert auto_lock_delay_ms >= storage_device.AUTOLOCK_DELAY_MINIMUM
+ assert auto_lock_delay_ms <= storage_device.AUTOLOCK_DELAY_MAXIMUM
return auto_lock_delay_ms
else:
raise ActionCancelled # user cancelled request number prompt
@@ -33,19 +33,19 @@ async def handle_device_menu() -> None:
# TODO: unify with notification handling in `apps/homescreen/__init__.py:homescreen()`
failed_backup = (
- storage.device.is_initialized() and storage.device.unfinished_backup()
+ storage_device.is_initialized() and storage_device.unfinished_backup()
)
# MOCK DATA
paired_devices = ["Trezor Suite"] if ble.is_connected() else []
# ###
firmware_version = ".".join(map(str, utils.VERSION))
device_name = (
- (storage.device.get_label() or "Trezor")
- if storage.device.is_initialized()
+ (storage_device.get_label() or "Trezor")
+ if storage_device.is_initialized()
else None
)
- auto_lock_ms = storage.device.get_autolock_delay_ms()
+ auto_lock_ms = storage_device.get_autolock_delay_ms()
auto_lock_delay = strings.format_autolock_duration(auto_lock_ms)
if __debug__:
@@ -84,19 +84,19 @@ async def handle_device_menu() -> None:
if config.has_pin():
auto_lock_delay_ms = await _prompt_auto_lock_delay()
- storage.device.set_autolock_delay_ms(auto_lock_delay_ms)
+ storage_device.set_autolock_delay_ms(auto_lock_delay_ms)
elif menu_result is DeviceMenuResult.DeviceName:
from trezor.messages import ApplySettings
from apps.management.apply_settings import apply_settings
- assert storage.device.is_initialized()
+ assert storage_device.is_initialized()
label = await interact(
trezorui_api.request_string(
prompt=TR.device_name__enter,
- max_len=storage.device.LABEL_MAXLENGTH,
+ max_len=storage_device.LABEL_MAXLENGTH,
allow_empty=False,
- prefill=storage.device.get_label(),
+ prefill=storage_device.get_label(),
),
"device_name",
)
diff --git a/core/translations/en.json b/core/translations/en.json
index a11a9536..a4fbf91c 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -107,6 +107,9 @@
"bitcoin__unverified_external_inputs": "The transaction contains unverified external inputs.",
"bitcoin__valid_signature": "The signature is valid.",
"bitcoin__voting_rights": "Voting rights to",
+ "ble__manage_paired": "Manage paired devices",
+ "ble__pair_new": "Pair new device",
+ "ble__pair_title": "Pair & connect",
"ble__unpair_all": "Unpair all bluetooth devices",
"ble__unpair_current": "Unpair connected device",
"ble__unpair_title": "Unpair",
@@ -444,6 +447,7 @@
"haptic_feedback__title": "Haptic feedback",
"homescreen__click_to_connect": "Click to Connect",
"homescreen__click_to_unlock": "Click to Unlock",
+ "homescreen__firmware_version": "Firmware version",
"homescreen__set_default": "Change wallpaper to default image?",
"homescreen__settings_subtitle": "Settings",
"homescreen__settings_title": "Homescreen",
@@ -1192,6 +1196,7 @@
"wipe_code__turn_on": "Turn on wipe code protection?",
"wipe_code__wipe_code_mismatch": "Wipe code mismatch",
"word_count__title": "Number of words",
+ "words__about": "About",
"words__account": "Account",
"words__account_colon": "Account:",
"words__address": "Address",
@@ -1208,10 +1213,13 @@
"words__chain": "Chain",
"words__confirm": "Confirm",
"words__confirm_fee": "Confirm fee",
+ "words__connected": "Connected",
"words__contains": "Contains",
"words__continue_anyway": "Continue anyway",
"words__continue_anyway_question": "Continue anyway?",
"words__continue_with": "Continue with",
+ "words__device": "Device",
+ "words__disconnect": "Disconnect",
"words__error": "Error",
"words__fee": "Fee",
"words__from": "from",
@@ -1220,6 +1228,8 @@
"words__instructions": "Instructions",
"words__keep_it_safe": "Keep it safe!",
"words__know_what_your_doing": "Continue only if you know what you are doing!",
+ "words__led": "LED",
+ "words__manage": "Manage",
"words__my_trezor": "My Trezor",
"words__name": "Name",
"words__no": "No",
@@ -1234,6 +1244,8 @@
"words__receive": "Receive",
"words__recipient": "Recipient",
"words__recovery_share": "Recovery share",
+ "words__review": "Review",
+ "words__security": "Security",
"words__send": "Send",
"words__settings": "Settings",
"words__sign": "Sign",
diff --git a/core/translations/order.json b/core/translations/order.json
index 3d0507f6..9d9f120e 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1079,5 +1079,17 @@
"1077": "device_name__enter",
"1078": "regulatory_certification__title",
"1079": "words__name",
- "1080": "device_name__changed"
+ "1080": "device_name__changed",
+ "1081": "ble__manage_paired",
+ "1082": "ble__pair_new",
+ "1083": "ble__pair_title",
+ "1084": "homescreen__firmware_version",
+ "1085": "words__about",
+ "1086": "words__connected",
+ "1087": "words__device",
+ "1088": "words__disconnect",
+ "1089": "words__led",
+ "1090": "words__manage",
+ "1091": "words__review",
+ "1092": "words__security"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index d4298bae..748a0541 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "e44bae08b662c59aa91b62a75b9ee40858603b11ece9d8d4af19e5fd04a01fdc",
- "datetime": "2025-08-20T07:39:47.219011+00:00",
- "commit": "ec8cfd0bf7531340876483537a555def259bbfc7"
+ "merkle_root": "91e38f17eabf0592819660e07647cf906e858a4f00fee93ee796f48d9240d4dd",
+ "datetime": "2025-08-24T17:34:38.888405+00:00",
+ "commit": "d8cff7ac283765ed52b7b0ffcf1221a6a8bd1ea1"
},
"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.