chore(cardano): add missing translations
What changed, and why it matters
This commit only adds or updates translated text strings for the Cardano cryptocurrency feature. It replaces hard-coded English labels like 'Confirm message' and 'Message text' with references to the device's translation system, and updates the translation files, generated code, and a test marker. There is no change to security logic, cryptography, or how user approvals work.
No security action needed; this is a routine translation/internationalization maintenance commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff is a localization-only refactor for Cardano message signing UI. It introduces new translation keys (cardano__confirm_message, cardano__empty_message, cardano__message_hash, cardano__message_hex, cardano__message_text, cardano__sign_message_hash_path_template, cardano__sign_message_path_template), wires them into the Rust translation enum behind the universal_fw feature flag, updates the English translation JSON, regenerates translation order/signatures, and updates a test marker from skip_t1 to skip_t1b1. No functional behavior of the signing or confirmation flow is altered.
Changed components
core/src/apps/cardano/layout.pycore/translations/en.jsoncore/embed/rust/src/translations/generated/translated_string.rscore/embed/rust/librust_qstr.hcore/mocks/trezortranslate_keys.pyicore/translations/order.jsoncore/translations/signatures.jsontests/device_tests/cardano/test_sign_message.pyInspect captured patch +134 / −58
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index e25ee4ff..da1207d9 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -1004,6 +1004,7 @@ static void _librust_qstrs(void) {
MP_QSTR_cardano__collateral_input_index;
MP_QSTR_cardano__collateral_output_contains_tokens;
MP_QSTR_cardano__collateral_return;
+ MP_QSTR_cardano__confirm_message;
MP_QSTR_cardano__confirm_signing_stake_pool;
MP_QSTR_cardano__confirm_transaction;
MP_QSTR_cardano__confirming_a_multisig_transaction;
@@ -1017,6 +1018,7 @@ static void _librust_qstrs(void) {
MP_QSTR_cardano__delegating_to_key_hash;
MP_QSTR_cardano__delegating_to_script;
MP_QSTR_cardano__deposit;
+ MP_QSTR_cardano__empty_message;
MP_QSTR_cardano__for_account_and_index_template;
MP_QSTR_cardano__for_account_template;
MP_QSTR_cardano__for_key_hash;
@@ -1029,6 +1031,9 @@ static void _librust_qstrs(void) {
MP_QSTR_cardano__intro_text_registration_payment;
MP_QSTR_cardano__key_hash;
MP_QSTR_cardano__margin;
+ MP_QSTR_cardano__message_hash;
+ MP_QSTR_cardano__message_hex;
+ MP_QSTR_cardano__message_text;
MP_QSTR_cardano__multisig_path;
MP_QSTR_cardano__nested_scripts_template;
MP_QSTR_cardano__network;
@@ -1063,6 +1068,8 @@ static void _librust_qstrs(void) {
MP_QSTR_cardano__script_reward;
MP_QSTR_cardano__sending;
MP_QSTR_cardano__show_simple;
+ MP_QSTR_cardano__sign_message_hash_path_template;
+ MP_QSTR_cardano__sign_message_path_template;
MP_QSTR_cardano__sign_tx_path_template;
MP_QSTR_cardano__stake_delegation;
MP_QSTR_cardano__stake_deregistration;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index 05c4e796..f81134ba 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1462,25 +1462,39 @@ 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"
- ble__version = 1093, // "Bluetooth version"
- homescreen__firmware_type = 1094, // "Firmware type"
- words__off = 1095, // "OFF"
- words__on = 1096, // "ON"
- led__disable = 1097, // "Disable LED?"
- led__enable = 1098, // "Enable LED?"
- led__title = 1099, // "LED"
+ #[cfg(feature = "universal_fw")]
+ cardano__confirm_message = 1081, // "Confirm message"
+ #[cfg(feature = "universal_fw")]
+ cardano__empty_message = 1082, // "Empty message"
+ #[cfg(feature = "universal_fw")]
+ cardano__message_hash = 1083, // "Message hash:"
+ #[cfg(feature = "universal_fw")]
+ cardano__message_hex = 1084, // "Message hex"
+ #[cfg(feature = "universal_fw")]
+ cardano__message_text = 1085, // "Message text"
+ #[cfg(feature = "universal_fw")]
+ cardano__sign_message_hash_path_template = 1086, // "Sign message hash with {0}"
+ #[cfg(feature = "universal_fw")]
+ cardano__sign_message_path_template = 1087, // "Sign message with {0}"
+ ble__manage_paired = 1088, // "Manage paired devices"
+ ble__pair_new = 1089, // "Pair new device"
+ ble__pair_title = 1090, // "Pair & connect"
+ ble__version = 1091, // "Bluetooth version"
+ homescreen__firmware_type = 1092, // "Firmware type"
+ homescreen__firmware_version = 1093, // "Firmware version"
+ led__disable = 1094, // "Disable LED?"
+ led__enable = 1095, // "Enable LED?"
+ led__title = 1096, // "LED"
+ words__about = 1097, // "About"
+ words__connected = 1098, // "Connected"
+ words__device = 1099, // "Device"
+ words__disconnect = 1100, // "Disconnect"
+ words__led = 1101, // "LED"
+ words__manage = 1102, // "Manage"
+ words__off = 1103, // "OFF"
+ words__on = 1104, // "ON"
+ words__review = 1105, // "Review"
+ words__security = 1106, // "Security"
}
impl TranslatedString {
@@ -3262,25 +3276,39 @@ impl TranslatedString {
(Self::regulatory_certification__title, "Regulatory certification"),
(Self::words__name, "Name"),
(Self::device_name__changed, "Device name changed."),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__confirm_message, "Confirm message"),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__empty_message, "Empty message"),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__message_hash, "Message hash:"),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__message_hex, "Message hex"),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__message_text, "Message text"),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__sign_message_hash_path_template, "Sign message hash with {0}"),
+ #[cfg(feature = "universal_fw")]
+ (Self::cardano__sign_message_path_template, "Sign message with {0}"),
(Self::ble__manage_paired, "Manage paired devices"),
(Self::ble__pair_new, "Pair new device"),
(Self::ble__pair_title, "Pair & connect"),
+ (Self::ble__version, "Bluetooth version"),
+ (Self::homescreen__firmware_type, "Firmware type"),
(Self::homescreen__firmware_version, "Firmware version"),
+ (Self::led__disable, "Disable LED?"),
+ (Self::led__enable, "Enable LED?"),
+ (Self::led__title, "LED"),
(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"),
- (Self::ble__version, "Bluetooth version"),
- (Self::homescreen__firmware_type, "Firmware type"),
(Self::words__off, "OFF"),
(Self::words__on, "ON"),
- (Self::led__disable, "Disable LED?"),
- (Self::led__enable, "Enable LED?"),
- (Self::led__title, "LED"),
+ (Self::words__review, "Review"),
+ (Self::words__security, "Security"),
];
#[cfg(feature = "micropython")]
@@ -3458,6 +3486,8 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__collateral_return, Self::cardano__collateral_return),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__confirm_message, Self::cardano__confirm_message),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__confirm_signing_stake_pool, Self::cardano__confirm_signing_stake_pool),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__confirm_transaction, Self::cardano__confirm_transaction),
@@ -3484,6 +3514,8 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__deposit, Self::cardano__deposit),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__empty_message, Self::cardano__empty_message),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__for_account_and_index_template, Self::cardano__for_account_and_index_template),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__for_account_template, Self::cardano__for_account_template),
@@ -3508,6 +3540,12 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__margin, Self::cardano__margin),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__message_hash, Self::cardano__message_hash),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__message_hex, Self::cardano__message_hex),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__message_text, Self::cardano__message_text),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__multisig_path, Self::cardano__multisig_path),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__nested_scripts_template, Self::cardano__nested_scripts_template),
@@ -3576,6 +3614,10 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__show_simple, Self::cardano__show_simple),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__sign_message_hash_path_template, Self::cardano__sign_message_hash_path_template),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_cardano__sign_message_path_template, Self::cardano__sign_message_path_template),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__sign_tx_path_template, Self::cardano__sign_tx_path_template),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_cardano__stake_delegation, Self::cardano__stake_delegation),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 464af9cd..37ad0a2c 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -150,6 +150,7 @@ class TR:
cardano__collateral_input_index: str = "Collateral input index:"
cardano__collateral_output_contains_tokens: str = "The collateral return output contains tokens."
cardano__collateral_return: str = "Collateral return"
+ cardano__confirm_message: str = "Confirm message"
cardano__confirm_signing_stake_pool: str = "Confirm signing the stake pool registration as an owner."
cardano__confirm_transaction: str = "Confirm transaction"
cardano__confirming_a_multisig_transaction: str = "Confirming a multisig transaction."
@@ -163,6 +164,7 @@ class TR:
cardano__delegating_to_key_hash: str = "Delegating to key hash:"
cardano__delegating_to_script: str = "Delegating to script:"
cardano__deposit: str = "Deposit:"
+ cardano__empty_message: str = "Empty message"
cardano__for_account_and_index_template: str = "for account {0} and index {1}:"
cardano__for_account_template: str = "for account {0}:"
cardano__for_key_hash: str = "for key hash:"
@@ -175,6 +177,9 @@ class TR:
cardano__intro_text_registration_payment: str = "The vote key registration payment address is owned by this device. Its"
cardano__key_hash: str = "key hash"
cardano__margin: str = "Margin"
+ cardano__message_hash: str = "Message hash:"
+ cardano__message_hex: str = "Message hex"
+ cardano__message_text: str = "Message text"
cardano__multisig_path: str = "multi-sig path"
cardano__nested_scripts_template: str = "Contains {0} nested scripts."
cardano__network: str = "Network:"
@@ -209,6 +214,8 @@ class TR:
cardano__script_reward: str = "script reward"
cardano__sending: str = "Sending"
cardano__show_simple: str = "Show Simple"
+ cardano__sign_message_hash_path_template: str = "Sign message hash with {0}"
+ cardano__sign_message_path_template: str = "Sign message with {0}"
cardano__sign_tx_path_template: str = "Sign transaction with {0}"
cardano__stake_delegation: str = "Stake delegation"
cardano__stake_deregistration: str = "Stake key deregistration"
diff --git a/core/src/apps/cardano/layout.py b/core/src/apps/cardano/layout.py
index c673c480..3a0b6a35 100644
--- a/core/src/apps/cardano/layout.py
+++ b/core/src/apps/cardano/layout.py
@@ -338,13 +338,13 @@ async def confirm_message_payload(
if not payload_first_chunk:
assert payload_size == 0
props = _get_data_chunk_props(
- title="Empty message",
+ title=TR.cardano__empty_message,
first_chunk=payload_first_chunk,
data_size=payload_size,
)
elif not prefer_hex_display and is_unambiguous_ascii(payload_first_chunk):
props = _get_data_chunk_props(
- title="Message text",
+ title=TR.cardano__message_text,
first_chunk=payload_first_chunk,
data_size=payload_size,
max_displayed_size=max_displayed_bytes,
@@ -352,17 +352,17 @@ async def confirm_message_payload(
)
else:
props = _get_data_chunk_props(
- title="Message hex",
+ title=TR.cardano__message_hex,
first_chunk=payload_first_chunk,
data_size=payload_size,
max_displayed_size=max_displayed_bytes,
)
- props.append(("Message hash:", payload_hash))
+ props.append((TR.cardano__message_hash, payload_hash))
await confirm_properties(
"confirm_message_payload",
- title="Confirm message",
+ title=TR.cardano__confirm_message,
props=props,
br_code=BRT_Other,
)
@@ -411,7 +411,7 @@ async def show_credentials(
async def show_message_header_credentials(credentials: list[Credential]) -> None:
- intro_text = "Address"
+ intro_text = TR.words__address
for credential in credentials:
await _show_credential(credential, intro_text, purpose="message")
@@ -467,7 +467,7 @@ async def _show_credential(
"address": f"{ADDRESS_TYPE_NAMES[credential.address_type]} address",
"output": TR.cardano__confirm_transaction,
"cvote_reg_payment_address": TR.cardano__confirm_transaction,
- "message": "Confirm message",
+ "message": TR.cardano__confirm_message,
}[purpose]
props: list[PropertyType] = []
@@ -603,11 +603,17 @@ async def confirm_witness_request(
async def confirm_message_path(path: list[int], is_signing_hash: bool) -> None:
+ path_title = _get_path_title(path)
+ text = (
+ TR.cardano__sign_message_hash_path_template.format(path_title)
+ if is_signing_hash
+ else TR.cardano__sign_message_path_template.format(path_title)
+ )
await layouts.confirm_text(
"confirm_message_signing_path",
- "Confirm message",
+ TR.cardano__confirm_message,
address_n_to_str(path),
- f"Sign message{' hash' if is_signing_hash else ''} with {_get_path_title(path)}:",
+ text,
BRT_Other,
)
diff --git a/core/translations/en.json b/core/translations/en.json
index e642da98..edc0a649 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -182,6 +182,7 @@
"cardano__collateral_input_index": "Collateral input index:",
"cardano__collateral_output_contains_tokens": "The collateral return output contains tokens.",
"cardano__collateral_return": "Collateral return",
+ "cardano__confirm_message": "Confirm message",
"cardano__confirm_signing_stake_pool": "Confirm signing the stake pool registration as an owner.",
"cardano__confirm_transaction": "Confirm transaction",
"cardano__confirming_a_multisig_transaction": "Confirming a multisig transaction.",
@@ -195,6 +196,7 @@
"cardano__delegating_to_key_hash": "Delegating to key hash:",
"cardano__delegating_to_script": "Delegating to script:",
"cardano__deposit": "Deposit:",
+ "cardano__empty_message": "Empty message",
"cardano__for_account_and_index_template": "for account {0} and index {1}:",
"cardano__for_account_template": "for account {0}:",
"cardano__for_key_hash": "for key hash:",
@@ -207,6 +209,9 @@
"cardano__intro_text_registration_payment": "The vote key registration payment address is owned by this device. Its",
"cardano__key_hash": "key hash",
"cardano__margin": "Margin",
+ "cardano__message_hash": "Message hash:",
+ "cardano__message_hex": "Message hex",
+ "cardano__message_text": "Message text",
"cardano__multisig_path": "multi-sig path",
"cardano__nested_scripts_template": "Contains {0} nested scripts.",
"cardano__network": "Network:",
@@ -241,6 +246,8 @@
"cardano__script_reward": "script reward",
"cardano__sending": "Sending",
"cardano__show_simple": "Show Simple",
+ "cardano__sign_message_hash_path_template": "Sign message hash with {0}",
+ "cardano__sign_message_path_template": "Sign message with {0}",
"cardano__sign_tx_path_template": "Sign transaction with {0}",
"cardano__stake_delegation": "Stake delegation",
"cardano__stake_deregistration": "Stake key deregistration",
diff --git a/core/translations/order.json b/core/translations/order.json
index 19d634a7..9f95bfff 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1080,23 +1080,30 @@
"1078": "regulatory_certification__title",
"1079": "words__name",
"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",
- "1093": "ble__version",
- "1094": "homescreen__firmware_type",
- "1095": "words__off",
- "1096": "words__on",
- "1097": "led__disable",
- "1098": "led__enable",
- "1099": "led__title"
+ "1081": "cardano__confirm_message",
+ "1082": "cardano__empty_message",
+ "1083": "cardano__message_hash",
+ "1084": "cardano__message_hex",
+ "1085": "cardano__message_text",
+ "1086": "cardano__sign_message_hash_path_template",
+ "1087": "cardano__sign_message_path_template",
+ "1088": "ble__manage_paired",
+ "1089": "ble__pair_new",
+ "1090": "ble__pair_title",
+ "1091": "ble__version",
+ "1092": "homescreen__firmware_type",
+ "1093": "homescreen__firmware_version",
+ "1094": "led__disable",
+ "1095": "led__enable",
+ "1096": "led__title",
+ "1097": "words__about",
+ "1098": "words__connected",
+ "1099": "words__device",
+ "1100": "words__disconnect",
+ "1101": "words__led",
+ "1102": "words__manage",
+ "1103": "words__off",
+ "1104": "words__on",
+ "1105": "words__review",
+ "1106": "words__security"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 6b4f7588..8978651d 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "6bbc691017a335ab66c3f6c3cda05395a86d6cd6d6778d3e28eb27c73dccd387",
- "datetime": "2025-08-25T08:56:21.339747+00:00",
- "commit": "13c21082d0c6e9ff634e54f2a31986806f6e8288"
+ "merkle_root": "8831f35419234e4ff06e269d941c33cd364118e9ca935ee4587611172bd8612a",
+ "datetime": "2025-08-25T10:11:10.597216+00:00",
+ "commit": "5bc7576aabff225f66984c24d9d343a46f4a64fe"
},
"history": [
{
diff --git a/tests/device_tests/cardano/test_sign_message.py b/tests/device_tests/cardano/test_sign_message.py
index 93898ade..436043d6 100644
--- a/tests/device_tests/cardano/test_sign_message.py
+++ b/tests/device_tests/cardano/test_sign_message.py
@@ -9,7 +9,7 @@ from ...common import parametrize_using_common_fixtures
pytestmark = [
pytest.mark.altcoin,
pytest.mark.cardano,
- pytest.mark.skip_t1,
+ pytest.mark.skip_t1b1,
]
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.