diff --git a/android/app/build.gradle b/android/app/build.gradle
index 548312c8d..ba7fd3443 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -6,8 +6,8 @@ apply plugin: "com.google.firebase.crashlytics"
import com.android.build.OutputFile
-def canonicalVersionName = "3.1.0"
-def canonicalVersionCode = 29
+def canonicalVersionName = "3.2.0"
+def canonicalVersionCode = 34
// NOTE: DO NOT change postFixSize value, this is for handling legacy method for handling the versioning in android
def postFixSize = 30_000
diff --git a/ios/Xaman.xcodeproj/project.pbxproj b/ios/Xaman.xcodeproj/project.pbxproj
index 9d8459c90..66764b455 100644
--- a/ios/Xaman.xcodeproj/project.pbxproj
+++ b/ios/Xaman.xcodeproj/project.pbxproj
@@ -1182,7 +1182,7 @@
CODE_SIGN_ENTITLEMENTS = Xaman/Xaman.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
+ CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_TEAM = LK5BBJNJZ6;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
@@ -1193,7 +1193,7 @@
INFOPLIST_FILE = Xaman/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 3.1.0;
+ MARKETING_VERSION = 3.2.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -1218,13 +1218,13 @@
CODE_SIGN_ENTITLEMENTS = Xaman/Xaman.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
+ CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_TEAM = LK5BBJNJZ6;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
INFOPLIST_FILE = Xaman/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 3.1.0;
+ MARKETING_VERSION = 3.2.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
diff --git a/ios/Xaman/Info.plist b/ios/Xaman/Info.plist
index 4b30a4d32..7999ad71b 100644
--- a/ios/Xaman/Info.plist
+++ b/ios/Xaman/Info.plist
@@ -54,7 +54,7 @@
CFBundleVersion
- 9
+ 5LSApplicationQueriesSchemeshttps
diff --git a/ios/XamanTests/Info.plist b/ios/XamanTests/Info.plist
index 0c590ff2f..11a3c5782 100644
--- a/ios/XamanTests/Info.plist
+++ b/ios/XamanTests/Info.plist
@@ -19,6 +19,6 @@
CFBundleSignature????CFBundleVersion
- 9
+ 5
diff --git a/package-lock.json b/package-lock.json
index 539421ba9..12654d1e9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "xaman",
- "version": "3.1.0",
+ "version": "3.2.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "xaman",
- "version": "3.1.0",
+ "version": "3.2.0",
"hasInstallScript": true,
"license": "SEE LICENSE IN ",
"dependencies": {
diff --git a/package.json b/package.json
index 110c7c374..07b3f63a3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "xaman",
- "version": "3.1.0",
+ "version": "3.2.0",
"license": "SEE LICENSE IN ",
"scripts": {
"start": "node node_modules/react-native/cli.js start",
diff --git a/src/common/constants/screens.ts b/src/common/constants/screens.ts
index f75f4ea23..27cc4a535 100644
--- a/src/common/constants/screens.ts
+++ b/src/common/constants/screens.ts
@@ -92,6 +92,7 @@ const screens = {
Edit: 'app.Settings.ThirdPartyApps.Edit',
},
SessionLog: 'app.Settings.SessionLog',
+ DeveloperSettings: 'app.Settings.DeveloperSettings',
General: 'app.Settings.General',
Advanced: 'app.Settings.Advanced',
Security: 'app.Settings.Security',
diff --git a/src/common/helpers/advisory.ts b/src/common/helpers/advisory.ts
new file mode 100644
index 000000000..9bf94d3da
--- /dev/null
+++ b/src/common/helpers/advisory.ts
@@ -0,0 +1,109 @@
+/**
+Advisory helper
+ */
+
+import BigNumber from 'bignumber.js';
+
+import LedgerService from '@services/LedgerService';
+
+import { AccountRoot } from '@common/libs/ledger/types/ledger';
+import { AccountInfoAccountFlags } from '@common/libs/ledger/types/methods/accountInfo';
+
+/* Constants ==================================================================== */
+const BLACK_HOLE_KEYS = ['rrrrrrrrrrrrrrrrrrrrrhoLvTp', 'rrrrrrrrrrrrrrrrrrrrBZbvji'];
+const EXCHANGE_BALANCE_THRESHOLD = 1000000000000;
+const MIN_TRANSACTION_TAG = 9999;
+const HIGH_SENDER_COUNT = 10;
+const HIGH_PERCENTAGE_TAGGED_TX = 50;
+
+/* Helper Functions ==================================================================== */
+/**
+ * The Advisory object provides methods to fetch account advisory information, account details,
+ * and perform various checks on accounts based on their data and flags.
+ */
+const Advisory = {
+ /**
+ * Determines whether a possible exchange can take place based on the account balance.
+ *
+ * The function evaluates if the account balance is defined and greater than a specified threshold.
+ *
+ * @param {AccountRoot} accountData - The account data containing balance information.
+ * @returns {boolean} - Returns true if the account balance exceeds the exchange threshold; otherwise, false.
+ */
+ checkPossibleExchange: (accountData?: AccountRoot): boolean => {
+ return !!accountData?.Balance && new BigNumber(accountData.Balance).isGreaterThan(EXCHANGE_BALANCE_THRESHOLD);
+ },
+
+ /**
+ * Checks if a given account is a "black hole" account.
+ *
+ * A black hole account is determined by checking if:
+ * 1. The account has a RegularKey set.
+ * 2. The master key is disabled.
+ * 3. The RegularKey is one of the predefined black hole keys.
+ *
+ * @param {AccountRoot} accountData - The account data object containing details of the account.
+ * @param {AccountInfoAccountFlags} accountFlags - The flags indicating account settings.
+ * @returns {boolean} - True if the account is a black hole account, otherwise false.
+ */
+ checkBlackHoleAccount: (accountData?: AccountRoot, accountFlags?: AccountInfoAccountFlags): boolean => {
+ return (
+ !!accountData?.RegularKey &&
+ !!accountFlags?.disableMasterKey &&
+ BLACK_HOLE_KEYS.includes(accountData.RegularKey)
+ );
+ },
+
+ /**
+ * Determines if incoming XRP is disallowed for an account based on its flags.
+ *
+ * @param {AccountInfoAccountFlags} accountFlags - The flags associated with the account.
+ * @returns {boolean} - Returns `true` if the account disallows incoming XRP, otherwise `false`.
+ */
+ checkDisallowIncomingXRP: (accountFlags?: AccountInfoAccountFlags): boolean => {
+ return accountFlags?.disallowIncomingXRP ?? false;
+ },
+
+ /**
+ * Checks if a destination tag is required for transactions to a specific account.
+ *
+ * This function evaluates multiple conditions to determine if a destination tag
+ * should be enforced for incoming transactions to the specified account address.
+ * It first checks if the destination tag requirement is already specified in the
+ * provided advisory or account flags. If not, it retrieves recent transactions
+ * for the account and analyzes the percentage of incoming transactions that
+ * already use a destination tag, as well as the number of unique senders.
+ *
+ * @param {string} address - The account address to check for destination tag requirement.
+ * @param {XamanBackend.AccountAdvisoryResponse} advisory - Advisory response with force destination tag info.
+ * @param {AccountInfoAccountFlags} accountFlags - Account flags indicating if destination tag is required.
+ * @returns {Promise} - Returns true if a destination tag is required, false otherwise.
+ */
+ checkRequireDestinationTag: async (
+ address: string,
+ advisory: XamanBackend.AccountAdvisoryResponse,
+ accountFlags?: AccountInfoAccountFlags,
+ ): Promise => {
+ // already indicates on advisory or account info ?
+ if (advisory.force_dtag || accountFlags?.requireDestinationTag) {
+ return true;
+ }
+
+ const transactionsResp = await LedgerService.getTransactions(address, undefined, 200);
+
+ if (!('error' in transactionsResp) && transactionsResp.transactions?.length > 0) {
+ const incomingTXS = transactionsResp.transactions.filter((tx) => tx.tx.Destination === address);
+ const incomingTxCountWithTag = incomingTXS.filter(
+ (tx) => Number(tx.tx.DestinationTag) > MIN_TRANSACTION_TAG,
+ ).length;
+ const uniqueSenders = new Set(transactionsResp.transactions.map((tx) => tx.tx.Account || '')).size;
+ const percentageTag = (incomingTxCountWithTag / incomingTXS.length) * 100;
+
+ return uniqueSenders >= HIGH_SENDER_COUNT && percentageTag > HIGH_PERCENTAGE_TAGGED_TX;
+ }
+
+ return false;
+ },
+};
+
+export default Advisory;
diff --git a/src/common/helpers/resolver.ts b/src/common/helpers/resolver.ts
deleted file mode 100644
index a8ef031e1..000000000
--- a/src/common/helpers/resolver.ts
+++ /dev/null
@@ -1,274 +0,0 @@
-/**
- * AccountResolver is responsible for resolving account names and retrieving account information.
- * It provides utility methods to look up account names based on the address and tag,
- * as well as methods to fetch detailed account information including risk level and settings.
- */
-
-import { has, get, assign } from 'lodash';
-
-import AccountRepository from '@store/repositories/account';
-import ContactRepository from '@store/repositories/contact';
-
-import LedgerService from '@services/LedgerService';
-import BackendService from '@services/BackendService';
-
-import Amount from '@common/libs/ledger/parser/common/amount';
-
-import LRUCache from '@common/utils/cache';
-import LoggerService, { LoggerInstance } from '@services/LoggerService';
-
-/* Types ==================================================================== */
-export interface PayIDInfo {
- account: string;
- tag: string | null;
-}
-
-export interface AccountNameType {
- address: string;
- tag?: number;
- name?: string;
- source?: string;
- kycApproved?: boolean;
-}
-
-export interface AccountInfoType {
- exist: boolean;
- risk: 'ERROR' | 'UNKNOWN' | 'PROBABLE' | 'HIGH_PROBABILITY' | 'CONFIRMED';
- requireDestinationTag: boolean;
- possibleExchange: boolean;
- disallowIncomingXRP: boolean;
- blackHole: boolean;
-}
-
-/* Resolver ==================================================================== */
-class AccountResolver {
- private static CacheSize = 300;
- private cache: LRUCache | AccountNameType>;
- private logger: LoggerInstance;
-
- constructor() {
- this.cache = new LRUCache | AccountNameType>(AccountResolver.CacheSize);
- this.logger = LoggerService.createLogger('AccountResolver');
- }
-
- private lookupresolveAccountName = async (
- address: string,
- tag?: number,
- internal = false,
- ): Promise => {
- const notFound: AccountNameType = {
- address,
- tag,
- name: '',
- source: '',
- };
-
- if (!address) {
- return notFound;
- }
-
- // Check in address book
- try {
- const contact = await ContactRepository.findOne({
- address,
- destinationTag: `${tag ?? ''}`,
- });
-
- if (contact) {
- return {
- address,
- tag,
- name: contact.name,
- source: 'contacts',
- };
- }
- } catch (error) {
- this.logger.error('fetching contact:', error);
- }
-
- // Check in accounts list
- try {
- const account = await AccountRepository.findOne({ address });
- if (account) {
- return {
- address,
- tag,
- name: account.label,
- source: 'accounts',
- };
- }
- } catch (error) {
- this.logger.error('fetching account:', error);
- }
-
- // Only lookup for local results
- if (internal) {
- return notFound;
- }
-
- // Check the backend
- try {
- const res = await BackendService.getAddressInfo(address);
- if (res) {
- return {
- address,
- tag,
- name: res.name ?? undefined,
- source: res.source?.replace('internal:', '').replace('.com', ''),
- kycApproved: res.kycApproved,
- };
- }
- } catch (error) {
- this.logger.error('fetching info from API', error);
- }
-
- return notFound;
- };
-
- public setCache = (key: string, value: AccountNameType | Promise) => {
- this.cache.set(key, value);
- };
-
- public getAccountName = async (address: string, tag?: number, internal = false): Promise => {
- if (!address) {
- throw new Error('Address is required.');
- }
-
- const key = `${address}${tag ?? ''}`;
-
- const cachedValue = this.cache.get(key);
- if (cachedValue) {
- return cachedValue;
- }
-
- const resultPromise = (async () => {
- const result = await this.lookupresolveAccountName(address, tag, internal);
- this.cache.set(key, result);
- return result;
- })();
-
- this.cache.set(key, resultPromise); // save the promise itself for subsequent calls
-
- return resultPromise;
- };
-
- getAccountInfo = async (address: string): Promise => {
- if (!address) {
- throw new Error('Address is required.');
- }
-
- const info: AccountInfoType = {
- exist: true,
- risk: 'UNKNOWN',
- requireDestinationTag: false,
- possibleExchange: false,
- disallowIncomingXRP: false,
- blackHole: false,
- };
-
- // get account risk level
- const accountAdvisory = await BackendService.getAccountAdvisory(address);
-
- if (has(accountAdvisory, 'danger')) {
- assign(info, { risk: accountAdvisory.danger });
- } else {
- this.logger.error('account advisory risk level not found.');
- throw new Error('Account advisory risk level not found.');
- }
-
- const accountInfo = await LedgerService.getAccountInfo(address);
-
- // account doesn't exist, no need to check account risk
- if ('error' in accountInfo) {
- if (get(accountInfo, 'error') === 'actNotFound') {
- assign(info, { exist: false });
- return info;
- }
- this.logger.error('fetching account info:', accountInfo);
- throw new Error('Error fetching account info.');
- }
-
- const { account_data, account_flags } = accountInfo;
-
- // if balance is more than 1m possibly exchange account
- if (has(account_data, ['Balance'])) {
- if (new Amount(account_data.Balance, true).dropsToNative().toNumber() > 1000000) {
- assign(info, { possibleExchange: true });
- }
- }
-
- // check for black hole
- if (has(account_data, ['RegularKey'])) {
- if (
- account_flags?.disableMasterKey &&
- ['rrrrrrrrrrrrrrrrrrrrrhoLvTp', 'rrrrrrrrrrrrrrrrrrrrBZbvji'].indexOf(account_data.RegularKey ?? '') >
- -1
- ) {
- assign(info, { blackHole: true });
- }
- }
-
- // check for disallow incoming XRP
- if (account_flags?.disallowIncomingXRP) {
- assign(info, { disallowIncomingXRP: true });
- }
-
- if (get(accountAdvisory, 'force_dtag')) {
- // first check on account advisory
- assign(info, { requireDestinationTag: true, possibleExchange: true });
- } else if (account_flags?.requireDestinationTag) {
- // check if account have the required destination tag flag set
- assign(info, { requireDestinationTag: true, possibleExchange: true });
- } else {
- // scan the most recent transactions of the account for the destination tags
- const transactionsResp = await LedgerService.getTransactions(address, undefined, 200);
- if (
- !('error' in transactionsResp) &&
- transactionsResp.transactions &&
- transactionsResp.transactions.length > 0
- ) {
- const incomingTXS = transactionsResp.transactions.filter((tx) => tx.tx.Destination === address);
-
- const incomingTxCountWithTag = incomingTXS.filter(
- (tx) =>
- typeof tx.tx.TransactionType === 'string' &&
- typeof tx.tx.DestinationTag !== 'undefined' &&
- Number(tx.tx.DestinationTag) > 9999,
- ).length;
-
- const senders = transactionsResp.transactions.map((tx) => tx.tx.Account || '');
-
- const uniqueSenders = new Set(senders).size;
-
- const percentageTag = (incomingTxCountWithTag / incomingTXS.length) * 100;
-
- if (uniqueSenders >= 10 && percentageTag > 50) {
- assign(info, { requireDestinationTag: true, possibleExchange: true });
- }
- }
- }
-
- return info;
- };
-
- getPayIdInfo = (payId: string): Promise => {
- return BackendService.lookup(payId)
- .then((res) => {
- if (res) {
- if (Array.isArray(res.matches) && res.matches.length > 0) {
- const match = res.matches[0];
- return {
- account: match.account,
- tag: match.tag,
- };
- }
- }
- return undefined;
- })
- .catch(() => {
- return undefined;
- });
- };
-}
-
-export default new AccountResolver();
diff --git a/src/common/libs/ledger/transactions/genuine/Payment/Payment.info.ts b/src/common/libs/ledger/transactions/genuine/Payment/Payment.info.ts
index d599c5643..9bd2d21b5 100644
--- a/src/common/libs/ledger/transactions/genuine/Payment/Payment.info.ts
+++ b/src/common/libs/ledger/transactions/genuine/Payment/Payment.info.ts
@@ -71,6 +71,7 @@ class PaymentInfo extends ExplainerAbstract {
getParticipants() {
// 3rd party consuming own offer
+ // or regular key
if ([this.item.Account, this.item.Destination].indexOf(this.account.address) === -1) {
return {
start: { address: this.item.Account, tag: this.item.SourceTag },
diff --git a/src/common/libs/preferences.ts b/src/common/libs/preferences.ts
index 393d807fb..402d8cf36 100644
--- a/src/common/libs/preferences.ts
+++ b/src/common/libs/preferences.ts
@@ -14,7 +14,7 @@ enum Keys {
LATEST_VERSION_CODE = 'LATEST_VERSION_CODE',
UPDATE_IGNORE_VERSION_CODE = 'UPDATE_IGNORE_VERSION_CODE',
XAPP_STORE_IGNORE_MESSAGE_ID = 'XAPP_STORE_IGNORE_MESSAGE_ID',
- CURATED_LIST_VERSION = 'CURATED_LIST_VERSION',
+ EXPERIMENTAL_SIMPLICITY_UI = 'EXPERIMENTAL_SIMPLICITY_UI',
}
/* Lib ==================================================================== */
diff --git a/src/common/utils/cache.ts b/src/common/utils/cache.ts
index 37c89209e..8df1fd5f0 100644
--- a/src/common/utils/cache.ts
+++ b/src/common/utils/cache.ts
@@ -33,6 +33,14 @@ class LRUCache {
}
this.cache.set(key, value);
}
+
+ delete(key: K): void {
+ this.cache.delete(key);
+ }
+
+ clear(): void {
+ this.cache.clear();
+ }
}
export default LRUCache;
diff --git a/src/common/utils/queue.ts b/src/common/utils/queue.ts
new file mode 100644
index 000000000..f44506118
--- /dev/null
+++ b/src/common/utils/queue.ts
@@ -0,0 +1,36 @@
+export class PromiseQueue {
+ private queue: Map Promise> = new Map();
+ private activeCount: number = 0;
+ private concurrency: number;
+
+ constructor(concurrency: number) {
+ this.concurrency = concurrency;
+ }
+
+ private async runNext() {
+ if (this.activeCount >= this.concurrency || this.queue.size === 0) {
+ return;
+ }
+
+ const [key, task] = this.queue.entries().next().value;
+ if (!task) {
+ return;
+ }
+
+ this.queue.delete(key);
+ this.activeCount++;
+ try {
+ await task();
+ } finally {
+ this.activeCount--;
+ this.runNext();
+ }
+ }
+
+ enqueue(key: string, task: () => Promise) {
+ if (!this.queue.has(key)) {
+ this.queue.set(key, task);
+ this.runNext();
+ }
+ }
+}
diff --git a/src/components/General/Button/Button.tsx b/src/components/General/Button/Button.tsx
index 05242332c..c059b7c09 100644
--- a/src/components/General/Button/Button.tsx
+++ b/src/components/General/Button/Button.tsx
@@ -34,7 +34,7 @@ interface Props extends PropsWithChildren {
numberOfLines?: number;
isLoading?: boolean;
isDisabled?: boolean;
- loadingIndicatorStyle?: 'light' | 'dark';
+ loadingIndicatorStyle?: 'light' | 'dark' | 'default';
onPress?: () => void;
onLongPress?: () => void;
label?: string;
@@ -91,7 +91,7 @@ export default class Button extends Component {
);
}
diff --git a/src/components/General/Header/Header.tsx b/src/components/General/Header/Header.tsx
index ee3836da0..f215f3540 100644
--- a/src/components/General/Header/Header.tsx
+++ b/src/components/General/Header/Header.tsx
@@ -20,17 +20,17 @@ interface ChildrenProps {
icon?: Extract;
iconSize?: number;
iconStyle?: ImageStyle;
- render?: any;
+ render?: () => JSX.Element | null;
onPress?: () => void;
extraComponent?: React.ReactNode;
}
interface Props {
placement: placementType;
- leftComponent?: ChildrenProps;
- centerComponent?: ChildrenProps;
- subComponent?: ChildrenProps;
- rightComponent?: ChildrenProps;
+ leftComponent?: ChildrenProps | (() => JSX.Element);
+ centerComponent?: ChildrenProps | (() => JSX.Element);
+ subComponent?: ChildrenProps | (() => JSX.Element);
+ rightComponent?: ChildrenProps | (() => JSX.Element);
backgroundColor?: string;
containerStyle?: ViewStyle;
}
@@ -50,8 +50,12 @@ const Children = ({
}: {
style: ViewStyle | ViewStyle[];
placement: placementType;
- children: ChildrenProps;
+ children: ChildrenProps | (() => JSX.Element);
}) => {
+ if (typeof children === 'function') {
+ return children();
+ }
+
if (!children) {
return (
{
diff --git a/src/components/General/MultiPressDetector/MultiPressDetector.tsx b/src/components/General/MultiPressDetector/MultiPressDetector.tsx
new file mode 100644
index 000000000..9db4d4a5f
--- /dev/null
+++ b/src/components/General/MultiPressDetector/MultiPressDetector.tsx
@@ -0,0 +1,97 @@
+/**
+ * MultiPressDetector
+ *
+
+ *
+ */
+import React, { PureComponent, PropsWithChildren } from 'react';
+
+import { TouchableOpacity } from 'react-native';
+
+/* Types ==================================================================== */
+export interface Props extends PropsWithChildren {
+ pressThreshold?: number;
+ onMultiPress?: () => void;
+}
+
+export interface State {
+ pressCount: number;
+ lastPress: number;
+}
+
+/* Component ==================================================================== */
+class MultiPressDetector extends PureComponent {
+ declare readonly props: Props & Required>;
+
+ static defaultProps: Partial = {
+ pressThreshold: 3,
+ };
+
+ constructor(props: Props) {
+ super(props);
+
+ this.state = {
+ pressCount: 0,
+ lastPress: 0,
+ };
+ }
+
+ handleButtonPress = () => {
+ const { pressCount, lastPress } = this.state;
+ const { pressThreshold } = this.props;
+
+ const currentTime = Date.now();
+ const timeDifference = currentTime - lastPress;
+
+ if (timeDifference < 500) {
+ this.setState(
+ {
+ pressCount: pressCount + 1,
+ lastPress: currentTime,
+ },
+ () => {
+ const { pressCount: newPressCount } = this.state;
+ if (newPressCount === pressThreshold) {
+ this.executeCallback();
+ this.resetPressCount();
+ }
+ },
+ );
+ } else {
+ this.resetPressCount(currentTime);
+ }
+ };
+
+ resetPressCount = (currentTime = 0) => {
+ this.setState({
+ pressCount: 0,
+ lastPress: currentTime,
+ });
+ };
+
+ executeCallback = () => {
+ const { onMultiPress } = this.props;
+
+ // Call your callback function here
+ if (typeof onMultiPress === 'function') {
+ onMultiPress();
+ }
+ };
+
+ render() {
+ const { children } = this.props;
+
+ return (
+
+ {children}
+
+ );
+ }
+}
+
+/* Export Component ==================================================================== */
+export default MultiPressDetector;
diff --git a/src/components/General/MultiPressDetector/index.ts b/src/components/General/MultiPressDetector/index.ts
new file mode 100644
index 000000000..d2cfb6776
--- /dev/null
+++ b/src/components/General/MultiPressDetector/index.ts
@@ -0,0 +1 @@
+export { default as MultiPressDetector, type Props as MultiPressDetectorProps } from './MultiPressDetector';
diff --git a/src/components/General/MultiPressDetector/styles.ts b/src/components/General/MultiPressDetector/styles.ts
new file mode 100644
index 000000000..a7ab268ff
--- /dev/null
+++ b/src/components/General/MultiPressDetector/styles.ts
@@ -0,0 +1,33 @@
+import StyleService from '@services/StyleService';
+
+/* Styles ==================================================================== */
+export default StyleService.create({
+ container: {
+ borderRadius: 11,
+ backgroundColor: '$tint',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ placeholder: {
+ backgroundColor: '$grey',
+ },
+ image: {
+ borderRadius: 11,
+ },
+ border: {
+ borderColor: '$lightGrey',
+ borderWidth: 1,
+ },
+ badgeContainer: {
+ position: 'absolute',
+ },
+ badgeContainerText: {
+ position: 'absolute',
+ backgroundColor: '$blue',
+ borderWidth: 2.5,
+ borderColor: '$background',
+ },
+ badge: {
+ tintColor: '$white',
+ },
+});
diff --git a/src/components/General/index.ts b/src/components/General/index.ts
index a1f53f25e..ead7d96f6 100644
--- a/src/components/General/index.ts
+++ b/src/components/General/index.ts
@@ -33,14 +33,13 @@ export * from './NumberSteps';
export * from './HorizontalLine';
export * from './ProgressBar';
export * from './CheckBox';
+export * from './MultiPressDetector';
export * from './SortableFlatList';
export * from './AmountText';
export * from './LoadingIndicator';
export * from './KeyboardAwareScrollView';
export * from './ActionPanel';
-export * from './TokenAvatar';
-export * from './TokenIcon';
export * from './ExpandableView';
export * from './BlurView';
export * from './WebView';
diff --git a/src/components/Modules/AccountElement/AccountElement.tsx b/src/components/Modules/AccountElement/AccountElement.tsx
index 2bab1bd65..8890840a3 100644
--- a/src/components/Modules/AccountElement/AccountElement.tsx
+++ b/src/components/Modules/AccountElement/AccountElement.tsx
@@ -3,7 +3,7 @@ import { isEqual, isEmpty } from 'lodash';
import React, { Component } from 'react';
import { View, Text, ViewStyle, InteractionManager, TextStyle } from 'react-native';
-import AccountResolver, { AccountNameType } from '@common/helpers/resolver';
+import ResolverService, { AccountNameResolveType } from '@services/ResolverService';
import { Navigator } from '@common/helpers/navigator';
import { AppScreens } from '@common/constants';
@@ -37,16 +37,16 @@ interface Props {
id?: string;
address: string;
tag?: number;
- info?: AccountNameType;
+ info?: AccountNameResolveType;
visibleElements?: VisibleElementsType;
containerStyle?: ViewStyle | ViewStyle[];
textStyle?: TextStyle | TextStyle[];
onPress?: (account: AccountElementType) => void;
- onInfoUpdate?: (info: AccountNameType) => void;
+ onInfoUpdate?: (info: AccountNameResolveType) => void;
}
interface State {
- info?: AccountNameType;
+ info?: AccountNameResolveType;
isLoading: boolean;
}
@@ -125,7 +125,7 @@ class AccountElement extends Component {
});
}
- AccountResolver.getAccountName(address, tag)
+ ResolverService.getAccountName(address, tag)
.then((res) => {
if (!isEmpty(res) && this.mounted) {
this.setState(
diff --git a/src/components/Modules/AssetsList/AssetsList.tsx b/src/components/Modules/AssetsList/AssetsList.tsx
index 6b1a61503..2034cb2b1 100644
--- a/src/components/Modules/AssetsList/AssetsList.tsx
+++ b/src/components/Modules/AssetsList/AssetsList.tsx
@@ -19,6 +19,7 @@ interface Props {
account: AccountModel;
discreetMode: boolean;
spendable: boolean;
+ experimentalUI?: boolean;
}
interface State {
@@ -67,7 +68,7 @@ class AssetsList extends Component {
};
render() {
- const { style, timestamp, discreetMode, spendable, account } = this.props;
+ const { style, timestamp, discreetMode, spendable, experimentalUI, account } = this.props;
const { category } = this.state;
let AssetListComponent;
@@ -91,6 +92,7 @@ class AssetsList extends Component {
spendable={spendable}
onChangeCategoryPress={this.onChangeCategoryPress}
style={style}
+ experimentalUI={experimentalUI}
/>
);
}
diff --git a/src/components/Modules/AssetsList/Tokens/ListFilter/ListFilter.tsx b/src/components/Modules/AssetsList/Tokens/ListFilter/ListFilter.tsx
index e0b415100..7247babe6 100644
--- a/src/components/Modules/AssetsList/Tokens/ListFilter/ListFilter.tsx
+++ b/src/components/Modules/AssetsList/Tokens/ListFilter/ListFilter.tsx
@@ -18,7 +18,7 @@ export interface FiltersType {
interface Props {
filters?: FiltersType;
- reorderEnabled: boolean;
+ visible: boolean;
onFilterChange: (filters: FiltersType | undefined) => void;
onReorderPress: () => void;
}
@@ -50,11 +50,11 @@ class ListFilter extends Component {
}
shouldComponentUpdate(nextProps: Readonly, nextState: Readonly): boolean {
- const { reorderEnabled } = this.props;
+ const { visible } = this.props;
const { filterText, favoritesEnabled, hideZeroEnabled } = this.state;
return (
- !isEqual(nextProps.reorderEnabled, reorderEnabled) ||
+ !isEqual(nextProps.visible, visible) ||
!isEqual(nextState.filterText, filterText) ||
!isEqual(nextState.favoritesEnabled, favoritesEnabled) ||
!isEqual(nextState.hideZeroEnabled, hideZeroEnabled)
@@ -178,11 +178,11 @@ class ListFilter extends Component {
};
render() {
- const { reorderEnabled } = this.props;
+ const { visible } = this.props;
const { favoritesEnabled, hideZeroEnabled } = this.state;
// hide filters when reordering is enabled
- if (reorderEnabled) {
+ if (!visible) {
return null;
}
diff --git a/src/components/Modules/AssetsList/Tokens/ListFilter/styles.ts b/src/components/Modules/AssetsList/Tokens/ListFilter/styles.ts
index 0f78d4634..e5f6ebd18 100644
--- a/src/components/Modules/AssetsList/Tokens/ListFilter/styles.ts
+++ b/src/components/Modules/AssetsList/Tokens/ListFilter/styles.ts
@@ -57,7 +57,7 @@ export default StyleService.create({
alignItems: 'center',
},
searchBarInput: {
- fontFamily: AppFonts.base.familyMono,
+ fontFamily: AppFonts.base.family,
fontSize: AppFonts.subtext.size,
color: '$grey',
paddingLeft: 30,
diff --git a/src/components/Modules/AssetsList/Tokens/NativeItem/NativeItem.tsx b/src/components/Modules/AssetsList/Tokens/NativeItem/NativeItem.tsx
index 7c65bf410..0f5ddffb5 100644
--- a/src/components/Modules/AssetsList/Tokens/NativeItem/NativeItem.tsx
+++ b/src/components/Modules/AssetsList/Tokens/NativeItem/NativeItem.tsx
@@ -11,7 +11,9 @@ import { Toast } from '@common/helpers/interface';
import { CoreRepository } from '@store/repositories';
import { AccountModel, CoreModel } from '@store/models';
-import { AmountText, Icon, TokenAvatar, TokenIcon, TouchableDebounce } from '@components/General';
+import { AmountText, Icon, TouchableDebounce } from '@components/General';
+
+import { TokenAvatar, TokenIcon } from '@components/Modules/TokenElement';
import Localize from '@locale';
diff --git a/src/components/Modules/AssetsList/Tokens/TokenItem/TokenItem.tsx b/src/components/Modules/AssetsList/Tokens/TokenItem/TokenItem.tsx
index 9ff164329..c41501676 100644
--- a/src/components/Modules/AssetsList/Tokens/TokenItem/TokenItem.tsx
+++ b/src/components/Modules/AssetsList/Tokens/TokenItem/TokenItem.tsx
@@ -3,14 +3,12 @@ import isEqual from 'lodash/isEqual';
import React, { PureComponent } from 'react';
import { View, Text } from 'react-native';
-import { Button, AmountText, Icon, TokenAvatar, TokenIcon } from '@components/General';
+import { Button, AmountText, Icon } from '@components/General';
-import { NormalizeCurrencyCode } from '@common/utils/monetary';
+import { TokenAvatar, TokenIcon } from '@components/Modules/TokenElement';
import { TrustLineModel } from '@store/models';
-import Localize from '@locale';
-
import { AppStyles, AppSizes } from '@theme';
import styles from './styles';
@@ -21,6 +19,7 @@ interface Props {
selfIssued: boolean;
reorderEnabled: boolean;
discreetMode: boolean;
+ saturate?: boolean;
onPress: (token: TrustLineModel, index: number) => void;
onMoveTopPress: (token: TrustLineModel, index: number) => void;
}
@@ -80,44 +79,25 @@ class TokenItem extends PureComponent {
}
};
- getIssuerLabel = () => {
- const { selfIssued, token } = this.props;
-
- if (selfIssued) return Localize.t('home.selfIssued');
-
- if (token.currency.name) {
- return `${token.counterParty.name} ${NormalizeCurrencyCode(token.currency.currencyCode)}`;
- }
-
- return `${token.counterParty.name}`;
- };
-
- getCurrencyName = () => {
- const { token } = this.props;
-
- return token.getReadableCurrency();
- };
-
- getTokenAvatar = () => {
+ getTokenAvatarBadge = () => {
const { token } = this.props;
const { favorite, no_ripple, limit } = this.state;
- let badge = null as any;
+ // show alert on top of avatar if rippling set
+ if ((!no_ripple || Number(limit) === 0) && !token.obligation && !token.isLiquidityPoolToken()) {
+ return ;
+ }
+ // favorite token
if (favorite) {
- badge = (
+ return (
);
}
- // show alert on top of avatar if rippling set
- if ((!no_ripple || Number(limit) === 0) && !token.obligation && !token.isLiquidityPoolToken()) {
- badge = ;
- }
-
- return badge} />;
+ return null;
};
renderReorderButtons = () => {
@@ -150,7 +130,7 @@ class TokenItem extends PureComponent {
};
renderBalance = () => {
- const { token, discreetMode } = this.props;
+ const { token, discreetMode, saturate } = this.props;
const { balance } = this.state;
return (
@@ -160,6 +140,7 @@ class TokenItem extends PureComponent {
token={token}
containerStyle={styles.tokenIconContainer}
style={discreetMode ? AppStyles.imgColorGrey : {}}
+ saturate={saturate}
/>
}
value={balance}
@@ -171,18 +152,26 @@ class TokenItem extends PureComponent {
};
render() {
- const { token, reorderEnabled } = this.props;
+ const { token, saturate, reorderEnabled } = this.props;
return (
- {this.getTokenAvatar()}
+
+
+
-
- {this.getCurrencyName()}
+
+ {token.getFormattedCurrency()}
- {this.getIssuerLabel()}
+ {token.getFormattedIssuer()}
diff --git a/src/components/Modules/AssetsList/Tokens/TokensList.tsx b/src/components/Modules/AssetsList/Tokens/TokensList.tsx
index 3ff1bc49a..f5e9ea6f8 100644
--- a/src/components/Modules/AssetsList/Tokens/TokensList.tsx
+++ b/src/components/Modules/AssetsList/Tokens/TokensList.tsx
@@ -8,7 +8,7 @@ import { NormalizeCurrencyCode } from '@common/utils/monetary';
import { Navigator } from '@common/helpers/navigator';
-import { TrustLineRepository } from '@store/repositories';
+import { CurrencyRepository, TrustLineRepository } from '@store/repositories';
import { AccountModel, TrustLineModel } from '@store/models';
import { SortableFlatList } from '@components/General';
@@ -29,7 +29,7 @@ interface Props {
account: AccountModel;
discreetMode: boolean;
spendable: boolean;
-
+ experimentalUI?: boolean;
onChangeCategoryPress: () => void;
}
@@ -68,20 +68,25 @@ class TokensList extends Component {
// listen for token updates
// this is needed when a single token favorite status changed
TrustLineRepository.on('trustLineUpdate', this.onTrustLineUpdate);
+ // this is needed when using ResolveService to sync the currency details
+ CurrencyRepository.on('currencyDetailsUpdate', this.onCurrencyDetailsUpdate);
}
componentWillUnmount(): void {
// remove trustLine update listener
TrustLineRepository.off('trustLineUpdate', this.onTrustLineUpdate);
+ // remove listener
+ CurrencyRepository.off('currencyDetailsUpdate', this.onCurrencyDetailsUpdate);
}
shouldComponentUpdate(nextProps: Props, nextState: State): boolean {
- const { discreetMode, spendable } = this.props;
+ const { discreetMode, spendable, experimentalUI } = this.props;
const { dataSource, accountStateVersion, reorderEnabled, filters } = this.state;
return (
!isEqual(nextProps.spendable, spendable) ||
!isEqual(nextProps.discreetMode, discreetMode) ||
+ !isEqual(nextProps.experimentalUI, experimentalUI) ||
!isEqual(nextState.accountStateVersion, accountStateVersion) ||
!isEqual(nextState.reorderEnabled, reorderEnabled) ||
!isEqual(nextState.filters, filters) ||
@@ -153,7 +158,7 @@ class TokensList extends Component {
filtered = filter(filtered, (item: TrustLineModel) => {
return (
toLower(item.currency.name).indexOf(normalizedSearch) > -1 ||
- toLower(item.counterParty?.name).indexOf(normalizedSearch) > -1 ||
+ toLower(item.currency?.issuerName).indexOf(normalizedSearch) > -1 ||
toLower(NormalizeCurrencyCode(item.currency.currencyCode)).indexOf(normalizedSearch) > -1
);
});
@@ -174,6 +179,11 @@ class TokensList extends Component {
return filtered ?? [];
};
+ onCurrencyDetailsUpdate = () => {
+ // update the token list if any of token details changed
+ this.forceUpdate();
+ };
+
onTrustLineUpdate = (updatedToken: TrustLineModel, changes: Partial) => {
// update the token in the list if token favorite changed
if (has(changes, 'favorite')) {
@@ -198,7 +208,7 @@ class TokensList extends Component {
if (spendable) {
Navigator.showOverlay(
AppScreens.Overlay.TokenSettings,
- { trustLine: token, account },
+ { token, account },
{
overlay: {
interceptTouchOutside: false,
@@ -298,7 +308,7 @@ class TokensList extends Component {
};
renderItem = ({ item, index }: { item: TrustLineModel; index: number }) => {
- const { discreetMode } = this.props;
+ const { discreetMode, experimentalUI } = this.props;
const { account, reorderEnabled } = this.state;
return (
@@ -307,6 +317,7 @@ class TokensList extends Component {
token={item}
reorderEnabled={reorderEnabled}
discreetMode={discreetMode}
+ saturate={experimentalUI}
selfIssued={item.currency.issuer === account.address}
onPress={this.onTokenItemPress}
onMoveTopPress={this.onItemMoveTopPress}
@@ -330,7 +341,7 @@ class TokensList extends Component {
};
render() {
- const { account, style, spendable, discreetMode } = this.props;
+ const { account, style, spendable, discreetMode, experimentalUI } = this.props;
const { dataSource, reorderEnabled, filters } = this.state;
return (
@@ -344,7 +355,7 @@ class TokensList extends Component {
/>
diff --git a/src/components/Modules/CurrencyElement/CurrencyElement.tsx b/src/components/Modules/CurrencyElement/CurrencyElement.tsx
index b366c1c39..71203be34 100644
--- a/src/components/Modules/CurrencyElement/CurrencyElement.tsx
+++ b/src/components/Modules/CurrencyElement/CurrencyElement.tsx
@@ -3,11 +3,11 @@ import { isEmpty } from 'lodash';
import React, { Component } from 'react';
import { View, Text, ViewStyle, InteractionManager, TextStyle } from 'react-native';
-import NetworkService from '@services/NetworkService';
-
import { WebLinks } from '@common/constants/endpoints';
-import AccountResolver, { AccountNameType } from '@common/helpers/resolver';
+import ResolverService, { AccountNameResolveType } from '@services/ResolverService';
+import NetworkService from '@services/NetworkService';
+
import { NormalizeCurrencyCode } from '@common/utils/monetary';
import { Images } from '@common/helpers/images';
@@ -28,7 +28,7 @@ interface Props {
}
interface State {
- issuerInfo?: AccountNameType;
+ issuerInfo?: AccountNameResolveType;
isLoading: boolean;
}
@@ -72,7 +72,7 @@ class CurrencyElement extends Component {
});
}
- AccountResolver.getAccountName(issuer)
+ ResolverService.getAccountName(issuer)
.then((res) => {
if (!isEmpty(res)) {
this.setState({
diff --git a/src/components/Modules/CurrencyPicker/CurrencyItem/CurrencyItem.tsx b/src/components/Modules/CurrencyPicker/CurrencyItem/CurrencyItem.tsx
index 6d3d33a56..069b2c68e 100644
--- a/src/components/Modules/CurrencyPicker/CurrencyItem/CurrencyItem.tsx
+++ b/src/components/Modules/CurrencyPicker/CurrencyItem/CurrencyItem.tsx
@@ -7,7 +7,8 @@ import { AccountModel, TrustLineModel } from '@store/models';
import { CalculateAvailableBalance } from '@common/utils/balance';
-import { AmountText, TokenAvatar } from '@components/General';
+import { AmountText } from '@components/General';
+import { TokenAvatar } from '@components/Modules/TokenElement';
import Localize from '@locale';
@@ -52,19 +53,17 @@ class CurrencyItem extends Component {
-
- {item.getReadableCurrency()}
-
-
- - {item.counterParty.name}
+
+
+ {item.getFormattedCurrency()}
-
-
+
+ - {item.getFormattedIssuer()}
+
+
diff --git a/src/components/Modules/CurrencyPicker/CurrencyItem/styles.ts b/src/components/Modules/CurrencyPicker/CurrencyItem/styles.ts
index 4605b18e6..bf3fbdfee 100644
--- a/src/components/Modules/CurrencyPicker/CurrencyItem/styles.ts
+++ b/src/components/Modules/CurrencyPicker/CurrencyItem/styles.ts
@@ -13,16 +13,17 @@ export default StyleService.create({
justifyContent: 'center',
color: '$textPrimary',
},
- currencyItemCounterPartyLabel: {
+ currencyIssuerLabel: {
fontSize: AppFonts.small.size,
fontFamily: AppFonts.base.family,
color: '$textSecondary',
+ paddingTop: 5,
},
currencyItemLabelSelected: {
color: '$blue',
},
currencyBalance: {
- fontSize: AppFonts.subtext.size * 0.9,
+ fontSize: AppFonts.subtext.size,
fontFamily: AppFonts.base.familyMono,
color: '$grey',
},
diff --git a/src/components/Modules/EventsList/EventListItems/Blocks/Monetary.tsx b/src/components/Modules/EventsList/EventListItems/Blocks/Monetary.tsx
index c185b7578..2a04ba6c0 100644
--- a/src/components/Modules/EventsList/EventListItems/Blocks/Monetary.tsx
+++ b/src/components/Modules/EventsList/EventListItems/Blocks/Monetary.tsx
@@ -74,7 +74,11 @@ class Monetary extends PureComponent {
prefix: undefined,
value: factor.at(0)?.value,
currency: factor.at(0)?.currency,
- style: factor.at(0)?.action === OperationActions.INC ? styles.pendingIncColor : styles.pendingDecColor,
+ style: factor.at(0)?.action
+ ? factor.at(0)?.action
+ ? styles.pendingDecColor
+ : styles.pendingIncColor
+ : styles.notEffectedColor,
};
}
diff --git a/src/components/Modules/EventsList/EventListItems/Blocks/styles.tsx b/src/components/Modules/EventsList/EventListItems/Blocks/styles.tsx
index 8df7354af..7b13fd4cd 100644
--- a/src/components/Modules/EventsList/EventListItems/Blocks/styles.tsx
+++ b/src/components/Modules/EventsList/EventListItems/Blocks/styles.tsx
@@ -63,6 +63,9 @@ const styles = StyleService.create({
pendingIncColor: {
color: '$grey',
},
+ notEffectedColor: {
+ color: '$grey',
+ },
});
export default styles;
diff --git a/src/components/Modules/EventsList/EventListItems/Blocks/types.ts b/src/components/Modules/EventsList/EventListItems/Blocks/types.ts
index 248dececb..42a9e3047 100644
--- a/src/components/Modules/EventsList/EventListItems/Blocks/types.ts
+++ b/src/components/Modules/EventsList/EventListItems/Blocks/types.ts
@@ -4,11 +4,12 @@ import { CombinedTransactions, FallbackTransaction, Transactions } from '@common
import { LedgerObjects } from '@common/libs/ledger/objects/types';
import { MutationsMixinType } from '@common/libs/ledger/mixin/types';
import { ExplainerAbstract } from '@common/libs/ledger/factory/types';
-import { AccountNameType } from '@common/helpers/resolver';
+
+import { AccountNameResolveType } from '@services/ResolverService';
export interface Props {
item: ((Transactions | FallbackTransaction) & MutationsMixinType) | LedgerObjects;
account: AccountModel;
- participant?: AccountNameType;
+ participant?: AccountNameResolveType;
explainer?: ExplainerAbstract;
}
diff --git a/src/components/Modules/EventsList/EventListItems/LedgerObject.tsx b/src/components/Modules/EventsList/EventListItems/LedgerObject.tsx
index eb92d460a..c72da354b 100644
--- a/src/components/Modules/EventsList/EventListItems/LedgerObject.tsx
+++ b/src/components/Modules/EventsList/EventListItems/LedgerObject.tsx
@@ -13,7 +13,7 @@ import { MutationsMixinType } from '@common/libs/ledger/mixin/types';
import { Navigator } from '@common/helpers/navigator';
-import AccountResolver, { AccountNameType } from '@common/helpers/resolver';
+import ResolverService, { AccountNameResolveType } from '@services/ResolverService';
import { TouchableDebounce } from '@components/General';
@@ -36,7 +36,7 @@ export interface Props {
export interface State {
isLoading: boolean;
- participant?: AccountNameType;
+ participant?: AccountNameResolveType;
explainer?: ExplainerAbstract;
}
@@ -122,7 +122,7 @@ class LedgerObjectItem extends Component {
try {
// get participant details
- const resp = await AccountResolver.getAccountName(otherParty.address, otherParty.tag);
+ const resp = await ResolverService.getAccountName(otherParty.address, otherParty.tag);
if (!isEmpty(resp) && this.mounted) {
this.setState({
explainer,
diff --git a/src/components/Modules/EventsList/EventListItems/Transaction.tsx b/src/components/Modules/EventsList/EventListItems/Transaction.tsx
index 7bc0bb3bf..eb5aaeb17 100644
--- a/src/components/Modules/EventsList/EventListItems/Transaction.tsx
+++ b/src/components/Modules/EventsList/EventListItems/Transaction.tsx
@@ -3,6 +3,8 @@ import { isEmpty, isEqual } from 'lodash';
import React, { Component } from 'react';
import { View, InteractionManager } from 'react-native';
+import { AppScreens } from '@common/constants';
+
import { ExplainerFactory } from '@common/libs/ledger/factory';
import { CombinedTransactions, Transactions } from '@common/libs/ledger/transactions/types';
import { MutationsMixinType } from '@common/libs/ledger/mixin/types';
@@ -12,17 +14,16 @@ import { LedgerObjects } from '@common/libs/ledger/objects/types';
import { AccountModel } from '@store/models';
-import { Navigator } from '@common/helpers/navigator';
-import AccountResolver, { AccountNameType } from '@common/helpers/resolver';
+import ResolverService, { AccountNameResolveType } from '@services/ResolverService';
-import { AppScreens } from '@common/constants';
+import { Navigator } from '@common/helpers/navigator';
import { TouchableDebounce } from '@components/General';
-import * as Blocks from './Blocks';
-
import { TransactionDetailsViewProps } from '@screens/Events/Details';
+import * as Blocks from './Blocks';
+
import { AppSizes, AppStyles } from '@theme';
import styles from './styles';
@@ -35,7 +36,7 @@ export interface Props {
export interface State {
isLoading: boolean;
- participant?: AccountNameType;
+ participant?: AccountNameResolveType;
explainer?: ExplainerAbstract;
}
@@ -121,7 +122,7 @@ class TransactionItem extends Component {
try {
// get participant details
- const resp = await AccountResolver.getAccountName(otherParty.address, otherParty.tag);
+ const resp = await ResolverService.getAccountName(otherParty.address, otherParty.tag);
if (!isEmpty(resp) && this.mounted) {
this.setState({
explainer,
@@ -159,6 +160,9 @@ class TransactionItem extends Component {
activeOpacity={0.6}
style={[styles.container, { height: TransactionItem.Height }]}
>
+ {/* if participant is block the show an overlay to reduce the visibility */}
+ {participant?.blocked && }
+
diff --git a/src/components/Modules/EventsList/EventListItems/styles.tsx b/src/components/Modules/EventsList/EventListItems/styles.tsx
index c28664664..94f62f25e 100644
--- a/src/components/Modules/EventsList/EventListItems/styles.tsx
+++ b/src/components/Modules/EventsList/EventListItems/styles.tsx
@@ -1,5 +1,7 @@
import StyleService from '@services/StyleService';
+import { HexToRgbA } from '@common/utils/color';
+
import { AppFonts, AppSizes } from '@theme';
/* Styles ==================================================================== */
@@ -7,7 +9,15 @@ const styles = StyleService.create({
container: {
flexDirection: 'row',
alignItems: 'center',
- borderRadius: 10,
+ borderRadius: AppSizes.borderRadius,
+ },
+ containerBlocked: {
+ width: '100%',
+ height: '100%',
+ backgroundColor: HexToRgbA(StyleService.value('$background'), 0.8),
+ position: 'absolute',
+ borderRadius: AppSizes.borderRadius,
+ zIndex: 9999, // top of all
},
iconContainer: {
borderColor: '$lightGrey',
diff --git a/src/components/Modules/MonetizationElement/MonetizationElement.tsx b/src/components/Modules/MonetizationElement/MonetizationElement.tsx
index 057babcdb..652202a0a 100644
--- a/src/components/Modules/MonetizationElement/MonetizationElement.tsx
+++ b/src/components/Modules/MonetizationElement/MonetizationElement.tsx
@@ -10,7 +10,7 @@ import { InteractionTypes } from '@store/models/objects/userInteraction';
import { PurchaseProductModalProps } from '@screens/Modal/PurchaseProduct';
-import { Button, RaisedButton } from '@components/General';
+import { Button, Icon } from '@components/General';
import Localize from '@locale';
@@ -74,6 +74,13 @@ class MonetizationElement extends PureComponent {
const { monetization } = profile;
+ // clean up old suppress warning flag
+ if (suppressComingUpWarning && monetization.monetizationStatus === MonetizationStatus.NONE) {
+ UserInteractionRepository.updateInteraction(InteractionTypes.MONETIZATION, {
+ suppress_warning_on_home_screen: false,
+ });
+ }
+
this.setState({
suppressComingUpWarning,
monetizationStatus: monetization.monetizationStatus,
@@ -138,19 +145,29 @@ class MonetizationElement extends PureComponent {
renderPaymentRequired = () => {
const { style } = this.props;
+ const { productForPurchase } = this.state;
+
+ // just making sure we are not ending up with unresponsive UI
+ if (!productForPurchase) {
+ return null;
+ }
return (
-
- {Localize.t('monetization.paymentRequiredMessage')}
-
-
+
+
+
+
+ {Localize.t('monetization.unlockFullFunctionality')}
+
+
);
};
diff --git a/src/components/Modules/MonetizationElement/styles.ts b/src/components/Modules/MonetizationElement/styles.ts
index 002e678ae..d2e1f8d99 100644
--- a/src/components/Modules/MonetizationElement/styles.ts
+++ b/src/components/Modules/MonetizationElement/styles.ts
@@ -11,15 +11,36 @@ export default StyleService.create({
alignSelf: 'stretch',
justifyContent: 'center',
alignItems: 'center',
- gap: AppSizes.paddingSml,
+ gap: AppSizes.paddingExtraSml,
},
containerRequired: {
- backgroundColor: '$lightGrey',
+ flexDirection: 'row',
+ alignItems: 'center',
+ borderRadius: AppSizes.borderRadius,
+ paddingHorizontal: AppSizes.paddingExtraSml,
+ paddingVertical: AppSizes.paddingMid,
+ backgroundColor: '$lightGreen',
+ borderColor: '$darkGreen',
+ borderWidth: StyleService.hairlineWidth,
+ gap: AppSizes.paddingExtraSml,
+ },
+ infoIcon: {
+ tintColor: StyleService.isDarkMode() ? '$darkGreen' : '$darkGreen',
},
containerComingUp: {
backgroundColor: '$lightOrange',
},
+ learnMoreButton: {
+ paddingHorizontal: AppSizes.paddingExtraSml,
+ borderRadius: AppSizes.borderRadius,
+ },
+ learnMoreButtonText: {
+ fontFamily: AppFonts.base.familyBold,
+ fontSize: AppFonts.small.size * 0.9,
+ },
okButton: {
+ marginTop: AppSizes.paddingExtraSml,
+ borderRadius: AppSizes.borderRadius,
backgroundColor: '$orange',
},
okButtonText: {
@@ -27,7 +48,7 @@ export default StyleService.create({
fontFamily: AppFonts.base.familyExtraBold,
},
messageTitle: {
- fontFamily: AppFonts.base.familyBold,
+ fontFamily: AppFonts.base.familyExtraBold,
fontSize: AppFonts.subtext.size,
color: '$textPrimary',
textAlign: 'center',
@@ -38,6 +59,13 @@ export default StyleService.create({
color: '$textPrimary',
textAlign: 'center',
},
+ messageTextSmall: {
+ fontFamily: AppFonts.base.familyBold,
+ fontSize: AppFonts.small.size * 0.9,
+ color: '$textPrimary',
+ textAlign: 'left',
+ paddingRight: AppSizes.paddingExtraSml,
+ },
actionButtonContainer: {
backgroundColor: '$contrast',
},
diff --git a/src/components/Modules/MutationWidgets/AssetsMutations.tsx b/src/components/Modules/MutationWidgets/AssetsMutations.tsx
index 5b7d1e75f..a875b1fed 100644
--- a/src/components/Modules/MutationWidgets/AssetsMutations.tsx
+++ b/src/components/Modules/MutationWidgets/AssetsMutations.tsx
@@ -17,8 +17,7 @@ import { Props } from './types';
interface State {
mutatedDec: BalanceChangeType[];
mutatedInc: BalanceChangeType[];
- factorDec: MonetaryFactorType[];
- factorInc: MonetaryFactorType[];
+ factor: MonetaryFactorType[];
assets: AssetDetails[];
}
@@ -30,8 +29,7 @@ class AssetsMutations extends PureComponent {
this.state = {
mutatedDec: [],
mutatedInc: [],
- factorDec: [],
- factorInc: [],
+ factor: [],
assets: [],
};
}
@@ -45,8 +43,7 @@ class AssetsMutations extends PureComponent {
return {
mutatedDec: monetaryDetails?.mutate[OperationActions.DEC],
mutatedInc: monetaryDetails?.mutate[OperationActions.INC],
- factorDec: monetaryDetails?.factor?.filter((f) => f.action === OperationActions.DEC) ?? [],
- factorInc: monetaryDetails?.factor?.filter((f) => f.action === OperationActions.INC) ?? [],
+ factor: monetaryDetails?.factor,
assets: assetDetails,
};
}
@@ -135,7 +132,7 @@ class AssetsMutations extends PureComponent {
};
render() {
- const { mutatedDec, mutatedInc, factorInc, factorDec, assets } = this.state;
+ const { mutatedDec, mutatedInc, factor, assets } = this.state;
// Extract complex conditions to variables
const hasMutatedDec = mutatedDec?.length > 0;
@@ -143,6 +140,11 @@ class AssetsMutations extends PureComponent {
const hasEitherMutation = (hasMutatedDec && !hasMutatedInc) || (!hasMutatedDec && hasMutatedInc);
const hasBothMutation = hasMutatedDec && hasMutatedInc;
const hasNoMutations = !hasMutatedDec && !hasMutatedInc;
+
+ const factorDec = factor?.filter((f) => f.action === OperationActions.DEC);
+ const factorInc = factor?.filter((f) => f.action === OperationActions.INC);
+ const notEffected = factor?.filter((f) => !f.action);
+ const hasNotEffected = notEffected?.length > 0;
const hasEitherFactors = !!factorInc?.length || !!factorDec?.length;
const hasBothFactors = factorInc?.length > 0 && factorDec?.length > 0;
@@ -152,16 +154,19 @@ class AssetsMutations extends PureComponent {
{assets?.length > 0 &&
(hasEitherMutation || (hasNoMutations && hasEitherFactors)) &&
this.renderSwitchIcon()}
- {mutatedDec?.map((mutate) => this.renderMonetaryElement(mutate, MonetaryStatus.IMMEDIATE_EFFECT))}
+ {mutatedDec?.map((m) => this.renderMonetaryElement(m, MonetaryStatus.IMMEDIATE_EFFECT))}
{hasBothMutation && this.renderSwitchIcon()}
- {mutatedInc?.map((mutate) => this.renderMonetaryElement(mutate, MonetaryStatus.IMMEDIATE_EFFECT))}
+ {mutatedInc?.map((m) => this.renderMonetaryElement(m, MonetaryStatus.IMMEDIATE_EFFECT))}
{hasNoMutations && hasEitherFactors && (
<>
- {factorDec?.map((factor) => this.renderMonetaryElement(factor, factor?.effect))}
+ {factorDec?.map((f) => this.renderMonetaryElement(f, f?.effect))}
{hasBothFactors && this.renderSwitchIcon()}
- {factorInc?.map((factor) => this.renderMonetaryElement(factor, factor?.effect))}
+ {factorInc?.map((f) => this.renderMonetaryElement(f, f?.effect))}
>
)}
+ {hasNoMutations &&
+ hasNotEffected &&
+ notEffected?.map((f) => this.renderMonetaryElement(f, MonetaryStatus.NO_EFFECT))}
);
}
diff --git a/src/components/Modules/MutationWidgets/Participants.tsx b/src/components/Modules/MutationWidgets/Participants.tsx
index cb4975ffb..e540346d0 100644
--- a/src/components/Modules/MutationWidgets/Participants.tsx
+++ b/src/components/Modules/MutationWidgets/Participants.tsx
@@ -75,7 +75,7 @@ class Participants extends PureComponent {
return (
<>
- {Localize.t('events.throughOfferBy')}
+ {Localize.t('events.through')} {
return null;
}
- let counterParty;
let currency;
let issuer;
@@ -164,18 +164,14 @@ class PaymentOptionItem extends Component {
});
}
- if (currency) {
- counterParty = CurrencyRepository.getCounterParty(currency);
- }
-
return (
<>
{
- {NormalizeCurrencyCode(currency?.name || source_amount.currency)}
+ {currency?.name || NormalizeCurrencyCode(source_amount.currency)}
- {counterParty?.name} {NormalizeCurrencyCode(source_amount.currency)}
+ {currency?.issuerName} {NormalizeCurrencyCode(source_amount.currency)}
diff --git a/src/components/Modules/ProductDetailsElement/ProductDetailsElement.tsx b/src/components/Modules/ProductDetailsElement/ProductDetailsElement.tsx
index 8a4ef3bb1..66a95181f 100644
--- a/src/components/Modules/ProductDetailsElement/ProductDetailsElement.tsx
+++ b/src/components/Modules/ProductDetailsElement/ProductDetailsElement.tsx
@@ -191,7 +191,7 @@ class ProductDetailsElement extends PureComponent {
return (
- {productDetails?.description || 'One full month of unrestricted Xaman use'}
+ {productDetails?.description || '30 days of unrestricted Xaman use'}
diff --git a/src/components/Modules/ProductDetailsElement/styles.ts b/src/components/Modules/ProductDetailsElement/styles.ts
index 6e79f78f0..97bd1ef12 100644
--- a/src/components/Modules/ProductDetailsElement/styles.ts
+++ b/src/components/Modules/ProductDetailsElement/styles.ts
@@ -13,7 +13,7 @@ export default StyleService.create({
fontSize: AppFonts.subtext.size,
fontFamily: AppFonts.base.familyBold,
paddingHorizontal: AppSizes.padding,
- paddingVertical: AppSizes.paddingExtraSml,
+ paddingVertical: AppSizes.screen.isSmallDevice ? AppSizes.paddingExtraSml : AppSizes.paddingSml,
textAlign: 'center',
color: '$textPrimary',
},
@@ -29,8 +29,8 @@ export default StyleService.create({
borderWidth: 1,
alignItems: 'center',
borderColor: '$orange',
- padding: AppSizes.paddingSml,
- marginTop: AppSizes.paddingSml,
+ padding: AppSizes.paddingExtraSml,
+ marginTop: AppSizes.screen.isSmallDevice ? AppSizes.paddingExtraSml : AppSizes.paddingSml,
},
price: {
fontSize: AppFonts.h4.size,
diff --git a/src/components/General/TokenAvatar/TokenAvatar.tsx b/src/components/Modules/TokenElement/TokenAvatar/TokenAvatar.tsx
similarity index 70%
rename from src/components/General/TokenAvatar/TokenAvatar.tsx
rename to src/components/Modules/TokenElement/TokenAvatar/TokenAvatar.tsx
index cc89a14e9..d1ca735c1 100644
--- a/src/components/General/TokenAvatar/TokenAvatar.tsx
+++ b/src/components/Modules/TokenElement/TokenAvatar/TokenAvatar.tsx
@@ -15,6 +15,7 @@ import { Avatar, AvatarProps } from '@components/General/Avatar';
/* Types ==================================================================== */
interface Props extends Omit {
token: TrustLineModel | 'Native';
+ saturate?: boolean;
}
interface State {
@@ -42,24 +43,18 @@ class TokenAvatar extends PureComponent {
}
static getAvatar = (token: TrustLineModel | 'Native'): string => {
- if (!token) {
- return '';
- }
-
- // native
+ // native asset
if (token === 'Native') {
const { asset } = NetworkService.getNativeAssetIcons();
return asset;
}
- // token
- const { counterParty } = token;
-
- if (counterParty.avatar) {
- return counterParty.avatar;
+ // issuer avatar
+ if (token?.currency?.issuerAvatarUrl) {
+ return token.currency.issuerAvatarUrl;
}
- if (token.isLiquidityPoolToken()) {
+ if (token?.isLiquidityPoolToken()) {
return StyleService.getImage('ImageUnknownAMM').uri;
}
@@ -67,13 +62,24 @@ class TokenAvatar extends PureComponent {
};
render() {
- const { size, imageScale, border, badge, badgeColor, containerStyle, backgroundColor } = this.props;
+ const { size, imageScale, border, badge, saturate, badgeColor, containerStyle, backgroundColor } = this.props;
const { avatar } = this.state;
+ // add saturation to avatar before passing it
+ let avatarUrl = avatar;
+ if (avatarUrl && saturate) {
+ const BASE_CDN_URL = '/cdn-cgi/image/';
+ const SATURATION_PARAM = 'saturation=0,';
+
+ if (avatarUrl) {
+ avatarUrl = avatarUrl.replace(BASE_CDN_URL, `${BASE_CDN_URL}${SATURATION_PARAM}`);
+ }
+ }
+
return (
);
}
diff --git a/src/components/General/TokenAvatar/index.ts b/src/components/Modules/TokenElement/TokenAvatar/index.ts
similarity index 100%
rename from src/components/General/TokenAvatar/index.ts
rename to src/components/Modules/TokenElement/TokenAvatar/index.ts
diff --git a/src/components/General/TokenAvatar/styles.ts b/src/components/Modules/TokenElement/TokenAvatar/styles.ts
similarity index 100%
rename from src/components/General/TokenAvatar/styles.ts
rename to src/components/Modules/TokenElement/TokenAvatar/styles.ts
diff --git a/src/components/General/TokenIcon/TokenIcon.tsx b/src/components/Modules/TokenElement/TokenIcon/TokenIcon.tsx
similarity index 75%
rename from src/components/General/TokenIcon/TokenIcon.tsx
rename to src/components/Modules/TokenElement/TokenIcon/TokenIcon.tsx
index 42e968490..fed19742d 100644
--- a/src/components/General/TokenIcon/TokenIcon.tsx
+++ b/src/components/Modules/TokenElement/TokenIcon/TokenIcon.tsx
@@ -7,7 +7,7 @@
import React, { PureComponent } from 'react';
import { Image, ImageStyle, View, ViewStyle } from 'react-native';
-import { NetworkService } from '@services';
+import { NetworkService, StyleService } from '@services';
import { TrustLineModel } from '@store/models';
@@ -16,6 +16,7 @@ import { AppSizes } from '@theme';
interface Props {
token: TrustLineModel | 'Native';
size?: number;
+ saturate?: boolean;
containerStyle?: ViewStyle | ViewStyle[];
style?: ImageStyle | ImageStyle[];
}
@@ -42,7 +43,7 @@ class TokenIcon extends PureComponent {
static getDerivedStateFromProps(nextProps: Props, prevState: State): Partial | null {
const icon = TokenIcon.getIcon(nextProps.token);
- if (icon && prevState.icon !== icon) {
+ if (prevState.icon !== icon) {
return {
icon,
};
@@ -61,22 +62,32 @@ class TokenIcon extends PureComponent {
return currency;
}
- return token.currency?.avatar;
+ return token.currency?.avatarUrl;
};
render() {
- const { size, style, containerStyle } = this.props;
+ const { saturate, size, style, containerStyle } = this.props;
const { icon } = this.state;
if (!icon) {
return null;
}
+ let iconUrl = icon;
+ if (iconUrl && saturate) {
+ const BASE_CDN_URL = '/cdn-cgi/image/';
+ const SATURATION_PARAM = `saturation=0,background=${StyleService.value('$background').replace('#', '%23')},`;
+
+ if (iconUrl) {
+ iconUrl = iconUrl.replace(BASE_CDN_URL, `${BASE_CDN_URL}${SATURATION_PARAM}`);
+ }
+ }
+
return (
);
diff --git a/src/components/General/TokenIcon/index.ts b/src/components/Modules/TokenElement/TokenIcon/index.ts
similarity index 100%
rename from src/components/General/TokenIcon/index.ts
rename to src/components/Modules/TokenElement/TokenIcon/index.ts
diff --git a/src/components/Modules/TokenElement/index.ts b/src/components/Modules/TokenElement/index.ts
new file mode 100644
index 000000000..7bce85e88
--- /dev/null
+++ b/src/components/Modules/TokenElement/index.ts
@@ -0,0 +1,2 @@
+export { TokenIcon } from './TokenIcon';
+export { TokenAvatar } from './TokenAvatar';
diff --git a/src/components/Modules/index.ts b/src/components/Modules/index.ts
index 9b1af2e87..4e5059e0c 100644
--- a/src/components/Modules/index.ts
+++ b/src/components/Modules/index.ts
@@ -24,3 +24,4 @@ export * from './MutationWidgets';
export * from './ReviewTransaction';
export * from './MonetizationElement';
export * from './ProductDetailsElement';
+export * from './TokenElement';
diff --git a/src/locale/en.json b/src/locale/en.json
index e093cc270..0565c3cd3 100644
--- a/src/locale/en.json
+++ b/src/locale/en.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open with %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Show memo",
- "throughOfferBy": "Through offer by",
+ "through": "Through",
"plannedOn": "Planned on",
"transactionId": "Transaction ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometric authentication",
"hapticFeedback": "Haptic feedback",
"developerMode": "Developer mode",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Use system currency format",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Enter your old passcode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Add an account",
@@ -1190,13 +1199,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage" : "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage" : "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1209,7 +1219,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService":"Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/af.json b/src/locale/translations/af.json
index 6f62a4229..f6267253d 100644
--- a/src/locale/translations/af.json
+++ b/src/locale/translations/af.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open met %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Wys memo",
- "throughOfferBy": "Deur aanbod deur",
+ "through": "Through",
"plannedOn": "Beplan op",
"transactionId": "Transaksie ID",
"ledgerIndex": "Grootboekindeks",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Algemene",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometriese verifikasie",
"hapticFeedback": "Haptiese terugvoer",
"developerMode": "Ontwikkelaar modus",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Gebruik die stelsel-geldeenheid-formaat",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Voer u ou wagwoord in",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Voeg 'n rekening by",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ar.json b/src/locale/translations/ar.json
index 4c7f30c1a..828429b72 100644
--- a/src/locale/translations/ar.json
+++ b/src/locale/translations/ar.json
@@ -565,7 +565,7 @@
"openWithExplorer": "فتح مع %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "إظهار المذكرة",
- "throughOfferBy": "من خلال العرض المقدم من",
+ "through": "Through",
"plannedOn": "خططت على",
"transactionId": "معرف المعاملة",
"ledgerIndex": "فهرس دفتر الأستاذ",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "عام",
@@ -758,6 +760,7 @@
"biometricAuthentication": "المصادقة البيومترية",
"hapticFeedback": "ردود الفعل اللمسية",
"developerMode": "وضع المطور",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "استخدم عملة الجهاز المحددة",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "أدخل الرمز السري القديم الخاص بك",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "إضافة حساب",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/bg.json b/src/locale/translations/bg.json
index b347d067a..5a5ab9a43 100644
--- a/src/locale/translations/bg.json
+++ b/src/locale/translations/bg.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Отваряне с %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Показване на Мемо",
- "throughOfferBy": "Чрез оферта от",
+ "through": "Through",
"plannedOn": "Планирано на",
"transactionId": "Идентификатор на транзакция",
"ledgerIndex": "Индекс на счетоводна книга (Ledger Index)",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Общ",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Биометрично удостоверяване",
"hapticFeedback": "Хаптична обратна връзка",
"developerMode": "Икономичен режим",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Форматиране на валута на системата",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Въведете старата си парола",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Добавяне на сметка",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/bn-BD.json b/src/locale/translations/bn-BD.json
index 0b7aaa133..cdd1ccd55 100644
--- a/src/locale/translations/bn-BD.json
+++ b/src/locale/translations/bn-BD.json
@@ -565,7 +565,7 @@
"openWithExplorer": "সঙ্গে খোলা %{explorer} ",
"openInExplorer": "Open in explorer",
"showMemo": "মেমো দেখান",
- "throughOfferBy": "অফার মাধ্যমে",
+ "through": "Through",
"plannedOn": "পরিকল্পনা করা হয়েছে",
"transactionId": "লেনদেন নাম্বার",
"ledgerIndex": "লেজার সূচক",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "সাধারণ",
@@ -758,6 +760,7 @@
"biometricAuthentication": "বায়োমেট্রিক প্রমাণীকরণ",
"hapticFeedback": "হাপটিক প্রতিক্রিয়া",
"developerMode": "বিকাশকারী মোড",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "সিস্টেম মুদ্রার ফর্ম্যাট ব্যবহার করুন",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "আপনার পুরানো পাসকোড প্রবেশ করান",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "একটি অ্যাকাউন্ট যুক্ত করুন",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ca.json b/src/locale/translations/ca.json
index 95d63662c..dd464ff2e 100644
--- a/src/locale/translations/ca.json
+++ b/src/locale/translations/ca.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Obre amb %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Mostra la nota",
- "throughOfferBy": "Mitjançant l'oferta de",
+ "through": "Through",
"plannedOn": "Planificat",
"transactionId": "Identificador de la transacció",
"ledgerIndex": "Índex de Registre",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticació biomètrica",
"hapticFeedback": "Retroalimentació hàptica",
"developerMode": "Mode de desenvolupador",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Format de la moneda del sistema",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Introdueix la contrasenya antiga",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Afegeix un compte",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/cs.json b/src/locale/translations/cs.json
index fc6a2a3ca..e9e9ae59c 100644
--- a/src/locale/translations/cs.json
+++ b/src/locale/translations/cs.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Otevřít pomocí %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Zobrazit zprávu",
- "throughOfferBy": "Prostřednictvím nabídky od",
+ "through": "Through",
"plannedOn": "Naplánováno na",
"transactionId": "ID transakce",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Obecné",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrické ověření",
"hapticFeedback": "Odezva na dotek (haptická zpětná vazba)",
"developerMode": "Režim vývojáře",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formát měny systému",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Zadejte své původní přístupové heslo",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Přidat účet",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/da.json b/src/locale/translations/da.json
index dd4af0804..da0dae802 100644
--- a/src/locale/translations/da.json
+++ b/src/locale/translations/da.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Åbn med %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Vis besked",
- "throughOfferBy": "Ved hjælp af tilbud fra",
+ "through": "Through",
"plannedOn": "Planlagt den",
"transactionId": "Transaktions-ID",
"ledgerIndex": "Ledger indeks",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Generelt",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrisk validering",
"hapticFeedback": "Haptisk feedback",
"developerMode": "Udviklertilstand",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Brug systemets valuta indstillinger",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Indtast din gamle adgangskode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Tilføj en konto",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/de.json b/src/locale/translations/de.json
index dd4daa4f6..181dcfd2a 100644
--- a/src/locale/translations/de.json
+++ b/src/locale/translations/de.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Öffnen mit %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Notiz anzeigen",
- "throughOfferBy": "Durch Angebot von",
+ "through": "Through",
"plannedOn": "Geplant am",
"transactionId": "Transaktions-ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Allgemein",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrische Authentifizierung",
"hapticFeedback": "Haptisches Feedback",
"developerMode": "Entwicklermodus",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Systemwährung einstellen",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Alte Geheimzahl eingeben",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Konto hinzufügen",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/el.json b/src/locale/translations/el.json
index 45be152a3..cf2251e90 100644
--- a/src/locale/translations/el.json
+++ b/src/locale/translations/el.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Άνοιγμα με το %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Εμφάνιση σημειώματος",
- "throughOfferBy": "Μέσω της προσφοράς από",
+ "through": "Through",
"plannedOn": "Προγραμματισμένο στις",
"transactionId": "Ταυτότητα συναλλαγής",
"ledgerIndex": "Δείκτης Ledger",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Γενικά",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Βιομετρική ταυτοποίηση",
"hapticFeedback": "Haptic σχόλια",
"developerMode": "Λειτουργία προγραμματιστή",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Μορφοποίηση νομίσματος συστήματος",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Καταχωρήστε τον παλιό κωδικό πρόσβασης",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Προσθήκη λογαριασμού",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/en-AU.json b/src/locale/translations/en-AU.json
index 619249257..1803c0a99 100644
--- a/src/locale/translations/en-AU.json
+++ b/src/locale/translations/en-AU.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open with %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Show memo",
- "throughOfferBy": "Through offer by",
+ "through": "Through",
"plannedOn": "Planned on",
"transactionId": "Transaction ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometric authentication",
"hapticFeedback": "Haptic feedback",
"developerMode": "Developer mode\r\n",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Use system currency format",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Enter your old passcode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Add an account",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/es-419.json b/src/locale/translations/es-419.json
index d16d93dd3..36957ca6d 100644
--- a/src/locale/translations/es-419.json
+++ b/src/locale/translations/es-419.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Abrir con %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Mostrar nota",
- "throughOfferBy": "Mediante oferta de",
+ "through": "Through",
"plannedOn": "Previsto para",
"transactionId": "Identificador de transacción",
"ledgerIndex": "Índice de Registro",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticación biométrica",
"hapticFeedback": "Retroalimentación táctil",
"developerMode": "Modalidad de programador",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formato de moneda del sistema",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Ingrese su contraseña anterior",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Agregar una cuenta",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/es.json b/src/locale/translations/es.json
index 610dff275..6e21f2838 100644
--- a/src/locale/translations/es.json
+++ b/src/locale/translations/es.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Abrir con %{explorer}",
"openInExplorer": "Abrir en el explorador",
"showMemo": "Mostrar nota",
- "throughOfferBy": "A través de oferta de",
+ "through": "Through",
"plannedOn": "Planeado en",
"transactionId": "ID de la transacción",
"ledgerIndex": "Índice de Registro",
@@ -719,7 +719,9 @@
"chooseAmount": "Elegir cantidad",
"aboutThisXApp": "Sobre esta xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticación biométrica",
"hapticFeedback": "Feedback háptico",
"developerMode": "Modo Programador",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formato de moneda del sistema",
"showReserveValue": "Mostrar el valor de la reserva en la pantalla de inicio",
"enterOldPasscode": "Ingresa tu contraseña anterior",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Agregar una cuenta",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/et.json b/src/locale/translations/et.json
index 5815532e1..c39005125 100644
--- a/src/locale/translations/et.json
+++ b/src/locale/translations/et.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Ava %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Näita memo",
- "throughOfferBy": "Läbi pakkumise",
+ "through": "Through",
"plannedOn": "Plaanitud",
"transactionId": "TehinguID",
"ledgerIndex": "Pearaamatu indeks",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Üldine",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biomeetriline autentimine",
"hapticFeedback": "Taktiline(haptiline) tagasiside",
"developerMode": "Arendaja režiim",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Süsteemi valuuta vormindamine",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Sisesta oma vana pääsukood",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Lisa konto",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/eu.json b/src/locale/translations/eu.json
index e342fcc21..cdea89fa6 100644
--- a/src/locale/translations/eu.json
+++ b/src/locale/translations/eu.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Ireki honekin %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Erakutsi oharra",
- "throughOfferBy": "By eskaintzaren bidez",
+ "through": "Through",
"plannedOn": "Aurreikusita",
"transactionId": "Transakzioaren ID",
"ledgerIndex": "Liburuaren aurkibidea",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Orokorra",
@@ -758,6 +760,7 @@
"biometricAuthentication": "biometrikoa autentifikazioa",
"hapticFeedback": "Iritzi haptikoa",
"developerMode": "Garatzaile modua",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Sistemaren moneta formateatzea",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Idatzi zure pasakode zaharra",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Gehitu kontua",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/fi.json b/src/locale/translations/fi.json
index 6b57ca0b4..1e7fea1b5 100644
--- a/src/locale/translations/fi.json
+++ b/src/locale/translations/fi.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Avaa käyttämällä %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Näytä muistio",
- "throughOfferBy": "Tarjouksen kautta",
+ "through": "Through",
"plannedOn": "Suunniteltu",
"transactionId": "Tapahtuman tunnus",
"ledgerIndex": "pääkirjahakemisto",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Yleinen",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrinen tunnistus",
"hapticFeedback": "Tuntoaistinen palaute",
"developerMode": "Kehittäjätila",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Käytä järjestelmävaluutan muotoilua",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Anna vanha salasanasi",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Lisää tili",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/fil.json b/src/locale/translations/fil.json
index 1d7530bea..fa8408662 100644
--- a/src/locale/translations/fil.json
+++ b/src/locale/translations/fil.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Buksan gamit %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Ipakita ang talaan",
- "throughOfferBy": "Sa pamamagitan ng alok ni",
+ "through": "Through",
"plannedOn": "Nakaplano sa",
"transactionId": "ID ng transaksyon",
"ledgerIndex": "Ledger talatuntunan",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Pangkalahatan",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Pagpapatotoo ng biometric",
"hapticFeedback": "Haptic puna",
"developerMode": "Mode ng developer",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "sistema pera ayos",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Ipasok ang iyong lumang passcode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Magdagdag ng isang account",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/fr.json b/src/locale/translations/fr.json
index 4fc6c5be9..f6b5e956d 100644
--- a/src/locale/translations/fr.json
+++ b/src/locale/translations/fr.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Ouvrir avec %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Afficher le commentaire",
- "throughOfferBy": "Par offre par",
+ "through": "Through",
"plannedOn": "Planifié le",
"transactionId": "ID de transaction",
"ledgerIndex": "Index du registre",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Général",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Authentification biométrique",
"hapticFeedback": "Vibrations au toucher",
"developerMode": "Mode développeur",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Format des devises",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Entrez votre ancien code d'accès",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Ajouter un compte",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/gl-ES.json b/src/locale/translations/gl-ES.json
index 1dc147882..56196a2be 100644
--- a/src/locale/translations/gl-ES.json
+++ b/src/locale/translations/gl-ES.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Abrir con %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Mostrar memo",
- "throughOfferBy": "A través dunha oferta de",
+ "through": "Through",
"plannedOn": "Planificado en",
"transactionId": "ID da transacción",
"ledgerIndex": "Índice Ledger",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Xeral",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticación biométrica",
"hapticFeedback": "Feedback háptico",
"developerMode": "Modo desarrollador",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formateo de moeda do sistema",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Introduza o seu antigo código PIN",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Engadir unha conta",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/gu.json b/src/locale/translations/gu.json
index 9e260ca0b..e4909ba91 100644
--- a/src/locale/translations/gu.json
+++ b/src/locale/translations/gu.json
@@ -565,7 +565,7 @@
"openWithExplorer": "સાથે ખોલો %{explorer}\r\n",
"openInExplorer": "Open in explorer",
"showMemo": "મેમો બતાવો",
- "throughOfferBy": "દ્વારા ઓફર દ્વારા",
+ "through": "Through",
"plannedOn": "પર આયોજિત",
"transactionId": "ટ્રાન્ઝેક્શન આઈડી",
"ledgerIndex": "લેજર ઇન્ડેક્સ",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "જનરલ",
@@ -758,6 +760,7 @@
"biometricAuthentication": "બાયોમેટ્રિક પ્રમાણીકરણ",
"hapticFeedback": "હેપ્ટિક પ્રતિસાદ",
"developerMode": "વિકાસકર્તા મોડ",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "સિસ્ટમ ચલણ ફોર્મેટનો ઉપયોગ કરો",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "તમારો જૂનો પાસકોડ દાખલ કરો",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "એક એકાઉન્ટ ઉમેરો",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/he.json b/src/locale/translations/he.json
index 4835baa74..2718e161b 100644
--- a/src/locale/translations/he.json
+++ b/src/locale/translations/he.json
@@ -565,7 +565,7 @@
"openWithExplorer": "פתיחה באמצעות %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "הראה תזכיר",
- "throughOfferBy": "באמצעות הצעה מאת",
+ "through": "Through",
"plannedOn": "מתוכנן על",
"transactionId": "מזהה עסקה",
"ledgerIndex": "לדג'ר אינדקס",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "כְּלָלִי",
@@ -758,6 +760,7 @@
"biometricAuthentication": "אימות ביומטרי",
"hapticFeedback": "משוב הפטי",
"developerMode": "מצב מפתח",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "שינוי מטבע להצגה",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "קלד את קוד הכניסה הישן שלך",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "הוסף חשבון",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/hi-IN.json b/src/locale/translations/hi-IN.json
index 44e0e30eb..f8fdeadc4 100644
--- a/src/locale/translations/hi-IN.json
+++ b/src/locale/translations/hi-IN.json
@@ -565,7 +565,7 @@
"openWithExplorer": "%{explorer} के साथ खोलें",
"openInExplorer": "Open in explorer",
"showMemo": "मेमो दिखाओ",
- "throughOfferBy": "द्वारा ऑफ़र के माध्यम से",
+ "through": "Through",
"plannedOn": "पर योजना बनाई",
"transactionId": "लेन देन आईडी",
"ledgerIndex": "खाता सूचकांक",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "सामान्य",
@@ -758,6 +760,7 @@
"biometricAuthentication": "बायोमेट्रिक प्रमाणीकरण",
"hapticFeedback": "हप्टिक राय",
"developerMode": "डेवलपर मोड",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "तंत्र मुद्रा स्वरूपण",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "अपना पुराना पासकोड डालें",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "एक खाता जोड़ें",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/hr.json b/src/locale/translations/hr.json
index 3351436ed..d4c0e1482 100644
--- a/src/locale/translations/hr.json
+++ b/src/locale/translations/hr.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Otvori s %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Pokaži memo",
- "throughOfferBy": "Kroz ponudu",
+ "through": "Through",
"plannedOn": "Planiran na",
"transactionId": "ID transakcije",
"ledgerIndex": "Indeks glavne knjige",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Općenito",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrijska provjera autentičnosti",
"hapticFeedback": "Haptična povratna informacija",
"developerMode": "Način za programere",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formatiranje sistemske valute",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Unesite staru lozinku",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Dodavanje računa",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ht.json b/src/locale/translations/ht.json
index c2f59ea1a..8cf0dd0e0 100644
--- a/src/locale/translations/ht.json
+++ b/src/locale/translations/ht.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Louvri ak %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Montre memo",
- "throughOfferBy": "Atravè òf pa",
+ "through": "Through",
"plannedOn": "Planifye sou",
"transactionId": "Tranzaksyon ID",
"ledgerIndex": "Ledger Endèks",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Jeneral",
@@ -758,6 +760,7 @@
"biometricAuthentication": "byometrik otantifikasyon",
"hapticFeedback": "fidbak haptik",
"developerMode": "pwomotè mòd",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Fòma lajan sistèm lan",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Antre ansyen paskod ou an",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Ajoute yon kont",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/hu.json b/src/locale/translations/hu.json
index e50b1c4a7..a51f0dcf5 100644
--- a/src/locale/translations/hu.json
+++ b/src/locale/translations/hu.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open with %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Show memo",
- "throughOfferBy": "Through offer by",
+ "through": "Through",
"plannedOn": "Planned on",
"transactionId": "Transaction ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometric authentication",
"hapticFeedback": "Haptic feedback",
"developerMode": "Developer mode",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Use system currency format",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Enter your old passcode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Add an account",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/id.json b/src/locale/translations/id.json
index aff0f9243..277d4a67d 100644
--- a/src/locale/translations/id.json
+++ b/src/locale/translations/id.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Buka dengan %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Tunjukkan memo",
- "throughOfferBy": "Melalui penawaran oleh",
+ "through": "Through",
"plannedOn": "Direncanakan pada",
"transactionId": "ID transaksi",
"ledgerIndex": "Indeks Buku Besar",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Umum",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autentikasi biometrik",
"hapticFeedback": "Umpan balik sentuhan",
"developerMode": "mode pengembang",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Gunakan format mata uang sistem",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Masukkan kode sandi lama Anda",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Tambahkan akun",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/it.json b/src/locale/translations/it.json
index 7c63b3622..c9f4736ef 100644
--- a/src/locale/translations/it.json
+++ b/src/locale/translations/it.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Apri con l'esploratore %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Mostra memo",
- "throughOfferBy": "Attraverso l'offerta di",
+ "through": "Through",
"plannedOn": "Pianificati",
"transactionId": "Id della transazione",
"ledgerIndex": "Indice del Registro",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Generale",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticazione biometrica",
"hapticFeedback": "Feedback tattile",
"developerMode": "Modalità sviluppatore",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formattazione della valuta di sistema",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Inserisci il tuo vecchio codice di sblocco",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Aggiungi un account",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ja.json b/src/locale/translations/ja.json
index 76a7424c2..86edd5599 100644
--- a/src/locale/translations/ja.json
+++ b/src/locale/translations/ja.json
@@ -565,7 +565,7 @@
"openWithExplorer": "%{explorer}で開く",
"openInExplorer": "エクスプローラで開く",
"showMemo": "メモを表示",
- "throughOfferBy": "による提供を通じて",
+ "through": "Through",
"plannedOn": "計画中",
"transactionId": "トランザクション ID",
"ledgerIndex": "レジャーインデックス",
@@ -719,7 +719,9 @@
"chooseAmount": "支援金額を選択",
"aboutThisXApp": "このxAppについて",
"xAppSupportNetworkError": "このxAppは、接続中のネットワークでは利用できません。",
- "switchToSupportedNetworks": "以下の対応ネットワークのいずれかに切り替えてください。"
+ "switchToSupportedNetworks": "以下の対応ネットワークのいずれかに切り替えてください。",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "一般",
@@ -758,6 +760,7 @@
"biometricAuthentication": "生体認証",
"hapticFeedback": "触覚フィードバック",
"developerMode": "開発者モード",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "システムの通貨形式を使用",
"showReserveValue": "ホーム画面に準備金を表示",
"enterOldPasscode": "古いパスコードを入力してください",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "このネットワークにはノードは1つしかなく、デフォルトとして設定済みです。",
"networkUpdates": "ネットワークの更新情報",
"everythingIsUpdateToDate": "全て最新です",
- "networkAreUpdateToDate": "現在、ネットワーク設定の追加や変更はありません。"
+ "networkAreUpdateToDate": "現在、ネットワーク設定の追加や変更はありません。",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "アカウントを追加",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ka.json b/src/locale/translations/ka.json
index 08a842d10..614e99ea6 100644
--- a/src/locale/translations/ka.json
+++ b/src/locale/translations/ka.json
@@ -565,7 +565,7 @@
"openWithExplorer": "ლეჯერზე ნახვა: %{explorer} ",
"openInExplorer": "Open in explorer",
"showMemo": "მემოს ჩვენება",
- "throughOfferBy": "მეშვეობით შეთავაზება",
+ "through": "Through",
"plannedOn": "დაგეგმილი",
"transactionId": "ტრანზაქციის ID ",
"ledgerIndex": "ლეჯერის ინდექსი",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "ზოგადი პარამეტრები",
@@ -758,6 +760,7 @@
"biometricAuthentication": "ბიომეტრიული ავთენტიფიკაცია",
"hapticFeedback": "ვიბრაცია უკუკავშირზე ",
"developerMode": "დეველოპერის რეჟიმი ",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "სისტემის ვალუტის ფორმატირება",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "შეიყვანეთ თქვენი ძველი პასკოდი",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ანგარიშის დამატება",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/kk.json b/src/locale/translations/kk.json
index fe8a1bfb0..1328326ee 100644
--- a/src/locale/translations/kk.json
+++ b/src/locale/translations/kk.json
@@ -565,7 +565,7 @@
"openWithExplorer": " Көмегімен ашу %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Белгіні көрсету",
- "throughOfferBy": "Ұсыныс арқылы",
+ "through": "Through",
"plannedOn": "Жоспарланған",
"transactionId": "Транзакция идентификаторы",
"ledgerIndex": "Тізілім Индексі",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Жалпы",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Биометриялық аутентификация",
"hapticFeedback": "Тактильді кері байланыс",
"developerMode": "Әзірлеуші режимі",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Валюта жүйесін пайдалану форматы",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Ескі құпия сөзді енгізіңіз",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Есептік жазба қосу",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/kn.json b/src/locale/translations/kn.json
index c3b40dbf0..25627afe7 100644
--- a/src/locale/translations/kn.json
+++ b/src/locale/translations/kn.json
@@ -565,7 +565,7 @@
"openWithExplorer": "ತೆರೆಯಿರಿ %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "ಮೆಮೊ ತೋರಿಸಿ",
- "throughOfferBy": "ಮೂಲಕ ಪ್ರಸ್ತಾಪವನ್ನು ಮೂಲಕ",
+ "through": "Through",
"plannedOn": "ಯೋಜಿಸಲಾಗಿದೆ",
"transactionId": "ವಹಿವಾಟು ID",
"ledgerIndex": "ಲೆಡ್ಜರ್ ಸೂಚ್ಯಂಕ",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "ಜನರಲ್",
@@ -758,6 +760,7 @@
"biometricAuthentication": "ಬಯೊಮೀಟ್ರಿಕ್ ದೃಢೀಕರಣ",
"hapticFeedback": "ಹ್ಯಾಪ್ಟಿಕ್ ಪ್ರತಿಕ್ರಿಯೆ",
"developerMode": "ಡೆವಲಪರ್ ಮೋಡ್",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "ಸಿಸ್ಟಮ್ ಕರೆನ್ಸಿ ಫಾರ್ಮ್ಯಾಟಿಂಗ್",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "ನಿಮ್ಮ ಹಳೆಯ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ಖಾತೆಯನ್ನು ಸೇರಿಸಿ",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ko.json b/src/locale/translations/ko.json
index 5481d0d60..10b648143 100644
--- a/src/locale/translations/ko.json
+++ b/src/locale/translations/ko.json
@@ -565,7 +565,7 @@
"openWithExplorer": "%{explorer} (으)로 열기",
"openInExplorer": "Open in explorer",
"showMemo": "메모 보기",
- "throughOfferBy": "제공을 통해",
+ "through": "Through",
"plannedOn": "계획됨",
"transactionId": "거래 ID",
"ledgerIndex": "레저 지수",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "일반",
@@ -758,6 +760,7 @@
"biometricAuthentication": "생체 인증",
"hapticFeedback": "햅틱 피드백",
"developerMode": "개발자 모드",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "시스템 통화 포맷팅 사용하기",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "이전 비밀번호를 입력하십시오.",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "계정 추가",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/lt.json b/src/locale/translations/lt.json
index 47da18333..c0d44244b 100644
--- a/src/locale/translations/lt.json
+++ b/src/locale/translations/lt.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Atidaryti su %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Rodyti atmintinę",
- "throughOfferBy": "Per pasiūlymą",
+ "through": "Through",
"plannedOn": "Planuojama",
"transactionId": "Operacijos ID",
"ledgerIndex": "Knygos Indeksas",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Generolas",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrinių duomenų autentifikavimas",
"hapticFeedback": "Feedback - grįžtamasis ryšys",
"developerMode": "Kūrėjo režimas",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Sistemos valiutos formatavimas",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Įveskite senąjį slaptažodį",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Pridėti sąskaitą",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/lv.json b/src/locale/translations/lv.json
index 8f1185504..2c761fd70 100644
--- a/src/locale/translations/lv.json
+++ b/src/locale/translations/lv.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Atvērt ar %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Rādīt ziņojumu",
- "throughOfferBy": "Ar piedāvājuma palīdzību",
+ "through": "Through",
"plannedOn": "Plānotie",
"transactionId": "Darījuma ID",
"ledgerIndex": "Virsgrāmatas indekss",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Vispārīgi noteikumi",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometriskā autentifikācija",
"hapticFeedback": "Laimīgas atsauksmes",
"developerMode": "Izstrādātāja režīms",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Sistēmas valūtas formatēšana",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Ievadiet veco paroli",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Pievienot kontu",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ml.json b/src/locale/translations/ml.json
index ae4a1f2da..b909526ab 100644
--- a/src/locale/translations/ml.json
+++ b/src/locale/translations/ml.json
@@ -565,7 +565,7 @@
"openWithExplorer": "ഇതിലൂടെ തുറക്കു %{explorer}\r\n",
"openInExplorer": "Open in explorer",
"showMemo": "മെമ്മോ കാണിക്കുക",
- "throughOfferBy": "ഓഫർ വഴി",
+ "through": "Through",
"plannedOn": "ആസൂത്രണം ചെയ്തു",
"transactionId": "ഇടപാട് ഐഡി",
"ledgerIndex": "ലെഡ്ജർ സൂചിക",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "ജനറൽ",
@@ -758,6 +760,7 @@
"biometricAuthentication": "ബയോമെട്രിക് പ്രാമാണീകരണം",
"hapticFeedback": "ഹപ്റ്റിക് ഫീഡ്ബാക്ക്",
"developerMode": "ഡവലപ്പർ മോഡ്",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "സിസ്റ്റം കറൻസി ഫോർമാറ്റ് ഉപയോഗിക്കുക",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "നിങ്ങളുടെ പഴയ പാസ്കോഡ് നൽകുക",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ഒരു അക്കൗണ്ട് ചേർക്കുക",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/mr.json b/src/locale/translations/mr.json
index 416cfbd18..c4744184c 100644
--- a/src/locale/translations/mr.json
+++ b/src/locale/translations/mr.json
@@ -565,7 +565,7 @@
"openWithExplorer": "च्या सहाय्याने उघडणे %{explorer}\r\n",
"openInExplorer": "Open in explorer",
"showMemo": "मेमो दाखवा",
- "throughOfferBy": "ऑफर द्वारे",
+ "through": "Through",
"plannedOn": "वर नियोजित",
"transactionId": "व्यवहार आयडी",
"ledgerIndex": "लेजर इंडेक्स",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "सामान्य",
@@ -758,6 +760,7 @@
"biometricAuthentication": "बायोमेट्रिक प्रमाणीकरण",
"hapticFeedback": "हॅप्टिक अभिप्राय",
"developerMode": "विकसक मोड",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "सिस्टम चलन स्वरूप वापरा",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "आपला जुना पासकोड प्रविष्ट करा",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "खाते जोडा",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/nl.json b/src/locale/translations/nl.json
index b408e4c0d..b340a3c65 100644
--- a/src/locale/translations/nl.json
+++ b/src/locale/translations/nl.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open met %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Toon memo",
- "throughOfferBy": "Via aanbieding door",
+ "through": "Through",
"plannedOn": "Gepland op",
"transactionId": "Transactie ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Kies bedrag",
"aboutThisXApp": "Over deze xApp",
"xAppSupportNetworkError": "Deze xApp is niet beschikbaar op het netwerk waarmee u verbonden bent",
- "switchToSupportedNetworks": "Schakel over naar een van de ondersteunde netwerken hieronder"
+ "switchToSupportedNetworks": "Schakel over naar een van de ondersteunde netwerken hieronder",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Algemeen",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrische authenticatie",
"hapticFeedback": "Haptische feedback",
"developerMode": "Ontwikkelaarsmodus",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Gebruik systeem valuta format",
"showReserveValue": "Toon reservewaarde op startscherm",
"enterOldPasscode": "Voer uw oude toegangscode in",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "Dit netwerk heeft slechts één node, die al is ingesteld als standaard.",
"networkUpdates": "Netwerk updates",
"everythingIsUpdateToDate": "Alles is up-to-date",
- "networkAreUpdateToDate": "Er zijn momenteel geen toevoegingen of wijzigingen voor netwerkinstellingen."
+ "networkAreUpdateToDate": "Er zijn momenteel geen toevoegingen of wijzigingen voor netwerkinstellingen.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Account toevoegen",
@@ -1187,20 +1196,21 @@
},
"monetization": {
"oneTimeCharge": "Eenmalige kosten",
- "payWithApplePay": "Betaal met Apple Pay",
- "payWithGooglePay": "Betaal met Google Pay",
- "restorePurchase": "Herstel aankoop",
- "thankYouForUsingXaman": "Bedankt voor het gebruik van Xaman!",
- "comingPaymentWarning": "U geniet nog steeds gratis van Xaman, maar u nadert onze gratis limiet. Om Xaman's innovatie en beveiliging te ondersteunen, kan binnenkort een kleine in-app betaling worden gevraagd.",
- "paymentRequiredMessage": "Een kleine betaling is vereist om onbeperkte toegang te behouden voor de komende 30 dagen. Als alternatief zal Xaman overschakelen naar beperkte-gebruiksmodus tot uw maandelijkse limieten automatisch worden gereset.",
- "prePurchaseMessage": "Bedankt voor uw steun! Uw betaling ontgrendelt een volledige maand onbeperkt gebruik van Xaman, wat ons helpt te innoveren, premium ondersteuning te bieden en de beveiliging van uw activa te waarborgen.",
- "learnMore": "Meer informatie",
- "monetizationRequiredForThisFeature": "U kunt momenteel geen Ondertekeningsverzoeken & xApps openen: een kleine betaling is vereist om een volledige maand onbeperkt gebruik van Xaman te ontgrendelen. Het ontwikkelen van Xaman en het bouwen van veilige software kost veel middelen. We hopen dat u ons zult steunen om door te gaan met bouwen. Als u besluit dit niet te doen: elke maand worden uw limieten gereset, waardoor u weer xApps & Ondertekeningsverzoeken kunt openen.",
- "allSet": "Alles klaar!",
- "thankYouForPurchase": "Bedankt voor uw aankoop.",
- "noPurchaseFound": "Geen Aankopen Gevonden",
- "noPreviousPurchases": "We konden geen eerdere aankopen vinden om te herstellen. Als u denkt dat dit een fout is, neem dan contact op met ons support team.",
- "errorRestorePurchase": "Er is een onverwachte fout opgetreden bij het controleren van uw aankoopgeschiedenis.\n\nProbeer het later opnieuw of neem contact op met ons support team als het probleem aanhoudt.",
+ "payWithApplePay": "Pay with Apple Pay",
+ "payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
+ "restorePurchase": "Restore Purchase",
+ "thankYouForUsingXaman": "Thank you for using Xaman!",
+ "comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
+ "paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
+ "learnMore": "Learn more",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "allSet": "All set!",
+ "thankYouForPurchase": "Thank you for your purchase.",
+ "noPurchaseFound": "No Purchases Found",
+ "noPreviousPurchases": "We couldn't find any previous purchases to restore. If you believe this is an error, please contact our support team.",
+ "errorRestorePurchase": "An unexpected error occurred while checking your purchase history.\n\nPlease try again later or contact our support team if the issue persists.",
"couldNotFetchProductDetails": "Error fetching product details. Please try again later or contact support if the issue persists.",
"purchaseFailed": "Purchase failed!",
"termsAndConditions": "Terms and conditions",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oeps! Kan de Algemene Voorwaarden niet ophalen",
diff --git a/src/locale/translations/no-NO.json b/src/locale/translations/no-NO.json
index eda9baf2e..2691d8c05 100644
--- a/src/locale/translations/no-NO.json
+++ b/src/locale/translations/no-NO.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Åpne med %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Vis notat",
- "throughOfferBy": "Gjennom tilbud fra",
+ "through": "Through",
"plannedOn": "Planlagt den",
"transactionId": "Transaksjons-id",
"ledgerIndex": "Ledger indeks",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Generelt",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrisk autentisering",
"hapticFeedback": "Haptisk tilbakemelding",
"developerMode": "Utviklermodus",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formatering av systemvaluta",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Legg inn din gamle kode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Legg til en konto",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/pa.json b/src/locale/translations/pa.json
index 3e99b2764..fe7a61540 100644
--- a/src/locale/translations/pa.json
+++ b/src/locale/translations/pa.json
@@ -565,7 +565,7 @@
"openWithExplorer": "ਨਾਲ ਖੋਲ੍ਹੋ %{explorer}\r\n",
"openInExplorer": "Open in explorer",
"showMemo": "ਮੀਮੋ ਦਿਖਾਓ",
- "throughOfferBy": "ਦੁਆਰਾ ਪੇਸ਼ਕਸ਼ ਦੁਆਰਾ",
+ "through": "Through",
"plannedOn": "ਦੀ ਯੋਜਨਾ ਬਣਾਈ",
"transactionId": "ਟ੍ਰਾਂਜੈਕਸ਼ਨ ਆਈਡੀ",
"ledgerIndex": "ਲੇਜਰ ਇੰਡੈਕਸ",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "ਜਨਰਲ",
@@ -758,6 +760,7 @@
"biometricAuthentication": "ਬਾਇਓਮੈਟ੍ਰਿਕ ਪ੍ਰਮਾਣਿਕਤਾ",
"hapticFeedback": "ਹੈਪੇਟਿਕ ਫੀਡਬੈਕ",
"developerMode": "ਡਿਵੈਲਪਰ ਮੋਡ",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "ਸਿਸਟਮ ਮੁਦਰਾ ਦਾ ਫਾਰਮੈਟ ਵਰਤੋ",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਕੋਡ ਦਰਜ ਕਰੋ",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/pl.json b/src/locale/translations/pl.json
index f1bd7bc8c..9f26c2bb7 100644
--- a/src/locale/translations/pl.json
+++ b/src/locale/translations/pl.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Otwórz w %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Pokaż notatkę",
- "throughOfferBy": "Poprzez ofertę wg",
+ "through": "Through",
"plannedOn": "Planowane w dniu",
"transactionId": "Identyfikator transakcji",
"ledgerIndex": "Indeks sieci XRPL",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Ogólne",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Uwierzytelnianie biometryczne",
"hapticFeedback": "Wibracje przy powiadomieniu",
"developerMode": "Tryb programisty",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formatowanie walut według systemu operacyjnego",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Wpisz stary kod PIN",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Dodaj konto",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/pt-BR.json b/src/locale/translations/pt-BR.json
index 93c497dca..297f1f69c 100644
--- a/src/locale/translations/pt-BR.json
+++ b/src/locale/translations/pt-BR.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Abrir com %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Mostrar nota",
- "throughOfferBy": "Através de oferta por",
+ "through": "Through",
"plannedOn": "Planejado em",
"transactionId": "Id da transação",
"ledgerIndex": "Índice do ledger",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Geral",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticação biométrica",
"hapticFeedback": "Feedback Háptico",
"developerMode": "Modo desenvolvedor",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Câmbio do sistema a formatar",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Introduza o seu código PIN antigo",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Adicionar uma conta",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/pt.json b/src/locale/translations/pt.json
index 5031121b2..c451292d0 100644
--- a/src/locale/translations/pt.json
+++ b/src/locale/translations/pt.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Abrir com %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Mostrar memo",
- "throughOfferBy": "Através da oferta por",
+ "through": "Through",
"plannedOn": "Planeado em",
"transactionId": "ID de transação",
"ledgerIndex": "Índice do ledger",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Geral",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autenticação biométrica",
"hapticFeedback": "Feedback Háptico",
"developerMode": "Modo desenvolvedor",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formato de moeda do sistema",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Introduza o seu código de acesso antigo. ",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Adicionar uma conta",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ro.json b/src/locale/translations/ro.json
index 78ed3c8bf..8c103cbd4 100644
--- a/src/locale/translations/ro.json
+++ b/src/locale/translations/ro.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Deschideți cu %{explorer}.",
"openInExplorer": "Open in explorer",
"showMemo": "Afișați Memo.",
- "throughOfferBy": "Prin ofertă emisă de",
+ "through": "Through",
"plannedOn": "Planificat pe",
"transactionId": "ID tranzacţie",
"ledgerIndex": "Index registru",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Autentificare biometrică",
"hapticFeedback": "Feedback haptic",
"developerMode": "Opțiuni dezvoltator",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Utilizează formatul Monedă",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Introduceţi anteriorul cod de acces.",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Adăugaţi un cont. ",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ru.json b/src/locale/translations/ru.json
index ded0d9b79..131ae23e2 100644
--- a/src/locale/translations/ru.json
+++ b/src/locale/translations/ru.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Открыть с помощью %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Показать примечание",
- "throughOfferBy": "Через предложение",
+ "through": "Through",
"plannedOn": "Запланировано на",
"transactionId": "ID транзакции",
"ledgerIndex": "Индекс учетной книги",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Общие",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Биометрическая аутентификация",
"hapticFeedback": "Тактильная обратная связь",
"developerMode": "Режим разработчика",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Системный формат валюты",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Введите Ваш старый ПИН-код",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Добавить аккаунт",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/sd.json b/src/locale/translations/sd.json
index 6302550b8..231b19118 100644
--- a/src/locale/translations/sd.json
+++ b/src/locale/translations/sd.json
@@ -565,7 +565,7 @@
"openWithExplorer": " سان کوليو %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "ميمو ڏيکاريو",
- "throughOfferBy": "پيشڪش ذريعي",
+ "through": "Through",
"plannedOn": "منصوبا ٿيل",
"transactionId": "ٽرانزيڪشن آئي ڊي",
"ledgerIndex": "ليجر انڊيڪس",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "جنرل",
@@ -758,6 +760,7 @@
"biometricAuthentication": "بايوميٽرڪ جي تصديق",
"hapticFeedback": "هاپيڪ راءِ",
"developerMode": "ٺاهيندڙ موڊ",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "سسٽم ڪرنس جو فارميٽ استعمال ڪريو",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "پنهنجو پراڻو پاس ڪوڊ داخل ڪريو",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "اڪائونٽ شامل ڪريو",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/sk.json b/src/locale/translations/sk.json
index 1411782ba..dcc253a6c 100644
--- a/src/locale/translations/sk.json
+++ b/src/locale/translations/sk.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Otvoriť v %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Zobraziť poznámku",
- "throughOfferBy": "Prostredníctvom ponuky od",
+ "through": "Through",
"plannedOn": "Plánované dňa",
"transactionId": "Transakcie ID",
"ledgerIndex": "knihy zoznam",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Všeobecné",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Overenie biometriou",
"hapticFeedback": "Haptická spätná väzba",
"developerMode": "Režim vývojára",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Formátovanie systémovej meny",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Zadajte svoj starý prístupový kód",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Pridať účet",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/sl.json b/src/locale/translations/sl.json
index 04581202a..afb873eae 100644
--- a/src/locale/translations/sl.json
+++ b/src/locale/translations/sl.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Odpri z %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Pokaži opomnik",
- "throughOfferBy": "Skozi ponudbo",
+ "through": "Through",
"plannedOn": "Načrtovano v",
"transactionId": "ID transakcije",
"ledgerIndex": "Kazalo glavne knjige",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Splošno",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrično overjanje",
"hapticFeedback": "Haptične povratne informacije",
"developerMode": "Razvijalski način",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Uporabite sistemsko valuto",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Vnesite vaše staro geslo",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Dodaj račun",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/sr.json b/src/locale/translations/sr.json
index ba0116e7f..5ce5c21ef 100644
--- a/src/locale/translations/sr.json
+++ b/src/locale/translations/sr.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Отвори са %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Прикажи допис",
- "throughOfferBy": "Кроз понуду од",
+ "through": "Through",
"plannedOn": "Планиранo",
"transactionId": "ИД трансакције",
"ledgerIndex": "Ledger садржај",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Општи ",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Биометријска потврда идентитета",
"hapticFeedback": "Haptic подаци о резултатима",
"developerMode": "Опција програмера ",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Користите одрђену валуту у систему",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Унесите своју стару лозинку",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Додај налог",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/sv.json b/src/locale/translations/sv.json
index d8ca8692a..fd2ed4d12 100644
--- a/src/locale/translations/sv.json
+++ b/src/locale/translations/sv.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Öppna med %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Visa memo",
- "throughOfferBy": "Genom erbjudande av",
+ "through": "Through",
"plannedOn": "Planerat på",
"transactionId": "Transaktions-ID",
"ledgerIndex": "Liggerindex",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Allmänna",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrisk autentisering",
"hapticFeedback": "Haptisk feedback",
"developerMode": "Utvecklingsläge",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Använd Systemets valutainställning ",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Ange ditt gamla lösenord",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Lägg till ett konto",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/sw.json b/src/locale/translations/sw.json
index 5d4912702..ea0c2d581 100644
--- a/src/locale/translations/sw.json
+++ b/src/locale/translations/sw.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open with %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Show memo",
- "throughOfferBy": "Through offer by",
+ "through": "Through",
"plannedOn": "Planned on",
"transactionId": "Transaction ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometric authentication",
"hapticFeedback": "Haptic feedback",
"developerMode": "Developer mode",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Use system currency format",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Enter your old passcode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Add an account",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ta-IN.json b/src/locale/translations/ta-IN.json
index f11993bb4..bf678f613 100644
--- a/src/locale/translations/ta-IN.json
+++ b/src/locale/translations/ta-IN.json
@@ -565,7 +565,7 @@
"openWithExplorer": "உடன் திறக்கவும் %{explorer}\r\n",
"openInExplorer": "Open in explorer",
"showMemo": "மெமோ காட்டு",
- "throughOfferBy": "வழங்கியதன் மூலம்",
+ "through": "Through",
"plannedOn": "திட்டமிடப்பட்டுள்ளது",
"transactionId": "பரிவர்த்தனை ஐடி",
"ledgerIndex": "லெட்ஜர் அட்டவணை",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "பொது",
@@ -758,6 +760,7 @@
"biometricAuthentication": "பயோமெட்ரிக் அங்கீகாரம்",
"hapticFeedback": "தீண்டும் கருத்துக்களை",
"developerMode": "டெவலப்பர் பயன்முறை",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "கணினி நாணய வடிவமைப்பைப் பயன்படுத்தவும்",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "உங்கள் பழைய கடவுக்குறியீட்டை உள்ளிடவும்",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ஒரு கணக்கைச் சேர்க்கவும்",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/te-IN.json b/src/locale/translations/te-IN.json
index c007e8237..c5b47d1b3 100644
--- a/src/locale/translations/te-IN.json
+++ b/src/locale/translations/te-IN.json
@@ -565,7 +565,7 @@
"openWithExplorer": "%{explorer} తో తెరవండి",
"openInExplorer": "Open in explorer",
"showMemo": "మెమో చూపించు\r\n",
- "throughOfferBy": " ఆఫర్ ద్వారా\r\n",
+ "through": "Through",
"plannedOn": "ప్రణాళిక చేయబడింది",
"transactionId": "లావాదేవి ఐడి",
"ledgerIndex": "లెడ్జర్ సూచిక",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "జనరల్",
@@ -758,6 +760,7 @@
"biometricAuthentication": "బయోమెట్రిక్ ప్రామాణీకరణ\r\n",
"hapticFeedback": "హాప్టిక్ ఫీడ్బ్యాక్\r\n",
"developerMode": "డెవలపర్ మోడ్",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "సిస్టమ్ కరెన్సీ ఆకృతీకరణ\r\n",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "మీ పాత పాస్కోడ్ను నమోదు చేయండి\r\n",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ఖాతాను జోడించండి\r\n",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/tr.json b/src/locale/translations/tr.json
index 0f0863bfb..cb0ebe8d4 100644
--- a/src/locale/translations/tr.json
+++ b/src/locale/translations/tr.json
@@ -565,7 +565,7 @@
"openWithExplorer": "%{explorer} ile aç",
"openInExplorer": "Open in explorer",
"showMemo": "Notu göster",
- "throughOfferBy": "Teklif aracılığıyla",
+ "through": "Through",
"plannedOn": "Planlandığı tarih",
"transactionId": "İşlem kimliği",
"ledgerIndex": "Defter Dizini",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Genel",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biyometrik doğrulama",
"hapticFeedback": "Dokunsal geribildirim",
"developerMode": "Geliştirici modu",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Sistem para birimini kullan",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Eski şifrenizi girin",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Hesap ekle",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/uk.json b/src/locale/translations/uk.json
index 8e820d28f..c03025b50 100644
--- a/src/locale/translations/uk.json
+++ b/src/locale/translations/uk.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Відкрити за допомогою %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Показати примітку",
- "throughOfferBy": "Через пропозицію",
+ "through": "Through",
"plannedOn": "Заплановано на",
"transactionId": "Ідентифікатор транзакції",
"ledgerIndex": "Індекс облікової книги",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Загальні",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Біометрична аутентифікація",
"hapticFeedback": "Тактильний зворотний зв’язок",
"developerMode": "Режим розробника",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Використовувати системний формат валюти",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Введіть Ваш старий ПІН-код",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Додати акаунт",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/ur.json b/src/locale/translations/ur.json
index 135125f3a..fd480498a 100644
--- a/src/locale/translations/ur.json
+++ b/src/locale/translations/ur.json
@@ -565,7 +565,7 @@
"openWithExplorer": " کے ساتھ کھولو %{explorer} \r\n",
"openInExplorer": "Open in explorer",
"showMemo": "میمو دکھائیں",
- "throughOfferBy": "بذریعہ پیش کش",
+ "through": "Through",
"plannedOn": "کی منصوبہ بندی کی",
"transactionId": "ٹرانزیکشن ID",
"ledgerIndex": "لیجر انڈیکس",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "جنرل",
@@ -758,6 +760,7 @@
"biometricAuthentication": "بایومیٹرک تصدیق",
"hapticFeedback": "حیرت انگیز آراء",
"developerMode": "ڈویلپر وضع",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "سسٹم کرنسی کی شکل استعمال کریں",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "اپنا پرانا پاس کوڈ درج کریں",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "ایک اکاؤنٹ شامل کریں",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/uz.json b/src/locale/translations/uz.json
index dd53a11d2..c8a95b325 100644
--- a/src/locale/translations/uz.json
+++ b/src/locale/translations/uz.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Bilan oching %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Yodnomani ko'rsatish",
- "throughOfferBy": "Tomonidan taklif orqali",
+ "through": "Through",
"plannedOn": "Rejalashtirilgan",
"transactionId": "Tranzaksiya identifikatori",
"ledgerIndex": "Ledger indeksi",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Umumiy",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometrik autentifikatsiya",
"hapticFeedback": "Taktil muloqot",
"developerMode": "Ishlab chiqaruvchi rejimi",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Tizim valyuta formatidan foydalaning",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Eski parolingizni kiriting",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Hisob qaydnomasini qo'shish",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/vi.json b/src/locale/translations/vi.json
index 85efa449f..cbd043276 100644
--- a/src/locale/translations/vi.json
+++ b/src/locale/translations/vi.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Mở với %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Hiển thị bản ghi nhớ",
- "throughOfferBy": "Thông qua đề nghị của",
+ "through": "Through",
"plannedOn": "Lên kế hoạch",
"transactionId": "ID giao dịch",
"ledgerIndex": "Chỉ số sổ cái",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "Chung",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Xác thực sinh trắc học",
"hapticFeedback": "Phản hồi xúc giác",
"developerMode": "Chế độ nhà phát triển",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Sử dụng định dạng tiền tệ hệ thống",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Nhập mật mã cũ của bạn",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Thêm một tài khoản",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/zh-TW.json b/src/locale/translations/zh-TW.json
index f010293ef..1c1f2829e 100644
--- a/src/locale/translations/zh-TW.json
+++ b/src/locale/translations/zh-TW.json
@@ -565,7 +565,7 @@
"openWithExplorer": "Open with %{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "Show memo",
- "throughOfferBy": "Through offer by",
+ "through": "Through",
"plannedOn": "Planned on",
"transactionId": "Transaction ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "General",
@@ -758,6 +760,7 @@
"biometricAuthentication": "Biometric authentication",
"hapticFeedback": "Haptic feedback",
"developerMode": "Developer mode",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "Use system currency format",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "Enter your old passcode",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "Add an account",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/locale/translations/zh.json b/src/locale/translations/zh.json
index cf744c8c0..12d30d0ff 100644
--- a/src/locale/translations/zh.json
+++ b/src/locale/translations/zh.json
@@ -565,7 +565,7 @@
"openWithExplorer": "打开用%{explorer}",
"openInExplorer": "Open in explorer",
"showMemo": "显示备忘录",
- "throughOfferBy": "通过提供",
+ "through": "Through",
"plannedOn": "Planned on",
"transactionId": "Transaction ID",
"ledgerIndex": "Ledger Index",
@@ -719,7 +719,9 @@
"chooseAmount": "Choose amount",
"aboutThisXApp": "About this xApp",
"xAppSupportNetworkError": "This xApp is not available on the network you are connected with",
- "switchToSupportedNetworks": "Please switch to one of the supported networks below"
+ "switchToSupportedNetworks": "Please switch to one of the supported networks below",
+ "xAppDoesNotHavePermissionToRunThisCommand": "This xApp does not have permission to run '%{command}' command. If you believe you need this permission, please contact support.",
+ "appReadyToAcceptCommands": "The xApp must be in a ready state to be able to accept commands."
},
"settings": {
"generalSettings": "通用",
@@ -758,6 +760,7 @@
"biometricAuthentication": "生物特征认证",
"hapticFeedback": "触觉反馈",
"developerMode": "Developer mode",
+ "developerSettings": "Developer settings",
"useSystemSeparators": "系统货币样式",
"showReserveValue": "Show reserve value on home screen",
"enterOldPasscode": "输入您的旧密码",
@@ -821,7 +824,13 @@
"networkHaveOnlyOneNodeAsDefault": "This network has only one node, which is already set as the default.",
"networkUpdates": "Network updates",
"everythingIsUpdateToDate": "Everything is up-to-date",
- "networkAreUpdateToDate": "There are no added or changes for network settings at the moment."
+ "networkAreUpdateToDate": "There are no added or changes for network settings at the moment.",
+ "experimental": "Experimental",
+ "experimentalSimplicityUi": "Simplicity UI",
+ "cache": "Cache",
+ "clearResolverCache": "Clear resolver cache",
+ "cacheClearedSuccessfully": "Cache Cleared Successfully",
+ "restartRequired": "A restart is required for these changes to take effect"
},
"account": {
"addAccount": "新增帐号",
@@ -1189,13 +1198,14 @@
"oneTimeCharge": "One-time charge - not automatically renewing",
"payWithApplePay": "Pay with Apple Pay",
"payWithGooglePay": "Pay with Google Pay",
+ "payNow": "Pay now",
"restorePurchase": "Restore Purchase",
"thankYouForUsingXaman": "Thank you for using Xaman!",
"comingPaymentWarning": "You're still enjoying Xaman for free, but you're nearing our free limit. To support Xaman's innovation and security, a small in-app payment may be requested soon.",
"paymentRequiredMessage": "A small payment is required to maintain unlimited access for the next 30 days. Alternatively, Xaman will switch to limited-use mode until your monthly limits reset automatically.",
- "prePurchaseMessage": "Thank you for your support! Your payment unlocks a full month of unrestricted Xaman use.",
+ "prePurchaseMessage": "You're currently unable to open xApps and sign requests. A small payment is required to unlock 30 days of unrestricted access to Xaman.",
"learnMore": "Learn more",
- "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a full month of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
+ "monetizationRequiredForThisFeature": "You currently can’t open Sign Requests & xApps: a small payment is required to unlock a 30 days of unrestricted use of Xaman. Developing Xaman, building secure software takes a lot of resources. We hope you will support us continuing to build. If you decide not to: every month your limits will reset, allowing you to open xApps & Sign Requests again.",
"allSet": "All set!",
"thankYouForPurchase": "Thank you for your purchase.",
"noPurchaseFound": "No Purchases Found",
@@ -1208,7 +1218,8 @@
"benefitsTextOne": "Sign payloads",
"benefitsTextTwo": "xApp access",
"benefitsTextThree": "Premium support",
- "prePurchaseTip": "Please note that this is a one-month purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
+ "unlockFullFunctionality": "Unlock full functionality with a small payment.",
+ "prePurchaseTip": "Please note that this is a 30 days purchase. Make sure your Apple ID is logged in and your payment information is up-to-date. For issues, use the 'Restore Purchase' button."
},
"errors": {
"unableToLoadTermOfService": "Oops! Unable to Retrieve Terms of Service",
diff --git a/src/screens/Account/Add/Generate/AccountGenerateView.tsx b/src/screens/Account/Add/Generate/AccountGenerateView.tsx
index a23e38eb4..f7e3bfe83 100644
--- a/src/screens/Account/Add/Generate/AccountGenerateView.tsx
+++ b/src/screens/Account/Add/Generate/AccountGenerateView.tsx
@@ -9,7 +9,6 @@ import { InteractionManager, Keyboard, View } from 'react-native';
import * as AccountLib from 'xrpl-accountlib';
-import AccountResolver from '@common/helpers/resolver';
import { Toast } from '@common/helpers/interface';
import { SHA256 } from '@common/libs/crypto';
@@ -159,13 +158,6 @@ class AccountGenerateView extends Component {
account: createdAccount,
});
- // update resolver cache for this account
- AccountResolver.setCache(account.address!, {
- address: account.address!,
- name: account.label,
- source: 'accounts',
- });
-
// close the screen
await Navigator.popToRoot();
} catch {
diff --git a/src/screens/Account/Add/Import/AccountImportView.tsx b/src/screens/Account/Add/Import/AccountImportView.tsx
index 7be145220..899dca83b 100644
--- a/src/screens/Account/Add/Import/AccountImportView.tsx
+++ b/src/screens/Account/Add/Import/AccountImportView.tsx
@@ -12,7 +12,6 @@ import * as AccountLib from 'xrpl-accountlib';
import { XAppOrigin } from '@common/libs/payload';
import { Toast } from '@common/helpers/interface';
-import AccountResolver from '@common/helpers/resolver';
import { Navigator } from '@common/helpers/navigator';
import { SHA256 } from '@common/libs/crypto';
@@ -427,13 +426,6 @@ class AccountImportView extends Component {
account: createdAccount,
});
- // update resolver cache for this account
- AccountResolver.setCache(account.address!, {
- address: account.address!,
- name: account.label,
- source: 'accounts',
- });
-
// close the screen
Navigator.popToRoot().then(() => {
// if account imported with alternative seed alphabet and xApp present
diff --git a/src/screens/Account/Add/Import/Steps/EnterAddress/EnterAddressStep.tsx b/src/screens/Account/Add/Import/Steps/EnterAddress/EnterAddressStep.tsx
index 729990153..970fff948 100644
--- a/src/screens/Account/Add/Import/Steps/EnterAddress/EnterAddressStep.tsx
+++ b/src/screens/Account/Add/Import/Steps/EnterAddress/EnterAddressStep.tsx
@@ -8,11 +8,12 @@ import { SafeAreaView, View, Text, Alert, Keyboard } from 'react-native';
import { XRPL_Account, utils } from 'xrpl-accountlib';
import { StringType, XrplDestination } from 'xumm-string-decode';
-// components
-import { Button, TextInput, InfoMessage, Spacer, KeyboardAwareScrollView, Footer } from '@components/General';
+import ResolverService from '@services/ResolverService';
import { Navigator } from '@common/helpers/navigator';
-import AccountResolver from '@common/helpers/resolver';
+
+// components
+import { Button, TextInput, InfoMessage, Spacer, KeyboardAwareScrollView, Footer } from '@components/General';
import Localize from '@locale';
@@ -74,13 +75,13 @@ class EnterAddressStep extends Component {
}
// check for exchange account
- const destinationInfo = await AccountResolver.getAccountInfo(address);
+ const advisoryInfo = await ResolverService.getAccountAdvisoryInfo(address);
this.setState({
isLoading: false,
});
- if (destinationInfo.possibleExchange) {
+ if (advisoryInfo.possibleExchange) {
Navigator.showAlertModal({
type: 'warning',
text: Localize.t('account.thisAddressAppearsToBeExchangeAddress'),
diff --git a/src/screens/Account/Add/Import/Steps/Label/LabelStep.tsx b/src/screens/Account/Add/Import/Steps/Label/LabelStep.tsx
index 6cf20a660..da5171d06 100644
--- a/src/screens/Account/Add/Import/Steps/Label/LabelStep.tsx
+++ b/src/screens/Account/Add/Import/Steps/Label/LabelStep.tsx
@@ -9,7 +9,7 @@ import { SafeAreaView, View, Text, Alert } from 'react-native';
import { AppConfig } from '@common/constants';
-import AccountResolver from '@common/helpers/resolver';
+import ResolverService from '@services/ResolverService';
import { Button, TextInput, Spacer, KeyboardAwareScrollView, Footer } from '@components/General';
@@ -54,7 +54,7 @@ class LabelStep extends Component {
});
}
- AccountResolver.getAccountName(account.address!)
+ ResolverService.getAccountName(account.address!)
.then((res) => {
if (!isEmpty(res)) {
const { name } = res;
diff --git a/src/screens/Account/Edit/AccountSettingsView.tsx b/src/screens/Account/Edit/AccountSettingsView.tsx
index d6e109018..3b23723c6 100644
--- a/src/screens/Account/Edit/AccountSettingsView.tsx
+++ b/src/screens/Account/Edit/AccountSettingsView.tsx
@@ -8,7 +8,6 @@ import { Alert, ScrollView, Text, View } from 'react-native';
import { Prompt } from '@common/helpers/interface';
import { Navigator } from '@common/helpers/navigator';
-import AccountResolver from '@common/helpers/resolver';
import { GetCardEnforcedSecurity, GetCardId, TangemSecurity } from '@common/utils/tangem';
import { AppConfig, AppScreens } from '@common/constants';
@@ -107,13 +106,6 @@ class AccountSettingsView extends Component {
address: account.address,
label: labelClean,
});
-
- // update resolver cache for this account
- AccountResolver.setCache(`${account.address}`, {
- address: account.address,
- name: labelClean,
- source: 'accounts',
- });
};
showAccessLevelPicker = () => {
diff --git a/src/screens/Exchange/ExchangeView.tsx b/src/screens/Exchange/ExchangeView.tsx
index be95723a8..28c1a0427 100644
--- a/src/screens/Exchange/ExchangeView.tsx
+++ b/src/screens/Exchange/ExchangeView.tsx
@@ -39,9 +39,10 @@ import {
InfoMessage,
LoadingIndicator,
Spacer,
- TokenAvatar,
} from '@components/General';
+import { TokenAvatar } from '@components/Modules/TokenElement';
+
import { AmountValueType } from '@components/General/AmountInput';
import Localize from '@locale';
@@ -55,7 +56,7 @@ import styles from './styles';
/* types ==================================================================== */
export interface Props {
account: AccountModel;
- trustLine: TrustLineModel;
+ token: TrustLineModel;
}
export interface State {
@@ -102,8 +103,8 @@ class ExchangeView extends Component {
// create new ledger exchange instance base on pair
this.ledgerExchange = new LedgerExchange({
- issuer: props.trustLine.currency.issuer,
- currency: props.trustLine.currency.currencyCode,
+ issuer: props.token.currency.issuer,
+ currency: props.token.currency.currencyCode,
});
this.amountInput = React.createRef();
@@ -236,7 +237,7 @@ class ExchangeView extends Component {
};
onExchangePress = () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
const { direction, amount, expectedOutcome } = this.state;
// dismiss keyboard if present
@@ -254,7 +255,7 @@ class ExchangeView extends Component {
currency:
direction === MarketDirection.SELL
? NetworkService.getNativeAsset()
- : NormalizeCurrencyCode(trustLine.currency.currencyCode),
+ : NormalizeCurrencyCode(token.currency.currencyCode),
}),
[
{ text: Localize.t('global.cancel') },
@@ -277,11 +278,11 @@ class ExchangeView extends Component {
payCurrency:
direction === MarketDirection.SELL
? NetworkService.getNativeAsset()
- : NormalizeCurrencyCode(trustLine.currency.currencyCode),
+ : NormalizeCurrencyCode(token.currency.currencyCode),
getAmount: Localize.formatNumber(Number(expectedOutcome)),
getCurrency:
direction === MarketDirection.SELL
- ? NormalizeCurrencyCode(trustLine.currency.currencyCode)
+ ? NormalizeCurrencyCode(token.currency.currencyCode)
: NetworkService.getNativeAsset(),
}),
[
@@ -317,14 +318,14 @@ class ExchangeView extends Component {
};
prepareAndSign = async () => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
const { amount, minimumOutcome, direction } = this.state;
this.setState({ isExchanging: true });
const pair: IssuedCurrency = {
- issuer: trustLine.currency.issuer,
- currency: trustLine.currency.currencyCode,
+ issuer: token.currency.issuer,
+ currency: token.currency.currencyCode,
};
// create offerCreate transaction
@@ -416,7 +417,7 @@ class ExchangeView extends Component {
};
getAvailableBalance = () => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
const { direction } = this.state;
let availableBalance;
@@ -424,14 +425,14 @@ class ExchangeView extends Component {
if (direction === MarketDirection.SELL) {
availableBalance = CalculateAvailableBalance(account);
} else {
- availableBalance = Number(trustLine.balance);
+ availableBalance = Number(token.balance);
}
return availableBalance;
};
applyAllBalance = () => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
const { direction } = this.state;
let availableBalance: string;
@@ -439,7 +440,7 @@ class ExchangeView extends Component {
if (direction === MarketDirection.SELL) {
availableBalance = new BigNumber(CalculateAvailableBalance(account)).toString();
} else {
- availableBalance = new BigNumber(trustLine.balance).toString();
+ availableBalance = new BigNumber(token.balance).toString();
}
this.onAmountChange(availableBalance);
@@ -472,7 +473,7 @@ class ExchangeView extends Component {
};
renderBottomContainer = () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
const { direction, liquidity, amount, exchangeRate, minimumOutcome, isExchanging, isLoading } = this.state;
if (isLoading || !liquidity) {
@@ -494,7 +495,7 @@ class ExchangeView extends Component {
{
value={minimumOutcome}
currency={
direction === MarketDirection.SELL
- ? trustLine.currency.currencyCode
+ ? token.currency.currencyCode
: NetworkService.getNativeAsset()
}
style={[styles.detailsValue, AppStyles.textRightAligned, AppStyles.colorRed]}
@@ -537,7 +538,7 @@ class ExchangeView extends Component {
};
render() {
- const { trustLine } = this.props;
+ const { token } = this.props;
const { direction, amount, expectedOutcome } = this.state;
return (
@@ -555,42 +556,49 @@ class ExchangeView extends Component {
text: Localize.t('global.exchange'),
}}
/>
-
+
{/* From part */}
-
-
- {direction === MarketDirection.SELL
- ? NetworkService.getNativeAsset()
- : trustLine.currency.name ||
- NormalizeCurrencyCode(trustLine.currency.currencyCode)}
-
+
+
+
+ {direction === MarketDirection.SELL
+ ? NetworkService.getNativeAsset()
+ : token.getFormattedCurrency()}
+
+ {direction === MarketDirection.BUY && (
+
+ - {token.getFormattedIssuer()}
+
+ )}
+
{Localize.t('global.spendable')}:{' '}
{Localize.formatNumber(this.getAvailableBalance())}
-
-
-
+
@@ -633,7 +641,7 @@ class ExchangeView extends Component {
@@ -642,14 +650,10 @@ class ExchangeView extends Component {
{direction === MarketDirection.BUY
? NetworkService.getNativeAsset()
- : trustLine.currency.name ||
- NormalizeCurrencyCode(trustLine.currency.currencyCode)}
+ : token.getFormattedCurrency()}
{direction === MarketDirection.SELL && (
-
- {trustLine.counterParty.name}{' '}
- {NormalizeCurrencyCode(trustLine.currency.currencyCode)}
-
+ {token.getFormattedIssuer()}
)}
diff --git a/src/screens/Exchange/styles.tsx b/src/screens/Exchange/styles.tsx
index cf639cfe1..3632e23db 100644
--- a/src/screens/Exchange/styles.tsx
+++ b/src/screens/Exchange/styles.tsx
@@ -35,7 +35,14 @@ const styles = StyleService.create({
subLabel: {
fontSize: AppFonts.subtext.size,
fontFamily: AppFonts.base.familyMono,
- color: '$grey',
+ color: '$textSecondary',
+ paddingTop: 5,
+ },
+ issuerLabelSmall: {
+ fontSize: AppFonts.small.size,
+ fontFamily: AppFonts.base.family,
+ color: '$textSecondary',
+ paddingTop: 5,
},
detailsLabel: {
fontSize: AppFonts.subtext.size * 0.9,
diff --git a/src/screens/Home/HomeView.tsx b/src/screens/Home/HomeView.tsx
index 88ed110a1..a6f5e5e97 100644
--- a/src/screens/Home/HomeView.tsx
+++ b/src/screens/Home/HomeView.tsx
@@ -19,6 +19,8 @@ import { AppScreens } from '@common/constants';
import { Navigator } from '@common/helpers/navigator';
import { Prompt } from '@common/helpers/interface';
+import Preferences from '@common/libs/preferences';
+
import { Button, RaisedButton } from '@components/General';
import {
MonetizationElement,
@@ -50,6 +52,7 @@ export interface State {
selectedNetwork: NetworkModel;
developerMode: boolean;
discreetMode: boolean;
+ experimentalUI?: boolean;
}
/* Component ==================================================================== */
@@ -78,6 +81,7 @@ class HomeView extends Component {
selectedNetwork: coreSettings.network,
developerMode: coreSettings.developerMode,
discreetMode: coreSettings.discreetMode,
+ experimentalUI: undefined,
};
}
@@ -92,6 +96,15 @@ class HomeView extends Component {
// update account status
InteractionManager.runAfterInteractions(this.updateAccountStatus);
+
+ // get experimental status
+ Preferences.get(Preferences.keys.EXPERIMENTAL_SIMPLICITY_UI).then((experimentalUI) => {
+ if (experimentalUI === 'true') {
+ this.setState({
+ experimentalUI: true,
+ });
+ }
+ });
}
componentWillUnmount() {
@@ -111,7 +124,7 @@ class HomeView extends Component {
// Update account details when component didAppear and Socket is connected
if (account?.isValid() && NetworkService.isConnected()) {
// only update current account details
- AccountService.updateAccountsDetails([account.address]);
+ AccountService.updateAccountsDetails(account.address);
}
});
}
@@ -246,7 +259,7 @@ class HomeView extends Component {
renderAssets = () => {
const { timestamp } = this.props;
- const { account, discreetMode, isSpendable } = this.state;
+ const { account, discreetMode, isSpendable, experimentalUI } = this.state;
// accounts is not activated
if (account.balance === 0) {
@@ -255,6 +268,7 @@ class HomeView extends Component {
return (
{
};
renderButtons = () => {
- const { isSpendable } = this.state;
+ const { isSpendable, experimentalUI } = this.state;
if (isSpendable) {
return (
@@ -284,12 +298,14 @@ class HomeView extends Component {
@@ -337,9 +353,9 @@ class HomeView extends Component {
};
renderNetworkDetails = () => {
- const { developerMode, selectedNetwork } = this.state;
+ const { developerMode, selectedNetwork, experimentalUI } = this.state;
- if (!developerMode || !selectedNetwork) {
+ if (!developerMode || !selectedNetwork || typeof experimentalUI === 'undefined' || experimentalUI) {
return null;
}
diff --git a/src/screens/Home/styles.tsx b/src/screens/Home/styles.tsx
index a44a3ea7f..ce7a6b54a 100644
--- a/src/screens/Home/styles.tsx
+++ b/src/screens/Home/styles.tsx
@@ -15,7 +15,7 @@ const styles = StyleService.create({
},
monetizationContainer: {
marginHorizontal: AppSizes.paddingSml,
- marginBottom: AppSizes.paddingSml,
+ marginBottom: AppSizes.paddingExtraSml,
},
tokenListContainer: {
flex: 6,
@@ -47,6 +47,13 @@ const styles = StyleService.create({
requestButtonIcon: { tintColor: '$white' },
requestButtonText: { fontSize: AppFonts.base.size, color: '$white' },
+ requestButtonContainerClean: {
+ marginLeft: 15,
+ backgroundColor: '$tint',
+ },
+ requestButtonIconClean: { tintColor: '$textPrimary' },
+ requestButtonTextClean: { fontSize: AppFonts.base.size, color: '$textPrimary' },
+
QRButtonText: { fontSize: AppFonts.base.size },
networkDetailsContainer: {
diff --git a/src/screens/Modal/DestinationPicker/DestinationPickerModal.tsx b/src/screens/Modal/DestinationPicker/DestinationPickerModal.tsx
index c99964406..1999eee69 100644
--- a/src/screens/Modal/DestinationPicker/DestinationPickerModal.tsx
+++ b/src/screens/Modal/DestinationPicker/DestinationPickerModal.tsx
@@ -18,11 +18,11 @@ import { Destination } from '@common/libs/ledger/parser/types';
import { Toast } from '@common/helpers/interface';
import { Navigator } from '@common/helpers/navigator';
-import AccountResolver, { AccountInfoType } from '@common/helpers/resolver';
import { NormalizeDestination } from '@common/utils/codec';
-import { BackendService } from '@services';
+import BackendService from '@services/BackendService';
+import ResolverService, { AccountAdvisoryResolveType } from '@services/ResolverService';
import { Button, TextInput, Footer, InfoMessage, LoadingIndicator } from '@components/General';
import { AccountElement } from '@components/Modules';
@@ -38,7 +38,7 @@ import styles from './styles';
/* types ==================================================================== */
export interface Props {
onClose: () => void;
- onSelect: (destination: Destination, info: AccountInfoType) => void;
+ onSelect: (destination: Destination, info: AccountAdvisoryResolveType) => void;
ignoreDestinationTag: boolean;
}
@@ -51,7 +51,7 @@ export interface State {
contacts: Realm.Results;
dataSource: any[];
destination?: Destination;
- destinationInfo?: AccountInfoType;
+ destinationInfo?: AccountAdvisoryResolveType;
}
/* Component ==================================================================== */
class DestinationPickerModal extends Component {
@@ -102,7 +102,7 @@ class DestinationPickerModal extends Component {
const { to, tag } = NormalizeDestination(result);
if (to) {
- const accountInfo = await AccountResolver.getAccountName(to, tag);
+ const accountInfo = await ResolverService.getAccountName(to, tag);
this.setState({
dataSource: this.getSearchResultSource([
@@ -211,7 +211,7 @@ class DestinationPickerModal extends Component {
res.matches.forEach(async (element: any) => {
// if payid in result, then look for payId in local source as well
if (element.source === 'payid') {
- const internalResult = await AccountResolver.getAccountName(
+ const internalResult = await ResolverService.getAccountName(
element.account,
element.tag,
true,
@@ -405,7 +405,7 @@ class DestinationPickerModal extends Component {
try {
// check for account exist and potential destination tag required
- const destinationInfo = await AccountResolver.getAccountInfo(destination.address);
+ const destinationInfo = await ResolverService.getAccountAdvisoryInfo(destination.address);
// set destination account info
this.setState({
@@ -413,7 +413,7 @@ class DestinationPickerModal extends Component {
});
// check for account risk and scam
- if (destinationInfo.risk === 'PROBABLE' || destinationInfo.risk === 'HIGH_PROBABILITY') {
+ if (destinationInfo.danger === 'PROBABLE' || destinationInfo.danger === 'HIGH_PROBABILITY') {
Navigator.showAlertModal({
type: 'warning',
text: Localize.t('send.destinationIsProbableIsScam'),
@@ -437,7 +437,7 @@ class DestinationPickerModal extends Component {
return;
}
- if (destinationInfo.risk === 'CONFIRMED') {
+ if (destinationInfo.danger === 'CONFIRMED') {
Navigator.showOverlay(AppScreens.Overlay.FlaggedDestination, {
destination: destination.address,
onContinue: this.onSelect,
diff --git a/src/screens/Modal/PurchaseProduct/PurchaseProductModal.tsx b/src/screens/Modal/PurchaseProduct/PurchaseProductModal.tsx
index fc067c31f..324588a83 100644
--- a/src/screens/Modal/PurchaseProduct/PurchaseProductModal.tsx
+++ b/src/screens/Modal/PurchaseProduct/PurchaseProductModal.tsx
@@ -230,18 +230,18 @@ class PurchaseProductModal extends Component {
-
+ {productDescription}{Localize.t('monetization.prePurchaseMessage')}
-
+
-
+ {Localize.t('monetization.prePurchaseTip')}
Read our{' '}
@@ -262,25 +262,28 @@ class PurchaseProductModal extends Component {
-
-
- {Localize.t('global.or')}
+
+
+
+ {Localize.t('global.or')}
+
+
-
>
diff --git a/src/screens/Modal/PurchaseProduct/styles.tsx b/src/screens/Modal/PurchaseProduct/styles.tsx
index 92e976403..dbd767529 100644
--- a/src/screens/Modal/PurchaseProduct/styles.tsx
+++ b/src/screens/Modal/PurchaseProduct/styles.tsx
@@ -18,29 +18,28 @@ const styles = StyleService.create({
actionContainer: {
backgroundColor: StyleService.select({ light: '$white', dark: '$tint' }),
borderRadius: AppSizes.borderRadius,
- padding: AppSizes.paddingSml,
+ paddingHorizontal: AppSizes.paddingSml,
marginTop: AppSizes.padding,
},
productDescriptionText: {
- fontFamily: AppFonts.h4.family,
- fontSize: AppFonts.h4.size,
+ fontFamily: AppFonts.base.familyExtraBold,
+ fontSize: AppFonts.base.size,
textAlign: 'center',
- color: '$textPrimary',
- fontWeight: '900',
- paddingTop: AppSizes.padding,
- paddingBottom: AppSizes.paddingExtraSml,
+ color: '$blue',
+ paddingVertical: AppSizes.paddingExtraSml,
},
notesText: {
fontFamily: AppFonts.small.family,
- fontSize: AppFonts.small.size,
+ fontSize: AppFonts.small.size * 0.9,
textAlign: 'center',
- color: '$grey',
+ color: '$textSecondary',
},
prePurchaseText: {
fontFamily: AppFonts.base.family,
fontSize: AppFonts.subtext.size,
textAlign: 'center',
color: '$textPrimary',
+ alignSelf: 'center',
},
successPurchaseText: {
fontFamily: AppFonts.base.familyExtraBold,
@@ -86,10 +85,16 @@ const styles = StyleService.create({
textDecorationLine: 'underline',
},
appIcon: {
- width: AppSizes.scale(60),
- height: AppSizes.scale(60),
+ width: AppSizes.verticalScale(60),
+ height: AppSizes.verticalScale(60),
borderRadius: AppSizes.scale(75) / 4,
},
+ xamanLogo: {
+ width: AppSizes.verticalScale(100),
+ height: AppSizes.verticalScale(20),
+
+ resizeMode: 'contain',
+ },
checkMarkImage: {
tintColor: '$green',
alignSelf: 'center',
diff --git a/src/screens/Modal/ReviewTransaction/ReviewTransactionModal.tsx b/src/screens/Modal/ReviewTransaction/ReviewTransactionModal.tsx
index 9985b74af..2c208353a 100644
--- a/src/screens/Modal/ReviewTransaction/ReviewTransactionModal.tsx
+++ b/src/screens/Modal/ReviewTransaction/ReviewTransactionModal.tsx
@@ -7,7 +7,7 @@ import { Alert, BackHandler, Keyboard, Linking, NativeEventSubscription } from '
import { AppScreens } from '@common/constants';
-import { NetworkService, PushNotificationsService } from '@services';
+import { NetworkService, PushNotificationsService, ResolverService } from '@services';
import { AccountRepository, CoreRepository, CurrencyRepository } from '@store/repositories';
import { AccountModel } from '@store/models';
@@ -21,7 +21,6 @@ import { PatchSuccessType, PayloadOrigin } from '@common/libs/payload';
import { Toast, VibrateHapticFeedback } from '@common/helpers/interface';
import { Navigator } from '@common/helpers/navigator';
-import AccountResolver from '@common/helpers/resolver';
import Localize from '@locale';
@@ -244,7 +243,7 @@ class ReviewTransactionModal extends Component {
// if any validation set to the transaction run and check
// ignore if multiSign
const validation = ValidationFactory.fromTransaction(transaction!);
- if (typeof validation === 'function' && !payload.isMultiSign()) {
+ if (typeof validation === 'function' && !payload.isMultiSign() && payload.shouldSubmit()) {
await validation(transaction, source);
}
} catch (validationError: any) {
@@ -415,7 +414,7 @@ class ReviewTransactionModal extends Component {
if (transaction.Type === TransactionTypes.Payment) {
try {
- const destinationInfo = await AccountResolver.getAccountInfo(transaction.Destination);
+ const destinationInfo = await ResolverService.getAccountAdvisoryInfo(transaction.Destination);
// if sending to a blackHoled account
if (destinationInfo.blackHole) {
diff --git a/src/screens/Modal/XAppBrowser/XAppBrowserModal.tsx b/src/screens/Modal/XAppBrowser/XAppBrowserModal.tsx
index dda396346..d4965fa64 100644
--- a/src/screens/Modal/XAppBrowser/XAppBrowserModal.tsx
+++ b/src/screens/Modal/XAppBrowser/XAppBrowserModal.tsx
@@ -31,11 +31,11 @@ import { GetAppVersionCode } from '@common/helpers/app';
import { Payload, PayloadOrigin } from '@common/libs/payload';
import { Destination } from '@common/libs/ledger/parser/types';
-import { AccountInfoType } from '@common/helpers/resolver';
import { StringTypeCheck } from '@common/utils/string';
import AuthenticationService, { LockStatus } from '@services/AuthenticationService';
+import { AccountAdvisoryResolveType } from '@services/ResolverService';
import NetworkService from '@services/NetworkService';
import { AccountRepository, CoreRepository, NetworkRepository, ProfileRepository } from '@store/repositories';
@@ -224,7 +224,7 @@ class XAppBrowserModal extends Component {
this.sendEvent({ method: XAppMethods.ScanQr, qrContents: undefined, reason: 'USER_CLOSE' });
};
- onDestinationSelect = (destination: Destination, info: AccountInfoType) => {
+ onDestinationSelect = (destination: Destination, info: AccountAdvisoryResolveType) => {
this.sendEvent({ method: XAppMethods.SelectDestination, destination, info, reason: 'SELECTED' });
};
@@ -292,8 +292,6 @@ class XAppBrowserModal extends Component {
};
navigateTo = (data: { xApp: string; title?: string; [key: string]: any }) => {
- const { app } = this.state;
-
const identifier = get(data, 'xApp', undefined);
const title = get(data, 'title', undefined);
@@ -302,10 +300,9 @@ class XAppBrowserModal extends Component {
return;
}
- // we are reloading the same xapp, we don't need to clear the app
- if (app?.identifier === identifier) {
- this.lunchApp(data);
- return;
+ // clean up
+ if (this.softLoadingTimeout) {
+ clearTimeout(this.softLoadingTimeout);
}
this.setState(
@@ -320,6 +317,12 @@ class XAppBrowserModal extends Component {
networks: undefined,
__ott: undefined,
},
+ error: undefined,
+ isLaunchingApp: true,
+ isLoadingApp: false,
+ isAppReady: false,
+ isAppReadyTimeout: false,
+ isRequiredNetworkSwitch: false,
},
() => {
this.lunchApp(data);
@@ -425,14 +428,15 @@ class XAppBrowserModal extends Component {
};
handleCommand = (command: XAppMethods, parsedData: any) => {
- const { app, isAppReady } = this.state;
+ const { app, isAppReady, coreSettings } = this.state;
// no xapp is initiated ?
- if (!app) {
+ // check if it's a know command
+ if (!app || !Object.values(XAppMethods).includes(command)) {
return;
}
- // when there is no permission available just do not run any command
+ // when there is no permission available just do not run any command or the command is unknown for us
if (!app.permissions || isEmpty(get(app.permissions, 'commands'))) {
return;
}
@@ -442,12 +446,22 @@ class XAppBrowserModal extends Component {
// xApp doesn't have the permission to run this command
if (!AllowedCommands.includes(command.toUpperCase())) {
+ // show alert about command
+ if (coreSettings.developerMode) {
+ Alert.alert(
+ Localize.t('global.error'),
+ Localize.t('xapp.xAppDoesNotHavePermissionToRunThisCommand', { command }),
+ );
+ }
return;
}
// for any command to be run, the app should be in ready state
// only allow READY command
if (!isAppReady && command !== XAppMethods.Ready) {
+ if (coreSettings.developerMode) {
+ Alert.alert(Localize.t('global.error'), Localize.t('xapp.appReadyToAcceptCommands'));
+ }
return;
}
@@ -858,9 +872,9 @@ class XAppBrowserModal extends Component {
onLoadEnd = (e: any) => {
const { app } = this.state;
-
const { loading } = e.nativeEvent;
+ // still loading ?
if (loading) {
return;
}
diff --git a/src/screens/Modal/XAppBrowser/types.ts b/src/screens/Modal/XAppBrowser/types.ts
index 282662034..7a4c81116 100644
--- a/src/screens/Modal/XAppBrowser/types.ts
+++ b/src/screens/Modal/XAppBrowser/types.ts
@@ -1,7 +1,7 @@
import { AccountModel, CoreModel, NetworkModel } from '@store/models';
import { XAppOrigin } from '@common/libs/payload';
import { Destination } from '@common/libs/ledger/parser/types';
-import { AccountInfoType } from '@common/helpers/resolver';
+import { AccountAdvisoryResolveType } from '@services/ResolverService';
export interface Props {
identifier: string;
@@ -65,7 +65,7 @@ export interface IEvent {
uuid?: string;
qrContents?: string;
destination?: Destination;
- info?: AccountInfoType;
+ info?: AccountAdvisoryResolveType;
result?: any;
network?: string;
}
diff --git a/src/screens/Overlay/AddToken/AddTokenOverlay.tsx b/src/screens/Overlay/AddToken/AddTokenOverlay.tsx
index e488d7b2c..76aa7816b 100644
--- a/src/screens/Overlay/AddToken/AddTokenOverlay.tsx
+++ b/src/screens/Overlay/AddToken/AddTokenOverlay.tsx
@@ -88,7 +88,7 @@ class AddTokenOverlay extends Component {
});
}
- const { details } = await BackendService.getCuratedIOUs(0, true);
+ const { details } = await BackendService.getCuratedIOUs({ promoted: true });
// set default selected party and currency to the first in the list
const selectedParty = first(values(details));
diff --git a/src/screens/Overlay/Alert/AlertOverlay.tsx b/src/screens/Overlay/Alert/AlertOverlay.tsx
index 13bf5bece..52b7bad87 100644
--- a/src/screens/Overlay/Alert/AlertOverlay.tsx
+++ b/src/screens/Overlay/Alert/AlertOverlay.tsx
@@ -200,18 +200,11 @@ class AlertOverlay extends Component {
style={[styles.container, { backgroundColor: interpolateColor }]}
>
- {this.renderIcon()}
-
- {this.renderTitle()}
-
+ {this.renderIcon()}
+ {this.renderTitle()}
-
-
- {text}
-
-
+ {text}
-
{this.renderButtons()}
diff --git a/src/screens/Overlay/Alert/styles.tsx b/src/screens/Overlay/Alert/styles.tsx
index 0e1cb472e..508f16aae 100644
--- a/src/screens/Overlay/Alert/styles.tsx
+++ b/src/screens/Overlay/Alert/styles.tsx
@@ -9,6 +9,7 @@ const styles = StyleService.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
visibleContent: {
width: AppSizes.screen.width * 0.9,
+ alignItems: 'center',
backgroundColor: '$background',
borderColor: '$tint',
borderWidth: 1,
diff --git a/src/screens/Overlay/ExplainBalance/ExplainBalanceOverlay.tsx b/src/screens/Overlay/ExplainBalance/ExplainBalanceOverlay.tsx
index 5914190fc..0ad5d4e18 100644
--- a/src/screens/Overlay/ExplainBalance/ExplainBalanceOverlay.tsx
+++ b/src/screens/Overlay/ExplainBalance/ExplainBalanceOverlay.tsx
@@ -10,12 +10,12 @@ import { Navigator } from '@common/helpers/navigator';
import { Toast } from '@common/helpers/interface';
import { AppScreens } from '@common/constants';
+import { AccountRepository } from '@store/repositories';
import { AccountModel, TrustLineModel } from '@store/models';
import NetworkService from '@services/NetworkService';
import LedgerService from '@services/LedgerService';
-import { NormalizeCurrencyCode } from '@common/utils/monetary';
import { CalculateAvailableBalance } from '@common/utils/balance';
import { DecodeAccountId } from '@common/utils/codec';
@@ -23,23 +23,15 @@ import { LedgerEntry } from '@common/libs/ledger/types/ledger';
import { LedgerEntryTypes } from '@common/libs/ledger/types/enums';
// components
-import {
- ActionPanel,
- Button,
- Icon,
- InfoMessage,
- LoadingIndicator,
- Spacer,
- TokenAvatar,
- TokenIcon,
-} from '@components/General';
+import { ActionPanel, Button, Icon, InfoMessage, LoadingIndicator, Spacer } from '@components/General';
+
+import { TokenAvatar, TokenIcon } from '@components/Modules/TokenElement';
import Localize from '@locale';
// style
import { AppSizes, AppStyles } from '@theme';
import styles from './styles';
-import { AccessLevels } from '@store/types';
/* types ==================================================================== */
export interface Props {
@@ -51,6 +43,7 @@ export interface State {
accountObjects: any;
nfTokenPageCount: number;
networkReserve: { BaseReserve: number; OwnerReserve: number };
+ isSignable: boolean;
}
/* Component ==================================================================== */
@@ -79,13 +72,22 @@ class ExplainBalanceOverlay extends Component {
accountObjects: [],
nfTokenPageCount: 0,
networkReserve: NetworkService.getNetworkReserve(),
+ isSignable: true,
};
this.actionPanelRef = React.createRef();
}
componentDidMount() {
+ const { account } = this.props;
+
InteractionManager.runAfterInteractions(this.setAccountObjectsState);
+
+ // check if account is signable
+ const isSignable = AccountRepository.isSignable(account);
+ this.setState({
+ isSignable,
+ });
}
loadAccountObjects = async (
@@ -237,9 +239,7 @@ class ExplainBalanceOverlay extends Component {
{Localize.t('global.asset')}
-
- {` (${line.counterParty.name} ${NormalizeCurrencyCode(line.currency.currencyCode)})`}
-
+ {` (${line.getFormattedIssuer()})`}
@@ -360,7 +360,7 @@ class ExplainBalanceOverlay extends Component {
render() {
const { account } = this.props;
- const { isLoading } = this.state;
+ const { isLoading, isSignable } = this.state;
return (
{
{Localize.t('account.availableForSpending')}
- {account.accessLevel === AccessLevels.Readonly && (
+ {!isSignable && (
<>
{
Navigator.dismissOverlay();
};
- onRecipientInfoUpdate = (info: AccountNameType) => {
+ onRecipientInfoUpdate = (info: AccountNameResolveType) => {
if (info?.name) {
this.setState({
participantName: info.name,
diff --git a/src/screens/Overlay/SelectCurrency/SelectCurrencyOverlay.tsx b/src/screens/Overlay/SelectCurrency/SelectCurrencyOverlay.tsx
index 4d270a280..8279fc82f 100644
--- a/src/screens/Overlay/SelectCurrency/SelectCurrencyOverlay.tsx
+++ b/src/screens/Overlay/SelectCurrency/SelectCurrencyOverlay.tsx
@@ -104,7 +104,7 @@ class SelectCurrencyOverlay extends Component {
}
return (
toLower(item.currency.name).indexOf(normalizedSearch) !== -1 ||
- toLower(item.counterParty?.name).indexOf(normalizedSearch) > -1 ||
+ toLower(item.currency.issuerName).indexOf(normalizedSearch) > -1 ||
toLower(NormalizeCurrencyCode(item.currency.currencyCode)).indexOf(normalizedSearch) !== -1
);
});
diff --git a/src/screens/Overlay/TokenSettings/TokenSettingsOverlay.tsx b/src/screens/Overlay/TokenSettings/TokenSettingsOverlay.tsx
index 3c9b3d079..cfa588497 100644
--- a/src/screens/Overlay/TokenSettings/TokenSettingsOverlay.tsx
+++ b/src/screens/Overlay/TokenSettings/TokenSettingsOverlay.tsx
@@ -5,7 +5,7 @@ import { get, has } from 'lodash';
import BigNumber from 'bignumber.js';
import React, { Component } from 'react';
-import { Alert, Animated, Image, InteractionManager, Text, View } from 'react-native';
+import { Alert, Animated, InteractionManager, Text, View } from 'react-native';
import { OptionsModalPresentationStyle, OptionsModalTransitionStyle } from 'react-native-navigation';
import { TrustLineRepository } from '@store/repositories';
@@ -27,16 +27,8 @@ import { AppScreens } from '@common/constants';
import LedgerService from '@services/LedgerService';
// components
-import {
- AmountText,
- Button,
- Icon,
- InfoMessage,
- RaisedButton,
- Spacer,
- TokenAvatar,
- TouchableDebounce,
-} from '@components/General';
+import { AmountText, Button, Icon, InfoMessage, RaisedButton, Spacer, TouchableDebounce } from '@components/General';
+import { TokenAvatar, TokenIcon } from '@components/Modules/TokenElement';
import Localize from '@locale';
@@ -70,8 +62,8 @@ class TokenSettingsOverlay extends Component {
super(props);
this.state = {
- isFavorite: !!props.trustLine.favorite,
- hasXAppIdentifier: !!props.trustLine.currency.xapp_identifier,
+ isFavorite: !!props.token.favorite,
+ hasXAppIdentifier: !!props.token.currency.xappIdentifier,
isRemoving: false,
isLoading: false,
isReviewScreenVisible: false,
@@ -128,16 +120,47 @@ class TokenSettingsOverlay extends Component {
});
};
+ copyIssuerAddress = () => {
+ const { token } = this.props;
+
+ Clipboard.setString(token.currency.issuer);
+ Toast(Localize.t('asset.issuerAddressCopiedToClipboard'));
+ };
+
+ onCopyIssuerAddressPress = () => {
+ const { token } = this.props;
+
+ Navigator.showAlertModal({
+ type: 'warning',
+ text: Localize.t('asset.copyIssuerAddressWarning', {
+ issuerAddress: token.currency.issuer,
+ }),
+ buttons: [
+ {
+ text: Localize.t('global.cancel'),
+ type: 'dismiss',
+ light: true,
+ },
+ {
+ text: Localize.t('global.IUnderstand'),
+ onPress: this.copyIssuerAddress,
+ type: 'continue',
+ light: false,
+ },
+ ],
+ });
+ };
+
getLatestLineBalance = (): Promise => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
// ignore obligation lines
- if (trustLine.obligation) return Promise.resolve();
+ if (token.obligation) return Promise.resolve();
return new Promise((resolve) => {
LedgerService.getFilteredAccountLine(account.address, {
- issuer: trustLine.currency.issuer,
- currency: trustLine.currency.currencyCode,
+ issuer: token.currency.issuer,
+ currency: token.currency.currencyCode,
})
.then((line) => {
if (line) {
@@ -164,7 +187,7 @@ class TokenSettingsOverlay extends Component {
clearDustAmounts = async () => {
const { latestLineBalance } = this.state;
- const { trustLine, account } = this.props;
+ const { token, account } = this.props;
try {
this.setState({
@@ -174,17 +197,17 @@ class TokenSettingsOverlay extends Component {
const paymentJson = {
TransactionType: TransactionTypes.Payment,
Account: account.address,
- Destination: trustLine.currency.issuer,
+ Destination: token.currency.issuer,
DestinationTag: 0,
Amount: {
- currency: trustLine.currency.currencyCode,
- issuer: trustLine.currency.issuer,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
value: String(latestLineBalance),
},
};
// add PartialPayment flag if issuer have transferFee
- const issuerAccountInfo = await LedgerService.getAccountInfo(trustLine.currency.issuer);
+ const issuerAccountInfo = await LedgerService.getAccountInfo(token.currency.issuer);
// eslint-disable-next-line max-len
if (has(issuerAccountInfo, ['account_data', 'TransferRate'])) {
Object.assign(paymentJson, {
@@ -258,7 +281,7 @@ class TokenSettingsOverlay extends Component {
};
removeTrustLine = async () => {
- const { trustLine, account } = this.props;
+ const { token, account } = this.props;
const { latestLineBalance } = this.state;
try {
@@ -268,7 +291,7 @@ class TokenSettingsOverlay extends Component {
Localize.t('global.warning'),
Localize.t('asset.trustLineDustRemoveWarning', {
balance: new BigNumber(latestLineBalance).toFixed(),
- currency: NormalizeCurrencyCode(trustLine.currency.currencyCode),
+ currency: NormalizeCurrencyCode(token.currency.currencyCode),
}),
[
{ text: Localize.t('global.cancel') },
@@ -302,8 +325,8 @@ class TokenSettingsOverlay extends Component {
TransactionType: TransactionTypes.TrustSet,
Account: account.address,
LimitAmount: {
- currency: trustLine.currency.currencyCode,
- issuer: trustLine.currency.issuer,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
value: 0,
},
Flags: transactionFlags,
@@ -425,32 +448,32 @@ class TokenSettingsOverlay extends Component {
};
onSendPress = async () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
this.dismiss().then(() => {
- Navigator.push(AppScreens.Transaction.Payment, { currency: trustLine });
+ Navigator.push(AppScreens.Transaction.Payment, { token });
});
};
onExchangePress = () => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
this.dismiss().then(() => {
- Navigator.push(AppScreens.Transaction.Exchange, { account, trustLine });
+ Navigator.push(AppScreens.Transaction.Exchange, { account, token });
});
};
onDepositPress = async () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
this.dismiss().then(() => {
Navigator.showModal(
AppScreens.Modal.XAppBrowser,
{
- identifier: trustLine.currency.xapp_identifier!,
+ identifier: token.currency.xappIdentifier!,
params: {
- issuer: trustLine.currency.issuer,
- asset: trustLine.currency.currencyCode,
+ issuer: token.currency.issuer,
+ asset: token.currency.currencyCode,
action: 'DEPOSIT',
},
origin: XAppOrigin.XUMM,
@@ -464,16 +487,16 @@ class TokenSettingsOverlay extends Component {
};
onWithdrawPress = async () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
this.dismiss().then(() => {
Navigator.showModal(
AppScreens.Modal.XAppBrowser,
{
- identifier: trustLine.currency.xapp_identifier!,
+ identifier: token.currency.xappIdentifier!,
params: {
- issuer: trustLine.currency.issuer,
- asset: trustLine.currency.currencyCode,
+ issuer: token.currency.issuer,
+ asset: token.currency.currencyCode,
action: 'WITHDRAW',
},
origin: XAppOrigin.XUMM,
@@ -487,29 +510,29 @@ class TokenSettingsOverlay extends Component {
};
onFavoritePress = () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
this.setState({
- isFavorite: !trustLine.favorite,
+ isFavorite: !token.favorite,
});
// update the trustline
TrustLineRepository.update({
- id: trustLine.id,
- favorite: !trustLine.favorite,
+ id: token.id,
+ favorite: !token.favorite,
});
};
disableRippling = async () => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
const trustSetJson = {
TransactionType: TransactionTypes.TrustSet,
Account: account.address,
LimitAmount: {
- currency: trustLine.currency.currencyCode,
- issuer: trustLine.currency.issuer,
- value: trustLine.limit,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
+ value: token.limit,
},
Flags: 131072, // tfSetNoRipple
};
@@ -528,7 +551,7 @@ class TokenSettingsOverlay extends Component {
};
updateLineLimit = async () => {
- const { account, trustLine } = this.props;
+ const { account, token } = this.props;
this.setState({
isLoading: true,
@@ -538,8 +561,8 @@ class TokenSettingsOverlay extends Component {
try {
// set the trustline limit by gateway balance if it's more than our default value
- const resp = await LedgerService.getGatewayBalances(trustLine.currency.issuer);
- const gatewayBalances = get(resp, ['obligations', trustLine.currency.currencyCode]);
+ const resp = await LedgerService.getGatewayBalances(token.currency.issuer);
+ const gatewayBalances = get(resp, ['obligations', token.currency.currencyCode]);
if (gatewayBalances && Number(gatewayBalances) > Number(lineLimit)) {
lineLimit = gatewayBalances;
@@ -556,8 +579,8 @@ class TokenSettingsOverlay extends Component {
TransactionType: TransactionTypes.TrustSet,
Account: account.address,
LimitAmount: {
- currency: trustLine.currency.currencyCode,
- issuer: trustLine.currency.issuer,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
value: lineLimit,
},
Flags: 131072, // tfSetNoRipple
@@ -577,17 +600,17 @@ class TokenSettingsOverlay extends Component {
};
showConfigurationAlert = () => {
- const { trustLine } = this.props;
+ const { token } = this.props;
let explanation;
let fixMethod;
- if (trustLine.no_ripple === false) {
+ if (token.no_ripple === false) {
explanation = Localize.t('asset.ripplingMisconfigurationWarning', {
- token: NormalizeCurrencyCode(trustLine.currency.currencyCode),
+ token: NormalizeCurrencyCode(token.currency.currencyCode),
});
fixMethod = this.disableRippling;
- } else if (Number(trustLine.limit) === 0) {
+ } else if (Number(token.limit) === 0) {
explanation = Localize.t('asset.lineLimitMisconfigurationWarning');
fixMethod = this.updateLineLimit;
}
@@ -611,49 +634,18 @@ class TokenSettingsOverlay extends Component {
});
};
- copyIssuerAddress = () => {
- const { trustLine } = this.props;
-
- Clipboard.setString(trustLine.currency.issuer);
- Toast(Localize.t('asset.issuerAddressCopiedToClipboard'));
- };
-
- onCopyIssuerAddressPress = () => {
- const { trustLine } = this.props;
-
- Navigator.showAlertModal({
- type: 'warning',
- text: Localize.t('asset.copyIssuerAddressWarning', {
- issuerAddress: trustLine.currency.issuer,
- }),
- buttons: [
- {
- text: Localize.t('global.cancel'),
- type: 'dismiss',
- light: true,
- },
- {
- text: Localize.t('global.IUnderstand'),
- onPress: this.copyIssuerAddress,
- type: 'continue',
- light: false,
- },
- ],
- });
- };
-
canSend = () => {
- const { trustLine } = this.props;
- return Number(trustLine.balance) >= 0.00000001 || trustLine.obligation;
+ const { token } = this.props;
+ return Number(token.balance) >= 0.00000001 || token.obligation;
};
canExchange = () => {
- const { trustLine } = this.props;
- return !trustLine.obligation && !trustLine.isLiquidityPoolToken();
+ const { token } = this.props;
+ return !token.obligation && !token.isLiquidityPoolToken();
};
render() {
- const { trustLine } = this.props;
+ const { token } = this.props;
const { isFavorite, isReviewScreenVisible, isRemoving, isLoading, canRemove, hasXAppIdentifier } = this.state;
if (isReviewScreenVisible) {
@@ -688,39 +680,41 @@ class TokenSettingsOverlay extends Component {
-
+
-
-
+
+
- {trustLine.getReadableCurrency()}
+
+ {token.getFormattedCurrency()}
+
-
- {trustLine.counterParty.name}{' '}
- {trustLine.currency.name
- ? NormalizeCurrencyCode(trustLine.currency.currencyCode)
- : ''}
-
+ {token.getFormattedIssuer()}
- {!!trustLine.currency.avatar && (
-
- )}
-
+ }
+ />
- {(!trustLine.no_ripple || Number(trustLine.limit) === 0) &&
- !trustLine.obligation &&
- !trustLine.isLiquidityPoolToken() && (
+ {(!token.no_ripple || Number(token.limit) === 0) &&
+ !token.obligation &&
+ !token.isLiquidityPoolToken() && (
<>
{
containerStyle={styles.infoContainer}
labelStyle={styles.infoText}
label={
- !trustLine.no_ripple
+ !token.no_ripple
? Localize.t('asset.dangerousConfigurationDetected')
: Localize.t('asset.restrictingConfigurationDetected')
}
@@ -775,7 +769,7 @@ class TokenSettingsOverlay extends Component {
icon="IconCoins"
iconSize={22}
iconStyle={styles.depositButtonIcon}
- label={`${Localize.t('global.add')} ${trustLine.getReadableCurrency()}`}
+ label={`${Localize.t('global.add')} ${token.getFormattedCurrency()}`}
textStyle={styles.depositButtonText}
onPress={this.onDepositPress}
/>
@@ -788,7 +782,7 @@ class TokenSettingsOverlay extends Component {
iconPosition="left"
iconSize={22}
iconStyle={styles.withdrawButtonIcon}
- label={`${Localize.t('global.withdraw')} ${trustLine.getReadableCurrency()}`}
+ label={`${Localize.t('global.withdraw')} ${token.getFormattedCurrency()}`}
textStyle={styles.withdrawButtonText}
onPress={this.onWithdrawPress}
/>
diff --git a/src/screens/Overlay/TokenSettings/styles.tsx b/src/screens/Overlay/TokenSettings/styles.tsx
index 21f052827..64d0938ce 100644
--- a/src/screens/Overlay/TokenSettings/styles.tsx
+++ b/src/screens/Overlay/TokenSettings/styles.tsx
@@ -30,7 +30,7 @@ const styles = StyleService.create({
contentContainer: {
padding: AppSizes.paddingSml,
},
- currencyItem: {
+ tokenElement: {
paddingTop: 10,
paddingBottom: 10,
paddingRight: 5,
@@ -147,6 +147,10 @@ const styles = StyleService.create({
marginLeft: 5,
alignSelf: 'center',
},
+
+ tokenIconContainer: {
+ marginRight: 5,
+ },
});
export default styles;
diff --git a/src/screens/Overlay/TokenSettings/types.ts b/src/screens/Overlay/TokenSettings/types.ts
index 36b4926c5..61249353d 100644
--- a/src/screens/Overlay/TokenSettings/types.ts
+++ b/src/screens/Overlay/TokenSettings/types.ts
@@ -2,7 +2,7 @@ import { AccountModel, TrustLineModel } from '@store/models';
export interface Props {
account: AccountModel;
- trustLine: TrustLineModel;
+ token: TrustLineModel;
}
export interface State {
diff --git a/src/screens/Send/SendView.tsx b/src/screens/Send/SendView.tsx
index aa426b0ba..e0ea397cb 100644
--- a/src/screens/Send/SendView.tsx
+++ b/src/screens/Send/SendView.tsx
@@ -68,8 +68,8 @@ class SendView extends Component {
accounts: spendableAccounts,
payment: new PaymentWithSigMixin(),
source: find(spendableAccounts, { address: coreSettings.account.address }) ?? first(spendableAccounts),
- currency: props.currency || NetworkService.getNativeAsset(),
- amount: props.amount || '',
+ token: props.token ?? NetworkService.getNativeAsset(),
+ amount: props.amount ?? '',
memo: undefined,
selectedFee: undefined,
issuerFee: undefined,
@@ -108,9 +108,9 @@ class SendView extends Component {
this.setState({ source });
};
- setCurrency = (currency: TrustLineModel | string) => {
+ setToken = (token: TrustLineModel | string) => {
this.setState({
- currency,
+ token,
});
};
@@ -148,7 +148,7 @@ class SendView extends Component {
};
getPaymentJsonForFee = () => {
- const { currency, amount, destination, source, memo } = this.state;
+ const { token, amount, destination, source, memo } = this.state;
const txJson = {
TransactionType: 'Payment',
@@ -164,15 +164,15 @@ class SendView extends Component {
}
// set the amount
- if (typeof currency === 'string') {
+ if (typeof token === 'string') {
Object.assign(txJson, {
Amount: new AmountParser(amount, false).nativeToDrops().toString(),
});
} else {
Object.assign(txJson, {
Amount: {
- currency: currency.currency.currencyCode,
- issuer: currency.currency.issuer,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
value: amount,
},
});
@@ -243,7 +243,7 @@ class SendView extends Component {
};
send = async () => {
- const { currency, amount, selectedFee, issuerFee, destination, source, payment, memo } = this.state;
+ const { token, amount, selectedFee, issuerFee, destination, source, payment, memo } = this.state;
this.setState({
isLoading: true,
@@ -263,8 +263,8 @@ class SendView extends Component {
}
// set the amount
- if (typeof currency === 'string') {
- // native currency
+ if (typeof token === 'string') {
+ // native token
payment.Amount = {
currency: NetworkService.getNativeAsset(),
value: amount,
@@ -274,8 +274,8 @@ class SendView extends Component {
// if issuer has transfer fee and sender/destination is not issuer, add partial payment flag
if (
issuerFee &&
- source!.address !== currency.currency.issuer &&
- destination!.address !== currency.currency.issuer
+ source!.address !== token.currency.issuer &&
+ destination!.address !== token.currency.issuer
) {
payment.Flags = {
tfPartialPayment: true,
@@ -284,8 +284,8 @@ class SendView extends Component {
// set the amount
payment.Amount = {
- currency: currency.currency.currencyCode,
- issuer: currency.currency.issuer,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
value: amount,
};
}
@@ -308,11 +308,11 @@ class SendView extends Component {
// sign the transaction and then submit
await payment.sign(source!).then(this.submit);
- } catch (e: any) {
- if (e) {
+ } catch (error: any) {
+ if (error) {
Navigator.showAlertModal({
type: 'error',
- text: e.message,
+ text: error.message,
buttons: [
{
text: Localize.t('global.ok'),
@@ -402,7 +402,7 @@ class SendView extends Component {
goNext: this.goNext,
goBack: this.goBack,
setAmount: this.setAmount,
- setCurrency: this.setCurrency,
+ setToken: this.setToken,
setFee: this.setFee,
setMemo: this.setMemo,
setIssuerFee: this.setIssuerFee,
diff --git a/src/screens/Send/Steps/Details/DetailsStep.tsx b/src/screens/Send/Steps/Details/DetailsStep.tsx
index 18edace64..e26f179d3 100644
--- a/src/screens/Send/Steps/Details/DetailsStep.tsx
+++ b/src/screens/Send/Steps/Details/DetailsStep.tsx
@@ -88,7 +88,7 @@ class DetailsStep extends Component {
};
getAvailableBalance = (): Promise => {
- const { source, currency } = this.context;
+ const { source, token } = this.context;
return new Promise((resolve) => {
if (!source) {
@@ -96,33 +96,33 @@ class DetailsStep extends Component {
return;
}
- if (typeof currency === 'string') {
- // native currency
+ if (typeof token === 'string') {
+ // native token
resolve(CalculateAvailableBalance(source));
} else {
// IOU
// we fetch the IOU directly from Ledger
LedgerService.getFilteredAccountLine(source.address, {
- issuer: currency.currency.issuer,
- currency: currency.currency.currencyCode,
+ issuer: token.currency.issuer,
+ currency: token.currency.currencyCode,
})
.then((line) => {
if (line) {
resolve(line.balance);
return;
}
- resolve(currency.balance);
+ resolve(token.balance);
})
.catch(() => {
// in case of error just return IOU cached balance
- resolve(currency.balance);
+ resolve(token.balance);
});
}
});
};
goNext = async () => {
- const { goNext, currency, source, amount, setAmount } = this.context;
+ const { goNext, token, source, amount, setAmount } = this.context;
// check if account is activated
// if not just show an alert an return
@@ -133,7 +133,7 @@ class DetailsStep extends Component {
// check for exceed amount
// if sending IOU and obligation can send unlimited
- if (typeof currency !== 'string' && currency.obligation) {
+ if (typeof token !== 'string' && token.obligation) {
// go to next screen
goNext();
return;
@@ -161,9 +161,9 @@ class DetailsStep extends Component {
[
{ text: Localize.t('global.cancel') },
{
- text: typeof currency === 'string' ? Localize.t('global.update') : Localize.t('global.next'),
+ text: typeof token === 'string' ? Localize.t('global.update') : Localize.t('global.next'),
onPress: () => {
- if (typeof currency === 'string') {
+ if (typeof token === 'string') {
this.onAmountChange(String(availableBalance));
} else {
setAmount(String(availableBalance));
@@ -183,14 +183,14 @@ class DetailsStep extends Component {
};
getCurrencyName = (): string => {
- const { currency } = this.context;
+ const { token } = this.context;
// native currency
- if (typeof currency === 'string') {
+ if (typeof token === 'string') {
return NetworkService.getNativeAsset();
}
- return NormalizeCurrencyCode(currency.currency.currencyCode);
+ return NormalizeCurrencyCode(token.currency.currencyCode);
};
applyAllBalance = async () => {
@@ -225,7 +225,7 @@ class DetailsStep extends Component {
onAmountChange = (amount: string) => {
const { currencyRate } = this.state;
- const { currency, setAmount } = this.context;
+ const { token, setAmount } = this.context;
setAmount(amount);
@@ -237,7 +237,7 @@ class DetailsStep extends Component {
return;
}
- if (typeof currency === 'string' && currencyRate) {
+ if (typeof token === 'string' && currencyRate) {
const inRate = new BigNumber(amount).multipliedBy(currencyRate.rate).decimalPlaces(8).toFixed();
this.setState({
amountRate: inRate,
@@ -265,23 +265,23 @@ class DetailsStep extends Component {
};
onAccountChange = (item: AccountModel) => {
- const { setSource, setCurrency } = this.context;
+ const { setSource, setToken } = this.context;
// restore currency to default native currency
- setCurrency(NetworkService.getNativeAsset());
+ setToken(NetworkService.getNativeAsset());
// set new source
setSource(item);
};
- onCurrencyChange = (item: string | TrustLineModel) => {
- const { setCurrency, setAmount } = this.context;
+ onCurrencyChange = (item: TrustLineModel | string) => {
+ const { setToken, setAmount } = this.context;
// native currency
if (typeof item === 'string') {
- setCurrency(NetworkService.getNativeAsset());
+ setToken(NetworkService.getNativeAsset());
} else {
- setCurrency(item);
+ setToken(item);
}
// clear amount and rate
@@ -293,9 +293,9 @@ class DetailsStep extends Component {
};
calcKeyboardAwareExtraOffset = (input: any, inputHeight: number) => {
- const { currency } = this.context;
+ const { token } = this.context;
- if (input === this.amountInput.current && typeof currency === 'string') {
+ if (input === this.amountInput.current && typeof token === 'string') {
return inputHeight + Platform.select({ ios: 10, android: AppSizes.safeAreaBottomInset, default: 0 });
}
return 0;
@@ -303,7 +303,7 @@ class DetailsStep extends Component {
render() {
const { amountRate, currencyRate, isLoadingAvailableBalance, isCheckingBalance } = this.state;
- const { goBack, accounts, source, currency, amount, coreSettings } = this.context;
+ const { goBack, accounts, source, token, amount, coreSettings } = this.context;
return (
@@ -341,7 +341,7 @@ class DetailsStep extends Component {
]
: []
}
- selectedItem={currency}
+ selectedItem={token}
/>
@@ -372,9 +372,7 @@ class DetailsStep extends Component {
ref={this.amountInput}
testID="amount-input"
value={amount}
- valueType={
- typeof currency === 'string' ? AmountValueType.Native : AmountValueType.IOU
- }
+ valueType={typeof token === 'string' ? AmountValueType.Native : AmountValueType.IOU}
fractional
onChange={this.onAmountChange}
style={styles.amountInput}
@@ -384,7 +382,7 @@ class DetailsStep extends Component {
{/* only show rate for native currency payments */}
- {typeof currency === 'string' && (
+ {typeof token === 'string' && (
~
diff --git a/src/screens/Send/Steps/Recipient/RecipientStep.tsx b/src/screens/Send/Steps/Recipient/RecipientStep.tsx
index 0f5d7c147..7cbf813b9 100644
--- a/src/screens/Send/Steps/Recipient/RecipientStep.tsx
+++ b/src/screens/Send/Steps/Recipient/RecipientStep.tsx
@@ -15,14 +15,13 @@ import { ContactModel, AccountModel } from '@store/models';
import { AppScreens } from '@common/constants';
-import AccountResolver from '@common/helpers/resolver';
import { Toast } from '@common/helpers/interface';
import { Navigator } from '@common/helpers/navigator';
import { NormalizeCurrencyCode } from '@common/utils/monetary';
import { NormalizeDestination } from '@common/utils/codec';
-import { BackendService, LedgerService, NetworkService, StyleService } from '@services';
+import { BackendService, LedgerService, NetworkService, StyleService, ResolverService } from '@services';
import { Button, TextInput, Footer, InfoMessage } from '@components/General';
import { AccountElement } from '@components/Modules';
@@ -106,7 +105,7 @@ class RecipientStep extends Component {
const { to, tag } = NormalizeDestination(result);
if (to) {
- const accountInfo = await AccountResolver.getAccountName(to, tag);
+ const accountInfo = await ResolverService.getAccountName(to, tag);
this.setState({
dataSource: this.getSearchResultSource([
@@ -209,7 +208,7 @@ class RecipientStep extends Component {
res.matches.forEach(async (element: any) => {
// if payid in result, then look for payId in local source as well
if (element.source === 'payid') {
- const internalResult = await AccountResolver.getAccountName(
+ const internalResult = await ResolverService.getAccountName(
element.account,
element.tag,
true,
@@ -380,7 +379,7 @@ class RecipientStep extends Component {
};
checkAndNext = async (passedChecks = [] as Array) => {
- const { setDestinationInfo, amount, currency, destination, source } = this.context;
+ const { setDestinationInfo, amount, token, destination, source } = this.context;
let { destinationInfo } = this.context;
// double check, this should not be happening
@@ -404,14 +403,14 @@ class RecipientStep extends Component {
if (!destinationInfo) {
// check for account exist and potential destination tag required
- destinationInfo = await AccountResolver.getAccountInfo(destination.address);
+ destinationInfo = await ResolverService.getAccountAdvisoryInfo(destination.address);
// set destination account info
setDestinationInfo(destinationInfo);
}
// check for account risk and scam
if (
- (destinationInfo.risk === 'PROBABLE' || destinationInfo.risk === 'HIGH_PROBABILITY') &&
+ (destinationInfo.danger === 'PROBABLE' || destinationInfo.danger === 'HIGH_PROBABILITY') &&
passedChecks.indexOf(PassableChecks.PROBABLE_SCAM) === -1
) {
setTimeout(() => {
@@ -437,7 +436,7 @@ class RecipientStep extends Component {
return;
}
- if (destinationInfo.risk === 'CONFIRMED' && passedChecks.indexOf(PassableChecks.CONFIRMED_SCAM) === -1) {
+ if (destinationInfo.danger === 'CONFIRMED' && passedChecks.indexOf(PassableChecks.CONFIRMED_SCAM) === -1) {
setTimeout(() => {
Navigator.showOverlay(AppScreens.Overlay.FlaggedDestination, {
destination: destination.address,
@@ -452,7 +451,7 @@ class RecipientStep extends Component {
if (!destinationInfo.exist) {
// account does not exist and cannot activate with IOU
// IMMEDIATE REJECT
- if (typeof currency !== 'string') {
+ if (typeof token !== 'string') {
setTimeout(() => {
Navigator.showAlertModal({
type: 'warning',
@@ -475,10 +474,7 @@ class RecipientStep extends Component {
// check if amount is not covering the creation of account
// IMMEDIATE REJECT
- if (
- typeof currency === 'string' &&
- parseFloat(amount) < NetworkService.getNetworkReserve().BaseReserve
- ) {
+ if (typeof token === 'string' && parseFloat(amount) < NetworkService.getNetworkReserve().BaseReserve) {
setTimeout(() => {
Navigator.showAlertModal({
type: 'warning',
@@ -501,7 +497,7 @@ class RecipientStep extends Component {
// check if the amount will create the account
if (
- typeof currency === 'string' &&
+ typeof token === 'string' &&
parseFloat(amount) >= NetworkService.getNetworkReserve().BaseReserve &&
passedChecks.indexOf(PassableChecks.AMOUNT_CREATE_ACCOUNT) === -1
) {
@@ -540,10 +536,10 @@ class RecipientStep extends Component {
// check if recipient have proper trustline for receiving this IOU
// ignore if the recipient is the issuer
// IMMEDIATE REJECT
- if (typeof currency !== 'string' && currency.currency.issuer !== destination.address) {
+ if (typeof token !== 'string' && token.currency.issuer !== destination.address) {
const destinationLine = await LedgerService.getFilteredAccountLine(destination.address, {
- currency: currency.currency.currencyCode,
- issuer: currency.currency.issuer,
+ currency: token.currency.currencyCode,
+ issuer: token.currency.issuer,
});
// recipient does not have the proper trustline
@@ -597,9 +593,9 @@ class RecipientStep extends Component {
type: 'warning',
text: Localize.t('send.theDestinationAccountIsSetAsBlackHole', {
currency:
- typeof currency === 'string'
+ typeof token === 'string'
? NetworkService.getNativeAsset()
- : NormalizeCurrencyCode(currency.currency.currencyCode),
+ : NormalizeCurrencyCode(token.currency.currencyCode),
}),
buttons: [
{
@@ -617,7 +613,7 @@ class RecipientStep extends Component {
// check for xrp income disallow
if (
destinationInfo.disallowIncomingXRP &&
- typeof currency === 'string' &&
+ typeof token === 'string' &&
passedChecks.indexOf(PassableChecks.DISALLOWED_XRP_FLAG) === -1
) {
setTimeout(() => {
@@ -677,7 +673,7 @@ class RecipientStep extends Component {
};
goNext = async () => {
- const { goNext, setIssuerFee, source, destination, currency } = this.context;
+ const { goNext, setIssuerFee, source, destination, token } = this.context;
// double check, this should not be happening
if (!destination || !source) {
@@ -692,12 +688,12 @@ class RecipientStep extends Component {
// sending IOU && SENDER AND DESTINATION is not issuer, get issuer fee
if (
- typeof currency !== 'string' &&
- source.address !== currency.currency.issuer &&
- destination.address !== currency.currency.issuer
+ typeof token !== 'string' &&
+ source.address !== token.currency.issuer &&
+ destination.address !== token.currency.issuer
) {
// fetching/applying issuer fee from network
- const issuerFee = await LedgerService.getAccountTransferRate(currency.currency.issuer);
+ const issuerFee = await LedgerService.getAccountTransferRate(token.currency.issuer);
if (issuerFee) {
setIssuerFee(issuerFee);
}
diff --git a/src/screens/Send/Steps/Result/ResultStep.tsx b/src/screens/Send/Steps/Result/ResultStep.tsx
index 11b2fb2ac..b210e0cae 100644
--- a/src/screens/Send/Steps/Result/ResultStep.tsx
+++ b/src/screens/Send/Steps/Result/ResultStep.tsx
@@ -110,7 +110,7 @@ class ResultStep extends Component {
};
renderDetailsCard = () => {
- const { destination, amount, currency } = this.context;
+ const { destination, amount, token } = this.context;
return (
@@ -120,9 +120,7 @@ class ResultStep extends Component {
diff --git a/src/screens/Send/Steps/Summary/SummaryStep.tsx b/src/screens/Send/Steps/Summary/SummaryStep.tsx
index 34362b805..002151f82 100644
--- a/src/screens/Send/Steps/Summary/SummaryStep.tsx
+++ b/src/screens/Send/Steps/Summary/SummaryStep.tsx
@@ -17,6 +17,8 @@ import Preferences from '@common/libs/preferences';
import { CalculateAvailableBalance } from '@common/utils/balance';
+import { TrustLineModel } from '@store/models';
+
// components
import {
AmountText,
@@ -26,8 +28,8 @@ import {
TextInput,
SwipeButton,
KeyboardAwareScrollView,
- TokenAvatar,
} from '@components/General';
+import { TokenAvatar } from '@components/Modules/TokenElement';
import { AccountPicker, FeePicker } from '@components/Modules';
@@ -169,8 +171,8 @@ class SummaryStep extends Component {
};
goNext = () => {
+ const { goNext, token, source, amount, destination, destinationInfo } = this.context;
const { confirmedDestinationTag } = this.state;
- const { goNext, currency, source, amount, destination, destinationInfo } = this.context;
if (!amount || parseFloat(amount) === 0) {
Alert.alert(Localize.t('global.error'), Localize.t('send.pleaseEnterAmount'));
@@ -183,7 +185,7 @@ class SummaryStep extends Component {
}
// if IOU and obligation can send unlimited
- if (typeof currency !== 'string' && currency.obligation) {
+ if (typeof token !== 'string' && token.obligation) {
// go to next screen
goNext();
return;
@@ -235,7 +237,7 @@ class SummaryStep extends Component {
});
};
- renderCurrencyItem = (item: any) => {
+ renderCurrencyItem = (item: string | TrustLineModel) => {
const { source } = this.context;
// Native asset
@@ -265,10 +267,12 @@ class SummaryStep extends Component {
-
- {item.getReadableCurrency()}
- - {item.counterParty.name}
-
+
+ {item.getFormattedCurrency()}
+
+ - {item.getFormattedIssuer()}
+
+ {
renderAmountRate = () => {
const { currencyRate } = this.state;
- const { currency, amount } = this.context;
+ const { token, amount } = this.context;
// only show rate for native currency
- if (typeof currency === 'string' && currencyRate && amount) {
+ if (typeof token === 'string' && currencyRate && amount) {
const rate = Number(amount) * currencyRate.rate;
if (rate > 0) {
return (
@@ -303,17 +307,8 @@ class SummaryStep extends Component {
};
render() {
- const {
- source,
- amount,
- destination,
- currency,
- issuerFee,
- isLoading,
- selectedFee,
- setFee,
- getPaymentJsonForFee,
- } = this.context;
+ const { source, amount, destination, token, issuerFee, isLoading, selectedFee, setFee, getPaymentJsonForFee } =
+ this.context;
const { destinationTagInputVisible, canScroll } = this.state;
return (
@@ -396,7 +391,7 @@ class SummaryStep extends Component {
- {this.renderCurrencyItem(currency)}
+ {this.renderCurrencyItem(token)}
{/* Amount */}
diff --git a/src/screens/Send/Steps/Summary/styles.tsx b/src/screens/Send/Steps/Summary/styles.tsx
index d5422987d..b55a25159 100644
--- a/src/screens/Send/Steps/Summary/styles.tsx
+++ b/src/screens/Send/Steps/Summary/styles.tsx
@@ -101,6 +101,7 @@ const styles = StyleService.create({
fontSize: AppFonts.small.size,
fontFamily: AppFonts.base.family,
color: '$textSecondary',
+ paddingTop: 5,
},
amountInput: {
diff --git a/src/screens/Send/types.ts b/src/screens/Send/types.ts
index fa82aa61b..e71c9ceab 100644
--- a/src/screens/Send/types.ts
+++ b/src/screens/Send/types.ts
@@ -1,7 +1,8 @@
import { XrplDestination } from 'xumm-string-decode';
import { Payment } from '@common/libs/ledger/transactions';
-import { AccountInfoType } from '@common/helpers/resolver';
+
+import { AccountAdvisoryResolveType } from '@services/ResolverService';
import { Destination } from '@common/libs/ledger/parser/types';
@@ -24,7 +25,7 @@ export interface FeeItem {
}
export interface Props {
- currency?: TrustLineModel;
+ token?: TrustLineModel;
scanResult?: XrplDestination;
amount?: string;
}
@@ -34,8 +35,8 @@ export interface State {
accounts: Array;
source?: AccountModel;
destination?: Destination;
- destinationInfo?: AccountInfoType;
- currency: TrustLineModel | string;
+ destinationInfo?: AccountAdvisoryResolveType;
+ token: TrustLineModel | string;
amount: string;
memo?: string;
selectedFee?: FeeItem;
@@ -48,7 +49,7 @@ export interface State {
export interface ContextProps extends State {
setSource: (source: AccountModel) => void;
- setCurrency: (currency: TrustLineModel | string) => void;
+ setToken: (token: TrustLineModel | string) => void;
setAmount: (amount: string) => void;
setDestination: (destination: Destination | undefined) => void;
setDestinationInfo: (info: any) => void;
diff --git a/src/screens/Settings/AddressBook/Add/AddContactView.tsx b/src/screens/Settings/AddressBook/Add/AddContactView.tsx
index ff29b508b..addeccf6b 100644
--- a/src/screens/Settings/AddressBook/Add/AddContactView.tsx
+++ b/src/screens/Settings/AddressBook/Add/AddContactView.tsx
@@ -10,13 +10,14 @@ import { View, Text, Alert, Keyboard } from 'react-native';
import { StringType, XrplDestination } from 'xumm-string-decode';
import { libraries } from 'xrpl-accountlib';
-import { NormalizeDestination } from '@common/utils/codec';
+import { AppScreens } from '@common/constants';
+
+import ResolverService from '@services/ResolverService';
-import AccountResolver from '@common/helpers/resolver';
import { Toast } from '@common/helpers/interface';
import { Navigator } from '@common/helpers/navigator';
-import { AppScreens } from '@common/constants';
+import { NormalizeDestination } from '@common/utils/codec';
import { ContactRepository } from '@store/repositories';
@@ -71,7 +72,7 @@ class AddContactView extends Component {
// if everything is fine try to fetch the account name
if (to) {
- const accountInfo = await AccountResolver.getAccountName(to, tag);
+ const accountInfo = await ResolverService.getAccountName(to, tag);
this.setState({
xAddress,
@@ -90,7 +91,7 @@ class AddContactView extends Component {
// if payId try to resolve
if (result.payId) {
- const payIdInfo = await AccountResolver.getPayIdInfo(result.payId);
+ const payIdInfo = await ResolverService.getPayIdInfo(result.payId);
if (payIdInfo) {
await this.doNameLookup({
@@ -151,13 +152,6 @@ class AddContactView extends Component {
destinationTag: tag || '',
});
- // update resolver cache for this contact
- AccountResolver.setCache(`${address}${tag ?? ''}`, {
- address: address!,
- name,
- source: 'contacts',
- });
-
Toast(Localize.t('settings.contactSuccessSaved'));
// force re-render the app
diff --git a/src/screens/Settings/AddressBook/Edit/EditContactView.tsx b/src/screens/Settings/AddressBook/Edit/EditContactView.tsx
index 6c27e45c1..1e82fb990 100644
--- a/src/screens/Settings/AddressBook/Edit/EditContactView.tsx
+++ b/src/screens/Settings/AddressBook/Edit/EditContactView.tsx
@@ -8,11 +8,11 @@ import { View, Text, Alert, Keyboard, Platform, Share } from 'react-native';
import { StringType } from 'xumm-string-decode';
import { libraries } from 'xrpl-accountlib';
-import { StyleService } from '@services';
+import StyleService from '@services/StyleService';
+import ResolverService from '@services/ResolverService';
import { NormalizeDestination } from '@common/utils/codec';
-import AccountResolver from '@common/helpers/resolver';
import { Toast, Prompt, ActionSheet } from '@common/helpers/interface';
import { Navigator } from '@common/helpers/navigator';
@@ -80,7 +80,7 @@ class EditContactView extends Component {
isLoading: true,
});
- const payIdInfo = await AccountResolver.getPayIdInfo(result.payId);
+ const payIdInfo = await ResolverService.getPayIdInfo(result.payId);
if (payIdInfo) {
this.setState({
@@ -146,9 +146,6 @@ class EditContactView extends Component {
destinationTag: tag || '',
});
- // update catch for this contact
- AccountResolver.setCache(`${address}${tag ?? ''}`, { address: address!, name, source: 'contacts' });
-
Toast(Localize.t('settings.contactSuccessUpdated'));
// force re-render the app
@@ -169,9 +166,8 @@ class EditContactView extends Component {
{
text: Localize.t('global.doIt'),
onPress: () => {
- ContactRepository.deleteById(contact.id);
+ ContactRepository.remove(contact);
Toast(Localize.t('settings.contactSuccessDeleted'));
-
Navigator.pop();
},
style: 'destructive',
diff --git a/src/screens/Settings/Advanced/AdvancedSettingsView.tsx b/src/screens/Settings/Advanced/AdvancedSettingsView.tsx
index 809fdd1c1..72913e413 100644
--- a/src/screens/Settings/Advanced/AdvancedSettingsView.tsx
+++ b/src/screens/Settings/Advanced/AdvancedSettingsView.tsx
@@ -7,6 +7,7 @@ import { View, Text, ScrollView, Alert, Platform, Linking } from 'react-native';
import PushNotificationsService from '@services/PushNotificationsService';
import NetworkService from '@services/NetworkService';
+import BackendService from '@services/BackendService';
import { CoreRepository, NetworkRepository, ProfileRepository } from '@store/repositories';
import { CoreModel, ProfileModel } from '@store/models';
@@ -17,19 +18,19 @@ import { Navigator } from '@common/helpers/navigator';
import { SetFlagSecure, GetAppVersionCode, GetAppReadableVersion } from '@common/helpers/app';
-import { TouchableDebounce, Header, Icon, Switch } from '@components/General';
+import { TouchableDebounce, Header, Icon, Switch, MultiPressDetector } from '@components/General';
import Localize from '@locale';
import { SessionLogViewProps } from '@screens/Settings/Advanced/Logs';
import { NetworkSettingViewProps } from '@screens/Settings/Advanced/Network';
+import { DeveloperSettingViewProps } from '@screens/Settings/Advanced/DeveloperSettings';
import { AuthenticateOverlayProps } from '@screens/Overlay/Authenticate';
import { ChangeLogOverlayProps } from '@screens/Overlay/ChangeLog';
// style
import { AppStyles } from '@theme';
import styles from './styles';
-import BackendService from '@services/BackendService';
/* types ==================================================================== */
export interface Props {}
@@ -242,6 +243,14 @@ class AdvancedSettingsView extends Component {
Navigator.push(AppScreens.Settings.Network.List, {});
};
+ showDeveloperSettings = () => {
+ const { coreSettings } = this.state;
+
+ if (coreSettings.developerMode) {
+ Navigator.push(AppScreens.Settings.DeveloperSettings, {});
+ }
+ };
+
render() {
const { coreSettings, profile } = this.state;
@@ -298,14 +307,11 @@ class AdvancedSettingsView extends Component {
-
+
{GetAppReadableVersion()}
-
+
diff --git a/src/screens/Settings/Advanced/DeveloperSettings/DeveloperSettingView.tsx b/src/screens/Settings/Advanced/DeveloperSettings/DeveloperSettingView.tsx
new file mode 100644
index 000000000..e9b7d998f
--- /dev/null
+++ b/src/screens/Settings/Advanced/DeveloperSettings/DeveloperSettingView.tsx
@@ -0,0 +1,118 @@
+/**
+ * Developer settings Screen
+ */
+
+import React, { Component } from 'react';
+import { View, Text, ScrollView } from 'react-native';
+
+import { Navigator } from '@common/helpers/navigator';
+
+import { AppScreens } from '@common/constants';
+
+import { Header, InfoMessage, Switch, TouchableDebounce } from '@components/General';
+
+import Localize from '@locale';
+
+// style
+import { AppStyles } from '@theme';
+import styles from './styles';
+import Preferences from '@common/libs/preferences';
+import ResolverService from '@services/ResolverService';
+import { Toast } from '@common/helpers/interface';
+
+/* types ==================================================================== */
+export interface Props {}
+
+export interface State {
+ experimentalSimplicityUI: boolean;
+}
+/* Component ==================================================================== */
+class DeveloperSettingView extends Component {
+ static screenName = AppScreens.Settings.DeveloperSettings;
+
+ static options() {
+ return {
+ bottomTabs: { visible: false },
+ };
+ }
+
+ constructor(props: Props) {
+ super(props);
+ this.state = {
+ experimentalSimplicityUI: false,
+ };
+ }
+
+ componentDidMount() {
+ Preferences.get(Preferences.keys.EXPERIMENTAL_SIMPLICITY_UI).then((value) => {
+ this.setState({
+ experimentalSimplicityUI: value === 'true',
+ });
+ });
+ }
+
+ onExperimentalUIChangeRequest = (enable: boolean) => {
+ Preferences.set(Preferences.keys.EXPERIMENTAL_SIMPLICITY_UI, `${enable}`).then(() => {
+ this.setState({
+ experimentalSimplicityUI: enable,
+ });
+ });
+ };
+
+ clearResolverCache = () => {
+ ResolverService.clearCache().then(() => {
+ Toast(Localize.t('settings.cacheClearedSuccessfully'));
+ });
+ };
+
+ render() {
+ const { experimentalSimplicityUI } = this.state;
+
+ return (
+
+
+
+
+ {Localize.t('settings.experimental')}
+
+
+
+
+ {Localize.t('settings.experimentalSimplicityUi')}
+
+
+
+
+
+
+
+
+ {Localize.t('settings.cache')}
+
+
+
+
+ {Localize.t('settings.clearResolverCache')}
+
+
+
+
+
+
+
+ );
+ }
+}
+
+/* Export Component ==================================================================== */
+export default DeveloperSettingView;
diff --git a/src/screens/Settings/Advanced/DeveloperSettings/index.ts b/src/screens/Settings/Advanced/DeveloperSettings/index.ts
new file mode 100644
index 000000000..c7ffbdca0
--- /dev/null
+++ b/src/screens/Settings/Advanced/DeveloperSettings/index.ts
@@ -0,0 +1,4 @@
+import DeveloperSettingView, { Props as DeveloperSettingViewProps } from './DeveloperSettingView';
+
+export type { DeveloperSettingViewProps };
+export default DeveloperSettingView;
diff --git a/src/screens/Settings/Advanced/DeveloperSettings/styles.tsx b/src/screens/Settings/Advanced/DeveloperSettings/styles.tsx
new file mode 100644
index 000000000..86db7669a
--- /dev/null
+++ b/src/screens/Settings/Advanced/DeveloperSettings/styles.tsx
@@ -0,0 +1,55 @@
+import { StyleSheet } from 'react-native';
+
+import StyleService from '@services/StyleService';
+import { AppSizes, AppFonts } from '@theme';
+
+/* Styles ==================================================================== */
+const styles = StyleService.create({
+ container: {
+ position: 'relative',
+ flex: 1,
+ flexDirection: 'column',
+ // backgroundColor: AppColors.grey,
+ },
+ rowIcon: {
+ tintColor: '$blue',
+ marginRight: -10,
+ },
+ row: {
+ width: '100%',
+ paddingHorizontal: AppSizes.paddingSml,
+ paddingVertical: AppSizes.paddingSml,
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '$background',
+ borderBottomWidth: StyleSheet.hairlineWidth,
+ borderTopWidth: StyleSheet.hairlineWidth,
+ borderColor: '$tint',
+ },
+ label: {
+ fontFamily: AppFonts.base.family,
+ fontSize: AppFonts.subtext.size,
+ color: '$textPrimary',
+ },
+ destructionLabel: {
+ fontFamily: AppFonts.base.family,
+ fontSize: AppFonts.subtext.size,
+ color: '$red',
+ textAlign: 'center',
+ },
+ value: {
+ fontFamily: AppFonts.base.family,
+ fontSize: AppFonts.subtext.size,
+ textAlign: 'right',
+ color: '$textSecondary',
+ },
+ descriptionText: {
+ padding: AppSizes.paddingSml,
+ fontFamily: AppFonts.base.family,
+ fontSize: AppFonts.base.size,
+ fontWeight: 'bold',
+ color: '$textPrimary',
+ },
+});
+
+export default styles;
diff --git a/src/screens/index.ts b/src/screens/index.ts
index 148e19495..08c116405 100644
--- a/src/screens/index.ts
+++ b/src/screens/index.ts
@@ -92,6 +92,7 @@ import ChangePasscode from './Settings/Security/ChangePasscode';
// session log
import SessionLog from './Settings/Advanced/Logs';
+import DeveloperSettings from './Settings/Advanced/DeveloperSettings';
// global screens
import Placeholder from './Global/Placeholder';
@@ -169,6 +170,7 @@ export {
EditThirdPartyApp,
NetworkList,
SessionLog,
+ DeveloperSettings,
Picker,
Placeholder,
};
diff --git a/src/services/AccountService.ts b/src/services/AccountService.ts
index 20ac9acce..e7c7be4ee 100644
--- a/src/services/AccountService.ts
+++ b/src/services/AccountService.ts
@@ -4,11 +4,14 @@
* This is the service we use for update accounts real time details and listen for ledger transactions
*/
+import BigNumber from 'bignumber.js';
+
import EventEmitter from 'events';
-import { map, forEach, get, keys } from 'lodash';
+import { get, keys, map } from 'lodash';
+
+import { CurrencyModel, TrustLineModel, CoreModel } from '@store/models';
+import { AccountRepository, AmmPairRepository, CoreRepository, CurrencyRepository } from '@store/repositories';
-import { CurrencyModel, TrustLineModel } from '@store/models';
-import { AccountRepository, AmmPairRepository, CurrencyRepository } from '@store/repositories';
import { RewardInformation } from '@store/models/objects/accountDetails';
import Meta from '@common/libs/ledger/parser/meta';
@@ -18,8 +21,6 @@ import NetworkService from '@services/NetworkService';
import LoggerService, { LoggerInstance } from '@services/LoggerService';
import LedgerService from '@services/LedgerService';
-import { AccountTypes } from '@store/types';
-
import {
SubscribeRequest,
SubscribeResponse,
@@ -27,7 +28,6 @@ import {
UnsubscribeRequest,
UnsubscribeResponse,
} from '@common/libs/ledger/types/methods';
-import BigNumber from 'bignumber.js';
/* Events ==================================================================== */
export type AccountServiceEvent = {
@@ -41,27 +41,26 @@ declare interface AccountService {
}
/* Service ==================================================================== */
class AccountService extends EventEmitter {
- private accounts: string[];
private transactionListener: any;
+ private account?: string;
private logger: LoggerInstance;
constructor() {
super();
- this.accounts = [];
+ this.account = undefined;
this.logger = LoggerService.createLogger('Account');
}
- initialize = (): Promise => {
+ initialize = (settings: CoreModel): Promise => {
return new Promise((resolve, reject) => {
try {
- // load accounts
- this.loadAccounts();
+ // set current default account
+ this.account = settings.account?.address;
- // add listeners for account changes
- AccountRepository.on('accountCreate', this.onAccountsChange);
- AccountRepository.on('accountRemove', this.onAccountsChange);
+ // list for any default account change
+ CoreRepository.on('updateSettings', this.onSettingsUpdate);
// on network service connect
NetworkService.on('connect', this.onNetworkConnect);
@@ -73,14 +72,46 @@ class AccountService extends EventEmitter {
});
};
+ onSettingsUpdate = (settings: CoreModel, changes: Partial) => {
+ if ('account' in changes && this.account !== settings.account.address) {
+ this.onAccountChange(settings.account.address);
+ }
+ };
+
+ /**
+ * When default account changed
+ */
+ onAccountChange = (account: string) => {
+ if (this.account) {
+ // unsubscribe from old account
+ this.unsubscribe(this.account);
+ }
+
+ // set the current account
+ this.account = account;
+
+ // subscribe again on new account
+ this.subscribe(account);
+
+ // update accounts info
+ this.updateAccountsDetails(account);
+ };
+
/**
* Update the details when connect to the network
*/
onNetworkConnect = () => {
- // update account details
- this.updateAccountsDetails();
+ // no account
+ if (!this.account) {
+ return;
+ }
+
// subscribe accounts for transactions stream
- this.subscribe();
+ this.subscribe(this.account);
+
+ // update account details
+ this.updateAccountsDetails(this.account);
+
// register on transaction event handler
this.setTransactionListener();
};
@@ -112,39 +143,14 @@ class AccountService extends EventEmitter {
const effectedAccounts = [...new Set([...balanceChangesAccounts, ...ownerCountChangesAccounts])];
- // update account details
- this.updateAccountsDetails(effectedAccounts);
-
- // emit onTransaction event
- this.emit('transaction', transaction, effectedAccounts);
- }
- };
+ if (this.account && effectedAccounts.includes(this.account)) {
+ // update account details
+ this.updateAccountsDetails(this.account);
- /**
- * Load accounts from data store
- */
- loadAccounts = () => {
- // fetch accounts from store
- const accounts = AccountRepository.getAccounts();
-
- // no account is present in the app
- if (accounts.length === 0) {
- this.accounts = [];
- return;
+ // emit onTransaction event
+ this.emit('transaction', transaction, effectedAccounts);
+ }
}
-
- // log the existent accounts in the session log
- this.logger.debug(
- `Presented accounts: ${accounts.reduce(
- (account, item) =>
- `${account}\n${item.address}-${item.accessLevel} ${
- item.flags?.disableMasterKey ? '[MasterDisabled]' : ''
- } ${item.type !== AccountTypes.Regular ? `[${item.type}]` : ''}`,
- '',
- )}`,
- );
-
- this.accounts = accounts.flatMap((account) => account.address);
};
/**
@@ -185,12 +191,10 @@ class AccountService extends EventEmitter {
return;
}
+ const { account_data, account_flags } = accountInfo;
// fetch the normalized account lines
const normalizedAccountLines = await this.getNormalizedAccountLines(account);
- // if account FOUND and no error
- const { account_data, account_flags } = accountInfo;
-
// update account info
await AccountRepository.updateDetails(account, {
id: `${account}.${NetworkService.getNetworkId()}`,
@@ -225,7 +229,7 @@ class AccountService extends EventEmitter {
const combinedLines = [...accountLines, ...accountObligations];
- const normalizedList = await Promise.all(
+ return Promise.all(
combinedLines.map(async (line) => {
const currency = await CurrencyRepository.upsert({
id: `${line.account}.${line.currency}`,
@@ -256,8 +260,6 @@ class AccountService extends EventEmitter {
};
}),
);
-
- return normalizedList;
};
updateAMMPairs = async (address: string) => {
@@ -321,49 +323,25 @@ class AccountService extends EventEmitter {
* Update accounts details through socket request
* this will contain account trustLines etc ...
*/
- updateAccountsDetails = (include?: string[]) => {
- forEach(this.accounts, async (account) => {
- // check if include present
- if (Array.isArray(include) && include.length > 0) {
- if (include.indexOf(account) === -1) return;
- }
-
- await this.updateAccountInfo(account).catch((error) => {
- this.logger.error(`updateAccountInfo [${account}] `, error);
- });
-
- await this.updateAMMPairs(account).catch((error) => {
- this.logger.error(`updateAMMPairs [${account}] `, error);
- });
+ updateAccountsDetails = async (account: string) => {
+ await this.updateAccountInfo(account).catch((error) => {
+ this.logger.error(`updateAccountInfo [${account}] `, error);
});
- };
-
- /**
- * Watch for any account added or removed in store
- */
- onAccountsChange = () => {
- // unsubscribe from old list
- this.unsubscribe();
-
- // reload accounts
- this.loadAccounts();
- // subscribe again on new account list
- this.subscribe();
-
- // update accounts info
- this.updateAccountsDetails();
+ await this.updateAMMPairs(account).catch((error) => {
+ this.logger.error(`updateAMMPairs [${account}] `, error);
+ });
};
/**
* Unsubscribe for streaming
*/
- unsubscribe() {
- this.logger.debug(`Unsubscribe to ${this.accounts.length} accounts`, this.accounts);
+ unsubscribe(account: string) {
+ this.logger.debug(`Unsubscribe account ${account} from network`);
NetworkService.send({
command: 'unsubscribe',
- accounts: this.accounts,
+ accounts: [account],
}).catch((error) => {
this.logger.warn('unsubscribe', error);
});
@@ -372,12 +350,12 @@ class AccountService extends EventEmitter {
/**
* Subscribe for streaming
*/
- subscribe() {
- this.logger.debug(`Subscribed to ${this.accounts.length} accounts`, this.accounts);
+ subscribe(account: string) {
+ this.logger.debug(`Subscribed account ${account} to network`);
NetworkService.send({
command: 'subscribe',
- accounts: this.accounts,
+ accounts: [account],
}).catch((error: Error) => {
this.logger.warn('subscribe', error);
});
diff --git a/src/services/AuthenticationService.ts b/src/services/AuthenticationService.ts
index e8771300f..321746c8f 100644
--- a/src/services/AuthenticationService.ts
+++ b/src/services/AuthenticationService.ts
@@ -63,7 +63,7 @@ class AuthenticationService extends EventEmitter {
this.postSuccess = [
AppService.checkVersionChange,
AppService.checkAppUpdate,
- BackendService.sync,
+ BackendService.ping,
LinkingService.checkInitialDeepLink,
PushNotificationsService.checkInitialNotification,
];
diff --git a/src/services/BackendService.ts b/src/services/BackendService.ts
index 4ef52c8b6..3682e9e21 100644
--- a/src/services/BackendService.ts
+++ b/src/services/BackendService.ts
@@ -3,7 +3,7 @@
* Interact with Xaman backend
*/
-import { get, isEmpty, map, reduce } from 'lodash';
+import { get, isEmpty } from 'lodash';
import moment from 'moment-timezone';
import { Platform } from 'react-native';
import { OptionsModalPresentationStyle } from 'react-native-navigation';
@@ -15,16 +15,12 @@ import { Navigator } from '@common/helpers/navigator';
import { GetDeviceUniqueId } from '@common/helpers/device';
import { GetAppReadableVersion } from '@common/helpers/app';
-import { CurrencyModel } from '@store/models';
import { NetworkType } from '@store/types';
import CoreRepository from '@store/repositories/core';
import ProfileRepository from '@store/repositories/profile';
-import CounterPartyRepository from '@store/repositories/counterParty';
import CurrencyRepository from '@store/repositories/currency';
-import Preferences from '@common/libs/preferences';
-
import { Payload, PayloadType } from '@common/libs/payload';
import { InAppPurchaseReceipt } from '@common/libs/iap';
@@ -98,80 +94,58 @@ class BackendService {
});
};
- /**
- * Starts syncing with the backend, including Curated IOUs.
- */
- public sync = () => {
- this.logger.debug('Start Syncing with backend');
- Promise.all([this.ping(), this.syncCuratedIOUs()]);
- };
-
- /**
- * Updates Curated IOUs list from the backend.
- */
- syncCuratedIOUs = async () => {
+ syncTokensDetails = async (issuer: string): Promise => {
try {
- // in case of not exist, then Number(LOCALE_VERSION) will be 0
- const LOCALE_VERSION = await Preferences.get(Preferences.keys.CURATED_LIST_VERSION);
-
- const { details, version, changed } = await this.getCuratedIOUs(Number(LOCALE_VERSION));
+ // get all issued currencies from this issuer
+ const issuedCurrencies = CurrencyRepository.findBy('issuer', issuer);
- // nothing has been changed
- if (!changed) {
+ // no currencies ?
+ if (issuedCurrencies.isEmpty()) {
return;
}
- // update the list
- const updatedParties = await reduce(
- details,
- async (result: Promise, value) => {
- const currenciesList = [] as CurrencyModel[];
-
- await Promise.all(
- map(value.currencies, async (c) => {
- const currency = await CurrencyRepository.upsert({
- id: `${c.issuer}.${c.currency}`,
- issuer: c.issuer,
- currencyCode: c.currency,
- name: c.name,
- avatar: c.avatar || '',
- shortlist: c.shortlist === 1,
- xapp_identifier: c.xapp_identifier || '',
- });
-
- currenciesList.push(currency);
- }),
- );
-
- await CounterPartyRepository.upsert({
- id: value.id,
- name: value.name,
- domain: value.domain,
- avatar: value.avatar || '',
- shortlist: value.shortlist === 1,
- currencies: currenciesList,
- });
+ // get issuer details and token details from backend
+ const { details } = await this.getCuratedIOUs({ issuer });
- (await result).push(value.id);
- return result;
- },
- Promise.resolve([]),
+ // try to find issuer details in the response
+ const issuerDetails = Object.values(details).find((cp) =>
+ Object.values(cp.currencies).some((c) => c.issuer === issuer),
);
- // delete removed parties from data store
- const counterParties = CounterPartyRepository.findAll();
- const removedParties = counterParties.filter((c) => {
- return !updatedParties.includes(c.id);
- });
+ for (const currency of issuedCurrencies) {
+ const currencyDetails = issuerDetails?.currencies[currency.currencyCode];
+
+ const updatedDetails = {
+ name: currencyDetails?.name ?? '',
+ avatarUrl: currencyDetails?.avatar ?? '',
+ issuerAvatarUrl: issuerDetails?.avatar ?? '',
+ issuerName: issuerDetails?.name ?? '',
+ shortlist: currencyDetails?.shortlist === 1,
+ xappIdentifier: currencyDetails?.xapp_identifier ?? '',
+ };
+
+ // check if the details has been changed
+ const hasChanges = Object.entries(updatedDetails).some(
+ ([key, value]) => (currency as any)[key] !== value,
+ );
- if (removedParties.length > 0) {
- CounterPartyRepository.delete(removedParties);
+ // only update if the data has been changed
+ if (hasChanges) {
+ await CurrencyRepository.updateCurrencyDetails({
+ id: currency.id,
+ ...updatedDetails,
+ updatedAt: new Date(),
+ });
+ } else {
+ // update the time
+ await CurrencyRepository.update({
+ id: currency.id,
+ updatedAt: new Date(),
+ });
+ }
}
-
- // persist the latest version
- await Preferences.set(Preferences.keys.CURATED_LIST_VERSION, String(version));
} catch (error) {
- this.logger.error('syncCuratedIOUs', error);
+ this.logger.error('syncTokensDetails', error);
}
};
@@ -330,8 +304,8 @@ class BackendService {
});
};
- getCuratedIOUs = (version = 0, promoted = false): Promise => {
- return ApiService.fetch(Endpoints.CuratedIOUs, 'GET', { version, promoted });
+ getCuratedIOUs = (params: { promoted?: boolean; issuer?: string }): Promise => {
+ return ApiService.fetch(Endpoints.CuratedIOUs, 'GET', params);
};
/**
diff --git a/src/services/ResolverService.ts b/src/services/ResolverService.ts
new file mode 100644
index 000000000..8a6e924ac
--- /dev/null
+++ b/src/services/ResolverService.ts
@@ -0,0 +1,285 @@
+/**
+ * Resolver Service
+ * This service is responsible to resolve account related details including names, issuer token details etc ...
+ */
+
+import moment from 'moment-timezone';
+import LoggerService, { LoggerInstance } from '@services/LoggerService';
+
+import BackendService from '@services/BackendService';
+import LedgerService from '@services/LedgerService';
+
+import ContactRepository, { ContactRepositoryEvent } from '@store/repositories/contact';
+import AccountRepository, { AccountRepositoryEvent } from '@store/repositories/account';
+
+import { AccountDetailsModel, AccountModel, ContactModel, CurrencyModel } from '@store/models';
+
+import Advisory from '@common/helpers/advisory';
+
+import LRUCache from '@common/utils/cache';
+import { CurrencyRepository } from '@store/repositories';
+import { CurrencyRepositoryEvent } from '@store/repositories/currency';
+import { PromiseQueue } from '@common/utils/queue';
+
+/* Types ==================================================================== */
+export interface PayIDInfo {
+ account: string;
+ tag: string | null;
+}
+
+export interface AccountNameResolveType {
+ address: string;
+ tag?: number;
+ name?: string;
+ source?: string;
+ kycApproved?: boolean;
+ blocked?: boolean;
+}
+
+export interface AccountAdvisoryResolveType {
+ exist: boolean;
+ danger: string;
+ requireDestinationTag?: boolean;
+ possibleExchange?: boolean;
+ disallowIncomingXRP?: boolean;
+ blackHole?: boolean;
+}
+
+/* Service ==================================================================== */
+class ResolverService {
+ private static AccountNameCacheSize = 300;
+
+ private accountNameCache: LRUCache | AccountNameResolveType>;
+ private promiseQueue: PromiseQueue;
+ private logger: LoggerInstance;
+
+ constructor() {
+ this.accountNameCache = new LRUCache | AccountNameResolveType>(
+ ResolverService.AccountNameCacheSize,
+ );
+
+ this.promiseQueue = new PromiseQueue(3);
+
+ this.logger = LoggerService.createLogger('ResolverService');
+ }
+
+ initialize = (): Promise => {
+ return new Promise((resolve, reject) => {
+ try {
+ // add listeners for account changes for updating the cache
+ (['accountCreate', 'accountRemove', 'accountUpdate'] as (keyof AccountRepositoryEvent)[]).forEach(
+ (event) => AccountRepository.on(event, this.onAccountsChange),
+ );
+
+ // add listeners for contact changes for updating the cache
+ (['contactCreate', 'contactRemove', 'contactUpdate'] as (keyof ContactRepositoryEvent)[]).forEach(
+ (event) => ContactRepository.on(event, this.onContactChange),
+ );
+
+ (['currencyUpsert'] as (keyof CurrencyRepositoryEvent)[]).forEach((event) =>
+ CurrencyRepository.on(event, this.onCurrencyUpsert),
+ );
+
+ resolve();
+ } catch (e) {
+ reject(e);
+ }
+ });
+ };
+
+ /**
+ * reinstate service
+ */
+ reinstate = () => {
+ // remove account listeners
+ (['accountCreate', 'accountRemove', 'accountUpdate'] as (keyof AccountRepositoryEvent)[]).forEach((event) =>
+ AccountRepository.off(event, this.onAccountsChange),
+ );
+
+ // remove contact listeners
+ (['contactCreate', 'contactRemove', 'contactUpdate'] as (keyof ContactRepositoryEvent)[]).forEach((event) =>
+ ContactRepository.off(event, this.onContactChange),
+ );
+
+ // remove currency listeners
+ (['currencyUpsert'] as (keyof CurrencyRepositoryEvent)[]).forEach((event) =>
+ CurrencyRepository.off(event, this.onCurrencyUpsert),
+ );
+ };
+
+ private onCurrencyUpsert = async (currency: CurrencyModel) => {
+ // 24 hours considered outdated
+ const isCurrencyOutdated = moment(currency.updatedAt).isBefore(moment().subtract(24, 'hours'));
+
+ // if currency is outdated then start syncing
+ if (isCurrencyOutdated) {
+ this.promiseQueue.enqueue(currency.issuer, () =>
+ BackendService.syncTokensDetails(currency.issuer).catch(this.logger.error),
+ );
+ }
+ };
+
+ private onAccountsChange = (
+ account: Partial,
+ changes?: Partial | Partial,
+ ) => {
+ // remove the cache if account is added/removed/updated
+ if (account?.address) {
+ if (!changes || (changes && 'label' in changes)) {
+ this.accountNameCache.delete(this.getAccountNameCacheKey(account.address));
+ }
+ }
+ };
+
+ private onContactChange = (contact: Partial) => {
+ // remove the cache if contact is added/removed/updated
+ if (contact?.address) {
+ this.accountNameCache.delete(this.getAccountNameCacheKey(contact.address, contact.destinationTag));
+ }
+ };
+
+ private getAccountNameCacheKey = (address: string, tag?: number | string) => {
+ return `${address}${tag ?? ''}`;
+ };
+
+ private resolveAccountName = async (address: string, tag?: number, internal = false) => {
+ const sources: {
+ source: () => any;
+ mapper: (result: any) => { name?: string; source?: string; kycApproved?: boolean };
+ }[] = [
+ {
+ source: ContactRepository.findOne.bind(null, { address, destinationTag: `${tag ?? ''}` }),
+ mapper: (contact: ReturnType) => ({
+ name: contact?.name,
+ source: 'contacts',
+ }),
+ },
+ {
+ source: AccountRepository.findOne.bind(null, { address }),
+ mapper: (account: ReturnType) => ({
+ name: account?.label,
+ source: 'accounts',
+ }),
+ },
+ ];
+
+ // if we are not only for local result then fetch from backend also
+ if (!internal) {
+ sources.push({
+ source: BackendService.getAddressInfo.bind(null, address),
+ mapper: (res: XamanBackend.AccountInfoResponse) => ({
+ name: res?.name ?? undefined,
+ source: res?.source?.replace('internal:', '').replace('.com', ''),
+ kycApproved: res?.kycApproved,
+ blocked: res?.blocked,
+ }),
+ });
+ }
+
+ for (const { source, mapper } of sources) {
+ try {
+ const result = await source();
+ if (result) return mapper(result);
+ } catch (error) {
+ this.logger.warn(`Error fetching data from source: ${address}`, error);
+ }
+ }
+
+ // not found
+ return {
+ address,
+ tag,
+ };
+ };
+
+ public clearCache = async () => {
+ // clear resolver cache
+ this.accountNameCache.clear();
+
+ // get all currencies and set their last update to lowest
+ const currencies = CurrencyRepository.findAll();
+ return Promise.all(
+ currencies.map(async (currency) => {
+ await CurrencyRepository.update({
+ id: currency.id,
+ name: '',
+ issuerAvatarUrl: '',
+ avatarUrl: '',
+ issuerName: '',
+ xappIdentifier: '',
+ shortlist: false,
+ updatedAt: new Date(0),
+ });
+ }),
+ );
+ };
+
+ public getAccountName = async (
+ address: string,
+ tag?: number,
+ internal = false,
+ ): Promise => {
+ const key = `${address}${tag ?? ''}`;
+
+ const cachedValue = this.accountNameCache.get(key);
+ if (cachedValue) {
+ return cachedValue;
+ }
+
+ const resultPromise = (async () => {
+ const result = await this.resolveAccountName(address, tag, internal);
+ this.accountNameCache.set(key, { ...result, address, tag });
+ return { ...result, address, tag };
+ })();
+
+ this.accountNameCache.set(key, resultPromise); // save the promise itself for subsequent calls
+
+ return resultPromise;
+ };
+
+ public getAccountAdvisoryInfo = async (address: string): Promise => {
+ // Get account advisory from backend
+ const accountAdvisory = await BackendService.getAccountAdvisory(address);
+ if (!accountAdvisory.danger) {
+ throw new Error('Account advisory risk level not found.');
+ }
+
+ // fetch account info from ledger
+ const accountInfo = await LedgerService.getAccountInfo(address);
+
+ if ('error' in accountInfo) {
+ // account doesn't exist in the ledger, no need to check further
+ if (accountInfo.error === 'actNotFound') {
+ return {
+ exist: false,
+ danger: accountAdvisory.danger,
+ };
+ }
+ throw new Error('Error fetching account info.');
+ }
+
+ const { account_data: accountData, account_flags: accountFlags } = accountInfo;
+
+ return {
+ exist: true,
+ danger: accountAdvisory.danger,
+ possibleExchange: Advisory.checkPossibleExchange(accountData),
+ blackHole: Advisory.checkBlackHoleAccount(accountData, accountFlags),
+ disallowIncomingXRP: Advisory.checkDisallowIncomingXRP(accountFlags),
+ requireDestinationTag: await Advisory.checkRequireDestinationTag(address, accountAdvisory, accountFlags),
+ };
+ };
+
+ public getPayIdInfo = async (payId: string): Promise => {
+ try {
+ const res = await BackendService.lookup(payId);
+ const match = res?.matches?.[0];
+ return match ? { account: match.account, tag: match.tag } : undefined;
+ } catch {
+ return undefined;
+ }
+ };
+}
+
+/* Export ==================================================================== */
+export default new ResolverService();
diff --git a/src/services/index.ts b/src/services/index.ts
index a18a6ce69..71df9c288 100644
--- a/src/services/index.ts
+++ b/src/services/index.ts
@@ -9,6 +9,7 @@ import NetworkService from './NetworkService';
import LedgerService from './LedgerService';
import AccountService from './AccountService';
import BackendService from './BackendService';
+import ResolverService from './ResolverService';
import StyleService from './StyleService';
export {
@@ -23,5 +24,6 @@ export {
LedgerService,
AccountService,
BackendService,
+ ResolverService,
StyleService,
};
diff --git a/src/store/__tests__/fixture/v1.test.data.ts b/src/store/__tests__/fixture/v1.test.data.ts
index 3bbef6e30..0bccc5894 100644
--- a/src/store/__tests__/fixture/v1.test.data.ts
+++ b/src/store/__tests__/fixture/v1.test.data.ts
@@ -20,6 +20,14 @@ export default {
registerAt: new Date(),
updatedAt: new Date(),
},
+
+ [schemas.CurrencySchema.schema.name]: {
+ id: 'ORPHAN.ORP',
+ issuer: 'ORPHAN',
+ currency: 'ORP',
+ name: 'Orphaned currency',
+ avatar: 'https://cdn.image.com',
+ },
[schemas.AccountSchema.schema.name]: {
address: 'rADDRESSxxxxxxxxxxxxxxxxxxxxxxxxxx',
label: 'Personal account',
@@ -67,6 +75,7 @@ export default {
registerAt: new Date(),
updatedAt: new Date(),
},
+
[schemas.ProfileSchema.schema.name]: {
username: 'my username',
slug: 'my slug',
diff --git a/src/store/__tests__/integration/migrations.test.ts b/src/store/__tests__/integration/migrations.test.ts
index 37b8a5195..9b81a9e4e 100644
--- a/src/store/__tests__/integration/migrations.test.ts
+++ b/src/store/__tests__/integration/migrations.test.ts
@@ -268,6 +268,38 @@ describe('Storage', () => {
instance.close();
});
+ it('should run v18 migrations successfully', async () => {
+ const v17Instance = RealmTestUtils.getRealmInstanceWithVersion(17);
+ expect(v17Instance.schemaVersion).toBe(17);
+
+ const orphanCurrency = RealmTestUtils.getSecondModelItem(v17Instance, 'Currency');
+
+ expect(orphanCurrency).toBeDefined();
+ expect(orphanCurrency.id).toBe('ORPHAN.ORP');
+ expect(orphanCurrency.linkingObjectsCount()).toBe(0);
+
+ v17Instance.close();
+
+ const instance = RealmTestUtils.getRealmInstanceWithVersion(18);
+ expect(instance.schemaVersion).toBe(18);
+
+ // let's check if orphan objects has been removed
+ const newCurrencies = RealmTestUtils.getAllModelItem(instance, 'Currency');
+
+ for (const currency of newCurrencies) {
+ expect(currency.id).not.toBe('ORPHAN.ORP');
+ }
+
+ const currency = RealmTestUtils.getFirstModelItem(instance, 'Currency');
+ // // renamed fields
+ expect(currency.xappIdentifier).toBeDefined();
+ expect(currency.avatarUrl).toBeDefined();
+ // force the token to update
+ expect(currency.updatedAt).toStrictEqual(new Date(0));
+
+ instance.close();
+ });
+
afterAll(() => {
RealmTestUtils.cleanup();
});
diff --git a/src/store/__tests__/utils/index.ts b/src/store/__tests__/utils/index.ts
index da30448db..50d4dc7dd 100644
--- a/src/store/__tests__/utils/index.ts
+++ b/src/store/__tests__/utils/index.ts
@@ -5,10 +5,18 @@ const RealmTestUtils = {
RealmPath: './.jest/realmTemp',
EncryptionKey: new Int8Array(64),
+ getAllModelItem: (instance: Realm, schemaName: string): any => {
+ return instance.objects(schemaName) as any;
+ },
+
getFirstModelItem: (instance: Realm, schemaName: string): any => {
return instance.objects(schemaName)[0] as any;
},
+ getSecondModelItem: (instance: Realm, schemaName: string): any => {
+ return instance.objects(schemaName)[1] as any;
+ },
+
getSchemaWithVersion: (version: number) => {
return find(require('../../models/schemas').default, { schemaVersion: version });
},
diff --git a/src/store/models/objects/account.ts b/src/store/models/objects/account.ts
index d13af2613..c594a9e39 100644
--- a/src/store/models/objects/account.ts
+++ b/src/store/models/objects/account.ts
@@ -112,12 +112,13 @@ class Account extends Realm.Object {
const state = JSON.stringify(details.toJSON(), (key, val) => {
if (val !== null && typeof val === 'object') {
- if (['owners', 'currency'].includes(key)) {
+ if (['owners', 'currency', 'network'].includes(key)) {
return undefined; // exclude these fields
}
}
return val;
});
+
return StringIdentifier(state);
}
diff --git a/src/store/models/objects/counterParty.ts b/src/store/models/objects/counterParty.ts
deleted file mode 100644
index 9e353d651..000000000
--- a/src/store/models/objects/counterParty.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Counter Parties Model
- *
- * @class
- * @extends Realm.Object
- */
-
-import Realm from 'realm';
-
-import { CounterPartySchema } from '@store/models/schemas/latest';
-
-/* Model ==================================================================== */
-class CounterParty extends Realm.Object {
- public static schema: Realm.ObjectSchema = CounterPartySchema.schema;
-
- /** Unique identifier for the counterparty. */
- public declare id: number;
- /** Name of the counterparty. */
- public declare name: string;
- /** Domain associated with the counterparty. */
- public declare domain: string;
- /** Avatar image URL or path for the counterparty. */
- public declare avatar: string;
- /** Indicates if the counterparty is on the shortlist. */
- public declare shortlist: boolean;
- /** List of currencies associated with the counterparty. */
- public declare currencies?: any[];
- /** Date when the counterparty was registered. */
- public declare registerAt?: Date;
- /** Date when the counterparty details were last updated. */
- public declare updatedAt?: Date;
-}
-
-export default CounterParty;
diff --git a/src/store/models/objects/currency.ts b/src/store/models/objects/currency.ts
index 8dc37402d..aa7c591c1 100644
--- a/src/store/models/objects/currency.ts
+++ b/src/store/models/objects/currency.ts
@@ -15,7 +15,6 @@ class Currency extends Realm.Object {
/**
* A unique identifier representing this specific currency instance.
- * combination of the currency's code and its issuer.
*/
public declare id: string;
/**
@@ -29,11 +28,19 @@ class Currency extends Realm.Object {
/**
* A descriptive, user-friendly name for the currency (ex: Euro) ,
*/
- public declare name: string;
+ public declare name?: string;
/**
- * URL or local path pointing to an image that visually represents
+ * URL pointing to an image that visually represents the currency issuer
*/
- public declare avatar: string;
+ public declare issuerAvatarUrl?: string;
+ /**
+ * Human Name for currency issuer
+ */
+ public declare issuerName?: string;
+ /**
+ * URL pointing to an image that visually represents the currency
+ */
+ public declare avatarUrl?: string;
/**
* A flag indicating whether this currency is highlighted or preferred in the shortlist
*/
@@ -41,7 +48,15 @@ class Currency extends Realm.Object {
/**
* An optional xApp identifier linking the currency to a corresponding xApp
*/
- public declare xapp_identifier?: string;
+ public declare xappIdentifier?: string;
+ /**
+ * The registration date of the currency
+ */
+ public declare registerAt: Date;
+ /**
+ * The last update date of the currency
+ */
+ public declare updatedAt: Date;
}
export default Currency;
diff --git a/src/store/models/objects/index.ts b/src/store/models/objects/index.ts
index 3db2b180b..2b5b48ccd 100644
--- a/src/store/models/objects/index.ts
+++ b/src/store/models/objects/index.ts
@@ -1,5 +1,4 @@
import ContactModel from './contact';
-import CounterPartyModel from './counterParty';
import CurrencyModel from './currency';
import TrustLineModel from './trustLine';
import ProfileModel from './profile';
@@ -13,7 +12,6 @@ import UserInteractionModel from './userInteraction';
export {
ContactModel,
- CounterPartyModel,
CurrencyModel,
TrustLineModel,
ProfileModel,
diff --git a/src/store/models/objects/trustLine.ts b/src/store/models/objects/trustLine.ts
index f569674dc..96c97806a 100644
--- a/src/store/models/objects/trustLine.ts
+++ b/src/store/models/objects/trustLine.ts
@@ -7,14 +7,16 @@
import Realm from 'realm';
-import { Truncate } from '@common/utils/string';
import { NormalizeCurrencyCode } from '@common/utils/monetary';
-import CounterPartyModel from '@store/models/objects/counterParty';
import CurrencyModel from '@store/models/objects/currency';
import { TrustLineSchema } from '@store/models/schemas/latest';
+import { Truncate } from '@common/utils/string';
+
+import Localize from '@locale';
+
/* Model ==================================================================== */
class TrustLine extends Realm.Object {
public static schema: Realm.ObjectSchema = TrustLineSchema.schema;
@@ -52,30 +54,6 @@ class TrustLine extends Realm.Object {
/** Indicates if this trust line is marked as a favorite by the user. */
public declare favorite?: boolean;
- /**
- * Represents the counterparties details associated with this trust line.
- *
- * If the trust line is linked to an existing CounterParty model, it will
- * return the name, avatar, and domain of that counterparty. Otherwise, it
- * will truncate the currency issuer's name and default the avatar and domain.
- *
- * @returns {object} An object containing name, avatar, and domain of the counterparty.
- */
- get counterParty(): { name: string; avatar: string; domain: string } {
- const counterParties = this.currency.linkingObjects('CounterParty', 'currencies');
-
- if (!counterParties.isEmpty()) {
- const { name, avatar, domain } = counterParties[0];
- return { name, avatar, domain };
- }
-
- return {
- name: Truncate(this.currency.issuer, 11),
- avatar: '',
- domain: '',
- };
- }
-
/**
* Returns true if token is LP Token.
*
@@ -83,41 +61,46 @@ class TrustLine extends Realm.Object {
*/
isLiquidityPoolToken(): boolean {
// TODO: improve this check for LP token
- return !!this.currency.currencyCode.startsWith('03');
- }
-
- /**
- * Retrieves the array of AMM pairs.
- *
- * @returns {Array} - The array of AMM pairs.
- */
- getAssetPairs(): any | undefined {
- const assetPair = this.linkingObjects('AmmPair', 'line');
-
- if (!assetPair.isEmpty()) {
- return assetPair[0];
- }
-
- return undefined;
+ return this.currency.currencyCode.startsWith('03');
}
- getReadableCurrency(): string {
+ getFormattedCurrency(): string {
// if there is a name for currency return the name
+
if (this.currency.name) {
return `${this.currency.name}`;
}
// LP token
if (this.isLiquidityPoolToken()) {
- return this.getAssetPairs()
- ?.pairs.map((pair: string | CurrencyModel) =>
- typeof pair === 'string' ? pair : NormalizeCurrencyCode(pair.currencyCode),
- )
- .join('/');
+ const assetPair = this.linkingObjects<{ pairs: Array }>('AmmPair', 'line');
+
+ // return pairs currency code
+ if (!assetPair.isEmpty()) {
+ return assetPair[0]?.pairs
+ .map((pair) => (typeof pair === 'string' ? pair : NormalizeCurrencyCode(pair.currencyCode)))
+ .join('/');
+ }
}
+ // normalized currency code
return NormalizeCurrencyCode(this.currency.currencyCode);
}
+
+ getFormattedIssuer(owner?: string): string {
+ // self issued
+ if (owner && this.currency.issuer === owner) {
+ return Localize.t('home.selfIssued');
+ }
+
+ // issuer name + currency code
+ if (this.currency.issuerName) {
+ return `${this.currency.issuerName} ${NormalizeCurrencyCode(this.currency.currencyCode)}`;
+ }
+
+ // issuer address
+ return Truncate(this.currency.issuer, 11);
+ }
}
export default TrustLine;
diff --git a/src/store/models/schemas/index.ts b/src/store/models/schemas/index.ts
index 2d8b65971..6a758b56e 100644
--- a/src/store/models/schemas/index.ts
+++ b/src/store/models/schemas/index.ts
@@ -15,7 +15,8 @@ import * as v14 from './v14';
import * as v15 from './v15';
import * as v16 from './v16';
import * as v17 from './v17';
+import * as v18 from './v18';
-const schemas = [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17];
+const schemas = [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18];
export default schemas;
diff --git a/src/store/models/schemas/latest.ts b/src/store/models/schemas/latest.ts
index 3c236a9c2..e77134db1 100644
--- a/src/store/models/schemas/latest.ts
+++ b/src/store/models/schemas/latest.ts
@@ -1,4 +1,4 @@
-import { schemas } from './v17';
+import { schemas } from './v18';
export const {
CoreSchema,
@@ -6,7 +6,6 @@ export const {
AccountDetailsSchema,
NodeSchema,
NetworkSchema,
- CounterPartySchema,
ProfileSchema,
TrustLineSchema,
CurrencySchema,
diff --git a/src/store/models/schemas/v18/currency.ts b/src/store/models/schemas/v18/currency.ts
new file mode 100644
index 000000000..ba7afd995
--- /dev/null
+++ b/src/store/models/schemas/v18/currency.ts
@@ -0,0 +1,56 @@
+/**
+ * Currency Schema 18
+ */
+
+import Realm from 'realm';
+
+import { ExtendedSchemaType } from '@store/types';
+
+/* Schema ==================================================================== */
+const CurrencySchema = {
+ schema: {
+ name: 'Currency',
+ primaryKey: 'id',
+ properties: {
+ id: { type: 'string' },
+ issuer: { type: 'string' },
+ name: { type: 'string', optional: true },
+ currencyCode: { type: 'string' },
+ issuerName: { type: 'string', optional: true },
+ issuerAvatarUrl: { type: 'string', optional: true },
+ avatarUrl: { type: 'string', optional: true },
+ shortlist: { type: 'bool', default: true },
+ xappIdentifier: { type: 'string', optional: true },
+ registerAt: { type: 'date', default: new Date() },
+ updatedAt: { type: 'date', default: new Date(0) },
+ },
+ },
+
+ migration: (oldRealm: Realm, newRealm: Realm) => {
+ /* eslint-disable-next-line */
+ console.log('migrating Currency schema to v18');
+
+ const oldObjects = oldRealm.objects(CurrencySchema.schema.name) as any;
+ const newObjects = newRealm.objects(CurrencySchema.schema.name) as any;
+
+ const orphanObjects = [] as any;
+
+ // clear up orphan currencies
+ for (let i = 0; i < newObjects.length; i++) {
+ if (newObjects[i].linkingObjectsCount() > 0) {
+ newObjects[i].xappIdentifier = oldObjects.find((c: any) => c.id === newObjects[i].id).xapp_identifier;
+ newObjects[i].avatarUrl = oldObjects.find((c: any) => c.id === newObjects[i].id).avatar;
+ // NOTE: this will force update the token details
+ newObjects[i].updatedAt = new Date(0);
+ } else {
+ orphanObjects.push(newObjects[i]);
+ }
+ }
+
+ if (orphanObjects.length > 0) {
+ newRealm.delete(orphanObjects);
+ }
+ },
+};
+
+export default CurrencySchema;
diff --git a/src/store/models/schemas/v18/index.ts b/src/store/models/schemas/v18/index.ts
new file mode 100644
index 000000000..8f1289f23
--- /dev/null
+++ b/src/store/models/schemas/v18/index.ts
@@ -0,0 +1,45 @@
+import { schemas as v17Schemas } from '@store/models/schemas/v17';
+
+// ~ MODIFIED
+import CurrencySchema from '@store/models/schemas/v18/currency';
+
+// = NOT CHANGED
+const {
+ ContactSchema,
+ ProfileSchema,
+ NodeSchema,
+ CoreSchema,
+ AccountSchema,
+ TrustLineSchema,
+ AccountDetailsSchema,
+ NetworkSchema,
+ AmmPairSchema,
+ UserInteractionSchema,
+} = v17Schemas;
+
+/* Exports ==================================================================== */
+export const schemaVersion = 18;
+
+export const migration = (oldRealm: Realm, newRealm: Realm) => {
+ [CurrencySchema].forEach((entry) => {
+ if (typeof entry.migration !== 'function') {
+ throw new Error(`migration method is required for schema ${entry.schema.name}`);
+ }
+
+ entry.migration(oldRealm, newRealm);
+ });
+};
+
+export const schemas = {
+ ContactSchema,
+ CurrencySchema,
+ ProfileSchema,
+ NetworkSchema,
+ NodeSchema,
+ CoreSchema,
+ AccountSchema,
+ AccountDetailsSchema,
+ TrustLineSchema,
+ AmmPairSchema,
+ UserInteractionSchema,
+};
diff --git a/src/store/repositories/account.ts b/src/store/repositories/account.ts
index 30c168e7a..d037c1419 100644
--- a/src/store/repositories/account.ts
+++ b/src/store/repositories/account.ts
@@ -14,7 +14,7 @@ import BaseRepository from './base';
export type AccountRepositoryEvent = {
accountUpdate: (account: AccountModel, changes: Partial | Partial) => void;
accountCreate: (account: AccountModel) => void;
- accountRemove: () => void;
+ accountRemove: (account: Partial) => void;
};
declare interface AccountRepository {
@@ -281,11 +281,14 @@ class AccountRepository extends BaseRepository {
await this.delete(line);
}
+ // cache the address before removing the account object
+ const deletedAccount: Partial = { address: account.address, publicKey: account.publicKey };
+
// delete the account
await this.delete(account);
// emit account removal event
- this.emit('accountRemove');
+ this.emit('accountRemove', deletedAccount);
return true;
};
diff --git a/src/store/repositories/contact.ts b/src/store/repositories/contact.ts
index c5a9f053c..21db979ac 100644
--- a/src/store/repositories/contact.ts
+++ b/src/store/repositories/contact.ts
@@ -4,6 +4,19 @@ import has from 'lodash/has';
import { ContactModel } from '@store/models';
import BaseRepository from './base';
+/* Events ==================================================================== */
+export type ContactRepositoryEvent = {
+ contactUpdate: (contact: ContactModel, changes: Partial) => void;
+ contactCreate: (contact: ContactModel) => void;
+ contactRemove: (account: Partial) => void;
+};
+
+declare interface ContactRepository {
+ on(event: U, listener: ContactRepositoryEvent[U]): this;
+ off(event: U, listener: ContactRepositoryEvent[U]): this;
+ emit(event: U, ...args: Parameters): boolean;
+}
+
/* Repository ==================================================================== */
class ContactRepository extends BaseRepository {
initialize(realm: Realm) {
@@ -11,12 +24,42 @@ class ContactRepository extends BaseRepository {
this.model = ContactModel;
}
- update = (object: Partial) => {
+ add = (contact: Partial) => {
// the primary key should be in the object
- if (this.model?.schema?.primaryKey && !has(object, this.model?.schema?.primaryKey)) {
+ if (this.model?.schema?.primaryKey && !has(contact, this.model?.schema?.primaryKey)) {
+ throw new Error('Add contact require primary key to be set');
+ }
+
+ return this.create(contact).then((createdContact: ContactModel) => {
+ this.emit('contactCreate', createdContact);
+ return createdContact;
+ });
+ };
+
+ update = async (changes: Partial) => {
+ // the primary key should be in the object
+ if (this.model?.schema?.primaryKey && !has(changes, this.model?.schema?.primaryKey)) {
throw new Error('Update require primary key to be set');
}
- return this.create(object, true);
+ const updatedObject = await this.create(changes, true);
+ this.emit('contactUpdate', updatedObject, changes);
+ };
+
+ remove = async (object: ContactModel) => {
+ // the primary key should be in the object
+ if (this.model?.schema?.primaryKey && !has(object, this.model?.schema?.primaryKey)) {
+ throw new Error('Remove require primary key to be set');
+ }
+
+ const deletedContact = {
+ id: object.id,
+ address: object.address,
+ tag: object.destinationTag,
+ };
+
+ await this.deleteById(object.id);
+
+ this.emit('contactRemove', deletedContact);
};
getContacts = () => {
diff --git a/src/store/repositories/counterParty.ts b/src/store/repositories/counterParty.ts
deleted file mode 100644
index a9221096e..000000000
--- a/src/store/repositories/counterParty.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import has from 'lodash/has';
-import Realm from 'realm';
-
-import { CounterPartyModel } from '@store/models';
-
-import BaseRepository from './base';
-
-/* Repository ==================================================================== */
-class CounterPartyRepository extends BaseRepository {
- initialize(realm: Realm) {
- this.realm = realm;
- this.model = CounterPartyModel;
- }
-
- update = (object: CounterPartyModel) => {
- // the primary key should be in the object
- if (this.model.schema?.primaryKey && !has(object, this.model.schema.primaryKey)) {
- throw new Error(`Update require primary key ${this.model.schema?.primaryKey} to be set`);
- }
- return this.create(object, true);
- };
-}
-
-export default new CounterPartyRepository();
diff --git a/src/store/repositories/currency.ts b/src/store/repositories/currency.ts
index ffb9dcafb..0561f5ebd 100644
--- a/src/store/repositories/currency.ts
+++ b/src/store/repositories/currency.ts
@@ -1,12 +1,24 @@
import { has } from 'lodash';
import Realm from 'realm';
-import { CurrencyModel, CounterPartyModel } from '@store/models';
+import { CurrencyModel } from '@store/models';
import { IssuedCurrency } from '@common/libs/ledger/types/common';
import BaseRepository from './base';
+/* Types ==================================================================== */
+export type CurrencyRepositoryEvent = {
+ currencyDetailsUpdate: (currency: CurrencyModel, changes: Partial) => void;
+ currencyUpsert: (currency: CurrencyModel) => void;
+};
+
+declare interface CurrencyRepository {
+ on(event: U, listener: CurrencyRepositoryEvent[U]): this;
+ off(event: U, listener: CurrencyRepositoryEvent[U]): this;
+ emit(event: U, ...args: Parameters): boolean;
+}
+
/* Repository ==================================================================== */
class CurrencyRepository extends BaseRepository {
initialize(realm: Realm) {
@@ -14,12 +26,55 @@ class CurrencyRepository extends BaseRepository {
this.model = CurrencyModel;
}
- update = (object: CurrencyModel) => {
+ // @override
+ // Please keep on top
+ upsert = async (object: Partial) => {
+ // The primary key should be in the object for upsert operation
+ if (this.model?.schema?.primaryKey && !has(object, this.model.schema.primaryKey)) {
+ throw new Error(`Upsert requires primary key (${this.model.schema.primaryKey}) to be set`);
+ }
+
+ // Check if the object already exists
+ const primaryKey = this.model?.schema?.primaryKey;
+ if (primaryKey) {
+ const existing = this.findOne({ [primaryKey]: object[primaryKey as keyof Partial] });
+
+ if (existing) {
+ return this.create(object, true).then((updatedCurrency: CurrencyModel) => {
+ this.emit('currencyUpsert', updatedCurrency);
+ return updatedCurrency;
+ });
+ }
+ }
+
+ // now try to create it
+ return this.create(object).then((createdCurrency: CurrencyModel) => {
+ this.emit('currencyUpsert', createdCurrency);
+ return createdCurrency;
+ });
+ };
+
+ update = async (object: Partial) => {
// the primary key should be in the object
if (this.model?.schema?.primaryKey && !has(object, this.model.schema.primaryKey)) {
throw new Error(`Update require primary key (${this.model.schema.primaryKey}) to be set`);
}
- return this.create(object, true);
+
+ return this.create(object, true).then((updatedCurrency: CurrencyModel) => {
+ return updatedCurrency;
+ });
+ };
+
+ updateCurrencyDetails = async (object: Partial) => {
+ // the primary key should be in the object
+ if (this.model?.schema?.primaryKey && !has(object, this.model.schema.primaryKey)) {
+ throw new Error(`Update require primary key (${this.model.schema.primaryKey}) to be set`);
+ }
+
+ return this.create(object, true).then((updatedCurrency: CurrencyModel) => {
+ this.emit('currencyDetailsUpdate', updatedCurrency, object);
+ return updatedCurrency;
+ });
};
isVettedCurrency = (issuedCurrency: IssuedCurrency): boolean => {
@@ -29,15 +84,6 @@ class CurrencyRepository extends BaseRepository {
}
return !!currency.name;
};
-
- getCounterParty = (currency: CurrencyModel): CounterPartyModel | undefined => {
- const counterParty = currency.linkingObjects('CounterParty', 'currencies');
-
- if (!counterParty.isEmpty()) {
- return counterParty[0] as CounterPartyModel;
- }
- return undefined;
- };
}
export default new CurrencyRepository();
diff --git a/src/store/repositories/index.ts b/src/store/repositories/index.ts
index 43ac8cf61..7251990f3 100644
--- a/src/store/repositories/index.ts
+++ b/src/store/repositories/index.ts
@@ -2,7 +2,6 @@ import AccountRepository from './account';
import CoreRepository from './core';
import ProfileRepository from './profile';
import TrustLineRepository from './trustLine';
-import CounterPartyRepository from './counterParty';
import CurrencyRepository from './currency';
import ContactRepository from './contact';
import NetworkRepository from './network';
@@ -15,7 +14,6 @@ export {
CoreRepository,
ProfileRepository,
TrustLineRepository,
- CounterPartyRepository,
CurrencyRepository,
ContactRepository,
NetworkRepository,
diff --git a/src/theme/colors.ts b/src/theme/colors.ts
index 619c66efd..f34e0c2ff 100644
--- a/src/theme/colors.ts
+++ b/src/theme/colors.ts
@@ -40,7 +40,10 @@ const ColorsGeneral = {
transparentBlack: HexToRgbA(colors.black, 0.7),
transparentBlue: HexToRgbA(colors.blue, 0.7),
transparentWhite: HexToRgbA(colors.white, 0.4),
+
darkGrey: ColorLuminance(colors.grey, -0.75),
+ darkRed: ColorLuminance(colors.red, -0.3),
+ darkGreen: ColorLuminance(colors.green, -0.3),
};
const ColorsTheme = {
diff --git a/src/theme/sizes.ts b/src/theme/sizes.ts
index e683f2746..fe818d01c 100644
--- a/src/theme/sizes.ts
+++ b/src/theme/sizes.ts
@@ -15,6 +15,8 @@ const { bottom: bottomInset, top: topInset } = GetLayoutInsets();
const guidelineBaseWidth = 350;
const guidelineBaseHeight = 680;
+const isSmallDevice = width <= 375;
+
// bottomTabs height
const tabbarHeight = Platform.select({
ios: bottomInset + 50,
@@ -59,6 +61,7 @@ const Sizes = {
widthTwoThirds: width * 0.666,
widthQuarter: width * 0.25,
widthThreeQuarters: width * 0.75,
+ isSmallDevice,
},
statusBarHeight,
tabbarHeight,
diff --git a/src/theme/styles.ts b/src/theme/styles.ts
index be43cce7c..2ab3ea083 100644
--- a/src/theme/styles.ts
+++ b/src/theme/styles.ts
@@ -445,6 +445,10 @@ export default StyleService.create({
flex: 9,
},
+ flexShrink1: {
+ flexShrink: 1,
+ },
+
// Others
overlayHeader: {
flex: 1,