diff --git a/wallet/common/nem/src/modules/TransferModule.js b/wallet/common/nem/src/modules/TransferModule.js index 409846c3f8..2f82a95d33 100644 --- a/wallet/common/nem/src/modules/TransferModule.js +++ b/wallet/common/nem/src/modules/TransferModule.js @@ -152,9 +152,9 @@ export class TransferModule { if (transaction.type !== TransactionType.TRANSFER) { throw new ControllerError( - 'error_failed_decrypt_message_invalid_transaction_type', `Failed to decrypt message. Transaction type "${transaction.type}" is not supported. ` - + `Expected type "${TransactionType.TRANSFER}"` + + `Expected type "${TransactionType.TRANSFER}"`, + 'error_failed_decrypt_message_invalid_transaction_type' ); } @@ -173,8 +173,8 @@ export class TransferModule { } throw new ControllerError( - 'error_failed_decrypt_message_not_related', - 'Failed to decrypt message. Transaction is not related to the current account' + 'Failed to decrypt message. Transaction is not related to the current account', + 'error_failed_decrypt_message_not_related' ); }; @@ -183,8 +183,8 @@ export class TransferModule { const accountInfo = await this.#api.account.fetchAccountInfo(networkProperties, recipientAddress); if (!accountInfo.publicKey) { throw new ControllerError( - 'error_transfer_encrypted_message_no_recipient_public_key', - `Cannot encrypt message: recipient public key for "${recipientAddress}" is unknown` + `Cannot encrypt message: recipient public key for "${recipientAddress}" is unknown`, + 'error_transfer_encrypted_message_no_recipient_public_key' ); } return accountInfo.publicKey; diff --git a/wallet/common/nem/tests/modules/TransferModule.test.js b/wallet/common/nem/tests/modules/TransferModule.test.js index d0a2d2439a..15e30a70ba 100644 --- a/wallet/common/nem/tests/modules/TransferModule.test.js +++ b/wallet/common/nem/tests/modules/TransferModule.test.js @@ -247,8 +247,8 @@ describe('modules/TransferModule', () => { }, expected: { error: new ControllerError( - 'error_transfer_encrypted_message_no_recipient_public_key', - `Cannot encrypt message: recipient public key for "${RECIPIENT_ADDRESS}" is unknown` + `Cannot encrypt message: recipient public key for "${RECIPIENT_ADDRESS}" is unknown`, + 'error_transfer_encrypted_message_no_recipient_public_key' ), shouldFetchRecipientInfo: true } @@ -369,9 +369,9 @@ describe('modules/TransferModule', () => { }, expected: { error: new ControllerError( - 'error_failed_decrypt_message_invalid_transaction_type', `Failed to decrypt message. Transaction type "${TransactionType.MULTISIG}" is not supported. ` - + `Expected type "${TransactionType.TRANSFER}"` + + `Expected type "${TransactionType.TRANSFER}"`, + 'error_failed_decrypt_message_invalid_transaction_type' ) } }, @@ -388,8 +388,8 @@ describe('modules/TransferModule', () => { }, expected: { error: new ControllerError( - 'error_failed_decrypt_message_not_related', - 'Failed to decrypt message. Transaction is not related to the current account' + 'Failed to decrypt message. Transaction is not related to the current account', + 'error_failed_decrypt_message_not_related' ) } } diff --git a/wallet/common/symbol/src/modules/HarvestingModule.js b/wallet/common/symbol/src/modules/HarvestingModule.js index 468e807ba8..c931bf81f1 100644 --- a/wallet/common/symbol/src/modules/HarvestingModule.js +++ b/wallet/common/symbol/src/modules/HarvestingModule.js @@ -387,8 +387,8 @@ export class HarvestingModule { // If nothing to unlink, then just escape if (transactions.length === 0) { throw new ControllerError( - 'error_harvesting_no_keys_to_unlink', - 'Failed to create stop harvesting transaction. No keys to unlink.' + 'Failed to create stop harvesting transaction. No keys to unlink.', + 'error_harvesting_no_keys_to_unlink' ); } @@ -418,8 +418,8 @@ export class HarvestingModule { if (!accountInfo.publicKey) { throw new ControllerError( - 'error_harvesting_account_no_activity', - `Failed to create harvesting transaction. Public key for account "${address}" does not exist on the network.` + `Failed to create harvesting transaction. Public key for account "${address}" does not exist on the network.`, + 'error_harvesting_account_no_activity' ); } diff --git a/wallet/common/symbol/src/modules/TransferModule.js b/wallet/common/symbol/src/modules/TransferModule.js index 99e38533be..e483364a42 100644 --- a/wallet/common/symbol/src/modules/TransferModule.js +++ b/wallet/common/symbol/src/modules/TransferModule.js @@ -71,8 +71,8 @@ export class TransferModule { if (!recipientAddress) { throw new ControllerError( - 'error_transfer_unknown_recipient', - `Failed to create transfer transaction. Recipient address not found for provided alias "${recipientAddressOrAlias}"` + `Failed to create transfer transaction. Recipient address not found for provided alias "${recipientAddressOrAlias}"`, + 'error_transfer_unknown_recipient' ); } @@ -132,9 +132,9 @@ export class TransferModule { if (transaction.type !== TransactionType.TRANSFER) { throw new ControllerError( - 'error_failed_decrypt_message_invalid_transaction_type', `Failed to decrypt message. Transaction type "${transaction.type}" is not supported. ` - + `Expected type "${TransactionType.TRANSFER}"` + + `Expected type "${TransactionType.TRANSFER}"`, + 'error_failed_decrypt_message_invalid_transaction_type' ); } @@ -153,8 +153,8 @@ export class TransferModule { } throw new ControllerError( - 'error_failed_decrypt_message_not_related', - 'Failed to decrypt message. Transaction is not related to current account' + 'Failed to decrypt message. Transaction is not related to current account', + 'error_failed_decrypt_message_not_related' ); }; diff --git a/wallet/common/symbol/tests/modules/HarvestingModule.test.js b/wallet/common/symbol/tests/modules/HarvestingModule.test.js index c72abcd575..b3420e08c4 100644 --- a/wallet/common/symbol/tests/modules/HarvestingModule.test.js +++ b/wallet/common/symbol/tests/modules/HarvestingModule.test.js @@ -604,8 +604,8 @@ describe('HarvestingModule', () => { config: { harvester: harvester.currentAccountWithoutLinkedKeys }, expected: { error: new ControllerError( - 'error_harvesting_no_keys_to_unlink', - 'Failed to create stop harvesting transaction. No keys to unlink.' + 'Failed to create stop harvesting transaction. No keys to unlink.', + 'error_harvesting_no_keys_to_unlink' ) } }, @@ -614,9 +614,9 @@ describe('HarvestingModule', () => { config: { harvester: harvester.inactiveMultisigAccount }, expected: { error: new ControllerError( - 'error_harvesting_account_no_activity', 'Failed to create harvesting transaction. Public key for account ' - + `"${inactiveMultisigAccountInfo.address}" does not exist on the network.` + + `"${inactiveMultisigAccountInfo.address}" does not exist on the network.`, + 'error_harvesting_account_no_activity' ) } } @@ -719,9 +719,9 @@ describe('HarvestingModule', () => { it('throws when the multisig harvester has never been active on the network', async () => { // Arrange: const expectedError = new ControllerError( - 'error_harvesting_account_no_activity', 'Failed to create harvesting transaction. Public key for account ' - + `"${inactiveMultisigAccountInfo.address}" does not exist on the network.` + + `"${inactiveMultisigAccountInfo.address}" does not exist on the network.`, + 'error_harvesting_account_no_activity' ); api.account.fetchAccountInfo.mockResolvedValue(inactiveMultisigAccountInfo); diff --git a/wallet/common/symbol/tests/modules/TransferModule.test.js b/wallet/common/symbol/tests/modules/TransferModule.test.js index 30f3ed995f..dd66ef0c8a 100644 --- a/wallet/common/symbol/tests/modules/TransferModule.test.js +++ b/wallet/common/symbol/tests/modules/TransferModule.test.js @@ -336,8 +336,8 @@ describe('TransferModule', () => { isMessageEncrypted: false }; const expectedError = new ControllerError( - 'error_transfer_unknown_recipient', - `Failed to create transfer transaction. Recipient address not found for provided alias "${aliasName}"` + `Failed to create transfer transaction. Recipient address not found for provided alias "${aliasName}"`, + 'error_transfer_unknown_recipient' ); // Act & Assert: @@ -601,9 +601,9 @@ describe('TransferModule', () => { signerPublicKey: currentAccount.publicKey }; const expectedError = new ControllerError( - 'error_failed_decrypt_message_invalid_transaction_type', // eslint-disable-next-line max-len - `Failed to decrypt message. Transaction type "${transaction.type}" is not supported. Expected type "${TransactionType.TRANSFER}"` + `Failed to decrypt message. Transaction type "${transaction.type}" is not supported. Expected type "${TransactionType.TRANSFER}"`, + 'error_failed_decrypt_message_invalid_transaction_type' ); // Act & Assert: @@ -628,8 +628,8 @@ describe('TransferModule', () => { deadline: createDeadline(2, networkProperties.epochAdjustment) }; const expectedError = new ControllerError( - 'error_failed_decrypt_message_not_related', - 'Failed to decrypt message. Transaction is not related to current account' + 'Failed to decrypt message. Transaction is not related to current account', + 'error_failed_decrypt_message_not_related' ); // Act & Assert: diff --git a/wallet/symbol/mobile/__tests__/app/components/NavigationMenu.test.js b/wallet/symbol/mobile/__tests__/app/components/NavigationMenu.test.js index 4fc0b47469..0b051c7a0c 100644 --- a/wallet/symbol/mobile/__tests__/app/components/NavigationMenu.test.js +++ b/wallet/symbol/mobile/__tests__/app/components/NavigationMenu.test.js @@ -10,11 +10,11 @@ describe('components/NavigationMenu', () => { runScreenNavigationTest(NavigationMenu, { navigationActions: [ { - buttonText: 'navigation_home', + buttonText: 'component_navigationMenu_tab_home', actionName: 'goToHome' }, { - buttonText: 'navigation_history', + buttonText: 'component_navigationMenu_tab_history', actionName: 'goToHistory' } ] diff --git a/wallet/symbol/mobile/__tests__/components/controls/FeeSelector.test.js b/wallet/symbol/mobile/__tests__/components/controls/FeeSelector.test.js index c36c7d9732..82377995f3 100644 --- a/wallet/symbol/mobile/__tests__/components/controls/FeeSelector.test.js +++ b/wallet/symbol/mobile/__tests__/components/controls/FeeSelector.test.js @@ -5,9 +5,9 @@ import { fireEvent, render } from '@testing-library/react-native'; const SCREEN_TEXT = { textTitle: 'Transaction Fee', - textFeeSlow: 'selector_fee_slow', - textFeeMedium: 'selector_fee_medium', - textFeeFast: 'selector_fee_fast' + textFeeSlow: 'feeSpeed_slow', + textFeeMedium: 'feeSpeed_medium', + textFeeFast: 'feeSpeed_fast' }; const FeeTierLevel = { diff --git a/wallet/symbol/mobile/__tests__/components/controls/InputAmount.test.js b/wallet/symbol/mobile/__tests__/components/controls/InputAmount.test.js index fcdbf90b4b..48ceeb0100 100644 --- a/wallet/symbol/mobile/__tests__/components/controls/InputAmount.test.js +++ b/wallet/symbol/mobile/__tests__/components/controls/InputAmount.test.js @@ -4,10 +4,10 @@ import { mockLocalization } from '__tests__/mock-helpers'; import { fireEvent, render, waitFor } from '@testing-library/react-native'; const SCREEN_TEXT = { - inputAmountLabel: 'input_amount', + inputAmountLabel: 'inputLabel_amount', inputAmountPlaceholder: '0', - textAvailableBalance: 'c_inputAmount_label_available', - textConfirmTitle: 'c_inputAmount_confirm_title', + textAvailableBalance: 'component_inputAmount_label_available', + textConfirmTitle: 'component_inputAmount_dialog_maxAmount_title', buttonConfirm: 'button_confirm', buttonCancel: 'button_cancel' }; diff --git a/wallet/symbol/mobile/__tests__/components/controls/SelectTransactionSender.test.js b/wallet/symbol/mobile/__tests__/components/controls/SelectTransactionSender.test.js index 808bce616d..5eb9a53c84 100644 --- a/wallet/symbol/mobile/__tests__/components/controls/SelectTransactionSender.test.js +++ b/wallet/symbol/mobile/__tests__/components/controls/SelectTransactionSender.test.js @@ -13,11 +13,11 @@ const TICKER = 'XYM'; // Screen Text const SCREEN_TEXT = { - label: 'input_sender', - tabCurrentAccount: 'c_selectTransactionSender_currentAccount', - tabMultisigAccount: 'c_selectTransactionSender_multisigAccount', - dropdownTitle: 'c_selectTransactionSender_selectTitle', - defaultMultisigName: 's_multisig_defaultAccountName' + label: 'Sender', // passed in as a prop, the caller translates it + tabCurrentAccount: 'component_selectTransactionSender_tab_currentAccount', + tabMultisigAccount: 'component_selectTransactionSender_tab_multisigAccount', + dropdownTitle: 'component_selectTransactionSender_title_selectSender', + defaultMultisigName: 'component_selectTransactionSender_title_defaultAccountName' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/components/display/Token/TokenListItem.test.js b/wallet/symbol/mobile/__tests__/components/display/Token/TokenListItem.test.js index 0b7af3488e..e1999db760 100644 --- a/wallet/symbol/mobile/__tests__/components/display/Token/TokenListItem.test.js +++ b/wallet/symbol/mobile/__tests__/components/display/Token/TokenListItem.test.js @@ -15,7 +15,7 @@ const token = TokenFixtureBuilder const TICKER = 'XYM'; const DISPLAY_NAME = `${token.name} • ${TICKER}`; const ACCESSIBILITY_LABEL = 'token-item'; -const EXPIRED_TEXT = 's_assets_item_expired'; +const EXPIRED_TEXT = 'component_expirationProgress_label_expired'; const expiredTokenExpiration = { startHeight: 1_000, diff --git a/wallet/symbol/mobile/__tests__/components/features/Passcode.test.js b/wallet/symbol/mobile/__tests__/components/features/Passcode.test.js index 9c64de54ad..62f2719f04 100644 --- a/wallet/symbol/mobile/__tests__/components/features/Passcode.test.js +++ b/wallet/symbol/mobile/__tests__/components/features/Passcode.test.js @@ -27,14 +27,14 @@ const TEST_PASSCODE = '1234'; const INCORRECT_PASSCODE = '0000'; const SCREEN_TEXT = { - textCreateEnterTitle: 's_passcode_createEnter_title', - textCreateConfirmTitle: 's_passcode_createConfirm_title', - textVerifyTitle: 's_passcode_verify_title', - textCreateEnterDescription: 's_passcode_createEnter_description', - textCreateConfirmDescription: 's_passcode_createConfirm_description', - textErrorIncorrect: 's_passcode_error_incorrect', - textErrorMismatch: 's_passcode_error_mismatch', - textErrorMaxAttempts: 's_passcode_error_maxAttempts_time_minute', + textCreateEnterTitle: 'component_passcode_title_createEnter', + textCreateConfirmTitle: 'component_passcode_title_createConfirm', + textVerifyTitle: 'component_passcode_title_verify', + textCreateEnterDescription: 'component_passcode_description_createEnter', + textCreateConfirmDescription: 'component_passcode_description_createConfirm', + textErrorIncorrect: 'component_passcode_errorMessage_incorrect', + textErrorMismatch: 'component_passcode_errorMessage_mismatch', + textErrorMaxAttempts: 'component_passcode_errorMessage_maxAttemptsMinute', buttonCancel: 'button_cancel', buttonDelete: 'delete' }; diff --git a/wallet/symbol/mobile/__tests__/components/features/TableView.test.js b/wallet/symbol/mobile/__tests__/components/features/TableView.test.js index 06c5a081ba..d5a611dceb 100644 --- a/wallet/symbol/mobile/__tests__/components/features/TableView.test.js +++ b/wallet/symbol/mobile/__tests__/components/features/TableView.test.js @@ -170,7 +170,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Active', 'data_true'] + visibleTexts: ['Active', 'fieldValue_true'] } }, { @@ -183,7 +183,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Active', 'data_false'] + visibleTexts: ['Active', 'fieldValue_false'] } }, { @@ -196,7 +196,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Message', 'data_encrypted'] + visibleTexts: ['Message', 'fieldValue_encrypted'] } }, { @@ -209,7 +209,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Message', 'data_unencrypted'] + visibleTexts: ['Message', 'fieldValue_unencrypted'] } }, { @@ -222,7 +222,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Status', 'data_pending'] + visibleTexts: ['Status', 'fieldValue_pending'] } }, { @@ -236,7 +236,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Type', 'transactionDescriptor_symbol_16724'] + visibleTexts: ['Type', 'transactionType_transfer'] } }, { @@ -250,7 +250,7 @@ describe('components/TableView', () => { } }, expected: { - visibleTexts: ['Type', 'transactionDescriptor_ethereum_1'] + visibleTexts: ['Type', 'transactionType_transfer'] } } ]; diff --git a/wallet/symbol/mobile/__tests__/components/feedback/MultisigAccountWarning.test.js b/wallet/symbol/mobile/__tests__/components/feedback/MultisigAccountWarning.test.js index b6d0704a7b..372b50725b 100644 --- a/wallet/symbol/mobile/__tests__/components/feedback/MultisigAccountWarning.test.js +++ b/wallet/symbol/mobile/__tests__/components/feedback/MultisigAccountWarning.test.js @@ -12,8 +12,8 @@ const NETWORK_IDENTIFIER = 'testnet'; // Screen Text const SCREEN_TEXT = { - textWarningTitle: 'warning_multisig_title', - textWarningBody: 'warning_multisig_body', + textWarningTitle: 'alert_multisigWarning_title', + textWarningBody: 'alert_multisigWarning_description', textFieldCosignatories: 'fieldTitle_cosignatories' }; diff --git a/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/TransactionScreenTemplate.test.js b/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/TransactionScreenTemplate.test.js index 7ccc78325b..2698c024f6 100644 --- a/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/TransactionScreenTemplate.test.js +++ b/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/TransactionScreenTemplate.test.js @@ -13,12 +13,12 @@ const SCREEN_TEXT = { buttonConfirm: 'button_confirm', buttonCancel: 'button_cancel', // Dialog - textConfirmDialogTitle: 'form_transfer_confirm_title', + textConfirmDialogTitle: 'component_transactionConfirmationDialog_title_confirmTransfer', textCustomConfirmTitle: 'Custom Confirm Title', textCustomConfirmText: 'Custom confirm text message', // Multisig warning - textMultisigWarningTitle: 'warning_multisig_title', - textMultisigWarningBody: 'warning_multisig_body', + textMultisigWarningTitle: 'alert_multisigWarning_title', + textMultisigWarningBody: 'alert_multisigWarning_description', // Children content textChildrenContent: 'Test Form Content' }; diff --git a/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/components/TransactionProgressDialog.test.js b/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/components/TransactionProgressDialog.test.js index 22b2d55e44..f9b3615c51 100644 --- a/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/components/TransactionProgressDialog.test.js +++ b/wallet/symbol/mobile/__tests__/components/templates/TransactionScreenTemplate/components/TransactionProgressDialog.test.js @@ -22,36 +22,36 @@ jest.mock('@/app/utils', () => ({ // constants -const SCREEN_TEXT_TRANSACTION_COUNTER = 'c_transactionStatus_transaction_text'; +const SCREEN_TEXT_TRANSACTION_COUNTER = 'component_transactionProgressDialog_label_transaction'; const SCREEN_TEXT = { // Dialog - textDialogTitle: 'c_transactionStatus_dialog_title', + textDialogTitle: 'component_transactionProgressDialog_title_sendTransaction', buttonOk: 'button_ok', // Activity log steps - textStepCreate: 'c_transactionStatus_step_create', - textStepSign: 'c_transactionStatus_step_sign', - textStepAnnounce: 'c_transactionStatus_step_announce', - textStepConfirm: 'c_transactionStatus_step_confirm', + textStepCreate: 'component_transactionScreenTemplate_step_create', + textStepSign: 'component_transactionScreenTemplate_step_sign', + textStepAnnounce: 'component_transactionScreenTemplate_step_announce', + textStepConfirm: 'component_transactionScreenTemplate_step_confirm', // Status card titles - textStatusSending: 'c_transactionStatus_status_sending_title', - textStatusConfirming: 'c_transactionStatus_status_confirming_title', - textStatusSuccess: 'c_transactionStatus_status_confirmed_title', - textStatusCreateError: 'c_transactionStatus_status_createError_title', - textStatusSignError: 'c_transactionStatus_status_signError_title', - textStatusPartial: 'c_transactionStatus_status_partial_title', - textStatusAnnounceError: 'c_transactionStatus_status_announceError_title', + textStatusSending: 'component_transactionScreenTemplate_status_sending_title', + textStatusConfirming: 'component_transactionScreenTemplate_status_confirming_title', + textStatusSuccess: 'component_transactionScreenTemplate_status_confirmed_title', + textStatusCreateError: 'component_transactionScreenTemplate_status_createError_title', + textStatusSignError: 'component_transactionScreenTemplate_status_signError_title', + textStatusPartial: 'component_transactionScreenTemplate_status_partial_title', + textStatusAnnounceError: 'component_transactionScreenTemplate_status_announceError_title', // Status card descriptions - textDescriptionSending: 'c_transactionStatus_status_sending_description', - textDescriptionConfirming: 'c_transactionStatus_status_confirming_description', - textDescriptionPartial: 'c_transactionStatus_status_partial_description', - textDescriptionSuccess: 'c_transactionStatus_status_confirmed_description', - textDescriptionCreateError: 'c_transactionStatus_status_createError_description', - textDescriptionSignError: 'c_transactionStatus_status_signError_description', - textDescriptionAnnounceError: 'c_transactionStatus_status_announceError_description', - textDescriptionRejected: 'c_transactionStatus_status_failedTransaction_description', + textDescriptionSending: 'component_transactionScreenTemplate_status_sending_description', + textDescriptionConfirming: 'component_transactionScreenTemplate_status_confirming_description', + textDescriptionPartial: 'component_transactionScreenTemplate_status_partial_description', + textDescriptionSuccess: 'component_transactionScreenTemplate_status_confirmed_description', + textDescriptionCreateError: 'component_transactionScreenTemplate_status_createError_description', + textDescriptionSignError: 'component_transactionScreenTemplate_status_signError_description', + textDescriptionAnnounceError: 'component_transactionScreenTemplate_status_announceError_description', + textDescriptionRejected: 'component_transactionScreenTemplate_status_failedTransaction_description', // Explorer button buttonViewInExplorer: 'button_openTransactionInExplorer', diff --git a/wallet/symbol/mobile/__tests__/localization/en-json.test.js b/wallet/symbol/mobile/__tests__/localization/en-json.test.js new file mode 100644 index 0000000000..b1c2c48abc --- /dev/null +++ b/wallet/symbol/mobile/__tests__/localization/en-json.test.js @@ -0,0 +1,130 @@ +import fs from 'fs'; +import path from 'path'; + +// Enforces docs/localization.md on the source locale. + +// File locations + +const LOCALE_FILE_PATH = path.join(__dirname, '../../src/localization/locales/en.json'); +const SCREENS_DIRECTORY = path.join(__dirname, '../../src/screens'); +const COMPONENT_DIRECTORIES = [path.join(__dirname, '../../src/components'), path.join(__dirname, '../../src/app/components')]; + +// Element vocabulary (guideline "Elements") + +const ELEMENT_WORDS = [ + 'dialog', 'alert', 'status', 'item', 'tab', 'step', 'button', 'link', 'checkbox', 'toggle', 'chip', 'widget', + 'inputLabel', 'fieldTitle', 'fieldValue', 'errorMessage', 'validationError', + 'title', 'subtitle', 'description', 'label', 'placeholder', 'hint', 'tooltip', 'message' +]; +const GLOBAL_ONLY_ELEMENT_WORDS = [ + 'transactionType', 'transactionDescriptionShort', 'transactionGroup', 'transactionStatus', + 'receiptType', 'month', 'feeSpeed', 'screenTitle' +]; +const GLOBAL_ELEMENT_WORDS = [...ELEMENT_WORDS, ...GLOBAL_ONLY_ELEMENT_WORDS]; + +const SEGMENT_PATTERN = /^[A-Za-z][A-Za-z0-9]*$/; +const SECTION_PATTERN = /^[a-z][a-zA-Z0-9]*$/; + +// Key owners taken from the filesystem + +const toCamelCase = kebabName => kebabName.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); + +// Screen folders under src/screens ("address-book" -> "addressBook"). +const screenFolders = fs.readdirSync(SCREENS_DIRECTORY, { withFileTypes: true }) + .filter(entry => entry.isDirectory()) + .map(entry => toCamelCase(entry.name)); + +const collectComponentFileNames = directory => + fs.readdirSync(directory, { withFileTypes: true }).flatMap(entry => { + if (entry.isDirectory()) + return [entry.name, ...collectComponentFileNames(path.join(directory, entry.name))]; + + return entry.name.endsWith('.jsx') ? [path.basename(entry.name, '.jsx')] : []; + }); + +// PascalCase component files and folders ("TransactionScreenTemplate" -> "transactionScreenTemplate"). +const componentNames = COMPONENT_DIRECTORIES.flatMap(collectComponentFileNames) + .filter(name => /^[A-Z]/.test(name)) + .map(name => name[0].toLowerCase() + name.slice(1)); + +// Key grammar (guideline "Scopes", "Folder and section", "Chaining") + +// Chain grammar: _[_[_]]. +const getChainViolation = (chainSegments, firstElementWords) => { + const [element, , subElement] = chainSegments; + + if (chainSegments.length < 2 || chainSegments.length > 4) + return 'chain must be _[_[_]]'; + if (!firstElementWords.includes(element)) + return `'${element}' is not an element word`; + if (subElement !== undefined && !ELEMENT_WORDS.includes(subElement)) + return `'${subElement}' is not an element word`; + + return null; +}; + +// Scoped keys: screen_[_
]_, component_[_
]_. +const getScopedKeyViolation = (segments, ownerNames, ownerLabel) => { + const [, ownerName, ...rest] = segments; + + if (!ownerNames.includes(ownerName)) + return `unknown ${ownerLabel} '${ownerName}'`; + + const hasSection = rest.length > 0 && !ELEMENT_WORDS.includes(rest[0]); + if (hasSection && !SECTION_PATTERN.test(rest[0])) + return `section '${rest[0]}' must be camelCase`; + + const chainViolation = getChainViolation(hasSection ? rest.slice(1) : rest, ELEMENT_WORDS); + if (chainViolation && hasSection) + return `'${rest[0]}' is not an element word, and as a section: ${chainViolation}`; + + return chainViolation; +}; + +// Returns the guideline violation for a key, or null when the key is valid. +const getKeyViolation = key => { + const segments = key.split('_'); + + if (segments.some(segment => !SEGMENT_PATTERN.test(segment))) + return 'segments must be letters and digits, starting with a letter'; + if (segments[0] === 'screen') + return getScopedKeyViolation(segments, screenFolders, 'screen folder'); + if (segments[0] === 'component') + return getScopedKeyViolation(segments, componentNames, 'component'); + + return getChainViolation(segments, GLOBAL_ELEMENT_WORDS); +}; + +describe('localization/locales/en.json', () => { + const rawText = fs.readFileSync(LOCALE_FILE_PATH, 'utf8'); + const en = JSON.parse(rawText); + const keys = Object.keys(en); + + describe('file format', () => { + it('is canonically formatted: 4-space indent, no duplicate keys, trailing newline', () => { + // Act & Assert: + expect(rawText).toBe(JSON.stringify(en, null, 4) + '\n'); + }); + + it('keys are sorted alphabetically, case-insensitive', () => { + // Arrange: + const expectedKeys = [...keys].sort((keyA, keyB) => (keyA.toLowerCase() < keyB.toLowerCase() ? -1 : 1)); + + // Act & Assert: + expect(keys).toEqual(expectedKeys); + }); + }); + + describe('key structure', () => { + it('every key follows the guideline grammar', () => { + // Act: + const violations = keys + .map(key => ({ key, violation: getKeyViolation(key) })) + .filter(entry => entry.violation !== null) + .map(entry => `${entry.key} — ${entry.violation}`); + + // Assert: + expect(violations).toEqual([]); + }); + }); +}); diff --git a/wallet/symbol/mobile/__tests__/localization/translations.test.js b/wallet/symbol/mobile/__tests__/localization/translations.test.js new file mode 100644 index 0000000000..800f5800c3 --- /dev/null +++ b/wallet/symbol/mobile/__tests__/localization/translations.test.js @@ -0,0 +1,64 @@ +import fs from 'fs'; +import path from 'path'; + +// Checks translation locale files for consistency with the source locale (en.json). + +const LOCALES_DIRECTORY = path.join(__dirname, '../../src/localization/locales'); + +// The list of translated locale files that are tested for key consistency. +const TRANSLATED_LOCALE_FILES = []; + +// Outdated translations; not tested. +const LEGACY_LOCALE_FILES = ['cn.json', 'ja.json', 'ko.json', 'uk.json', 'zh.json']; + +const readLocaleKeys = fileName => Object.keys(JSON.parse(fs.readFileSync(path.join(LOCALES_DIRECTORY, fileName), 'utf8'))); + +const enKeys = readLocaleKeys('en.json'); + +describe('localization/locales translations', () => { + it('locales directory contains only en.json and the registered locale files', () => { + // Arrange: + const expectedFileNames = ['en.json', ...TRANSLATED_LOCALE_FILES, ...LEGACY_LOCALE_FILES].sort(); + + // Act: + const fileNames = fs.readdirSync(LOCALES_DIRECTORY).sort(); + + // Assert: + expect(fileNames).toEqual(expectedFileNames); + }); + + const runTranslationFileTests = fileName => { + describe(fileName, () => { + const translationKeys = readLocaleKeys(fileName); + + it('has every key from en.json', () => { + // Act: + const missingKeys = enKeys.filter(key => !translationKeys.includes(key)); + + // Assert: + expect(missingKeys).toEqual([]); + }); + + it('has no keys that are absent from en.json', () => { + // Act: + const extraKeys = translationKeys.filter(key => !enKeys.includes(key)); + + // Assert: + expect(extraKeys).toEqual([]); + }); + + it('keys are in the same order as in en.json', () => { + // Arrange: + const expectedSharedKeys = enKeys.filter(key => translationKeys.includes(key)); + + // Act: + const sharedKeys = translationKeys.filter(key => enKeys.includes(key)); + + // Assert: + expect(sharedKeys).toEqual(expectedSharedKeys); + }); + }); + }; + + TRANSLATED_LOCALE_FILES.forEach(runTranslationFileTests); +}); diff --git a/wallet/symbol/mobile/__tests__/screens/account/AccountDetails.test.js b/wallet/symbol/mobile/__tests__/screens/account/AccountDetails.test.js index 562d01c833..3c676a7455 100644 --- a/wallet/symbol/mobile/__tests__/screens/account/AccountDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/account/AccountDetails.test.js @@ -59,7 +59,7 @@ const SCREEN_TEXT = { buttonRevealPrivateKey: 'button_revealPrivateKey', // Dialog - dialogSensitiveTitle: 'dialog_sensitive' + dialogSensitiveTitle: 'dialog_sensitiveInformation_title' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/account/AccountList.test.js b/wallet/symbol/mobile/__tests__/screens/account/AccountList.test.js index b09acfb79e..57466b675b 100644 --- a/wallet/symbol/mobile/__tests__/screens/account/AccountList.test.js +++ b/wallet/symbol/mobile/__tests__/screens/account/AccountList.test.js @@ -36,13 +36,13 @@ const TICKER = 'XYM'; const SCREEN_TEXT = { // Card Titles - textCardTitleAccount: 'c_accountCard_title_account', - textCardTitleBalance: 'c_accountCard_title_balance', - textCardTitleAddress: 'c_accountCard_title_address', + textCardTitleAccount: 'fieldTitle_account', + textCardTitleBalance: 'fieldTitle_balance', + textCardTitleAddress: 'fieldTitle_address', // Dialog - dialogRemoveImportedTitle: 's_accountList_confirm_removeImported_title', - dialogRemoveImportedBody: 's_accountList_confirm_removeImported_body', + dialogRemoveImportedTitle: 'screen_account_dialog_removeImportedAccount_title', + dialogRemoveImportedBody: 'screen_account_dialog_removeImportedAccount_description', // Button TestIDs testIdButtonHide: 'icon-hide', diff --git a/wallet/symbol/mobile/__tests__/screens/account/AddSeedAccount.test.js b/wallet/symbol/mobile/__tests__/screens/account/AddSeedAccount.test.js index 4333953986..53b9af1065 100644 --- a/wallet/symbol/mobile/__tests__/screens/account/AddSeedAccount.test.js +++ b/wallet/symbol/mobile/__tests__/screens/account/AddSeedAccount.test.js @@ -35,29 +35,29 @@ const VALID_PRIVATE_KEY = '40C56A968FB0E551966FD958055EB6634D3AC0372745AFF442460 const SCREEN_TEXT = { // Titles & Labels - textNameTitle: 's_addAccount_name_title', - textSelectTitle: 's_addAccount_select_title', - textDescription: 's_addAccount_seed_description', - inputNameLabel: 'input_name', + textNameTitle: 'screen_account_title_accountName', + textSelectTitle: 'screen_account_title_selectAccount', + textDescription: 'screen_account_description_seedAccount', + inputNameLabel: 'inputLabel_name', // Account Card - textCardTitleAccount: 'c_accountCard_title_account', - textCardTitleBalance: 'c_accountCard_title_balance', - textCardTitleAddress: 'c_accountCard_title_address', + textCardTitleAccount: 'fieldTitle_account', + textCardTitleBalance: 'fieldTitle_balance', + textCardTitleAddress: 'fieldTitle_address', // Buttons buttonImportAccount: 'button_importAccount', buttonConfirm: 'button_confirm', // Default Account Names (with index placeholder) - textDefaultAccountName: 's_addAccount_seed_name_default', + textDefaultAccountName: 'screen_account_title_seedAccount', // Import Account Dialog - textImportAccountDialogTitle: 's_addAccount_privateKey_dialog_title', - inputPrivateKeyLabel: 'input_privateKey', + textImportAccountDialogTitle: 'screen_account_dialog_importPrivateKey_title', + inputPrivateKeyLabel: 'inputLabel_privateKey', // Validation Errors - textValidationNameTooLong: 'validation_error_account_name_long' + textValidationNameTooLong: 'validationError_accountNameLong' }; diff --git a/wallet/symbol/mobile/__tests__/screens/actions/Actions.test.js b/wallet/symbol/mobile/__tests__/screens/actions/Actions.test.js index 444b72da5a..b28e0f44fa 100644 --- a/wallet/symbol/mobile/__tests__/screens/actions/Actions.test.js +++ b/wallet/symbol/mobile/__tests__/screens/actions/Actions.test.js @@ -14,20 +14,20 @@ const NETWORK_IDENTIFIER = 'testnet'; // Screen Text const SCREEN_TEXT = { - addressBookTitle: 's_actions_addressBook_title', - addressBookDescription: 's_actions_addressBook_description', - harvestingTitle: 's_actions_harvesting_title', - harvestingDescription: 's_actions_harvesting_description', - sendTitle: 's_actions_send_title', - sendDescription: 's_actions_send_description', - bridgeTitle: 's_actions_bridge_title', - bridgeDescription: 's_actions_bridge_description', - multisigTitle: 's_actions_multisig_title', - multisigDescription: 's_actions_multisig_description', - bridgeAccountsTitle: 's_actions_bridgeAccounts_title', - bridgeAccountsDescription: 's_actions_bridgeAccounts_description', - createMosaicTitle: 's_actions_createMosaic_title', - createMosaicDescription: 's_actions_createMosaic_description', + addressBookTitle: 'screen_actions_item_addressBook_title', + addressBookDescription: 'screen_actions_item_addressBook_description', + harvestingTitle: 'screen_actions_item_harvesting_title', + harvestingDescription: 'screen_actions_item_harvesting_description', + sendTitle: 'screen_actions_item_send_title', + sendDescription: 'screen_actions_item_send_description', + bridgeTitle: 'screen_actions_item_bridge_title', + bridgeDescription: 'screen_actions_item_bridge_description', + multisigTitle: 'screen_actions_item_multisig_title', + multisigDescription: 'screen_actions_item_multisig_description', + bridgeAccountsTitle: 'screen_actions_item_bridgeAccounts_title', + bridgeAccountsDescription: 'screen_actions_item_bridgeAccounts_description', + createMosaicTitle: 'screen_actions_item_createMosaic_title', + createMosaicDescription: 'screen_actions_item_createMosaic_description', // Icon Labels labelLockIcon: 'lock icon' diff --git a/wallet/symbol/mobile/__tests__/screens/address-book/ContactDetails.test.js b/wallet/symbol/mobile/__tests__/screens/address-book/ContactDetails.test.js index 63299eb536..b881bc3011 100644 --- a/wallet/symbol/mobile/__tests__/screens/address-book/ContactDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/address-book/ContactDetails.test.js @@ -19,7 +19,7 @@ const EXPLORER_BASE_URL = config.chains[CHAIN_NAME].explorerURL[NETWORK_IDENTIFI const SCREEN_TEXT = { textFieldAddress: 'fieldTitle_address', textFieldNotes: 'fieldTitle_notes', - textAlertBlacklist: 's_addressBook_contactDetails_alert_blacklist', + textAlertBlacklist: 'screen_addressBook_contactDetails_alert_blacklist_description', buttonSendTransaction: 'button_sendTransactionToThisAccount', buttonOpenExplorer: 'button_openTransactionInExplorer', buttonEdit: 'button_edit', diff --git a/wallet/symbol/mobile/__tests__/screens/address-book/ContactList.test.js b/wallet/symbol/mobile/__tests__/screens/address-book/ContactList.test.js index 27449327e3..392a821a36 100644 --- a/wallet/symbol/mobile/__tests__/screens/address-book/ContactList.test.js +++ b/wallet/symbol/mobile/__tests__/screens/address-book/ContactList.test.js @@ -19,10 +19,10 @@ const NETWORK_IDENTIFIER = 'testnet'; // Screen Text const SCREEN_TEXT = { - textTitle: 's_addressBook_title', - textDescription: 's_addressBook_description', - textTabWhitelist: 's_addressBook_tab_whitelist', - textTabBlacklist: 's_addressBook_tab_blacklist', + textTitle: 'screen_addressBook_title_intro', + textDescription: 'screen_addressBook_description_intro', + textTabWhitelist: 'screen_addressBook_tab_whitelist', + textTabBlacklist: 'screen_addressBook_tab_blacklist', textEmptyList: 'message_emptyList', buttonAddContact: 'plus' }; diff --git a/wallet/symbol/mobile/__tests__/screens/address-book/CreateContact.test.js b/wallet/symbol/mobile/__tests__/screens/address-book/CreateContact.test.js index b5a7b40029..f5df119bdc 100644 --- a/wallet/symbol/mobile/__tests__/screens/address-book/CreateContact.test.js +++ b/wallet/symbol/mobile/__tests__/screens/address-book/CreateContact.test.js @@ -15,18 +15,18 @@ const NEW_CONTACT_NOTES = 'Test notes for new contact'; // Screen Text const SCREEN_TEXT = { - textScreenTitle: 's_addressBook_create_title', - textScreenDescription: 's_addressBook_create_description', - textTabWhitelist: 's_addressBook_tab_whitelist', - textTabBlacklist: 's_addressBook_tab_blacklist', - textAlertWhitelist: 's_addressBook_manageContact_alert_whitelist', - textAlertBlacklist: 's_addressBook_manageContact_alert_blacklist', - textDefaultBlacklistName: 's_addressBook_account_blacklist_defaultName', - inputNameLabel: 'input_name', - inputAddressLabel: 'input_address', - inputNotesLabel: 'input_notes', + textScreenTitle: 'screen_addressBook_title_createContact', + textScreenDescription: 'screen_addressBook_description_createContact', + textTabWhitelist: 'screen_addressBook_tab_whitelist', + textTabBlacklist: 'screen_addressBook_tab_blacklist', + textAlertWhitelist: 'screen_addressBook_manageContact_alert_whitelist_description', + textAlertBlacklist: 'screen_addressBook_manageContact_alert_blacklist_description', + textDefaultBlacklistName: 'screen_addressBook_title_blockedAccount', + inputNameLabel: 'inputLabel_name', + inputAddressLabel: 'inputLabel_address', + inputNotesLabel: 'inputLabel_notes', buttonSave: 'button_save', - textValidationRequired: 'validation_error_field_required' + textValidationRequired: 'validationError_fieldRequired' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/address-book/EditContact.test.js b/wallet/symbol/mobile/__tests__/screens/address-book/EditContact.test.js index cccc84a456..5795009399 100644 --- a/wallet/symbol/mobile/__tests__/screens/address-book/EditContact.test.js +++ b/wallet/symbol/mobile/__tests__/screens/address-book/EditContact.test.js @@ -15,19 +15,19 @@ const UPDATED_CONTACT_NOTES = 'Updated notes for contact'; // Screen Text const SCREEN_TEXT = { - textScreenTitle: 's_addressBook_edit_title', - textScreenDescription: 's_addressBook_edit_description', - textTabWhitelist: 's_addressBook_tab_whitelist', - textTabBlacklist: 's_addressBook_tab_blacklist', - textAlertWhitelist: 's_addressBook_manageContact_alert_whitelist', - textAlertBlacklist: 's_addressBook_manageContact_alert_blacklist', - textDefaultBlacklistName: 's_addressBook_account_blacklist_defaultName', - inputNameLabel: 'input_name', - inputAddressLabel: 'input_address', - inputNotesLabel: 'input_notes', + textScreenTitle: 'screen_addressBook_title_editContact', + textScreenDescription: 'screen_addressBook_description_editContact', + textTabWhitelist: 'screen_addressBook_tab_whitelist', + textTabBlacklist: 'screen_addressBook_tab_blacklist', + textAlertWhitelist: 'screen_addressBook_manageContact_alert_whitelist_description', + textAlertBlacklist: 'screen_addressBook_manageContact_alert_blacklist_description', + textDefaultBlacklistName: 'screen_addressBook_title_blockedAccount', + inputNameLabel: 'inputLabel_name', + inputAddressLabel: 'inputLabel_address', + inputNotesLabel: 'inputLabel_notes', buttonSave: 'button_save', - textValidationRequired: 'validation_error_field_required', - textValidationAlreadyExists: 'validation_error_already_exists' + textValidationRequired: 'validationError_fieldRequired', + textValidationAlreadyExists: 'validationError_alreadyExists' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/assets/Assets.test.js b/wallet/symbol/mobile/__tests__/screens/assets/Assets.test.js index e6bf26afa3..d230514c29 100644 --- a/wallet/symbol/mobile/__tests__/screens/assets/Assets.test.js +++ b/wallet/symbol/mobile/__tests__/screens/assets/Assets.test.js @@ -39,13 +39,13 @@ const CHAIN_HEIGHT = 150_000; // Screen Text const SCREEN_TEXT = { - textFilterExpired: 's_assets_filter_expired', - textFilterCreated: 's_assets_filter_created', + textFilterExpired: 'screen_assets_chip_expired', + textFilterCreated: 'screen_assets_chip_created', buttonClear: 'button_clear', textEmptyList: 'message_emptyList', - textSectionCurrentAccount: 's_assets_section_currentAccount', - textSectionBridgeAccounts: 's_assets_section_bridgeAccounts', - textSectionMultisigAccounts: 's_assets_section_multisigAccounts' + textSectionCurrentAccount: 'screen_assets_title_currentAccount', + textSectionBridgeAccounts: 'screen_assets_title_bridgeAccounts', + textSectionMultisigAccounts: 'screen_assets_title_multisigAccounts' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/assets/TokenDetails.test.js b/wallet/symbol/mobile/__tests__/screens/assets/TokenDetails.test.js index 5b8a47f038..1958e4e9ec 100644 --- a/wallet/symbol/mobile/__tests__/screens/assets/TokenDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/assets/TokenDetails.test.js @@ -50,12 +50,12 @@ const SCREEN_TEXT = { textFieldTitleExpirationHeight: 'fieldTitle_expirationHeight', // Alert texts - textAlertExpired: 's_assetDetails_alert_expired_description', - textAlertExpirable: 's_assetDetails_alert_expirable_description', + textAlertExpired: 'screen_assets_alert_expired_description', + textAlertExpirable: 'screen_assets_alert_expirable_description', // Expiration progress texts - textExpired: 's_assets_item_expired', - textExpireIn: 's_assets_item_expireIn', + textExpired: 'component_expirationProgress_label_expired', + textExpireIn: 'component_expirationProgress_label_expireIn', // Buttons buttonSend: 'button_send', diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountDetails.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountDetails.test.js index 190b763463..d9488bc681 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountDetails.test.js @@ -28,7 +28,7 @@ const SCREEN_TEXT = { textFieldAddress: 'fieldTitle_address', // Section titles - textTokensTitle: 's_bridge_tokens_title', + textTokensTitle: 'screen_bridge_title_tokens', // Token display names displayNameTokenBxym: 'Bridged XYM • bXYM', @@ -42,9 +42,9 @@ const SCREEN_TEXT = { buttonConfirm: 'button_confirm', // Dialogs - dialogSensitiveTitle: 'dialog_sensitive', + dialogSensitiveTitle: 'dialog_sensitiveInformation_title', dialogRemoveAccountTitle: 'dialog_removeAccount_title', - dialogRemoveAccountBody: 'dialog_removeAccount_body' + dialogRemoveAccountBody: 'dialog_removeAccount_description' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountList.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountList.test.js index f888987386..e6866282e7 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountList.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeAccountList.test.js @@ -40,9 +40,9 @@ const BALANCE_ZERO = '0'; const SCREEN_TEXT = { // Card titles - textFieldAccount: 'c_accountCard_title_account', - textFieldBalance: 'c_accountCard_title_balance', - textFieldAddress: 'c_accountCard_title_address', + textFieldAccount: 'fieldTitle_account', + textFieldBalance: 'fieldTitle_balance', + textFieldAddress: 'fieldTitle_address', // Buttons buttonActivate: 'button_activateAccount' diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwap.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwap.test.js index 96a4c63528..f9bc4f8510 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwap.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwap.test.js @@ -44,25 +44,25 @@ const TRANSACTION_FEE_TIER_LEVEL = 'medium'; const SCREEN_TEXT = { // Titles - textScreenTitle: 's_bridge_title', - textScreenDescription: 's_bridge_description', - textHistoryTitle: 's_bridge_history_title', - textHistoryDescription: 's_bridge_history_description', - textSummaryTitle: 's_bridge_summary_title', + textScreenTitle: 'screen_bridge_title_intro', + textScreenDescription: 'screen_bridge_description_intro', + textHistoryTitle: 'screen_bridge_title_history', + textHistoryDescription: 'screen_bridge_description_history', + textSummaryTitle: 'screen_bridge_title_summary', // Summary - textSummaryAmountSend: 's_bridge_summary_amountSend', - textSummaryBridgeFee: 's_bridge_summary_bridgeFee', - textSummaryTransactionFee: 's_bridge_summary_transactionFee', - textSummaryAmountReceive: 's_bridge_summary_amountReceive', + textSummaryAmountSend: 'screen_bridge_summary_label_amountSend', + textSummaryBridgeFee: 'screen_bridge_summary_label_bridgeFee', + textSummaryTransactionFee: 'screen_bridge_summary_label_transactionFee', + textSummaryAmountReceive: 'screen_bridge_summary_label_amountReceive', // Dialog - textDialogNoPairsTitle: 's_bridge_swap_dialog_noPairs_title', - textDialogNoPairsText: 's_bridge_swap_dialog_noPairs_text', - textDialogDisabledTitle: 's_bridge_swap_dialog_disabled_title', - textDialogDisabledText: 's_bridge_swap_dialog_disabled_text', - textDialogConfirmTitle: 's_bridge_swap_dialog_confirm_title', - textDialogConfirmText: 's_bridge_swap_dialog_confirm_text', + textDialogNoPairsTitle: 'screen_bridge_swap_dialog_noPairs_title', + textDialogNoPairsText: 'screen_bridge_swap_dialog_noPairs_description', + textDialogDisabledTitle: 'screen_bridge_swap_dialog_disabled_title', + textDialogDisabledText: 'screen_bridge_swap_dialog_disabled_description', + textDialogConfirmTitle: 'screen_bridge_swap_dialog_confirm_title', + textDialogConfirmText: 'screen_bridge_swap_dialog_confirm_description', // Buttons buttonSend: 'button_send', @@ -74,20 +74,20 @@ const SCREEN_TEXT = { labelSelectSourceToken: 'Select source token', labelSelectTargetToken: 'Select target token', labelReverse: 'Reverse swap direction', - inputAmountLabel: 'form_transfer_input_amount', + inputAmountLabel: 'inputLabel_amount', // History item - textSwapAction: 'transactionDescriptor_swap', + textSwapAction: 'transactionType_swap', // Validation - textEstimationUnavailable: 'validation_error_estimation_unavailable', - textInsufficientLiquidity: 'validation_error_insufficientLiquidity 0.235399 ETH', + textEstimationUnavailable: 'validationError_estimationUnavailable', + textInsufficientLiquidity: 'validationError_insufficientLiquidity 0.235399 ETH', // Price impact - textSummaryPriceImpact: 's_bridge_summary_priceImpact', - textSummaryPriceImpactWarningValue: '6.00% · s_bridge_summary_priceImpact_high', - textSummaryPriceImpactUnknown: 's_bridge_summary_priceImpact_unknown', - textDialogPriceImpactTitle: 's_bridge_swap_dialog_priceImpact_title', + textSummaryPriceImpact: 'screen_bridge_summary_label_priceImpact', + textSummaryPriceImpactWarningValue: '6.00% · screen_bridge_summary_label_priceImpactHigh', + textSummaryPriceImpactUnknown: 'screen_bridge_summary_label_priceImpactUnknown', + textDialogPriceImpactTitle: 'screen_bridge_swap_dialog_priceImpact_title', // Placeholder shown by a summary row without a value textValueMissing: '-', diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwapDetails.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwapDetails.test.js index 5d3be143a0..a43f3322a8 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwapDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/BridgeSwapDetails.test.js @@ -48,14 +48,14 @@ const PAYOUT_TIMESTAMP_TEXT = formatDate(PAYOUT_TIMESTAMP, key => key, true); const SCREEN_TEXT = { // Status - textStatusCompleted: 's_bridge_history_status_completed', - textStatusProcessing: 's_bridge_history_status_processing', - textStatusFailed: 's_bridge_history_status_failed', + textStatusCompleted: 'screen_bridge_history_status_completed', + textStatusProcessing: 'screen_bridge_history_status_processing', + textStatusFailed: 'screen_bridge_history_status_failed', // Titles - textTokenSendTitle: 's_bridge_swapDetails_tokenSend_title', - textTokenReceiveTitle: 's_bridge_swapDetails_tokenReceive_title', - textStatusTrackingTitle: 's_bridge_swapDetails_statusTracking_title', + textTokenSendTitle: 'screen_bridge_swapDetails_title_tokenSend', + textTokenReceiveTitle: 'screen_bridge_swapDetails_title_tokenReceive', + textStatusTrackingTitle: 'screen_bridge_swapDetails_title_statusTracking', // Field titles textFieldChainName: 'fieldTitle_chainName', @@ -63,14 +63,11 @@ const SCREEN_TEXT = { textFieldRecipientAddress: 'fieldTitle_recipientAddress', textFieldTransactionHash: 'fieldTitle_transactionHash', - // N/A placeholder - textNotAvailable: 'data_v_na', - // Activity log steps - textStepRequestSend: 's_bridge_swapStatus_step_requestSend', - textStepAwaitingBridge: 's_bridge_swapStatus_step_awaitingBridge', - textStepPayoutSend: 's_bridge_swapStatus_step_payoutSend', - textStepPayoutConfirmation: 's_bridge_swapStatus_step_payoutConfirmation', + textStepRequestSend: 'screen_bridge_swapStatus_step_requestSend', + textStepAwaitingBridge: 'screen_bridge_swapStatus_step_awaitingBridge', + textStepPayoutSend: 'screen_bridge_swapStatus_step_payoutSend', + textStepPayoutConfirmation: 'screen_bridge_swapStatus_step_payoutConfirmation', // Buttons buttonOpenExplorer: 'button_openTransactionInExplorer' diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/estimation-summary.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/estimation-summary.test.js index 64bfdb2318..5c7392fbc4 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/estimation-summary.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/estimation-summary.test.js @@ -21,14 +21,14 @@ const TICKER_BXYM = 'bXYM'; // Screen Text const SCREEN_TEXT = { - textAmountSend: 's_bridge_summary_amountSend', - textTransactionFee: 's_bridge_summary_transactionFee', - textOperationFee: 's_bridge_summary_bridgeFee', - textPriceImpact: 's_bridge_summary_priceImpact', - textPriceImpactUnknown: 's_bridge_summary_priceImpact_unknown', - textPriceImpactHigh: 's_bridge_summary_priceImpact_high', - textPriceImpactVeryHigh: 's_bridge_summary_priceImpact_veryHigh', - textAmountReceive: 's_bridge_summary_amountReceive', + textAmountSend: 'screen_bridge_summary_label_amountSend', + textTransactionFee: 'screen_bridge_summary_label_transactionFee', + textOperationFee: 'screen_bridge_summary_label_bridgeFee', + textPriceImpact: 'screen_bridge_summary_label_priceImpact', + textPriceImpactUnknown: 'screen_bridge_summary_label_priceImpactUnknown', + textPriceImpactHigh: 'screen_bridge_summary_label_priceImpactHigh', + textPriceImpactVeryHigh: 'screen_bridge_summary_label_priceImpactVeryHigh', + textAmountReceive: 'screen_bridge_summary_label_amountReceive', textValueMissing: '-' }; diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-confirmation.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-confirmation.test.js index 28c5786f80..163f27bcdc 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-confirmation.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-confirmation.test.js @@ -8,7 +8,7 @@ const CHAIN_NAME_SYMBOL = 'symbol'; const CHAIN_NAME_ETHEREUM = 'ethereum'; const NETWORK_IDENTIFIER = 'testnet'; const AMOUNT = '1'; -const TEXT_KEY = 's_bridge_swap_dialog_confirm_text'; +const TEXT_KEY = 'screen_bridge_swap_dialog_confirm_description'; // Token Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-details.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-details.test.js index 9a83f946d0..49279ade45 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-details.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-details.test.js @@ -20,15 +20,15 @@ const ERROR_MESSAGE = 'Bridge processing error'; // Screen Text const SCREEN_TEXT = { - textStepRequestSend: 's_bridge_swapStatus_step_requestSend', - textStepAwaitingBridge: 's_bridge_swapStatus_step_awaitingBridge', - textStepPayoutSend: 's_bridge_swapStatus_step_payoutSend', - textStepPayoutConfirmation: 's_bridge_swapStatus_step_payoutConfirmation', + textStepRequestSend: 'screen_bridge_swapStatus_step_requestSend', + textStepAwaitingBridge: 'screen_bridge_swapStatus_step_awaitingBridge', + textStepPayoutSend: 'screen_bridge_swapStatus_step_payoutSend', + textStepPayoutConfirmation: 'screen_bridge_swapStatus_step_payoutConfirmation', textRequestDateValue: formatDate(REQUEST_TIMESTAMP, key => key, true), textPayoutDateValue: formatDate(PAYOUT_TIMESTAMP, key => key, true), - textStatusCompleted: 's_bridge_history_status_completed', - textStatusProcessing: 's_bridge_history_status_processing', - textStatusFailed: 's_bridge_history_status_failed' + textStatusCompleted: 'screen_bridge_history_status_completed', + textStatusProcessing: 'screen_bridge_history_status_processing', + textStatusFailed: 'screen_bridge_history_status_failed' }; // Icon Names diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-history.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-history.test.js index 2d718ec45b..b2767b18ed 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-history.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-history.test.js @@ -18,11 +18,11 @@ const ERROR_MESSAGE = 'Bridge processing error'; // Screen Text const SCREEN_TEXT = { - textSwapAction: 'transactionDescriptor_swap', + textSwapAction: 'transactionType_swap', textRequestDate: formatDate(REQUEST_TIMESTAMP, key => key), - textStatusCompleted: 's_bridge_history_status_completed', - textRequestConfirmed: 's_bridge_history_requestTransactionConfirmed', - textPageSizeMessage: 's_bridge_history_page_size_message' + textStatusCompleted: 'screen_bridge_history_status_completed', + textRequestConfirmed: 'screen_bridge_history_message_requestConfirmed', + textPageSizeMessage: 'screen_bridge_message_historyPageSize' }; // Token Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-status.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-status.test.js index 85b121fb6a..66ff3e9ddc 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-status.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/swap-status.test.js @@ -5,11 +5,11 @@ import { mockLocalization } from '__tests__/mock-helpers'; // Screen Text const SCREEN_TEXT = { - textStatusUnprocessed: 's_bridge_history_status_unprocessed', - textStatusProcessing: 's_bridge_history_status_processing', - textStatusSent: 's_bridge_history_status_sent', - textStatusCompleted: 's_bridge_history_status_completed', - textStatusFailed: 's_bridge_history_status_failed' + textStatusUnprocessed: 'screen_bridge_history_status_unprocessed', + textStatusProcessing: 'screen_bridge_history_status_processing', + textStatusSent: 'screen_bridge_history_status_sent', + textStatusCompleted: 'screen_bridge_history_status_completed', + textStatusFailed: 'screen_bridge_history_status_failed' }; // Icon Names diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/transaction-progress.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/transaction-progress.test.js index 11ef3b7245..d7bdc91f09 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/transaction-progress.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/transaction-progress.test.js @@ -37,27 +37,27 @@ const LOG_ICONS_STEP_1_FAILED = ['plus', 'sign', 'send-plane', 'cross', 'sign', // Text Keys const TEXT_KEY = { - statusUnknownTitle: 'c_bridgeTransactionStatus_status_unknown_title', - statusUnknownDescription: 'c_bridgeTransactionStatus_status_unknown_description', - statusSendingTitle: 'c_bridgeTransactionStatus_status_sending_title', - statusSendingDescription: 'c_bridgeTransactionStatus_status_sending_description', - statusStepSendingDescription: 'c_bridgeTransactionStatus_status_step_sending_description', - statusCreateErrorTitle: 'c_bridgeTransactionStatus_status_createError_title', - statusCreateErrorDescription: 'c_bridgeTransactionStatus_status_createError_description', - statusSignErrorTitle: 'c_bridgeTransactionStatus_status_signError_title', - statusSignErrorDescription: 'c_bridgeTransactionStatus_status_signError_description', - statusAnnounceErrorTitle: 'c_bridgeTransactionStatus_status_announceError_title', - statusAnnounceErrorDescription: 'c_bridgeTransactionStatus_status_announceError_description', - statusFailedTransactionTitle: 'c_bridgeTransactionStatus_status_failedTransaction_title', - statusFailedTransactionDescription: 'c_bridgeTransactionStatus_status_failedTransaction_description', - statusConfirmingTitle: 'c_bridgeTransactionStatus_status_confirming_title', - statusConfirmingDescription: 'c_bridgeTransactionStatus_status_confirming_description', - statusConfirmedTitle: 'c_bridgeTransactionStatus_status_confirmed_title', - statusConfirmedDescription: 'c_bridgeTransactionStatus_status_confirmed_description', - stepCreate: 'c_bridgeTransactionStatus_step_create', - stepSign: 'c_bridgeTransactionStatus_step_sign', - stepAnnounce: 'c_bridgeTransactionStatus_step_announce', - stepConfirm: 'c_bridgeTransactionStatus_step_confirm' + statusUnknownTitle: 'screen_bridge_status_unknown_title', + statusUnknownDescription: 'screen_bridge_status_unknown_description', + statusSendingTitle: 'screen_bridge_status_sending_title', + statusSendingDescription: 'screen_bridge_status_sending_description', + statusStepSendingDescription: 'screen_bridge_status_sendingStep_description', + statusCreateErrorTitle: 'screen_bridge_status_createError_title', + statusCreateErrorDescription: 'screen_bridge_status_createError_description', + statusSignErrorTitle: 'screen_bridge_status_signError_title', + statusSignErrorDescription: 'screen_bridge_status_signError_description', + statusAnnounceErrorTitle: 'screen_bridge_status_announceError_title', + statusAnnounceErrorDescription: 'screen_bridge_status_announceError_description', + statusFailedTransactionTitle: 'screen_bridge_status_failedTransaction_title', + statusFailedTransactionDescription: 'screen_bridge_status_failedTransaction_description', + statusConfirmingTitle: 'screen_bridge_status_confirming_title', + statusConfirmingDescription: 'screen_bridge_status_confirming_description', + statusConfirmedTitle: 'screen_bridge_status_confirmed_title', + statusConfirmedDescription: 'screen_bridge_status_confirmed_description', + stepCreate: 'screen_bridge_step_create', + stepSign: 'screen_bridge_step_sign', + stepAnnounce: 'screen_bridge_step_announce', + stepConfirm: 'screen_bridge_step_confirm' }; // The localization mock echoes the key and, when given, its params diff --git a/wallet/symbol/mobile/__tests__/screens/bridge/utils/validators.test.js b/wallet/symbol/mobile/__tests__/screens/bridge/utils/validators.test.js index d605b69120..396dc503b3 100644 --- a/wallet/symbol/mobile/__tests__/screens/bridge/utils/validators.test.js +++ b/wallet/symbol/mobile/__tests__/screens/bridge/utils/validators.test.js @@ -6,12 +6,12 @@ const { BridgeEstimationErrorCode } = constants; // Screen Text const SCREEN_TEXT = { - textAmountLow: 'validation_error_amount_low', - textTransferLimit: 'validation_error_amount_transferLimit', - textDailyLimit: 'validation_error_amount_dailyLimit', - textEstimationUnavailable: 'validation_error_estimation_unavailable', - textInsufficientLiquidity: 'validation_error_insufficientLiquidity', - textInsufficientLiquidityGeneric: 'validation_error_insufficientLiquidity_generic' + textAmountLow: 'validationError_amountLow', + textTransferLimit: 'validationError_amountTransferLimit', + textDailyLimit: 'validationError_amountDailyLimit', + textEstimationUnavailable: 'validationError_estimationUnavailable', + textInsufficientLiquidity: 'validationError_insufficientLiquidity', + textInsufficientLiquidityGeneric: 'validationError_insufficientLiquidityGeneric' }; // Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/harvesting/Harvesting.test.js b/wallet/symbol/mobile/__tests__/screens/harvesting/Harvesting.test.js index 96493a76e1..ab6c754e22 100644 --- a/wallet/symbol/mobile/__tests__/screens/harvesting/Harvesting.test.js +++ b/wallet/symbol/mobile/__tests__/screens/harvesting/Harvesting.test.js @@ -40,36 +40,36 @@ const { ControllerEventName } = coreConstants; const SCREEN_TEXT = { // Screen titles - textScreenTitle: 's_harvesting_title', - textScreenDescription: 's_harvesting_description', + textScreenTitle: 'screen_harvesting_title_intro', + textScreenDescription: 'screen_harvesting_description_intro', // Status section - textStatusTitle: 's_harvesting_status_title', - textStatusActive: 's_harvesting_status_active', - textStatusPending: 's_harvesting_status_pending', - textStatusInactive: 's_harvesting_status_inactive', - textStatusOperator: 's_harvesting_status_operator', - textStatusUnknown: 's_harvesting_status_unknown', + textStatusTitle: 'screen_harvesting_title_status', + textStatusActive: 'screen_harvesting_status_active', + textStatusPending: 'screen_harvesting_status_pending', + textStatusInactive: 'screen_harvesting_status_inactive', + textStatusOperator: 'screen_harvesting_status_operator', + textStatusUnknown: 'screen_harvesting_status_unknown', // Status warnings - textWarningBalance: 's_harvesting_warning_balance', - textWarningImportance: 's_harvesting_warning_importance', - textWarningNodeDown: 's_harvesting_warning_node_down', + textWarningBalance: 'screen_harvesting_status_balanceWarning_description', + textWarningImportance: 'screen_harvesting_status_importanceWarning_description', + textWarningNodeDown: 'screen_harvesting_status_nodeDownWarning_description', // Summary section - textSummaryTitle: 's_harvesting_harvested_title', - textSummaryBlockLabel: 's_harvesting_harvested_block_label', - textSummary30DaysLabel: 's_harvesting_harvested_30days_label', - textSummaryBlocksCount: 's_harvesting_harvested_blocks', + textSummaryTitle: 'screen_harvesting_title_harvested', + textSummaryBlockLabel: 'screen_harvesting_label_harvestedBlock', + textSummary30DaysLabel: 'screen_harvesting_label_harvested30days', + textSummaryBlocksCount: 'screen_harvesting_label_harvestedBlocks', // Manage section - textManageTitle: 's_harvesting_manage_title', + textManageTitle: 'screen_harvesting_title_manage', textNodeUrlField: 'fieldTitle_nodeUrl', // Sender selector - textSenderTitle: 's_harvesting_account_title', - senderTabCurrentAccount: 'c_selectTransactionSender_currentAccount', - senderTabMultisigAccount: 'c_selectTransactionSender_multisigAccount', + textSenderTitle: 'screen_harvesting_title_account', + senderTabCurrentAccount: 'component_selectTransactionSender_tab_currentAccount', + senderTabMultisigAccount: 'component_selectTransactionSender_tab_multisigAccount', // Buttons buttonStart: 'button_start', diff --git a/wallet/symbol/mobile/__tests__/screens/harvesting/utils/harvesting-status.test.js b/wallet/symbol/mobile/__tests__/screens/harvesting/utils/harvesting-status.test.js index 9247cb440f..6a6175f70a 100644 --- a/wallet/symbol/mobile/__tests__/screens/harvesting/utils/harvesting-status.test.js +++ b/wallet/symbol/mobile/__tests__/screens/harvesting/utils/harvesting-status.test.js @@ -18,15 +18,15 @@ const ABOVE_MIN_BALANCE = '50000'; // Screen Text const SCREEN_TEXT = { - textStatusActive: 's_harvesting_status_active', - textStatusPending: 's_harvesting_status_pending', - textStatusInactive: 's_harvesting_status_inactive', - textStatusOperator: 's_harvesting_status_operator', - textStatusUnknown: 's_harvesting_status_unknown', + textStatusActive: 'screen_harvesting_status_active', + textStatusPending: 'screen_harvesting_status_pending', + textStatusInactive: 'screen_harvesting_status_inactive', + textStatusOperator: 'screen_harvesting_status_operator', + textStatusUnknown: 'screen_harvesting_status_unknown', - textWarningBalance: 's_harvesting_warning_balance', - textWarningImportance: 's_harvesting_warning_importance', - textWarningNodeDown: 's_harvesting_warning_node_down' + textWarningBalance: 'screen_harvesting_status_balanceWarning_description', + textWarningImportance: 'screen_harvesting_status_importanceWarning_description', + textWarningNodeDown: 'screen_harvesting_status_nodeDownWarning_description' }; // Account Info Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/history/History.test.js b/wallet/symbol/mobile/__tests__/screens/history/History.test.js index cc77ddecf3..5b61a7ab26 100644 --- a/wallet/symbol/mobile/__tests__/screens/history/History.test.js +++ b/wallet/symbol/mobile/__tests__/screens/history/History.test.js @@ -39,27 +39,27 @@ const SCREEN_TEXT = { textEmptyList: 'message_emptyList', // Filter labels - textFilterType: 's_history_filter_type', - textFilterFrom: 's_history_filter_from', - textFilterTo: 's_history_filter_to', - textFilterHarvested: 's_history_filter_harvested', - textFilterBlocked: 's_history_filter_blocked', + textFilterType: 'screen_history_chip_type', + textFilterFrom: 'screen_history_chip_from', + textFilterTo: 'screen_history_chip_to', + textFilterHarvested: 'screen_history_chip_harvested', + textFilterBlocked: 'screen_history_chip_blocked', textFilterClear: 'button_clear', // Filter options - textFilterOptionTransfer: 'transactionDescriptor_symbol_16724', - textFilterOptionAggregateBonded: 'transactionDescriptor_symbol_16961', - textFilterOptionAggregateComplete: 'transactionDescriptor_symbol_16705', + textFilterOptionTransfer: 'transactionType_transfer', + textFilterOptionAggregateBonded: 'transactionType_aggregateBonded', + textFilterOptionAggregateComplete: 'transactionType_aggregateComplete', // Transaction statuses textAwaitingSignature: 'transactionDescriptionShort_awaitingAccountSignature', // Transaction types for item verification - textTransactionOutgoing: 'transactionDescriptor_symbol_16724_outgoing', - textTransactionIncoming: 'transactionDescriptor_symbol_16724_incoming', + textTransactionOutgoing: 'transactionType_transferOutgoing', + textTransactionIncoming: 'transactionType_transferIncoming', // Receipt types - textReceiptHarvestingReward: 'receiptDescriptor_harvestingReward' + textReceiptHarvestingReward: 'receiptType_harvestingReward' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/history/TransactionDetails.test.js b/wallet/symbol/mobile/__tests__/screens/history/TransactionDetails.test.js index 529f0f342f..73fb497233 100644 --- a/wallet/symbol/mobile/__tests__/screens/history/TransactionDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/history/TransactionDetails.test.js @@ -46,12 +46,12 @@ const DECRYPTED_MESSAGE_TEXT = 'Secret decrypted message'; const SCREEN_TEXT = { // Field titles - textFieldAmount: 's_transactionDetails_amount', - textFieldStatus: 's_transactionDetails_status', - textFieldDate: 's_transactionDetails_date', + textFieldAmount: 'fieldTitle_amount', + textFieldStatus: 'fieldTitle_status', + textFieldDate: 'fieldTitle_date', // Transaction breakdown - textAmountBreakdownTitle: 's_transactionDetails_amountBreakdown_title', + textAmountBreakdownTitle: 'screen_history_title_amountBreakdown', // Transaction statuses textStatusConfirmed: 'transactionStatus_confirmed', @@ -59,26 +59,26 @@ const SCREEN_TEXT = { textStatusUnconfirmed: 'transactionStatus_unconfirmed', // Transaction types - textTransactionTransferOutgoing: 'transactionDescriptor_symbol_16724_outgoing', - textTransactionAggregateBonded: 'transactionDescriptor_symbol_16961', - textTransactionMultisigAccountModification: 'transactionDescriptor_symbol_16725', + textTransactionTransferOutgoing: 'transactionType_transferOutgoing', + textTransactionAggregateBonded: 'transactionType_aggregateBonded', + textTransactionMultisigAccountModification: 'transactionType_multisigAccountModification', // Cosign alerts - textAlertSigned: 's_transactionDetails_cosignAlert_signed', - textAlertAwaitingSignature: 's_transactionDetails_cosignAlert_trustedAccount', - textAlertAwaitingOtherSignatures: 's_transactionDetails_cosignAlert_awaitingOtherSignatures', + textAlertSigned: 'screen_history_cosign_alert_signed_description', + textAlertAwaitingSignature: 'screen_history_cosign_alert_trustedAccount_description', + textAlertAwaitingOtherSignatures: 'screen_history_cosign_alert_awaitingOtherSignatures_description', // Safety warning - textSafetyWarning: 's_transactionDetails_safetyWarning_description', + textSafetyWarning: 'screen_history_alert_safetyWarning_description', // Message - textMessageEncryptedLabel: 'c_messageView_label_encrypted', + textMessageEncryptedLabel: 'component_messageView_label_encrypted', // Dialog titles and text - textDialogConfirmTitle: 's_transactionDetails_cosignDialog_confirm_title', - textDialogConfirmText: 's_transactionDetails_cosignDialog_confirm_text', - textDialogSuccessTitle: 's_transactionDetails_cosignDialog_success_title', - textDialogSuccessText: 's_transactionDetails_cosignDialog_success_text', + textDialogConfirmTitle: 'screen_history_cosign_dialog_confirm_title', + textDialogConfirmText: 'screen_history_cosign_dialog_confirm_description', + textDialogSuccessTitle: 'screen_history_cosign_dialog_success_title', + textDialogSuccessText: 'screen_history_cosign_dialog_success_description', // Buttons buttonSignAndApprove: 'button_signAndApprove', @@ -464,16 +464,16 @@ describe('screens/history/TransactionDetails', () => { description: 'renders a decrease as "Decrease by" with a negative delta', config: { transaction: mosaicSupplyDecreaseTransaction }, expected: { - visibleTexts: ['data_delta_decrease', `-${MOSAIC_SUPPLY_DELTA}`], - notVisibleTexts: ['data_delta_increase'] + visibleTexts: ['fieldValue_deltaDecrease', `-${MOSAIC_SUPPLY_DELTA}`], + notVisibleTexts: ['fieldValue_deltaIncrease'] } }, { description: 'renders an increase as "Increase by" with a positive delta', config: { transaction: mosaicSupplyIncreaseTransaction }, expected: { - visibleTexts: ['data_delta_increase', `${MOSAIC_SUPPLY_DELTA}`], - notVisibleTexts: ['data_delta_decrease'] + visibleTexts: ['fieldValue_deltaIncrease', `${MOSAIC_SUPPLY_DELTA}`], + notVisibleTexts: ['fieldValue_deltaDecrease'] } } ]; diff --git a/wallet/symbol/mobile/__tests__/screens/history/hooks/useHistoryData.test.js b/wallet/symbol/mobile/__tests__/screens/history/hooks/useHistoryData.test.js index 8df7d28f30..5377f62bee 100644 --- a/wallet/symbol/mobile/__tests__/screens/history/hooks/useHistoryData.test.js +++ b/wallet/symbol/mobile/__tests__/screens/history/hooks/useHistoryData.test.js @@ -35,11 +35,11 @@ const SCREEN_TEXT = { textSectionUnconfirmed: 'transactionGroup_unconfirmed', textSectionConfirmed: 'transactionGroup_confirmed', textSectionHarvested: 'transactionGroup_harvested', - textFilterType: 's_history_filter_type', - textFilterFrom: 's_history_filter_from', - textFilterTo: 's_history_filter_to', - textFilterHarvested: 's_history_filter_harvested', - textFilterBlocked: 's_history_filter_blocked' + textFilterType: 'screen_history_chip_type', + textFilterFrom: 'screen_history_chip_from', + textFilterTo: 'screen_history_chip_to', + textFilterHarvested: 'screen_history_chip_harvested', + textFilterBlocked: 'screen_history_chip_blocked' }; const FilterName = { diff --git a/wallet/symbol/mobile/__tests__/screens/history/widgets/HistoryWidget.test.js b/wallet/symbol/mobile/__tests__/screens/history/widgets/HistoryWidget.test.js index 837046a50a..a404cda1fe 100644 --- a/wallet/symbol/mobile/__tests__/screens/history/widgets/HistoryWidget.test.js +++ b/wallet/symbol/mobile/__tests__/screens/history/widgets/HistoryWidget.test.js @@ -24,7 +24,7 @@ describe('widgets/HistoryWidget', () => { runRenderTextTest(HistoryWidget, { props: createProps(), textToRender: [ - { type: 'text', value: 's_history_widget_name' } + { type: 'text', value: 'screen_history_widget_title' } ] }); }); diff --git a/wallet/symbol/mobile/__tests__/screens/home/Home.test.js b/wallet/symbol/mobile/__tests__/screens/home/Home.test.js index 8ae5dba681..1dc2913d5c 100644 --- a/wallet/symbol/mobile/__tests__/screens/home/Home.test.js +++ b/wallet/symbol/mobile/__tests__/screens/home/Home.test.js @@ -13,13 +13,13 @@ const NETWORK_IDENTIFIER = 'testnet'; const SCREEN_TEXT = { // Multisig Warning - textMultisigWarningTitle: 'warning_multisig_title', - textMultisigWarningBody: 'warning_multisig_body', + textMultisigWarningTitle: 'alert_multisigWarning_title', + textMultisigWarningBody: 'alert_multisigWarning_description', // Account Card Buttons - buttonAccountDetails: 'c_accountCard_button_accountDetails', - buttonSend: 'c_accountCard_button_send', - buttonSwap: 'c_accountCard_button_swap' + buttonAccountDetails: 'screen_home_button_accountDetails', + buttonSend: 'screen_home_button_send', + buttonSwap: 'screen_home_button_swap' }; // Account Info Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/mosaic/CreateMosaic.test.js b/wallet/symbol/mobile/__tests__/screens/mosaic/CreateMosaic.test.js index 335a32c767..7770ff8c5b 100644 --- a/wallet/symbol/mobile/__tests__/screens/mosaic/CreateMosaic.test.js +++ b/wallet/symbol/mobile/__tests__/screens/mosaic/CreateMosaic.test.js @@ -19,56 +19,56 @@ const VALID_SUPPLY = '100'; const SCREEN_TEXT = { // Section titles and descriptions - textMosaicTitle: 's_mosaicCreation_mosaic_title', - textMosaicDescription: 's_mosaicCreation_mosaic_description', - textCreatorTitle: 's_mosaicCreation_sender_title', - textQuantityTitle: 's_mosaicCreation_quantity_title', - textQuantityDescription: 's_mosaicCreation_quantity_description', - textDurationTitle: 's_mosaicCreation_duration_title', - textDurationDescription: 's_mosaicCreation_duration_description', - textFlagsTitle: 's_mosaicCreation_flags_title', + textMosaicTitle: 'screen_mosaic_title_mosaic', + textMosaicDescription: 'screen_mosaic_description_mosaic', + textCreatorTitle: 'screen_mosaic_title_sender', + textQuantityTitle: 'screen_mosaic_title_quantity', + textQuantityDescription: 'screen_mosaic_description_quantity', + textDurationTitle: 'screen_mosaic_title_duration', + textDurationDescription: 'screen_mosaic_description_duration', + textFlagsTitle: 'screen_mosaic_title_flags', // Flag section titles and descriptions - textSupplyMutableTitle: 's_mosaicCreation_supplyMutable_title', - textSupplyMutableDescription: 's_mosaicCreation_supplyMutable_description', - textTransferableTitle: 's_mosaicCreation_transferable_title', - textTransferableDescription: 's_mosaicCreation_transferable_description', - textRestrictableTitle: 's_mosaicCreation_restrictable_title', - textRestrictableDescription: 's_mosaicCreation_restrictable_description', - textRevokableTitle: 's_mosaicCreation_revokable_title', - textRevokableDescription: 's_mosaicCreation_revokable_description', + textSupplyMutableTitle: 'screen_mosaic_title_supplyMutable', + textSupplyMutableDescription: 'screen_mosaic_description_supplyMutable', + textTransferableTitle: 'screen_mosaic_title_transferable', + textTransferableDescription: 'screen_mosaic_description_transferable', + textRestrictableTitle: 'screen_mosaic_title_restrictable', + textRestrictableDescription: 'screen_mosaic_description_restrictable', + textRevokableTitle: 'screen_mosaic_title_revokable', + textRevokableDescription: 'screen_mosaic_description_revokable', // Duration / expiration summary - textExpirationPermanent: 's_mosaicCreation_expiration_permanent', - textDurationBlocksChip: 's_mosaicCreation_durationUnit_blocksChip', - textSmallestSendWhole: 's_mosaicCreation_smallestSend_whole', + textExpirationPermanent: 'screen_mosaic_description_expirationPermanent', + textDurationBlocksChip: 'screen_mosaic_chip_durationBlocks', + textSmallestSendWhole: 'screen_mosaic_label_wholeMosaicsOnly', // Buttons buttonSend: 'button_send', buttonConfirm: 'button_confirm', // Checkboxes - checkboxExpires: 's_mosaicCreation_duration_expiresCheckbox', - checkboxSupplyMutable: 's_mosaicCreation_supplyMutable_checkbox', - checkboxTransferable: 's_mosaicCreation_transferable_checkbox', - checkboxRestrictable: 's_mosaicCreation_restrictable_checkbox', - checkboxRevokable: 's_mosaicCreation_revokable_checkbox', + checkboxExpires: 'screen_mosaic_checkbox_expires', + checkboxSupplyMutable: 'screen_mosaic_checkbox_supplyMutable', + checkboxTransferable: 'screen_mosaic_checkbox_transferable', + checkboxRestrictable: 'screen_mosaic_checkbox_restrictable', + checkboxRevokable: 'screen_mosaic_checkbox_revokable', // Input labels (accessibility) - inputTotalSupplyLabel: 's_mosaicCreation_totalSupply_label', - inputDurationBlocksLabel: 's_mosaicCreation_duration_blocksInputLabel', + inputTotalSupplyLabel: 'screen_mosaic_label_totalSupply', + inputDurationBlocksLabel: 'screen_mosaic_inputLabel_durationBlocks', // Confirmation dialog - textConfirmDialogTitle: 's_mosaicCreation_confirm_title', + textConfirmDialogTitle: 'screen_mosaic_create_dialog_confirm_title', // Validation errors - errorFieldRequired: 'validation_error_field_required', - errorSupplyLow: 'validation_error_mosaic_supply_low', - errorSupplyHigh: 'validation_error_mosaic_supply_high', - errorSupplyWhole: 'validation_error_mosaic_supply_whole', - errorSupplyDecimals: 'validation_error_mosaic_supply_decimals', - errorDurationLow: 'validation_error_mosaic_duration_low', - errorDurationHigh: 'validation_error_mosaic_duration_high' + errorFieldRequired: 'validationError_fieldRequired', + errorSupplyLow: 'validationError_mosaicSupplyLow', + errorSupplyHigh: 'validationError_mosaicSupplyHigh', + errorSupplyWhole: 'validationError_mosaicSupplyWhole', + errorSupplyDecimals: 'validationError_mosaicSupplyDecimals', + errorDurationLow: 'validationError_mosaicDurationLow', + errorDurationHigh: 'validationError_mosaicDurationHigh' }; // Grouped error texts used to assert the absence of validation errors on valid input diff --git a/wallet/symbol/mobile/__tests__/screens/mosaic/CreatedMosaicList.test.js b/wallet/symbol/mobile/__tests__/screens/mosaic/CreatedMosaicList.test.js index 60e4408459..732d8f685f 100644 --- a/wallet/symbol/mobile/__tests__/screens/mosaic/CreatedMosaicList.test.js +++ b/wallet/symbol/mobile/__tests__/screens/mosaic/CreatedMosaicList.test.js @@ -22,12 +22,12 @@ const PAGE_SIZE = 15; // Screen Text const SCREEN_TEXT = { - textTitle: 's_createdMosaicList_title', - textDescription: 's_createdMosaicList_description', - textFilterRevokable: 's_createdMosaicList_filter_revokable', - textFilterSupplyMutable: 's_createdMosaicList_filter_supplyMutable', - textFilterExpired: 's_createdMosaicList_filter_expired', - textExpired: 's_assets_item_expired', + textTitle: 'screen_mosaic_createdList_title_intro', + textDescription: 'screen_mosaic_createdList_description_intro', + textFilterRevokable: 'screen_mosaic_chip_revokable', + textFilterSupplyMutable: 'screen_mosaic_chip_supplyMutable', + textFilterExpired: 'screen_mosaic_chip_expired', + textExpired: 'component_expirationProgress_label_expired', buttonClear: 'button_clear', textEmptyList: 'message_emptyList', buttonCreateMosaic: 'plus' diff --git a/wallet/symbol/mobile/__tests__/screens/mosaic/ModifyMosaic.test.js b/wallet/symbol/mobile/__tests__/screens/mosaic/ModifyMosaic.test.js index c835141d96..c1d10772fe 100644 --- a/wallet/symbol/mobile/__tests__/screens/mosaic/ModifyMosaic.test.js +++ b/wallet/symbol/mobile/__tests__/screens/mosaic/ModifyMosaic.test.js @@ -34,36 +34,36 @@ const EMPTY_SUPPLY = ''; const SCREEN_TEXT = { // Section titles and descriptions - textScreenTitle: 'screen_ModifyMosaic', - textDescription: 's_modifyMosaic_description', + textScreenTitle: 'screenTitle_ModifyMosaic', + textDescription: 'screen_mosaic_modify_description_intro', // Mosaic info card field titles textMosaicIdTitle: 'fieldTitle_mosaicId', textDivisibilityTitle: 'fieldTitle_divisibility', // Supply delta summary - textCurrentSupplyLabel: 's_modifyMosaic_currentSupply_label', - textDeltaLabel: 's_modifyMosaic_delta_label', + textCurrentSupplyLabel: 'screen_mosaic_label_currentSupply', + textDeltaLabel: 'screen_mosaic_label_delta', // Input labels (accessibility) - inputNewSupplyLabel: 's_modifyMosaic_newSupply_label', + inputNewSupplyLabel: 'screen_mosaic_label_newSupply', // Fee selector - textFeeSpeedTitle: 'input_feeSpeed', + textFeeSpeedTitle: 'inputLabel_feeSpeed', // Buttons buttonSend: 'button_send', buttonConfirm: 'button_confirm', // Confirmation dialog - textConfirmDialogTitle: 's_modifyMosaic_confirm_title', + textConfirmDialogTitle: 'screen_mosaic_modify_dialog_confirm_title', // Validation errors - errorSupplyUnchanged: 'validation_error_mosaic_supply_unchanged', - errorSupplyHigh: 'validation_error_mosaic_supply_high', - errorSupplyWhole: 'validation_error_mosaic_supply_whole', - errorSupplyDecimals: 'validation_error_mosaic_supply_decimals', - errorFieldRequired: 'validation_error_field_required' + errorSupplyUnchanged: 'validationError_mosaicSupplyUnchanged', + errorSupplyHigh: 'validationError_mosaicSupplyHigh', + errorSupplyWhole: 'validationError_mosaicSupplyWhole', + errorSupplyDecimals: 'validationError_mosaicSupplyDecimals', + errorFieldRequired: 'validationError_fieldRequired' }; const validationErrors = [ diff --git a/wallet/symbol/mobile/__tests__/screens/mosaic/RevokeMosaic.test.js b/wallet/symbol/mobile/__tests__/screens/mosaic/RevokeMosaic.test.js index 72c655980d..47622ce383 100644 --- a/wallet/symbol/mobile/__tests__/screens/mosaic/RevokeMosaic.test.js +++ b/wallet/symbol/mobile/__tests__/screens/mosaic/RevokeMosaic.test.js @@ -27,36 +27,36 @@ const EXCESSIVE_AMOUNT = '5000'; const SCREEN_TEXT = { // Section titles and descriptions - textScreenTitle: 'screen_RevokeMosaic', - textDescription: 's_revoke_description', - textFromTitle: 's_send_from_title', + textScreenTitle: 'screenTitle_RevokeMosaic', + textDescription: 'screen_mosaic_revoke_description_intro', + textFromTitle: 'screen_mosaic_revoke_title_from', textMosaicIdTitle: 'fieldTitle_mosaicId', textDivisibilityTitle: 'fieldTitle_divisibility', textSupplyTitle: 'fieldTitle_supply', // Input labels (accessibility) - inputAmountLabel: 'input_amount', + inputAmountLabel: 'inputLabel_amount', inputAccountLabel: 'fieldTitle_account', // Picker icons (accessibility) iconHolderPicker: 'chevron-down', // Fee selector - textFeeSpeedTitle: 'input_feeSpeed', + textFeeSpeedTitle: 'inputLabel_feeSpeed', // Buttons buttonSend: 'button_send', buttonConfirm: 'button_confirm', // Confirmation dialog - textConfirmDialogTitle: 'form_transfer_confirm_title', + textConfirmDialogTitle: 'component_transactionConfirmationDialog_title_confirmTransfer', // Validation errors - errorBalanceNotEnough: 'validation_error_balance_not_enough', - errorRevokeSender: 'validation_error_mosaic_revoke_sender', + errorBalanceNotEnough: 'validationError_balanceNotEnough', + errorRevokeSender: 'validationError_mosaicRevokeSender', // Alerts - textNoHoldersAlert: 's_revoke_alert_noHolders_description' + textNoHoldersAlert: 'screen_mosaic_revoke_alert_noHolders_description' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/mosaic/utils/created-mosaic-list.test.js b/wallet/symbol/mobile/__tests__/screens/mosaic/utils/created-mosaic-list.test.js index c721597451..7770a45654 100644 --- a/wallet/symbol/mobile/__tests__/screens/mosaic/utils/created-mosaic-list.test.js +++ b/wallet/symbol/mobile/__tests__/screens/mosaic/utils/created-mosaic-list.test.js @@ -17,9 +17,9 @@ const CHAIN_HEIGHT = 150_000; // Screen Text const SCREEN_TEXT = { - textFilterRevokable: 's_createdMosaicList_filter_revokable', - textFilterSupplyMutable: 's_createdMosaicList_filter_supplyMutable', - textFilterExpired: 's_createdMosaicList_filter_expired' + textFilterRevokable: 'screen_mosaic_chip_revokable', + textFilterSupplyMutable: 'screen_mosaic_chip_supplyMutable', + textFilterExpired: 'screen_mosaic_chip_expired' }; // Token Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/mosaic/utils/validators.test.js b/wallet/symbol/mobile/__tests__/screens/mosaic/utils/validators.test.js index 9a0e5d0a0a..b740eb42a6 100644 --- a/wallet/symbol/mobile/__tests__/screens/mosaic/utils/validators.test.js +++ b/wallet/symbol/mobile/__tests__/screens/mosaic/utils/validators.test.js @@ -5,7 +5,7 @@ import { AccountFixtureBuilder } from '__fixtures__/local/AccountFixtureBuilder' const CHAIN_NAME = 'symbol'; const NETWORK_IDENTIFIER = 'testnet'; -const ERROR_REVOKE_SENDER = 'validation_error_mosaic_revoke_sender'; +const ERROR_REVOKE_SENDER = 'validationError_mosaicRevokeSender'; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/multisig/CreateMultisigAccount.test.js b/wallet/symbol/mobile/__tests__/screens/multisig/CreateMultisigAccount.test.js index 3af3772ba2..90a0a3dbf9 100644 --- a/wallet/symbol/mobile/__tests__/screens/multisig/CreateMultisigAccount.test.js +++ b/wallet/symbol/mobile/__tests__/screens/multisig/CreateMultisigAccount.test.js @@ -19,17 +19,17 @@ const REGENERATED_ACCOUNT_ADDRESS = 'TREGENERA-TEDA-CCOU-NTAD-DRXX-XXXXX-XXXX'; const SCREEN_TEXT = { // Screen titles - textScreenTitle: 's_multisig_create_title', - textScreenDescription: 's_multisig_create_description', + textScreenTitle: 'screen_multisig_create_title_intro', + textScreenDescription: 'screen_multisig_create_description_intro', // Cosignatory section - textCosignatoryTitle: 's_multisig_cosignatory_title', - textCosignatoryDescription: 's_multisig_cosignatory_description', - textCosignatoryWarning: 's_multisig_cosignatoryAlert_currentAccount_text', + textCosignatoryTitle: 'screen_multisig_title_cosignatory', + textCosignatoryDescription: 'screen_multisig_description_cosignatory', + textCosignatoryWarning: 'screen_multisig_alert_currentAccountWarning_description', // Approvals section - textApprovalsTitle: 's_multisig_approvals_title', - textApprovalsDescription: 's_multisig_approvals_description', + textApprovalsTitle: 'screen_multisig_title_approvals', + textApprovalsDescription: 'screen_multisig_description_approvals', textMinApprovals: 'fieldTitle_minApprovals', textMinRemovals: 'fieldTitle_minRemovals', @@ -45,15 +45,15 @@ const SCREEN_TEXT = { labelButtonMinus: 'minus', // Input labels - labelInputAddress: 'input_address', + labelInputAddress: 'inputLabel_address', // Dialog - textDialogAddCosignatoryTitle: 's_multisig_create_dialog_addCosignatory_title', - textDialogConfirmTitle: 's_multisig_create_dialog_confirm_title', - textDialogConfirmText: 's_multisig_create_dialog_confirm_text', + textDialogAddCosignatoryTitle: 'screen_multisig_dialog_addCosignatory_title', + textDialogConfirmTitle: 'screen_multisig_create_dialog_confirm_title', + textDialogConfirmText: 'screen_multisig_create_dialog_confirm_description', // Default name - textDefaultAccountName: 's_multisig_defaultAccountName' + textDefaultAccountName: 'screen_multisig_title_defaultAccountName' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/multisig/ModifyMultisigAccount.test.js b/wallet/symbol/mobile/__tests__/screens/multisig/ModifyMultisigAccount.test.js index a2bd4c9633..7195b390ff 100644 --- a/wallet/symbol/mobile/__tests__/screens/multisig/ModifyMultisigAccount.test.js +++ b/wallet/symbol/mobile/__tests__/screens/multisig/ModifyMultisigAccount.test.js @@ -24,17 +24,17 @@ const MULTISIG_ACCOUNT_BALANCE = '1500'; const SCREEN_TEXT = { // Screen titles - textScreenTitle: 's_multisig_modify_title', - textScreenDescription: 's_multisig_modify_description', + textScreenTitle: 'screen_multisig_modify_title_intro', + textScreenDescription: 'screen_multisig_modify_description_intro', // Cosignatory section - textCosignatoryTitle: 's_multisig_cosignatory_title', - textCosignatoryDescription: 's_multisig_cosignatory_description', - textCosignatoryWarning: 's_multisig_cosignatoryAlert_currentAccount_text', + textCosignatoryTitle: 'screen_multisig_title_cosignatory', + textCosignatoryDescription: 'screen_multisig_description_cosignatory', + textCosignatoryWarning: 'screen_multisig_alert_currentAccountWarning_description', // Approvals section - textApprovalsTitle: 's_multisig_approvals_title', - textApprovalsDescription: 's_multisig_approvals_description', + textApprovalsTitle: 'screen_multisig_title_approvals', + textApprovalsDescription: 'screen_multisig_description_approvals', textMinApprovals: 'fieldTitle_minApprovals', textMinRemovals: 'fieldTitle_minRemovals', @@ -49,15 +49,15 @@ const SCREEN_TEXT = { labelButtonMinus: 'minus', // Input labels - labelInputAddress: 'input_address', + labelInputAddress: 'inputLabel_address', // Dialog - textDialogAddCosignatoryTitle: 's_multisig_create_dialog_addCosignatory_title', - textDialogConfirmTitle: 's_multisig_modify_dialog_confirm_title', - textDialogConfirmText: 's_multisig_modify_dialog_confirm_text', + textDialogAddCosignatoryTitle: 'screen_multisig_dialog_addCosignatory_title', + textDialogConfirmTitle: 'screen_multisig_modify_dialog_confirm_title', + textDialogConfirmText: 'screen_multisig_modify_dialog_confirm_description', // Default name - textDefaultAccountName: 's_multisig_defaultAccountName' + textDefaultAccountName: 'screen_multisig_title_defaultAccountName' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountDetails.test.js b/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountDetails.test.js index 7f4167557a..7145a5b30a 100644 --- a/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountDetails.test.js +++ b/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountDetails.test.js @@ -27,8 +27,8 @@ const SCREEN_TEXT = { textFieldMinApprovals: 'fieldTitle_minApprovals', textFieldMinRemovals: 'fieldTitle_minRemovals', textFieldCosignatories: 'fieldTitle_accountCosignatories', - textTokensTitle: 's_multisig_tokens_title', - textDefaultAccountName: 's_multisig_defaultAccountName', + textTokensTitle: 'screen_multisig_title_tokens', + textDefaultAccountName: 'screen_multisig_title_defaultAccountName', textEmptyList: 'message_emptyList', buttonSendTransaction: 'button_send', buttonOpenExplorer: 'button_openTransactionInExplorer', diff --git a/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountList.test.js b/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountList.test.js index 9051185372..0f627b7b26 100644 --- a/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountList.test.js +++ b/wallet/symbol/mobile/__tests__/screens/multisig/MultisigAccountList.test.js @@ -21,9 +21,9 @@ const TICKER = 'XYM'; // Screen Text const SCREEN_TEXT = { - textTitle: 's_multisig_accountList_title', - textDescription: 's_multisig_accountList_description', - textDefaultAccountName: 's_multisig_defaultAccountName', + textTitle: 'screen_multisig_accountList_title_intro', + textDescription: 'screen_multisig_accountList_description_intro', + textDefaultAccountName: 'screen_multisig_title_defaultAccountName', textEmptyList: 'message_emptyList', buttonAddAccount: 'account-add' }; diff --git a/wallet/symbol/mobile/__tests__/screens/onboarding/CreateWallet.test.js b/wallet/symbol/mobile/__tests__/screens/onboarding/CreateWallet.test.js index 59c9ab24b6..d74b670289 100644 --- a/wallet/symbol/mobile/__tests__/screens/onboarding/CreateWallet.test.js +++ b/wallet/symbol/mobile/__tests__/screens/onboarding/CreateWallet.test.js @@ -7,18 +7,18 @@ import { runScreenNavigationTest } from '__tests__/screen-tests'; const TEST_MNEMONIC = mnemonic; const SCREEN_TEXT = { - textAccountNameTitle: 's_createWallet_accountName_title', - textAccountNameDescription: 's_createWallet_accountName_text', - inputAccountNameLabel: 's_createWallet_accountName_input', - textMnemonicTitle: 's_createWallet_mnemonic_title', - textMnemonicDescriptionParagraph1: 's_createWallet_mnemonic_text_p1', - textMnemonicDescriptionParagraph2: 's_createWallet_mnemonic_text_p2', - textMnemonicDescriptionParagraph3: 's_createWallet_mnemonic_text_p3', - textTipsTitle: 's_createWallet_tips_title', - textTipsParagraph1: 's_createWallet_tips_text_p1', - textTipsParagraph2: 's_createWallet_tips_text_p2', - textConfirmTitle: 's_createWallet_confirm_title', - checkboxAcceptRiskText: 's_createWallet_confirm_checkbox', + textAccountNameTitle: 'screen_onboarding_title_accountName', + textAccountNameDescription: 'screen_onboarding_description_accountName', + inputAccountNameLabel: 'screen_onboarding_inputLabel_accountName', + textMnemonicTitle: 'screen_onboarding_title_mnemonic', + textMnemonicDescriptionParagraph1: 'screen_onboarding_mnemonic_description_backupAndRestore', + textMnemonicDescriptionParagraph2: 'screen_onboarding_mnemonic_description_neverDisclose', + textMnemonicDescriptionParagraph3: 'screen_onboarding_mnemonic_description_noRecovery', + textTipsTitle: 'screen_onboarding_title_tips', + textTipsParagraph1: 'screen_onboarding_tips_description_passwordManager', + textTipsParagraph2: 'screen_onboarding_tips_description_paper', + textConfirmTitle: 'screen_onboarding_title_confirm', + checkboxAcceptRiskText: 'screen_onboarding_checkbox_acceptRisk', buttonNext: 'button_next', buttonCancel: 'button_cancel' }; diff --git a/wallet/symbol/mobile/__tests__/screens/onboarding/ImportWallet.test.js b/wallet/symbol/mobile/__tests__/screens/onboarding/ImportWallet.test.js index 0c5956788a..8d3b4d0959 100644 --- a/wallet/symbol/mobile/__tests__/screens/onboarding/ImportWallet.test.js +++ b/wallet/symbol/mobile/__tests__/screens/onboarding/ImportWallet.test.js @@ -6,12 +6,12 @@ import { mockLocalization, mockPasscode, mockWalletController } from '__tests__/ import { runScreenNavigationTest } from '__tests__/screen-tests'; const TEST_MNEMONIC = mnemonic; -const DEFAULT_ACCOUNT_NAME = 's_importWallet_defaultAccountName'; +const DEFAULT_ACCOUNT_NAME = 'screen_onboarding_title_defaultAccountName'; const SCREEN_TEXT = { - textScreenTitle: 's_importWallet_title', - textScreenDescription: 's_importWallet_text', - inputMnemonicLabel: 'input_mnemonic', + textScreenTitle: 'screen_onboarding_importWallet_title_intro', + textScreenDescription: 'screen_onboarding_importWallet_description_intro', + inputMnemonicLabel: 'inputLabel_mnemonic', buttonNext: 'button_next', buttonCancel: 'button_cancel' }; diff --git a/wallet/symbol/mobile/__tests__/screens/onboarding/Welcome.test.js b/wallet/symbol/mobile/__tests__/screens/onboarding/Welcome.test.js index 3029d3b4fc..5e93d589a0 100644 --- a/wallet/symbol/mobile/__tests__/screens/onboarding/Welcome.test.js +++ b/wallet/symbol/mobile/__tests__/screens/onboarding/Welcome.test.js @@ -18,12 +18,12 @@ describe('screens/onboarding/Welcome', () => { runRenderTextTest(Welcome, { textToRender: [ - { type: 'text', value: 's_welcome_wallet_title' }, + { type: 'text', value: 'screen_onboarding_title_welcome' }, { type: 'text', value: 'button_walletCreate' }, { type: 'text', value: 'button_walletImport' }, - { type: 'text', value: 's_welcome_modal_title' }, - { type: 'text', value: 's_welcome_modal_tnc' }, - { type: 'text', value: 's_welcome_modal_privacy' }, + { type: 'text', value: 'screen_onboarding_dialog_termsAndPrivacy_title' }, + { type: 'text', value: 'screen_onboarding_title_termsAndConditions' }, + { type: 'text', value: 'screen_onboarding_title_privacyPolicy' }, { type: 'text', value: 'Terms content' }, { type: 'text', value: 'Privacy content' } ] diff --git a/wallet/symbol/mobile/__tests__/screens/send/Send.test.js b/wallet/symbol/mobile/__tests__/screens/send/Send.test.js index 28036e6c84..48cc5f915d 100644 --- a/wallet/symbol/mobile/__tests__/screens/send/Send.test.js +++ b/wallet/symbol/mobile/__tests__/screens/send/Send.test.js @@ -19,22 +19,21 @@ const PRICE = 0.05; const SCREEN_TEXT = { // Screen content - textTitle: 's_send_title', - textDescription: 's_send_description', + textTitle: 'screen_send_title_intro', + textDescription: 'screen_send_description_intro', // Input labels - inputRecipientLabel: 'input_recipient', - inputMosaicLabel: 'input_mosaic', - inputAmountLabel: 'input_amount', - inputMessageLabel: 'input_message', - inputSenderLabel: 'input_sender', + inputRecipientLabel: 'inputLabel_recipient', + inputMosaicLabel: 'inputLabel_mosaic', + inputAmountLabel: 'inputLabel_amount', + inputMessageLabel: 'inputLabel_message', // Sender selector tabs - senderTabCurrentAccount: 'c_selectTransactionSender_currentAccount', - senderTabMultisigAccount: 'c_selectTransactionSender_multisigAccount', + senderTabCurrentAccount: 'component_selectTransactionSender_tab_currentAccount', + senderTabMultisigAccount: 'component_selectTransactionSender_tab_multisigAccount', // Checkbox - checkboxEncrypted: 'input_encrypted', + checkboxEncrypted: 'inputLabel_encrypted', // Buttons buttonSend: 'button_send' diff --git a/wallet/symbol/mobile/__tests__/screens/settings/Settings.test.js b/wallet/symbol/mobile/__tests__/screens/settings/Settings.test.js index e4e67ed2e9..7fbb2e7fe8 100644 --- a/wallet/symbol/mobile/__tests__/screens/settings/Settings.test.js +++ b/wallet/symbol/mobile/__tests__/screens/settings/Settings.test.js @@ -38,26 +38,26 @@ jest.mock('@/app/lib/controller', () => ({ const SCREEN_TEXT = { // Settings items - Network - textNetworkTitle: 's_settings_item_network_title', - textNetworkDescription: 's_settings_item_network_description', + textNetworkTitle: 'screen_settings_item_network_title', + textNetworkDescription: 'screen_settings_item_network_description', // Settings items - Language - textLanguageTitle: 's_settings_item_language_title', - textLanguageDescription: 's_settings_item_language_description', + textLanguageTitle: 'screen_settings_item_language_title', + textLanguageDescription: 'screen_settings_item_language_description', // Settings items - Security - textSecurityTitle: 's_settings_item_security_title', - textSecurityDescription: 's_settings_item_security_description', + textSecurityTitle: 'screen_settings_item_security_title', + textSecurityDescription: 'screen_settings_item_security_description', // Settings items - Currency - textCurrencyTitle: 's_settings_item_currency_title', - textCurrencyDescription: 's_settings_item_currency_description', + textCurrencyTitle: 'screen_settings_item_currency_title', + textCurrencyDescription: 'screen_settings_item_currency_description', // Settings items - About - textAboutTitle: 's_settings_item_about_title', - textAboutDescription: 's_settings_item_about_description', + textAboutTitle: 'screen_settings_item_about_title', + textAboutDescription: 'screen_settings_item_about_description', // Settings items - Logout - textLogoutTitle: 's_settings_item_logout_title', - textLogoutDescription: 's_settings_item_logout_description', + textLogoutTitle: 'screen_settings_item_logout_title', + textLogoutDescription: 'screen_settings_item_logout_description', // Logout dialog - textLogoutDialogTitle: 'settings_logout_confirm_title', - textLogoutDialogText: 'settings_logout_confirm_text', + textLogoutDialogTitle: 'screen_settings_dialog_logoutConfirm_title', + textLogoutDialogText: 'screen_settings_dialog_logoutConfirm_description', // Buttons buttonCancel: 'button_cancel', buttonConfirm: 'button_confirm' diff --git a/wallet/symbol/mobile/__tests__/screens/settings/SettingsAbout.test.js b/wallet/symbol/mobile/__tests__/screens/settings/SettingsAbout.test.js index bab694a9e5..390f35b45d 100644 --- a/wallet/symbol/mobile/__tests__/screens/settings/SettingsAbout.test.js +++ b/wallet/symbol/mobile/__tests__/screens/settings/SettingsAbout.test.js @@ -18,15 +18,15 @@ describe('screens/settings/SettingsAbout', () => { runRenderTextTest(SettingsAbout, { textToRender: [ - { type: 'text', value: 'settings_about_version_title' }, + { type: 'text', value: 'screen_settings_title_aboutApp' }, { type: 'text', value: 'fieldTitle_appVersion' }, { type: 'text', value: '1.0.0' }, { type: 'text', value: 'fieldTitle_symbolSdkVersion' }, { type: 'text', value: '2.0.0' }, { type: 'text', value: 'fieldTitle_reactNativeVersion' }, { type: 'text', value: '3.0.0' }, - { type: 'text', value: 'settings_about_symbol_title' }, - { type: 'text', value: 'settings_about_symbol_body' } + { type: 'text', value: 'screen_settings_title_aboutSymbol' }, + { type: 'text', value: 'screen_settings_description_aboutSymbol' } ] }); diff --git a/wallet/symbol/mobile/__tests__/screens/settings/SettingsNetwork.test.js b/wallet/symbol/mobile/__tests__/screens/settings/SettingsNetwork.test.js index 82d66b5ec2..c29c4d0884 100644 --- a/wallet/symbol/mobile/__tests__/screens/settings/SettingsNetwork.test.js +++ b/wallet/symbol/mobile/__tests__/screens/settings/SettingsNetwork.test.js @@ -15,17 +15,17 @@ jest.mock('@/app/config', () => { }); const SCREEN_TEXT = { - textNetworkSelectTitle: 's_settings_network_select_title', - textNetworkTypeModalTitle: 's_settings_networkType_modal_title', - textNodeSelectTitle: 's_settings_node_select_title', - textNodeInfoTitle: 's_settings_node_info_title', + textNetworkSelectTitle: 'screen_settings_title_selectNetwork', + textNetworkTypeModalTitle: 'screen_settings_inputLabel_networkType', + textNodeSelectTitle: 'screen_settings_inputLabel_node', + textNodeInfoTitle: 'screen_settings_title_nodeInfo', textFieldNetwork: 'fieldTitle_network', textFieldNodeUrl: 'fieldTitle_nodeUrl', textFieldChainHeight: 'fieldTitle_chainHeight', textFieldMinFeeMultiplier: 'fieldTitle_minFeeMultiplier', - buttonNetworkMainnet: 's_settings_networkType_mainnet', - buttonNetworkTestnet: 's_settings_networkType_testnet', - buttonNodeAutomatically: 's_settings_node_automatically' + buttonNetworkMainnet: 'screen_settings_item_mainnet', + buttonNetworkTestnet: 'screen_settings_item_testnet', + buttonNodeAutomatically: 'screen_settings_item_nodeAutomatic' }; const NETWORK_PROPERTIES_TESTNET_LOADED = NetworkPropertiesFixtureBuilder diff --git a/wallet/symbol/mobile/__tests__/screens/settings/SettingsSecurity.test.js b/wallet/symbol/mobile/__tests__/screens/settings/SettingsSecurity.test.js index 6e5260cef3..29674640c8 100644 --- a/wallet/symbol/mobile/__tests__/screens/settings/SettingsSecurity.test.js +++ b/wallet/symbol/mobile/__tests__/screens/settings/SettingsSecurity.test.js @@ -14,11 +14,11 @@ jest.mock('@/app/lib/passcode', () => ({ const TEST_MNEMONIC = mnemonic; const SCREEN_TEXT = { - pinTitle: 'settings_security_pin_title', - pinBody: 'settings_security_pin_body', - pinToggle: 'settings_security_pin_toggle', - mnemonicTitle: 'settings_security_mnemonic_title', - mnemonicBody: 'settings_security_mnemonic_body', + pinTitle: 'screen_settings_title_securityPin', + pinBody: 'screen_settings_description_securityPin', + pinToggle: 'screen_settings_checkbox_enablePin', + mnemonicTitle: 'screen_settings_title_securityMnemonic', + mnemonicBody: 'screen_settings_description_securityMnemonic', showMnemonicButton: 'button_showMnemonic' }; diff --git a/wallet/symbol/mobile/__tests__/screens/transport/Scan.test.js b/wallet/symbol/mobile/__tests__/screens/transport/Scan.test.js index e190a17cf6..2454fa0fe8 100644 --- a/wallet/symbol/mobile/__tests__/screens/transport/Scan.test.js +++ b/wallet/symbol/mobile/__tests__/screens/transport/Scan.test.js @@ -33,8 +33,8 @@ const QR_URI = 'symbol://transport?data=abc123'; const SCREEN_TEXT = { buttonCancel: 'button_cancel', - alertNoPermission: 's_scan_alert_noPermission_text', - alertNoDevice: 's_scan_alert_noDevice_text' + alertNoPermission: 'screen_transport_alert_noPermission_description', + alertNoDevice: 'screen_transport_alert_noDevice_description' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/transport/TransportRequest.test.js b/wallet/symbol/mobile/__tests__/screens/transport/TransportRequest.test.js index e518f376d3..f1a619a659 100644 --- a/wallet/symbol/mobile/__tests__/screens/transport/TransportRequest.test.js +++ b/wallet/symbol/mobile/__tests__/screens/transport/TransportRequest.test.js @@ -26,26 +26,26 @@ const DIFFERENT_CHAIN_ID = '57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F3 const SCREEN_TEXT = { // Request details section - textShareTitle: 's_transportRequest_details_share_title', - textShareDescription: 's_transportRequest_details_share_description', + textShareTitle: 'screen_transport_title_sharedInformation', + textShareDescription: 'screen_transport_description_sharedInformation', // Actions section - textSuggestedActionsGroup: 's_transportRequest_suggestedActions_group', - textOtherActionsGroup: 's_transportRequest_otherActions_group', + textSuggestedActionsGroup: 'screen_transport_title_suggestedActions', + textOtherActionsGroup: 'screen_transport_title_otherActions', // Action item titles and descriptions - textAddContactTitle: 's_transportRequest_action_addContact_title', - textAddContactDescription: 's_transportRequest_action_addContact_description', - textFillTransferFormTitle: 's_transportRequest_action_fillTransferForm_title', - textFillTransferFormDescription: 's_transportRequest_action_fillTransferForm_description', - textFillTransferFormOnlyAddressDescription: 's_transportRequest_action_fillTransferFormOnlyAddress_description', + textAddContactTitle: 'screen_transport_item_addContact_title', + textAddContactDescription: 'screen_transport_item_addContact_description', + textFillTransferFormTitle: 'screen_transport_item_fillTransferForm_title', + textFillTransferFormDescription: 'screen_transport_item_fillTransferForm_description', + textFillTransferFormOnlyAddressDescription: 'screen_transport_item_fillTransferFormOnlyAddress_description', // Alert messages - alertParseError: 's_transportRequest_alert_parseError_text', - alertUnsupportedChain: 's_transportRequest_alert_chainNameSupport_text', - alertInactiveChain: 's_transportRequest_alert_chainNameActive_text', - alertNetworkMismatch: 's_transportRequest_alert_networkIdentifierMismatch_text', - alertChainIdMismatch: 's_transportRequest_alert_chainIdMismatch_text' + alertParseError: 'screen_transport_alert_parseError_description', + alertUnsupportedChain: 'screen_transport_alert_chainNameSupport_description', + alertInactiveChain: 'screen_transport_alert_chainNameActive_description', + alertNetworkMismatch: 'screen_transport_alert_networkIdentifierMismatch_description', + alertChainIdMismatch: 'screen_transport_alert_chainIdMismatch_description' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/screens/transport/utils/transport-actions.test.js b/wallet/symbol/mobile/__tests__/screens/transport/utils/transport-actions.test.js index 4f90f13290..5dfe104c69 100644 --- a/wallet/symbol/mobile/__tests__/screens/transport/utils/transport-actions.test.js +++ b/wallet/symbol/mobile/__tests__/screens/transport/utils/transport-actions.test.js @@ -14,10 +14,10 @@ const AMOUNT = '1000000'; // Screen Text const SCREEN_TEXT = { - titleAddContact: 's_transportRequest_action_addContact_title', - titleFillTransferForm: 's_transportRequest_action_fillTransferForm_title', - descriptionFillTransferForm: 's_transportRequest_action_fillTransferForm_description', - descriptionFillTransferFormOnlyAddress: 's_transportRequest_action_fillTransferFormOnlyAddress_description' + titleAddContact: 'screen_transport_item_addContact_title', + titleFillTransferForm: 'screen_transport_item_fillTransferForm_title', + descriptionFillTransferForm: 'screen_transport_item_fillTransferForm_description', + descriptionFillTransferFormOnlyAddress: 'screen_transport_item_fillTransferFormOnlyAddress_description' }; // Account Fixtures diff --git a/wallet/symbol/mobile/__tests__/utils/localization.test.js b/wallet/symbol/mobile/__tests__/utils/localization.test.js new file mode 100644 index 0000000000..9bd32592d5 --- /dev/null +++ b/wallet/symbol/mobile/__tests__/utils/localization.test.js @@ -0,0 +1,208 @@ +import { EthereumTransactionType, ReceiptType, SymbolTransactionType, TransactionDirection } from '@/app/constants'; +import en from '@/app/localization/locales/en.json'; +import { getErrorMessageLocaleKey, getReceiptTypeLocaleKey, getTransactionTypeLocaleKey } from '@/app/utils'; +import { constants } from 'wallet-common-core'; + +const { ErrorCode } = constants; + +// Constants + +const CHAIN_NAME_SYMBOL = 'symbol'; +const CHAIN_NAME_ETHEREUM = 'ethereum'; +const UNKNOWN_ERROR_MESSAGE_KEY = 'errorMessage_unknown'; +const UNKNOWN_TRANSACTION_TYPE_KEY = 'transactionType_unknown'; +const UNKNOWN_RECEIPT_TYPE_KEY = 'receiptType_unknown'; + +const enKeys = Object.keys(en); + +// Asserts the mapper returns exactly the expected locale key for every input, +// that every required input has an expected pair, and that every locale key exists in en.json. +const expectMappedLocaleKeys = (expectedLocaleKeys, getLocaleKey, requiredInputs) => { + const inputs = Object.keys(expectedLocaleKeys); + const localeKeys = Object.values(expectedLocaleKeys); + const result = Object.fromEntries(inputs.map(input => [input, getLocaleKey(input)])); + const uncoveredInputs = requiredInputs.filter(input => !(input in expectedLocaleKeys)); + const missingEnKeys = localeKeys.filter(key => !enKeys.includes(key)); + + expect(result).toEqual(expectedLocaleKeys); + expect(uncoveredInputs).toEqual([]); + expect(missingEnKeys).toEqual([]); +}; + +describe('utils/localization', () => { + describe('getErrorMessageLocaleKey()', () => { + const errorCodeLocaleKeys = { + [ErrorCode.FAILED_ACCESS_KEYSTORE]: 'errorMessage_keystoreAccess', + [ErrorCode.WALLET_SELECTED_ACCOUNT_MISSING]: 'errorMessage_selectedAccountMissing', + [ErrorCode.WALLET_ADD_ACCOUNT_ALREADY_EXISTS]: 'errorMessage_accountAlreadyExists', + [ErrorCode.WALLET_REMOVE_CURRENT_ACCOUNT]: 'errorMessage_removeCurrentAccount', + [ErrorCode.WALLET_ACCOUNT_NOT_FOUND]: 'errorMessage_accountNotFound', + [ErrorCode.WALLET_NETWORK_NOT_SUPPORTED]: 'errorMessage_networkNotSupported', + [ErrorCode.FETCH_INVALID_REQUEST]: 'errorMessage_invalidRequest', + [ErrorCode.FETCH_UNAUTHORIZED]: 'errorMessage_unauthorized', + [ErrorCode.FETCH_NOT_FOUND]: 'errorMessage_notFound', + [ErrorCode.FETCH_RATE_LIMIT]: 'errorMessage_rateLimit', + [ErrorCode.FETCH_SERVER_ERROR]: 'errorMessage_serverError', + [ErrorCode.NETWORK_REQUEST_ERROR]: 'errorMessage_networkRequest', + [ErrorCode.NETWORK_LISTENER_START_ERROR]: 'errorMessage_chainListenerStart', + [ErrorCode.NETWORK_PROPERTIES_WRONG_NETWORK]: 'errorMessage_wrongNetwork', + [ErrorCode.ADDRESS_BOOK_ADD_CONTACT_ALREADY_EXISTS]: 'errorMessage_contactAlreadyExists', + [ErrorCode.ADDRESS_BOOK_REMOVE_CONTACT_NOT_FOUND]: 'errorMessage_contactNotFound', + [ErrorCode.ADDRESS_BOOK_UPDATE_CONTACT_NOT_FOUND]: 'errorMessage_contactNotFound', + [ErrorCode.KEYSTORE_ERROR]: 'errorMessage_keystore', + [ErrorCode.API_ERROR]: 'errorMessage_api', + [ErrorCode.SDK_ERROR]: 'errorMessage_sdk', + [ErrorCode.CONTROLLER_ERROR]: 'errorMessage_controller', + + // Codes thrown as string literals in wallet/common, not members of ErrorCode. + error_failed_decrypt_message_invalid_transaction_type: 'errorMessage_decryptMessageInvalidTransactionType', + error_failed_decrypt_message_not_related: 'errorMessage_decryptMessageNotRelated', + error_harvesting_account_no_activity: 'errorMessage_harvestingAccountNoActivity', + error_harvesting_no_keys_to_unlink: 'errorMessage_harvestingNoKeysToUnlink', + error_transfer_encrypted_message_no_recipient_public_key: 'errorMessage_transferNoRecipientPublicKey', + error_transfer_unknown_recipient: 'errorMessage_transferUnknownRecipient', + error_unknown_account_name: 'errorMessage_unknownAccountName' + }; + + it('maps every error code to its dedicated en.json key', () => { + expectMappedLocaleKeys(errorCodeLocaleKeys, getErrorMessageLocaleKey, Object.values(ErrorCode)); + }); + + it('returns the unknown-error key for an unmapped code', () => { + expect(getErrorMessageLocaleKey('error_some_unknown_code')).toBe(UNKNOWN_ERROR_MESSAGE_KEY); + }); + + it('returns the unknown-error key when the code is undefined', () => { + expect(getErrorMessageLocaleKey(undefined)).toBe(UNKNOWN_ERROR_MESSAGE_KEY); + }); + }); + + describe('getTransactionTypeLocaleKey()', () => { + const transactionTypeLocaleKeys = { + symbol: { + [SymbolTransactionType.TRANSFER]: 'transactionType_transfer', + [SymbolTransactionType.NAMESPACE_REGISTRATION]: 'transactionType_namespaceRegistration', + [SymbolTransactionType.ADDRESS_ALIAS]: 'transactionType_addressAlias', + [SymbolTransactionType.MOSAIC_ALIAS]: 'transactionType_mosaicAlias', + [SymbolTransactionType.MOSAIC_DEFINITION]: 'transactionType_mosaicDefinition', + [SymbolTransactionType.MOSAIC_SUPPLY_CHANGE]: 'transactionType_mosaicSupplyChange', + [SymbolTransactionType.MOSAIC_SUPPLY_REVOCATION]: 'transactionType_mosaicSupplyRevocation', + [SymbolTransactionType.MULTISIG_ACCOUNT_MODIFICATION]: 'transactionType_multisigAccountModification', + [SymbolTransactionType.AGGREGATE_COMPLETE]: 'transactionType_aggregateComplete', + [SymbolTransactionType.AGGREGATE_BONDED]: 'transactionType_aggregateBonded', + [SymbolTransactionType.HASH_LOCK]: 'transactionType_hashLock', + [SymbolTransactionType.SECRET_LOCK]: 'transactionType_secretLock', + [SymbolTransactionType.SECRET_PROOF]: 'transactionType_secretProof', + [SymbolTransactionType.ACCOUNT_ADDRESS_RESTRICTION]: 'transactionType_accountAddressRestriction', + [SymbolTransactionType.ACCOUNT_MOSAIC_RESTRICTION]: 'transactionType_accountMosaicRestriction', + [SymbolTransactionType.ACCOUNT_OPERATION_RESTRICTION]: 'transactionType_accountOperationRestriction', + [SymbolTransactionType.ACCOUNT_KEY_LINK]: 'transactionType_accountKeyLink', + [SymbolTransactionType.MOSAIC_ADDRESS_RESTRICTION]: 'transactionType_mosaicAddressRestriction', + [SymbolTransactionType.MOSAIC_GLOBAL_RESTRICTION]: 'transactionType_mosaicGlobalRestriction', + [SymbolTransactionType.ACCOUNT_METADATA]: 'transactionType_accountMetadata', + [SymbolTransactionType.MOSAIC_METADATA]: 'transactionType_mosaicMetadata', + [SymbolTransactionType.NAMESPACE_METADATA]: 'transactionType_namespaceMetadata', + [SymbolTransactionType.VRF_KEY_LINK]: 'transactionType_vrfKeyLink', + [SymbolTransactionType.VOTING_KEY_LINK]: 'transactionType_votingKeyLink', + [SymbolTransactionType.NODE_KEY_LINK]: 'transactionType_nodeKeyLink' + }, + ethereum: { + [EthereumTransactionType.TRANSFER]: 'transactionType_transfer', + [EthereumTransactionType.ERC_20_TRANSFER]: 'transactionType_erc20Transfer', + [EthereumTransactionType.ERC_20_BRIDGE_TRANSFER]: 'transactionType_erc20BridgeTransfer', + [EthereumTransactionType.UNISWAP_SWAP]: 'transactionType_uniswapSwap', + [EthereumTransactionType.ERC_20_APPROVE]: 'transactionType_erc20Approve' + } + }; + const transferDirectionLocaleKeys = { + [TransactionDirection.INCOMING]: 'transactionType_transferIncoming', + [TransactionDirection.OUTGOING]: 'transactionType_transferOutgoing' + }; + + it('maps every transaction type and direction to its dedicated en.json key', () => { + // Arrange: + // RESERVED is not used, so filter it out. + const symbolTypes = Object.values(SymbolTransactionType) + .filter(type => type !== SymbolTransactionType.RESERVED); + const ethereumTypes = Object.values(EthereumTransactionType) + .filter(type => type !== EthereumTransactionType.RESERVED); + + // Act & Assert: + expectMappedLocaleKeys( + transactionTypeLocaleKeys.symbol, + type => getTransactionTypeLocaleKey(type, CHAIN_NAME_SYMBOL), + symbolTypes + ); + expectMappedLocaleKeys( + transactionTypeLocaleKeys.ethereum, + type => getTransactionTypeLocaleKey(type, CHAIN_NAME_ETHEREUM), + ethereumTypes + ); + expectMappedLocaleKeys( + transferDirectionLocaleKeys, + direction => getTransactionTypeLocaleKey(SymbolTransactionType.TRANSFER, CHAIN_NAME_SYMBOL, direction), + Object.values(TransactionDirection) + ); + }); + + const runGetTransactionTypeLocaleKeyTest = (description, config, expected) => { + it(description, () => { + // Act: + const result = getTransactionTypeLocaleKey(config.type, config.chainName, config.direction); + + // Assert: + expect(result).toBe(expected.result); + }); + }; + + const getTransactionTypeLocaleKeyTests = [ + { + description: 'returns the plain transfer key for a transfer without direction', + config: { type: SymbolTransactionType.TRANSFER, chainName: CHAIN_NAME_SYMBOL }, + expected: { result: 'transactionType_transfer' } + }, + { + description: 'returns the plain transfer key when the direction is unknown', + config: { type: SymbolTransactionType.TRANSFER, chainName: CHAIN_NAME_SYMBOL, direction: 'sideways' }, + expected: { result: 'transactionType_transfer' } + }, + { + description: 'ignores the direction for a non-transfer type', + config: { type: SymbolTransactionType.HASH_LOCK, chainName: CHAIN_NAME_SYMBOL, direction: TransactionDirection.INCOMING }, + expected: { result: 'transactionType_hashLock' } + }, + { + description: 'returns the unknown-type key for an unmapped type', + config: { type: 999999, chainName: CHAIN_NAME_SYMBOL }, + expected: { result: UNKNOWN_TRANSACTION_TYPE_KEY } + }, + { + description: 'returns the unknown-type key for an unknown chain', + config: { type: SymbolTransactionType.TRANSFER, chainName: 'unknownChain' }, + expected: { result: UNKNOWN_TRANSACTION_TYPE_KEY } + } + ]; + + getTransactionTypeLocaleKeyTests.forEach(test => { + runGetTransactionTypeLocaleKeyTest(test.description, test.config, test.expected); + }); + }); + + describe('getReceiptTypeLocaleKey()', () => { + const receiptTypeLocaleKeys = { + [ReceiptType.HARVESTING_REWARD]: 'receiptType_harvestingReward' + }; + + it('maps every receipt type to its dedicated en.json key', () => { + expectMappedLocaleKeys(receiptTypeLocaleKeys, getReceiptTypeLocaleKey, Object.values(ReceiptType)); + }); + + it('returns the unknown-receipt key for an unmapped type', () => { + expect(getReceiptTypeLocaleKey('unknownReceiptType')).toBe(UNKNOWN_RECEIPT_TYPE_KEY); + }); + + it('returns the unknown-receipt key when the type is undefined', () => { + expect(getReceiptTypeLocaleKey(undefined)).toBe(UNKNOWN_RECEIPT_TYPE_KEY); + }); + }); +}); diff --git a/wallet/symbol/mobile/docs/localization.md b/wallet/symbol/mobile/docs/localization.md new file mode 100644 index 0000000000..5c0ade754f --- /dev/null +++ b/wallet/symbol/mobile/docs/localization.md @@ -0,0 +1,106 @@ +# Localization + +All UI text lives in `src/localization/locales/en.json` — the source locale, other languages are translated from it. +Keys are flat: segments joined with `_`, camelCase inside a segment. + +``` +screen_[_
]__[_[_]] + +screen_bridge_swap_dialog_confirm_button_cancel +``` + +## Scopes + +Pick the widest scope that fits. Never duplicate a text under a narrower key when a wider one exists. + +| Scope | Pattern | Use for | +|---|---|---| +| Global | `_…` | Texts reusable on any screen: common buttons (`button_ok`), input labels (`inputLabel_address`), dialogs, error and validation messages, data families (`transactionType_*`, `month_*`). | +| Screen | `screen_[_
]__…` | Texts owned by one screen. Components inside a screen folder also use this scope. | +| Component | `component_[_
]__…` | Reusable components under `src/components/` that carry their own text (`component_navigationMenu_tab_home`). Rare — most of reusable components receive text via props. | + +Global keys may be used anywhere. Screen and component keys only inside their owner. + +## Folder and section + +- `folder` — the screen's directory name under `src/screens/`, written in camelCase: `address-book` → `screen_addressBook_…`. +- `section` — optional free word after the folder or component name. It groups the keys of one screen or one logical block: a short screen name (`swap` in `screen_bridge_swap_…`) or a logical group (`mnemonic` in `screen_onboarding_mnemonic_description_safety`). At most one, and never an element word. + +## Elements + +Element words are a fixed vocabulary, in three groups. + +Containers — UI blocks that carry one or more texts: + +`dialog` `alert` `status` `item` `tab` `step` `button` `link` `checkbox` `toggle` `chip` `widget` `inputLabel` `fieldTitle` `fieldValue` `errorMessage` `validationError` `title` `subtitle` `description` `label` `placeholder` `hint` `tooltip` `message` + +Global only: + +`transactionType` `transactionDescriptionShort` `transactionGroup` `transactionStatus` `receiptType` `month` `feeSpeed` `screenTitle` + + +## Names + +A name says which instance of the element the text belongs to. + +- A free camelCase word chosen by meaning: `dialog_confirmSwap_title`, `description_neverDisclose`. +- A container is always followed by a name. +- Because names are free, a name may be the same word as an element where that reads naturally (`fieldTitle_message`, `screen_send_title_message`). + +## Casing and short forms + +- Hand-written segments: camelCase. +- Names copied from code keep the code casing: `screenTitle_CreateWallet`, `fieldValue_AllowMosaics`, `fieldValue_true`. +- Allowed short forms: `qr` `id` `url` `pin` `sdk` `vrf` `nis1` `info` `min` `max`. Everything else is spelled out (`termsAndConditions`). + +## Chaining + +After the prefix (scope, and for screens the folder and optional section — see "Folder and section"), a key is a chain of element–name pairs: + +``` +_[_[_]] +``` + +- One pair is enough when the element holds a single text: `checkbox_acceptRisk`, `title_intro`, `button_ok`. +- A container chains a text kind for its text: `dialog_termsAndPrivacy_title`. +- The chain ends with one more name only when several texts of that kind exist under the same parent: `dialog_termsAndPrivacy_button_accept`. +- Maximum 7 segments in total: `screen__
____`. + +| Case | Example | +|---|---| +| Element + name | `screen_onboarding_title_intro` | +| Container + container name + element | `screen_onboarding_dialog_termsAndPrivacy_title` | +| Container + container name + element + name | `screen_onboarding_dialog_termsAndPrivacy_button_accept` | + +## Common cases + +| Case | Form | +|---|---| +| Dialog texts | `dialog__title`, `_description`, `_button_` | +| Alert, status card, list item | `alert__title`, `status__description`, `item__title` | +| Input label, placeholder, hint | `inputLabel_`, `placeholder_`, `hint_` | +| Step | `
_step_` | +| Field title / value (TableView) | `fieldTitle_`, `fieldValue_` | +| Screen title (route header) | `screenTitle_` | +| Error flash, validation error | `errorMessage_`, `validationError_` | +| Warning | part of the name: `alert_multisigWarning_title` | +| Paragraphs | `
_description_` | +| Screen intro heading and paragraph | `screen__title_intro`, `_description_intro` | + +## Words that are not elements + +| Word | Use instead | +|---|---| +| `warning` | in the name: `nodeDownWarning` | +| `text`, `body` | `description` | +| `name` | `title` | +| `input` | `inputLabel` | +| `p1`, `step1` | a real name: `description_neverDisclose`, `step_saveMnemonic` | + +## Dynamic keys + +Keys are literal strings. The only exceptions are the registered runtime builders (`screenTitle_${route}`, `fieldTitle_${field}`, `fieldValue_${value}`, `month_${month}`, `feeSpeed_${level}`) and the mapper tables that turn error codes, transaction types and receipt types into literal keys. Do not build keys from variables anywhere else. + +## Placeholders + +Use `%{name}` in text values: `"Expire %{inTime}"`. diff --git a/wallet/symbol/mobile/src/app/components/NavigationMenu.jsx b/wallet/symbol/mobile/src/app/components/NavigationMenu.jsx index c67cb2b49d..113d7cc688 100644 --- a/wallet/symbol/mobile/src/app/components/NavigationMenu.jsx +++ b/wallet/symbol/mobile/src/app/components/NavigationMenu.jsx @@ -35,27 +35,27 @@ const ICON_SOURCE_MAP = { const TAB_CONFIG = [ { - titleKey: 'navigation_home', + titleKey: 'component_navigationMenu_tab_home', name: RouteName.Home, navigate: () => Router.goToHome() }, { - titleKey: 'navigation_history', + titleKey: 'component_navigationMenu_tab_history', name: RouteName.History, navigate: () => Router.goToHistory() }, { - titleKey: 'navigation_scan', + titleKey: 'component_navigationMenu_tab_scan', name: RouteName.Scan, navigate: () => Router.goToScan() }, { - titleKey: 'navigation_assets', + titleKey: 'component_navigationMenu_tab_assets', name: RouteName.Assets, navigate: () => Router.goToAssets() }, { - titleKey: 'navigation_actions', + titleKey: 'component_navigationMenu_tab_actions', name: RouteName.Actions, navigate: () => Router.goToActions() } diff --git a/wallet/symbol/mobile/src/app/components/NetworkConnectionStatusBar.jsx b/wallet/symbol/mobile/src/app/components/NetworkConnectionStatusBar.jsx index c43e6ed317..8f67683336 100644 --- a/wallet/symbol/mobile/src/app/components/NetworkConnectionStatusBar.jsx +++ b/wallet/symbol/mobile/src/app/components/NetworkConnectionStatusBar.jsx @@ -20,11 +20,11 @@ const { NetworkConnectionStatus } = constants; */ export const NetworkConnectionStatusBar = ({ networkStatus }) => { const statusTextMap = { - [NetworkConnectionStatus.INITIAL]: $t('c_connectionStatus_connecting'), - [NetworkConnectionStatus.CONNECTING]: $t('c_connectionStatus_connecting'), - [NetworkConnectionStatus.CONNECTED]: $t('c_connectionStatus_connected'), - [NetworkConnectionStatus.NO_INTERNET]: $t('c_connectionStatus_offline'), - [NetworkConnectionStatus.FAILED_CUSTOM_NODE]: $t('c_connectionStatus_nodeDown') + [NetworkConnectionStatus.INITIAL]: $t('component_networkConnectionStatusBar_message_connecting'), + [NetworkConnectionStatus.CONNECTING]: $t('component_networkConnectionStatusBar_message_connecting'), + [NetworkConnectionStatus.CONNECTED]: $t('component_networkConnectionStatusBar_message_connected'), + [NetworkConnectionStatus.NO_INTERNET]: $t('component_networkConnectionStatusBar_message_offline'), + [NetworkConnectionStatus.FAILED_CUSTOM_NODE]: $t('component_networkConnectionStatusBar_message_nodeDown') }; const statusText = statusTextMap[networkStatus]; const statusColors = [ diff --git a/wallet/symbol/mobile/src/components/controls/FeeSelector.jsx b/wallet/symbol/mobile/src/components/controls/FeeSelector.jsx index 83b00ac419..4b9ab60647 100644 --- a/wallet/symbol/mobile/src/components/controls/FeeSelector.jsx +++ b/wallet/symbol/mobile/src/components/controls/FeeSelector.jsx @@ -38,7 +38,7 @@ const FEE_TIER_LEVELS = [FeeTierLevel.SLOW, FeeTierLevel.MEDIUM, FeeTierLevel.FA * @returns {{ label: string, speed: TransactionFeeTierLevel, value: string }} The fee tier option. */ const createFeeTierOption = (level, value) => ({ - label: $t(`selector_fee_${level}`), + label: $t(`feeSpeed_${level}`), speed: level, value }); diff --git a/wallet/symbol/mobile/src/components/controls/InputAmount.jsx b/wallet/symbol/mobile/src/components/controls/InputAmount.jsx index d53b341421..58e67092c6 100644 --- a/wallet/symbol/mobile/src/components/controls/InputAmount.jsx +++ b/wallet/symbol/mobile/src/components/controls/InputAmount.jsx @@ -84,7 +84,7 @@ export const InputAmount = props => { disabled={!availableBalance} > - {$t('c_inputAmount_label_available')}: {availableBalance} + {$t('component_inputAmount_label_available')}: {availableBalance} )} @@ -93,8 +93,8 @@ export const InputAmount = props => { /> { const hasMultisigAccounts = multisigAccounts.length > 0; const isMultisigSelected = hasMultisigAccounts && value !== current.address; const activeTab = isMultisigSelected ? SenderTab.MULTISIG : SenderTab.CURRENT; - const multisigDefaultName = $t('s_multisig_defaultAccountName'); + const multisigDefaultName = $t('component_selectTransactionSender_title_defaultAccountName'); const selectedAccount = isMultisigSelected ? multisigAccounts.find(account => account.address === value) || current : current; @@ -91,8 +91,8 @@ export const SelectTransactionSender = props => { // Tab options const tabList = [ - { value: SenderTab.CURRENT, label: $t('c_selectTransactionSender_currentAccount') }, - { value: SenderTab.MULTISIG, label: $t('c_selectTransactionSender_multisigAccount') } + { value: SenderTab.CURRENT, label: $t('component_selectTransactionSender_tab_currentAccount') }, + { value: SenderTab.MULTISIG, label: $t('component_selectTransactionSender_tab_multisigAccount') } ]; // Dropdown options and renderer @@ -149,7 +149,7 @@ export const SelectTransactionSender = props => { onPress={handleItemPress} /> { if (message.type === MessageType.ENCRYPTED_TEXT) { iconName = iconMap.encrypted; - label = $t('c_messageView_label_encrypted'); + label = $t('component_messageView_label_encrypted'); } else if (message.type !== MessageType.PLAIN_TEXT) { iconName = iconMap.raw; - label = $t('c_messageView_label_rawData'); + label = $t('component_messageView_label_rawData'); } const isTextVisible = Boolean(message.text); diff --git a/wallet/symbol/mobile/src/components/display/Token/ExpirationProgress.jsx b/wallet/symbol/mobile/src/components/display/Token/ExpirationProgress.jsx index 2a35a257f6..fdc3a98c61 100644 --- a/wallet/symbol/mobile/src/components/display/Token/ExpirationProgress.jsx +++ b/wallet/symbol/mobile/src/components/display/Token/ExpirationProgress.jsx @@ -59,8 +59,8 @@ export const ExpirationProgress = ({ endHeight, startHeight, chainHeight, blockG // Expiration status text const statusText = expirationPercentage === 100 - ? $t('s_assets_item_expired') - : $t('s_assets_item_expireIn', { inTime: blockDurationToDaysLeft(remainedBlocks, blockGenerationTargetTime) }); + ? $t('component_expirationProgress_label_expired') + : $t('component_expirationProgress_label_expireIn', { inTime: blockDurationToDaysLeft(remainedBlocks, blockGenerationTargetTime) }); return ( diff --git a/wallet/symbol/mobile/src/components/features/Passcode/hooks/usePasscodeManager.js b/wallet/symbol/mobile/src/components/features/Passcode/hooks/usePasscodeManager.js index bd63aaea20..f4fdde8f01 100644 --- a/wallet/symbol/mobile/src/components/features/Passcode/hooks/usePasscodeManager.js +++ b/wallet/symbol/mobile/src/components/features/Passcode/hooks/usePasscodeManager.js @@ -90,10 +90,10 @@ export const usePasscodeManager = ({ mode, onSuccess }) => { const remainingTimeMs = result.lockoutUntil - Date.now(); const remainingMinutes = Math.ceil(remainingTimeMs / 60000); errorMessage = remainingMinutes > 1 - ? $t('s_passcode_error_maxAttempts_time_minutes', { count: remainingMinutes }) - : $t('s_passcode_error_maxAttempts_time_minute'); + ? $t('component_passcode_errorMessage_maxAttemptsMinutes', { count: remainingMinutes }) + : $t('component_passcode_errorMessage_maxAttemptsMinute'); } else { - errorMessage = $t('s_passcode_error_incorrect'); + errorMessage = $t('component_passcode_errorMessage_incorrect'); } showError(errorMessage); @@ -139,7 +139,7 @@ export const usePasscodeManager = ({ mode, onSuccess }) => { return; } - showError($t('s_passcode_error_mismatch')); + showError($t('component_passcode_errorMessage_mismatch')); setStep(PasscodeStep.ENTER); passcodeInput.clear(); passcodeConfirmInput.clear(); diff --git a/wallet/symbol/mobile/src/components/features/Passcode/utils/index.js b/wallet/symbol/mobile/src/components/features/Passcode/utils/index.js index 87c63f5217..7e38eb0a3b 100644 --- a/wallet/symbol/mobile/src/components/features/Passcode/utils/index.js +++ b/wallet/symbol/mobile/src/components/features/Passcode/utils/index.js @@ -11,12 +11,12 @@ import { $t } from '@/app/localization'; */ export const getPasscodeTitle = (mode, step) => { if (mode === PasscodeMode.CREATE && step === PasscodeStep.ENTER) - return $t('s_passcode_createEnter_title'); + return $t('component_passcode_title_createEnter'); if (mode === PasscodeMode.CREATE && step === PasscodeStep.CONFIRM) - return $t('s_passcode_createConfirm_title'); + return $t('component_passcode_title_createConfirm'); - return $t('s_passcode_verify_title'); + return $t('component_passcode_title_verify'); }; /** @@ -33,13 +33,13 @@ export const getPasscodeSubtitle = ({ errorMessage, mode, step, remainingAttempt return errorMessage; if (mode === PasscodeMode.CREATE && step === PasscodeStep.ENTER) - return $t('s_passcode_createEnter_description'); + return $t('component_passcode_description_createEnter'); if (mode === PasscodeMode.CREATE && step === PasscodeStep.CONFIRM) - return $t('s_passcode_createConfirm_description'); + return $t('component_passcode_description_createConfirm'); if (remainingAttempts && remainingAttempts < passcodeManager.getMaxAttempts()) - return $t('s_passcode_verify_attempt_description', { attempts: remainingAttempts }); + return $t('component_passcode_description_verifyAttempt', { attempts: remainingAttempts }); return ''; }; diff --git a/wallet/symbol/mobile/src/components/features/SendReceiveButtons.jsx b/wallet/symbol/mobile/src/components/features/SendReceiveButtons.jsx index 22465af85a..e9e52c06f4 100644 --- a/wallet/symbol/mobile/src/components/features/SendReceiveButtons.jsx +++ b/wallet/symbol/mobile/src/components/features/SendReceiveButtons.jsx @@ -138,8 +138,8 @@ export const SendReceiveButtons = ({ diff --git a/wallet/symbol/mobile/src/components/features/TableView.jsx b/wallet/symbol/mobile/src/components/features/TableView.jsx index 648295ea51..b958a49963 100644 --- a/wallet/symbol/mobile/src/components/features/TableView.jsx +++ b/wallet/symbol/mobile/src/components/features/TableView.jsx @@ -1,7 +1,7 @@ import { AccountRow, BooleanView, CopyButtonContainer, Field, MessageView, Stack, StyledText, TokenBalanceRow } from '@/app/components'; import { useAccountDisplayData, useTokenDisplayData } from '@/app/hooks'; import { $t } from '@/app/localization'; -import { getTransactionTypeTranslationKey } from '@/app/utils'; +import { getTransactionTypeLocaleKey } from '@/app/utils'; import React from 'react'; import { StyleSheet, View } from 'react-native'; @@ -123,7 +123,7 @@ const renderRowValue = (row, accountsDisplayMap, tokensDisplayMap, translate, ch ); case 'encryption': @@ -131,14 +131,14 @@ const renderRowValue = (row, accountsDisplayMap, tokensDisplayMap, translate, ch ); case 'delta': return ( {translate( - 'data_delta_' + (row.value > 0 ? 'increase' : row.value < 0 ? 'decrease' : 'unchanged'), + 'fieldValue_' + (row.value > 0 ? 'deltaIncrease' : row.value < 0 ? 'deltaDecrease' : 'deltaUnchanged'), { delta: Math.abs(row.value) } )} @@ -150,9 +150,9 @@ const renderRowValue = (row, accountsDisplayMap, tokensDisplayMap, translate, ch ); case 'transactionType': - return {translate(getTransactionTypeTranslationKey(row.value, chainName))}; + return {translate(getTransactionTypeLocaleKey(row.value, chainName))}; case 'translate': - return {translate(`data_${row.value}`)}; + return {translate(`fieldValue_${row.value}`)}; case 'text': default: return {`${row.value}` ?? '-'}; diff --git a/wallet/symbol/mobile/src/components/feedback/MultisigAccountWarning.jsx b/wallet/symbol/mobile/src/components/feedback/MultisigAccountWarning.jsx index f22c89594f..41ee1cbf6e 100644 --- a/wallet/symbol/mobile/src/components/feedback/MultisigAccountWarning.jsx +++ b/wallet/symbol/mobile/src/components/feedback/MultisigAccountWarning.jsx @@ -25,8 +25,8 @@ export const MultisigAccountWarning = ({ cosignatories, chainName }) => { { return ( { {explorerLinks.length > 1 && ( - {$t('c_transactionStatus_transaction_text', { index: index + 1 })} + {$t('component_transactionProgressDialog_label_transaction', { index: index + 1 })} )} { const unknownStatus = { icon: 'question-circle', variant: 'neutral', - title: $t('c_transactionStatus_status_unknown_title'), - description: $t('c_transactionStatus_status_unknown_description') + title: $t('component_transactionScreenTemplate_status_unknown_title'), + description: $t('component_transactionScreenTemplate_status_unknown_description') }; const sendingStatus = { icon: 'pending', variant: 'warning', - title: $t('c_transactionStatus_status_sending_title'), - description: $t('c_transactionStatus_status_sending_description') + title: $t('component_transactionScreenTemplate_status_sending_title'), + description: $t('component_transactionScreenTemplate_status_sending_description') }; const infoMap = { @@ -40,44 +40,44 @@ const createStatusInfo = status => { [TransactionWorkflowStatus.ANNOUNCED]: { icon: 'check-circle', variant: 'neutral', - title: $t('c_transactionStatus_status_confirming_title'), - description: $t('c_transactionStatus_status_confirming_description') + title: $t('component_transactionScreenTemplate_status_confirming_title'), + description: $t('component_transactionScreenTemplate_status_confirming_description') }, [TransactionWorkflowStatus.PARTIAL]: { icon: 'check-circle', variant: 'neutral', - title: $t('c_transactionStatus_status_partial_title'), - description: $t('c_transactionStatus_status_partial_description') + title: $t('component_transactionScreenTemplate_status_partial_title'), + description: $t('component_transactionScreenTemplate_status_partial_description') }, [TransactionWorkflowStatus.CONFIRMED]: { icon: 'check-circle', variant: 'success', - title: $t('c_transactionStatus_status_confirmed_title'), - description: $t('c_transactionStatus_status_confirmed_description') + title: $t('component_transactionScreenTemplate_status_confirmed_title'), + description: $t('component_transactionScreenTemplate_status_confirmed_description') }, [TransactionWorkflowStatus.CREATE_ERROR]: { icon: 'cross-circle', variant: 'danger', - title: $t('c_transactionStatus_status_createError_title'), - description: $t('c_transactionStatus_status_createError_description') + title: $t('component_transactionScreenTemplate_status_createError_title'), + description: $t('component_transactionScreenTemplate_status_createError_description') }, [TransactionWorkflowStatus.SIGN_ERROR]: { icon: 'cross-circle', variant: 'danger', - title: $t('c_transactionStatus_status_signError_title'), - description: $t('c_transactionStatus_status_signError_description') + title: $t('component_transactionScreenTemplate_status_signError_title'), + description: $t('component_transactionScreenTemplate_status_signError_description') }, [TransactionWorkflowStatus.ANNOUNCE_ERROR]: { icon: 'cross-circle', variant: 'danger', - title: $t('c_transactionStatus_status_announceError_title'), - description: $t('c_transactionStatus_status_announceError_description') + title: $t('component_transactionScreenTemplate_status_announceError_title'), + description: $t('component_transactionScreenTemplate_status_announceError_description') }, [TransactionWorkflowStatus.FAILED_TRANSACTIONS]: { icon: 'cross-circle', variant: 'danger', - title: $t('c_transactionStatus_status_failedTransaction_title'), - description: $t('c_transactionStatus_status_failedTransaction_description') + title: $t('component_transactionScreenTemplate_status_failedTransaction_title'), + description: $t('component_transactionScreenTemplate_status_failedTransaction_description') } }; @@ -141,25 +141,25 @@ const buildActivityLog = ({ return [ { - title: $t('c_transactionStatus_step_create'), + title: $t('component_transactionScreenTemplate_step_create'), icon: 'plus', status: createState.status, caption: createState.errorMessage ?? '' }, { - title: $t('c_transactionStatus_step_sign'), + title: $t('component_transactionScreenTemplate_step_sign'), icon: 'sign', status: signState.status, caption: signState.errorMessage ?? '' }, { - title: $t('c_transactionStatus_step_announce'), + title: $t('component_transactionScreenTemplate_step_announce'), icon: 'send-plane', status: announceState.status, caption: announceState.errorMessage ?? '' }, { - title: $t('c_transactionStatus_step_confirm'), + title: $t('component_transactionScreenTemplate_step_confirm'), icon: hasFailedTransactions ? 'cross' : 'check', status: getConfirmStatus(), caption: '' diff --git a/wallet/symbol/mobile/src/constants/index.js b/wallet/symbol/mobile/src/constants/index.js index db6ca7029d..df00efc299 100644 --- a/wallet/symbol/mobile/src/constants/index.js +++ b/wallet/symbol/mobile/src/constants/index.js @@ -23,6 +23,16 @@ export const PasscodeMode = { VERIFY: 'verify' }; +export const ReceiptType = { + HARVESTING_REWARD: 'harvestingReward' +}; + +/** Direction of a transfer relative to the current account. */ +export const TransactionDirection = { + INCOMING: 'incoming', + OUTGOING: 'outgoing' +}; + export const PASSCODE_PIN_LENGTH = 4; export const PASSCODE_MAX_FAILED_ATTEMPTS = 10; export const PASSCODE_LOCKOUT_DURATION = 60000; diff --git a/wallet/symbol/mobile/src/localization/index.js b/wallet/symbol/mobile/src/localization/index.js index 3869fef3be..bc9e8e0f79 100644 --- a/wallet/symbol/mobile/src/localization/index.js +++ b/wallet/symbol/mobile/src/localization/index.js @@ -30,6 +30,19 @@ const languageNames = { const i18n = new I18n(); +const MISSING_TRANSLATION_BEHAVIOR = 'report'; + +// Names the missing key in place of the text, and warns while developing, so that a key typo cannot pass unnoticed. +i18n.missingTranslation.register(MISSING_TRANSLATION_BEHAVIOR, (_, scope) => { + if (__DEV__) { + // eslint-disable-next-line no-console + console.warn(`[localization] missing key: ${scope}`); + } + + return `[missing: ${scope}]`; +}); +i18n.missingBehavior = MISSING_TRANSLATION_BEHAVIOR; + const translate = memoize( (key, config) => i18n.t(key, config), (key, config) => (config ? key + JSON.stringify(config) : key) diff --git a/wallet/symbol/mobile/src/localization/locales/en.json b/wallet/symbol/mobile/src/localization/locales/en.json index 58f07a180d..2314f0540b 100644 --- a/wallet/symbol/mobile/src/localization/locales/en.json +++ b/wallet/symbol/mobile/src/localization/locales/en.json @@ -1,878 +1,730 @@ { - "button_ok": "OK", - "button_next": "Next", - "button_back": "Back", + "alert_multisigWarning_description": "To send transactions from this account, please announce it from a cosignatory account!", + "alert_multisigWarning_title": "Multisig Account", + "button_accept": "Accept", + "button_activateAccount": "Activate Account", + "button_add": "Add", + "button_addContact": "Add Contact", "button_cancel": "Cancel", - "button_close": "Close", "button_clear": "Clear", - "button_accept": "Accept", "button_confirm": "Confirm", - "button_send": "Send", - "button_sendTransferTransaction": "Send Transfer Transaction", - "button_sendTransactionToThisAccount": "Send Transaction To This Account", - "button_sendTransactionFromThisAccount": "Send Transaction From This Account", - "button_receive": "Receive", - "button_showDetails": "Details", - "button_show": "Show", - "button_hide": "Hide", - "button_add": "Add", - "button_addAccount": "Add Account", + "button_edit": "Edit", + "button_faucet": "Claim test XYM", "button_importAccount": "Import existing private key", - "button_addContact": "Add Contact", + "button_modifyAccount": "Modify Account", + "button_modifyMosaic": "Modify Mosaic", + "button_next": "Next", + "button_ok": "OK", + "button_openTransactionInExplorer": "Open In Block Explorer", + "button_receive": "Receive", + "button_regenerateAddress": "I don't like this address", "button_remove": "Remove", "button_removeAccount": "Remove Account", - "button_edit": "Edit", - "button_modifyAccount": "Modify Account", + "button_revealPrivateKey": "Reveal Private Key", + "button_revoke": "Revoke Mosaic", "button_save": "Save", - "button_update": "Update", + "button_send": "Send", + "button_sendTransactionToThisAccount": "Send Transaction To This Account", + "button_showMnemonic": "Show Mnemonic Phrase", + "button_signAndApprove": "Approve and Sign", "button_start": "Start", "button_stop": "Stop", - "button_continue": "Continue", "button_walletCreate": "Create Wallet", "button_walletImport": "Import Wallet", - "button_walletRemove": "Remove Wallet", - "button_openTransactionInExplorer": "Open In Block Explorer", - "button_openAccountInExplorer": "Open In Block Explorer", - "button_faucet": "Claim test XYM", - "button_revealPrivateKey": "Reveal Private Key", - "button_scan": "Scan", - "button_scanQR": "Scan QR-code", - "button_addToWallet": "Add to Wallet", - "button_addToAddressBook": "Add to Address Book", - "button_addToWhitelist": "Add to Whitelist", - "button_addToBlacklist": "Block", - "button_addSignerToAddressBook": "Add signer to address book", - "button_addRecipientToAddressBook": "Add recipient to address book", - "button_downloadBackup": "Download mnemonic to file", - "button_showMnemonic": "Show Mnemonic Phrase", - "button_revoke": "Revoke Mosaic", - "button_modifyMosaic": "Modify Mosaic", - "button_activateAccount": "Activate Account", - "button_signAndApprove": "Approve and Sign", - "button_regenerateAddress": "I don't like this address", - "input_name": "Name", - "input_accountName": "Account Name", - "input_address": "Address", - "input_notes": "Notes", - "input_privateKey": "Private Key", - "input_nodeUrl": "Node URL", - "input_transactionFee": "Transaction Fee", - "input_supply": "Supply", - "input_duration": "Duration", - "input_divisibility": "Divisibility", - "input_amount": "Amount", - "input_feeSpeed": "Speed/Fee", - "input_mosaic": "Mosaic", - "input_sourceAddress": "Source Address", - "input_sender": "Sender", - "input_mnemonic": "Mnemonic Phrase", - "input_recipient": "Recipient", - "input_message": "Message/Memo", - "input_encrypted": "Encrypted", - "dialog_sensitive": "Sensitive information", + "component_expirationProgress_label_expired": "Expired", + "component_expirationProgress_label_expireIn": "Expires %{inTime}", + "component_inputAmount_dialog_maxAmount_description": "Are you sure you want to use the entire available amount?\n\nAvailable amount: %{amount}", + "component_inputAmount_dialog_maxAmount_title": "Confirm Amount", + "component_inputAmount_label_available": "Available", + "component_messageView_label_encrypted": "Encrypted Message", + "component_messageView_label_rawData": "Data", + "component_navigationMenu_tab_actions": "Actions", + "component_navigationMenu_tab_assets": "Assets", + "component_navigationMenu_tab_history": "History", + "component_navigationMenu_tab_home": "Home", + "component_navigationMenu_tab_scan": "Scan", + "component_networkConnectionStatusBar_message_connected": "Connected.", + "component_networkConnectionStatusBar_message_connecting": "Connecting...", + "component_networkConnectionStatusBar_message_nodeDown": "Node is down. Please select a different node in the network settings.", + "component_networkConnectionStatusBar_message_offline": "No Internet connection.", + "component_passcode_description_createConfirm": "Enter PIN-code again", + "component_passcode_description_createEnter": "Enter new PIN-code", + "component_passcode_description_verifyAttempt": "%{attempts} attempts remaining", + "component_passcode_errorMessage_incorrect": "Incorrect", + "component_passcode_errorMessage_maxAttemptsMinute": "Too many attempts. Please try again in 1 minute.", + "component_passcode_errorMessage_maxAttemptsMinutes": "Too many attempts. Please try again in %{count} minutes.", + "component_passcode_errorMessage_mismatch": "PIN codes do not match", + "component_passcode_title_createConfirm": "Confirm", + "component_passcode_title_createEnter": "Create a PIN", + "component_passcode_title_verify": "Unlock the Wallet", + "component_selectTransactionSender_tab_currentAccount": "Current Account", + "component_selectTransactionSender_tab_multisigAccount": "Multisig Account", + "component_selectTransactionSender_title_defaultAccountName": "Multisig Account", + "component_selectTransactionSender_title_selectSender": "Select Sender", + "component_transactionConfirmationDialog_title_confirmTransfer": "Confirm Transfer", + "component_transactionProgressDialog_label_transaction": "Transaction %{index}", + "component_transactionProgressDialog_title_sendTransaction": "Send Transaction", + "component_transactionScreenTemplate_status_announceError_description": "Transaction was not broadcasted to the network", + "component_transactionScreenTemplate_status_announceError_title": "Transaction Failed", + "component_transactionScreenTemplate_status_confirmed_description": "Transaction confirmed!", + "component_transactionScreenTemplate_status_confirmed_title": "Success", + "component_transactionScreenTemplate_status_confirming_description": "Waiting for network confirmation. You can close this window or keep it open to watch the progress.", + "component_transactionScreenTemplate_status_confirming_title": "Transaction Sent", + "component_transactionScreenTemplate_status_createError_description": "Transaction could not be created", + "component_transactionScreenTemplate_status_createError_title": "Creation Failed", + "component_transactionScreenTemplate_status_failedTransaction_description": "Transaction was rejected by the network", + "component_transactionScreenTemplate_status_failedTransaction_title": "Transaction Failed", + "component_transactionScreenTemplate_status_partial_description": "Waiting for signatures from other parties. You can close this window or keep it open to watch the progress.", + "component_transactionScreenTemplate_status_partial_title": "Transaction Sent", + "component_transactionScreenTemplate_status_sending_description": "Please do not close the app until the transaction has been sent.", + "component_transactionScreenTemplate_status_sending_title": "Please Wait", + "component_transactionScreenTemplate_status_signError_description": "Transaction was not signed", + "component_transactionScreenTemplate_status_signError_title": "Signing Failed", + "component_transactionScreenTemplate_status_unknown_description": "An unexpected error occurred. Please try again.", + "component_transactionScreenTemplate_status_unknown_title": "Something Went Wrong", + "component_transactionScreenTemplate_step_announce": "Send Transaction", + "component_transactionScreenTemplate_step_confirm": "Confirmation", + "component_transactionScreenTemplate_step_create": "Create Transaction", + "component_transactionScreenTemplate_step_sign": "Sign Transaction", + "dialog_removeAccount_description": "You are about to remove account \"%{name}\" %{address} from your wallet.", "dialog_removeAccount_title": "Remove Account", - "dialog_removeAccount_body": "You are about to remove account \"%{name}\" %{address} from your wallet.", - "month_jan": "Jan", - "month_feb": "Feb", - "month_mar": "Mar", - "month_apr": "Apr", - "month_may": "May", - "month_jun": "Jun", - "month_jul": "Jul", - "month_aug": "Aug", - "month_sep": "Sep", - "month_oct": "Oct", - "month_nov": "Nov", - "month_dec": "Dec", - "navigation_home": "Home", - "navigation_history": "History", - "navigation_scan": "Scan", - "navigation_assets": "Assets", - "navigation_actions": "Actions", - "screen_Welcome": "Welcome", - "screen_CreateWallet": "Create Wallet", - "screen_ImportWallet": "Import Wallet", - "screen_CreateMosaic": "Create Mosaic", - "screen_RevokeMosaic": "Revoke Mosaic", - "screen_ModifyMosaic": "Modify Mosaic", - "screen_CreatedMosaicList": "Created Mosaics", - "screen_Home": "Home", - "screen_History": "History", - "screen_Assets": "Assets", - "screen_Actions": "Actions", - "screen_AccountDetails": "Account Details", - "screen_AccountList": "Account List", - "screen_AddSeedAccount": "Add Account", - "screen_CreateContact": "Create Contact", - "screen_EditContact": "Edit Contact", - "screen_ContactDetails": "Contact Details", - "screen_ContactList": "Address Book", - "screen_BridgeAccountList": "Your Bridge Accounts", - "screen_BridgeAccountDetails": "Bridge Account Details", - "screen_BridgeSwap": "Swap Tokens", - "screen_BridgeSwapDetails": "Swap Details", - "screen_Scan": "Scan", - "screen_Send": "Send", - "screen_Receive": "Receive", - "screen_Revoke": "Revoke", - "screen_Settings": "Settings", - "screen_SettingsAbout": "About", - "screen_SettingsNetwork": "Network", - "screen_SettingsSecurity": "Security", - "screen_TokenDetails": "Token Details", - "screen_TransactionDetails": "Transaction Details", - "screen_TransactionRequest": "Transaction Request", - "screen_AssetDetails": "Asset Details", - "screen_Harvesting": "Harvesting", - "screen_Passcode": "Passcode", - "screen_MultisigAccountDetails": "Account Details", - "screen_MultisigAccountList": "Multisig Accounts", - "screen_CreateMultisigAccount": "Create Account", - "screen_ModifyMultisigAccount": "Modify Account", - "fieldTitle_chainName": "Chain", - "fieldTitle_accountAliasNames": "Alias Names", - "fieldTitle_innerTransactionNo": "Inner Transaction #", - "fieldTitle_signature": "Signature", - "fieldTitle_signDescription": "You can use Symbol Desktop Wallet or Symbol CLI to review and sign this transaction.", - "fieldTitle_type": "Type", - "fieldTitle_recipientAddress": "Recipient Address", - "fieldTitle_messageText": "Message", - "fieldTitle_message": "Message", - "fieldTitle_isMessageEncrypted": "Message encryption", - "fieldTitle_fee": "Fee", - "fieldTitle_rentalFee": "Rental fee", - "fieldTitle_transactionFee": "Transaction fee", - "fieldTitle_resolvedFee": "Fee", - "fieldTitle_accountName": "Account name", + "dialog_sensitiveInformation_title": "Sensitive information", + "errorMessage_accountAlreadyExists": "Account is already in the wallet", + "errorMessage_accountNotFound": "Account not found in the wallet", + "errorMessage_api": "The node returned an error", + "errorMessage_chainListenerStart": "Could not subscribe to network updates", + "errorMessage_contactAlreadyExists": "This contact is already in the address book", + "errorMessage_contactNotFound": "Contact not found in the address book", + "errorMessage_controller": "Wallet error, please try again", + "errorMessage_decryptMessageInvalidTransactionType": "Messages of this transaction type cannot be decrypted", + "errorMessage_decryptMessageNotRelated": "This message cannot be decrypted with the current account", + "errorMessage_harvestingAccountNoActivity": "Harvesting unavailable: this account has no activity on the network yet", + "errorMessage_harvestingNoKeysToUnlink": "The account has no harvesting keys to unlink", + "errorMessage_invalidRequest": "The node rejected the request as invalid", + "errorMessage_keystore": "Secure storage error", + "errorMessage_keystoreAccess": "Failed to access the secure storage of the device", + "errorMessage_networkNotSupported": "This network is not supported", + "errorMessage_networkRequest": "Network request failed, check your connection and try again", + "errorMessage_notFound": "Not found", + "errorMessage_rateLimit": "Too many requests", + "errorMessage_removeCurrentAccount": "Switch to another account before removing this one", + "errorMessage_sdk": "Failed to process the blockchain data", + "errorMessage_selectedAccountMissing": "The selected account is no longer available", + "errorMessage_serverError": "An error occurred on the node side", + "errorMessage_transferNoRecipientPublicKey": "The recipient has not made a transaction yet, so the message cannot be encrypted", + "errorMessage_transferUnknownRecipient": "Recipient address not found", + "errorMessage_unauthorized": "Not authorized to perform this request", + "errorMessage_unknown": "Something went wrong, please try again", + "errorMessage_unknownAccountName": "Address not found", + "errorMessage_wrongNetwork": "The selected node belongs to a different network", + "feeSpeed_fast": "Fast", + "feeSpeed_medium": "Medium", + "feeSpeed_slow": "Slow", "fieldTitle_account": "Account", + "fieldTitle_accountCosignatories": "Cosignatories / Controlled By", + "fieldTitle_accountType": "Account Type", + "fieldTitle_action": "Action", "fieldTitle_address": "Address", - "fieldTitle_publicKey": "Public key", - "fieldTitle_privateKey": "Private key", - "fieldTitle_balance": "Balance", - "fieldTitle_mosaics": "Mosaics", - "fieldTitle_mosaic": "Mosaic", - "fieldTitle_token": "Token", - "fieldTitle_tokens": "Tokens", + "fieldTitle_addressAdditions": "Address Additions", + "fieldTitle_addressDeletions": "Address Deletions", + "fieldTitle_aliasAction": "Alias Action", "fieldTitle_amount": "Amount", - "data_encrypted": "Encrypted", - "data_unencrypted": "Unencrypted", - "fieldTitle_status": "Status", - "fieldTitle_innerTxs": "Inner transactions", - "fieldTitle_signerAddress": "Signer Address", - "fieldTitle_senderAddress": "Sender Address", - "fieldTitle_transactionInitiator": "Initiated / Signed By", + "fieldTitle_appVersion": "Application Version", + "fieldTitle_balance": "Balance", + "fieldTitle_chainHeight": "Chain Height", + "fieldTitle_chainName": "Chain", + "fieldTitle_cosignatories": "Cosignatories", + "fieldTitle_cosignatoryAdditions": "Added Cosignatory", + "fieldTitle_cosignatoryDeletions": "Removed Cosignatory", + "fieldTitle_creator": "Creator", + "fieldTitle_currentChainHeight": "Current Chain Height", + "fieldTitle_date": "Date", "fieldTitle_deadline": "Deadline", - "fieldTitle_hash": "Hash", - "fieldTitle_transactionHash": "Transaction Hash", - "fieldTitle_transferType": "Transfer Type", - "fieldTitle_hasCustomMosaic": "Number of Transfered Mosaics", - "fieldTitle_undefined": "n/a", - "fieldTitle_null": "n/a", - "fieldTitle_namespaceName": "Namespace name", - "fieldTitle_mosaicId": "Mosaic ID", - "fieldTitle_namespaceId": "Namespace ID", - "fieldTitle_namespace": "Namespace", - "fieldTitle_phone": "Phone", - "fieldTitle_email": "Email", - "fieldTitle_label": "Label", - "fieldTitle_notes": "Notes", - "fieldTitle_show": "Show", - "fieldTitle_name": "Name", - "fieldTitle_seedIndex": "Account Seed Index", - "fieldTitle_vrfPublicKey": "Linked Vrf public key", - "fieldTitle_vrfPrivateKey": "Linked Vrf private key", - "fieldTitle_remotePublicKey": "Linked Remote public key", - "fieldTitle_remotePrivateKey": "Linked Remote private key", - "fieldTitle_nodePublicKey": "Linked Node public key", - "fieldTitle_optinAddress": "Your NIS1 Address", - "fieldTitle_optinStatus": "Opt-in status", - "fieldTitle_optinAmount": "Total XYM", - "fieldTitle_optinDestination": "Your Symbol Address", - "fieldTitle_optinNIS1Multisig": "NIS1 Multisig address", - "fieldTitle_optinMultisigDestination": "Multisig Symbol address", - "fieldTitle_optinCosigner": "Your Cosigner address", - "fieldTitle_transactionType": "Transaction Type", - "fieldTitle_registrationType": "Registration Type", - "fieldTitle_parentId": "Parent Id", - "fieldTitle_duration": "Duration", - "fieldTitle_aliasAction": "Alias Action", + "fieldTitle_delta": "Delta", + "fieldTitle_description": "Description", "fieldTitle_divisibility": "Divisibility", - "fieldTitle_nonce": "Nonce", - "fieldTitle_supplyMutable": "Supply Mutable", - "fieldTitle_transferable": "Transferable", - "fieldTitle_restrictable": "Restrictable", - "fieldTitle_revokable": "Revokable", - "fieldTitle_isSupplyMutable": "Supply Mutable", - "fieldTitle_isTransferable": "Transferable", + "fieldTitle_duration": "Duration", + "fieldTitle_endEpoch": "End Epoch", + "fieldTitle_expirationHeight": "Expiration Height", + "fieldTitle_fee": "Fee", + "fieldTitle_hash": "Hash", + "fieldTitle_hashAlgorithm": "Hash Algorithm", + "fieldTitle_height": "Height", + "fieldTitle_id": "ID", + "fieldTitle_isMessageEncrypted": "Message encryption", "fieldTitle_isRestrictable": "Restrictable", "fieldTitle_isRevokable": "Revokable", - "fieldTitle_action": "Action", - "fieldTitle_delta": "Delta", + "fieldTitle_isSupplyMutable": "Supply Mutable", + "fieldTitle_isTransferable": "Transferable", + "fieldTitle_label": "Label", + "fieldTitle_linkAction": "Link Action", + "fieldTitle_linkedAccountAddress": "Linked Account Address", + "fieldTitle_linkedPublicKey": "Linked Public Key", + "fieldTitle_message": "Message", + "fieldTitle_messageText": "Message", + "fieldTitle_metadataValue": "Metadata Value", "fieldTitle_minApprovalDelta": "Min. Approval Delta", + "fieldTitle_minApprovals": "Min. Approvals", + "fieldTitle_minFeeMultiplier": "Min. Fee Multiplier", "fieldTitle_minRemovalDelta": "Min. Removal Delta", - "fieldTitle_addressAdditions": "Address Additions", - "fieldTitle_addressDeletions": "Address Deletions", - "fieldTitle_cosignatoryAdditions": "Added Cosignatory", - "fieldTitle_cosignatoryDeletions": "Removed Cosignatory", - "fieldTitle_secret": "Secret", - "fieldTitle_recipient": "Recipient", - "fieldTitle_hashAlgorithm": "Hash Algorithm", + "fieldTitle_minRemovals": "Min. Removals", + "fieldTitle_mosaic": "Mosaic", + "fieldTitle_mosaicId": "Mosaic ID", + "fieldTitle_mosaicName": "Mosaic name", + "fieldTitle_mosaics": "Mosaics", + "fieldTitle_multisigAccount": "Multisig Account", + "fieldTitle_multisigAddress": "Multisig Account", + "fieldTitle_multisigAddresses": "Multisig Accounts", + "fieldTitle_name": "Name", + "fieldTitle_namespace": "Namespace", + "fieldTitle_namespaceId": "Namespace ID", + "fieldTitle_namespaceName": "Namespace name", + "fieldTitle_network": "Network", + "fieldTitle_networkIdentifier": "Network", + "fieldTitle_newRestrictionType": "New Restriction Type", + "fieldTitle_newRestrictionValue": "New Restriction Value", + "fieldTitle_nodePublicKey": "Linked Node public key", + "fieldTitle_nodeUrl": "Node URL", + "fieldTitle_nonce": "Nonce", + "fieldTitle_notes": "Notes", + "fieldTitle_parentId": "Parent Id", + "fieldTitle_previousRestrictionType": "Previous Restriction Type", + "fieldTitle_previousRestrictionValue": "Previous Restriction Value", "fieldTitle_proof": "Proof", - "fieldTitle_restrictionType": "Restriction Type", + "fieldTitle_publicKey": "Public key", + "fieldTitle_reactNativeVersion": "React Native Version", + "fieldTitle_receivedCosignatures": "Approved / Co-signed By", + "fieldTitle_recipientAddress": "Recipient Address", + "fieldTitle_referenceMosaicId": "Reference Mosaic Id", + "fieldTitle_registrationHeight": "Registration Height", + "fieldTitle_registrationType": "Registration Type", "fieldTitle_restrictionAddressAdditions": "Restriction Address Additions", "fieldTitle_restrictionAddressDeletions": "Restriction Address Deletions", + "fieldTitle_restrictionKey": "Restriction Key", "fieldTitle_restrictionMosaicAdditions": "Restriction Mosaic Additions", "fieldTitle_restrictionMosaicDeletions": "Restriction Mosaic Deletions", "fieldTitle_restrictionOperationAdditions": "Restriction Operation Additions", "fieldTitle_restrictionOperationDeletions": "Restriction Operation Deletions", - "fieldTitle_mosaicAliasNames": "Mosaic Alias Names", - "fieldTitle_targetAddress": "Target Address", - "fieldTitle_sourceAddress": "Source Address", - "fieldTitle_restrictionKey": "Restriction Key", - "fieldTitle_previousRestrictionValue": "Previous Restriction Value", - "fieldTitle_newRestrictionValue": "New Restriction Value", - "fieldTitle_referenceMosaicId": "Reference Mosaic Id", - "fieldTitle_previousRestrictionType": "Previous Restriction Type", - "fieldTitle_newRestrictionType": "New Restriction Type", + "fieldTitle_restrictionType": "Restriction Type", "fieldTitle_scopedMetadataKey": "Scoped Metadata Key", - "fieldTitle_metadataValue": "Metadata Value", - "fieldTitle_valueSizeDelta": "Value Size Delta", - "fieldTitle_targetMosaicId": "Target Mosaic Id", - "fieldTitle_targetMosaicAliasNames": "Target Mosaic Alias Names", - "fieldTitle_targetNamespaceId": "Target Namespace Id", - "fieldTitle_linkAction": "Link Action", - "fieldTitle_linkedPublicKey": "Linked Public Key", - "fieldTitle_linkedAccountAddress": "Linked Account Address", + "fieldTitle_secret": "Secret", + "fieldTitle_seedIndex": "Account Seed Index", + "fieldTitle_sender": "From", + "fieldTitle_senderAddress": "Sender Address", + "fieldTitle_signature": "Signature", + "fieldTitle_signerAddress": "Signer Address", + "fieldTitle_sourceAddress": "Source Address", "fieldTitle_startEpoch": "Start Epoch", - "fieldTitle_endEpoch": "End Epoch", - "fieldTitle_receivedCosignatures": "Approved / Co-signed By", - "fieldTitle_list": "List", - "fieldTitle_networkIdentifier": "Network", - "fieldTitle_accountType": "Account Type", - "fieldTitle_appVersion": "Application Version", - "fieldTitle_symbolSdkVersion": "Symbol SDK Version", - "fieldTitle_reactNativeVersion": "React Native Version", - "fieldTitle_height": "Height", - "fieldTitle_cosignatories": "Cosignatories", - "fieldTitle_accountCosignatories": "Cosignatories / Controlled By", - "fieldTitle_minApprovals": "Min. Approvals", - "fieldTitle_minRemovals": "Min. Removals", - "fieldTitle_id": "ID", - "fieldTitle_names": "Names", + "fieldTitle_status": "Status", "fieldTitle_supply": "Total Supply", - "fieldTitle_quantity": "Quantity", - "fieldTitle_startHeight": "Start Height", - "fieldTitle_flags": "Flags", - "fieldTitle_creator": "Creator", - "fieldTitle_linkedMosaicId": "Linked To Mosaic ID", - "fieldTitle_linkedAddress": "Linked To Address", - "fieldTitle_endHeight": "End Height", - "fieldTitle_expireIn": "Expiration", - "fieldTitle_nodeUrl": "Node URL", - "fieldTitle_multisigAddresses": "Multisig Accounts", - "fieldTitle_multisigAddress": "Multisig Account", - "fieldTitle_multisigAccount": "Multisig Account", - "fieldTitle_sender": "From", - "fieldTitle_network": "Network", - "fieldTitle_minFeeMultiplier": "Min. Fee Multiplier", - "fieldTitle_averageFeeMultiplier": "Average Fee Multiplier", - "fieldTitle_generationHash": "Generation Hash", - "fieldTitle_chainHeight": "Chain Height", - "fieldTitle_description": "Description", - "fieldTitle_registrationHeight": "Registration Height", - "fieldTitle_currentChainHeight": "Current Chain Height", - "fieldTitle_expirationHeight": "Expiration Height", - "data_true": "Yes", - "data_false": "No", - "data_unlimited": "UNLIMITED", - "data_na": "N/A", - "data_infinity": "INFINITY", - "data_moasic": "MOSAIC", - "data_address": "ADDRESS", - "data_noAlias": "NO ALIAS", - "data_active": "ACTIVE", - "data_inactive": "INACTIVE", - "data_unknown": "UNKNOWN", - "data_expired": "EXPIRED", - "data_Increase": "Increase", - "data_Decrease": "Decrease", - "data_RootNamespace": "Root namespace", - "data_SubNamespace": "Sub namespace", - "data_Link": "Link", - "data_Unlink": "Unlink", - "data_AllowIncomingAddresses": "Allow Incoming Addresses", - "data_AllowOutgoingAddresses": "Allow Outgoing Addresses", - "data_BlockIncomingAddresses": "Block Incoming Addresses", - "data_BlockOutgoingAddresses": "Block Outgoing Addresses", - "data_AllowMosaics": "Allow Mosaics", - "data_BlockMosaics": "Block Mosaics", - "data_AllowOutgoingTransactions": "Allow Outgoing Transactions", - "data_BlockOutgoingTransactions": "Block Outgoing Transactions", - "data_MosaicAddressRestriction": "Mosaic address restriction", - "data_MosaicGlobalRestriction": "Mosaic global restriction", - "data_MosaicRestrictionTypeEQ": "=", - "data_MosaicRestrictionTypeGE": "≥", - "data_MosaicRestrictionTypeGT": ">", - "data_MosaicRestrictionTypeLE": "≤", - "data_MosaicRestrictionTypeLT": "<", - "data_MosaicRestrictionTypeNE": "≠", - "data_MosaicRestrictionTypeNONE": "No Restriction", - "data_delta_increase": "Increase by %{delta}", - "data_delta_decrease": "Decrease by %{delta}", - "data_delta_unchanged": "No change", - "receiptDescriptor_harvestingReward": "Harvesting Reward", - "transactionDescriptor_ethereum_1": "Transfer", - "transactionDescriptor_ethereum_2": "Transfer ERC-20 Token", - "transactionDescriptor_ethereum_3": "Bridge Swap", - "transactionDescriptor_ethereum_4": "Swap", - "transactionDescriptor_ethereum_5": "Approve", - "transactionDescriptor_symbol_16724": "Transfer", - "transactionDescriptor_symbol_16724_incoming": "Received", - "transactionDescriptor_symbol_16724_outgoing": "Sent", - "transactionDescriptor_symbol_16724_harvesting": "Harvesting Request", - "transactionDescriptor_symbol_16718": "Namespace registration", - "transactionDescriptor_symbol_16974": "Address alias", - "transactionDescriptor_symbol_17230": "Mosaic alias", - "transactionDescriptor_symbol_16717": "Mosaic definition", - "transactionDescriptor_symbol_16973": "Mosaic supply change", - "transactionDescriptor_symbol_17229": "Revoke", - "transactionDescriptor_symbol_16725": "Multisig account modification", - "transactionDescriptor_symbol_16705": "Aggregate complete", - "transactionDescriptor_symbol_16961": "Aggregate bonded", - "transactionDescriptor_symbol_16712": "Hash lock", - "transactionDescriptor_symbol_16722": "Secret lock", - "transactionDescriptor_symbol_16978": "Secret proof", - "transactionDescriptor_symbol_16720": "Account address restriction", - "transactionDescriptor_symbol_16976": "Account mosaic restriction", - "transactionDescriptor_symbol_17232": "Account operation restriction", - "transactionDescriptor_symbol_16716": "Account key link", - "transactionDescriptor_symbol_16977": "Mosaic address restriction", - "transactionDescriptor_symbol_16721": "Mosaic global restriction", - "transactionDescriptor_symbol_16708": "Account metadata", - "transactionDescriptor_symbol_16964": "Mosaic metadata", - "transactionDescriptor_symbol_17220": "Namespace metadata", - "transactionDescriptor_symbol_16963": "VRF key link", - "transactionDescriptor_symbol_16707": "Voting Key link", - "transactionDescriptor_symbol_16972": "Node Key link", - "transactionDescriptor_symbol_16974_unlink": "Address alias unlink", - "transactionDescriptor_symbol_17230_unlink": "Mosaic alias unlink", - "transactionDescriptor_symbol_16716_unlink": "Account key unlink", - "transactionDescriptor_symbol_16963_unlink": "VRF key unlink", - "transactionDescriptor_symbol_16707_unlink": "Voting Key unlink", - "transactionDescriptor_symbol_16972_unlink": "Node Key unlink", - "transactionDescriptor_postLaunchOptIn": "Opt-in", - "transactionDescriptor_swap": "Swap", - "transactionDescriptionShort_transferFrom": "From %{address}", - "transactionDescriptionShort_transferTo": "To %{address}", - "transactionDescriptionShort_transferIncoming": "Incoming transfer", - "transactionDescriptionShort_transferOutgoing": "Outgoing transfer", - "transactionDescriptionShort_transferIrrelevant": "Unknown", - "transactionDescriptionShort_aggregateMultiple": "%{type} and %{count} more", - "transactionDescriptionShort_aggregateHarvesting": "Harvesting configuration", - "transactionDescriptionShort_namespaceRegistration": "Register %{name}", - "transactionDescriptionShort_alias": "Link %{name} | to %{target}", - "transactionDescriptionShort_aliasUnlink": "Unlink %{name} | from %{target}", - "transactionDescriptionShort_mosaic": "Mosaic %{id}", - "transactionDescriptionShort_mosaicRestriction": "Mosaic %{id}", - "transactionDescriptionShort_hashLock": "Duration %{duration} blocks", - "transactionDescriptionShort_awaitingAccountSignature": "Awaiting your signature", - "transactionGroup_partial": "Pending Multisig", - "transactionGroup_unconfirmed": "Unconfirmed", - "transactionGroup_confirmed": "Confirmed", - "transactionGroup_harvested": "Harvested", - "transactionStatus_partial": "Partial", - "transactionStatus_unconfirmed": "Unconfirmed", - "transactionStatus_confirmed": "Confirmed", - "transactionStatus_failed": "Failed", - "transaction_from": "From", - "transaction_to": "To", - "transaction_awaitingConfirmation": "Until %{deadline}", - "c_accountCard_prompt_title": "Rename Account", - "c_accountCard_prompt_text": "New Account Name", - "c_accountCard_title_account": "Account", - "c_accountCard_title_balance": "Balance", - "c_accountCard_title_address": "Address", - "c_accountCard_button_accountDetails": "Details", - "c_accountCard_button_send": "Send", - "c_accountCard_button_receive": "Receive", - "c_accountCard_button_swap": "Swap", - "c_connectionStatus_offline": "No Internet connection.", - "c_connectionStatus_nodeDown": "Node is down. Please select different in the network settings.", - "c_connectionStatus_connected": "Connected.", - "c_connectionStatus_connecting": "Connecting...", - "c_scanner_title": "Scan Symbol QR-code", - "c_messageView_label_encrypted": "Encrypted Message", - "c_messageView_label_rawData": "Data", - "c_inputAmount_label_available": "Available", - "c_inputAmount_confirm_title": "Confirm Amount", - "c_inputAmount_confirm_text": "Are you sure you want to use the entire available amount?\n\nAvailable amount: %{amount}", - "c_transactionStatus_dialog_title": "Send Transaction", - "c_transactionStatus_transaction_text": "Transaction %{index}", - "c_transactionStatus_step_create": "Create Transaction", - "c_transactionStatus_step_sign": "Sign Transaction", - "c_transactionStatus_step_announce": "Send Transaction", - "c_transactionStatus_step_confirm": "Confirmation", - "c_transactionStatus_status_sending_title": "Please Wait", - "c_transactionStatus_status_sending_description": "Please do not close the app until the transaction has been sent.", - "c_transactionStatus_status_confirming_title": "Transaction Sent", - "c_transactionStatus_status_confirming_description": "Waiting for network confirmation. You can close this window or keep it open to watch the progress.", - "c_transactionStatus_status_partial_title": "Transaction Sent", - "c_transactionStatus_status_partial_description": "Waiting for signatures from other parties. You can close this window or keep it open to watch the progress.", - "c_transactionStatus_status_confirmed_title": "Success", - "c_transactionStatus_status_confirmed_description": "Transaction confirmed!", - "c_transactionStatus_status_createError_title": "Creation Failed", - "c_transactionStatus_status_createError_description": "Transaction could not be created", - "c_transactionStatus_status_signError_title": "Signing Failed", - "c_transactionStatus_status_signError_description": "Transaction was not signed", - "c_transactionStatus_status_announceError_title": "Transaction Failed", - "c_transactionStatus_status_announceError_description": "Transaction was not broadcasted to the network", - "c_transactionStatus_status_failedTransaction_title": "Transaction Failed", - "c_transactionStatus_status_failedTransaction_description": "Transaction was rejected by the network", - "c_bridgeTransactionStatus_step_create": "Create Transaction", - "c_bridgeTransactionStatus_step_sign": "Sign transaction %{count} • %{from} → %{to}", - "c_bridgeTransactionStatus_step_announce": "Send transaction %{count}", - "c_bridgeTransactionStatus_step_confirm": "Confirm transaction %{count}", - "c_bridgeTransactionStatus_status_unknown_title": "Something Went Wrong", - "c_bridgeTransactionStatus_status_unknown_description": "An unexpected error occurred. Please try again.", - "c_bridgeTransactionStatus_status_sending_title": "Please Wait", - "c_bridgeTransactionStatus_status_sending_description": "Your swap requires two transactions. Please keep the app open until both transactions are sent.", - "c_bridgeTransactionStatus_status_step_sending_description": "Sending the %{from} → %{to} swap request transaction. Please keep the app open until both transactions are sent.", - "c_bridgeTransactionStatus_status_createError_title": "Unable to Start Swap", - "c_bridgeTransactionStatus_status_createError_description": "We couldn't prepare the transaction. Please try again.", - "c_bridgeTransactionStatus_status_signError_title": "Signature Required", - "c_bridgeTransactionStatus_status_signError_description": "The %{from} → %{to} transaction was not signed. Please approve the transaction in your wallet to continue.", - "c_bridgeTransactionStatus_status_announceError_title": "Transaction Failed", - "c_bridgeTransactionStatus_status_announceError_description": "The %{from} → %{to} request transaction was not broadcasted to the network. Please try again.", - "c_bridgeTransactionStatus_status_failedTransaction_title": "Transaction Failed", - "c_bridgeTransactionStatus_status_failedTransaction_description": "The %{from} → %{to} request transaction was rejected by the network. No further steps will be executed.", - "c_bridgeTransactionStatus_status_confirming_title": "Transactions Sent", - "c_bridgeTransactionStatus_status_confirming_description": "Waiting for network confirmation. You can close this window or keep it open to watch the progress.", - "c_bridgeTransactionStatus_status_confirmed_title": "Success", - "c_bridgeTransactionStatus_status_confirmed_description": "Swap request transactions are confirmed. It may take some time for the bridge to process your request.", - "c_selectTransactionSender_currentAccount": "Current Account", - "c_selectTransactionSender_multisigAccount": "Multisig Account", - "c_selectTransactionSender_selectTitle": "Select Sender", - "s_home_updates": "Updates", - "s_home_widgets": "Widgets", - "s_history_widget_name": "New Transactions", - "s_history_filter_type": "Type", - "s_history_filter_from": "from", - "s_history_filter_to": "to", - "s_history_filter_harvested": "harvested", - "s_history_filter_blocked": "blocked", - "s_actions_title": "Wallet Features", - "s_actions_addressBook_title": "Address Book", - "s_actions_addressBook_description": "Save accounts for quick selection and easy recognition in transactions.", - "s_actions_harvesting_title": "Harvesting", - "s_actions_harvesting_description": "Participate in network block creation and earn XYM.", - "s_actions_send_title": "Send", - "s_actions_send_description": "Transfer tokens to another account on the network.", - "s_actions_createMosaic_title": "Create Mosaic", - "s_actions_createMosaic_description": "Create your own Symbol tokens and manage the ones you issued.", - "s_actions_bridge_title": "Network Bridge", - "s_actions_bridge_description": "Swap tokens between Symbol and supported external blockchains.", - "s_actions_multisig_title": "Multisig Account", - "s_actions_multisig_description": "Create and manage shared accounts controlled by multiple cosigners.", - "s_actions_bridgeAccounts_title": "Bridge Accounts", - "s_actions_bridgeAccounts_description": "View and manage your accounts on other blockchains used for bridge swaps.", - "s_transactionDetails_amount": "Amount", - "s_transactionDetails_status": "Status", - "s_transactionDetails_date": "Date", - "s_transactionDetails_cosignAlert_unknownAccount": "This transaction was initiated by an unknown account and is awaiting your signature. Carefully review all amounts and recipient addresses, as transactions cannot be reversed. If you trust the initiator and wish to continue, add the initiator to your address book whitelist. If the transaction appears suspicious, block the initiator.", - "s_transactionDetails_cosignAlert_trustedAccount": "This transaction is awaiting your signature. Carefully review all amounts and recipient addresses before proceeding, as transactions cannot be reversed. Only sign the transaction if you fully understand and approve its details.", - "s_transactionDetails_cosignAlert_blockedAccount": "The initiator of this transaction is currently blocked in your address book. Transactions from blocked accounts cannot be cosigned. If you trust this initiator and want to or sign the transaction, remove the account from your blacklist.", - "s_transactionDetails_cosignAlert_signed": "You have already signed this transaction, and it is now awaiting signatures from other required parties. Once all necessary co-signatures are collected, the transaction will be executed.", - "s_transactionDetails_cosignAlert_awaitingOtherSignatures": "This transaction is awaiting signatures from other required parties. Once all necessary co-signatures are collected, the transaction will be executed.", - "s_transactionDetails_safetyWarning_description": "This transaction performs a high-risk operation that can change account permissions or control. If misused, it may result in permanent loss of access to the account or loss of funds.", - "s_transactionDetails_cosignDialog_confirm_title": "Confirm Cosignature", - "s_transactionDetails_cosignDialog_confirm_text": "You are about to sign this transaction. Carefully review all amounts and recipient addresses before continuing, as transactions cannot be reversed.", - "s_transactionDetails_cosignDialog_success_title": "Transaction Cosigned", - "s_transactionDetails_cosignDialog_success_text": "You have successfully signed the transaction. It is now awaiting signatures from other required cosigners. Once all required signatures are collected, the transaction will be executed.", - "s_transactionDetails_amountBreakdown_title": "Amount Breakdown", - "s_send_description": "Send transfer transaction to an account. Type the recipient address or select one from the address book. Select the mosaic you would like to transfer and specify the amount. Note that some exchanges require a code to be sent in the message to make a deposit.", - "s_send_multisig_description": "If you need to send a transaction from a multisig account, select the address in the sender field.", - "s_send_title": "Transfer", - "s_send_from_title": "From", - "s_send_to_title": "To", - "s_send_token_title": "Token", - "s_send_message_title": "Message", - "form_transfer_input_amount": "Amount", - "form_input_addressOrPublicKey": "Address or Public Key", - "form_transfer_confirm_title": "Confirm Transfer", - "form_transfer_success_title": "Transaction announced", - "form_transfer_success_text": "Transaction is processing and awaiting confirmation by the network.", - "form_transfer_hash_lock_description": "Since you are sending a transaction from a multisig account, a hash lock transaction is required to secure the aggregate bonded transaction. You are about to lock the amount of %{lockedAmount} XYM for the duration of %{duration} blocks. The locked amount will be returned to your account once the aggregate bonded transaction is confirmed.", - "form_transfer_transaction_preview_title": "Transaction %{index} Review", - "selector_fee_fast": "Fast", - "selector_fee_medium": "Medium", - "selector_fee_slow": "Slow", - "s_scan_title": "QR Scanner", - "s_mosaicCreation_mosaic_title": "Mosaic", - "s_mosaicCreation_mosaic_description": "Mosaics are fixed assets that represent a set of multiple identical things that do not change. A mosaic can be what is conventionally called a token, but it can also be a collection of more specialized assets such as reward points, shares of stock, signatures, status flags, votes or other currencies, for example.", - "s_mosaicCreation_namespace_title": "Namespace", - "s_mosaicCreation_namespace_description": "Namespaces are human-readable text strings that can be used in place of a Mosaic ID. Namespaces function similarly to internet domains. Creating a namespace starts with choosing a name that you will use to refer to an asset. The name must be unique in the network, and has a maximum length of 64 characters (the only allowed characters are a through z, 0 through 9, _ and -).", - "s_mosaicCreation_sender_title": "Creator", - "s_mosaicCreation_divisibility_title": "Divisibility", - "s_mosaicCreation_divisibility_description": "Determines up to what decimal place the mosaic can be divided. A divisibility of 3 means the smallest fraction is 0.001. Allowed values are 0 to 6.", - "s_mosaicCreation_supply_title": "Supply", - "s_mosaicCreation_supply_description": "The number of mosaic units to create. If the supply mutable flag is set, the mosaic creator can change the supply at a later point.", - "s_mosaicCreation_supplyMutable_title": "Supply mutable", - "s_mosaicCreation_supplyMutable_checkbox": "Supply mutable", - "s_mosaicCreation_supplyMutable_description": "If set to true, the mosaic supply can change at a later point. In this case, the mosaic creator is allowed to redefine the total mosaic supply.", - "s_mosaicCreation_transferable_title": "Transferable", - "s_mosaicCreation_transferable_checkbox": "Transferable", - "s_mosaicCreation_transferable_description": "If set to true, the mosaic can be transferred between arbitrary accounts. Otherwise, the mosaic can only be transferred to or from the mosaic creator.", - "s_mosaicCreation_restrictable_title": "Restrictable", - "s_mosaicCreation_restrictable_checkbox": "Restrictable", - "s_mosaicCreation_restrictable_description": "If set to true, the mosaic creator can configure custom restrictions.", - "s_mosaicCreation_revokable_title": "Revokable", - "s_mosaicCreation_revokable_checkbox": "Revokable", - "s_mosaicCreation_revokable_description": "Mosaics can be revoked (i.e., reclaimed) by the mosaic creator when this flag is set to true.", - "s_mosaicCreation_duration_title": "Duration", - "s_mosaicCreation_duration_description": "Specify the number of confirmed blocks the mosaic is rented for. Expiring mosaics are allowed to lie in Symbol’s public network up to 3650 days (10 years).", - "s_mosaicCreation_duration_checkbox": "Never expire", - "s_mosaicCreation_durationDays": "~%{duration} days", - "s_mosaicCreation_confirm_title": "Confirm Transaction", - "s_mosaicCreation_confirm_text": "You are about to create a new mosaic with an initial supply of %{supply} and a divisibility of %{divisibility}.", - "s_mosaicCreation_quantity_title": "Quantity", - "s_mosaicCreation_quantity_description": "Setups the total amount of token to be issued and how many decimal places the token supports.", - "s_mosaicCreation_totalSupply_label": "Total supply", - "s_mosaicCreation_smallestSend_label": "Smallest you can send", - "s_mosaicCreation_smallestSend_whole": "(whole mosaics only)", - "s_mosaicCreation_decimalsNote": "Decimals are permanent. Supply can change later if you allow it.", - "s_mosaicCreation_decimalPlaces_label": "Decimal places", - "s_mosaicCreation_decimalsHint_whole": "= whole mosaics", - "s_mosaicCreation_decimalsHint": { + "fieldTitle_symbolSdkVersion": "Symbol SDK Version", + "fieldTitle_targetAddress": "Target Address", + "fieldTitle_targetMosaicId": "Target Mosaic Id", + "fieldTitle_targetMosaicName": "Target mosaic name", + "fieldTitle_targetNamespaceId": "Target Namespace Id", + "fieldTitle_token": "Token", + "fieldTitle_tokens": "Tokens", + "fieldTitle_transactionFee": "Transaction fee", + "fieldTitle_transactionHash": "Transaction Hash", + "fieldTitle_transactionInitiator": "Initiated / Signed By", + "fieldTitle_type": "Type", + "fieldTitle_valueSizeDelta": "Value Size Delta", + "fieldValue_AllowIncomingAddresses": "Allow Incoming Addresses", + "fieldValue_AllowMosaics": "Allow Mosaics", + "fieldValue_AllowOutgoingAddresses": "Allow Outgoing Addresses", + "fieldValue_AllowOutgoingTransactions": "Allow Outgoing Transactions", + "fieldValue_BlockIncomingAddresses": "Block Incoming Addresses", + "fieldValue_BlockMosaics": "Block Mosaics", + "fieldValue_BlockOutgoingAddresses": "Block Outgoing Addresses", + "fieldValue_BlockOutgoingTransactions": "Block Outgoing Transactions", + "fieldValue_Decrease": "Decrease", + "fieldValue_deltaDecrease": "Decrease by %{delta}", + "fieldValue_deltaIncrease": "Increase by %{delta}", + "fieldValue_deltaUnchanged": "No change", + "fieldValue_encrypted": "Encrypted", + "fieldValue_false": "No", + "fieldValue_Increase": "Increase", + "fieldValue_Link": "Link", + "fieldValue_MosaicRestrictionTypeEQ": "=", + "fieldValue_MosaicRestrictionTypeGE": "≥", + "fieldValue_MosaicRestrictionTypeGT": ">", + "fieldValue_MosaicRestrictionTypeLE": "≤", + "fieldValue_MosaicRestrictionTypeLT": "<", + "fieldValue_MosaicRestrictionTypeNE": "≠", + "fieldValue_MosaicRestrictionTypeNONE": "No Restriction", + "fieldValue_na": "N/A", + "fieldValue_RootNamespace": "Root namespace", + "fieldValue_SubNamespace": "Sub namespace", + "fieldValue_true": "Yes", + "fieldValue_unencrypted": "Unencrypted", + "fieldValue_unlimited": "UNLIMITED", + "fieldValue_Unlink": "Unlink", + "inputLabel_address": "Address", + "inputLabel_amount": "Amount", + "inputLabel_encrypted": "Encrypted", + "inputLabel_feeSpeed": "Speed/Fee", + "inputLabel_message": "Message/Memo", + "inputLabel_mnemonic": "Mnemonic Phrase", + "inputLabel_mosaic": "Mosaic", + "inputLabel_name": "Name", + "inputLabel_notes": "Notes", + "inputLabel_privateKey": "Private Key", + "inputLabel_recipient": "Recipient", + "message_emptyList": "Nothing to show", + "message_transactionConfirmed": "Transaction Confirmed", + "month_apr": "Apr", + "month_aug": "Aug", + "month_dec": "Dec", + "month_feb": "Feb", + "month_jan": "Jan", + "month_jul": "Jul", + "month_jun": "Jun", + "month_mar": "Mar", + "month_may": "May", + "month_nov": "Nov", + "month_oct": "Oct", + "month_sep": "Sep", + "receiptType_harvestingReward": "Harvesting Reward", + "receiptType_unknown": "Unknown", + "screen_account_alert_privateKeyWarning_description": "Please make sure that the private key is securely backed up and you will be able to access it. Note that this account cannot be restored from your mnemonic backup phrase.", + "screen_account_description_seedAccount": "You can select any of the accounts that have been generated from your mnemonic backup phrase (seed accounts). If you need to import an existing account using its private key, press the button below.", + "screen_account_dialog_importPrivateKey_description": "Add an existing account by importing its private key. This allows you to manage an account created outside of this wallet, generated by a different mnemonic backup phrase.", + "screen_account_dialog_importPrivateKey_title": "Import Account", + "screen_account_dialog_removeImportedAccount_description": "You are about to remove account \"%{name}\" %{address} from your wallet. Please make sure that the private key is securely backed up and you will be able to access it. Note that this account cannot be restored from your mnemonic backup phrase. You won't be able to access this account again unless you have its private key.", + "screen_account_dialog_removeImportedAccount_title": "Remove imported account", + "screen_account_title_accountInfo": "Details", + "screen_account_title_accountName": "Think of a Name", + "screen_account_title_seedAccount": "Seed Account %{index}", + "screen_account_title_selectAccount": "Select Account", + "screen_actions_item_addressBook_description": "Save accounts for quick selection and easy recognition in transactions.", + "screen_actions_item_addressBook_title": "Address Book", + "screen_actions_item_bridge_description": "Swap tokens between Symbol and supported external blockchains.", + "screen_actions_item_bridge_title": "Network Bridge", + "screen_actions_item_bridgeAccounts_description": "View and manage your accounts on other blockchains used for bridge swaps.", + "screen_actions_item_bridgeAccounts_title": "Bridge Accounts", + "screen_actions_item_createMosaic_description": "Create your own Symbol tokens and manage the ones you issued.", + "screen_actions_item_createMosaic_title": "Create Mosaic", + "screen_actions_item_harvesting_description": "Participate in network block creation and earn XYM.", + "screen_actions_item_harvesting_title": "Harvesting", + "screen_actions_item_multisig_description": "Create and manage shared accounts controlled by multiple cosigners.", + "screen_actions_item_multisig_title": "Multisig Account", + "screen_actions_item_send_description": "Transfer tokens to another account on the network.", + "screen_actions_item_send_title": "Send", + "screen_addressBook_contactDetails_alert_blacklist_description": "This account is currently on your blacklist. Transactions from this account will be hidden from your transaction history. You will also not be able to approve or cosign transactions initiated by this account.", + "screen_addressBook_description_createContact": "Add a new contact to your local address book to easily recognize and manage frequently used addresses. Configure its details below.", + "screen_addressBook_description_editContact": "Modify an existing contact in your local address book. Update its details as needed.", + "screen_addressBook_description_intro": "This screen shows all contacts stored locally in your wallet. Whitelisted contacts help you quickly recognize and select trusted addresses, while blacklisted contacts hide their transactions and restrict approvals.", + "screen_addressBook_manageContact_alert_blacklist_description": "This contact will be added to your blacklist. Transactions from this account will be hidden from your transaction history, and approving or cosigning transactions initiated by this account will be blocked.", + "screen_addressBook_manageContact_alert_whitelist_description": "This contact is whitelisted. You will be able to quickly select its address in transaction forms and see its name displayed throughout the wallet for easier identification.", + "screen_addressBook_tab_blacklist": "Blacklist", + "screen_addressBook_tab_whitelist": "Whitelist", + "screen_addressBook_title_blockedAccount": "Blocked", + "screen_addressBook_title_createContact": "Create Contact", + "screen_addressBook_title_editContact": "Edit Contact", + "screen_addressBook_title_intro": "Address Book", + "screen_addressBook_widget_title": "Address Book", + "screen_assets_alert_expirable_description": "This token is issued for a limited time. Once it reaches its expiration block height, it will no longer be available for sending.", + "screen_assets_alert_expired_description": "This token was issued for a limited time and has now reached its expiration date - the expiration block height. It is no longer available for sending.", + "screen_assets_chip_created": "Created", + "screen_assets_chip_expired": "Include Expired", + "screen_assets_title_bridgeAccounts": "Bridge Accounts", + "screen_assets_title_currentAccount": "Current Account", + "screen_assets_title_multisigAccounts": "Multisig Accounts", + "screen_bridge_description_history": "Your recent swap transactions will appear here. Please allow a few minutes after making a swap for the transaction to appear.", + "screen_bridge_description_intro": "Swap tokens across networks in one place, powered by a cross-chain bridge and Uniswap. Note: large swaps on some pairs can cause significant price impact — you may receive less than the current market rate. To minimize this, consider swapping a smaller amount.", + "screen_bridge_history_message_requestConfirmed": "Transaction was successfully sent to the Bridge. The status will be displayed in a few minutes, once the Bridge starts to work with your request.", + "screen_bridge_history_status_completed": "Completed", + "screen_bridge_history_status_failed": "Failed", + "screen_bridge_history_status_processing": "Processing", + "screen_bridge_history_status_sent": "Sent", + "screen_bridge_history_status_unprocessed": "Unprocessed", + "screen_bridge_message_historyPageSize": "Showing last %{size} swaps", + "screen_bridge_status_announceError_description": "The %{from} → %{to} request transaction was not broadcasted to the network. Please try again.", + "screen_bridge_status_announceError_title": "Transaction Failed", + "screen_bridge_status_confirmed_description": "Swap request transactions are confirmed. It may take some time for the bridge to process your request.", + "screen_bridge_status_confirmed_title": "Success", + "screen_bridge_status_confirming_description": "Waiting for network confirmation. You can close this window or keep it open to watch the progress.", + "screen_bridge_status_confirming_title": "Transactions Sent", + "screen_bridge_status_createError_description": "We couldn't prepare the transaction. Please try again.", + "screen_bridge_status_createError_title": "Unable to Start Swap", + "screen_bridge_status_failedTransaction_description": "The %{from} → %{to} request transaction was rejected by the network. No further steps will be executed.", + "screen_bridge_status_failedTransaction_title": "Transaction Failed", + "screen_bridge_status_sending_description": "Your swap requires two transactions. Please keep the app open until both transactions are sent.", + "screen_bridge_status_sending_title": "Please Wait", + "screen_bridge_status_sendingStep_description": "Sending the %{from} → %{to} swap request transaction. Please keep the app open until both transactions are sent.", + "screen_bridge_status_signError_description": "The %{from} → %{to} transaction was not signed. Please approve the transaction in your wallet to continue.", + "screen_bridge_status_signError_title": "Signature Required", + "screen_bridge_status_unknown_description": "An unexpected error occurred. Please try again.", + "screen_bridge_status_unknown_title": "Something Went Wrong", + "screen_bridge_step_announce": "Send transaction %{count}", + "screen_bridge_step_confirm": "Confirm transaction %{count}", + "screen_bridge_step_create": "Create Transaction", + "screen_bridge_step_sign": "Sign transaction %{count} • %{from} → %{to}", + "screen_bridge_summary_label_amountReceive": "You Receive", + "screen_bridge_summary_label_amountSend": "You Send", + "screen_bridge_summary_label_bridgeFee": "Operation Fee", + "screen_bridge_summary_label_priceImpact": "Price impact", + "screen_bridge_summary_label_priceImpactHigh": "High", + "screen_bridge_summary_label_priceImpactUnknown": "Unknown", + "screen_bridge_summary_label_priceImpactVeryHigh": "Very high", + "screen_bridge_summary_label_transactionFee": "Transaction Fee", + "screen_bridge_swap_dialog_confirm_description": "You are about to swap %{amount} %{sourceToken} on %{sourceChain} network for %{targetToken} on %{targetChain} network.", + "screen_bridge_swap_dialog_confirm_title": "Swap tokens?", + "screen_bridge_swap_dialog_disabled_description": "Bridge Swap is currently turned off by the bridge operator. Please try again later.", + "screen_bridge_swap_dialog_disabled_title": "Bridge Swap Unavailable", + "screen_bridge_swap_dialog_noPairs_description": "To use Bridge Swap, you need to have an account from another network added to your wallet. Proceed to add an account from another network to activate the Bridge Swap feature.", + "screen_bridge_swap_dialog_noPairs_title": "Activate Bridge Swap", + "screen_bridge_swap_dialog_priceImpact_description": "You will receive about %{priceImpact} less than the current pool rate, because of your trade size and low pool liquidity. Do you want to continue?", + "screen_bridge_swap_dialog_priceImpact_title": "Very high price difference", + "screen_bridge_swapDetails_title_statusTracking": "Status Tracking", + "screen_bridge_swapDetails_title_tokenReceive": "Token Receive", + "screen_bridge_swapDetails_title_tokenSend": "Token Send", + "screen_bridge_swapStatus_step_awaitingBridge": "Awaiting Bridge", + "screen_bridge_swapStatus_step_payoutConfirmation": "Receive", + "screen_bridge_swapStatus_step_payoutSend": "Swap Token", + "screen_bridge_swapStatus_step_requestSend": "Send", + "screen_bridge_title_history": "Recent History", + "screen_bridge_title_intro": "Network Bridge", + "screen_bridge_title_summary": "Summary", + "screen_bridge_title_tokens": "Tokens", + "screen_harvesting_description_intro": "Delegated Harvesting allows receiving rewards from creating new blocks using the account's importance score without running a node. To activate Delegated Harvesting you have to request a node to harvest for your account. If the pending status does not change to active within 2 minutes, please restart harvesting using another node.", + "screen_harvesting_dialog_startHarvesting_description": "Depending on your account's importance score and the node's free harvesting slots, your request might not be granted.\nAlso, please note that nodes may remove accounts from their harvesting slots at any time.\nIn these cases you need to switch to a different node and repeat the Delegated Harvesting activation process. Transaction fees paid for the activation will not be refunded.", + "screen_harvesting_dialog_startHarvesting_title": "Start Harvesting?", + "screen_harvesting_dialog_stopHarvesting_description": "Stopping this will cease the harvesting activity for your account on this node. You can restart the harvesting again at any time.", + "screen_harvesting_dialog_stopHarvesting_title": "Stop Harvesting?", + "screen_harvesting_label_harvested30days": "Last 30 days", + "screen_harvesting_label_harvestedBlock": "Latest harvested block", + "screen_harvesting_label_harvestedBlocks": "Blocks: %{count}", + "screen_harvesting_status_active": "Active", + "screen_harvesting_status_balanceWarning_description": "Insufficient balance: the account needs to hold at least 10 000 XYM to start delegated harvesting.", + "screen_harvesting_status_importanceWarning_description": "Your account has enough balance to start delegated harvesting but the importance score is still equal to 0. Importance recalculation might take up to 12h.", + "screen_harvesting_status_inactive": "Inactive", + "screen_harvesting_status_nodeDownWarning_description": "Looks like the harvesting node is down. Please check the status again later or restart the harvesting.", + "screen_harvesting_status_operator": "Node Operator", + "screen_harvesting_status_pending": "Pending", + "screen_harvesting_status_unknown": "Unknown", + "screen_harvesting_title_account": "Account", + "screen_harvesting_title_harvested": "Harvested", + "screen_harvesting_title_intro": "About Harvesting", + "screen_harvesting_title_manage": "Manage", + "screen_harvesting_title_status": "Status", + "screen_harvesting_widget_title": "Harvesting", + "screen_history_alert_safetyWarning_description": "This transaction performs a high-risk operation that can change account permissions or control. If misused, it may result in permanent loss of access to the account or loss of funds.", + "screen_history_chip_blocked": "blocked", + "screen_history_chip_from": "from", + "screen_history_chip_harvested": "harvested", + "screen_history_chip_to": "to", + "screen_history_chip_type": "Type", + "screen_history_cosign_alert_awaitingOtherSignatures_description": "This transaction is awaiting signatures from other required parties. Once all necessary co-signatures are collected, the transaction will be executed.", + "screen_history_cosign_alert_blockedAccount_description": "The initiator of this transaction is currently blocked in your address book. Transactions from blocked accounts cannot be cosigned. If you trust this initiator and want to sign the transaction, remove the account from your blacklist.", + "screen_history_cosign_alert_signed_description": "You have already signed this transaction, and it is now awaiting signatures from other required parties. Once all necessary co-signatures are collected, the transaction will be executed.", + "screen_history_cosign_alert_trustedAccount_description": "This transaction is awaiting your signature. Carefully review all amounts and recipient addresses before proceeding, as transactions cannot be reversed. Only sign the transaction if you fully understand and approve its details.", + "screen_history_cosign_alert_unknownAccount_description": "This transaction was initiated by an unknown account and is awaiting your signature. Carefully review all amounts and recipient addresses, as transactions cannot be reversed. If you trust the initiator and wish to continue, add the initiator to your address book whitelist. If the transaction appears suspicious, block the initiator.", + "screen_history_cosign_dialog_confirm_description": "You are about to sign this transaction. Carefully review all amounts and recipient addresses before continuing, as transactions cannot be reversed.", + "screen_history_cosign_dialog_confirm_title": "Confirm Cosignature", + "screen_history_cosign_dialog_success_description": "You have successfully signed the transaction. It is now awaiting signatures from other required cosigners. Once all required signatures are collected, the transaction will be executed.", + "screen_history_cosign_dialog_success_title": "Transaction Cosigned", + "screen_history_label_awaitingConfirmation": "Until %{deadline}", + "screen_history_title_amountBreakdown": "Amount Breakdown", + "screen_history_widget_title": "New Transactions", + "screen_home_button_accountDetails": "Details", + "screen_home_button_send": "Send", + "screen_home_button_swap": "Swap", + "screen_home_dialog_renameAccount_description": "New Account Name", + "screen_home_dialog_renameAccount_title": "Rename Account", + "screen_home_title_updates": "Updates", + "screen_home_title_widgets": "Widgets", + "screen_mosaic_checkbox_expires": "This mosaic expires", + "screen_mosaic_checkbox_restrictable": "Restrictable", + "screen_mosaic_checkbox_revokable": "Revokable", + "screen_mosaic_checkbox_supplyMutable": "Supply mutable", + "screen_mosaic_checkbox_transferable": "Transferable", + "screen_mosaic_chip_durationBlocks": "Exact Blocks", + "screen_mosaic_chip_durationDays": "Days", + "screen_mosaic_chip_durationHours": "Hours", + "screen_mosaic_chip_durationMinutes": "Minutes", + "screen_mosaic_chip_durationMonths": "Months", + "screen_mosaic_chip_durationYears": "Years", + "screen_mosaic_chip_expired": "Expired", + "screen_mosaic_chip_revokable": "Revokable", + "screen_mosaic_chip_supplyMutable": "Supply Mutable", + "screen_mosaic_create_dialog_confirm_description": "You are about to create a new mosaic with an initial supply of %{supply} and a divisibility of %{divisibility}.", + "screen_mosaic_create_dialog_confirm_title": "Confirm Transaction", + "screen_mosaic_createdList_description_intro": "Symbol tokens (mosaics) created by this account. Unlike your assets, they stay listed even when you hold none, so you can still change the supply or revoke units from holders.", + "screen_mosaic_createdList_title_intro": "Created Mosaics", + "screen_mosaic_description_duration": "Specify the number of confirmed blocks the mosaic is rented for. Expiring mosaics are allowed to live in Symbol’s public network for up to 3650 days (10 years).", + "screen_mosaic_description_expirationPermanent": "This mosaic never expires — its supply exists permanently.", + "screen_mosaic_description_mosaic": "Mosaics are fixed assets that represent a set of multiple identical things that do not change. A mosaic can be what is conventionally called a token, but it can also be a collection of more specialized assets such as reward points, shares of stock, signatures, status flags, votes or other currencies, for example.", + "screen_mosaic_description_quantity": "Sets the total amount of the token to be issued and how many decimal places the token supports.", + "screen_mosaic_description_restrictable": "If set to true, the mosaic creator can configure custom restrictions.", + "screen_mosaic_description_revokable": "Mosaics can be revoked (i.e., reclaimed) by the mosaic creator when this flag is set to true.", + "screen_mosaic_description_supplyMutable": "If set to true, the mosaic supply can change at a later point. In this case, the mosaic creator is allowed to redefine the total mosaic supply.", + "screen_mosaic_description_transferable": "If set to true, the mosaic can be transferred between arbitrary accounts. Otherwise, the mosaic can only be transferred to or from the mosaic creator.", + "screen_mosaic_hint_decimals": { "one": "= %{count} decimal", "other": "= %{count} decimals" }, - "s_mosaicCreation_namePlaceholder": "New Mosaic", - "s_mosaicCreation_flags_title": "Flags", - "s_mosaicCreation_duration_expiresCheckbox": "This mosaic expires", - "s_mosaicCreation_duration_blocksInputLabel": "Duration in blocks", - "s_mosaicCreation_expiration_title": "Mosaic expiration in", - "s_mosaicCreation_expiration_permanent": "This mosaic never expires — its supply exists permanently.", - "s_mosaicCreation_durationUnit_blocksChip": "Exact Blocks", - "s_mosaicCreation_durationUnit_minutes": "Minutes", - "s_mosaicCreation_durationUnit_hours": "Hours", - "s_mosaicCreation_durationUnit_days": "Days", - "s_mosaicCreation_durationUnit_months": "Months", - "s_mosaicCreation_durationUnit_years": "Years", - "s_mosaicCreation_durationAmount_blocks": { + "screen_mosaic_hint_decimalsPermanent": "Decimals are permanent. Supply can change later if you allow it.", + "screen_mosaic_hint_decimalsWhole": "= whole mosaics", + "screen_mosaic_inputLabel_durationBlocks": "Duration in blocks", + "screen_mosaic_label_currentSupply": "Current supply", + "screen_mosaic_label_decimalPlaces": "Decimal places", + "screen_mosaic_label_delta": "Change", + "screen_mosaic_label_durationBlocks": { "one": "%{value} block", "other": "%{value} blocks" }, - "s_mosaicCreation_durationAmount_minutes": { - "one": "%{count} minute", - "other": "%{count} minutes" + "screen_mosaic_label_durationDays": { + "one": "%{count} day", + "other": "%{count} days" }, - "s_mosaicCreation_durationAmount_hours": { + "screen_mosaic_label_durationHours": { "one": "%{count} hour", "other": "%{count} hours" }, - "s_mosaicCreation_durationAmount_days": { - "one": "%{count} day", - "other": "%{count} days" + "screen_mosaic_label_durationMinutes": { + "one": "%{count} minute", + "other": "%{count} minutes" }, - "s_mosaicCreation_durationAmount_months": { + "screen_mosaic_label_durationMonths": { "one": "%{count} month", "other": "%{count} months" }, - "s_mosaicCreation_durationAmount_years": { + "screen_mosaic_label_durationYears": { "one": "%{count} year", "other": "%{count} years" }, - "s_scan_mnemonic_description": "This QR-code contains mnemonic backup phrase. If you wish to import it, you should first logout from current wallet (Settings -> Logout).", - "s_scan_account_description": "This QR-code contains account. Please select an action below.", - "s_scan_account_wrongNetwork_description": "This QR-code contains account from different network. Please switch a network type in the Settings and try again.", - "s_scan_address_description": "This QR-code contains address. Please select an action below.", - "s_scan_address_wrongNetwork_description": "This QR-code contains address from different network. Please switch a network type in the Settings and try again.", - "s_scan_transaction_description": "This QR-code contains transaction request. Please select an action below.", - "s_scan_transaction_wrongTransaction_description": "This QR-code contains transaction request. Recipient address is from different network or mosaic is not XYM", - "s_scan_alert_noPermission_text": "Camera access is required to scan QR codes. Please enable camera permission in your device settings and try again.", - "s_scan_alert_noDevice_text": "No camera was detected on this device. Please ensure your device has a working camera and try again.", - "s_transportRequest_alert_parseError_text": "Unable to process the QR code: %{message}. Please make sure the QR code is valid and try again.", - "s_transportRequest_alert_chainNameMismatch_text": "This request is intended for a different blockchain. Please scan a QR code compatible with the currently selected chain.", - "s_transportRequest_alert_chainNameSupport_text": "The blockchain '%{chainName}' specified in this request is not supported by this application.", - "s_transportRequest_alert_chainNameActive_text": "This request targets the %{chainName} blockchain, but no active %{chainName} account is currently available in your wallet. Please activate %{chainName} account and try again.", - "s_transportRequest_alert_networkIdentifierMismatch_text": "Network mismatch. The request specifies %{requestNetwork}, but your wallet is currently connected to %{currentNetwork}. Please switch to the correct network in settings and try again.", - "s_transportRequest_alert_chainIdMismatch_text": "This request was created for a different chain ID. Please verify that you are connected to the correct network and try again.", - "s_transportRequest_details_request_title": "Transaction Request", - "s_transportRequest_details_share_title": "Shared Information", - "s_transportRequest_details_share_description": "The following details were shared via QR code.", - "s_transportRequest_actions_title": "Available Actions", - "s_transportRequest_suggestedActions_group": "Suggested", - "s_transportRequest_otherActions_group": "Other", - "s_transportRequest_action_addContact_title": "Add to Address Book", - "s_transportRequest_action_addContact_description": "Save this address to your address book.", - "s_transportRequest_action_fillTransferForm_title": "Send Transaction", - "s_transportRequest_action_fillTransferForm_description": "Fill the transfer form with the scanned transaction details.", - "s_transportRequest_action_fillTransferFormOnlyAddress_description": "Send transfer to this address. The recipient field in the transfer form will be pre-filled with the scanned address.", - "s_assets_section_currentAccount": "Current Account", - "s_assets_section_bridgeAccounts": "Bridge Accounts", - "s_assets_section_multisigAccounts": "Multisig Accounts", - "s_assets_item_id": "ID: %{id}", - "s_assets_item_linkedTo": "Linked to: %{id}", - "s_assets_item_notLinked": "Not linked", - "s_assets_item_expired": "Expired", - "s_assets_item_expireIn": "Expire %{inTime}", - "s_assets_filter_expired": "Include Expired", - "s_assets_filter_created": "Created", - "s_assetDetails_mosaic": "Mosaic", - "s_assetDetails_namespace": "Namespace", - "s_assetDetails_expired": "Expired (no longer available for sending)", - "s_assetDetails_expireInBlocks": "Expire in %{blocks} blocks", - "s_assetDetails_alert_expired_title": "Token Expired", - "s_assetDetails_alert_expired_description": "This token was issued for a limited time and has now reached its expiration date - the expiration block height. It is no longer available for sending.", - "s_assetDetails_alert_expirable_title": "Token Expirable", - "s_assetDetails_alert_expirable_description": "This token is issued for a limited time. Once it reaches its expiration block height, it will no longer be available for sending.", - "s_harvesting_title": "About Harvesting", - "s_harvesting_description": "Delegated Harvesting allows receiving rewards from creating new blocks using the account's importance score without running a node. To activate Delegated Harvesting you have to request a node to harvest for your account. If the pending status does not change to active within 2 minutes, please restart harvesting using another node", - "s_harvesting_status_unknown": "Unknown", - "s_harvesting_status_inactive": "Inactive", - "s_harvesting_status_pending": "Pending", - "s_harvesting_status_active": "Active", - "s_harvesting_status_operator": "Node Operator", - "s_harvesting_confirm_start_title": "Start Harvesting?", - "s_harvesting_confirm_start_description": "Depending on your account's importance score and the node's free harvesting slots, your request might not be granted.\nAlso, please note that nodes may remove accounts from their harvesting slots at any time.\nIn these cases you need to switch to a different node and repeat the Delegated Harvesting activation process. Transaction fees paid for the activation will not be refunded.", - "s_harvesting_confirm_stop_title": "Stop Harvesting?", - "s_harvesting_confirm_stop_description": "Stopping this will cease the harvesting activity for your account on this node. You can restart the harvesting again at any time.", - "s_harvesting_warning_balance": "Insufficient balance, the account needs to hold at least 10 000 XYM to start delegated harvesting.", - "s_harvesting_warning_importance": "Your account have enough balance to start delegated harvesting but the importance score is still equal to 0. Importance recalculation might take up to 12h.", - "s_harvesting_warning_node_down": "Looks like the harvesting node is down. Please check the status again later or restart the harvesting.", - "s_harvesting_harvested_title": "Harvested", - "s_harvesting_harvested_block_label": "Latest harvested block", - "s_harvesting_harvested_30days_label": "Last 30 days", - "s_harvesting_harvested_blocks": "Blocks: %{count}", - "s_harvesting_harvested_nothing_to_show": "Nothing to show", - "s_harvesting_manage_title": "Manage", - "s_harvesting_account_title": "Account", - "s_harvesting_status_title": "Status", - "s_bridge_title": "Network Bridge", - "s_bridge_description": "Swap tokens across networks in one place, powered by a cross-chain bridge and Uniswap. Note: large swaps on some pairs can cause significant price impact — you may receive less than the current market rate. To minimize this, consider swapping a smaller amount", - "s_bridge_history_title": "Recent History", - "s_bridge_history_description": "Your recent swap transactions will appear here. Please allow a few minutes after making a swap for the transaction to appear.", - "s_revoke_description": "Mosaic Supply Revocation allows to collect back mosaics that you created with the Revokable flag from the accounts that hold them.", - "s_revoke_alert_noHolders_description": "No other accounts currently hold this mosaic. There is nothing to revoke.", - "s_modifyMosaic_description": "Mosaic Supply Change allows to increase or decrease the total supply of a mosaic that you created with the Supply mutable flag.", - "s_modifyMosaic_currentSupply_label": "Current supply", - "s_modifyMosaic_newSupply_label": "New supply", - "s_modifyMosaic_delta_label": "Change", - "s_modifyMosaic_confirm_title": "Confirm Transaction", - "s_modifyMosaic_confirm_text": "You are about to change the total supply of this mosaic to %{supply}.", - "s_createdMosaicList_title": "Created Mosaics", - "s_createdMosaicList_description": "Symbol tokens (mosaics) created by this account. Unlike your assets, they stay listed even when you hold none, so you can still change the supply or revoke units from holders.", - "s_createdMosaicList_filter_revokable": "Revokable", - "s_createdMosaicList_filter_supplyMutable": "Supply Mutable", - "s_createdMosaicList_filter_expired": "Expired", - "s_accountDetails_accountInfo_title": "Details", - "s_accountList_confirm_removeImported_title": "Remove imported account", - "s_accountList_confirm_removeImported_body": "You are about to remove account \"%{name}\" %{address} from your wallet. Please make sure that the private key is securely backed up and you will be able to access it. Note that this account cannot be restored from you mnemonic backup phrase. You won't be able to access again this account unless you have its private key.", - "s_bridge_swap_dialog_confirm_title": "Swap tokens?", - "s_bridge_swap_dialog_confirm_text": "You are about to swap %{amount} %{sourceToken} on %{sourceChain} network for %{targetToken} on %{targetChain} network.", - "s_bridge_swap_dialog_noPairs_title": "Activate Bridge Swap", - "s_bridge_swap_dialog_noPairs_text": "To use Bridge Swap, you need to have account from another network added to your wallet. Proceed to add an account from another network to activate the Bridge Swap feature.", - "s_bridge_swap_dialog_disabled_title": "Bridge Swap Unavailable", - "s_bridge_swap_dialog_disabled_text": "Bridge Swap is currently turned off by the bridge operator. Please try again later.", - "s_bridge_summary_title": "Summary", - "s_bridge_summary_bridgeFee": "Operation Fee", - "s_bridge_summary_transactionFee": "Transaction Fee", - "s_bridge_summary_amountSend": "You Send", - "s_bridge_summary_amountReceive": "You Receive", - "s_bridge_summary_priceImpact": "Price impact", - "s_bridge_summary_priceImpact_unknown": "Unknown", - "s_bridge_summary_priceImpact_high": "High", - "s_bridge_summary_priceImpact_veryHigh": "Very high", - "s_bridge_swap_dialog_priceImpact_title": "Very high price difference", - "s_bridge_swap_dialog_priceImpact_text": "You will receive about {{priceImpact}} less than the current pool rate, because of your trade size and low pool liquidity. Do you want to continue?", - "s_bridge_history_requestTransactionConfirmed": "Transaction was successfully sent to the Bridge. The status will be displayed in a few minutes, once Bridge starts to work with your request", - "s_bridge_history_status_unprocessed": "Unprocessed", - "s_bridge_history_status_processing": "Processing", - "s_bridge_history_status_sent": "Sent", - "s_bridge_history_status_completed": "Completed", - "s_bridge_history_status_failed": "Failed", - "s_bridge_history_page_size_message": "Showing last %{size} swaps", - "s_bridge_swapStatus_step_requestSend": "Send", - "s_bridge_swapStatus_step_awaitingBridge": "Awaiting Bridge", - "s_bridge_swapStatus_step_payoutSend": "Swap Token", - "s_bridge_swapStatus_step_payoutConfirmation": "Receive", - "s_bridge_tokens_title": "Tokens", - "s_bridge_swapDetails_tokenSend_title": "Token Send", - "s_bridge_swapDetails_tokenReceive_title": "Token Receive", - "s_bridge_swapDetails_statusTracking_title": "Status Tracking", - "s_addAccount_seed_name_default": "Seed Account %{index}", - "s_addAccount_name_title": "Think of a Name", - "s_addAccount_name_input": "Name", - "s_addAccount_seed_description": "You can select any of account that have been generated from your mnemonic backup phrase (seed account). If you need to import an existing account using its private key, press the button below.", - "s_addAccount_select_title": "Select Account", - "s_addAccount_privateKey_dialog_title": "Import Account", - "s_addAccount_privateKey_dialog_description": "Add an existing account by importing its private key. This allows you to manage an account created outside of this wallet, generated by a different mnemonic backup phrase.", - "s_addAccount_privateKey_dialog_warning": "Please make sure that the private key is securely backed up and you will be able to access it. Note that this account cannot be restored from your mnemonic backup phrase.", - "s_addAccount_privateKey_input": "Private Key", - "s_addressBook_widget_name": "Address Book", - "s_addressBook_title": "Address Book", - "s_addressBook_description": "This screen shows all contacts stored locally in your wallet. Whitelisted contacts help you quickly recognize and select trusted addresses, while blacklisted contacts hide their transactions and restrict approvals.", - "s_addressBook_create_title": "Create Contact", - "s_addressBook_create_description": "Add a new contact to your local address book to easily recognize and manage frequently used addresses. Configure its details below.", - "s_addressBook_edit_title": "Edit Contact", - "s_addressBook_edit_description": "Modify an existing contact in your local address book. Update its details as needed.", - "s_addressBook_tab_whitelist": "Whitelist", - "s_addressBook_tab_blacklist": "Blacklist", - "s_addressBook_confirm_removeContact_title": "Remove contact", - "s_addressBook_confirm_removeContact_body": "Are you sure you want to remove contact \"%{name}\"?", - "s_addressBook_manageContact_alert_whitelist": "This contact is whitelisted. You will be able to quickly select its address in transaction forms and see its name displayed throughout the wallet for easier identification.", - "s_addressBook_manageContact_alert_blacklist": "This contact will be added to your blacklist. Transactions from this account will be hidden from your transaction history, and approving or cosigning transactions initiated by this account will be blocked.", - "s_addressBook_contactDetails_alert_blacklist": "This account is currently on your blacklist. Transactions from this account will be hidden from your transaction history. You will also not be able to approve or cosign transactions initiated by this account.", - "s_addressBook_account_blacklist_defaultName": "Blocked", - "s_welcome_wallet_title": "Welcome to\nSymbol Wallet!", - "s_welcome_modal_title": "Symbol Wallet", - "s_welcome_modal_tnc": "Terms and Conditions", - "s_welcome_modal_privacy": "Privacy Policy", - "s_importWallet_defaultAccountName": "My Account", - "s_importWallet_title": "Import Mnemonic Backup Phrase", - "s_importWallet_text": "Your secret backup phrase (mnemonic) makes it easy to back up and restore your wallet.", - "s_importWallet_loading_step1": "Importing mnemonic.", - "s_importWallet_loading_step2": "Setting up PIN-code.", - "s_importWallet_loading_step3": "Generating your account.", - "s_importWallet_loading_step4": "All done!", - "s_createWallet_defaultAccountName": "My Account", - "s_createWallet_accountName_title": "Name Your First Account", - "s_createWallet_accountName_text": "Enter a name that allows you to easily identify your account or use the default below. You can also change the name later.", - "s_createWallet_accountName_input": "Account Name", - "s_createWallet_mnemonic_title": "Secure your wallet", - "s_createWallet_mnemonic_text_p1": "Your secret backup phrase (mnemonic) makes it easy to back up and restore your wallet.", - "s_createWallet_mnemonic_text_p2": "WARNING: Never disclose your backup phrase. Anyone with this phrase can take your assets forever.", - "s_createWallet_mnemonic_text_p3": "If you lose your wallet backup information, no one (including Symbol Wallet) can recover it, and you will lose any funds that are managed by the wallet.", - "s_createWallet_tips_title": "Tips", - "s_createWallet_tips_text_p1": "Store this phrase in a password manager like 1Password.", - "s_createWallet_tips_text_p2": "Write this phrase on a piece of paper and store in a secure location. For additional security, write it down on multiple pieces of paper and store each in 2 - 3 different locations.", - "s_createWallet_confirm_title": "Confirm", - "s_createWallet_confirm_checkbox": "I accept the risk that if I lose the phrase my funds may be lost", - "s_createWallet_loading_step1": "Saving mnemonic.", - "s_createWallet_loading_step2": "Setting up PIN-code.", - "s_createWallet_loading_step3": "Generating your account.", - "s_createWallet_loading_step4": "All done!", - "s_multisig_widget_name": "My Multisig Accounts", - "s_multisig_defaultAccountName": "Multisig Account", - "s_multisig_tokens_title": "Tokens", - "s_multisig_multisigInfo_title": "Multisig Info", - "s_multisig_create_title": "Create Multisig Account", - "s_multisig_create_description": "A multisig account is managed by multiple cosigners and requires a set number of approvals to perform actions, increasing security and shared control. Here, you can create a new multisig account by selecting cosigners and defining the minimum approvals required.", - "s_multisig_modify_title": "Modify Multisig Account", - "s_multisig_modify_description": "Update the configuration of an existing multisig account.", - "s_multisig_cosignatory_title": "Cosigners", - "s_multisig_cosignatory_description": "Specify the accounts that will act as cosigners. These accounts share control and their approvals are required to perform actions.", - "s_multisig_approvals_title": "Approvals", - "s_multisig_approvals_description": "Set the number of cosigner approvals required for account actions. Minimum approval defines how many approvals are needed to authorize transactions or add a cosigner. Minimum removal defines how many approvals are required to remove a cosigner.", - "s_multisig_create_dialog_confirm_title": "Confirm Multisig Creation", - "s_multisig_create_dialog_confirm_text": "You are about to create a multisig account at %{address} with %{cosignatoriesCount} cosignatories.", - "s_multisig_modify_dialog_confirm_title": "Confirm Multisig Modification", - "s_multisig_modify_dialog_confirm_text": "You are about to update the multisig account at %{address}. It will have %{cosignatoriesCount} cosignatories.", - "s_multisig_create_dialog_addCosignatory_title": "Add Cosignatory", - "s_multisig_cosignatoryAlert_currentAccount_text": "The current account is not included in the cosigner list. As a result, it will lose control over the multisig account and will not be able to approve its transactions.", - "s_multisig_accountList_title": "My Multisig Accounts", - "s_multisig_accountList_description": "This list shows all multisig accounts managed by your account. Multisig accounts are controlled by multiple cosigners, and transactions require approval from a defined number of them. This provides enhanced security and enables shared control of funds.", - "s_passcode_verify_title": "Unlock the Wallet", - "s_passcode_verify_attempt_description": "%{attempts} attempts remaining", - "s_passcode_createEnter_title": "Create a PIN", - "s_passcode_createEnter_description": "Enter new PIN-code", - "s_passcode_createConfirm_title": "Confirm", - "s_passcode_createConfirm_description": "Enter PIN-code again", - "s_passcode_error_mismatch": "PIN codes do not match", - "s_passcode_error_incorrect": "Incorrect", - "s_passcode_error_maxAttempts_time_minutes": "Too many attempts. Please try again in %{count} minutes.", - "s_passcode_error_maxAttempts_time_minute": "Too many attempts. Please try again in 1 minute.", - "s_settings_item_network_title": "Network", - "s_settings_item_network_description": "Select network type and node you would like to connect to.", - "s_settings_item_language_title": "Language", - "s_settings_item_language_description": "Select language of the interface.", - "s_settings_item_security_title": "Security", - "s_settings_item_security_description": "Backup your passphrase and manage PIN code.", - "s_settings_item_about_title": "About", - "s_settings_item_about_description": "Learn morn about Symbol. Application version information.", - "s_settings_item_logout_title": "Logout", - "s_settings_item_logout_description": "Remove all accounts from device storage.", - "s_settings_network_select_title": "Select Network", - "s_settings_networkType_modal_title": "Network Type", - "s_settings_networkType_testnet": "Testnet", - "s_settings_networkType_mainnet": "Mainnet", - "s_settings_node_info_title": "Connected Node Info", - "s_settings_node_select_title": "Node", - "s_settings_node_automatically": "Select Automatically", - "s_settings_item_currency_title": "Currency", - "s_settings_item_currency_description": "Set your preferred local currency.", - "s_transactionRequest_title": "Transaction Request", - "s_transactionRequest_description": "A third-party service requests a transaction from your wallet. Please carefully review amounts and recipient addresses, as transactions are not reversible. Malicious transactions can result in a total loss of funds.", - "s_transactionRequest_error_title": "Error", - "s_transactionRequest_error_text": "Failed to read transaction details.", - "s_transactionRequest_supportedTypes_title": "Supported transaction types:", - "s_bridge_widget_name": "Network Bridge", - "warning_transactionRequest_networkType_title": "Wrong Network", - "warning_transactionRequest_networkType_body": "Please select a different network in settings.", - "warning_transactionRequest_transactionType_title": "Unsupported Type", - "warning_transactionRequest_transactionType_body": "The wallet does not support this transaction type.", - "settings_about_symbol_title": "About Symbol", - "settings_about_symbol_body": "Learn more about Symbol in the socials.", - "settings_about_version_title": "About App", - "settings_security_pin_toggle": "Enable PIN-code", - "settings_security_pin_title": "PIN-code", - "settings_security_pin_body": "Request PIN-code or Touch-ID to protect the wallet (only on this device).", - "settings_security_mnemonic_title": "Backup", - "settings_security_mnemonic_body": "Review backup mnemonic phrase. Mnemonic is a list of words which store all the information needed to recover the accounts under this profile. Anybody else who discovers the phrase can access your funds, so it must be kept safe. Note that you won't be able to access again your wallet unless you have a backup mnemonic phrase.", - "settings_logout_confirm_title": "Are you sure you want to logout?", - "settings_logout_confirm_text": "By logging out the data on the device will be removed. You won't be able to access again your wallet unless you have a backup mnemonic phrase. Please make sure you have a backup mnemonic phrase before proceeding.", - "validation_error_field_required": "Field required", - "validation_error_contact_name_long": "Too long", - "validation_error_account_name_long": "Too long", - "validation_error_key_length": "Key should be 64 char long", - "validation_error_mnemonic_invalid": "Invalid mnemonic pharase", - "validation_error_address_short": "Too short", - "validation_error_address_invalid": "Invalid address", - "validation_error_privateKey_invalid": "Invalid private key", - "validation_error_balance_not_enough": "Not enough balance", - "validation_error_amount_low": "Amount too low", - "validation_error_amount_transferLimit": "Exceeds transfer limit", - "validation_error_amount_dailyLimit": "Daily limit exceeded", - "validation_error_insufficientLiquidity": "Amount too high. Current max: {{maxAmount}} {{ticker}}", - "validation_error_insufficientLiquidity_generic": "Amount too high", - "validation_error_estimation_unavailable": "Can't estimate. Try again", - "validation_error_already_exists": "Already exists", - "validation_error_mosaic_supply_low": "Supply must be at least %{min}", - "validation_error_mosaic_supply_high": "Supply can't exceed %{max}", - "validation_error_mosaic_supply_decimals": "Up to %{divisibility} decimal places allowed", - "validation_error_mosaic_supply_whole": "Supply must be a whole number", - "validation_error_mosaic_supply_unchanged": "New supply must differ from the current supply", - "validation_error_mosaic_divisibility": "Should be a number from 0 to 6", - "validation_error_mosaic_duration_low": "Duration must be at least %{min} block", - "validation_error_mosaic_duration_high": "Duration can't exceed %{max} blocks (~10 years)", - "validation_error_mosaic_revoke_sender": "Can't revoke from the creator account", - "warning_multisig_title": "Multisig Account", - "warning_multisig_body": "To send transactions from this account, please announce it from cosignature account!", - "message_emptyList": "Nothing to show", - "message_downloaded": "Downloaded", - "message_transactionConfirmed": "Transaction Confirmed", - "message_newAggregateBondedTransaction": "Aggregate Bonded Transaction", - "error_failed_add_account_already_exists": "Account is already in the wallet", - "error_qr_failed_parse": "Failed to parse", - "error_qr_expected_type": "Wrong QR-code type", - "error_qr_unsupported": "Unsupported QR-code type", - "error_fetch_not_found": "Not found", - "error_fetch_account_info": "Failed to fetch account info", - "error_failed_save_accounts_incomplete": "Failed to save accounts", - "error_fetch_balance": "Failed to fetch balance", - "error_fetch_mosaic_infos": "Failed to fetch mosaic info", - "error_failed_write_file": "Failed to write file", - "error_permission_denied_write_storage": "Permission denied", - "error_fetch_rate_limit": "Too many requests", - "error_fetch_server_error": "Error occurred on the node side", - "error_failed_harvesting_wrong_node_network": "Failed. Wrong node.\nPlease use node from the current network", - "error_harvesting_no_keys_to_unlink": "The account has no harvesting keys to unlink", - "error_harvesting_account_no_activity": "Harvesting unavailable: this account has no activity on the network yet", - "error_Failure_Extension_Partial_Transaction_Cache_Prune": "Partial transaction is expired", - "error_Failure_Multisig_Operation_Prohibited_By_Account": "Operation prohibited", - "error_Failure_Mosaic_Expired": "Mosaic expired", - "error_unknown_account_name": "Address not found", - "transaction_confirm_title": "Confirm Transaction", - "transaction_success_title": "Transaction announced", - "transaction_success_text": "Transaction is processing and awaiting confirmation by the network." + "screen_mosaic_label_newSupply": "New supply", + "screen_mosaic_label_smallestSend": "Smallest you can send", + "screen_mosaic_label_totalSupply": "Total supply", + "screen_mosaic_label_wholeMosaicsOnly": "(whole mosaics only)", + "screen_mosaic_modify_description_intro": "Mosaic Supply Change allows you to increase or decrease the total supply of a mosaic that you created with the Supply mutable flag.", + "screen_mosaic_modify_dialog_confirm_description": "You are about to change the total supply of this mosaic to %{supply}.", + "screen_mosaic_modify_dialog_confirm_title": "Confirm Transaction", + "screen_mosaic_placeholder_name": "New Mosaic", + "screen_mosaic_revoke_alert_noHolders_description": "No other accounts currently hold this mosaic. There is nothing to revoke.", + "screen_mosaic_revoke_description_intro": "Mosaic Supply Revocation allows you to collect back mosaics that you created with the Revokable flag from the accounts that hold them.", + "screen_mosaic_revoke_title_from": "From", + "screen_mosaic_title_duration": "Duration", + "screen_mosaic_title_expiration": "Mosaic expiration in", + "screen_mosaic_title_flags": "Flags", + "screen_mosaic_title_mosaic": "Mosaic", + "screen_mosaic_title_quantity": "Quantity", + "screen_mosaic_title_restrictable": "Restrictable", + "screen_mosaic_title_revokable": "Revokable", + "screen_mosaic_title_sender": "Creator", + "screen_mosaic_title_supplyMutable": "Supply mutable", + "screen_mosaic_title_transferable": "Transferable", + "screen_multisig_accountList_description_intro": "This list shows all multisig accounts managed by your account. Multisig accounts are controlled by multiple cosigners, and transactions require approval from a defined number of them. This provides enhanced security and enables shared control of funds.", + "screen_multisig_accountList_title_intro": "My Multisig Accounts", + "screen_multisig_alert_currentAccountWarning_description": "The current account is not included in the cosigner list. As a result, it will lose control over the multisig account and will not be able to approve its transactions.", + "screen_multisig_create_description_intro": "A multisig account is managed by multiple cosigners and requires a set number of approvals to perform actions, increasing security and shared control. Here, you can create a new multisig account by selecting cosigners and defining the minimum approvals required.", + "screen_multisig_create_dialog_confirm_description": "You are about to create a multisig account at %{address} with %{cosignatoriesCount} cosignatories.", + "screen_multisig_create_dialog_confirm_title": "Confirm Multisig Creation", + "screen_multisig_create_title_intro": "Create Multisig Account", + "screen_multisig_description_approvals": "Set the number of cosigner approvals required for account actions. Minimum approval defines how many approvals are needed to authorize transactions or add a cosigner. Minimum removal defines how many approvals are required to remove a cosigner.", + "screen_multisig_description_cosignatory": "Specify the accounts that will act as cosigners. These accounts share control and their approvals are required to perform actions.", + "screen_multisig_description_hashLock": "Since you are sending a transaction from a multisig account, a hash lock transaction is required to secure the aggregate bonded transaction. You are about to lock the amount of %{lockedAmount} XYM for the duration of %{duration} blocks. The locked amount will be returned to your account once the aggregate bonded transaction is confirmed.", + "screen_multisig_dialog_addCosignatory_title": "Add Cosignatory", + "screen_multisig_modify_description_intro": "Update the configuration of an existing multisig account.", + "screen_multisig_modify_dialog_confirm_description": "You are about to update the multisig account at %{address}. It will have %{cosignatoriesCount} cosignatories.", + "screen_multisig_modify_dialog_confirm_title": "Confirm Multisig Modification", + "screen_multisig_modify_title_intro": "Modify Multisig Account", + "screen_multisig_title_approvals": "Approvals", + "screen_multisig_title_cosignatory": "Cosigners", + "screen_multisig_title_defaultAccountName": "Multisig Account", + "screen_multisig_title_multisigInfo": "Multisig Info", + "screen_multisig_title_tokens": "Tokens", + "screen_multisig_widget_title": "My Multisig Accounts", + "screen_onboarding_checkbox_acceptRisk": "I accept the risk that if I lose the phrase my funds may be lost", + "screen_onboarding_description_accountName": "Enter a name that allows you to easily identify your account or use the default below. You can also change the name later.", + "screen_onboarding_dialog_termsAndPrivacy_title": "Symbol Wallet", + "screen_onboarding_importWallet_description_intro": "Your secret backup phrase (mnemonic) makes it easy to back up and restore your wallet.", + "screen_onboarding_importWallet_title_intro": "Import Mnemonic Backup Phrase", + "screen_onboarding_inputLabel_accountName": "Account Name", + "screen_onboarding_loading_step_done": "All done!", + "screen_onboarding_loading_step_generateAccount": "Generating your account.", + "screen_onboarding_loading_step_importMnemonic": "Importing mnemonic.", + "screen_onboarding_loading_step_saveMnemonic": "Saving mnemonic.", + "screen_onboarding_loading_step_setUpPin": "Setting up PIN-code.", + "screen_onboarding_mnemonic_description_backupAndRestore": "Your secret backup phrase (mnemonic) makes it easy to back up and restore your wallet.", + "screen_onboarding_mnemonic_description_neverDisclose": "WARNING: Never disclose your backup phrase. Anyone with this phrase can take your assets forever.", + "screen_onboarding_mnemonic_description_noRecovery": "If you lose your wallet backup information, no one (including Symbol Wallet) can recover it, and you will lose any funds that are managed by the wallet.", + "screen_onboarding_tips_description_paper": "Write this phrase on a piece of paper and store it in a secure location. For additional security, write it down on multiple pieces of paper and store each in 2 - 3 different locations.", + "screen_onboarding_tips_description_passwordManager": "Store this phrase in a password manager like 1Password.", + "screen_onboarding_title_accountName": "Name Your First Account", + "screen_onboarding_title_confirm": "Confirm", + "screen_onboarding_title_defaultAccountName": "My Account", + "screen_onboarding_title_mnemonic": "Secure your wallet", + "screen_onboarding_title_privacyPolicy": "Privacy Policy", + "screen_onboarding_title_termsAndConditions": "Terms and Conditions", + "screen_onboarding_title_tips": "Tips", + "screen_onboarding_title_welcome": "Welcome to\nSymbol Wallet!", + "screen_send_description_hashLock": "Since you are sending a transaction from a multisig account, a hash lock transaction is required to secure the aggregate bonded transaction. You are about to lock the amount of %{lockedAmount} XYM for the duration of %{duration} blocks. The locked amount will be returned to your account once the aggregate bonded transaction is confirmed.", + "screen_send_description_intro": "Send a transfer transaction to an account. Type the recipient address or select one from the address book. Select the mosaic you would like to transfer and specify the amount. Note that some exchanges require a code to be sent in the message to make a deposit.", + "screen_send_title_from": "From", + "screen_send_title_intro": "Transfer", + "screen_send_title_message": "Message", + "screen_send_title_to": "To", + "screen_send_title_token": "Token", + "screen_settings_checkbox_enablePin": "Enable PIN-code", + "screen_settings_description_aboutSymbol": "Learn more about Symbol in the socials.", + "screen_settings_description_securityMnemonic": "Review your backup mnemonic phrase. Mnemonic is a list of words which stores all the information needed to recover the accounts under this profile. Anybody else who discovers the phrase can access your funds, so it must be kept safe. Note that you won't be able to access your wallet again unless you have a backup mnemonic phrase.", + "screen_settings_description_securityPin": "Request PIN-code or Touch-ID to protect the wallet (only on this device).", + "screen_settings_dialog_logoutConfirm_description": "By logging out, the data on the device will be removed. You won't be able to access your wallet again unless you have a backup mnemonic phrase. Please make sure you have a backup mnemonic phrase before proceeding.", + "screen_settings_dialog_logoutConfirm_title": "Are you sure you want to logout?", + "screen_settings_inputLabel_networkType": "Network Type", + "screen_settings_inputLabel_node": "Node", + "screen_settings_item_about_description": "Learn more about Symbol. Application version information.", + "screen_settings_item_about_title": "About", + "screen_settings_item_currency_description": "Set your preferred local currency.", + "screen_settings_item_currency_title": "Currency", + "screen_settings_item_language_description": "Select the language of the interface.", + "screen_settings_item_language_title": "Language", + "screen_settings_item_logout_description": "Remove all accounts from device storage.", + "screen_settings_item_logout_title": "Logout", + "screen_settings_item_mainnet": "Mainnet", + "screen_settings_item_network_description": "Select network type and node you would like to connect to.", + "screen_settings_item_network_title": "Network", + "screen_settings_item_nodeAutomatic": "Select Automatically", + "screen_settings_item_security_description": "Back up your passphrase and manage the PIN code.", + "screen_settings_item_security_title": "Security", + "screen_settings_item_testnet": "Testnet", + "screen_settings_title_aboutApp": "About App", + "screen_settings_title_aboutSymbol": "About Symbol", + "screen_settings_title_nodeInfo": "Connected Node Info", + "screen_settings_title_securityMnemonic": "Backup", + "screen_settings_title_securityPin": "PIN-code", + "screen_settings_title_selectNetwork": "Select Network", + "screen_transport_alert_chainIdMismatch_description": "This request was created for a different chain ID. Please verify that you are connected to the correct network and try again.", + "screen_transport_alert_chainNameActive_description": "This request targets the %{chainName} blockchain, but no active %{chainName} account is currently available in your wallet. Please activate a %{chainName} account and try again.", + "screen_transport_alert_chainNameSupport_description": "The blockchain '%{chainName}' specified in this request is not supported by this application.", + "screen_transport_alert_networkIdentifierMismatch_description": "Network mismatch. The request specifies %{requestNetwork}, but your wallet is currently connected to %{currentNetwork}. Please switch to the correct network in settings and try again.", + "screen_transport_alert_noDevice_description": "No camera was detected on this device. Please ensure your device has a working camera and try again.", + "screen_transport_alert_noPermission_description": "Camera access is required to scan QR codes. Please enable camera permission in your device settings and try again.", + "screen_transport_alert_parseError_description": "Unable to process the QR code: %{message}. Please make sure the QR code is valid and try again.", + "screen_transport_description_sharedInformation": "The following details were shared via QR code.", + "screen_transport_item_addContact_description": "Save this address to your address book.", + "screen_transport_item_addContact_title": "Add to Address Book", + "screen_transport_item_fillTransferForm_description": "Fill the transfer form with the scanned transaction details.", + "screen_transport_item_fillTransferForm_title": "Send Transaction", + "screen_transport_item_fillTransferFormOnlyAddress_description": "Send transfer to this address. The recipient field in the transfer form will be pre-filled with the scanned address.", + "screen_transport_title_actions": "Available Actions", + "screen_transport_title_otherActions": "Other", + "screen_transport_title_requestDetails": "Transaction Request", + "screen_transport_title_sharedInformation": "Shared Information", + "screen_transport_title_suggestedActions": "Suggested", + "screenTitle_AccountDetails": "Account Details", + "screenTitle_AccountList": "Account List", + "screenTitle_Actions": "Actions", + "screenTitle_AddSeedAccount": "Add Account", + "screenTitle_Assets": "Assets", + "screenTitle_BridgeAccountDetails": "Bridge Account Details", + "screenTitle_BridgeAccountList": "Your Bridge Accounts", + "screenTitle_BridgeSwap": "Swap Tokens", + "screenTitle_BridgeSwapDetails": "Swap Details", + "screenTitle_ContactDetails": "Contact Details", + "screenTitle_ContactList": "Address Book", + "screenTitle_CreateContact": "Create Contact", + "screenTitle_CreatedMosaicList": "Created Mosaics", + "screenTitle_CreateMosaic": "Create Mosaic", + "screenTitle_CreateMultisigAccount": "Create Account", + "screenTitle_CreateWallet": "Create Wallet", + "screenTitle_EditContact": "Edit Contact", + "screenTitle_Harvesting": "Harvesting", + "screenTitle_History": "History", + "screenTitle_Home": "Home", + "screenTitle_ImportWallet": "Import Wallet", + "screenTitle_ModifyMosaic": "Modify Mosaic", + "screenTitle_ModifyMultisigAccount": "Modify Account", + "screenTitle_MultisigAccountDetails": "Account Details", + "screenTitle_MultisigAccountList": "Multisig Accounts", + "screenTitle_RevokeMosaic": "Revoke Mosaic", + "screenTitle_Scan": "Scan", + "screenTitle_Send": "Send", + "screenTitle_Settings": "Settings", + "screenTitle_SettingsAbout": "About", + "screenTitle_SettingsNetwork": "Network", + "screenTitle_SettingsSecurity": "Security", + "screenTitle_TokenDetails": "Token Details", + "screenTitle_TransactionDetails": "Transaction Details", + "screenTitle_TransportRequest": "Transaction Request", + "screenTitle_Welcome": "Welcome", + "transactionDescriptionShort_aggregateHarvesting": "Harvesting configuration", + "transactionDescriptionShort_aggregateMultiple": "%{type} and %{count} more", + "transactionDescriptionShort_alias": "Link %{name} | to %{target}", + "transactionDescriptionShort_aliasUnlink": "Unlink %{name} | from %{target}", + "transactionDescriptionShort_awaitingAccountSignature": "Awaiting your signature", + "transactionDescriptionShort_hashLock": "Duration %{duration} blocks", + "transactionDescriptionShort_mosaic": "Mosaic %{id}", + "transactionDescriptionShort_mosaicRestriction": "Mosaic %{id}", + "transactionDescriptionShort_namespaceRegistration": "Register %{name}", + "transactionDescriptionShort_transferFrom": "From %{address}", + "transactionDescriptionShort_transferIncoming": "Incoming transfer", + "transactionDescriptionShort_transferIrrelevant": "Unknown", + "transactionDescriptionShort_transferOutgoing": "Outgoing transfer", + "transactionDescriptionShort_transferTo": "To %{address}", + "transactionGroup_confirmed": "Confirmed", + "transactionGroup_harvested": "Harvested", + "transactionGroup_partial": "Pending Multisig", + "transactionGroup_unconfirmed": "Unconfirmed", + "transactionStatus_confirmed": "Confirmed", + "transactionStatus_failed": "Failed", + "transactionStatus_partial": "Partial", + "transactionStatus_unconfirmed": "Unconfirmed", + "transactionType_accountAddressRestriction": "Account address restriction", + "transactionType_accountKeyLink": "Account key link", + "transactionType_accountMetadata": "Account metadata", + "transactionType_accountMosaicRestriction": "Account mosaic restriction", + "transactionType_accountOperationRestriction": "Account operation restriction", + "transactionType_addressAlias": "Address alias", + "transactionType_aggregateBonded": "Aggregate bonded", + "transactionType_aggregateComplete": "Aggregate complete", + "transactionType_erc20Approve": "Approve", + "transactionType_erc20BridgeTransfer": "Bridge Swap", + "transactionType_erc20Transfer": "Transfer ERC-20 Token", + "transactionType_harvestingRequest": "Harvesting Request", + "transactionType_hashLock": "Hash lock", + "transactionType_mosaicAddressRestriction": "Mosaic address restriction", + "transactionType_mosaicAlias": "Mosaic alias", + "transactionType_mosaicDefinition": "Mosaic definition", + "transactionType_mosaicGlobalRestriction": "Mosaic global restriction", + "transactionType_mosaicMetadata": "Mosaic metadata", + "transactionType_mosaicSupplyChange": "Mosaic supply change", + "transactionType_mosaicSupplyRevocation": "Revoke", + "transactionType_multisigAccountModification": "Multisig account modification", + "transactionType_namespaceMetadata": "Namespace metadata", + "transactionType_namespaceRegistration": "Namespace registration", + "transactionType_nodeKeyLink": "Node Key link", + "transactionType_secretLock": "Secret lock", + "transactionType_secretProof": "Secret proof", + "transactionType_swap": "Swap", + "transactionType_transfer": "Transfer", + "transactionType_transferIncoming": "Received", + "transactionType_transferOutgoing": "Sent", + "transactionType_uniswapSwap": "Swap", + "transactionType_unknown": "Unknown", + "transactionType_votingKeyLink": "Voting Key link", + "transactionType_vrfKeyLink": "VRF key link", + "validationError_accountNameLong": "Too long", + "validationError_addressInvalid": "Invalid address", + "validationError_alreadyExists": "Already exists", + "validationError_amountDailyLimit": "Daily limit exceeded", + "validationError_amountLow": "Amount too low", + "validationError_amountTransferLimit": "Exceeds transfer limit", + "validationError_balanceNotEnough": "Not enough balance", + "validationError_estimationUnavailable": "Can't estimate. Try again", + "validationError_fieldRequired": "Field required", + "validationError_insufficientLiquidity": "Amount too high. Current max: %{maxAmount} %{ticker}", + "validationError_insufficientLiquidityGeneric": "Amount too high", + "validationError_mnemonicInvalid": "Invalid mnemonic phrase", + "validationError_mosaicDurationHigh": "Duration can't exceed %{max} blocks (~10 years)", + "validationError_mosaicDurationLow": "Duration must be at least %{min} block", + "validationError_mosaicRevokeSender": "Can't revoke from the creator account", + "validationError_mosaicSupplyDecimals": "Up to %{divisibility} decimal places allowed", + "validationError_mosaicSupplyHigh": "Supply can't exceed %{max}", + "validationError_mosaicSupplyLow": "Supply must be at least %{min}", + "validationError_mosaicSupplyUnchanged": "New supply must differ from the current supply", + "validationError_mosaicSupplyWhole": "Supply must be a whole number", + "validationError_privateKeyInvalid": "Invalid private key" } diff --git a/wallet/symbol/mobile/src/router/RouterView.jsx b/wallet/symbol/mobile/src/router/RouterView.jsx index de8e406b32..0285f4eb14 100644 --- a/wallet/symbol/mobile/src/router/RouterView.jsx +++ b/wallet/symbol/mobile/src/router/RouterView.jsx @@ -35,7 +35,7 @@ const screenOptions = ({ route }) => ({ }, headerTintColor: HEADER_TINT_COLOR, headerTitleStyle: HEADER_TITLE_TEXT, - title: $t(`screen_${route.name}`) + title: $t(`screenTitle_${route.name}`) }); const linkingOptions = { diff --git a/wallet/symbol/mobile/src/screens/account/AccountDetails.jsx b/wallet/symbol/mobile/src/screens/account/AccountDetails.jsx index e99296f8d2..0943023faa 100644 --- a/wallet/symbol/mobile/src/screens/account/AccountDetails.jsx +++ b/wallet/symbol/mobile/src/screens/account/AccountDetails.jsx @@ -119,7 +119,7 @@ export const AccountDetails = () => { - {$t('s_accountDetails_accountInfo_title')} + {$t('screen_account_title_accountInfo')} @@ -157,7 +157,7 @@ export const AccountDetails = () => { diff --git a/wallet/symbol/mobile/src/screens/account/AccountList.jsx b/wallet/symbol/mobile/src/screens/account/AccountList.jsx index 3b0f9060b7..2449fe7147 100644 --- a/wallet/symbol/mobile/src/screens/account/AccountList.jsx +++ b/wallet/symbol/mobile/src/screens/account/AccountList.jsx @@ -127,8 +127,8 @@ export const AccountList = () => { /> $t('s_addAccount_seed_name_default', { index }); +const getDefaultAccountName = index => $t('screen_account_title_seedAccount', { index }); /** * AddSeedAccount screen component. Allows users to add a new seed account @@ -81,20 +81,20 @@ export const AddSeedAccount = () => { // Render const renderHeader = () => ( - {$t('s_addAccount_name_title')} + {$t('screen_account_title_accountName')} - {$t('s_addAccount_seed_description')} + {$t('screen_account_description_seedAccount')} - {$t('s_addAccount_select_title')} + {$t('screen_account_title_selectAccount')} ); @@ -131,7 +131,7 @@ export const AddSeedAccount = () => { { > - {$t('s_addAccount_privateKey_dialog_description')} + {$t('screen_account_dialog_importPrivateKey_description')} { - + {name} - + {!!isBalanceChangeVisible && ( @@ -148,7 +148,7 @@ export const AccountCard = props => { - + {address} diff --git a/wallet/symbol/mobile/src/screens/actions/Actions.jsx b/wallet/symbol/mobile/src/screens/actions/Actions.jsx index 24b9477f59..29b462f6c5 100644 --- a/wallet/symbol/mobile/src/screens/actions/Actions.jsx +++ b/wallet/symbol/mobile/src/screens/actions/Actions.jsx @@ -22,48 +22,48 @@ export const Actions = () => { /** @type {ActionItem[]} */ const actionItems = useMemo(() => [ { - title: $t('s_actions_addressBook_title'), - description: $t('s_actions_addressBook_description'), + title: $t('screen_actions_item_addressBook_title'), + description: $t('screen_actions_item_addressBook_description'), imageSource: require('@/app/assets/images/art/address-book.png'), onPress: Router.goToContactList }, { - title: $t('s_actions_harvesting_title'), - description: $t('s_actions_harvesting_description'), + title: $t('screen_actions_item_harvesting_title'), + description: $t('screen_actions_item_harvesting_description'), imageSource: require('@/app/assets/images/art/harvesting.png'), isDisabled: isMultisigAccount, onPress: Router.goToHarvesting }, { - title: $t('s_actions_multisig_title'), - description: $t('s_actions_multisig_description'), + title: $t('screen_actions_item_multisig_title'), + description: $t('screen_actions_item_multisig_description'), imageSource: require('@/app/assets/images/art/multisig-chest.png'), isDisabled: isMultisigAccount, onPress: Router.goToMultisigAccountList }, { - title: $t('s_actions_bridgeAccounts_title'), - description: $t('s_actions_bridgeAccounts_description'), + title: $t('screen_actions_item_bridgeAccounts_title'), + description: $t('screen_actions_item_bridgeAccounts_description'), imageSource: require('@/app/assets/images/art/external-accounts.png'), onPress: Router.goToBridgeAccountList }, { - title: $t('s_actions_send_title'), - description: $t('s_actions_send_description'), + title: $t('screen_actions_item_send_title'), + description: $t('screen_actions_item_send_description'), imageSource: require('@/app/assets/images/art/ship.png'), isDisabled: isMultisigAccount, onPress: Router.goToSend }, { - title: $t('s_actions_createMosaic_title'), - description: $t('s_actions_createMosaic_description'), + title: $t('screen_actions_item_createMosaic_title'), + description: $t('screen_actions_item_createMosaic_description'), imageSource: require('@/app/assets/images/art/mosaic-puzzle.png'), isDisabled: isMultisigAccount, onPress: Router.goToCreatedMosaicList }, { - title: $t('s_actions_bridge_title'), - description: $t('s_actions_bridge_description'), + title: $t('screen_actions_item_bridge_title'), + description: $t('screen_actions_item_bridge_description'), imageSource: require('@/app/assets/images/art/bridge.png'), isDisabled: isMultisigAccount, onPress: Router.goToBridgeSwap diff --git a/wallet/symbol/mobile/src/screens/address-book/ContactList.jsx b/wallet/symbol/mobile/src/screens/address-book/ContactList.jsx index e30086e94a..5835579f4b 100644 --- a/wallet/symbol/mobile/src/screens/address-book/ContactList.jsx +++ b/wallet/symbol/mobile/src/screens/address-book/ContactList.jsx @@ -43,10 +43,10 @@ export const ContactList = () => { - {$t('s_addressBook_title')} + {$t('screen_addressBook_title_intro')} - {$t('s_addressBook_description')} + {$t('screen_addressBook_description_intro')} { - const defaultBlacklistContactName = $t('s_addressBook_account_blacklist_defaultName'); + const defaultBlacklistContactName = $t('screen_addressBook_title_blockedAccount'); const { listType: initialListType, @@ -91,10 +91,10 @@ export const CreateContact = ({ route }) => { - {$t('s_addressBook_create_title')} + {$t('screen_addressBook_title_createContact')} - {$t('s_addressBook_create_description')} + {$t('screen_addressBook_description_createContact')} { { - const defaultBlacklistContactName = $t('s_addressBook_account_blacklist_defaultName'); + const defaultBlacklistContactName = $t('screen_addressBook_title_blockedAccount'); const { contactId } = route.params; const walletController = useWalletController(); @@ -86,10 +86,10 @@ export const EditContact = ({ route }) => { - {$t('s_addressBook_edit_title')} + {$t('screen_addressBook_title_editContact')} - {$t('s_addressBook_edit_description')} + {$t('screen_addressBook_description_editContact')} { { if (listType === ContactListType.WHITELIST) { return { isVisible: true, - text: $t('s_addressBook_manageContact_alert_whitelist'), + text: $t('screen_addressBook_manageContact_alert_whitelist_description'), variant: 'success' }; } return { isVisible: true, - text: $t('s_addressBook_manageContact_alert_blacklist'), + text: $t('screen_addressBook_manageContact_alert_blacklist_description'), variant: 'danger' }; }; @@ -44,7 +44,7 @@ export const createBlacklistAlertData = isBlackListed => { return { isVisible: true, - text: $t('s_addressBook_contactDetails_alert_blacklist'), + text: $t('screen_addressBook_contactDetails_alert_blacklist_description'), variant: 'danger' }; }; diff --git a/wallet/symbol/mobile/src/screens/address-book/utils/contact-list-tabs.js b/wallet/symbol/mobile/src/screens/address-book/utils/contact-list-tabs.js index dbf4bf7e29..92d126e777 100644 --- a/wallet/symbol/mobile/src/screens/address-book/utils/contact-list-tabs.js +++ b/wallet/symbol/mobile/src/screens/address-book/utils/contact-list-tabs.js @@ -4,10 +4,10 @@ import { ContactListType } from '@/app/screens/address-book/types/AddressBook'; export const createContactListTypeTabs = () => [ { value: ContactListType.WHITELIST, - label: $t('s_addressBook_tab_whitelist') + label: $t('screen_addressBook_tab_whitelist') }, { value: ContactListType.BLACKLIST, - label: $t('s_addressBook_tab_blacklist') + label: $t('screen_addressBook_tab_blacklist') } ]; diff --git a/wallet/symbol/mobile/src/screens/address-book/utils/validators.js b/wallet/symbol/mobile/src/screens/address-book/utils/validators.js index 79031e4806..1f9a5ef821 100644 --- a/wallet/symbol/mobile/src/screens/address-book/utils/validators.js +++ b/wallet/symbol/mobile/src/screens/address-book/utils/validators.js @@ -24,10 +24,10 @@ const createUniqueValidator = (walletAccounts, addressBook, getField, ignoredCon return getField(contact).toLowerCase() === lowerTrimmedValue; })) - return 'validation_error_already_exists'; + return 'validationError_alreadyExists'; if (walletAccounts.some(account => getField(account).toLowerCase() === lowerTrimmedValue)) - return 'validation_error_already_exists'; + return 'validationError_alreadyExists'; }; /** diff --git a/wallet/symbol/mobile/src/screens/address-book/widgets/AddressBookWidget.jsx b/wallet/symbol/mobile/src/screens/address-book/widgets/AddressBookWidget.jsx index d89530b64d..b4d6342902 100644 --- a/wallet/symbol/mobile/src/screens/address-book/widgets/AddressBookWidget.jsx +++ b/wallet/symbol/mobile/src/screens/address-book/widgets/AddressBookWidget.jsx @@ -26,7 +26,7 @@ export const AddressBookWidget = ({ contacts }) => { const handleAddContactPress = () => Router.goToCreateContact(); return ( - + diff --git a/wallet/symbol/mobile/src/screens/assets/utils/assets-sections.js b/wallet/symbol/mobile/src/screens/assets/utils/assets-sections.js index d8b5e8196c..6e4d293ab8 100644 --- a/wallet/symbol/mobile/src/screens/assets/utils/assets-sections.js +++ b/wallet/symbol/mobile/src/screens/assets/utils/assets-sections.js @@ -19,12 +19,12 @@ import { isTokenExpired } from '@/app/utils'; export const getAssetsFilterConfig = () => [ { name: 'expired', - title: $t('s_assets_filter_expired'), + title: $t('screen_assets_chip_expired'), type: FilterType.BOOLEAN }, { name: 'created', - title: $t('s_assets_filter_created'), + title: $t('screen_assets_chip_created'), type: FilterType.BOOLEAN } ]; @@ -98,10 +98,10 @@ export const buildAssetsSections = ({ let title; if (index === 0) - title = $t('s_assets_section_currentAccount'); + title = $t('screen_assets_title_currentAccount'); if (index === 1) - title = $t('s_assets_section_bridgeAccounts'); + title = $t('screen_assets_title_bridgeAccounts'); sections.push(createSection( currentAccount.name, @@ -126,7 +126,7 @@ export const buildAssetsSections = ({ let title = null; if (index === 0) - title = $t('s_assets_section_multisigAccounts'); + title = $t('screen_assets_title_multisigAccounts'); multisigAccounts.forEach(multisigAccount => { const assets = multisigAccount.tokens ?? multisigAccount.mosaics ?? []; diff --git a/wallet/symbol/mobile/src/screens/assets/utils/token-display.js b/wallet/symbol/mobile/src/screens/assets/utils/token-display.js index 26ce514143..b540fa7f4b 100644 --- a/wallet/symbol/mobile/src/screens/assets/utils/token-display.js +++ b/wallet/symbol/mobile/src/screens/assets/utils/token-display.js @@ -22,8 +22,8 @@ export const getExpirationData = (token, networkProperties) => { : SemanticRoleColorVariant.WARNING; const alertText = isExpired - ? $t('s_assetDetails_alert_expired_description') - : $t('s_assetDetails_alert_expirable_description'); + ? $t('screen_assets_alert_expired_description') + : $t('screen_assets_alert_expirable_description'); return { isTokenExpired: isExpired, diff --git a/wallet/symbol/mobile/src/screens/bridge/BridgeAccountDetails.jsx b/wallet/symbol/mobile/src/screens/bridge/BridgeAccountDetails.jsx index f5a7101c40..5fd1929e89 100644 --- a/wallet/symbol/mobile/src/screens/bridge/BridgeAccountDetails.jsx +++ b/wallet/symbol/mobile/src/screens/bridge/BridgeAccountDetails.jsx @@ -98,7 +98,7 @@ export const BridgeAccountDetails = ({ route }) => { /> - {$t('s_bridge_tokens_title')} + {$t('screen_bridge_title_tokens')} {tokens.map((token, index) => { const tokenDisplayData = tokensDisplayData[index]; @@ -142,7 +142,7 @@ export const BridgeAccountDetails = ({ route }) => { { { workflow={workflow} transactionProgressViewModel={transactionProgressViewModel} isCustomSendButtonUsed={true} - confirmDialogTitle={$t('s_bridge_swap_dialog_confirm_title')} + confirmDialogTitle={$t('screen_bridge_swap_dialog_confirm_title')} confirmDialogText={confirmationText} modals={( <> { - {$t('s_bridge_title')} + {$t('screen_bridge_title_intro')} - {$t('s_bridge_description')} + {$t('screen_bridge_description_intro')} { onReverse={reverse} /> {