diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..d7c1b7241 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,9 @@ +Issue Number (if Applicable): Fixes # + +# Description + +Please include a summary of the changes and which issue is fixed / feature is added. + +# Pull Request - Checklist + +- [ ] Initial Manual Tests Passed diff --git a/.github/workflows/cache_dependencies.yml b/.github/workflows/cache_dependencies.yml new file mode 100644 index 000000000..4d2dc136c --- /dev/null +++ b/.github/workflows/cache_dependencies.yml @@ -0,0 +1,56 @@ +name: Cache Dependencies + +on: + push: + branches: [ main ] + +jobs: + test: + + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: '8.x' + + - name: Flutter action + uses: subosito/flutter-action@v1 + with: + flutter-version: '3.3.x' + channel: stable + + - name: Install package dependencies + run: sudo apt-get install -y curl unzip automake build-essential file pkg-config git python libtool libtinfo5 cmake clang + + - name: Execute Build and Setup Commands + run: | + sudo mkdir -p /opt/android + sudo chown $USER /opt/android + cd /opt/android + git clone https://github.com/cake-tech/cake_wallet.git --branch main + cd cake_wallet/scripts/android/ + ./install_ndk.sh + source ./app_env.sh cakewallet + ./app_config.sh + + - name: Cache Externals + id: cache-externals + uses: actions/cache@v3 + with: + path: | + /opt/android/cake_wallet/cw_haven/android/.cxx + /opt/android/cake_wallet/cw_haven/ios/External + /opt/android/cake_wallet/cw_monero/android/.cxx + /opt/android/cake_wallet/cw_monero/ios/External + /opt/android/cake_wallet/cw_shared_external/ios/External + key: ${{ hashFiles('**/build_monero.sh', '**/build_haven.sh') }} + + - if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }} + name: Generate Externals + run: | + cd /opt/android/cake_wallet/scripts/android/ + source ./app_env.sh cakewallet + ./build_all.sh + ./copy_monero_deps.sh diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml index 190b891e1..f8496ffcd 100644 --- a/.github/workflows/pr_test_build.yml +++ b/.github/workflows/pr_test_build.yml @@ -7,7 +7,10 @@ on: jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 + env: + STORE_PASS: test@cake_wallet + KEY_PASS: test@cake_wallet steps: - uses: actions/checkout@v2 @@ -18,7 +21,7 @@ jobs: - name: Flutter action uses: subosito/flutter-action@v1 with: - flutter-version: '3.3.x' + flutter-version: '3.7.x' channel: stable - name: Install package dependencies @@ -34,6 +37,24 @@ jobs: ./install_ndk.sh source ./app_env.sh cakewallet ./app_config.sh + + - name: Cache Externals + id: cache-externals + uses: actions/cache@v3 + with: + path: | + /opt/android/cake_wallet/cw_haven/android/.cxx + /opt/android/cake_wallet/cw_haven/ios/External + /opt/android/cake_wallet/cw_monero/android/.cxx + /opt/android/cake_wallet/cw_monero/ios/External + /opt/android/cake_wallet/cw_shared_external/ios/External + key: ${{ hashFiles('**/build_monero.sh', '**/build_haven.sh') }} + + - if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }} + name: Generate Externals + run: | + cd /opt/android/cake_wallet/scripts/android/ + source ./app_env.sh cakewallet ./build_all.sh ./copy_monero_deps.sh @@ -45,12 +66,12 @@ jobs: - name: Generate KeyStore run: | cd /opt/android/cake_wallet/android/app - keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias testKey -noprompt -dname "CN=CakeWallet, OU=CakeWallet, O=CakeWallet, L=Florida, S=America, C=USA" -storepass ${{ secrets.STORE_PASS }} -keypass ${{ secrets.KEY_PASS }} + keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias testKey -noprompt -dname "CN=CakeWallet, OU=CakeWallet, O=CakeWallet, L=Florida, S=America, C=USA" -storepass $STORE_PASS -keypass $KEY_PASS - name: Generate key properties run: | cd /opt/android/cake_wallet - flutter packages pub run tool/generate_android_key_properties.dart keyAlias=testKey storeFile=key.jks storePassword=${{ secrets.STORE_PASS }} keyPassword=${{ secrets.KEY_PASS }} + flutter packages pub run tool/generate_android_key_properties.dart keyAlias=testKey storeFile=key.jks storePassword=$STORE_PASS keyPassword=$KEY_PASS - name: Generate localization run: | @@ -89,6 +110,7 @@ jobs: echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart + echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart - name: Rename app run: sed -i -e "s/\${APP_NAME}/$GITHUB_HEAD_REF/g" /opt/android/cake_wallet/android/app/src/main/AndroidManifest.xml @@ -111,19 +133,20 @@ jobs: # --token ${{ secrets.APP_CENTER_TOKEN }} \ # --quiet - - name: Send Test APK - run: | - cd /opt/android/cake_wallet - var=$(curl --upload-file build/app/outputs/apk/release/app-release.apk https://transfer.sh/$GITHUB_HEAD_REF.apk -H "Max-Days: 10") - curl ${{ secrets.SLACK_WEB_HOOK }} -H "Content-Type: application/json" -d '{"apk_link": "'"$var"'","ticket": "'"$GITHUB_HEAD_REF"'"}' - - name: Rename apk file run: | cd /opt/android/cake_wallet/build/app/outputs/apk/release mkdir test-apk - mv app-release.apk test-apk/$GITHUB_HEAD_REF.apk + cp app-release.apk test-apk/$GITHUB_HEAD_REF.apk - name: Upload Artifact uses: kittaakos/upload-artifact-as-is@v0 with: path: /opt/android/cake_wallet/build/app/outputs/apk/release/test-apk/ + + - name: Send Test APK + continue-on-error: true + run: | + cd /opt/android/cake_wallet + var=$(curl --upload-file build/app/outputs/apk/release/app-release.apk https://transfer.sh/$GITHUB_HEAD_REF.apk -H "Max-Days: 10") + curl ${{ secrets.SLACK_WEB_HOOK }} -H "Content-Type: application/json" -d '{"apk_link": "'"$var"'","ticket": "'"$GITHUB_HEAD_REF"'"}' diff --git a/LICENSE.md b/LICENSE.md index 4f80e683b..4268b9710 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 Cake Labs LLC +Copyright (c) 2018-2023 Cake Labs LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index bd74ccfbc..96f59e704 100644 --- a/README.md +++ b/README.md @@ -76,3 +76,59 @@ We have 24/7 free support. Please contact support@cakewallet.com More instructions to follow For instructions on how to build for Android: please view file `howto-build-android.md` + +# Contributing + +## Improving translations + +Edit the applicable `strings_XX.arb` file in `res/values/` and open a pull request with the changes. + +## Current list of language files: + +- English +- Spanish +- French +- German +- Italian +- Portugese +- Dutch +- Polish +- Croatian +- Russian +- Ukranian +- Hindi +- Japanese +- Chinese +- Korean +- Thai +- Arabic +- Turkish +- Burmese + +## Add a new language + +1. Create a new `strings_XX.arb` file in `res/values/`, replacing XX with the language's [ISO 639-1 code](https://en.wikipedia.org/wiki/ISO_639-1). + +2. Edit the strings in this file, replacing XXX below with the translation for each string. + +`"welcome" : "Welcome to",` -> `"welcome" : "XXX",` + +3. For strings where there is a variable, denoted by a $ symbol and braces, such as ${status}, the string in braces should not be translated. For example, when editing line 106: + +"time" : "${minutes}m ${seconds}s" + +The only parts to be translated, if needed, are the values m and s after the variables. + +4. Add the language to `lib/entities/language_service.dart` under both `supportedLocales` and `localeCountryCode`. Use the name of the language in the local language and in English in parentheses after for `supportedLocales`. Use the [ISO 3166-1 alpha-3 code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) for `localeCountryCode`. You must choose one country, so choose the country with the most native speakers of this language or is otherwise best associated with this language. + +5. Add a relevant flag to `assets/images/flags/XXXX.png`, replacing XXXX with the 3 digit localeCountryCode. The image must be 42x26 pixels with a 3 pixels of transparent margin on all 4 sides. You can resize the flag with [paint.net](https://www.getpaint.net/) to 36x20 pixels, expand the canvas to 42x26 pixels with the flag anchored in the middle, and then manually delete the 3 pixels on each side to make transparent. Or you can use another program like Photoshop. + +## Add a new fiat currency + +1. Check with [Cake Wallet support](https://guides.cakewallet.com) to see if the desired new fiat currency is available through our fiat API. Not all fiat currencies are. + +2. If the currency is associated strongly with a specific issuing country, map the [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code with the applicable [ISO 3166-1 alpha-3 code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) in `lib/entities/fiat_currency.dart`. If the currency is used in a whole region or organization, then map with a reasonable interpretation of this (eg: eur countryCode for EUR symbol). + +3. Add the raw mapping underneath in `lib/entities/fiat_currency.dart` following the same format as the others. + +4. Add a flag of the issuing country or organization to `assets/images/flags/XXXX.png`, replacing XXXX with the ISO 3166-1 alpha-3 code used above (eg: `usa.png`, `eur.png`). Do not add this if the flag with the same name already exists. The image must be 42x26 pixels with a 3 pixels of transparent margin on all 4 sides. diff --git a/analysis_options.yaml b/analysis_options.yaml index 524f70011..396904041 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -18,6 +18,8 @@ analyzer: linter: rules: - cancel_subscriptions + - always_declare_return_types + - prefer_final_fields # analyzer: diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml index 9f6b65785..2dbedcba9 100644 --- a/android/app/src/main/AndroidManifestBase.xml +++ b/android/app/src/main/AndroidManifestBase.xml @@ -6,6 +6,7 @@ + + + + diff --git a/assets/images/flags/mmr.png b/assets/images/flags/mmr.png new file mode 100644 index 000000000..7fc6e1661 Binary files /dev/null and b/assets/images/flags/mmr.png differ diff --git a/assets/images/flags/sau.png b/assets/images/flags/sau.png new file mode 100644 index 000000000..97951983a Binary files /dev/null and b/assets/images/flags/sau.png differ diff --git a/assets/images/flags/tur.png b/assets/images/flags/tur.png new file mode 100644 index 000000000..166c6313a Binary files /dev/null and b/assets/images/flags/tur.png differ diff --git a/assets/images/husd_icon.png b/assets/images/husd_icon.png deleted file mode 100644 index 071027099..000000000 Binary files a/assets/images/husd_icon.png and /dev/null differ diff --git a/cw_bitcoin/lib/bitcoin_amount_format.dart b/cw_bitcoin/lib/bitcoin_amount_format.dart index c72d21960..d5a42d984 100644 --- a/cw_bitcoin/lib/bitcoin_amount_format.dart +++ b/cw_bitcoin/lib/bitcoin_amount_format.dart @@ -17,7 +17,7 @@ int stringDoubleToBitcoinAmount(String amount) { int result = 0; try { - result = (double.parse(amount) * bitcoinAmountDivider).toInt(); + result = (double.parse(amount) * bitcoinAmountDivider).round(); } catch (e) { result = 0; } diff --git a/cw_bitcoin/lib/electrum_transaction_history.dart b/cw_bitcoin/lib/electrum_transaction_history.dart index f8662eb95..9174fb3f8 100644 --- a/cw_bitcoin/lib/electrum_transaction_history.dart +++ b/cw_bitcoin/lib/electrum_transaction_history.dart @@ -72,7 +72,7 @@ abstract class ElectrumTransactionHistoryBase txs.entries.forEach((entry) { final val = entry.value; - if (val is Map) { + if (val is Map) { final tx = ElectrumTransactionInfo.fromJson(val, walletInfo.type); _updateOrInsert(tx); } @@ -85,9 +85,6 @@ abstract class ElectrumTransactionHistoryBase } void _updateOrInsert(ElectrumTransactionInfo transaction) { - if (transaction.id == null) { - return; - } if (transactions[transaction.id] == null) { transactions[transaction.id] = transaction; @@ -98,6 +95,7 @@ abstract class ElectrumTransactionHistoryBase originalTx?.height = transaction.height; originalTx?.date ??= transaction.date; originalTx?.isPending = transaction.isPending; + originalTx?.direction = transaction.direction; } } } diff --git a/cw_bitcoin/lib/electrum_transaction_info.dart b/cw_bitcoin/lib/electrum_transaction_info.dart index 6e85a2f88..8d6ef0fea 100644 --- a/cw_bitcoin/lib/electrum_transaction_info.dart +++ b/cw_bitcoin/lib/electrum_transaction_info.dart @@ -228,9 +228,7 @@ class ElectrumTransactionInfo extends TransactionInfo { m['id'] = id; m['height'] = height; m['amount'] = amount; - // FIX-ME: Hardcoded value - // m['direction'] = direction.index; - m['direction'] = 0; + m['direction'] = direction.index; m['date'] = date.millisecondsSinceEpoch; m['isPending'] = isPending; m['confirmations'] = confirmations; diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index fad546d90..f31db7bb8 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -191,8 +191,10 @@ abstract class ElectrumWalletBase extends WalletBase with Serializable { const CryptoCurrency({ String title = '', int raw = -1, - this.name, + required this.name, + this.fullName, this.iconPath, - this.tag,}) + this.tag}) : super(title: title, raw: raw); + final String name; final String? tag; - final String? name; + final String? fullName; final String? iconPath; static const all = [ @@ -38,7 +36,7 @@ class CryptoCurrency extends EnumerableItem with Serializable { CryptoCurrency.ape, CryptoCurrency.avaxc, CryptoCurrency.btt, - CryptoCurrency.bttbsc, + CryptoCurrency.bttc, CryptoCurrency.doge, CryptoCurrency.firo, CryptoCurrency.usdttrc20, @@ -53,7 +51,6 @@ class CryptoCurrency extends EnumerableItem with Serializable { CryptoCurrency.xvg, CryptoCurrency.usdcpoly, CryptoCurrency.dcr, - CryptoCurrency.husd, CryptoCurrency.kmd, CryptoCurrency.mana, CryptoCurrency.maticpoly, @@ -70,339 +67,117 @@ class CryptoCurrency extends EnumerableItem with Serializable { CryptoCurrency.stx, ]; - static const xmr = CryptoCurrency(title: 'XMR', iconPath: 'assets/images/monero_icon.png', name: 'Monero', raw: 0); - static const ada = CryptoCurrency(title: 'ADA', iconPath: 'assets/images/ada_icon.png', name: 'Cardano', raw: 1); - static const bch = CryptoCurrency(title: 'BCH', iconPath: 'assets/images/bch_icon.png',name: 'Bitcoin Cash', raw: 2); - static const bnb = CryptoCurrency(title: 'BNB', iconPath: 'assets/images/bnb_icon.png', tag: 'BSC', name: 'Binance Coin', raw: 3); - static const btc = CryptoCurrency(title: 'BTC', iconPath: 'assets/images/btc.png', name: 'Bitcoin', raw: 4); - static const dai = CryptoCurrency(title: 'DAI', iconPath: 'assets/images/dai_icon.png', tag: 'ETH', name: 'Dai', raw: 5); - static const dash = CryptoCurrency(title: 'DASH', iconPath: 'assets/images/dash_icon.png', name: 'Dash', raw: 6); - static const eos = CryptoCurrency(title: 'EOS', iconPath: 'assets/images/eos_icon.png', name: 'EOS', raw: 7); - static const eth = CryptoCurrency(title: 'ETH', iconPath: 'assets/images/eth_icon.png', name: 'Ethereum', raw: 8); - static const ltc = CryptoCurrency(title: 'LTC', iconPath: 'assets/images/litecoin-ltc_icon.png', name: 'Litecoin', raw: 9); - static const nano = CryptoCurrency(title: 'NANO', raw: 10); - static const trx = CryptoCurrency(title: 'TRX', iconPath: 'assets/images/trx_icon.png', name: 'TRON', raw: 11); - static const usdt = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdt_icon.png', tag: 'OMNI', name: 'USDT', raw: 12); - static const usdterc20 = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdterc20_icon.png', tag: 'ETH', name: 'USDT', raw: 13); - static const xlm = CryptoCurrency(title: 'XLM', iconPath: 'assets/images/xlm_icon.png', name: 'Stellar', raw: 14); - static const xrp = CryptoCurrency(title: 'XRP', iconPath: 'assets/images/xrp_icon.png', name: 'Ripple', raw: 15); - static const xhv = CryptoCurrency(title: 'XHV', iconPath: 'assets/images/xhv_logo.png', name: 'Haven Protocol', raw: 16); + static const havenCurrencies = [ + xag, + xau, + xaud, + xbtc, + xcad, + xchf, + xcny, + xeur, + xgbp, + xjpy, + xnok, + xnzd, + xusd, + ]; - static const xag = CryptoCurrency(title: 'XAG', tag: 'XHV', raw: 17); - static const xau = CryptoCurrency(title: 'XAU', tag: 'XHV', raw: 18); - static const xaud = CryptoCurrency(title: 'XAUD', tag: 'XHV', raw: 19); - static const xbtc = CryptoCurrency(title: 'XBTC', tag: 'XHV', raw: 20); - static const xcad = CryptoCurrency(title: 'XCAD', tag: 'XHV', raw: 21); - static const xchf = CryptoCurrency(title: 'XCHF', tag: 'XHV', raw: 22); - static const xcny = CryptoCurrency(title: 'XCNY', tag: 'XHV', raw: 23); - static const xeur = CryptoCurrency(title: 'XEUR', tag: 'XHV', raw: 24); - static const xgbp = CryptoCurrency(title: 'XGBP', tag: 'XHV', raw: 25); - static const xjpy = CryptoCurrency(title: 'XJPY', tag: 'XHV', raw: 26); - static const xnok = CryptoCurrency(title: 'XNOK', tag: 'XHV', raw: 27); - static const xnzd = CryptoCurrency(title: 'XNZD', tag: 'XHV', raw: 28); - static const xusd = CryptoCurrency(title: 'XUSD', tag: 'XHV', raw: 29); + // title, tag (if applicable), fullName (if unique), raw, name, iconPath + static const xmr = CryptoCurrency(title: 'XMR', fullName: 'Monero', raw: 0, name: 'xmr', iconPath: 'assets/images/monero_icon.png'); + static const ada = CryptoCurrency(title: 'ADA', fullName: 'Cardano', raw: 1, name: 'ada', iconPath: 'assets/images/ada_icon.png'); + static const bch = CryptoCurrency(title: 'BCH', fullName: 'Bitcoin Cash', raw: 2, name: 'bch', iconPath: 'assets/images/bch_icon.png'); + static const bnb = CryptoCurrency(title: 'BNB', tag: 'BSC', fullName: 'Binance Coin', raw: 3, name: 'bnb', iconPath: 'assets/images/bnb_icon.png'); + static const btc = CryptoCurrency(title: 'BTC', fullName: 'Bitcoin', raw: 4, name: 'btc', iconPath: 'assets/images/btc.png'); + static const dai = CryptoCurrency(title: 'DAI', tag: 'ETH', fullName: 'Dai', raw: 5, name: 'dai', iconPath: 'assets/images/dai_icon.png'); + static const dash = CryptoCurrency(title: 'DASH', fullName: 'Dash', raw: 6, name: 'dash', iconPath: 'assets/images/dash_icon.png'); + static const eos = CryptoCurrency(title: 'EOS', fullName: 'EOS', raw: 7, name: 'eos', iconPath: 'assets/images/eos_icon.png'); + static const eth = CryptoCurrency(title: 'ETH', fullName: 'Ethereum', raw: 8, name: 'eth', iconPath: 'assets/images/eth_icon.png'); + static const ltc = CryptoCurrency(title: 'LTC', fullName: 'Litecoin', raw: 9, name: 'ltc', iconPath: 'assets/images/litecoin-ltc_icon.png'); + static const nano = CryptoCurrency(title: 'NANO', raw: 10, name: 'nano'); + static const trx = CryptoCurrency(title: 'TRX', fullName: 'TRON', raw: 11, name: 'trx', iconPath: 'assets/images/trx_icon.png'); + static const usdt = CryptoCurrency(title: 'USDT', tag: 'OMNI', fullName: 'USDT Tether', raw: 12, name: 'usdt', iconPath: 'assets/images/usdt_icon.png'); + static const usdterc20 = CryptoCurrency(title: 'USDT', tag: 'ETH', fullName: 'USDT Tether', raw: 13, name: 'usdterc20', iconPath: 'assets/images/usdterc20_icon.png'); + static const xlm = CryptoCurrency(title: 'XLM', fullName: 'Stellar', raw: 14, name: 'xlm', iconPath: 'assets/images/xlm_icon.png'); + static const xrp = CryptoCurrency(title: 'XRP', fullName: 'Ripple', raw: 15, name: 'xrp', iconPath: 'assets/images/xrp_icon.png'); + static const xhv = CryptoCurrency(title: 'XHV', fullName: 'Haven Protocol', raw: 16, name: 'xhv', iconPath: 'assets/images/xhv_logo.png'); - static const ape = CryptoCurrency(title: 'APE', iconPath: 'assets/images/ape_icon.png', tag: 'ETH', raw: 30); - static const avaxc = CryptoCurrency(title: 'AVAX', iconPath: 'assets/images/avaxc_icon.png', tag: 'C-CHAIN', raw: 31); - static const btt = CryptoCurrency(title: 'BTT', iconPath: 'assets/images/btt_icon.png', raw: 32); - static const bttbsc = CryptoCurrency(title: 'BTT', iconPath: 'assets/images/bttbsc_icon.png', tag: 'BSC', raw: 33); - static const doge = CryptoCurrency(title: 'DOGE', iconPath: 'assets/images/doge_icon.png', raw: 34); - static const firo = CryptoCurrency(title: 'FIRO', iconPath: 'assets/images/firo_icon.png', raw: 35); - static const usdttrc20 = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdttrc20_icon.png', tag: 'TRX', raw: 36); - static const hbar = CryptoCurrency(title: 'HBAR', iconPath: 'assets/images/hbar_icon.png', raw: 37); - static const sc = CryptoCurrency(title: 'SC', iconPath: 'assets/images/sc_icon.png', raw: 38); - static const sol = CryptoCurrency(title: 'SOL', iconPath: 'assets/images/sol_icon.png', raw: 39); - static const usdc = CryptoCurrency(title: 'USDC', iconPath: 'assets/images/usdc_icon.png', tag: 'ETH', raw: 40); - static const usdcsol = CryptoCurrency(title: 'USDC', iconPath: 'assets/images/usdcsol_icon.png', tag: 'SOL', raw: 41); - static const zaddr = CryptoCurrency(title: 'ZZEC', tag: 'ZEC', name: 'Shielded Zcash', iconPath: 'assets/images/zaddr_icon.png', raw: 42); - static const zec = CryptoCurrency(title: 'TZEC', tag: 'ZEC', name: 'Transparent Zcash', iconPath: 'assets/images/zec_icon.png', raw: 43); - static const zen = CryptoCurrency(title: 'ZEN', iconPath: 'assets/images/zen_icon.png', raw: 44); - static const xvg = CryptoCurrency(title: 'XVG', name: 'Verge', iconPath: 'assets/images/xvg_icon.png', raw: 45); + static const xag = CryptoCurrency(title: 'XAG', tag: 'XHV', raw: 17, name: 'xag'); + static const xau = CryptoCurrency(title: 'XAU', tag: 'XHV', raw: 18, name: 'xau'); + static const xaud = CryptoCurrency(title: 'XAUD', tag: 'XHV', raw: 19, name: 'xaud'); + static const xbtc = CryptoCurrency(title: 'XBTC', tag: 'XHV', raw: 20, name: 'xbtc'); + static const xcad = CryptoCurrency(title: 'XCAD', tag: 'XHV', raw: 21, name: 'xcad'); + static const xchf = CryptoCurrency(title: 'XCHF', tag: 'XHV', raw: 22, name: 'xchf'); + static const xcny = CryptoCurrency(title: 'XCNY', tag: 'XHV', raw: 23, name: 'xcny'); + static const xeur = CryptoCurrency(title: 'XEUR', tag: 'XHV', raw: 24, name: 'xeur'); + static const xgbp = CryptoCurrency(title: 'XGBP', tag: 'XHV', raw: 25, name: 'xgbp'); + static const xjpy = CryptoCurrency(title: 'XJPY', tag: 'XHV', raw: 26, name: 'xjpy'); + static const xnok = CryptoCurrency(title: 'XNOK', tag: 'XHV', raw: 27, name: 'xnok'); + static const xnzd = CryptoCurrency(title: 'XNZD', tag: 'XHV', raw: 28, name: 'xnzd'); + static const xusd = CryptoCurrency(title: 'XUSD', tag: 'XHV', raw: 29, name: 'xusd'); - static const usdcpoly = CryptoCurrency(title: 'USDC', iconPath: 'assets/images/usdc_icon.png', tag: 'POLY', raw: 46); - static const dcr = CryptoCurrency(title: 'DCR', iconPath: 'assets/images/dcr_icon.png', raw: 47); - static const husd = CryptoCurrency(title: 'HUSD', iconPath: 'assets/images/husd_icon.png', tag: 'ETH', raw: 48); - static const kmd = CryptoCurrency(title: 'KMD', iconPath: 'assets/images/kmd_icon.png', raw: 49); - static const mana = CryptoCurrency(title: 'MANA', iconPath: 'assets/images/mana_icon.png', tag: 'ETH', raw: 50); - static const maticpoly = CryptoCurrency(title: 'MATIC', iconPath: 'assets/images/matic_icon.png', tag: 'POLY', raw: 51); - static const matic = CryptoCurrency(title: 'MATIC', iconPath: 'assets/images/matic_icon.png', tag: 'ETH', raw: 52); - static const mkr = CryptoCurrency(title: 'MKR', iconPath: 'assets/images/mkr_icon.png', tag: 'ETH', raw: 53); - static const near = CryptoCurrency(title: 'NEAR', iconPath: 'assets/images/near_icon.png', raw: 54); - static const oxt = CryptoCurrency(title: 'OXT', iconPath: 'assets/images/oxt_icon.png', tag: 'ETH', raw: 55); - static const paxg = CryptoCurrency(title: 'PAXG', iconPath: 'assets/images/paxg_icon.png', tag: 'ETH', raw: 56); - static const pivx = CryptoCurrency(title: 'PIVX', iconPath: 'assets/images/pivx_icon.png', raw: 57); - static const rune = CryptoCurrency(title: 'RUNE', iconPath: 'assets/images/rune_icon.png', raw: 58); - static const rvn = CryptoCurrency(title: 'RVN', iconPath: 'assets/images/rvn_icon.png', raw: 59); - static const scrt = CryptoCurrency(title: 'SCRT', iconPath: 'assets/images/scrt_icon.png', raw: 60); - static const uni = CryptoCurrency(title: 'UNI', iconPath: 'assets/images/uni_icon.png', tag: 'ETH', raw: 61); - static const stx = CryptoCurrency(title: 'STX', iconPath: 'assets/images/stx_icon.png', raw: 62); + static const ape = CryptoCurrency(title: 'APE', tag: 'ETH', fullName: 'ApeCoin', raw: 30, name: 'ape', iconPath: 'assets/images/ape_icon.png'); + static const avaxc = CryptoCurrency(title: 'AVAX', tag: 'C-CHAIN', raw: 31, name: 'avaxc', iconPath: 'assets/images/avaxc_icon.png'); + static const btt = CryptoCurrency(title: 'BTT', tag: 'ETH', fullName: 'BitTorrent', raw: 32, name: 'btt', iconPath: 'assets/images/btt_icon.png'); + static const bttc = CryptoCurrency(title: 'BTTC', tag: 'TRX', fullName: 'BitTorrent-NEW', raw: 33, name: 'bttc', iconPath: 'assets/images/bttbsc_icon.png'); + static const doge = CryptoCurrency(title: 'DOGE', fullName: 'Dogecoin', raw: 34, name: 'doge', iconPath: 'assets/images/doge_icon.png'); + static const firo = CryptoCurrency(title: 'FIRO', raw: 35, name: 'firo', iconPath: 'assets/images/firo_icon.png'); + static const usdttrc20 = CryptoCurrency(title: 'USDT', tag: 'TRX', fullName: 'USDT Tether', raw: 36, name: 'usdttrc20', iconPath: 'assets/images/usdttrc20_icon.png'); + static const hbar = CryptoCurrency(title: 'HBAR', fullName: 'Hedera', raw: 37, name: 'hbar', iconPath: 'assets/images/hbar_icon.png', ); + static const sc = CryptoCurrency(title: 'SC', fullName: 'Siacoin', raw: 38, name: 'sc', iconPath: 'assets/images/sc_icon.png'); + static const sol = CryptoCurrency(title: 'SOL', fullName: 'Solana', raw: 39, name: 'sol', iconPath: 'assets/images/sol_icon.png'); + static const usdc = CryptoCurrency(title: 'USDC', tag: 'ETH', fullName: 'USD Coin', raw: 40, name: 'usdc', iconPath: 'assets/images/usdc_icon.png'); + static const usdcsol = CryptoCurrency(title: 'USDC', tag: 'SOL', fullName: 'USDC Coin', raw: 41, name: 'usdcsol', iconPath: 'assets/images/usdcsol_icon.png'); + static const zaddr = CryptoCurrency(title: 'ZZEC', tag: 'ZEC', fullName: 'Shielded Zcash', iconPath: 'assets/images/zaddr_icon.png', raw: 42, name: 'zaddr'); + static const zec = CryptoCurrency(title: 'TZEC', tag: 'ZEC', fullName: 'Transparent Zcash', iconPath: 'assets/images/zec_icon.png', raw: 43, name: 'zec'); + static const zen = CryptoCurrency(title: 'ZEN', fullName: 'Horizen', raw: 44, name: 'zen', iconPath: 'assets/images/zen_icon.png'); + static const xvg = CryptoCurrency(title: 'XVG', fullName: 'Verge', raw: 45, name: 'xvg', iconPath: 'assets/images/xvg_icon.png'); + static const usdcpoly = CryptoCurrency(title: 'USDC', tag: 'POLY', fullName: 'USD Coin', raw: 46, name: 'usdcpoly', iconPath: 'assets/images/usdc_icon.png'); + static const dcr = CryptoCurrency(title: 'DCR', fullName: 'Decred', raw: 47, name: 'dcr', iconPath: 'assets/images/dcr_icon.png'); + static const kmd = CryptoCurrency(title: 'KMD', fullName: 'Komodo', raw: 48, name: 'kmd', iconPath: 'assets/images/kmd_icon.png'); + static const mana = CryptoCurrency(title: 'MANA', tag: 'ETH', fullName: 'Decentraland', raw: 49, name: 'mana', iconPath: 'assets/images/mana_icon.png'); + static const maticpoly = CryptoCurrency(title: 'MATIC', tag: 'POLY', fullName: 'Polygon', raw: 50, name: 'maticpoly', iconPath: 'assets/images/matic_icon.png'); + static const matic = CryptoCurrency(title: 'MATIC', tag: 'ETH', fullName: 'Polygon', raw: 51, name: 'matic', iconPath: 'assets/images/matic_icon.png'); + static const mkr = CryptoCurrency(title: 'MKR', tag: 'ETH', fullName: 'Maker', raw: 52, name: 'mkr', iconPath: 'assets/images/mkr_icon.png'); + static const near = CryptoCurrency(title: 'NEAR', fullName: 'NEAR Protocol', raw: 53, name: 'near', iconPath: 'assets/images/near_icon.png'); + static const oxt = CryptoCurrency(title: 'OXT', tag: 'ETH', fullName: 'Orchid', raw: 54, name: 'oxt', iconPath: 'assets/images/oxt_icon.png'); + static const paxg = CryptoCurrency(title: 'PAXG', tag: 'ETH', fullName: 'Pax Gold', raw: 55, name: 'paxg', iconPath: 'assets/images/paxg_icon.png'); + static const pivx = CryptoCurrency(title: 'PIVX', raw: 56, name: 'pivx', iconPath: 'assets/images/pivx_icon.png'); + static const rune = CryptoCurrency(title: 'RUNE', fullName: 'Thorchain', raw: 57, name: 'rune', iconPath: 'assets/images/rune_icon.png'); + static const rvn = CryptoCurrency(title: 'RVN', fullName: 'Ravencoin', raw: 58, name: 'rvn', iconPath: 'assets/images/rvn_icon.png'); + static const scrt = CryptoCurrency(title: 'SCRT', fullName: 'Secret Network', raw: 59, name: 'scrt', iconPath: 'assets/images/scrt_icon.png'); + static const uni = CryptoCurrency(title: 'UNI', tag: 'ETH', fullName: 'Uniswap', raw: 60, name: 'uni', iconPath: 'assets/images/uni_icon.png'); + static const stx = CryptoCurrency(title: 'STX', fullName: 'Stacks', raw: 61, name: 'stx', iconPath: 'assets/images/stx_icon.png'); + static final Map _rawCurrencyMap = + [...all, ...havenCurrencies].fold>({}, (acc, item) { + acc.addAll({item.raw: item}); + return acc; + }); + + static final Map _nameCurrencyMap = + [...all, ...havenCurrencies].fold>({}, (acc, item) { + acc.addAll({item.name: item}); + return acc; + }); static CryptoCurrency deserialize({required int raw}) { - switch (raw) { - case 0: - return CryptoCurrency.xmr; - case 1: - return CryptoCurrency.ada; - case 2: - return CryptoCurrency.bch; - case 3: - return CryptoCurrency.bnb; - case 4: - return CryptoCurrency.btc; - case 5: - return CryptoCurrency.dai; - case 6: - return CryptoCurrency.dash; - case 7: - return CryptoCurrency.eos; - case 8: - return CryptoCurrency.eth; - case 9: - return CryptoCurrency.ltc; - case 10: - return CryptoCurrency.nano; - case 11: - return CryptoCurrency.trx; - case 12: - return CryptoCurrency.usdt; - case 13: - return CryptoCurrency.usdterc20; - case 14: - return CryptoCurrency.xlm; - case 15: - return CryptoCurrency.xrp; - case 16: - return CryptoCurrency.xhv; - case 17: - return CryptoCurrency.xag; - case 18: - return CryptoCurrency.xau; - case 19: - return CryptoCurrency.xaud; - case 20: - return CryptoCurrency.xbtc; - case 21: - return CryptoCurrency.xcad; - case 22: - return CryptoCurrency.xchf; - case 23: - return CryptoCurrency.xcny; - case 24: - return CryptoCurrency.xeur; - case 25: - return CryptoCurrency.xgbp; - case 26: - return CryptoCurrency.xjpy; - case 27: - return CryptoCurrency.xnok; - case 28: - return CryptoCurrency.xnzd; - case 29: - return CryptoCurrency.xusd; - case 30: - return CryptoCurrency.ape; - case 31: - return CryptoCurrency.avaxc; - case 32: - return CryptoCurrency.btt; - case 33: - return CryptoCurrency.bttbsc; - case 34: - return CryptoCurrency.doge; - case 35: - return CryptoCurrency.firo; - case 36: - return CryptoCurrency.usdttrc20; - case 37: - return CryptoCurrency.hbar; - case 38: - return CryptoCurrency.sc; - case 39: - return CryptoCurrency.sol; - case 40: - return CryptoCurrency.usdc; - case 41: - return CryptoCurrency.usdcsol; - case 42: - return CryptoCurrency.zaddr; - case 43: - return CryptoCurrency.zec; - case 44: - return CryptoCurrency.zen; - case 45: - return CryptoCurrency.xvg; - case 46: - return CryptoCurrency.usdcpoly; - case 47: - return CryptoCurrency.dcr; - case 48: - return CryptoCurrency.husd; - case 49: - return CryptoCurrency.kmd; - case 50: - return CryptoCurrency.mana; - case 51: - return CryptoCurrency.maticpoly; - case 52: - return CryptoCurrency.matic; - case 53: - return CryptoCurrency.mkr; - case 54: - return CryptoCurrency.near; - case 55: - return CryptoCurrency.oxt; - case 56: - return CryptoCurrency.paxg; - case 57: - return CryptoCurrency.pivx; - case 58: - return CryptoCurrency.rune; - case 59: - return CryptoCurrency.rvn; - case 60: - return CryptoCurrency.scrt; - case 61: - return CryptoCurrency.uni; - case 62: - return CryptoCurrency.stx; - default: - throw Exception('Unexpected token: $raw for CryptoCurrency deserialize'); + + if (CryptoCurrency._rawCurrencyMap[raw] == null) { + final s = 'Unexpected token: $raw for CryptoCurrency deserialize'; + throw ArgumentError.value(raw, 'raw', s); } + return CryptoCurrency._rawCurrencyMap[raw]!; } - static CryptoCurrency fromString(String raw) { - switch (raw.toLowerCase()) { - case 'xmr': - return CryptoCurrency.xmr; - case 'ada': - return CryptoCurrency.ada; - case 'bch': - return CryptoCurrency.bch; - case 'bnbmainnet': - return CryptoCurrency.bnb; - case 'btc': - return CryptoCurrency.btc; - case 'dai': - return CryptoCurrency.dai; - case 'dash': - return CryptoCurrency.dash; - case 'eos': - return CryptoCurrency.eos; - case 'eth': - return CryptoCurrency.eth; - case 'ltc': - return CryptoCurrency.ltc; - case 'nano': - return CryptoCurrency.nano; - case 'trx': - return CryptoCurrency.trx; - case 'usdc': - return CryptoCurrency.usdc; - case 'usdterc20': - return CryptoCurrency.usdterc20; - case 'xlm': - return CryptoCurrency.xlm; - case 'xrp': - return CryptoCurrency.xrp; - case 'xhv': - return CryptoCurrency.xhv; - case 'xag': - return CryptoCurrency.xag; - case 'xau': - return CryptoCurrency.xau; - case 'xaud': - return CryptoCurrency.xaud; - case 'xbtc': - return CryptoCurrency.xbtc; - case 'xcad': - return CryptoCurrency.xcad; - case 'xchf': - return CryptoCurrency.xchf; - case 'xcny': - return CryptoCurrency.xcny; - case 'xeur': - return CryptoCurrency.xeur; - case 'xgbp': - return CryptoCurrency.xgbp; - case 'xjpy': - return CryptoCurrency.xjpy; - case 'xnok': - return CryptoCurrency.xnok; - case 'xnzd': - return CryptoCurrency.xnzd; - case 'xusd': - return CryptoCurrency.xusd; - case 'ape': - return CryptoCurrency.ape; - case 'avax': - return CryptoCurrency.avaxc; - case 'btt': - return CryptoCurrency.btt; - case 'bttbsc': - return CryptoCurrency.bttbsc; - case 'doge': - return CryptoCurrency.doge; - case 'firo': - return CryptoCurrency.firo; - case 'usdttrc20': - return CryptoCurrency.usdttrc20; - case 'hbar': - return CryptoCurrency.hbar; - case 'sc': - return CryptoCurrency.sc; - case 'sol': - return CryptoCurrency.sol; - case 'usdt': - return CryptoCurrency.usdt; - case 'usdcsol': - return CryptoCurrency.usdcsol; - case 'zaddr': - return CryptoCurrency.zaddr; - case 'zec': - return CryptoCurrency.zec; - case 'zen': - return CryptoCurrency.zen; - case 'xvg': - return CryptoCurrency.xvg; - case 'usdcpoly': - return CryptoCurrency.usdcpoly; - case 'dcr': - return CryptoCurrency.dcr; - case 'husd': - return CryptoCurrency.husd; - case 'kmd': - return CryptoCurrency.kmd; - case 'mana': - return CryptoCurrency.mana; - case 'maticpoly': - return CryptoCurrency.maticpoly; - case 'matic': - return CryptoCurrency.matic; - case 'mkr': - return CryptoCurrency.mkr; - case 'near': - return CryptoCurrency.near; - case 'oxt': - return CryptoCurrency.oxt; - case 'paxg': - return CryptoCurrency.paxg; - case 'pivx': - return CryptoCurrency.pivx; - case 'rune': - return CryptoCurrency.rune; - case 'rvn': - return CryptoCurrency.rvn; - case 'scrt': - return CryptoCurrency.scrt; - case 'uni': - return CryptoCurrency.uni; - case 'stx': - return CryptoCurrency.stx; - default: - throw Exception('Unexpected token: $raw for CryptoCurrency fromString'); + static CryptoCurrency fromString(String name) { + + if (CryptoCurrency._nameCurrencyMap[name.toLowerCase()] == null) { + final s = 'Unexpected token: $name for CryptoCurrency fromString'; + throw ArgumentError.value(name, 'name', s); } + return CryptoCurrency._nameCurrencyMap[name.toLowerCase()]!; } @override diff --git a/cw_core/lib/monero_amount_format.dart b/cw_core/lib/monero_amount_format.dart index 912527b4e..0bf0031c9 100644 --- a/cw_core/lib/monero_amount_format.dart +++ b/cw_core/lib/monero_amount_format.dart @@ -15,4 +15,4 @@ double moneroAmountToDouble({required int amount}) => cryptoAmountToDouble(amount: amount, divider: moneroAmountDivider); int moneroParseAmount({required String amount}) => - (double.parse(amount) * moneroAmountDivider).toInt(); + (double.parse(amount) * moneroAmountDivider).round(); diff --git a/cw_haven/lib/haven_transaction_info.dart b/cw_haven/lib/haven_transaction_info.dart index 277370467..6ffb60e6b 100644 --- a/cw_haven/lib/haven_transaction_info.dart +++ b/cw_haven/lib/haven_transaction_info.dart @@ -8,7 +8,8 @@ import 'package:cw_haven/api/transaction_history.dart'; class HavenTransactionInfo extends TransactionInfo { HavenTransactionInfo(this.id, this.height, this.direction, this.date, - this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee); + this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee, + this.confirmations); HavenTransactionInfo.fromMap(Map map) : id = (map['hash'] ?? '') as String, @@ -22,6 +23,7 @@ class HavenTransactionInfo extends TransactionInfo { amount = map['amount'] as int, accountIndex = int.parse(map['accountIndex'] as String), addressIndex = map['addressIndex'] as int, + confirmations = map['confirmations'] as int, key = getTxKey((map['hash'] ?? '') as String), fee = map['fee'] as int? ?? 0; @@ -35,6 +37,7 @@ class HavenTransactionInfo extends TransactionInfo { amount = row.getAmount(), accountIndex = row.subaddrAccount, addressIndex = row.subaddrIndex, + confirmations = row.confirmations, key = null, //getTxKey(row.getHash()), fee = row.fee, assetType = row.getAssetType(); @@ -48,6 +51,7 @@ class HavenTransactionInfo extends TransactionInfo { final int amount; final int fee; final int addressIndex; + final int confirmations; late String recipientAddress; late String assetType; String? _fiatAmount; diff --git a/cw_monero/lib/monero_transaction_info.dart b/cw_monero/lib/monero_transaction_info.dart index 2dfdaf408..90cc3c279 100644 --- a/cw_monero/lib/monero_transaction_info.dart +++ b/cw_monero/lib/monero_transaction_info.dart @@ -8,7 +8,8 @@ import 'package:cw_monero/api/transaction_history.dart'; class MoneroTransactionInfo extends TransactionInfo { MoneroTransactionInfo(this.id, this.height, this.direction, this.date, - this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee); + this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee, + this.confirmations); MoneroTransactionInfo.fromMap(Map map) : id = (map['hash'] ?? '') as String, @@ -22,6 +23,7 @@ class MoneroTransactionInfo extends TransactionInfo { amount = map['amount'] as int, accountIndex = int.parse(map['accountIndex'] as String), addressIndex = map['addressIndex'] as int, + confirmations = map['confirmations'] as int, key = getTxKey((map['hash'] ?? '') as String), fee = map['fee'] as int ?? 0 { additionalInfo = { @@ -41,6 +43,7 @@ class MoneroTransactionInfo extends TransactionInfo { amount = row.getAmount(), accountIndex = row.subaddrAccount, addressIndex = row.subaddrIndex, + confirmations = row.confirmations, key = getTxKey(row.getHash()), fee = row.fee { additionalInfo = { @@ -59,6 +62,7 @@ class MoneroTransactionInfo extends TransactionInfo { final int amount; final int fee; final int addressIndex; + final int confirmations; String? recipientAddress; String? key; String? _fiatAmount; diff --git a/lib/anypay/anypay_api.dart b/lib/anypay/anypay_api.dart index 5eb9e460b..679d0eabf 100644 --- a/lib/anypay/anypay_api.dart +++ b/lib/anypay/anypay_api.dart @@ -80,7 +80,7 @@ class AnyPayApi { final response = await post(Uri.parse(uri), headers: headers, body: utf8.encode(json.encode(body))); if (response.statusCode == 400) { final decodedBody = json.decode(response.body) as Map; - throw Exception(decodedBody['message'] as String); + throw Exception(decodedBody['message'] as String? ?? 'Unexpected response\nError code: 400'); } if (response.statusCode != 200) { diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 9d7b0e3b5..22ad6a9d8 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -24,7 +24,6 @@ class AddressValidator extends TextValidator { return '[0-9a-zA-Z_]'; case CryptoCurrency.usdc: case CryptoCurrency.usdcpoly: - case CryptoCurrency.husd: case CryptoCurrency.ape: case CryptoCurrency.avaxc: case CryptoCurrency.eth: @@ -156,7 +155,7 @@ class AddressValidator extends TextValidator { return [98, 99, 106]; case CryptoCurrency.btt: return [34]; - case CryptoCurrency.bttbsc: + case CryptoCurrency.bttc: return [34]; case CryptoCurrency.doge: return [34]; @@ -181,7 +180,6 @@ class AddressValidator extends TextValidator { case CryptoCurrency.stx: return [40, 41, 42]; case CryptoCurrency.usdcpoly: - case CryptoCurrency.husd: case CryptoCurrency.mana: case CryptoCurrency.matic: case CryptoCurrency.maticpoly: @@ -200,4 +198,26 @@ class AddressValidator extends TextValidator { return []; } } + + static String? getAddressFromStringPattern(CryptoCurrency type) { + switch (type) { + case CryptoCurrency.xmr: + return '([^0-9a-zA-Z]|^)4[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)8[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)[0-9a-zA-Z]{106}([^0-9a-zA-Z]|\$)'; + case CryptoCurrency.btc: + return '([^0-9a-zA-Z]|^)1[0-9a-zA-Z]{32}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)1[0-9a-zA-Z]{33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)3[0-9a-zA-Z]{32}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)3[0-9a-zA-Z]{33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)bc1[0-9a-zA-Z]{39}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)bc1[0-9a-zA-Z]{59}([^0-9a-zA-Z]|\$)'; + case CryptoCurrency.ltc: + return '([^0-9a-zA-Z]|^)^L[a-zA-Z0-9]{26,33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)[LM][a-km-zA-HJ-NP-Z1-9]{26,33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)ltc[a-zA-Z0-9]{26,45}([^0-9a-zA-Z]|\$)'; + default: + return null; + } + } } diff --git a/lib/di.dart b/lib/di.dart index a520c9b4c..03b3e6bc2 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -43,6 +43,7 @@ import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/security_settings_view_model.dart'; import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart'; +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cake_wallet/core/backup_service.dart'; import 'package:cw_core/wallet_service.dart'; @@ -381,8 +382,8 @@ Future setup( addressListViewModel: getIt.get(), walletViewModel: getIt.get())); - getIt.registerFactoryParam( - (dynamic item, _) => WalletAddressEditOrCreateViewModel( + getIt.registerFactoryParam( + (WalletAddressListItem? item, _) => WalletAddressEditOrCreateViewModel( wallet: getIt.get().wallet!, item: item)); getIt.registerFactoryParam( diff --git a/lib/entities/language_service.dart b/lib/entities/language_service.dart index 7dccc59c0..2f3443c02 100644 --- a/lib/entities/language_service.dart +++ b/lib/entities/language_service.dart @@ -18,7 +18,11 @@ class LanguageService { 'uk': 'Українська (Ukrainian)', 'zh': '中文 (Chinese)', 'hr': 'Hrvatski (Croatian)', - 'it': 'Italiano (Italian)' + 'it': 'Italiano (Italian)', + 'th': 'ภาษาไทย (Thai)', + 'ar': 'العربية (Arabic)', + 'tr': 'Türkçe (Turkish)', + 'my': 'မြန်မာ (Burmese)', }; static const Map localeCountryCode = { @@ -36,7 +40,11 @@ class LanguageService { 'uk': 'ukr', 'zh': 'chn', 'hr': 'hrv', - 'it': 'ita' + 'it': 'ita', + 'th': 'tha', + 'ar': 'sau', + 'tr': 'tur', + 'my': 'mmr', }; static final list = {}; diff --git a/lib/entities/openalias_record.dart b/lib/entities/openalias_record.dart index 9e2b3f680..842a711fe 100644 --- a/lib/entities/openalias_record.dart +++ b/lib/entities/openalias_record.dart @@ -1,5 +1,4 @@ import 'package:basic_utils/basic_utils.dart'; -import 'package:cw_core/wallet_type.dart'; class OpenaliasRecord { OpenaliasRecord({ @@ -22,69 +21,68 @@ class OpenaliasRecord { return formattedName; } - static Future fetchAddressAndName({ + static Future?> lookupOpenAliasRecord(String name) async { + try { + final txtRecord = await DnsUtils.lookupRecord(name, RRecordType.TXT, dnssec: true); + + return txtRecord; + } catch (e) { + print("${e.toString()}"); + return null; + } + } + + static OpenaliasRecord fetchAddressAndName({ required String formattedName, required String ticker, - }) async { + required List txtRecord, + }) { String address = formattedName; String name = formattedName; String note = ''; - if (formattedName.contains(".")) { - try { - final txtRecord = await DnsUtils.lookupRecord( - formattedName, RRecordType.TXT, - dnssec: true); + for (RRecord element in txtRecord) { + String record = element.data; - if (txtRecord != null) { - for (RRecord element in txtRecord) { - String record = element.data; + if (record.contains("oa1:$ticker") && record.contains("recipient_address")) { + record = record.replaceAll('\"', ""); - if (record.contains("oa1:$ticker") && - record.contains("recipient_address")) { - record = record.replaceAll('\"', ""); + final dataList = record.split(";"); - final dataList = record.split(";"); + address = dataList + .where((item) => (item.contains("recipient_address"))) + .toString() + .replaceAll("oa1:$ticker recipient_address=", "") + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); - address = dataList - .where((item) => (item.contains("recipient_address"))) - .toString() - .replaceAll("oa1:$ticker recipient_address=", "") - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); + final recipientName = dataList + .where((item) => (item.contains("recipient_name"))) + .toString() + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); - final recipientName = dataList - .where((item) => (item.contains("recipient_name"))) - .toString() - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); - - if (recipientName.isNotEmpty) { - name = recipientName.replaceAll("recipient_name=", ""); - } - - final description = dataList - .where((item) => (item.contains("tx_description"))) - .toString() - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); - - if (description.isNotEmpty) { - note = description.replaceAll("tx_description=", ""); - } - - break; - } - } + if (recipientName.isNotEmpty) { + name = recipientName.replaceAll("recipient_name=", ""); } - } catch (e) { - print("${e.toString()}"); - } - } - return OpenaliasRecord(address: address, name: name, description: note); + final description = dataList + .where((item) => (item.contains("tx_description"))) + .toString() + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); + + if (description.isNotEmpty) { + note = description.replaceAll("tx_description=", ""); + } + + break; + } + } + return OpenaliasRecord(address: address, name: name, description: note); +} } diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 775f6e229..fce9d9a56 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -1,40 +1,75 @@ +import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/yat_service.dart'; import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/unstoppable_domain_address.dart'; import 'package:cake_wallet/entities/emoji_string_extension.dart'; +import 'package:cake_wallet/twitter/twitter_api.dart'; +import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/entities/fio_address_provider.dart'; class AddressResolver { - AddressResolver({required this.yatService, required this.walletType}); - + final YatService yatService; final WalletType walletType; - + static const unstoppableDomains = [ - 'crypto', - 'zil', - 'x', - 'coin', - 'wallet', - 'bitcoin', - '888', - 'nft', - 'dao', - 'blockchain' -]; + 'crypto', + 'zil', + 'x', + 'coin', + 'wallet', + 'bitcoin', + '888', + 'nft', + 'dao', + 'blockchain' + ]; + + static String? extractAddressByType({required String raw, required CryptoCurrency type}) { + final addressPattern = AddressValidator.getAddressFromStringPattern(type); + + if (addressPattern == null) { + throw 'Unexpected token: $type for getAddressFromStringPattern'; + } + + final match = RegExp(addressPattern).firstMatch(raw); + return match?.group(0)?.replaceAll(RegExp('[^0-9a-zA-Z]'), ''); + } Future resolve(String text, String ticker) async { try { - if (text.contains('@') && !text.contains('.')) { + if (text.startsWith('@') && !text.substring(1).contains('@')) { + final formattedName = text.substring(1); + final twitterUser = await TwitterApi.lookupUserByName(userName: formattedName); + final addressFromBio = extractAddressByType( + raw: twitterUser.description, type: CryptoCurrency.fromString(ticker)); + if (addressFromBio != null) { + return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text); + } + final tweets = twitterUser.tweets; + if (tweets != null) { + var subString = StringBuffer(); + tweets.forEach((item) { + subString.writeln(item.text); + }); + final userTweetsText = subString.toString(); + final addressFromPinnedTweet = + extractAddressByType(raw: userTweetsText, type: CryptoCurrency.fromString(ticker)); + + if (addressFromPinnedTweet != null) { + return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text); + } + } + } + if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { final bool isFioRegistered = await FioAddressProvider.checkAvail(text); if (isFioRegistered) { final address = await FioAddressProvider.getPubAddress(text, ticker); return ParsedAddress.fetchFioAddress(address: address, name: text); - } - + } } if (text.hasOnlyEmojis) { if (walletType != WalletType.haven) { @@ -55,10 +90,14 @@ class AddressResolver { return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text); } - final record = await OpenaliasRecord.fetchAddressAndName( - formattedName: formattedName, ticker: ticker); - return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); - + if (formattedName.contains(".")) { + final txtRecord = await OpenaliasRecord.lookupOpenAliasRecord(formattedName); + if (txtRecord != null) { + final record = await OpenaliasRecord.fetchAddressAndName( + formattedName: formattedName, ticker: ticker, txtRecord: txtRecord); + return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); + } + } } catch (e) { print(e.toString()); } diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index 09cecbf04..a73b44e33 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -1,8 +1,7 @@ import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/yat_record.dart'; -import 'package:flutter/material.dart'; -enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed } +enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed, twitter } class ParsedAddress { ParsedAddress({ @@ -41,11 +40,7 @@ class ParsedAddress { ); } - factory ParsedAddress.fetchOpenAliasAddress({OpenaliasRecord? record, required String name}){ - final formattedName = OpenaliasRecord.formatDomainName(name); - if (record == null || record.address.contains(formattedName)) { - return ParsedAddress(addresses: [name]); - } + factory ParsedAddress.fetchOpenAliasAddress({required OpenaliasRecord record, required String name}){ return ParsedAddress( addresses: [record.address], name: record.name, @@ -62,6 +57,14 @@ class ParsedAddress { ); } + factory ParsedAddress.fetchTwitterAddress({required String address, required String name}){ + return ParsedAddress( + addresses: [address], + name: name, + parseFrom: ParseFrom.twitter, + ); + } + final List addresses; final String name; final String description; diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 90d4dcad7..a44dcb3d9 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -29,6 +29,7 @@ class PreferencesKey { static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1'; static const pinTimeOutDuration = 'pin_timeout_duration'; static const lastAuthTimeMilliseconds = 'last_auth_time_milliseconds'; + static const lastPopupDate = 'last_popup_date'; static String moneroWalletUpdateV1Key(String name) diff --git a/lib/entities/qr_scanner.dart b/lib/entities/qr_scanner.dart index 8c23f6ea1..c6873a5bc 100644 --- a/lib/entities/qr_scanner.dart +++ b/lib/entities/qr_scanner.dart @@ -7,7 +7,7 @@ Future presentQRScanner() async { try { final result = await BarcodeScanner.scan(); isQrScannerShown = false; - return result.rawContent; + return result.rawContent.trim(); } catch (e) { isQrScannerShown = false; rethrow; diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index a9fb7c9ca..3f18d43b1 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -143,6 +143,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final inputAddress = responseJSON['payinAddress'] as String; final refundAddress = responseJSON['refundAddress'] as String; final extraId = responseJSON['payinExtraId'] as String?; + final payoutAddress = responseJSON['payoutAddress'] as String; return Trade( id: id, @@ -154,7 +155,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { extraId: extraId, createdAt: DateTime.now(), amount: responseJSON['fromAmount']?.toString() ?? _request.fromAmount, - state: TradeState.created); + state: TradeState.created, + payoutAddress: payoutAddress); } @override @@ -192,6 +194,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final extraId = responseJSON['payinExtraId'] as String; final outputTransaction = responseJSON['payoutHash'] as String; final expiredAtRaw = responseJSON['validUntil'] as String; + final payoutAddress = responseJSON['payoutAddress'] as String; final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal(); return Trade( @@ -204,7 +207,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { state: state, extraId: extraId, expiredAt: expiredAt, - outputTransaction: outputTransaction); + outputTransaction: outputTransaction, + payoutAddress: payoutAddress); } @override @@ -271,6 +275,10 @@ class ChangeNowExchangeProvider extends ExchangeProvider { switch(currency) { case CryptoCurrency.zec: return 'zec'; + case CryptoCurrency.usdcpoly: + return 'usdcmatic'; + case CryptoCurrency.maticpoly: + return 'maticmainnet'; default: return currency.title.toLowerCase(); } diff --git a/lib/exchange/exchange_provider_description.dart b/lib/exchange/exchange_provider_description.dart index f9e359454..2fd231085 100644 --- a/lib/exchange/exchange_provider_description.dart +++ b/lib/exchange/exchange_provider_description.dart @@ -24,6 +24,9 @@ class ExchangeProviderDescription extends EnumerableItem static const simpleSwap = ExchangeProviderDescription(title: 'SimpleSwap', raw: 4, image: 'assets/images/simpleSwap.png'); + static const all = + ExchangeProviderDescription(title: 'All trades', raw: 5, image:''); + static ExchangeProviderDescription deserialize({required int raw}) { switch (raw) { case 0: @@ -36,6 +39,8 @@ class ExchangeProviderDescription extends EnumerableItem return sideShift; case 4: return simpleSwap; + case 5: + return all; default: throw Exception('Unexpected token: $raw for ExchangeProviderDescription deserialize'); } diff --git a/lib/exchange/sideshift/sideshift_exchange_provider.dart b/lib/exchange/sideshift/sideshift_exchange_provider.dart index 98f18f058..2fc593988 100644 --- a/lib/exchange/sideshift/sideshift_exchange_provider.dart +++ b/lib/exchange/sideshift/sideshift_exchange_provider.dart @@ -27,7 +27,6 @@ class SideShiftExchangeProvider extends ExchangeProvider { static const List _notSupported = [ CryptoCurrency.xhv, CryptoCurrency.dcr, - CryptoCurrency.husd, CryptoCurrency.kmd, CryptoCurrency.mkr, CryptoCurrency.near, @@ -38,6 +37,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { CryptoCurrency.rvn, CryptoCurrency.scrt, CryptoCurrency.stx, + CryptoCurrency.bttc, ]; static List _supportedPairs() { @@ -150,6 +150,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { refundAddress: settleAddress, state: TradeState.created, amount: _request.depositAmount, + payoutAddress: settleAddress, createdAt: DateTime.now(), ); } @@ -244,6 +245,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { final inputAddress = responseJSON['depositAddress']['address'] as String; final expectedSendAmount = responseJSON['depositAmount'].toString(); final deposits = responseJSON['deposits'] as List?; + final settleAddress = responseJSON['settleAddress']['address'] as String; TradeState? state; String? status; @@ -264,6 +266,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { amount: expectedSendAmount, state: state, expiredAt: expiredAt, + payoutAddress: settleAddress ); } diff --git a/lib/exchange/simpleswap/simpleswap_exchange_provider.dart b/lib/exchange/simpleswap/simpleswap_exchange_provider.dart index 2521c1486..6c5c23460 100644 --- a/lib/exchange/simpleswap/simpleswap_exchange_provider.dart +++ b/lib/exchange/simpleswap/simpleswap_exchange_provider.dart @@ -108,6 +108,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { final responseJSON = json.decode(response.body) as Map; final id = responseJSON['id'] as String; final inputAddress = responseJSON['address_from'] as String; + final payoutAddress = responseJSON['address_to'] as String; final settleAddress = responseJSON['user_refund_address'] as String; final extraId = responseJSON['extra_id_from'] as String?; return Trade( @@ -120,6 +121,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { extraId: extraId, state: TradeState.created, amount: _request.amount, + payoutAddress: payoutAddress, createdAt: DateTime.now(), ); } @@ -189,6 +191,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { final expectedSendAmount = responseJSON['expected_amount'].toString(); final extraId = responseJSON['extra_id_from'] as String?; final status = responseJSON['status'] as String; + final payoutAddress = responseJSON['address_to'] as String; final state = TradeState.deserialize(raw: status); return Trade( @@ -200,6 +203,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { inputAddress: inputAddress, amount: expectedSendAmount, state: state, + payoutAddress: payoutAddress, ); } @@ -231,6 +235,10 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { return 'usdcpoly'; case CryptoCurrency.usdcsol: return 'usdcspl'; + case CryptoCurrency.matic: + return 'maticerc20'; + case CryptoCurrency.maticpoly: + return 'matic'; default: return currency.title.toLowerCase(); } diff --git a/lib/exchange/trade.dart b/lib/exchange/trade.dart index 99b73e789..f20a080b7 100644 --- a/lib/exchange/trade.dart +++ b/lib/exchange/trade.dart @@ -21,7 +21,8 @@ class Trade extends HiveObject { this.extraId, this.outputTransaction, this.refundAddress, - this.walletId}) { + this.walletId, + this.payoutAddress}) { if (provider != null) { providerRaw = provider.raw; } @@ -88,6 +89,9 @@ class Trade extends HiveObject { @HiveField(12) String? walletId; + @HiveField(13) + String? payoutAddress; + static Trade fromMap(Map map) { return Trade( id: map['id'] as String, diff --git a/lib/main.dart b/lib/main.dart index 19f89feb3..7ba1f204a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,9 @@ import 'dart:async'; -import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/buy/order.dart'; -import 'package:cake_wallet/ionia/ionia_category.dart'; -import 'package:cake_wallet/ionia/ionia_merchant.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; +import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -41,11 +39,23 @@ import 'package:cake_wallet/wallet_type_utils.dart'; final navigatorKey = GlobalKey(); final rootKey = GlobalKey(); +final RouteObserver routeObserver = RouteObserver(); Future main() async { - try { + + await runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); + FlutterError.onError = ExceptionHandler.onError; + + /// A callback that is invoked when an unhandled error occurs in the root + /// isolate. + PlatformDispatcher.instance.onError = (error, stack) { + ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); + + return true; + }; + final appDir = await getApplicationDocumentsDirectory(); await Hive.close(); Hive.init(appDir.path); @@ -131,18 +141,9 @@ Future main() async { secureStorage: secureStorage, initialMigrationVersion: 19); runApp(App()); - } catch (e, stacktrace) { - runApp(MaterialApp( - debugShowCheckedModeBanner: true, - home: Scaffold( - body: Container( - margin: - EdgeInsets.only(top: 50, left: 20, right: 20, bottom: 20), - child: Text( - 'Error:\n${e.toString()}\nStacktrace: $stacktrace', - style: TextStyle(fontSize: 22), - ))))); - } + }, (error, stackTrace) async { + ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace)); + }); } Future initialSetup( @@ -279,6 +280,7 @@ class AppState extends State with SingleTickerProviderStateMixin { navigatorKey: navigatorKey, authService: authService, child: MaterialApp( + navigatorObservers: [routeObserver], navigatorKey: navigatorKey, debugShowCheckedModeBanner: false, theme: settingsStore.theme, diff --git a/lib/src/screens/buy/buy_webview_page.dart b/lib/src/screens/buy/buy_webview_page.dart index 7c0ca903f..b19a112fc 100644 --- a/lib/src/screens/buy/buy_webview_page.dart +++ b/lib/src/screens/buy/buy_webview_page.dart @@ -9,11 +9,10 @@ import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/store/dashboard/orders_store.dart'; import 'package:cake_wallet/view_model/buy/buy_view_model.dart'; import 'package:flutter/material.dart'; -import 'package:webview_flutter/webview_flutter.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class BuyWebViewPage extends BasePage { - BuyWebViewPage({required this.buyViewModel, - required this.ordersStore, required this.url}); + BuyWebViewPage({required this.buyViewModel, required this.ordersStore, required this.url}); final OrdersStore ordersStore; final String url; @@ -46,12 +45,12 @@ class BuyWebViewPageBody extends StatefulWidget { class BuyWebViewPageBodyState extends State { BuyWebViewPageBodyState() - : _webViewkey = GlobalKey(), - _isSaving = false, - orderId = ''; + : _webViewkey = GlobalKey(), + _isSaving = false, + orderId = ''; String orderId; - WebViewController? _webViewController; + InAppWebViewController? _webViewController; GlobalKey _webViewkey; Timer? _timer; bool _isSaving; @@ -63,8 +62,6 @@ class BuyWebViewPageBodyState extends State { _isSaving = false; widget.ordersStore.orderId = ''; - if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); - if (widget.buyViewModel.selectedProvider is WyreBuyProvider) { _saveOrder(keyword: 'completed', splitSymbol: '/'); } @@ -76,31 +73,31 @@ class BuyWebViewPageBodyState extends State { @override Widget build(BuildContext context) { - return WebView( + return InAppWebView( key: _webViewkey, - initialUrl: widget.url, - javascriptMode: JavascriptMode.unrestricted, - onWebViewCreated: (WebViewController controller) => + initialOptions: InAppWebViewGroupOptions( + crossPlatform: InAppWebViewOptions(transparentBackground: true), + ), + initialUrlRequest: URLRequest(url: Uri.tryParse(widget.url ?? '')), + onWebViewCreated: (InAppWebViewController controller) => setState(() => _webViewController = controller)); } void _saveOrder({required String keyword, required String splitSymbol}) { _timer?.cancel(); _timer = Timer.periodic(Duration(seconds: 1), (timer) async { - try { if (_webViewController == null || _isSaving) { return; } - final url = await _webViewController!.currentUrl(); - + final url = (await _webViewController!.getUrl())?.toString(); if (url == null) { throw Exception('_saveOrder: Url is null'); } - if (url!.contains(keyword)) { - final urlParts = url!.split(splitSymbol); + if (url.contains(keyword)) { + final urlParts = url.split(splitSymbol); orderId = urlParts.last; widget.ordersStore.orderId = orderId; diff --git a/lib/src/screens/buy/onramper_page.dart b/lib/src/screens/buy/onramper_page.dart index 13c47f228..e399cec66 100644 --- a/lib/src/screens/buy/onramper_page.dart +++ b/lib/src/screens/buy/onramper_page.dart @@ -3,7 +3,9 @@ import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:flutter/material.dart'; -import 'package:webview_flutter/webview_flutter.dart'; +import 'package:cake_wallet/.secrets.g.dart' as secrets; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:permission_handler/permission_handler.dart'; class OnRamperPage extends BasePage { OnRamperPage(this._onRamperBuyProvider); @@ -44,17 +46,26 @@ class OnRamperPageBody extends StatefulWidget { class OnRamperPageBodyState extends State { OnRamperPageBodyState(); - @override - void initState() { - super.initState(); - if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); - } - @override Widget build(BuildContext context) { - return WebView( - initialUrl: widget.uri.toString(), - backgroundColor: widget.backgroundColor, - javascriptMode: JavascriptMode.unrestricted); + return InAppWebView( + initialOptions: InAppWebViewGroupOptions( + crossPlatform: InAppWebViewOptions(transparentBackground: true), + ), + initialUrlRequest: URLRequest(url: widget.uri), + androidOnPermissionRequest: (_, __, resources) async { + bool permissionGranted = await Permission.camera.status == PermissionStatus.granted; + if (!permissionGranted) { + permissionGranted = await Permission.camera.request().isGranted; + } + + return PermissionRequestResponse( + resources: resources, + action: permissionGranted + ? PermissionRequestResponseAction.GRANT + : PermissionRequestResponseAction.DENY, + ); + }, + ); } } diff --git a/lib/src/screens/contact/contact_list_page.dart b/lib/src/screens/contact/contact_list_page.dart index 7cd7a0157..0065b9281 100644 --- a/lib/src/screens/contact/contact_list_page.dart +++ b/lib/src/screens/contact/contact_list_page.dart @@ -72,10 +72,10 @@ class ContactListPage extends BasePage { dividerThemeColor: Theme.of(context).primaryTextTheme.caption!.decorationColor!, sectionTitleBuilder: (_, int sectionIndex) { - var title = 'Contacts'; + var title = S.current.contact_list_contacts; if (sectionIndex == 0) { - title = 'My wallets'; + title = S.current.contact_list_wallets; } return Container( diff --git a/lib/src/screens/dashboard/widgets/address_page.dart b/lib/src/screens/dashboard/widgets/address_page.dart index 9183ad156..f9c157f00 100644 --- a/lib/src/screens/dashboard/widgets/address_page.dart +++ b/lib/src/screens/dashboard/widgets/address_page.dart @@ -1,10 +1,8 @@ import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; -import 'package:cake_wallet/src/widgets/primary_button.dart'; -import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/themes/theme_base.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:flutter/material.dart'; @@ -15,7 +13,6 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:keyboard_actions/keyboard_actions.dart'; import 'package:mobx/mobx.dart'; -import 'package:share_plus/share_plus.dart'; class AddressPage extends BasePage { AddressPage({ @@ -84,7 +81,12 @@ class AddressPage extends BasePage { highlightColor: Colors.transparent, splashColor: Colors.transparent, iconSize: 25, - onPressed: () => Share.share(addressListViewModel.address.address), + onPressed: () { + ShareUtil.share( + text: addressListViewModel.address.address, + context: context, + ); + }, icon: shareImage, ), ) : null; diff --git a/lib/src/screens/dashboard/widgets/filter_tile.dart b/lib/src/screens/dashboard/widgets/filter_tile.dart index 9a5646ac9..3be96073a 100644 --- a/lib/src/screens/dashboard/widgets/filter_tile.dart +++ b/lib/src/screens/dashboard/widgets/filter_tile.dart @@ -9,12 +9,7 @@ class FilterTile extends StatelessWidget { Widget build(BuildContext context) { return Container( width: double.infinity, - padding: EdgeInsets.only( - top: 18, - bottom: 18, - left: 24, - right: 24 - ), + padding: EdgeInsets.symmetric(vertical: 8.0, horizontal: 24.0), child: child, ); } diff --git a/lib/src/screens/dashboard/widgets/filter_widget.dart b/lib/src/screens/dashboard/widgets/filter_widget.dart index 98d5add81..17df0bc5e 100644 --- a/lib/src/screens/dashboard/widgets/filter_widget.dart +++ b/lib/src/screens/dashboard/widgets/filter_widget.dart @@ -1,25 +1,26 @@ import 'dart:ui'; import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/filter_tile.dart'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; +import 'package:cake_wallet/src/widgets/standard_checkbox.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/alert_background.dart'; import 'package:cake_wallet/src/widgets/alert_close_button.dart'; -import 'package:cake_wallet/src/widgets/checkbox_widget.dart'; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; //import 'package:date_range_picker/date_range_picker.dart' as date_rage_picker; class FilterWidget extends StatelessWidget { FilterWidget({required this.dashboardViewModel}); final DashboardViewModel dashboardViewModel; - final backVector = Image.asset('assets/images/back_vector.png', - color: Palette.darkBlueCraiola - ); + final closeIcon = Image.asset('assets/images/close.png', color: Palette.darkBlueCraiola); @override Widget build(BuildContext context) { + const sectionDivider = const SectionDivider(); return AlertBackground( child: Stack( alignment: Alignment.center, @@ -27,129 +28,82 @@ class FilterWidget extends StatelessWidget { Column( mainAxisSize: MainAxisSize.min, children: [ - Text( - S.of(context).filters, - style: TextStyle( - color: Colors.white, - fontSize: 18, - fontWeight: FontWeight.bold, - fontFamily: 'Lato', - decoration: TextDecoration.none, - ), - ), Padding( - padding: EdgeInsets.only( - left: 24, - right: 24, - top: 24 - ), + padding: EdgeInsets.only(left: 24, right: 24, top: 24), child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(14)), + borderRadius: BorderRadius.all(Radius.circular(24)), child: Container( color: Theme.of(context).textTheme!.bodyText1!.decorationColor!, - child: ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: dashboardViewModel.filterItems.length, - separatorBuilder: (context, _) => Container( - height: 1, - color: Theme.of(context).accentTextTheme!.subtitle1!.backgroundColor!, + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Padding( + padding: EdgeInsets.all(24.0), + child: Text( + S.of(context).filter_by, + style: TextStyle( + color: Theme.of(context).primaryTextTheme.overline!.color!, + fontSize: 16, + fontFamily: 'Lato', + decoration: TextDecoration.none, + ), + ), ), - itemBuilder: (_, index1) { - final title = dashboardViewModel.filterItems.keys.elementAt(index1); - final section = dashboardViewModel.filterItems.values.elementAt(index1); - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.only( - top: 20, - left: 24, - right: 24 - ), - child: Text( - title, - style: TextStyle( - color: Theme.of(context).accentTextTheme!.subtitle1!.color!, - fontSize: 16, - fontWeight: FontWeight.w500, - fontFamily: 'Lato', - decoration: TextDecoration.none + sectionDivider, + ListView.separated( + padding: EdgeInsets.zero, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: dashboardViewModel.filterItems.length, + separatorBuilder: (context, _) => sectionDivider, + itemBuilder: (_, index1) { + final title = dashboardViewModel.filterItems.keys.elementAt(index1); + final section = dashboardViewModel.filterItems.values.elementAt(index1); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: 20, left: 24, right: 24), + child: Text( + title, + style: TextStyle( + color: Theme.of(context).primaryTextTheme!.headline6!.color!, + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none), ), ), - ), - ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: section.length, - separatorBuilder: (context, _) => Container( - height: 1, - padding: EdgeInsets.only(left: 24), - color: Theme.of(context).textTheme!.bodyText1!.decorationColor!, - child: Container( - height: 1, - color: Theme.of(context).accentTextTheme!.subtitle1!.backgroundColor!, - ), - ), - itemBuilder: (_, index2) { - - final item = section[index2]; - final content = item.onChanged != null - ? CheckboxWidget( - value: item.value(), - caption: item.caption, - onChanged: item.onChanged - ) - : GestureDetector( - onTap: () async { - //final List picked = - //await date_rage_picker.showDatePicker( - // context: context, - // initialFirstDate: DateTime.now() - // .subtract(Duration(days: 1)), - // initialLastDate: (DateTime.now()), - // firstDate: DateTime(2015), - // lastDate: DateTime.now() - // .add(Duration(days: 1))); - - //if (picked != null && picked.length == 2) { - // dashboardViewModel.transactionFilterStore - // .changeStartDate(picked.first); - // dashboardViewModel.transactionFilterStore - // .changeEndDate(picked.last); - //} - }, - child: Padding( - padding: EdgeInsets.only(left: 32), - child: Text( - item.caption, - style: TextStyle( - color: Theme.of(context).primaryTextTheme!.headline6!.color!, - fontSize: 18, - fontFamily: 'Lato', - fontWeight: FontWeight.w500, - decoration: TextDecoration.none - ), - ), - ), - ); - - return FilterTile(child: content); - }, - ) - ], - ); - }, - ), + ListView.builder( + padding: EdgeInsets.symmetric(vertical: 8.0), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: section.length, + itemBuilder: (_, index2) { + final item = section[index2]; + final content = Observer( + builder: (_) => StandardCheckbox( + value: item.value(), + caption: item.caption, + gradientBackground: true, + borderColor: Theme.of(context).dividerColor, + iconColor: Colors.white, + onChanged: (value) => item.onChanged(), + )); + return FilterTile(child: content); + }, + ) + ], + ); + }, + ), + ]), ), ), ), ], ), - AlertCloseButton(image: backVector) + AlertCloseButton(image: closeIcon) ], ), ); } -} \ No newline at end of file +} diff --git a/lib/src/screens/dashboard/widgets/market_place_page.dart b/lib/src/screens/dashboard/widgets/market_place_page.dart index a64a132ad..9ac225634 100644 --- a/lib/src/screens/dashboard/widgets/market_place_page.dart +++ b/lib/src/screens/dashboard/widgets/market_place_page.dart @@ -6,6 +6,7 @@ import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/generated/i18n.dart'; +import 'package:url_launcher/url_launcher.dart'; class MarketPlacePage extends StatelessWidget { @@ -48,6 +49,15 @@ class MarketPlacePage extends StatelessWidget { title: S.of(context).cake_pay_title, subTitle: S.of(context).cake_pay_subtitle, ), + SizedBox(height: 20), + MarketPlaceItem( + onTap: () => launchUrl( + Uri.https("buy.cakepay.com"), + mode: LaunchMode.externalApplication, + ), + title: S.of(context).cake_pay_web_cards_title, + subTitle: S.of(context).cake_pay_web_cards_subtitle, + ), ], ), ), @@ -72,7 +82,7 @@ class MarketPlacePage extends StatelessWidget { buttonAction: () => Navigator.of(context).pop()); }); break; - default: + default: Navigator.of(context).pushNamed(Routes.ioniaWelcomePage); } } diff --git a/lib/src/screens/dashboard/widgets/transaction_raw.dart b/lib/src/screens/dashboard/widgets/transaction_raw.dart index 7ba6cbf0e..b7d8cef93 100644 --- a/lib/src/screens/dashboard/widgets/transaction_raw.dart +++ b/lib/src/screens/dashboard/widgets/transaction_raw.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:cw_core/transaction_direction.dart'; -import 'package:cake_wallet/generated/i18n.dart'; class TransactionRow extends StatelessWidget { TransactionRow( @@ -9,6 +8,7 @@ class TransactionRow extends StatelessWidget { required this.formattedAmount, required this.formattedFiatAmount, required this.isPending, + required this.title, required this.onTap}); final VoidCallback onTap; @@ -17,6 +17,7 @@ class TransactionRow extends StatelessWidget { final String formattedAmount; final String formattedFiatAmount; final bool isPending; + final String title; @override Widget build(BuildContext context) { @@ -49,11 +50,7 @@ class TransactionRow extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - (direction == TransactionDirection.incoming - ? S.of(context).received - : S.of(context).sent) + - (isPending ? S.of(context).pending : ''), + Text(title, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, diff --git a/lib/src/screens/dashboard/widgets/transactions_page.dart b/lib/src/screens/dashboard/widgets/transactions_page.dart index 89149b3de..4abe2f6fe 100644 --- a/lib/src/screens/dashboard/widgets/transactions_page.dart +++ b/lib/src/screens/dashboard/widgets/transactions_page.dart @@ -61,7 +61,8 @@ class TransactionsPage extends StatelessWidget { formattedFiatAmount: dashboardViewModel.balanceViewModel.isFiatDisabled ? '' : item.formattedFiatAmount, - isPending: transaction.isPending)); + isPending: transaction.isPending, + title: item.formattedTitle + item.formattedStatus)); } if (item is TradeListItem) { diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 288d3d632..85deb4fc4 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -48,7 +48,6 @@ class ExchangePage extends BasePage { final ExchangeViewModel exchangeViewModel; final depositKey = GlobalKey(); final receiveKey = GlobalKey(); - final checkBoxKey = GlobalKey(); final _formKey = GlobalKey(); final _depositAmountFocus = FocusNode(); final _depositAddressFocus = FocusNode(); @@ -150,7 +149,6 @@ class ExchangePage extends BasePage { mainAxisAlignment: MainAxisAlignment.start, children: [ StandardCheckbox( - key: checkBoxKey, value: exchangeViewModel.isFixedRateMode, caption: S.of(context).fixed_rate, onChanged: (value) => @@ -452,12 +450,6 @@ class ExchangePage extends BasePage { } }); - reaction((_) => exchangeViewModel.isFixedRateMode, (bool value) { - if (checkBoxKey.currentState!.value != exchangeViewModel.isFixedRateMode) { - checkBoxKey.currentState!.value = exchangeViewModel.isFixedRateMode; - } - }); - depositAddressController.addListener( () => exchangeViewModel.depositAddress = depositAddressController.text); diff --git a/lib/src/screens/exchange/widgets/currency_picker.dart b/lib/src/screens/exchange/widgets/currency_picker.dart index ff20acd7e..b935fc812 100644 --- a/lib/src/screens/exchange/widgets/currency_picker.dart +++ b/lib/src/screens/exchange/widgets/currency_picker.dart @@ -55,7 +55,7 @@ class CurrencyPickerState extends State { .where((element) => (element.title.toLowerCase().contains(subString.toLowerCase())) || (element.tag != null ? element.tag!.toLowerCase().contains(subString.toLowerCase()) : false) || - (element.name != null ? element.name!.toLowerCase().contains(subString.toLowerCase()) : false)) + (element.fullName != null ? element.fullName!.toLowerCase().contains(subString.toLowerCase()) : false)) .toList(); return; } diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 7c9fc1be7..9eb17c762 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -8,7 +8,7 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/src/screens/exchange_trade/information_page.dart'; import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart'; -import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/widgets/list_row.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/exchange/exchange_trade_view_model.dart'; @@ -112,7 +112,7 @@ class ExchangeTradeState extends State { width: 16, color: Theme.of(context).primaryTextTheme!.overline!.color!); - _setEffects(context); + _setEffects(); return Container( child: ScrollableWithBottomSection( @@ -165,14 +165,7 @@ class ExchangeTradeState extends State { .color! ) ), - child: QrImage( - data: trade.inputAddress ?? fetchingLabel, - backgroundColor: Colors.transparent, - foregroundColor: Theme.of(context) - .accentTextTheme! - .subtitle2! - .color!, - ), + child: QrImage(data: trade.inputAddress ?? fetchingLabel), )))), Spacer(flex: 3) ]), @@ -194,7 +187,7 @@ class ExchangeTradeState extends State { final item = widget.exchangeTradeViewModel.items[index]; final value = item.data ?? fetchingLabel; - final content = StandartListRow( + final content = ListRow( title: item.title, value: value, valueFontSize: 14, @@ -241,7 +234,7 @@ class ExchangeTradeState extends State { ); } - void _setEffects(BuildContext context) { + void _setEffects() { if (_effectsInstalled) { return; } @@ -252,12 +245,12 @@ class ExchangeTradeState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( context: context, - builder: (BuildContext context) { + builder: (BuildContext popupContext) { return AlertWithOneAction( - alertTitle: S.of(context).error, + alertTitle: S.of(popupContext).error, alertContent: state.error, - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop()); + buttonText: S.of(popupContext).ok, + buttonAction: () => Navigator.of(popupContext).pop()); }); }); } @@ -266,118 +259,24 @@ class ExchangeTradeState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( context: context, - builder: (BuildContext context) { + builder: (BuildContext popupContext) { return ConfirmSendingAlert( - alertTitle: S.of(context).confirm_sending, - amount: S.of(context).send_amount, + alertTitle: S.of(popupContext).confirm_sending, + amount: S.of(popupContext).send_amount, amountValue: widget.exchangeTradeViewModel.sendViewModel .pendingTransaction!.amountFormatted, - fee: S.of(context).send_fee, + fee: S.of(popupContext).send_fee, feeValue: widget.exchangeTradeViewModel.sendViewModel .pendingTransaction!.feeFormatted, - rightButtonText: S.of(context).ok, - leftButtonText: S.of(context).cancel, + rightButtonText: S.of(popupContext).ok, + leftButtonText: S.of(popupContext).cancel, actionRightButton: () async { - Navigator.of(context).pop(); + Navigator.of(popupContext).pop(); await widget.exchangeTradeViewModel.sendViewModel .commitTransaction(); - await showPopUp( - context: context, - builder: (BuildContext context) { - return Observer(builder: (_) { - final state = widget - .exchangeTradeViewModel.sendViewModel.state; - - if (state is TransactionCommitted) { - return Stack( - children: [ - Container( - color: Theme.of(context).backgroundColor, - child: Center( - child: Image.asset( - 'assets/images/birthday_cake.png'), - ), - ), - Center( - child: Padding( - padding: EdgeInsets.only( - top: 220, left: 24, right: 24), - child: Text( - S.of(context).send_success(widget - .exchangeTradeViewModel - .wallet - .currency - .toString()), - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.bold, - color: Theme.of(context) - .primaryTextTheme! - .headline6! - .color, - decoration: TextDecoration.none, - ), - ), - ), - ), - Positioned( - left: 24, - right: 24, - bottom: 24, - child: PrimaryButton( - onPressed: () => - Navigator.of(context).pop(), - text: S.of(context).send_got_it, - color: Theme.of(context) - .accentTextTheme! - .bodyText1! - .color!, - textColor: Colors.white)) - ], - ); - } - - return Stack( - children: [ - Container( - color: Theme.of(context).backgroundColor, - child: Center( - child: Image.asset( - 'assets/images/birthday_cake.png'), - ), - ), - BackdropFilter( - filter: ImageFilter.blur( - sigmaX: 3.0, sigmaY: 3.0), - child: Container( - decoration: BoxDecoration( - color: Theme.of(context) - .backgroundColor - .withOpacity(0.25)), - child: Center( - child: Padding( - padding: EdgeInsets.only(top: 220), - child: Text( - S.of(context).send_sending, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.bold, - color: Theme.of(context).primaryTextTheme!.headline6!.color!, - decoration: TextDecoration.none, - ), - ), - ), - ), - ), - ) - ], - ); - }); - }); + transactionStatePopup(); }, - actionLeftButton: () => Navigator.of(context).pop(), + actionLeftButton: () => Navigator.of(popupContext).pop(), feeFiatAmount: widget.exchangeTradeViewModel .pendingTransactionFeeFiatAmountFormatted, fiatAmountValue: widget.exchangeTradeViewModel @@ -392,12 +291,12 @@ class ExchangeTradeState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( context: context, - builder: (BuildContext context) { + builder: (BuildContext popupContext) { return AlertWithOneAction( - alertTitle: S.of(context).sending, - alertContent: S.of(context).transaction_sent, - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop()); + alertTitle: S.of(popupContext).sending, + alertContent: S.of(popupContext).transaction_sent, + buttonText: S.of(popupContext).ok, + buttonAction: () => Navigator.of(popupContext).pop()); }); }); } @@ -405,4 +304,102 @@ class ExchangeTradeState extends State { _effectsInstalled = true; } + + void transactionStatePopup() { + showPopUp( + context: context, + builder: (BuildContext popupContext) { + return Observer(builder: (_) { + final state = widget + .exchangeTradeViewModel.sendViewModel.state; + + if (state is TransactionCommitted) { + return Stack( + children: [ + Container( + color: Theme.of(popupContext).backgroundColor, + child: Center( + child: Image.asset( + 'assets/images/birthday_cake.png'), + ), + ), + Center( + child: Padding( + padding: EdgeInsets.only( + top: 220, left: 24, right: 24), + child: Text( + S.of(popupContext).send_success(widget + .exchangeTradeViewModel + .wallet + .currency + .toString()), + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Theme.of(popupContext) + .primaryTextTheme! + .headline6! + .color, + decoration: TextDecoration.none, + ), + ), + ), + ), + Positioned( + left: 24, + right: 24, + bottom: 24, + child: PrimaryButton( + onPressed: () => + Navigator.of(popupContext).pop(), + text: S.of(popupContext).send_got_it, + color: Theme.of(popupContext) + .accentTextTheme! + .bodyText1! + .color!, + textColor: Colors.white)) + ], + ); + } + + return Stack( + children: [ + Container( + color: Theme.of(popupContext).backgroundColor, + child: Center( + child: Image.asset( + 'assets/images/birthday_cake.png'), + ), + ), + BackdropFilter( + filter: ImageFilter.blur( + sigmaX: 3.0, sigmaY: 3.0), + child: Container( + decoration: BoxDecoration( + color: Theme.of(popupContext) + .backgroundColor + .withOpacity(0.25)), + child: Center( + child: Padding( + padding: EdgeInsets.only(top: 220), + child: Text( + S.of(popupContext).send_sending, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Theme.of(popupContext).primaryTextTheme!.headline6!.color!, + decoration: TextDecoration.none, + ), + ), + ), + ), + ), + ) + ], + ); + }); + }); + } } diff --git a/lib/src/screens/ionia/auth/ionia_create_account_page.dart b/lib/src/screens/ionia/auth/ionia_create_account_page.dart index 7f45acb82..abdf3501c 100644 --- a/lib/src/screens/ionia/auth/ionia_create_account_page.dart +++ b/lib/src/screens/ionia/auth/ionia_create_account_page.dart @@ -32,8 +32,8 @@ class IoniaCreateAccountPage extends BasePage { final FocusNode _emailFocus; final TextEditingController _emailController; - static const privacyPolicyUrl = 'https://ionia.docsend.com/view/jaqsmbq9w7dzvnqf'; - static const termsAndConditionsUrl = 'https://ionia.docsend.com/view/hi9awnwxr6mqgiqj'; + static const privacyPolicyUrl = 'https://ionia.docsend.com/view/jhjvdn7qq7k3ukwt'; + static const termsAndConditionsUrl = 'https://ionia.docsend.com/view/uceirymz2ijacq5g'; @override Widget middle(BuildContext context) { diff --git a/lib/src/screens/ionia/cards/ionia_gift_card_detail_page.dart b/lib/src/screens/ionia/cards/ionia_gift_card_detail_page.dart index 5b3c980ec..0b7a479e0 100644 --- a/lib/src/screens/ionia/cards/ionia_gift_card_detail_page.dart +++ b/lib/src/screens/ionia/cards/ionia_gift_card_detail_page.dart @@ -11,6 +11,7 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/typography.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:cake_wallet/utils/route_aware.dart'; import 'package:cake_wallet/view_model/ionia/ionia_gift_card_details_view_model.dart'; import 'package:device_display_brightness/device_display_brightness.dart'; import 'package:flutter/material.dart'; @@ -47,10 +48,7 @@ class IoniaGiftCardDetailPage extends BasePage { //highlightColor: Colors.transparent, //splashColor: Colors.transparent, //padding: EdgeInsets.all(0), - onPressed: () { - onClose(context); - DeviceDisplayBrightness.setBrightness(viewModel.brightness); - }, + onPressed: ()=> onClose(context), child: _backButton), ), ), @@ -68,7 +66,6 @@ class IoniaGiftCardDetailPage extends BasePage { @override Widget body(BuildContext context) { - viewModel.increaseBrightness(); reaction((_) => viewModel.redeemState, (ExecutionState state) { if (state is FailureState) { WidgetsBinding.instance.addPostFrameCallback((_) { @@ -85,7 +82,12 @@ class IoniaGiftCardDetailPage extends BasePage { } }); - return ScrollableWithBottomSection( + return RouteAwareWidget( + pushToWidget: ()=> viewModel.increaseBrightness(), + pushToNextWidget: ()=> DeviceDisplayBrightness.setBrightness(viewModel.brightness), + popNextWidget: ()=> viewModel.increaseBrightness(), + popWidget: ()=> DeviceDisplayBrightness.setBrightness(viewModel.brightness), + child: ScrollableWithBottomSection( contentPadding: EdgeInsets.all(24), content: Column( children: [ @@ -164,7 +166,7 @@ class IoniaGiftCardDetailPage extends BasePage { }, ), ), - ); + )); } Widget buildIoniaTile(BuildContext context, {required String title, required String subTitle}) { diff --git a/lib/src/screens/ionia/cards/ionia_payment_status_page.dart b/lib/src/screens/ionia/cards/ionia_payment_status_page.dart index e02a3cee8..4096560db 100644 --- a/lib/src/screens/ionia/cards/ionia_payment_status_page.dart +++ b/lib/src/screens/ionia/cards/ionia_payment_status_page.dart @@ -157,7 +157,8 @@ class _IoniaPaymentStatusPageBodyBodyState extends State<_IoniaPaymentStatusPage Container( padding: EdgeInsets.only(left: 40, right: 40, bottom: 20), child: Text( - S.of(context).proceed_after_one_minute, + widget.viewModel.payingByBitcoin ? S.of(context).bitcoin_payments_require_1_confirmation + : S.of(context).proceed_after_one_minute, style: textMedium( color: Theme.of(context).primaryTextTheme!.headline6!.color!, ).copyWith(fontWeight: FontWeight.w500), diff --git a/lib/src/screens/monero_accounts/monero_account_list_page.dart b/lib/src/screens/monero_accounts/monero_account_list_page.dart index 99134369e..7fe15948f 100644 --- a/lib/src/screens/monero_accounts/monero_account_list_page.dart +++ b/lib/src/screens/monero_accounts/monero_account_list_page.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -84,10 +85,7 @@ class MoneroAccountListPage extends StatelessWidget { padding: EdgeInsets.zero, controller: controller, separatorBuilder: (context, index) => - Container( - height: 1, - color: Theme.of(context).dividerColor, - ), + const SectionDivider(), itemCount: accounts.length ?? 0, itemBuilder: (context, index) { final account = accounts[index]; diff --git a/lib/src/screens/nodes/widgets/node_list_row.dart b/lib/src/screens/nodes/widgets/node_list_row.dart index 580aba170..90bb3eba1 100644 --- a/lib/src/screens/nodes/widgets/node_list_row.dart +++ b/lib/src/screens/nodes/widgets/node_list_row.dart @@ -1,9 +1,5 @@ -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/src/screens/nodes/widgets/node_indicator.dart'; -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class NodeListRow extends StandardListRow { @@ -23,7 +19,7 @@ class NodeListRow extends StandardListRow { builder: (context, snapshot) { switch (snapshot.connectionState) { case ConnectionState.done: - return NodeIndicator(isLive: (snapshot.data as bool)??false); + return NodeIndicator(isLive: (snapshot.data as bool?) ?? false); default: return NodeIndicator(isLive: false); } @@ -40,7 +36,7 @@ class NodeHeaderListRow extends StandardListRow { return SizedBox( width: 20, child: Icon(Icons.add, - color: Theme.of(context).accentTextTheme!.subtitle1!.color!, size: 24.0), + color: Theme.of(context).accentTextTheme.subtitle1?.color, size: 24.0), ); } } diff --git a/lib/src/screens/order_details/order_details_page.dart b/lib/src/screens/order_details/order_details_page.dart index 2e6ece509..0784c7008 100644 --- a/lib/src/screens/order_details/order_details_page.dart +++ b/lib/src/screens/order_details/order_details_page.dart @@ -7,7 +7,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/widgets/list_row.dart'; import 'package:cake_wallet/src/screens/trade_details/track_trade_list_item.dart'; class OrderDetailsPage extends BasePage { @@ -57,7 +57,7 @@ class OrderDetailsPageBodyState extends State { if (item is TrackTradeListItem) { return GestureDetector( onTap: item.onTap, - child: StandartListRow( + child: ListRow( title: '${item.title}', value: '${item.value}')); } else { return GestureDetector( @@ -65,7 +65,7 @@ class OrderDetailsPageBodyState extends State { Clipboard.setData(ClipboardData(text: '${item.value}')); showBar(context, S.of(context).copied_to_clipboard); }, - child: StandartListRow( + child: ListRow( title: '${item.title}', value: '${item.value}')); } }); diff --git a/lib/src/screens/receive/fullscreen_qr_page.dart b/lib/src/screens/receive/fullscreen_qr_page.dart index 165adff12..0966c8ac8 100644 --- a/lib/src/screens/receive/fullscreen_qr_page.dart +++ b/lib/src/screens/receive/fullscreen_qr_page.dart @@ -1,7 +1,6 @@ import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; class FullscreenQRPage extends BasePage { @@ -69,14 +68,10 @@ class FullscreenQRPage extends BasePage { child: AspectRatio( aspectRatio: 1.0, child: Container( - padding: EdgeInsets.all(5), + padding: EdgeInsets.all(10), decoration: BoxDecoration( border: Border.all(width: 3, color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!)), - child: QrImage( - data: qrData, - backgroundColor: isLight ? Colors.transparent : Colors.black, - foregroundColor: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!, - ), + child: QrImage(data: qrData), ), ), ), diff --git a/lib/src/screens/receive/receive_page.dart b/lib/src/screens/receive/receive_page.dart index 6f6b4e31c..4a573b2e1 100644 --- a/lib/src/screens/receive/receive_page.dart +++ b/lib/src/screens/receive/receive_page.dart @@ -1,12 +1,11 @@ import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:cake_wallet/themes/theme_base.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:share_plus/share_plus.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/di.dart'; @@ -100,7 +99,12 @@ class ReceivePage extends BasePage { highlightColor: Colors.transparent, splashColor: Colors.transparent, iconSize: 25, - onPressed: () => Share.share(addressListViewModel.address.address), + onPressed: () { + ShareUtil.share( + text: addressListViewModel.address.address, + context: context, + ); + }, icon: shareImage ) ); @@ -135,8 +139,7 @@ class ReceivePage extends BasePage { Observer( builder: (_) => ListView.separated( padding: EdgeInsets.all(0), - separatorBuilder: (context, _) => Container( - height: 1, color: Theme.of(context).dividerColor), + separatorBuilder: (context, _) => const SectionDivider(), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: addressListViewModel.items.length, diff --git a/lib/src/screens/receive/widgets/qr_image.dart b/lib/src/screens/receive/widgets/qr_image.dart index c0c1b0666..6e17dbcfc 100644 --- a/lib/src/screens/receive/widgets/qr_image.dart +++ b/lib/src/screens/receive/widgets/qr_image.dart @@ -1,30 +1,29 @@ import 'package:flutter/material.dart'; -import 'package:qr/qr.dart'; -import 'package:cake_wallet/src/screens/receive/widgets/qr_painter.dart'; +import 'package:qr_flutter/qr_flutter.dart' as qr; class QrImage extends StatelessWidget { QrImage({ - required String data, + required this.data, this.size = 100.0, - this.backgroundColor, - Color foregroundColor = Colors.black, - int version = 9, // Previous value: 7 something happened after flutter upgrade monero wallets addresses are longer than ver. 7 ??? - int errorCorrectionLevel = QrErrorCorrectLevel.L, - }) : _painter = QrPainter(data, foregroundColor, version, errorCorrectionLevel); + this.version = 9, // Previous value: 7 something happened after flutter upgrade monero wallets addresses are longer than ver. 7 ??? + this.errorCorrectionLevel = qr.QrErrorCorrectLevel.L, + }); - final QrPainter _painter; - final Color? backgroundColor; final double size; + final String data; + final int version; + final int errorCorrectionLevel; @override Widget build(BuildContext context) { - return Container( - width: size, - height: size, - color: backgroundColor, - child: CustomPaint( - painter: _painter, - ), + return qr.QrImage( + data: data, + errorCorrectionLevel: errorCorrectionLevel, + version: version, + size: size, + foregroundColor: Colors.black, + backgroundColor: Colors.white, + padding: EdgeInsets.zero, ); } -} \ No newline at end of file +} diff --git a/lib/src/screens/receive/widgets/qr_painter.dart b/lib/src/screens/receive/widgets/qr_painter.dart deleted file mode 100644 index e4af59f1a..000000000 --- a/lib/src/screens/receive/widgets/qr_painter.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:qr/qr.dart'; - -class QrPainter extends CustomPainter { - QrPainter( - String data, - this.color, - this.version, - this.errorCorrectionLevel, - ) : this._qr = QrCode(version, errorCorrectionLevel)..addData(data) { - _p.color = this.color; - _qrImage = QrImage(_qr); - } - - final int version; - final int errorCorrectionLevel; - final Color color; - - final QrCode _qr; - final _p = Paint()..style = PaintingStyle.fill; - late QrImage _qrImage; - - @override - void paint(Canvas canvas, Size size) { - final squareSize = size.shortestSide / _qr.moduleCount; - for (int x = 0; x < _qr.moduleCount; x++) { - for (int y = 0; y < _qr.moduleCount; y++) { - if (_qrImage.isDark(y, x)) { - final squareRect = Rect.fromLTWH( - x * squareSize, y * squareSize, squareSize, squareSize); - canvas.drawRect(squareRect, _p); - } - } - } - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) { - if (oldDelegate is QrPainter) { - return this.color != oldDelegate.color || - this.errorCorrectionLevel != oldDelegate.errorCorrectionLevel || - this.version != oldDelegate.version; - } - - return false; - } -} diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index 5640e7590..8597f9061 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -85,11 +85,7 @@ class QRWidget extends StatelessWidget { color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!, ), ), - child: QrImage( - data: addressListViewModel.uri.toString(), - backgroundColor: isLight ? Colors.transparent : Colors.black, - foregroundColor: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!, - ), + child: QrImage(data: addressListViewModel.uri.toString()), ), ), ), diff --git a/lib/src/screens/seed/wallet_seed_page.dart b/lib/src/screens/seed/wallet_seed_page.dart index 97969f95b..034ab832c 100644 --- a/lib/src/screens/seed/wallet_seed_page.dart +++ b/lib/src/screens/seed/wallet_seed_page.dart @@ -1,12 +1,12 @@ import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:share_plus/share_plus.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; @@ -22,9 +22,6 @@ class WalletSeedPage extends BasePage { @override String get title => S.current.seed_title; - @override - bool get canUseDesktopAppBar => false; - final bool isNewWalletCreated; final WalletSeedViewModel walletSeedViewModel; @@ -166,8 +163,12 @@ class WalletSeedPage extends BasePage { child: Container( padding: EdgeInsets.only(right: 8.0), child: PrimaryButton( - onPressed: () => - Share.share(walletSeedViewModel.seed), + onPressed: () { + ShareUtil.share( + text: walletSeedViewModel.seed, + context: context, + ); + }, text: S.of(context).save, color: Colors.green, textColor: Colors.white), diff --git a/lib/src/screens/send/widgets/choose_yat_address_alert.dart b/lib/src/screens/send/widgets/choose_yat_address_alert.dart index 93785743d..5d937a571 100644 --- a/lib/src/screens/send/widgets/choose_yat_address_alert.dart +++ b/lib/src/screens/send/widgets/choose_yat_address_alert.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/src/widgets/cake_scrollbar.dart'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/base_alert_dialog.dart'; @@ -70,10 +71,7 @@ class ChooseYatAddressButtonsState extends State { controller: controller, padding: EdgeInsets.all(0), itemCount: itemCount, - separatorBuilder: (_, __) => Container( - height: 1, - color: Theme.of(context).dividerColor, - ), + separatorBuilder: (_, __) => const SectionDivider(), itemBuilder: (context, index) { final address = addresses[index]; diff --git a/lib/src/screens/send/widgets/extract_address_from_parsed.dart b/lib/src/screens/send/widgets/extract_address_from_parsed.dart index 4ddd6ada0..a293835a3 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -19,13 +19,18 @@ Future extractAddressFromParsed( address = parsedAddress.addresses.first; break; case ParseFrom.openAlias: - title = S.of(context).openalias_alert_title; - content = S.of(context).openalias_alert_content(parsedAddress.name); + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (OpenAlias)'); address = parsedAddress.addresses.first; break; case ParseFrom.fio: title = S.of(context).address_detected; - content = S.of(context).openalias_alert_content(parsedAddress.name); + content = S.of(context).extracted_address_content('${parsedAddress.name} (FIO)'); + address = parsedAddress.addresses.first; + break; + case ParseFrom.twitter: + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (Twitter)'); address = parsedAddress.addresses.first; break; case ParseFrom.yatRecord: diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index 0e56d6e58..9d2ce3cda 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -2,6 +2,7 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arro import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/node.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -35,10 +36,11 @@ class ConnectionSyncPage extends BasePage { handler: (context) => _presentReconnectAlert(context), ), StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)), - SettingsCellWithArrow( - title: S.current.rescan, - handler: (context) => Navigator.of(context).pushNamed(Routes.rescan), - ), + if (dashboardViewModel.hasRescan) + SettingsCellWithArrow( + title: S.current.rescan, + handler: (context) => Navigator.of(context).pushNamed(Routes.rescan), + ), StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)), NodeHeaderListRow( title: S.of(context).add_new_node, @@ -73,7 +75,7 @@ class ConnectionSyncPage extends BasePage { builder: (BuildContext context) { return AlertWithTwoActions( alertTitle: S.of(context).change_current_node_title, - alertContent: S.of(context).change_current_node(node.uriRaw), + alertContent: nodeListViewModel.getAlertContent(node.uriRaw), leftButtonText: S.of(context).cancel, rightButtonText: S.of(context).change, actionLeftButton: () => Navigator.of(context).pop(), diff --git a/lib/src/screens/settings/widgets/settings_picker_cell.dart b/lib/src/screens/settings/widgets/settings_picker_cell.dart index 1da2d6fc1..8dd5c8c2c 100644 --- a/lib/src/screens/settings/widgets/settings_picker_cell.dart +++ b/lib/src/screens/settings/widgets/settings_picker_cell.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; -class SettingsPickerCell extends StandardListRow { +class SettingsPickerCell extends StandardListRow { SettingsPickerCell( {required String title, required this.selectedItem, diff --git a/lib/src/screens/settings/widgets/settings_switcher_cell.dart b/lib/src/screens/settings/widgets/settings_switcher_cell.dart index fc99f3297..c1d7fa150 100644 --- a/lib/src/screens/settings/widgets/settings_switcher_cell.dart +++ b/lib/src/screens/settings/widgets/settings_switcher_cell.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; -import 'package:cake_wallet/src/widgets/standart_switch.dart'; +import 'package:cake_wallet/src/widgets/standard_switch.dart'; class SettingsSwitcherCell extends StandardListRow { SettingsSwitcherCell( @@ -11,6 +11,6 @@ class SettingsSwitcherCell extends StandardListRow { final void Function(BuildContext context, bool value)? onValueChange; @override - Widget buildTrailing(BuildContext context) => StandartSwitch( + Widget buildTrailing(BuildContext context) => StandardSwitch( value: value, onTaped: () => onValueChange?.call(context, !value)); } diff --git a/lib/src/screens/subaddress/address_edit_or_create_page.dart b/lib/src/screens/subaddress/address_edit_or_create_page.dart index dac9e3881..b7394182c 100644 --- a/lib/src/screens/subaddress/address_edit_or_create_page.dart +++ b/lib/src/screens/subaddress/address_edit_or_create_page.dart @@ -17,8 +17,6 @@ class AddressEditOrCreatePage extends BasePage { _labelController.addListener( () => addressEditOrCreateViewModel.label = _labelController.text); _labelController.text = addressEditOrCreateViewModel.label; - print(_labelController.text); - print(addressEditOrCreateViewModel.label); } final WalletAddressEditOrCreateViewModel addressEditOrCreateViewModel; diff --git a/lib/src/screens/trade_details/trade_details_page.dart b/lib/src/screens/trade_details/trade_details_page.dart index 500d16beb..1958a7d58 100644 --- a/lib/src/screens/trade_details/trade_details_page.dart +++ b/lib/src/screens/trade_details/trade_details_page.dart @@ -1,6 +1,6 @@ import 'package:cake_wallet/src/widgets/standard_list.dart'; -import 'package:cake_wallet/src/widgets/standart_list_card.dart'; -import 'package:cake_wallet/src/widgets/standart_list_status_row.dart'; +import 'package:cake_wallet/src/widgets/standard_list_card.dart'; +import 'package:cake_wallet/src/widgets/standard_list_status_row.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/view_model/trade_details_view_model.dart'; import 'package:flutter/material.dart'; @@ -9,7 +9,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/widgets/list_row.dart'; import 'package:cake_wallet/src/screens/trade_details/track_trade_list_item.dart'; import 'package:cake_wallet/src/screens/trade_details/trade_details_list_card.dart'; import 'package:cake_wallet/src/screens/trade_details/trade_details_status_item.dart'; @@ -62,18 +62,18 @@ class TradeDetailsPageBodyState extends State { if (item is TrackTradeListItem) { return GestureDetector( onTap: item.onTap, - child: StandartListRow( + child: ListRow( title: '${item.title}', value: '${item.value}')); } if (item is DetailsListStatusItem) { - return StandartListStatusRow( + return StandardListStatusRow( title: item.title, value: item.value); } if (item is TradeDetailsListCardItem) { - return TradeDatailsStandartListCard( + return TradeDetailsStandardListCard( id: item.id, create: item.createdAt, pair: item.pair, @@ -86,7 +86,7 @@ class TradeDetailsPageBodyState extends State { Clipboard.setData(ClipboardData(text: '${item.value}')); showBar(context, S.of(context).copied_to_clipboard); }, - child: StandartListRow( + child: ListRow( title: '${item.title}', value: '${item.value}')); }); }); diff --git a/lib/src/screens/transaction_details/transaction_details_page.dart b/lib/src/screens/transaction_details/transaction_details_page.dart index 098d65c23..1b79ceeb0 100644 --- a/lib/src/screens/transaction_details/transaction_details_page.dart +++ b/lib/src/screens/transaction_details/transaction_details_page.dart @@ -6,7 +6,7 @@ import 'package:cake_wallet/view_model/transaction_details_view_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/widgets/list_row.dart'; import 'package:cake_wallet/src/screens/transaction_details/blockexplorer_list_item.dart'; import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; @@ -42,7 +42,7 @@ class TransactionDetailsPage extends BasePage { S.of(context).transaction_details_copied(item.title)); }, child: - StandartListRow(title: '${item.title}:', value: item.value), + ListRow(title: '${item.title}:', value: item.value), ); } @@ -50,7 +50,7 @@ class TransactionDetailsPage extends BasePage { return GestureDetector( onTap: item.onTap, child: - StandartListRow(title: '${item.title}:', value: item.value), + ListRow(title: '${item.title}:', value: item.value), ); } diff --git a/lib/src/screens/unspent_coins/unspent_coins_details_page.dart b/lib/src/screens/unspent_coins/unspent_coins_details_page.dart index b1c4ff01b..d8ce24d88 100644 --- a/lib/src/screens/unspent_coins/unspent_coins_details_page.dart +++ b/lib/src/screens/unspent_coins/unspent_coins_details_page.dart @@ -5,7 +5,7 @@ import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_details_view_model.dart'; import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_switch_item.dart'; import 'package:flutter/material.dart'; -import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/widgets/list_row.dart'; import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -30,7 +30,7 @@ class UnspentCoinsDetailsPage extends BasePage { final item = unspentCoinsDetailsViewModel.items[index]; if (item is StandartListItem) { - return StandartListRow( + return ListRow( title: '${item.title}:', value: item.value); } diff --git a/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart b/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart index 6272469df..734aeb7ee 100644 --- a/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart +++ b/lib/src/screens/unspent_coins/widgets/unspent_coins_switch_row.dart @@ -1,4 +1,4 @@ -import 'package:cake_wallet/src/widgets/standart_switch.dart'; +import 'package:cake_wallet/src/widgets/standard_switch.dart'; import 'package:flutter/material.dart'; class UnspentCoinsSwitchRow extends StatelessWidget { @@ -33,7 +33,7 @@ class UnspentCoinsSwitchRow extends StatelessWidget { textAlign: TextAlign.left), Padding( padding: EdgeInsets.only(top: 12), - child: StandartSwitch( + child: StandardSwitch( value: switchValue, onTaped: () => onSwitchValueChange(!switchValue)) ) diff --git a/lib/src/screens/wallet_keys/wallet_keys_page.dart b/lib/src/screens/wallet_keys/wallet_keys_page.dart index 942809ac8..e81ec7d2a 100644 --- a/lib/src/screens/wallet_keys/wallet_keys_page.dart +++ b/lib/src/screens/wallet_keys/wallet_keys_page.dart @@ -1,4 +1,5 @@ import 'package:auto_size_text/auto_size_text.dart'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; @@ -6,7 +7,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/widgets/standart_list_row.dart'; +import 'package:cake_wallet/src/widgets/list_row.dart'; import 'package:cake_wallet/view_model/wallet_keys_view_model.dart'; class WalletKeysPage extends BasePage { @@ -57,10 +58,7 @@ class WalletKeysPage extends BasePage { height: 1, padding: EdgeInsets.only(left: 24), color: Theme.of(context).accentTextTheme!.headline6!.backgroundColor!, - child: Container( - height: 1, - color: Theme.of(context).dividerColor, - ), + child: const SectionDivider(), ), itemCount: walletKeysViewModel.items.length, itemBuilder: (BuildContext context, int index) { @@ -71,7 +69,7 @@ class WalletKeysPage extends BasePage { Clipboard.setData(ClipboardData(text: item.value)); showBar(context, S.of(context).copied_key_to_clipboard(item.title)); }, - child: StandartListRow( + child: ListRow( title: item.title + ':', value: item.value, ), diff --git a/lib/src/screens/wallet_list/wallet_menu.dart b/lib/src/screens/wallet_list/wallet_menu.dart deleted file mode 100644 index c354881a3..000000000 --- a/lib/src/screens/wallet_list/wallet_menu.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:cake_wallet/src/screens/wallet_list/wallet_menu_item.dart'; -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; -import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart'; -import 'package:flutter/material.dart'; -import 'package:cake_wallet/routes.dart'; -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; -import 'package:cake_wallet/src/screens/auth/auth_page.dart'; -import 'package:cake_wallet/palette.dart'; - -class WalletMenu { - WalletMenu(this.context, this.walletListViewModel); - - final WalletListViewModel walletListViewModel; - final BuildContext context; - - final List menuItems = [ - WalletMenuItem( - title: S.current.wallet_list_load_wallet, - firstGradientColor: Palette.cornflower, - secondGradientColor: Palette.royalBlue, - image: Image.asset('assets/images/load.png', - height: 24, width: 24, color: Colors.white)), - WalletMenuItem( - title: S.current.show_seed, - firstGradientColor: Palette.moderateOrangeYellow, - secondGradientColor: Palette.moderateOrange, - image: Image.asset('assets/images/eye_action.png', - height: 24, width: 24, color: Colors.white)), - WalletMenuItem( - title: S.current.remove, - firstGradientColor: Palette.lightRed, - secondGradientColor: Palette.persianRed, - image: Image.asset('assets/images/trash.png', - height: 24, width: 24, color: Colors.white)), - WalletMenuItem( - title: S.current.rescan, - firstGradientColor: Palette.shineGreen, - secondGradientColor: Palette.moderateGreen, - image: Image.asset('assets/images/scanner.png', - height: 24, width: 24, color: Colors.white)) - ]; - - List generateItemsForWalletMenu(bool isCurrentWallet) { - final items = []; - - if (!isCurrentWallet) items.add(menuItems[0]); - if (isCurrentWallet) items.add(menuItems[1]); - if (!isCurrentWallet) items.add(menuItems[2]); - if (isCurrentWallet) items.add(menuItems[3]); - - return items; - } - - Future action( - int index, WalletListItem wallet) async { - switch (index) { - case 0: - await Navigator.of(context).pushNamed(Routes.auth, arguments: - (bool isAuthenticatedSuccessfully, AuthPageState auth) async { - if (!isAuthenticatedSuccessfully) { - return; - } - - try { - auth.changeProcessText( - S.of(context).wallet_list_loading_wallet(wallet.name)); - await walletListViewModel.loadWallet(wallet); - auth.close(); - Navigator.of(context).pop(); - } catch (e) { - auth.changeProcessText(S - .of(context) - .wallet_list_failed_to_load(wallet.name, e.toString())); - } - }); - break; - case 1: - await Navigator.of(context).pushNamed(Routes.auth, arguments: - (bool isAuthenticatedSuccessfully, AuthPageState auth) async { - if (!isAuthenticatedSuccessfully) { - return; - } - auth.close(); - await Navigator.of(context).pushNamed(Routes.seed, arguments: false); - }); - break; - case 2: - final isComfirmed = await showPopUp( - context: context, - builder: (BuildContext context) { - return AlertWithTwoActions( - alertTitle: 'Remove wallet', - alertContent: S.of(context).confirm_delete_wallet, - leftButtonText: S.of(context).cancel, - rightButtonText: S.of(context).remove, - actionLeftButton: () => Navigator.of(context).pop(false), - actionRightButton: () => Navigator.of(context).pop(true)); - }); - - if (isComfirmed == null || !isComfirmed) { - return; - } - - await Navigator.of(context).pushNamed(Routes.auth, arguments: - (bool isAuthenticatedSuccessfully, AuthPageState auth) async { - if (!isAuthenticatedSuccessfully) { - return; - } - - try { - auth.changeProcessText( - S.of(context).wallet_list_removing_wallet(wallet.name)); - await walletListViewModel.remove(wallet); - auth.close(); - } catch (e) { - auth.changeProcessText(S - .of(context) - .wallet_list_failed_to_remove(wallet.name, e.toString())); - } - }); - break; - case 3: - await Navigator.of(context).pushNamed(Routes.rescan); - break; - default: - break; - } - } -} diff --git a/lib/src/screens/wallet_list/wallet_menu_item.dart b/lib/src/screens/wallet_list/wallet_menu_item.dart deleted file mode 100644 index 6d66a5f8d..000000000 --- a/lib/src/screens/wallet_list/wallet_menu_item.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'dart:ui'; -import 'package:flutter/cupertino.dart'; - -class WalletMenuItem { - WalletMenuItem({ - required this.title, - required this.firstGradientColor, - required this.secondGradientColor, - required this.image - }); - - final String title; - final Color firstGradientColor; - final Color secondGradientColor; - final Image image; -} \ No newline at end of file diff --git a/lib/src/screens/wallet_list/widgets/wallet_menu_alert.dart b/lib/src/screens/wallet_list/widgets/wallet_menu_alert.dart deleted file mode 100644 index 00dd3a2f5..000000000 --- a/lib/src/screens/wallet_list/widgets/wallet_menu_alert.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'dart:ui'; -import 'package:cake_wallet/palette.dart'; -import 'package:cake_wallet/src/screens/wallet_list/wallet_menu.dart'; -import 'package:cake_wallet/src/screens/wallet_list/wallet_menu_item.dart'; -import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:cake_wallet/src/widgets/alert_background.dart'; -import 'package:cake_wallet/src/widgets/alert_close_button.dart'; - -class WalletMenuAlert extends StatelessWidget { - WalletMenuAlert({ - required this.wallet, - required this.walletMenu, - required this.items - }); - - final WalletListItem wallet; - final WalletMenu walletMenu; - final List items; - final closeButton = Image.asset('assets/images/close.png', - color: Palette.darkBlueCraiola, - ); - - @override - Widget build(BuildContext context) { - return AlertBackground( - child: Stack( - alignment: Alignment.center, - children: [ - Padding( - padding: EdgeInsets.only( - left: 24, - right: 24, - ), - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(14)), - child: Container( - color: Theme.of(context).textTheme!.bodyText1!.decorationColor!, - padding: EdgeInsets.only(left: 24), - child: ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: items.length, - separatorBuilder: (context, _) => Container( - height: 1, - color: Theme.of(context).accentTextTheme!.subtitle1!.backgroundColor!, - ), - itemBuilder: (_, index) { - final item = items[index]; - - return GestureDetector( - onTap: () { - Navigator.of(context).pop(); - walletMenu.action( - walletMenu.menuItems.indexOf(item), - wallet); - }, - child: Container( - height: 60, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - height: 32, - width: 32, - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(4)), - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - item.firstGradientColor, - item.secondGradientColor - ] - ) - ), - child: Center( - child: item.image, - ), - ), - SizedBox(width: 12), - Expanded( - child: Text( - item.title, - style: TextStyle( - color: Theme.of(context).primaryTextTheme!.headline6!.color!, - fontSize: 18, - fontFamily: 'Lato', - fontWeight: FontWeight.w500, - decoration: TextDecoration.none - ), - ) - ) - ], - ), - ), - ); - }, - ), - ), - ), - ), - AlertCloseButton(image: closeButton) - ], - ), - ); - } -} \ No newline at end of file diff --git a/lib/src/widgets/base_alert_dialog.dart b/lib/src/widgets/base_alert_dialog.dart index 70370e227..effbbc562 100644 --- a/lib/src/widgets/base_alert_dialog.dart +++ b/lib/src/widgets/base_alert_dialog.dart @@ -1,4 +1,5 @@ import 'dart:ui'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/palette.dart'; @@ -76,10 +77,7 @@ class BaseAlertDialog extends StatelessWidget { ), )), ), - Container( - width: 1, - color: Theme.of(context).dividerColor, - ), + const SectionDivider(), Expanded( child: TextButton( onPressed: actionRight, @@ -140,10 +138,7 @@ class BaseAlertDialog extends StatelessWidget { isDividerExists ? Padding( padding: EdgeInsets.only(top: 16, bottom: 8), - child: Container( - height: 1, - color: Theme.of(context).dividerColor, - ), + child: const SectionDivider(), ) : Offstage(), Padding( @@ -152,10 +147,7 @@ class BaseAlertDialog extends StatelessWidget { ) ], ), - Container( - height: 1, - color: Theme.of(context).dividerColor, - ), + const SectionDivider(), actionButtons(context) ], ), diff --git a/lib/src/widgets/collapsible_standart_list.dart b/lib/src/widgets/collapsible_standart_list.dart index 1a4aef2bc..514308b45 100644 --- a/lib/src/widgets/collapsible_standart_list.dart +++ b/lib/src/widgets/collapsible_standart_list.dart @@ -48,6 +48,8 @@ class CollapsibleSectionList extends SectionStandardList { child: ListTileTheme( contentPadding: EdgeInsets.only(right: 16,top:sectionIndex>0?26:0), child: ExpansionTile( + textColor: themeColor, + iconColor: themeColor, title: sectionTitleBuilder == null ? Container() : Container(child: buildTitle(items, sectionIndex, context)), diff --git a/lib/src/widgets/standart_list_row.dart b/lib/src/widgets/list_row.dart similarity index 96% rename from lib/src/widgets/standart_list_row.dart rename to lib/src/widgets/list_row.dart index 94a4c4c76..40824fe59 100644 --- a/lib/src/widgets/standart_list_row.dart +++ b/lib/src/widgets/list_row.dart @@ -1,8 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -class StandartListRow extends StatelessWidget { - StandartListRow( +class ListRow extends StatelessWidget { + ListRow( {required this.title, required this.value, this.titleFontSize = 14, diff --git a/lib/src/widgets/picker.dart b/lib/src/widgets/picker.dart index edc87f971..ccf922d41 100644 --- a/lib/src/widgets/picker.dart +++ b/lib/src/widgets/picker.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/alert_background.dart'; import 'package:cake_wallet/src/widgets/alert_close_button.dart'; -class Picker extends StatefulWidget { +class Picker extends StatefulWidget { Picker({ required this.selectedAtIndex, required this.items, @@ -40,7 +40,7 @@ class Picker extends StatefulWidget { _PickerState createState() => _PickerState(items, images, onItemSelected); } -class _PickerState extends State { +class _PickerState extends State> { _PickerState(this.items, this.images, this.onItemSelected); final Function(Item) onItemSelected; @@ -60,7 +60,7 @@ class _PickerState extends State { images = []; for (int i=0;i extends State { child: Padding( padding: EdgeInsets.only(left: image != null ? 12 : 0), child: Text( - // What a hack (item as) ? - widget.displayItem?.call(item as Object) ?? item.toString(), + widget.displayItem?.call(item) ?? item.toString(), style: TextStyle( fontSize: 14, fontFamily: 'Lato', diff --git a/lib/src/widgets/section_divider.dart b/lib/src/widgets/section_divider.dart new file mode 100644 index 000000000..bef85f975 --- /dev/null +++ b/lib/src/widgets/section_divider.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +class SectionDivider extends StatelessWidget { + const SectionDivider(); + + @override + Widget build(BuildContext context) { + return Container( + height: 1, + color: Theme.of(context).dividerColor, + ); + } +} \ No newline at end of file diff --git a/lib/src/widgets/standard_checkbox.dart b/lib/src/widgets/standard_checkbox.dart index a59364fe1..d2cd6463d 100644 --- a/lib/src/widgets/standard_checkbox.dart +++ b/lib/src/widgets/standard_checkbox.dart @@ -2,42 +2,42 @@ import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -class StandardCheckbox extends StatefulWidget { - StandardCheckbox({ - Key? key, - required this.value, - this.caption = '', - required this.onChanged}) - : super(key: key); +class StandardCheckbox extends StatelessWidget { + StandardCheckbox( + {required this.value, + this.caption = '', + this.gradientBackground = false, + this.borderColor, + this.iconColor, + required this.onChanged}); final bool value; final String caption; + final bool gradientBackground; + final Color? borderColor; + final Color? iconColor; final Function(bool) onChanged; - @override - StandardCheckboxState createState() => - StandardCheckboxState(value, caption, onChanged); -} - -class StandardCheckboxState extends State { - StandardCheckboxState(this.value, this.caption, this.onChanged); - - bool value; - String caption; - Function(bool) onChanged; - - void changeValue(bool newValue) { - setState(() => value = newValue); - } - @override Widget build(BuildContext context) { + final baseGradient = LinearGradient(colors: [ + Theme.of(context).primaryTextTheme.subtitle1!.color!, + Theme.of(context).primaryTextTheme.subtitle1!.decorationColor!, + ], begin: Alignment.centerLeft, end: Alignment.centerRight); + + final boxBorder = Border.all( + color: borderColor ?? Theme.of(context).primaryTextTheme.caption!.color!, width: 1.0); + + final checkedBoxDecoration = BoxDecoration( + gradient: gradientBackground ? baseGradient : null, + border: gradientBackground ? null : boxBorder, + borderRadius: BorderRadius.all(Radius.circular(8.0))); + + final uncheckedBoxDecoration = + BoxDecoration(border: boxBorder, borderRadius: BorderRadius.all(Radius.circular(8.0))); + return GestureDetector( - onTap: () { - value = !value; - onChanged(value); - setState(() {}); - }, + onTap: () => onChanged(!value), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, @@ -45,38 +45,25 @@ class StandardCheckboxState extends State { Container( height: 24.0, width: 24.0, - decoration: BoxDecoration( - border: Border.all( - color: Theme.of(context) - .primaryTextTheme! - .caption! - .color!, - width: 1.0), - borderRadius: BorderRadius.all( - Radius.circular(8.0)), - color: Theme.of(context).backgroundColor), + decoration: value ? checkedBoxDecoration : uncheckedBoxDecoration, child: value - ? Icon( - Icons.check, - color: Colors.blue, - size: 20.0, - ) - : Offstage(), + ? Icon( + Icons.check, + color: iconColor ?? Colors.blue, + size: 20.0, + ) + : Offstage(), ), - if (caption.isNotEmpty) Padding( - padding: EdgeInsets.only(left: 10), - child: Text( - caption, - style: TextStyle( - fontSize: 16.0, - color: Theme.of(context) - .primaryTextTheme! - .headline6! - .color!), - ) - ) + if (caption.isNotEmpty) + Padding( + padding: EdgeInsets.only(left: 10), + child: Text( + caption, + style: TextStyle( + fontSize: 16.0, color: Theme.of(context).primaryTextTheme!.headline6!.color!), + )) ], ), ); } -} \ No newline at end of file +} diff --git a/lib/src/widgets/standard_list.dart b/lib/src/widgets/standard_list.dart index f5abdd900..680cf6edd 100644 --- a/lib/src/widgets/standard_list.dart +++ b/lib/src/widgets/standard_list.dart @@ -1,6 +1,6 @@ import 'package:cake_wallet/palette.dart'; -import 'package:cake_wallet/src/widgets/standart_list_card.dart'; -import 'package:cake_wallet/src/widgets/standart_list_status_row.dart'; +import 'package:cake_wallet/src/widgets/standard_list_card.dart'; +import 'package:cake_wallet/src/widgets/standard_list_status_row.dart'; import 'package:flutter/material.dart'; class StandardListRow extends StatelessWidget { @@ -217,7 +217,7 @@ class SectionStandardList extends StatelessWidget { return Container(); } - if (row is StandartListStatusRow || row is TradeDatailsStandartListCard) { + if (row is StandardListStatusRow || row is TradeDetailsStandardListCard) { return Container(); } diff --git a/lib/src/widgets/standart_list_card.dart b/lib/src/widgets/standard_list_card.dart similarity index 96% rename from lib/src/widgets/standart_list_card.dart rename to lib/src/widgets/standard_list_card.dart index 569a4e51f..7b2ecc2ce 100644 --- a/lib/src/widgets/standart_list_card.dart +++ b/lib/src/widgets/standard_list_card.dart @@ -2,8 +2,8 @@ import 'package:cake_wallet/palette.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/themes/theme_base.dart'; -class TradeDatailsStandartListCard extends StatelessWidget { - TradeDatailsStandartListCard( +class TradeDetailsStandardListCard extends StatelessWidget { + TradeDetailsStandardListCard( {required this.id, required this.create, required this.pair, diff --git a/lib/src/widgets/standart_list_status_row.dart b/lib/src/widgets/standard_list_status_row.dart similarity index 95% rename from lib/src/widgets/standart_list_status_row.dart rename to lib/src/widgets/standard_list_status_row.dart index d97c4f688..f958e83ae 100644 --- a/lib/src/widgets/standart_list_status_row.dart +++ b/lib/src/widgets/standard_list_status_row.dart @@ -3,8 +3,8 @@ import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator_icon.da import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -class StandartListStatusRow extends StatelessWidget { - StandartListStatusRow({required this.title, required this.value}); +class StandardListStatusRow extends StatelessWidget { + StandardListStatusRow({required this.title, required this.value}); final String title; final String value; diff --git a/lib/src/widgets/standart_switch.dart b/lib/src/widgets/standard_switch.dart similarity index 81% rename from lib/src/widgets/standart_switch.dart rename to lib/src/widgets/standard_switch.dart index 3018fb5b4..929286058 100644 --- a/lib/src/widgets/standart_switch.dart +++ b/lib/src/widgets/standard_switch.dart @@ -1,17 +1,17 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -class StandartSwitch extends StatefulWidget { - const StandartSwitch({required this.value, required this.onTaped}); +class StandardSwitch extends StatefulWidget { + const StandardSwitch({required this.value, required this.onTaped}); final bool value; final VoidCallback onTaped; @override - StandartSwitchState createState() => StandartSwitchState(); + StandardSwitchState createState() => StandardSwitchState(); } -class StandartSwitchState extends State { +class StandardSwitchState extends State { @override Widget build(BuildContext context) { return GestureDetector( diff --git a/lib/store/dashboard/trade_filter_store.dart b/lib/store/dashboard/trade_filter_store.dart index bee63b21e..87fa749a9 100644 --- a/lib/store/dashboard/trade_filter_store.dart +++ b/lib/store/dashboard/trade_filter_store.dart @@ -8,12 +8,11 @@ part'trade_filter_store.g.dart'; class TradeFilterStore = TradeFilterStoreBase with _$TradeFilterStore; abstract class TradeFilterStoreBase with Store { - TradeFilterStoreBase( - {this.displayXMRTO = true, - this.displayChangeNow = true, - this.displayMorphToken = true, - this.displaySimpleSwap = true, - }); + TradeFilterStoreBase() : displayXMRTO = true, + displayChangeNow = true, + displaySideShift = true, + displayMorphToken = true, + displaySimpleSwap = true; @observable bool displayXMRTO; @@ -21,26 +20,50 @@ abstract class TradeFilterStoreBase with Store { @observable bool displayChangeNow; + @observable + bool displaySideShift; + @observable bool displayMorphToken; @observable bool displaySimpleSwap; + @computed + bool get displayAllTrades => displayChangeNow && displaySideShift && displaySimpleSwap; + @action void toggleDisplayExchange(ExchangeProviderDescription provider) { switch (provider) { case ExchangeProviderDescription.changeNow: displayChangeNow = !displayChangeNow; break; + case ExchangeProviderDescription.sideShift: + displaySideShift = !displaySideShift; + break; + case ExchangeProviderDescription.simpleSwap: + displaySimpleSwap = !displaySimpleSwap; + break; case ExchangeProviderDescription.xmrto: displayXMRTO = !displayXMRTO; break; case ExchangeProviderDescription.morphToken: displayMorphToken = !displayMorphToken; break; - case ExchangeProviderDescription.simpleSwap: - displaySimpleSwap = !displaySimpleSwap; + case ExchangeProviderDescription.all: + if (displayAllTrades) { + displayChangeNow = false; + displaySideShift = false; + displayXMRTO = false; + displayMorphToken = false; + displaySimpleSwap = false; + } else { + displayChangeNow = true; + displaySideShift = true; + displayXMRTO = true; + displayMorphToken = true; + displaySimpleSwap = true; + } break; } } @@ -48,13 +71,15 @@ abstract class TradeFilterStoreBase with Store { List filtered({required List trades, required WalletBase wallet}) { final _trades = trades.where((item) => item.trade.walletId == wallet.id).toList(); - final needToFilter = !displayChangeNow || !displayXMRTO || !displayMorphToken || !displaySimpleSwap; + final needToFilter = !displayAllTrades; return needToFilter ? _trades .where((item) => (displayXMRTO && item.trade.provider == ExchangeProviderDescription.xmrto) || + (displaySideShift && + item.trade.provider == ExchangeProviderDescription.sideShift) || (displayChangeNow && item.trade.provider == ExchangeProviderDescription.changeNow) || diff --git a/lib/store/dashboard/transaction_filter_store.dart b/lib/store/dashboard/transaction_filter_store.dart index 4444075b7..95264a23d 100644 --- a/lib/store/dashboard/transaction_filter_store.dart +++ b/lib/store/dashboard/transaction_filter_store.dart @@ -1,6 +1,8 @@ import 'package:mobx/mobx.dart'; import 'package:cw_core/transaction_direction.dart'; import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart'; +import 'package:cake_wallet/view_model/dashboard/filter_item.dart'; +import 'package:cake_wallet/generated/i18n.dart'; part 'transaction_filter_store.g.dart'; @@ -8,8 +10,8 @@ class TransactionFilterStore = TransactionFilterStoreBase with _$TransactionFilterStore; abstract class TransactionFilterStoreBase with Store { - TransactionFilterStoreBase( - {this.displayIncoming = true, this.displayOutgoing = true}); + TransactionFilterStoreBase() : displayIncoming = true, + displayOutgoing = true; @observable bool displayIncoming; @@ -23,11 +25,31 @@ abstract class TransactionFilterStoreBase with Store { @observable DateTime? endDate; - @action - void toggleIncoming() => displayIncoming = !displayIncoming; + @computed + bool get displayAll => displayIncoming && displayOutgoing; @action - void toggleOutgoing() => displayOutgoing = !displayOutgoing; + void toggleAll() { + if (displayAll) { + displayOutgoing = false; + displayIncoming = false; + } else { + displayOutgoing = true; + displayIncoming = true; + } + } + + + @action + void toggleIncoming() { + displayIncoming = !displayIncoming; + } + + + @action + void toggleOutgoing() { + displayOutgoing = !displayOutgoing; + } @action void changeStartDate(DateTime date) => startDate = date; @@ -37,8 +59,7 @@ abstract class TransactionFilterStoreBase with Store { List filtered({required List transactions}) { var _transactions = []; - final needToFilter = !displayOutgoing || - !displayIncoming || + final needToFilter = !displayAll || (startDate != null && endDate != null); if (needToFilter) { @@ -50,7 +71,7 @@ abstract class TransactionFilterStoreBase with Store { && (endDate?.isAfter(item.transaction.date) ?? false); } - if (allowed && (!displayOutgoing || !displayIncoming)) { + if (allowed && (!displayAll)) { allowed = (displayOutgoing && item.transaction.direction == TransactionDirection.outgoing) || diff --git a/lib/twitter/twitter_api.dart b/lib/twitter/twitter_api.dart new file mode 100644 index 000000000..41f5df61d --- /dev/null +++ b/lib/twitter/twitter_api.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; +import 'package:cake_wallet/twitter/twitter_user.dart'; +import 'package:http/http.dart' as http; +import 'package:cake_wallet/.secrets.g.dart' as secrets; + +class TwitterApi { + static const twitterBearerToken = secrets.twitterBearerToken; + static const httpsScheme = 'https'; + static const apiHost = 'api.twitter.com'; + static const userPath = '/2/users/by/username/'; + + static Future lookupUserByName({required String userName}) async { + final queryParams = {'user.fields': 'description', 'expansions': 'pinned_tweet_id'}; + + final headers = {'authorization': 'Bearer $twitterBearerToken'}; + + final uri = Uri( + scheme: httpsScheme, + host: apiHost, + path: userPath + userName, + queryParameters: queryParams, + ); + + var response = await http.get(uri, headers: headers); + + if (response.statusCode != 200) { + throw Exception('Unexpected http status: ${response.statusCode}'); + } + final responseJSON = json.decode(response.body) as Map; + + if (responseJSON['errors'] != null) { + throw Exception(responseJSON['errors'][0]['detail']); + } + + return TwitterUser.fromJson(responseJSON); + } +} diff --git a/lib/twitter/twitter_user.dart b/lib/twitter/twitter_user.dart new file mode 100644 index 000000000..ac373fd62 --- /dev/null +++ b/lib/twitter/twitter_user.dart @@ -0,0 +1,45 @@ +class TwitterUser { + TwitterUser( + {required this.id, + required this.username, + required this.name, + required this.description, + this.tweets}); + + final String id; + final String username; + final String name; + final String description; + final List? tweets; + + factory TwitterUser.fromJson(Map json) { + return TwitterUser( + id: json['data']['id'] as String, + username: json['data']['username'] as String, + name: json['data']['name'] as String, + description: json['data']['description'] as String? ?? '', + tweets: json['includes'] != null + ? List.from(json['includes']['tweets'] as List) + .map((e) => Tweet.fromJson(e as Map)) + .toList() + : null, + ); + } +} + +class Tweet { + Tweet({ + required this.id, + required this.text, + }); + + final String id; + final String text; + + factory Tweet.fromJson(Map json) { + return Tweet( + id: json['id'] as String, + text: json['text'] as String, + ); + } +} diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart new file mode 100644 index 000000000..4cbebdb5d --- /dev/null +++ b/lib/utils/exception_handler.dart @@ -0,0 +1,133 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:cake_wallet/entities/preferences_key.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/main.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mailer/flutter_mailer.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ExceptionHandler { + static bool _hasError = false; + static const _coolDownDurationInDays = 7; + + static void _saveException(String? error, StackTrace? stackTrace) async { + final appDocDir = await getApplicationDocumentsDirectory(); + + final file = File('${appDocDir.path}/error.txt'); + final exception = { + "${DateTime.now()}": { + "Error": error, + "StackTrace": stackTrace.toString(), + } + }; + + const String separator = '''\n\n========================================================== + ==========================================================\n\n'''; + + await file.writeAsString( + jsonEncode(exception) + separator, + mode: FileMode.append, + ); + } + + static void _sendExceptionFile() async { + try { + final appDocDir = await getApplicationDocumentsDirectory(); + + final file = File('${appDocDir.path}/error.txt'); + + final MailOptions mailOptions = MailOptions( + subject: 'Mobile App Issue', + recipients: ['support@cakewallet.com'], + attachments: [file.path], + ); + + final result = await FlutterMailer.send(mailOptions); + + // Clear file content if the error was sent or saved. + // On android we can't know if it was sent or saved + if (result.name == MailerResponse.sent.name || + result.name == MailerResponse.saved.name || + result.name == MailerResponse.android.name) { + file.writeAsString("", mode: FileMode.write); + } + } catch (e, s) { + _saveException(e.toString(), s); + } + } + + static void onError(FlutterErrorDetails errorDetails) async { + if (kDebugMode) { + FlutterError.presentError(errorDetails); + return; + } + + if (_ignoreError(errorDetails.exception.toString())) { + return; + } + + _saveException(errorDetails.exception.toString(), errorDetails.stack); + + final sharedPrefs = await SharedPreferences.getInstance(); + + final lastPopupDate = + DateTime.tryParse(sharedPrefs.getString(PreferencesKey.lastPopupDate) ?? '') ?? + DateTime.now().subtract(Duration(days: _coolDownDurationInDays + 1)); + + final durationSinceLastReport = DateTime.now().difference(lastPopupDate).inDays; + + if (_hasError || durationSinceLastReport < _coolDownDurationInDays) { + return; + } + _hasError = true; + + sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime.now().toString()); + + WidgetsBinding.instance.addPostFrameCallback( + (timeStamp) async { + await showPopUp( + context: navigatorKey.currentContext!, + builder: (context) { + return AlertWithTwoActions( + isDividerExist: true, + alertTitle: S.of(context).error, + alertContent: S.of(context).error_dialog_content, + rightButtonText: S.of(context).send, + leftButtonText: S.of(context).do_not_send, + actionRightButton: () { + Navigator.of(context).pop(); + _sendExceptionFile(); + }, + actionLeftButton: () { + Navigator.of(context).pop(); + }, + ); + }, + ); + + _hasError = false; + }, + ); + } + + /// Ignore User related errors or system errors + static bool _ignoreError(String error) => + _ignoredErrors.any((element) => error.contains(element)); + + static const List _ignoredErrors = const [ + "errno = 103", // SocketException: Software caused connection abort + "errno = 9", // SocketException: Bad file descriptor + "errno = 32", // SocketException: Write failed (OS Error: Broken pipe) + "errno = 60", // SocketException: Operation timed out + "errno = 54", // SocketException: Connection reset by peer + "errno = 49", // SocketException: Can't assign requested address + "errno = 28", // OS Error: No space left on device + "PERMISSION_NOT_GRANTED", + ]; +} diff --git a/lib/utils/route_aware.dart b/lib/utils/route_aware.dart new file mode 100644 index 000000000..28c72c4a4 --- /dev/null +++ b/lib/utils/route_aware.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:cake_wallet/main.dart'; + +class RouteAwareWidget extends StatefulWidget { + RouteAwareWidget( + {required this.child, + this.pushToWidget, + this.pushToNextWidget, + this.popWidget, + this.popNextWidget}); + + final Widget child; + final Function()? pushToWidget; + final Function()? pushToNextWidget; + final Function()? popWidget; + final Function()? popNextWidget; + + @override + State createState() => RouteAwareWidgetState(); +} + +class RouteAwareWidgetState extends State with RouteAware { + @override + void didChangeDependencies() { + super.didChangeDependencies(); + routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); + } + + @override + void dispose() { + routeObserver.unsubscribe(this); + super.dispose(); + } + + @override + void didPush() { + if (widget.pushToWidget != null) { + widget.pushToWidget!(); + } + } + + @override + void didPushNext() { + if (widget.pushToNextWidget != null) { + widget.pushToNextWidget!(); + } + } + + @override + void didPop() { + if (widget.popWidget != null) { + widget.popWidget!(); + } + } + + @override + void didPopNext() { + if (widget.popNextWidget != null) { + widget.popNextWidget!(); + } + } + + @override + Widget build(BuildContext context) => widget.child; +} diff --git a/lib/utils/share_util.dart b/lib/utils/share_util.dart new file mode 100644 index 000000000..5b33399c7 --- /dev/null +++ b/lib/utils/share_util.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:share_plus/share_plus.dart'; + +class ShareUtil { + static void share({required String text, required BuildContext context}) { + final box = context.findRenderObject() as RenderBox?; + + Share.share( + text, + sharePositionOrigin: box!.localToGlobal(Offset.zero) & box.size, + ); + } +} \ No newline at end of file diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 7f11b0c2f..12bd21058 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -58,25 +58,44 @@ abstract class DashboardViewModelBase with Store { isShowThirdYatIntroduction = false, filterItems = { S.current.transactions: [ + FilterItem( + value: () => transactionFilterStore.displayAll, + caption: S.current.all_transactions, + onChanged: transactionFilterStore.toggleAll), FilterItem( value: () => transactionFilterStore.displayIncoming, caption: S.current.incoming, - onChanged: (value) => transactionFilterStore.toggleIncoming()), + onChanged:transactionFilterStore.toggleIncoming), FilterItem( value: () => transactionFilterStore.displayOutgoing, caption: S.current.outgoing, - onChanged: (value) => transactionFilterStore.toggleOutgoing()), + onChanged: transactionFilterStore.toggleOutgoing), // FilterItem( // value: () => false, // caption: S.current.transactions_by_date, // onChanged: null), ], S.current.trades: [ + FilterItem( + value: () => tradeFilterStore.displayAllTrades, + caption: S.current.all_trades, + onChanged: () => tradeFilterStore + .toggleDisplayExchange(ExchangeProviderDescription.all)), FilterItem( value: () => tradeFilterStore.displayChangeNow, - caption: 'Change.NOW', - onChanged: (value) => tradeFilterStore + caption: ExchangeProviderDescription.changeNow.title, + onChanged: () => tradeFilterStore .toggleDisplayExchange(ExchangeProviderDescription.changeNow)), + FilterItem( + value: () => tradeFilterStore.displaySideShift, + caption: ExchangeProviderDescription.sideShift.title, + onChanged: () => tradeFilterStore + .toggleDisplayExchange(ExchangeProviderDescription.sideShift)), + FilterItem( + value: () => tradeFilterStore.displaySimpleSwap, + caption: ExchangeProviderDescription.simpleSwap.title, + onChanged: () => tradeFilterStore + .toggleDisplayExchange(ExchangeProviderDescription.simpleSwap)), ] }, subname = '', @@ -220,7 +239,7 @@ abstract class DashboardViewModelBase with Store { WalletBase, TransactionInfo> wallet; - bool get hasRescan => wallet.type == WalletType.monero; + bool get hasRescan => wallet.type == WalletType.monero || wallet.type == WalletType.haven; BalanceViewModel balanceViewModel; diff --git a/lib/view_model/dashboard/filter_item.dart b/lib/view_model/dashboard/filter_item.dart index 0230899b4..0944e899c 100644 --- a/lib/view_model/dashboard/filter_item.dart +++ b/lib/view_model/dashboard/filter_item.dart @@ -1,3 +1,5 @@ +import 'package:mobx/mobx.dart'; + class FilterItem { FilterItem({ required this.value, @@ -6,5 +8,5 @@ class FilterItem { bool Function() value; String caption; - Function(bool) onChanged; + Function onChanged; } \ No newline at end of file diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index 35f30a937..0f16bdfe8 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -1,5 +1,7 @@ import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cw_core/transaction_direction.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/view_model/dashboard/action_list_item.dart'; @@ -11,6 +13,7 @@ import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart'; import 'package:cw_core/keyable.dart'; import 'package:cw_core/wallet_type.dart'; + class TransactionListItem extends ActionListItem with Keyable { TransactionListItem( {required this.transaction, @@ -35,6 +38,30 @@ class TransactionListItem extends ActionListItem with Keyable { ? '---' : transaction.amountFormatted(); } + String get formattedTitle { + if (transaction.direction == TransactionDirection.incoming) { + return S.current.received; + } + + return S.current.sent; + } + + String get formattedPendingStatus { + if (transaction.confirmations >= 0 && transaction.confirmations < 10) { + return ' (${transaction.confirmations}/10)'; + } + return ''; + } + + String get formattedStatus { + if (transaction.direction == TransactionDirection.incoming) { + if (balanceViewModel.wallet.type == WalletType.monero || + balanceViewModel.wallet.type == WalletType.haven) { + return formattedPendingStatus; + } + } + return transaction.isPending ? S.current.pending : ''; + } String get formattedFiatAmount { var amount = ''; diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 10ddf25e4..541b74396 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -18,19 +18,18 @@ import 'package:cake_wallet/generated/i18n.dart'; part 'exchange_trade_view_model.g.dart'; -class ExchangeTradeViewModel = ExchangeTradeViewModelBase - with _$ExchangeTradeViewModel; +class ExchangeTradeViewModel = ExchangeTradeViewModelBase with _$ExchangeTradeViewModel; abstract class ExchangeTradeViewModelBase with Store { ExchangeTradeViewModelBase( {required this.wallet, - required this.trades, - required this.tradesStore, - required this.sendViewModel}) - : trade = tradesStore.trade!, - isSendable = tradesStore.trade!.from == wallet.currency || - tradesStore.trade!.provider == ExchangeProviderDescription.xmrto, - items = ObservableList() { + required this.trades, + required this.tradesStore, + required this.sendViewModel}) + : trade = tradesStore.trade!, + isSendable = tradesStore.trade!.from == wallet.currency || + tradesStore.trade!.provider == ExchangeProviderDescription.xmrto, + items = ObservableList() { switch (trade.provider) { case ExchangeProviderDescription.xmrto: _provider = XMRTOExchangeProvider(); @@ -67,22 +66,20 @@ abstract class ExchangeTradeViewModelBase with Store { @computed String get extraInfo => trade.from == CryptoCurrency.xlm - ? '\n\n' + S.current.xlm_extra_info - : trade.from == CryptoCurrency.xrp - ? '\n\n' + S.current.xrp_extra_info - : ''; + ? '\n\n' + S.current.xlm_extra_info + : trade.from == CryptoCurrency.xrp + ? '\n\n' + S.current.xrp_extra_info + : ''; @computed - String get pendingTransactionFiatAmountValueFormatted => - sendViewModel.isFiatDisabled - ? '' : sendViewModel.pendingTransactionFiatAmount - + ' ' + sendViewModel.fiat.title; + String get pendingTransactionFiatAmountValueFormatted => sendViewModel.isFiatDisabled + ? '' + : sendViewModel.pendingTransactionFiatAmount + ' ' + sendViewModel.fiat.title; @computed - String get pendingTransactionFeeFiatAmountFormatted => - sendViewModel.isFiatDisabled - ? '' : sendViewModel.pendingTransactionFeeFiatAmount - + ' ' + sendViewModel.fiat.title; + String get pendingTransactionFeeFiatAmountFormatted => sendViewModel.isFiatDisabled + ? '' + : sendViewModel.pendingTransactionFeeFiatAmount + ' ' + sendViewModel.fiat.title; @observable ObservableList items; @@ -122,6 +119,8 @@ abstract class ExchangeTradeViewModelBase with Store { } void _updateItems() { + final tagFrom = trade.from.tag != null ? '${trade.from.tag}' + ' ' : ''; + final tagTo = trade.to.tag != null ? '${trade.to.tag}' + ' ' : ''; items.clear(); items.add(ExchangeTradeItem( title: "${trade.provider.title} ${S.current.id}", data: '${trade.id}', isCopied: true)); @@ -130,22 +129,22 @@ abstract class ExchangeTradeViewModelBase with Store { final title = trade.from == CryptoCurrency.xrp ? S.current.destination_tag : trade.from == CryptoCurrency.xlm - ? S.current.memo - : S.current.extra_id; + ? S.current.memo + : S.current.extra_id; - items.add(ExchangeTradeItem( - title: title, data: '${trade.extraId}', isCopied: false)); + items.add(ExchangeTradeItem(title: title, data: '${trade.extraId}', isCopied: false)); } items.addAll([ + ExchangeTradeItem(title: S.current.amount, data: '${trade.amount}', isCopied: false), ExchangeTradeItem( - title: S.current.amount, data: '${trade.amount}', isCopied: false), - ExchangeTradeItem( - title: S.current.status, data: '${trade.state}', isCopied: false), - ExchangeTradeItem( - title: S.current.widgets_address + ':', + title: S.current.send_to_this_address('${trade.from}', tagFrom) + ':', data: trade.inputAddress ?? '', isCopied: true), + ExchangeTradeItem( + title: S.current.arrive_in_this_address('${trade.to}', tagTo) + ':', + data: trade.payoutAddress ?? '', + isCopied: true), ]); } } diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 5c1f696b8..d310e6278 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -192,7 +192,7 @@ abstract class ExchangeViewModelBase with Store { ObservableList get templates => _exchangeTemplateStore.templates; - + @computed TransactionPriority get transactionPriority { final priority = _settingsStore.priority[wallet.type]; @@ -308,10 +308,11 @@ abstract class ExchangeViewModelBase with Store { Future _calculateBestRate() async { final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1; + final _providers = _tradeAvailableProviders + .where((element) => !isFixedRateMode || element.supportsFixedRate).toList(); + final result = await Future.wait( - _tradeAvailableProviders - .where((element) => !isFixedRateMode || element.supportsFixedRate) - .map((element) => element.fetchRate( + _providers.map((element) => element.fetchRate( from: depositCurrency, to: receiveCurrency, amount: amount, @@ -324,7 +325,12 @@ abstract class ExchangeViewModelBase with Store { for (int i=0;i _timer; + bool get payingByBitcoin => paymentInfo.anyPayPayment.chain == AnyPayChain.btc; + Timer? _timer; @action diff --git a/lib/view_model/node_list/node_list_view_model.dart b/lib/view_model/node_list/node_list_view_model.dart index a50720d9d..deb1f29cf 100644 --- a/lib/view_model/node_list/node_list_view_model.dart +++ b/lib/view_model/node_list/node_list_view_model.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/generated/i18n.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:cw_core/wallet_base.dart'; @@ -30,6 +31,10 @@ abstract class NodeListViewModelBase with Store { return node; } + String getAlertContent(String uri) => + S.current.change_current_node(uri) + + '${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + S.current.orbot_running_alert : ''}'; + final ObservableList nodes; final SettingsStore settingsStore; final WalletBase wallet; diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index b6604789a..e0ae5dab8 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -180,7 +180,8 @@ abstract class SendViewModelBase with Store { WalletType get walletType => _wallet.type; - String? get walletCurrencyName => _wallet.currency.name?.toLowerCase(); + String? get walletCurrencyName => + _wallet.currency.fullName?.toLowerCase() ?? _wallet.currency.name; bool get hasCurrecyChanger => walletType == WalletType.haven; diff --git a/lib/view_model/support_view_model.dart b/lib/view_model/support_view_model.dart index 5fa81b288..3b919e750 100644 --- a/lib/view_model/support_view_model.dart +++ b/lib/view_model/support_view_model.dart @@ -42,7 +42,7 @@ abstract class SupportViewModelBase with Store { title: 'Telegram', icon: 'assets/images/Telegram.png', linkTitle: '@cakewallet_bot', - link: 'https:t.me/cakewallet_bot'), + link: 'https://t.me/cakewallet_bot'), LinkListItem( title: 'Twitter', icon: 'assets/images/Twitter.png', @@ -84,7 +84,7 @@ abstract class SupportViewModelBase with Store { // link: 'mailto:support@y.at') ]; - static const url = 'https://cakewallet.com/guide/'; + static const url = 'https://guides.cakewallet.com'; List items; } \ No newline at end of file diff --git a/lib/view_model/trade_details_view_model.dart b/lib/view_model/trade_details_view_model.dart index f2985463c..5a1f78774 100644 --- a/lib/view_model/trade_details_view_model.dart +++ b/lib/view_model/trade_details_view_model.dart @@ -142,17 +142,5 @@ abstract class TradeDetailsViewModelBase with Store { items.add(TrackTradeListItem( title: 'Track', value: buildURL, onTap: () => launch(buildURL))); } - - if (trade.createdAt != null) { - items.add(StandartListItem( - title: S.current.trade_details_created_at, - value: trade.createdAt != null ? dateFormat.format(trade.createdAt!).toString() : '')); - } - - if (trade.from != null && trade.to != null) { - items.add(StandartListItem( - title: S.current.trade_details_pair, - value: '${trade.from.toString()} → ${trade.to.toString()}')); - } } } diff --git a/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart index c9d2c77f5..a4eb3d386 100644 --- a/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/foundation.dart'; import 'package:cw_core/wallet_base.dart'; @@ -27,10 +28,10 @@ class AddressEditOrCreateStateFailure extends AddressEditOrCreateState { abstract class WalletAddressEditOrCreateViewModelBase with Store { WalletAddressEditOrCreateViewModelBase( - {required WalletBase wallet, dynamic item}) + {required WalletBase wallet, WalletAddressListItem? item}) : isEdit = item != null, state = AddressEditOrCreateStateInitial(), - label = item?.name as String? ?? '', + label = item?.name ?? '', _item = item, _wallet = wallet; @@ -42,7 +43,7 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store { bool isEdit; - final dynamic _item; + final WalletAddressListItem? _item; final WalletBase _wallet; Future save() async { @@ -98,27 +99,20 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store { await wallet.walletAddresses.updateAddress(_item.address as String); await wallet.save(); }*/ - - if (wallet.type == WalletType.monero) { - await monero - !.getSubaddressList(wallet) - .setLabelSubaddress( - wallet, - accountIndex: monero!.getCurrentAccount(wallet).id, - addressIndex: _item.id as int, - label: label); - await wallet.save(); - } - - if (wallet.type == WalletType.haven) { - await haven - !.getSubaddressList(wallet) - .setLabelSubaddress( - wallet, - accountIndex: haven!.getCurrentAccount(wallet).id, - addressIndex: _item.id as int, - label: label); - await wallet.save(); + final index = _item?.id; + if (index != null) { + if (wallet.type == WalletType.monero) { + await monero!.getSubaddressList(wallet).setLabelSubaddress(wallet, + accountIndex: monero!.getCurrentAccount(wallet).id, addressIndex: index, label: label); + await wallet.save(); + } + if (wallet.type == WalletType.haven) { + await haven!.getSubaddressList(wallet).setLabelSubaddress(wallet, + accountIndex: haven!.getCurrentAccount(wallet).id, + addressIndex: index, + label: label); + await wallet.save(); + } } } } diff --git a/pubspec_base.yaml b/pubspec_base.yaml index b9fc8ee49..0dffb689c 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -6,7 +6,7 @@ dependencies: flutter_cupertino_localizations: ^1.0.1 intl: ^0.17.0 url_launcher: ^6.1.4 - qr: ^3.0.1 + qr_flutter: ^4.0.0 uuid: 3.0.6 shared_preferences: ^2.0.15 flutter_secure_storage: @@ -38,7 +38,7 @@ dependencies: auto_size_text: ^3.0.0 dotted_border: ^2.0.0+2 smooth_page_indicator: ^1.0.0+2 - webview_flutter: ^3.0.4 + flutter_inappwebview: ^5.7.2+3 flutter_spinkit: ^5.1.0 uni_links: ^0.5.1 lottie: ^1.3.0 @@ -62,6 +62,7 @@ dependencies: device_display_brightness: ^0.0.6 platform_device_id: ^1.0.1 wakelock: ^0.6.2 + flutter_mailer: ^2.0.2 cake_backup: git: url: https://github.com/cake-tech/cake_backup.git diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb new file mode 100644 index 000000000..8222467bd --- /dev/null +++ b/res/values/strings_ar.arb @@ -0,0 +1,686 @@ +{ + "welcome":"مرحبا بك في", + "cake_wallet":"Cake Wallet", + "first_wallet_text":"محفظة رائعة ل Monero, Bitcoin, Litecoin و Haven", + "please_make_selection":"يرجى الأختيار لإنشاء أو استعادة محفظتك.", + "create_new":"إنشاء محفظة جديدة", + "restore_wallet":"استعادة محفظة", + + "monero_com":"Monero.com بواسطة Cake Wallet", + "monero_com_wallet_text":"محفظة رائعة ل Monero", + + "haven_app":"Haven بواسطة Cake Wallet", + "haven_app_wallet_text":"محفظة رائعة ل Haven", + + "accounts":"حسابتي", + "edit":"تعديل", + "account":"حساب", + "add":"إضافة", + + + "address_book":"دليل العناوين", + "contact":"تواصل", + "please_select":"الرجاء الأختيار:", + "cancel":"إلغاء", + "ok":"حسناً", + "contact_name":"اسم جهة الاتصال", + "reset":"إعادة", + "save":"حفظ", + "address_remove_contact":"ازالة جهة الاتصال", + "address_remove_content":"هل أنت متأكد من رغبتك في إزالة جهة الاتصال المحددة؟", + + + "authenticated":"تم المصادقة", + "authentication":"المصادقة", + "failed_authentication":"${state_error} فشل المصادقة.", + + + "wallet_menu":"قائمة", + "Blocks_remaining":"بلوك متبقي ${status}", + "please_try_to_connect_to_another_node":"الرجاء محاولة الاتصال بعقدة أخرى", + "xmr_hidden":"مختفي", + "xmr_available_balance":"الرصيد المتوفر", + "xmr_full_balance":"الرصيد الكامل", + "send":"إرسال", + "receive":"استلام", + "transactions":"المعاملات", + "incoming":"الواردة", + "outgoing":"الصادره", + "transactions_by_date":"المعاملات حسب التاريخ", + "trades":"عمليات التداول", + "filter_by":"تصفية حسب", + "today":"اليوم", + "yesterday":"الامس", + "received":"استلام", + "sent":"تم الأرسال", + "pending":" (في الإنتظار)", + "rescan":"إعادة الفحص", + "reconnect":"أعد الاتصال", + "wallets":"المحافظ", + "show_seed":"عرض السييد", + "show_keys":"اظهار السييد / المفاتيح", + "address_book_menu":"دليل العناوين", + "reconnection":"إعادة الاتصال", + "reconnect_alert_text":"هل أنت متأكد من رغبتك في إعادة الاتصال؟", + + + "exchange":"تبادل", + "clear":"مسح", + "refund_address":"عنوان إعادة المال", + "change_exchange_provider":"تغيير مزود الصرف", + "you_will_send":"تحويل من", + "you_will_get":"حول الى", + "amount_is_guaranteed":"مبلغ الاستلام مضمون", + "amount_is_estimate":"المبلغ المستلم هو تقدير", + "powered_by":"بدعم من ${title}", + "error":"خطأ", + "estimated":"مُقدَّر", + "min_value":"الحد الأدنى: ${value} ${currency}", + "max_value":"الحد الأقصى: ${value} ${currency}", + "change_currency":"تغيير العملة", + "overwrite_amount":"تغير المبلغ", + "qr_payment_amount":"يحتوي هذا ال QR على مبلغ الدفع. هل تريد تغير المبلغ فوق القيمة الحالية؟", + + "copy_id":"نسخ معرف العملية", + "exchange_result_write_down_trade_id":"يرجى نسخ أو كتابة معرّف العملية للمتابعة.", + "trade_id":"معرف عملية التبادل:", + "copied_to_clipboard":"نسخ إلى الحافظة", + "saved_the_trade_id":"لقد تم حفظ معرف العملية", + "fetching":"جار الجلب", + "id":"رقم المعرف:", + "amount":"مقدار:", + "payment_id":"معرف الدفع:", + "status":"الحالة:", + "offer_expires_in":"ينتهي العرض في:", + "trade_is_powered_by":"عملية التبادل مدعومة من ${provider}", + "copy_address":"نسخ العنوان", + "exchange_result_confirm":"بالضغط على تأكيد ، سترسل ${fetchingLabel} ${from} من محفظتك المسماة ${walletName} إلى العنوان الموضح أدناه. أو يمكنك الإرسال من محفظتك الخارجية إلى العنوان أدناه / QR.\n\nيرجى الضغط على تأكيد للمتابعة أو الرجوع لتغيير المبالغ.", + "exchange_result_description":"يجب عليك إرسال ما لا يقل عن ${fetchingLabel} ${from} إلى العنوان المعروض في الصفحة التالية. إذا أرسلت مبلغًا أقل من ${fetchingLabel} ${from} فقد لا يتم تحويله وقد لا يتم رده.", + "exchange_result_write_down_ID":"* يرجى نسخ أو كتابة معرف هويتك الأعلى لحفظة.", + "confirm":"تأكيد", + "confirm_sending":"تأكيد الإرسال", + "commit_transaction_amount_fee":"تنفيذ الصفقة\nالمبلغ: ${amount}\nالرسوم: ${fee}", + "sending":"يتم الإرسال", + "transaction_sent":"تم إرسال المعاملة!", + "expired":"منتهي الصلاحية", + "time":"${minutes}د ${seconds}س", + "send_xmr":"أرسل XMR", + "exchange_new_template":"قالب جديد", + + "faq":"الأسئلة الشائعة", + + + "enter_your_pin":"أدخل كود الرقم السري", + "loading_your_wallet":"يتم تحميل محفظتك", + + + "new_wallet":"إنشاء محفظة جديدة", + "wallet_name":"اسم المحفظة", + "continue_text":"التالي", + "choose_wallet_currency":"الرجاء اختيار عملة المحفظة:", + + + "node_new":"عقدة جديدة", + "node_address":"عنوان العقدة", + "node_port":"منفذ العقدة", + "login":"تسجيل الدخول", + "password":"كلمة المرور", + "nodes":"العقد", + "node_reset_settings_title":"اعادة الضبط", + "nodes_list_reset_to_default_message":"هل أنت متأكد أنك تريد إعادة تعيين الإعدادات إلى الافتراضي؟", + "change_current_node":"هل أنت متأكد من تغيير العقدة الحالية إلى ${node}؟", + "change":"تغير", + "remove_node":"إزالة العقدة", + "remove_node_message":"هل أنت متأكد أنك تريد إزالة العقدة المحددة؟", + "remove":"إزالة", + "delete":"حذف", + "add_new_node":"أضافة عقدة جديدة", + "change_current_node_title":"تغيير العقدة الحالية", + "node_test":"تجربة", + "node_connection_successful":"تم الاتصال بنجاح", + "node_connection_failed":"فشل الاتصال", + "new_node_testing":"تجربة العقدة الجديدة", + + + "use":"التبديل إلى", + "digit_pin":"-رقم PIN", + + + "share_address":"شارك العنوان", + "receive_amount":"المقدار", + "subaddresses":"العناوين الفرعية", + "addresses":"عناوين", + "scan_qr_code":"امسح ال QR للحصول على العنوان", + "qr_fullscreen":"انقر لفتح ال QR بملء الشاشة", + "rename":"إعادة تسمية", + "choose_account":"اختر حساب", + "create_new_account":"انشاء حساب جديد", + "accounts_subaddresses":"الحسابات والعناوين الفرعية", + + + "restore_restore_wallet":"استعادة محفظة", + "restore_title_from_seed_keys":"استعادة من السييد / المفاتيح", + "restore_description_from_seed_keys":"استرجع محفظتك من السييد / المفاتيح التي قمت بحفظها في مكان آمن", + "restore_next":"التالي", + "restore_title_from_backup":"استعادة من النسخة الاحتياطية", + "restore_description_from_backup":"يمكنك استعادة تطبيق Cake Wallet بالكامل من ملف النسخ الاحتياطي", + "restore_seed_keys_restore":"استعادة السييد / المفاتيح", + "restore_title_from_seed":"استعادة من السييد", + "restore_description_from_seed":"قم باستعادة محفظتك من الرمز المكون من 25 كلمة أو 13 كلمة", + "restore_title_from_keys":"استعادة من المفاتيح", + "restore_description_from_keys":"قم باستعادة محفظتك من ضغطات المفاتيح المولدة المحفوظة من مفاتيحك الخاصة", + "restore_wallet_name":"اسم المحفظة", + "restore_address":"العنوان", + "restore_view_key_private":"مفتاح العرض (خاص)", + "restore_spend_key_private":"مفتاح الإنفاق (خاص)", + "restore_recover":"استعادة", + "restore_wallet_restore_description":"وصف استعادة المحفظة", + "restore_new_seed":"سييد جديدة", + "restore_active_seed":"السييد النشطة", + "restore_bitcoin_description_from_seed":"قم باستعادة محفظتك من كود مكون من 24 كلمة", + "restore_bitcoin_description_from_keys":"قم باستعادة محفظتك من سلسلة WIF التي تم إنشاؤها من مفاتيحك الخاصة", + "restore_bitcoin_title_from_keys":"استعادة من WIF", + "restore_from_date_or_blockheight":"الرجاء إدخال تاريخ قبل إنشاء هذه المحفظة ببضعة أيام. أو إذا كنت تعرف ارتفاع البلوك، فيرجى إدخاله بدلاً من ذلك", + + + "seed_reminder":"يرجى تدوينها في حالة فقد هاتفك أو مسحه", + "seed_title":"سييد", + "seed_share":"شارك السييد", + "copy":"نسخ", + + + "seed_language_choose":"الرجاء اختيار لغة السييد:", + "seed_choose":"اختر لغة السييد", + "seed_language_next":"التالي", + "seed_language_english":"إنجليزي", + "seed_language_chinese":"صينى", + "seed_language_dutch":"هولندي", + "seed_language_german":"ألمانية", + "seed_language_japanese":"اليابانية", + "seed_language_portuguese":"البرتغالية", + "seed_language_russian":"الروسية", + "seed_language_spanish":"الأسبانية", + "seed_language_french":"فرنسي", + "seed_language_italian":"إيطالي", + + + "send_title":"إرسال", + "send_your_wallet":"محفظتك", + "send_address":"عنوان ${cryptoCurrency}", + "send_payment_id":"معرف عملية الدفع (اختياري)", + "all":"الكل", + "send_error_minimum_value":"الحد الأدنى لقيمة المبلغ هو 0.01", + "send_error_currency":"العملة يجب أن تحتوي على أرقام فقط", + "send_estimated_fee":"الرسوم المقدرة:", + "send_priority":"حاليًا ، تم تحديد الرسوم بأولوية ${transactionPriority}.\nيمكن تعديل أولوية المعاملة في الإعدادات", + "send_creating_transaction":" يتم إنشاء المعاملة", + "send_templates":"القوالب", + "send_new":"جديد", + "send_amount":"مقدار:", + "send_fee":"الرسوم:", + "send_name":"الأسم", + "send_got_it":"فهمتك", + "send_sending":"يتم الإرسال...", + "send_success":"تم إرسال ${crypto} الخاص بك بنجاح", + + + "settings_title":"إعدادات", + "settings_nodes":"العقد", + "settings_current_node":"العقدة الحالية", + "settings_wallets":"المحافظ", + "settings_display_balance":"عرض الرصيد", + "settings_currency":"العملة", + "settings_fee_priority":"رسوم الأولوية", + "settings_save_recipient_address":"حفظ عنوان المستلم", + "settings_personal":"شخصي", + "settings_change_pin":"تغيير PIN", + "settings_change_language":"تغيير اللغة", + "settings_allow_biometrical_authentication":"السماح بالمصادقة البيومترية", + "settings_dark_mode":"الوضع الداكن", + "settings_transactions":"المبادلات", + "settings_trades":"الصفقات", + "settings_display_on_dashboard_list":"عرض في قائمة لوحة المعلومات", + "settings_all":"الكل", + "settings_only_trades":"الصفقات فقط", + "settings_only_transactions":"المعاملات فقط", + "settings_none":"لا شيء", + "settings_support":"الدعم", + "settings_terms_and_conditions":"الأحكام والشروط", + "pin_is_incorrect":"رقم ال PIN غير صحيح", + + + "setup_pin":"تعيين PIN", + "enter_your_pin_again":"أدخل PIN الخاص بك مرة أخرى", + "setup_successful":"تم إعداد PIN الخاص بك بنجاح!", + + + "wallet_keys":"سييد المحفظة / المفاتيح", + "wallet_seed":"سييد المحفظة", + "private_key":"مفتاح خاص", + "public_key":"مفتاح عمومي", + "view_key_private":"مفتاح العرض (خاص)", + "view_key_public":"مفتاح العرض (عام)", + "spend_key_private":"مفتاح الإنفاق (خاص)", + "spend_key_public":"مفتاح الإنفاق (عام)", + "copied_key_to_clipboard":"تم نسخ ${key} إلى الحافظة", + + + "new_subaddress_title":"عنوان جديد", + "new_subaddress_label_name":"تسمية", + "new_subaddress_create":"إنشاء", + + "address_label":"تسمية عنوان", + + "subaddress_title":"قائمة العناوين الفرعية", + + + "trade_details_title":"تفاصيل الصفقة", + "trade_details_id":"معرف (ID)", + "trade_details_state":"الحالة", + "trade_details_fetching":"جار الجلب", + "trade_details_provider":"مزود", + "trade_details_created_at":"أنشئت في", + "trade_details_pair":"زوج", + "trade_details_copied":"تم نسخ ${title} إلى الحافظة", + + + "trade_history_title":"تاريخ الصفقه", + + + "transaction_details_title":"تفاصيل المعاملة", + "transaction_details_transaction_id":"رقم المعاملة", + "transaction_details_date":"تاريخ", + "transaction_details_height":"ارتفاع", + "transaction_details_amount":"مقدار", + "transaction_details_fee":"رسوم", + "transaction_details_copied":"تم نسخ ${title} إلى الحافظة", + "transaction_details_recipient_address":"عناوين المستلم", + + + "wallet_list_title":"محفظة Monero", + "wallet_list_create_new_wallet":"إنشاء محفظة جديدة", + "wallet_list_restore_wallet":"استعادة المحفظة", + "wallet_list_load_wallet":"تحميل المحفظة", + "wallet_list_loading_wallet":"جار تحميل محفظة ${wallet_name}", + "wallet_list_failed_to_load":"فشل تحميل محفظة ${wallet_name}. ${error}", + "wallet_list_removing_wallet":"يتم إزالة محفظة ${wallet_name}", + "wallet_list_failed_to_remove":"فشلت إزالة محفظة ${wallet_name}. ${error}", + + + "widgets_address":"عنوان", + "widgets_restore_from_blockheight":"استعادة من ارتفاع البلوك", + "widgets_restore_from_date":"استعادة من التاريخ", + "widgets_or":"أو", + "widgets_seed":"سييد", + + + "router_no_route":"لم يتم تحديد مسار لـ ${name}", + + + "error_text_account_name":"يجب أن يحتوي اسم الحساب على أحرف وأرقام فقط\nويجب أن يتراوح بين حرف واحد و 15 حرفًا", + "error_text_contact_name":"لا يمكن أن يحتوي اسم جهة الاتصال على الرموز ` , ' \"\nويجب أن يتراوح بين حرف و 32 حرفًا", + "error_text_address":"يجب أن يتوافق عنوان المحفظة مع نوع\nالعملة المشفرة", + "error_text_node_address":"الرجاء إدخال عنوان IPv4", + "error_text_node_port":"منفذ العقدة يمكن أن يحتوي فقط على أرقام بين 0 و 65535", + "error_text_payment_id":"يمكن أن يحتوي معرّف الدفع فقط من 16 إلى 64 حرفًا hex", + "error_text_xmr":"لا يمكن أن تتجاوز قيمة XMR الرصيد المتاح.\nيجب أن يكون عدد الكسور أقل من أو يساوي 12", + "error_text_fiat":"لا يمكن أن تتجاوز قيمة المبلغ الرصيد المتاح.\nيجب أن يكون عدد الكسور أقل أو يساوي 2", + "error_text_subaddress_name":"لا يمكن أن يحتوي اسم العنوان الفرعي على رموز ` , ' \"\nويجب أن يتراوح طولها بين حرف واحد و 20 حرفًا", + "error_text_amount":"يجب أن يحتوي المبلغ على أرقام فقط", + "error_text_wallet_name":"يمكن أن يحتوي اسم المحفظة على أحرف وأرقام ورموز _ - فقط\nويجب أن يتراوح طولها بين حرف واحد و 33 حرفًا", + "error_text_keys":"يمكن أن تحتوي مفاتيح المحفظة على 64 حرفًا hex", + "error_text_crypto_currency":"عدد الكسور\nيجب أن تكون أقل من أو تساوي 12", + "error_text_minimal_limit":"لم يتم إنشاء الصفقة لـ ${provider}. المبلغ أقل من الحد الأدنى: ${min} ${currency}", + "error_text_maximum_limit":"لم يتم إنشاء الصفقة لـ ${provider}. المبلغ أكبر من الحد الأقصى: ${max} ${currency}", + "error_text_limits_loading_failed":"لم يتم إنشاء الصفقة لـ ${provider}. فشل تحميل الحدود", + "error_text_template":"لا يمكن أن يحتوي اسم القالب وعنوانه على رموز ` , \"\nويجب أن يتراوح طولها بين 1 و 106 حرفًا", + + + "auth_store_ban_timeout":"مهلة_الحظر", + "auth_store_banned_for":"محظور ل", + "auth_store_banned_minutes":" دقيقة", + "auth_store_incorrect_password":"PIN خطأ", + "wallet_store_monero_wallet":"محفظة Monero", + "wallet_restoration_store_incorrect_seed_length":"طول السييد غير صحيح", + + + "full_balance":"الرصيد الكامل", + "available_balance":"الرصيد المتوفر", + "hidden_balance":"الميزان الخفي", + + + "sync_status_syncronizing":"يتم المزامنة", + "sync_status_syncronized":"متزامن", + "sync_status_not_connected":"غير متصل", + "sync_status_starting_sync":"بدء المزامنة", + "sync_status_failed_connect":"انقطع الاتصال", + "sync_status_connecting":"يتم التوصيل", + "sync_status_connected":"متصل", + "sync_status_attempting_sync":"جاري محاولة المزامنة", + + + "transaction_priority_slow":"بطيء", + "transaction_priority_regular":"عادي", + "transaction_priority_medium":"متوسط", + "transaction_priority_fast":"سريع", + "transaction_priority_fastest":"أسرع", + + + "trade_for_not_created":"لم يتم إنشاء التداول للعنصر ${title}.", + "trade_not_created":"التداول لم ينشأ", + "trade_id_not_found":"تداول ${tradeId} من ${title} غير موجود.", + "trade_not_found":"التداول غير موجودة.", + + + "trade_state_pending":"قيد الانتظار", + "trade_state_confirming":"جاري التأكيد", + "trade_state_trading":"يتم التداول", + "trade_state_traded":"تم التداول بنجاح", + "trade_state_complete":"اكتمل", + "trade_state_to_be_created":"ليتم انشائه", + "trade_state_unpaid":"غير مدفوعة", + "trade_state_underpaid":"أجر أقل من اللازم", + "trade_state_paid_unconfirmed":"دفع غير مؤكد", + "trade_state_paid":"مدفوع", + "trade_state_btc_sent":"تم أرسل Btc", + "trade_state_timeout":"نفذ الوقت", + "trade_state_created":"تم الأنشاء", + "trade_state_finished":"تم", + + "change_language":"تغيير اللغة", + "change_language_to":"هل تريد تغيير اللغة إلى ${language}؟", + + "paste":"لصق", + "restore_from_seed_placeholder":"الرجاء إدخال أو لصق السييد الخاصة بك هنا", + "add_new_word":"أضف كلمة جديدة", + "incorrect_seed":"النص الذي تم إدخاله غير صالح.", + + "biometric_auth_reason":"امسح بصمة إصبعك للمصادقة", + "version":"الإصدار ${currentVersion}", + + "extracted_address_content":"سوف ترسل الأموال إلى\n${recipient_name}", + + "card_address":"العنوان:", + "buy":"اشتري", + "sell":"بيع", + + "placeholder_transactions":"سيتم عرض معاملاتك هنا", + "placeholder_contacts":"سيتم عرض جهات الاتصال الخاصة بك هنا", + + "template":"قالب", + "confirm_delete_template":"سيؤدي هذا الإجراء إلى حذف هذا القالب. هل ترغب في الاستمرار؟", + "confirm_delete_wallet":"سيؤدي هذا الإجراء إلى حذف هذه المحفظة. هل ترغب في الاستمرار؟", + + "picker_description":"لاختيار ChangeNOW أو MorphToken ، يرجى تغيير زوج التداول الخاص بك أولاً", + + "change_wallet_alert_title":"تغيير المحفظة الحالية", + "change_wallet_alert_content":"هل تريد تغيير المحفظة الحالية إلى ${wallet_name}؟", + + "creating_new_wallet":"يتم إنشاء محفظة جديدة", + "creating_new_wallet_error":"خطأ: ${description}", + + "seed_alert_title":"انتباه", + "seed_alert_content":"السييد هي الطريقة الوحيدة لاسترداد محفظتك. هل كتبتها؟", + "seed_alert_back":"العودة إلى الوراء", + "seed_alert_yes":"نعم، فعلت ذلك", + + "exchange_sync_alert_content":"يرجى الانتظار حتى تتم مزامنة محفظتك", + + "pre_seed_title":"مهم", + "pre_seed_description":"في الصفحة التالية ستشاهد سلسلة من الكلمات ${words}. هذه هي سييد الفريدة والخاصة بك وهي الطريقة الوحيدة لاسترداد محفظتك في حالة فقدها أو عطلها. تقع على عاتقك مسؤولية تدوينها وتخزينها في مكان آمن خارج تطبيق Cake Wallet.", + "pre_seed_button_text":"انا أفهم. أرني سييد الخاص بي", + + "xmr_to_error":"خطأ XMR.TO", + "xmr_to_error_description":"مبلغ غير صحيح. الحد الأقصى 8 أرقام بعد الفاصلة العشرية", + + "provider_error":"خطأ ${provider}", + + "use_ssl":"استخدم SSL", + "trusted":"موثوق به", + + "color_theme":"سمة اللون", + "light_theme":"فاتح", + "bright_theme":"مشرق", + "dark_theme":"داكن", + "enter_your_note":"أدخل ملاحظتك ...", + "note_optional":"ملاحظة (اختياري)", + "note_tap_to_change":"ملاحظة (انقر للتغيير)", + "view_in_block_explorer":"عرض في Block Explorer", + "view_transaction_on":"عرض العملية على", + "transaction_key":"مفتاح العملية", + "confirmations":"التأكيدات", + "recipient_address":"عنوان المستلم", + + "extra_id":"معرف إضافي:", + "destination_tag":"علامة الوجهة:", + "memo":"مذكرة:", + + "backup":"نسخ الاحتياطي", + "change_password":"تغيير كلمة المرور", + "backup_password":"كلمة مرور النسخ الاحتياطي", + "write_down_backup_password":"يرجى كتابة كلمة المرور الاحتياطية الخاصة بك ، والتي يتم استخدامها لاستيراد ملفات النسخ الاحتياطي الخاصة بك.", + "export_backup":"تصدير نسخة احتياطية", + "save_backup_password":"يرجى التأكد من حفظ كلمة المرور الاحتياطية. لن تتمكن من استيراد ملفات النسخ الاحتياطي بدونها.", + "backup_file":"ملف النسخ الاحتياطي", + + "edit_backup_password":"تعديل كلمة مرور النسخ الاحتياطي", + "save_backup_password_alert":"حفظ كلمة المرور الاحتياطية", + "change_backup_password_alert":"لن تكون ملفات النسخ الاحتياطي السابقة متاحة للاستيراد بكلمة مرور نسخ احتياطي جديدة. سيتم استخدام كلمة مرور النسخ الاحتياطي الجديدة لملفات النسخ الاحتياطي الجديدة فقط. هل أنت متأكد أنك تريد تغيير كلمة المرور الاحتياطية؟", + + "enter_backup_password":"أدخل كلمة المرور الاحتياطية هنا", + "select_backup_file":"حدد ملف النسخ الاحتياطي", + "import":"اختيار ملف", + "please_select_backup_file":"الرجاء تحديد ملف النسخ الاحتياطي وإدخال كلمة مرور النسخ الاحتياطي.", + + "fixed_rate":"السعر الثابت", + "fixed_rate_alert":"ستتمكن من إدخال مبلغ الاستلام عند تشغيل وضع السعر الثابت. هل تريد التبديل إلى وضع السعر الثابت؟", + + "xlm_extra_info":"من فضلك لا تنس تحديد معرّف المذكرة أثناء إرسال معاملة XLM للتبادل", + "xrp_extra_info":"من فضلك لا تنس تحديد علامة الوجهة أثناء إرسال معاملة XRP للتبادل", + + "exchange_incorrect_current_wallet_for_xmr":"إذا كنت ترغب في استبدال XMR من رصيد Cake Wallet Monero ، فيرجى التبديل إلى محفظة Monero أولاً.", + "confirmed":"مؤكد", + "unconfirmed":"غير مؤكد", + "displayable":"قابل للعرض", + + "submit_request":"تقديم طلب", + + "buy_alert_content":"لا ندعم حاليًا سوى شراء Bitcoin و Litecoin. لشراء Bitcoin أو Litecoin ، يرجى إنشاء محفظة Bitcoin أو Litecoin أو التبديل إليها.", + "sell_alert_content":"نحن ندعم حاليًا بيع البيتكوين فقط. لبيع Bitcoin ، يرجى إنشاء أو التبديل إلى محفظة Bitcoin الخاصة بك.", + + "outdated_electrum_wallet_description":"محافظ Bitcoin الجديدة التي تم إنشاؤها في Cake الآن سييد مكونة من 24 كلمة. من الضروري أن تقوم بإنشاء محفظة Bitcoin جديدة وتحويل جميع أموالك إلى المحفظة الجديدة المكونة من 24 كلمة ، والتوقف عن استخدام محافظ سييد مكونة من 12 كلمة. يرجى القيام بذلك على الفور لتأمين أموالك.", + "understand":"لقد فهمت", + + "apk_update":"تحديث APK", + + "buy_bitcoin":"شراء Bitcoin", + "buy_with":"اشتر بواسطة", + "moonpay_alert_text":"يجب أن تكون قيمة المبلغ أكبر من أو تساوي ${minAmount} ${fiatCurrency}", + + "outdated_electrum_wallet_receive_warning":"إذا كانت هذه المحفظة تحتوي على سييد مكونة من 12 كلمة وتم إنشاؤها في Cake ، فلا تقم بإيداع Bitcoin في هذه المحفظة. قد يتم فقد أي BTC تم تحويله إلى هذه المحفظة. قم بإنشاء محفظة جديدة مكونة من 24 كلمة (انقر فوق القائمة في الجزء العلوي الأيمن ، وحدد محافظ ، واختر إنشاء محفظة جديدة ، ثم حدد Bitcoin) وقم على الفور بنقل BTC الخاص بك هناك. محافظ BTC الجديدة (24 كلمة) من Cake آمنة", + "do_not_show_me":"لا ترني هذا مجددا", + + "unspent_coins_title":"العملات الغير المنفقة", + "unspent_coins_details_title":"تفاصيل العملات الغير المنفقة", + "freeze":"تجميد", + "frozen":"مجمدة", + "coin_control":"التحكم في العملة (اختياري)", + + "address_detected":"تم ايجاد العنوان", + "address_from_domain":"هذا العنوان من ${domain} من Unstoppable Domains", + + "add_receiver":"أضف مستقبل آخر (اختياري)", + + "manage_yats":"إدارة Yats", + "yat_alert_title":"أرسل واستقبل العملات المشفرة بسهولة أكبر مع Yat", + "yat_alert_content":"يمكن لمستخدمي Cake Wallet الآن إرسال واستلام جميع عملاتهم المفضلة باستخدام اسم مستخدم فريد من نوعه قائم على الرموز التعبيرية.", + "get_your_yat":"احصل على Yat", + "connect_an_existing_yat":"توصيل Yat الحالي", + "connect_yats":"توصيل Yats", + "yat_address":"عنوان Yat", + "yat":"Yat", + "address_from_yat":"هذا العنوان من ${emoji} على Yat", + "yat_error":"خطأ Yat", + "yat_error_content":"لا توجد عناوين مرتبطة بهذا Yat. جرب يات آخر", + "choose_address":"\n\nالرجاء اختيار عنوان:", + "yat_popup_title":"يمكن تحويل عنوان محفظتك إلى رموز تعبيرية.", + "yat_popup_content":"يمكنك الآن إرسال واستلام العملات المشفرة في Cake Wallet باستخدام Yat - اسم مستخدم قصير يعتمد على الرموز التعبيرية. إدارة Yats في أي وقت على شاشة الإعدادات", + "second_intro_title":"عنوان تعبيري ايموجي واحد يحكمهم جميعا!", + "second_intro_content":"Yat الخاص بك هو عنوان تعبيري فريد يحل محل جميع العناوين السداسية العشرية الطويلة لجميع عملاتك.", + "third_intro_title":"يتماشي Yat بلطف مع الآخرين", + "third_intro_content":"يعيش Yats خارج Cake Wallet أيضًا. يمكن استبدال أي عنوان محفظة على وجه الأرض بـ Yat!", + "learn_more":"اعرف المزيد", + "search":"بحث", + "search_language":"ابحث عن لغة", + "search_currency":"ابحث عن عملة", + "new_template":"قالب جديد", + "electrum_address_disclaimer":"نقوم بإنشاء عناوين جديدة في كل مرة تستخدم فيها عنوانًا ، لكن العناوين السابقة تستمر في العمل", + "wallet_name_exists":"توجد بالفعل محفظة بهذا الاسم. الرجاء اختيار اسم مختلف أو إعادة تسمية المحفظة الأخرى أولاً.", + "market_place":"منصة التجارة", + "cake_pay_title":"بطاقات هدايا Cake Pay", + "cake_pay_subtitle":"شراء بطاقات هدايا مخفضة السعر (الولايات المتحدة فقط)", + "cake_pay_web_cards_title":"بطاقات Cake Pay Web", + "cake_pay_web_cards_subtitle":"اشتري بطاقات مدفوعة مسبقا وبطاقات هدايا في جميع أنحاء العالم", + "about_cake_pay":"يتيح لك Cake Pay شراء بطاقات هدايا بأصول افتراضية بسهولة ، ويمكن إنفاقها على الفور لدى أكثر من 150,000 تاجر في الولايات المتحدة.", + "cake_pay_account_note":"قم بالتسجيل باستخدام عنوان بريد إلكتروني فقط لمشاهدة البطاقات وشرائها. حتى أن بعضها متوفر بسعر مخفض!", + "already_have_account":"لديك حساب؟", + "create_account":"إنشاء حساب", + "privacy_policy":"سياسة الخصوصية", + "welcome_to_cakepay":"مرحبا بكم في Cake Pay!", + "sign_up":"اشتراك", + "forgot_password":"هل نسيت كلمة السر", + "reset_password":"إعادة تعيين كلمة المرور", + "gift_cards":"بطاقات الهدايا", + "setup_your_debit_card":"قم بإعداد بطاقة ائتمان الخاصة بك", + "no_id_required":"لا ID مطلوب. اشحن وانفق في أي مكان", + "how_to_use_card":"كيفية استخدام هذه البطاقة", + "purchase_gift_card":"شراء بطاقة هدايا", + "verification":"تَحَقّق", + "fill_code":"يرجى ملء رمز التحقق المرسل إلى بريدك الإلكتروني", + "dont_get_code":"لم تحصل على رمز؟", + "resend_code":"الرجاء إعادة إرسالها", + "debit_card":"بطاقة ائتمان", + "cakepay_prepaid_card":"بطاقة ائتمان CakePay مسبقة الدفع", + "no_id_needed":"لا حاجة لID!", + "frequently_asked_questions":"الأسئلة الشائعة", + "debit_card_terms":"يخضع تخزين واستخدام رقم بطاقة الدفع الخاصة بك (وبيانات الاعتماد المقابلة لرقم بطاقة الدفع الخاصة بك) في هذه المحفظة الرقمية لشروط وأحكام اتفاقية حامل البطاقة المعمول بها مع جهة إصدار بطاقة الدفع ، كما هو معمول به من وقت لآخر.", + "please_reference_document":"يرجى الرجوع إلى الوثائق أدناه لمزيد من المعلومات.", + "cardholder_agreement":"اتفاقية حامل البطاقة", + "e_sign_consent":"الموافقة على التوقيع الإلكتروني", + "agree_and_continue":"الموافقة ومتابعة", + "email_address":"عنوان البريد الالكترونى", + "agree_to":"من خلال إنشاء حساب فإنك توافق على", + "and":"و", + "enter_code":"ادخل الرمز", + "congratulations":"تهانينا!", + "you_now_have_debit_card":"لديك الآن بطاقة ائتمان", + "min_amount":"الحد الأدنى: ${value}", + "max_amount":"الحد الأقصى: ${value}", + "enter_amount":"أدخل المبلغ", + "billing_address_info":"إذا طُلب منك عنوان إرسال فواتير ، فأدخل عنوان الشحن الخاص بك", + "order_physical_card":"طلب البطاقة المادية", + "add_value":"إضافة قيمة", + "activate":"تفعيل", + "get_a":"احصل على", + "digital_and_physical_card":" بطاقة ائتمان رقمية ومادية مسبقة الدفع", + "get_card_note":" يمكنك إعادة تحميلها بالعملات الرقمية. لا توجد معلومات إضافية مطلوبة!", + "signup_for_card_accept_terms":"قم بالتسجيل للحصول على البطاقة وقبول الشروط.", + "add_fund_to_card":"أضف أموالاً مدفوعة مسبقًا إلى البطاقات (حتى ${value})", + "use_card_info_two":"يتم تحويل الأموال إلى الدولار الأمريكي عند الاحتفاظ بها في الحساب المدفوع مسبقًا ، وليس بالعملات الرقمية.", + "use_card_info_three":"استخدم البطاقة الرقمية عبر الإنترنت أو مع طرق الدفع غير التلامسية.", + "optionally_order_card":"اختياريا اطلب بطاقة فعلية (مادية).", + "hide_details":"أخف التفاصيل", + "show_details":"اظهر التفاصيل", + "upto":"حتى ${value}", + "discount":"وفر ${value}٪", + "gift_card_amount":"مبلغ بطاقة الهدايا", + "bill_amount":"مبلغ الفاتورة", + "you_pay":"انت تدفع", + "tip":"بقشيش:", + "custom":"مخصصة", + "by_cake_pay":"عن طريق Cake Pay", + "expires":"تنتهي", + "mm":"MM", + "yy":"YY", + "online":"متصل", + "offline":"غير متصل على الانترنت", + "gift_card_number":"رقم بطاقة الهدية", + "pin_number":"الرقم السري", + "total_saving":"إجمالي المدخرات", + "last_30_days":"آخر 30 يومًا", + "avg_savings":"متوسط مدخرات", + "view_all":"مشاهدة الكل", + "active_cards":"البطاقات النشطة", + "delete_account":"حذف الحساب", + "cards":"البطاقات", + "active":"نشيط", + "redeemed":"استردت", + "gift_card_balance_note":"ستظهر هنا بطاقات الهدايا ذات الرصيد المتبقي", + "gift_card_redeemed_note":"ستظهر هنا بطاقات الهدايا التي استردت قيمتها", + "logout":"تسجيل خروج", + "add_tip":"أضف بقشيش", + "percentageOf":"من ${amount}", + "is_percentage":"يكون", + "search_category":"فئة البحث", + "mark_as_redeemed":"وضع علامة كمسترد", + "more_options":"المزيد من الخيارات", + "awaiting_payment_confirmation":"في انتظار تأكيد الدفع", + "transaction_sent_notice":"إذا لم تستمر الشاشة بعد دقيقة واحدة ، فتحقق من مستكشف البلوك والبريد الإلكتروني.", + "agree":"موافق", + "in_store":"في المتجر", + "generating_gift_card":"يتم توليد بطاقة هدية", + "payment_was_received":"تم استلام الدفع الخاص بك.", + "proceed_after_one_minute":"إذا لم تستمر الشاشة بعد دقيقة واحدة ، فتحقق من بريدك الإلكتروني.", + "order_id":"رقم التعريف الخاص بالطلب", + "gift_card_is_generated":"تم إنشاء بطاقة الهدايا", + "open_gift_card":"افتح بطاقة الهدية", + "contact_support":"اتصل بالدعم", + "gift_cards_unavailable":"تتوفر بطاقات الهدايا للشراء فقط باستخدام Monero و Bitcoin و Litecoin في الوقت الحالي", + "introducing_cake_pay":"نقدم لكم Cake Pay!", + "cake_pay_learn_more":"شراء واسترداد بطاقات الهدايا على الفور في التطبيق!\nاسحب من اليسار إلى اليمين لمعرفة المزيد.", + "automatic":"تلقائي", + "fixed_pair_not_supported":"هذا الزوج الثابت غير مدعوم في التبادلات المحددة", + "variable_pair_not_supported":"هذا الزوج المتغير غير مدعوم في التبادلات المحددة", + "none_of_selected_providers_can_exchange":"لا يمكن لأي من مقدمي الخدمة المختارين إجراء هذا التبادل", + "choose_one":"اختر واحدة", + "choose_from_available_options":"اختر من بين الخيارات المتاحة:", + "custom_redeem_amount":"مبلغ الاسترداد مخصص", + "add_custom_redemption":"إضافة استرداد مخصص", + "remaining":"متبقي", + "delete_wallet":"حذف المحفظة", + "delete_wallet_confirm_message":"هل أنت متأكد أنك تريد حذف محفظة ${wallet_name}؟", + "low_fee":"رسوم منخفضة", + "low_fee_alert":"أنت تستخدم حاليًا أولوية منخفضة لرسوم الشبكة. قد يتسبب هذا في فترات انتظار طويلة ، أو أسعار مختلفة ، أو إلغاء صفقات. نوصي بتحديد رسوم أعلى لتجربة أفضل.", + "ignor":"تجاهل", + "use_suggested":"استخدام المقترح", + "do_not_share_warning_text":"لا تشارك هذه مع أي شخص آخر ، بما في ذلك الدعم.\n\nيمكن أن تتم سرقة أموالك!", + "help":"مساعده", + "all_transactions":"كل التحركات المالية", + "all_trades":"جميع عمليات التداول", + "connection_sync":"الاتصال والمزامنة", + "security_and_backup":"الأمان والنسخ الاحتياطي", + "create_backup":"انشئ نسخة احتياطية", + "privacy_settings":"إعدادات الخصوصية", + "privacy":"خصوصية", + "display_settings":"اعدادات العرض", + "other_settings":"اعدادات اخرى", + "require_pin_after":"طلب PIN بعد", + "always":"دائماً", + "minutes_to_pin_code":"${minutes} دقيقة", + "disable_exchange":"تعطيل التبادل", + "advanced_privacy_settings":"إعدادات الخصوصية المتقدمة", + "settings_can_be_changed_later":"يمكن تغيير هذه الإعدادات لاحقًا في إعدادات التطبيق", + "add_custom_node":"إضافة عقدة مخصصة جديدة", + "disable_fiat":"تعطيل fiat", + "fiat_api":"Fiat API", + "disabled":"معطلة", + "enabled":"ممكنة", + "tor_only":"Tor فقط", + "unmatched_currencies": "عملة محفظتك الحالية لا تتطابق مع عملة QR الممسوحة ضوئيًا", + "orbot_running_alert": "يرجى التأكد من تشغيل Orbot قبل الاتصال بهذه العقدة.", + "bitcoin_payments_require_1_confirmation": "تتطلب مدفوعات Bitcoin تأكيدًا واحدًا ، والذي قد يستغرق 20 دقيقة أو أكثر. شكرا لصبرك! سيتم إرسال بريد إلكتروني إليك عند تأكيد الدفع.", + "send_to_this_address" : "أرسل ${currency} ${tag}إلى هذا العنوان", + "arrive_in_this_address" : "سيصل ${currency} ${tag}إلى هذا العنوان", + "do_not_send": "لا ترسل", + "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق." +} diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 029c38051..f514c1465 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -48,7 +48,7 @@ "outgoing" : "Ausgehend", "transactions_by_date" : "Transaktionen nach Datum", "trades" : "Börsen", - "filters" : "Filter", + "filter_by": "Filtern nach", "today" : "Heute", "yesterday" : "Gestern", "received" : "Empfangen", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scannen Sie Ihren Fingerabdruck zur Authentifizierung", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Adresse Erkannt", - "openalias_alert_content" : "Sie senden Geld an\n${recipient_name}", + "extracted_address_content" : "Sie senden Geld an\n${recipient_name}", "card_address" : "Adresse:", "buy" : "Kaufen", @@ -539,7 +538,9 @@ "wallet_name_exists": "Wallet mit diesem Namen existiert bereits", "market_place": "Marktplatz", "cake_pay_title": "Cake Pay-Geschenkkarten", - "cake_pay_subtitle": "Geschenkkarten kaufen und sofort einlösen", + "cake_pay_subtitle": "Kaufen Sie ermäßigte Geschenkkarten (nur USA)", + "cake_pay_web_cards_title": "Cake Pay-Webkarten", + "cake_pay_web_cards_subtitle": "Kaufen Sie weltweit Prepaid-Karten und Geschenkkarten", "about_cake_pay": "Mit Cake Pay können Sie ganz einfach Geschenkkarten mit virtuellen Vermögenswerten kaufen, die Sie sofort bei über 150.000 Händlern in den Vereinigten Staaten ausgeben können.", "cake_pay_account_note": "Melden Sie sich nur mit einer E-Mail-Adresse an, um Karten anzuzeigen und zu kaufen. Einige sind sogar mit Rabatt erhältlich!", "already_have_account": "Sie haben bereits ein Konto?", @@ -654,6 +655,8 @@ "use_suggested": "Vorgeschlagen verwenden", "do_not_share_warning_text" : "Teilen Sie diese nicht mit anderen, einschließlich Support.\n\nIhr Geld kann und wird gestohlen werden!", "help": "hilfe", + "all_transactions": "Alle Transaktionen", + "all_trades": "Alle Gewerke", "connection_sync": "Verbindung und Synchronisierung", "security_and_backup": "Sicherheit und Datensicherung", "create_backup": "Backup erstellen", @@ -674,5 +677,13 @@ "enabled": "Ermöglicht", "tor_only": "Nur Tor", "unmatched_currencies": "Die Währung Ihres aktuellen Wallets stimmt nicht mit der des gescannten QR überein", + "orbot_running_alert": "Bitte stellen Sie sicher, dass Orbot läuft, bevor Sie sich mit diesem Knoten verbinden.", + "contact_list_contacts": "Kontakte", + "contact_list_wallets": "Meine Geldbörsen", + "bitcoin_payments_require_1_confirmation": "Bitcoin-Zahlungen erfordern 1 Bestätigung, was 20 Minuten oder länger dauern kann. Danke für Ihre Geduld! Sie erhalten eine E-Mail, wenn die Zahlung bestätigt ist.", + "send_to_this_address" : "Senden Sie ${currency} ${tag}an diese Adresse", + "arrive_in_this_address" : "${currency} ${tag}wird an dieser Adresse ankommen", + "do_not_send": "Nicht senden", + "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern.", "settings": "Einstellungen" } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 868d9968a..e541abf14 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -48,7 +48,7 @@ "outgoing" : "Outgoing", "transactions_by_date" : "Transactions by date", "trades" : "Trades", - "filters" : "Filter", + "filter_by": "Filter by", "today" : "Today", "yesterday" : "Yesterday", "received" : "Received", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scan your fingerprint to authenticate", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Address Detected", - "openalias_alert_content" : "You will be sending funds to\n${recipient_name}", + "extracted_address_content" : "You will be sending funds to\n${recipient_name}", "card_address" : "Address:", "buy" : "Buy", @@ -539,7 +538,9 @@ "wallet_name_exists": "A wallet with that name already exists. Please choose a different name or rename the other wallet first.", "market_place": "Marketplace", "cake_pay_title": "Cake Pay Gift Cards", - "cake_pay_subtitle": "Buy gift cards and redeem instantly", + "cake_pay_subtitle": "Buy discounted gift cards (USA only)", + "cake_pay_web_cards_title": "Cake Pay Web Cards", + "cake_pay_web_cards_subtitle": "Buy worldwide prepaid cards and gift cards", "about_cake_pay": "Cake Pay allows you to easily buy gift cards with virtual assets, spendable instantly at over 150,000 merchants in the United States.", "cake_pay_account_note": "Sign up with just an email address to see and purchase cards. Some are even available at a discount!", "already_have_account": "Already have an account?", @@ -654,6 +655,8 @@ "use_suggested": "Use Suggested", "do_not_share_warning_text" : "Do not share these with anyone else, including support.\n\nYour funds can and will be stolen!", "help": "help", + "all_transactions": "All transactions", + "all_trades": "All trades", "connection_sync": "Connection and sync", "security_and_backup": "Security and backup", "create_backup": "Create backup", @@ -674,5 +677,13 @@ "enabled": "Enabled", "tor_only": "Tor only", "unmatched_currencies": "Your current wallet's currency does not match that of the scanned QR", + "orbot_running_alert": "Please make sure Orbot is running prior to connecting to this node.", + "contact_list_contacts": "Contacts", + "contact_list_wallets": "My Wallets", + "bitcoin_payments_require_1_confirmation": "Bitcoin payments require 1 confirmation, which can take 20 minutes or longer. Thanks for your patience! You will be emailed when the payment is confirmed.", + "send_to_this_address" : "Send ${currency} ${tag}to this address", + "arrive_in_this_address" : "${currency} ${tag}will arrive in this address", + "do_not_send": "Don't send", + "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better.", "settings": "Settings" } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 6dc252b7e..03f0e31c1 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -48,7 +48,7 @@ "outgoing" : "Saliente", "transactions_by_date" : "Transacciones por fecha", "trades" : "Cambios", - "filters" : "Filtrar", + "filter_by": "Filtrado por", "today" : "Hoy", "yesterday" : "Ayer", "received" : "Recibido", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Escanee su huella digital para autenticar", "version" : "Versión ${currentVersion}", - "openalias_alert_title" : "Destinatario detectado", - "openalias_alert_content" : "Enviará fondos a\n${recipient_name}", + "extracted_address_content" : "Enviará fondos a\n${recipient_name}", "card_address" : "Dirección:", "buy" : "Comprar", @@ -539,7 +538,9 @@ "wallet_name_exists": "Wallet con ese nombre ya ha existido", "market_place": "Mercado", "cake_pay_title": "Tarjetas de regalo Cake Pay", - "cake_pay_subtitle": "Compra tarjetas de regalo y canjéalas al instante", + "cake_pay_subtitle": "Compre tarjetas de regalo con descuento (solo EE. UU.)", + "cake_pay_web_cards_title": "Tarjetas Web Cake Pay", + "cake_pay_web_cards_subtitle": "Compre tarjetas de prepago y tarjetas de regalo en todo el mundo", "about_cake_pay": "Cake Pay le permite comprar fácilmente tarjetas de regalo con activos virtuales, gastables instantáneamente en más de 150 000 comerciantes en los Estados Unidos.", "cake_pay_account_note": "Regístrese con solo una dirección de correo electrónico para ver y comprar tarjetas. ¡Algunas incluso están disponibles con descuento!", "already_have_account": "¿Ya tienes una cuenta?", @@ -654,6 +655,8 @@ "use_suggested": "Usar sugerido", "do_not_share_warning_text" : "No comparta estos con nadie más, incluido el soporte.\n\n¡Sus fondos pueden ser y serán robados!", "help": "ayuda", + "all_transactions": "Todas las transacciones", + "all_trades": "Todos los oficios", "connection_sync": "Conexión y sincronización", "security_and_backup": "Seguridad y respaldo", "create_backup": "Crear copia de seguridad", @@ -674,5 +677,13 @@ "enabled": "Activado", "tor_only": "solo Tor", "unmatched_currencies": "La moneda de su billetera actual no coincide con la del QR escaneado", + "orbot_running_alert": "Asegúrese de que Orbot se esté ejecutando antes de conectarse a este nodo.", + "contact_list_contacts": "Contactos", + "contact_list_wallets": "Mis billeteras", + "bitcoin_payments_require_1_confirmation": "Los pagos de Bitcoin requieren 1 confirmación, que puede demorar 20 minutos o más. ¡Gracias por su paciencia! Se le enviará un correo electrónico cuando se confirme el pago.", + "send_to_this_address" : "Enviar ${currency} ${tag}a esta dirección", + "arrive_in_this_address" : "${currency} ${tag}llegará a esta dirección", + "do_not_send": "no enviar", + "error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación.", "settings": "Configuraciones" } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 875f36a59..5e6df1dcc 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -46,7 +46,7 @@ "outgoing" : "Sortantes", "transactions_by_date" : "Transactions par date", "trades" : "Échanges", - "filters" : "Filtre", + "filter_by": "Filtrer par", "today" : "Aujourd'hui", "yesterday" : "Hier", "received" : "Reçus", @@ -149,7 +149,7 @@ "subaddresses" : "Sous-adresses", "addresses" : "Adresses", "scan_qr_code" : "Scannez le QR code pour obtenir l'adresse", - "qr_fullscreen" : "Appuyez pour ouvrir le QR code en plein écran", + "qr_fullscreen" : "Appuyez pour ouvrir le QR code en mode plein écran", "rename" : "Renommer", "choose_account" : "Choisir le compte", "create_new_account" : "Créer un nouveau compte", @@ -267,7 +267,7 @@ "new_subaddress_label_name" : "Nom", "new_subaddress_create" : "Créer", - "address_label" : "Étiquette de l'adresse", + "address_label" : "Nom de l'adresse", "subaddress_title" : "Liste des sous-adresses", @@ -396,8 +396,7 @@ "biometric_auth_reason" : "Scannez votre empreinte digitale pour vous authentifier", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Adresse Détectée", - "openalias_alert_content" : "Vous allez envoyer des fonds à\n${recipient_name}", + "extracted_address_content" : "Vous allez envoyer des fonds à\n${recipient_name}", "card_address" : "Adresse :", "buy" : "Acheter", @@ -534,10 +533,12 @@ "search_currency": "Rechercher une devise", "new_template" : "Nouveau Modèle", "electrum_address_disclaimer": "Nous générons de nouvelles adresses à chaque fois que vous en utilisez une, mais les adresses précédentes continuent à fonctionner", - "wallet_name_exists": "Un portefeuille portant ce nom existe déjà", + "wallet_name_exists": "Un portefeuille (wallet) portant ce nom existe déjà", "market_place": "Place de marché", "cake_pay_title": "Cartes cadeaux Cake Pay", - "cake_pay_subtitle": "Achetez des cartes-cadeaux et échangez-les instantanément", + "cake_pay_subtitle": "Achetez des cartes-cadeaux à prix réduit (États-Unis uniquement)", + "cake_pay_web_cards_title": "Cartes Web Cake Pay", + "cake_pay_web_cards_subtitle": "Achetez des cartes prépayées et des cartes-cadeaux dans le monde entier", "about_cake_pay": "Cake Pay vous permet d'acheter facilement des cartes-cadeaux avec des actifs virtuels, utilisables instantanément chez plus de 150 000 marchands aux États-Unis.", "cake_pay_account_note": "Inscrivez-vous avec juste une adresse e-mail pour voir et acheter des cartes. Certaines sont même disponibles à prix réduit !", "already_have_account": "Vous avez déjà un compte ?", @@ -560,7 +561,7 @@ "cakepay_prepaid_card": "Carte de débit prépayée Cake Pay", "no_id_needed": "Aucune pièce d'identité nécessaire !", "frequently_asked_questions": "Foire aux questions", - "debit_card_terms": "Le stockage et l'utilisation de votre numéro de carte de paiement (et des informations d'identification correspondant à votre numéro de carte de paiement) dans ce portefeuille numérique sont soumis aux conditions générales de l'accord du titulaire de carte applicable avec l'émetteur de la carte de paiement, en vigueur à partir de de temps en temps.", + "debit_card_terms": "Le stockage et l'utilisation de votre numéro de carte de paiement (et des informations d'identification correspondant à votre numéro de carte de paiement) dans ce portefeuille numérique peuvent être soumis aux conditions générales de l'accord du titulaire de carte parfois en vigueur avec l'émetteur de la carte de paiement.", "please_reference_document": "Veuillez vous référer aux documents ci-dessous pour plus d'informations.", "cardholder_agreement": "Contrat de titulaire de carte", "e_sign_consent": "Consentement de signature électronique", @@ -593,7 +594,7 @@ "gift_card_amount": "Montant de la carte-cadeau", "bill_amount": "Montant de la facture", "you_pay": "Vous payez", - "tip": "Astuce :", + "tip": "Pourboire :", "custom": "personnalisé", "by_cake_pay": "par Cake Pay", "expire": "Expire", @@ -615,7 +616,7 @@ "gift_card_balance_note": "Les cartes-cadeaux avec un solde restant apparaîtront ici", "gift_card_redeemed_note": "Les cartes-cadeaux que vous avez utilisées apparaîtront ici", "logout": "Déconnexion", - "add_tip": "Ajouter une astuce", + "add_tip": "Ajouter un pourboire", "percentageOf": "sur ${amount}", "is_percentage": "est", "search_category": "Catégorie de recherche", @@ -644,14 +645,16 @@ "custom_redeem_amount": "Montant d'échange personnalisé", "add_custom_redemption": "Ajouter un remboursement personnalisé", "remaining": "restant", - "delete_wallet": "Supprimer le portefeuille", - "delete_wallet_confirm_message" : "Êtes-vous sûr de vouloir supprimer le portefeuille ${wallet_name}?", + "delete_wallet": "Supprimer le portefeuille (wallet)", + "delete_wallet_confirm_message" : "Êtes-vous sûr de vouloir supprimer le portefeuille (wallet) ${wallet_name}?", "low_fee": "Frais modiques", "low_fee_alert": "Vous utilisez actuellement une priorité de frais de réseau peu élevés. Cela pourrait entraîner de longues attentes, des taux différents ou des transactions annulées. Nous vous recommandons de fixer des frais plus élevés pour une meilleure expérience.", "ignor": "Ignorer", "use_suggested": "Utilisation suggérée", - "do_not_share_warning_text" : "Ne les partagez avec personne d'autre, y compris avec l'assistance.\n\nVos fonds peuvent et seront volés!", - "help": "aider", + "do_not_share_warning_text" : "Ne les partagez avec personne, y compris avec l'assistance.\n\nVos fonds seraient inmanquablement volés !", + "help": "aide", + "all_transactions": "Toutes transactions", + "all_trades": "Tous échanges", "connection_sync": "Connexion et synchronisation", "security_and_backup": "Sécurité et sauvegarde", "create_backup": "Créer une sauvegarde", @@ -659,18 +662,26 @@ "privacy": "Confidentialité", "display_settings": "Paramètres d'affichage", "other_settings": "Autres paramètres", - "require_pin_after": "NIP requis après", + "require_pin_after": "Code PIN requis après", "always": "toujours", "minutes_to_pin_code": "${minute} minutes", "disable_exchange": "Désactiver l'échange", "advanced_privacy_settings": "Paramètres de confidentialité avancés", "settings_can_be_changed_later": "Ces paramètres peuvent être modifiés ultérieurement dans les paramètres de l'application", "add_custom_node": "Ajouter un nouveau nœud personnalisé", - "disable_fiat": "Désactiver fiat", + "disable_fiat": "Désactiver les montants en fiat", "fiat_api": "Fiat API", - "disabled": "Handicapé", + "disabled": "Désactivé", "enabled": "Activé", "tor_only": "Tor uniquement", - "unmatched_currencies": "La devise de votre portefeuille actuel ne correspond pas à celle du QR scanné", + "unmatched_currencies": "La devise de votre portefeuille (wallet) actuel ne correspond pas à celle du QR code scanné", + "orbot_running_alert": "Veuillez vous assurer qu'Orbot est en cours d'exécution avant de vous connecter à ce nœud.", + "contact_list_contacts": "Contacts", + "contact_list_wallets": "Mes portefeuilles (wallets)", + "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience! Vous serez averti par e-mail lorsque le paiement sera confirmé.", + "send_to_this_address" : "Envoyez ${currency} ${tag}à cette adresse", + "arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse", + "do_not_send": "N'envoyez pas", + "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application.", "settings": "Paramètres" } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 3b741d429..1a3ddff74 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -48,7 +48,7 @@ "outgoing" : "निवर्तमान", "transactions_by_date" : "तारीख से लेन-देन", "trades" : "ट्रेडों", - "filters" : "फ़िल्टर", + "filter_by": "के द्वारा छनित", "today" : "आज", "yesterday" : "बिता कल", "received" : "प्राप्त किया", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें", "version" : "संस्करण ${currentVersion}", - "openalias_alert_title" : "पता मिला", - "openalias_alert_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}", + "extracted_address_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}", "card_address" : "पता:", "buy" : "खरीदें", @@ -539,7 +538,9 @@ "wallet_name_exists": "उस नाम वाला वॉलेट पहले से मौजूद है", "market_place": "मार्केटप्लेस", "cake_pay_title": "केक पे गिफ्ट कार्ड्स", - "cake_pay_subtitle": "उपहार कार्ड खरीदें और तुरंत रिडीम करें", + "cake_pay_subtitle": "रियायती उपहार कार्ड खरीदें (केवल यूएसए)", + "cake_pay_web_cards_title": "केक भुगतान वेब कार्ड", + "cake_pay_web_cards_subtitle": "दुनिया भर में प्रीपेड कार्ड और गिफ्ट कार्ड खरीदें", "about_cake_pay": "केक पे आपको वर्चुअल संपत्ति के साथ आसानी से उपहार कार्ड खरीदने की अनुमति देता है, जिसे संयुक्त राज्य में 150,000 से अधिक व्यापारियों पर तुरंत खर्च किया जा सकता है।", "cake_pay_account_note": "कार्ड देखने और खरीदने के लिए केवल एक ईमेल पते के साथ साइन अप करें। कुछ छूट पर भी उपलब्ध हैं!", "ready_have_account": "क्या आपके पास पहले से ही एक खाता है?", @@ -654,6 +655,8 @@ "use_suggested": "सुझाए गए का प्रयोग करें", "do_not_share_warning_text" : "समर्थन सहित, इन्हें किसी और के साथ साझा न करें।\n\nआपके धन की चोरी हो सकती है और होगी!", "help": "मदद करना", + "all_transactions": "सभी लेन - देन", + "all_trades": "सभी व्यापार", "connection_sync": "कनेक्शन और सिंक", "security_and_backup": "सुरक्षा और बैकअप", "create_backup": "बैकअप बनाएँ", @@ -668,10 +671,18 @@ "advanced_privacy_settings": "उन्नत गोपनीयता सेटिंग्स", "settings_can_be_changed_later": "इन सेटिंग्स को बाद में ऐप सेटिंग में बदला जा सकता है", "add_custom_node": "नया कस्टम नोड जोड़ें", + "disable_fiat": "िएट को अक्षम करें", "fiat_api": "फिएट पैसे API", "disabled": "अक्षम", "enabled": "सक्रिय", "tor_only": "Tor केवल", - "unmatched_currencies": "आपके वर्तमान वॉलेट की मुद्रा स्कैन किए गए क्यूआर से मेल नहीं खाती", - "settings": "सेटिंग्स" + "unmatched_currencies": "आपके वर्तमान वॉलेट की मुद्रा स्कैन किए गए क्यूआर से मेल नहीं खाती" , + "orbot_running_alert": "कृपया सुनिश्चित करें कि इस नोड से कनेक्ट करने से पहले Orbot चल रहा है।", + "contact_list_contacts": "संपर्क", + "contact_list_wallets": "मेरा बटुआ", + "bitcoin_payments_require_1_confirmation": "बिटकॉइन भुगतान के लिए 1 पुष्टिकरण की आवश्यकता होती है, जिसमें 20 मिनट या अधिक समय लग सकता है। आपके धैर्य के लिए धन्यवाद! भुगतान की पुष्टि होने पर आपको ईमेल किया जाएगा।", + "send_to_this_address" : "इस पते पर ${currency} ${tag}भेजें", + "arrive_in_this_address" : "${currency} ${tag}इस पते पर पहुंचेंगे", + "do_not_send": "मत भेजो", + "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index b4a3d4f16..3595e02f1 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -48,7 +48,7 @@ "outgoing" : "Odlazno", "transactions_by_date" : "Transakcije prema datumu", "trades" : "Razmjene", - "filters" : "Filter", + "filter_by": "Filtrirati po", "today" : "Danas", "yesterday" : "Jučer", "received" : "Primljeno", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Skenirajte svoj otisak prsta za autentifikaciju", "version" : "Verzija ${currentVersion}", - "openalias_alert_title" : "Otkrivena je adresa", - "openalias_alert_content" : "Poslat ćete sredstva primatelju\n${recipient_name}", + "extracted_address_content" : "Poslat ćete sredstva primatelju\n${recipient_name}", "card_address" : "Adresa:", "buy" : "Kupi", @@ -539,7 +538,9 @@ "wallet_name_exists": "Novčanik s tim nazivom već postoji", "market_place": "Tržnica", "cake_pay_title": "Cake Pay poklon kartice", - "cake_pay_subtitle": "Kupite darovne kartice i odmah ih iskoristite", + "cake_pay_subtitle": "Kupite darovne kartice s popustom (samo SAD)", + "cake_pay_web_cards_title": "Cake Pay Web kartice", + "cake_pay_web_cards_subtitle": "Kupujte prepaid kartice i poklon kartice diljem svijeta", "about_cake_pay": "Cake Pay vam omogućuje jednostavnu kupnju darovnih kartica s virtualnim sredstvima, koja se trenutno mogu potrošiti kod više od 150 000 trgovaca u Sjedinjenim Državama.", "cake_pay_account_note": "Prijavite se samo s adresom e-pošte da biste vidjeli i kupili kartice. Neke su čak dostupne uz popust!", "already_have_account": "Već imate račun?", @@ -654,6 +655,8 @@ "use_suggested": "Koristite predloženo", "do_not_share_warning_text" : "Nemojte ih dijeliti ni s kim, uključujući podršku.\n\nVaša sredstva mogu i bit će ukradena!", "help": "pomozite", + "all_transactions": "Sve transakcije", + "all_trades": "Svi obrti", "connection_sync": "Povezivanje i sinkronizacija", "security_and_backup": "Sigurnost i sigurnosna kopija", "create_backup": "Stvori sigurnosnu kopiju", @@ -674,5 +677,13 @@ "enabled": "Omogućeno", "tor_only": "Samo Tor", "unmatched_currencies": "Valuta vašeg trenutnog novčanika ne odgovara onoj na skeniranom QR-u", + "orbot_running_alert": "Provjerite radi li Orbot prije spajanja na ovaj čvor.", + "contact_list_contacts": "Kontakti", + "contact_list_wallets": "Moji novčanici", + "bitcoin_payments_require_1_confirmation": "Bitcoin plaćanja zahtijevaju 1 potvrdu, što može potrajati 20 minuta ili dulje. Hvala na Vašem strpljenju! Dobit ćete e-poruku kada plaćanje bude potvrđeno.", + "send_to_this_address" : "Pošaljite ${currency} ${tag}na ovu adresu", + "arrive_in_this_address" : "${currency} ${tag}će stići na ovu adresu", + "do_not_send": "Ne šalji", + "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju.", "settings": "Postavke" } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 5de0f9b8a..85c5fdb35 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -48,7 +48,7 @@ "outgoing" : "In uscita", "transactions_by_date" : "Transazioni per data", "trades" : "Scambi", - "filters" : "Filtri", + "filter_by": "Filtrirati po", "today" : "Oggi", "yesterday" : "Ieri", "received" : "Ricevuto", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scansiona la tua impronta per autenticarti", "version" : "Versione ${currentVersion}", - "openalias_alert_title" : "Indirizzo Rilevato", - "openalias_alert_content" : "Invierai i tuoi fondi a\n${recipient_name}", + "extracted_address_content" : "Invierai i tuoi fondi a\n${recipient_name}", "card_address" : "Indirizzo:", "buy" : "Comprare", @@ -539,7 +538,9 @@ "wallet_name_exists": "Il portafoglio con quel nome è già esistito", "market_place": "Mercato", "cake_pay_title": "Carte regalo Cake Pay", - "cake_pay_subtitle": "Acquista carte regalo e riscattale all'istante", + "cake_pay_subtitle": "Acquista buoni regalo scontati (solo USA)", + "cake_pay_web_cards_title": "Carte Web Cake Pay", + "cake_pay_web_cards_subtitle": "Acquista carte prepagate e carte regalo in tutto il mondo", "about_cake_pay": "Cake Pay ti consente di acquistare facilmente buoni regalo con asset virtuali, spendibili istantaneamente presso oltre 150.000 commercianti negli Stati Uniti.", "cake_pay_account_note": "Iscriviti con solo un indirizzo email per vedere e acquistare le carte. Alcune sono anche disponibili con uno sconto!", "already_have_account": "Hai già un account?", @@ -654,6 +655,8 @@ "use_suggested": "Usa suggerito", "do_not_share_warning_text" : "Non condividerli con nessun altro, incluso il supporto.\n\nI tuoi fondi possono e saranno rubati!", "help": "aiuto", + "all_transactions": "Sve transakcije", + "all_trades": "Svi obrti", "connection_sync": "Connessione e sincronizzazione", "security_and_backup": "Sicurezza e backup", "create_backup": "Crea backup", @@ -674,5 +677,13 @@ "enabled": "Abilitato", "tor_only": "Solo Tor", "unmatched_currencies": "La valuta del tuo portafoglio attuale non corrisponde a quella del QR scansionato", + "orbot_running_alert": "Assicurati che Orbot sia in esecuzione prima di connetterti a questo nodo.", + "contact_list_contacts": "Contatti", + "contact_list_wallets": "I miei portafogli", + "bitcoin_payments_require_1_confirmation": "I pagamenti in bitcoin richiedono 1 conferma, che può richiedere 20 minuti o più. Grazie per la vostra pazienza! Riceverai un'e-mail quando il pagamento sarà confermato.", + "send_to_this_address" : "Invia ${currency} ${tag}a questo indirizzo", + "arrive_in_this_address" : "${currency} ${tag}arriverà a questo indirizzo", + "do_not_send": "Non inviare", + "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju.", "settings": "Impostazioni" } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 590bffefa..831056785 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -48,7 +48,7 @@ "outgoing" : "発信", "transactions_by_date" : "日付ごとの取引", "trades" : "取引", - "filters" : "フィルタ", + "filter_by": "でフィルタリング", "today" : "今日", "yesterday" : "昨日", "received" : "受け取った", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "प指紋をスキャンして認証する", "version" : "バージョン ${currentVersion}", - "openalias_alert_title" : "アドレスが検出されました", - "openalias_alert_content" : "に送金します\n${recipient_name}", + "extracted_address_content" : "に送金します\n${recipient_name}", "card_address" : "住所:", "buy" : "購入", @@ -539,7 +538,9 @@ "wallet_name_exists": "その名前のウォレットはすでに存在しています", "market_place": "Marketplace", "cake_pay_title": "ケーキペイギフトカード", - "cake_pay_subtitle": "ギフトカードを購入してすぐに利用できます", + "cake_pay_subtitle": "割引ギフトカードを購入する (米国のみ)", + "cake_pay_web_cards_title": "Cake Pay ウェブカード", + "cake_pay_web_cards_subtitle": "世界中のプリペイド カードとギフト カードを購入する", "about_cake_pay": "Cake Payを使用すると、仮想資産を含むギフトカードを簡単に購入でき、米国内の150,000を超える加盟店ですぐに利用できます。", "cake_pay_account_note": "メールアドレスだけでサインアップして、カードを表示して購入できます。割引価格で利用できるカードもあります!", "already_have_account": "すでにアカウントをお持ちですか?", @@ -654,6 +655,8 @@ "use_suggested": "推奨を使用", "do_not_share_warning_text" : "サポートを含め、これらを他の誰とも共有しないでください。\n\nあなたの資金は盗まれる可能性があります!", "help": "ヘルプ", + "all_transactions": "全取引", + "all_trades": "すべての取引", "connection_sync": "接続と同期", "security_and_backup": "セキュリティとバックアップ", "create_backup": "バックアップを作成", @@ -674,5 +677,12 @@ "enabled": "有効", "tor_only": "Torのみ", "unmatched_currencies": "現在のウォレットの通貨がスキャンされたQRの通貨と一致しません", - "settings": "設定" + "orbot_running_alert": "このノードに接続する前に、Orbot が実行されていることを確認してください", + "contact_list_contacts": "連絡先", + "contact_list_wallets": "マイウォレット", + "bitcoin_payments_require_1_confirmation": "ビットコインの支払いには 1 回の確認が必要で、これには 20 分以上かかる場合があります。お待ち頂きまして、ありがとうございます!支払いが確認されると、メールが送信されます。", + "send_to_this_address" : "${currency} ${tag}をこのアドレスに送金", + "arrive_in_this_address" : "${currency} ${tag}はこの住所に到着します", + "do_not_send": "送信しない", + "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione." } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index ad7711181..cc4c42eaf 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -48,7 +48,7 @@ "outgoing" : "나가는", "transactions_by_date" : "날짜 별 거래", "trades" : "거래", - "filters" : "필터", + "filter_by": "필터링 기준", "today" : "오늘", "yesterday" : "어제", "received" : "받았습니다", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "지문을 스캔하여 인증", "version" : "버전 ${currentVersion}", - "openalias_alert_title" : "주소 감지됨", - "openalias_alert_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}", + "extracted_address_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}", "card_address" : "주소:", "buy" : "구입", @@ -539,7 +538,9 @@ "wallet_name_exists": "해당 이름의 지갑이 이미 존재합니다.", "market_place": "마켓플레이스", "cake_pay_title": "케이크 페이 기프트 카드", - "cake_pay_subtitle": "기프트 카드를 구매하고 즉시 사용", + "cake_pay_subtitle": "할인된 기프트 카드 구매(미국만 해당)", + "cake_pay_web_cards_title": "케이크페이 웹카드", + "cake_pay_web_cards_subtitle": "전 세계 선불 카드 및 기프트 카드 구매", "about_cake_pay": "Cake Pay를 사용하면 미국 내 150,000개 이상의 가맹점에서 즉시 사용할 수 있는 가상 자산이 포함된 기프트 카드를 쉽게 구입할 수 있습니다.", "cake_pay_account_note": "이메일 주소로 가입하면 카드를 보고 구매할 수 있습니다. 일부는 할인된 가격으로 사용 가능합니다!", "already_have_account": "이미 계정이 있습니까?", @@ -654,6 +655,8 @@ "use_suggested": "추천 사용", "do_not_share_warning_text" : "지원을 포함하여 다른 사람과 이러한 정보를 공유하지 마십시오.\n\n귀하의 자금은 도난당할 수 있고 도난당할 수 있습니다!", "help": "돕다", + "all_transactions": "모든 거래 창구", + "all_trades": "A모든 거래", "connection_sync": "연결 및 동기화", "security_and_backup": "보안 및 백업", "create_backup": "백업 생성", @@ -674,5 +677,13 @@ "enabled": "사용", "tor_only": "Tor 뿐", "unmatched_currencies": "현재 지갑의 통화가 스캔한 QR의 통화와 일치하지 않습니다.", + "orbot_running_alert": "이 노드에 연결하기 전에 Orbot이 실행 중인지 확인하십시오.", + "contact_list_contacts": "콘택트 렌즈", + "contact_list_wallets": "내 지갑", + "bitcoin_payments_require_1_confirmation": "비트코인 결제는 1번의 확인이 필요하며 20분 이상이 소요될 수 있습니다. 기다려 주셔서 감사합니다! 결제가 확인되면 이메일이 전송됩니다.", + "send_to_this_address" : "이 주소로 ${currency} ${tag}송금", + "arrive_in_this_address" : "${currency} ${tag}이(가) 이 주소로 도착합니다", + "do_not_send": "보내지 마세요", + "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오.", "settings": "설정" } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb new file mode 100644 index 000000000..401f5af3a --- /dev/null +++ b/res/values/strings_my.arb @@ -0,0 +1,688 @@ +{ + "welcome" : "မှကြိုဆိုပါတယ်။", + "cake_wallet" : "Cake ပိုက်ဆံအိတ်", + "first_wallet_text" : "Monero၊ Bitcoin၊ Litecoin နှင့် Haven အတွက် အလွန်ကောင်းမွန်သော ပိုက်ဆံအိတ်", + "please_make_selection" : "သင့်ပိုက်ဆံအိတ်ကို ဖန်တီးရန် သို့မဟုတ် ပြန်လည်ရယူရန် အောက်တွင် ရွေးချယ်မှုတစ်ခု ပြုလုပ်ပါ။", + "create_new" : "Wallet အသစ်ဖန်တီးပါ။", + "restore_wallet" : "ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + + "monero_com" : "Monero.com မှ Cake ပိုက်ဆံအိတ်", + "monero_com_wallet_text" : "Monero အတွက် အမိုက်စား ပိုက်ဆံအိတ်", + + "haven_app" : "ဟေးဗင် ကိတ် ဝေါလက်", + "haven_app_wallet_text" : "ဟေဗင်အတွက် အံ့ဩစရာကောင်းတဲ့ ပိုက်ဆံအုံး", + + "accounts" : "အကောင့်များ", + "edit" : "တည်းဖြတ်ပါ။", + "account" : "အကောင့်", + "add" : "ထည့်ပါ။", + + + "address_book" : "လိပ်စာစာအုပ်", + "contact" : "ဆက်သွယ်ရန်", + "please_select" : "ကျေးဇူးပြု၍ ရွေးချယ်ပါ-", + "cancel" : "မလုပ်တော့", + "ok" : "ရလား", + "contact_name" : "ဆက်သွယ်ရန်အမည်", + "reset" : "ပြန်လည်သတ်မှတ်ပါ။", + "save" : "သိမ်းဆည်းပါ။", + "address_remove_contact" : "အဆက်အသွယ်ကို ဖယ်ရှားပါ။", + "address_remove_content" : "ရွေးချယ်ထားသောအဆက်အသွယ်ကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။", + + + "authenticated" : "အစစ်အမှန်", + "authentication" : "စစ်ဆေးခြင်း", + "failed_authentication" : "အထောက်အထားစိစစ်ခြင်း မအောင်မြင်ပါ။. ${state_error}", + + + "wallet_menu" : "မီနူး", + "Blocks_remaining" : "${status} ဘလောက်များ ကျန်နေပါသည်။", + "please_try_to_connect_to_another_node" : "အခြား node သို့ ချိတ်ဆက်ရန် ကြိုးစားပါ။", + "xmr_hidden" : "ဝှက်ထားသည်။", + "xmr_available_balance" : "လက်ကျန်ငွေ ရရှိနိုင်", + "xmr_full_balance" : "မျှတမှု အပြည့်အစုံ", + "send" : "ပို့ပါ။", + "receive" : "လက်ခံသည်။", + "transactions" : "ငွေပေးငွေယူ", + "incoming" : "ဝင်လာ", + "outgoing" : "အထွက်", + "transactions_by_date" : "ရက်စွဲအလိုက် ငွေလွှဲမှုများ", + "trades" : "ကုန်သွယ်မှုများ", + "filter_by" : "အလိုက် စစ်ထုတ်ပါ။", + "today" : "ဒီနေ့", + "yesterday" : "မနေ့က", + "received" : "ရရှိခဲ့သည်။", + "sent" : "ပို့လိုက်ပါတယ်။", + "pending" : " (ဆိုင်းငံ့)", + "rescan" : "ပြန်စကင်န်လုပ်ပါ။", + "reconnect" : "ပြန်လည်ချိတ်ဆက်ပါ။", + "wallets" : "ပိုက်ဆံအိတ်", + "show_seed" : "မျိုးစေ့ကိုပြပါ။", + "show_keys" : "မျိုးစေ့ /သော့များကို ပြပါ။", + "address_book_menu" : "လိပ်စာစာအုပ်", + "reconnection" : "ပြန်လည်ချိတ်ဆက်မှု", + "reconnect_alert_text" : "ပြန်လည်ချိတ်ဆက်လိုသည်မှာ သေချာပါသလား။ ?", + + + "exchange" : "ချိန်းတယ်။", + "clear" : "ရှင်းလင်းသော", + "refund_address" : "ပြန်အမ်းငွေလိပ်စာ", + "change_exchange_provider" : "အပြန်အလှန် လဲလှယ်ရေး ထောက်ပံ့ပေးသူကို ပြောင်းလဲပါ", + "you_will_send" : "မှပြောင်းပါ။", + "you_will_get" : "သို့ပြောင်းပါ။", + "amount_is_guaranteed" : "ရရှိသည့်ပမာဏကို အာမခံပါသည်။", + "amount_is_estimate" : "ရရှိသည့်ပမာဏသည် ခန့်မှန်းချက်တစ်ခုဖြစ်သည်။", + "powered_by" : "${title} မှ ပံ့ပိုးပေးသည်", + "error" : "အမှား", + "estimated" : "ခန့်မှန်း", + "min_value" : "အနည်းဆုံး- ${value} ${currency}", + "max_value" : "အများဆုံး- ${value} ${currency}", + "change_currency" : "ငွေကြေးကိုပြောင်းပါ။", + "overwrite_amount" : "ပမာဏကို ထပ်ရေးပါ။", + "qr_payment_amount" : "ဤ QR ကုဒ်တွင် ငွေပေးချေမှုပမာဏတစ်ခုပါရှိသည်။ လက်ရှိတန်ဖိုးကို ထပ်ရေးလိုပါသလား။", + + "copy_id" : "ID ကူးယူပါ။", + "exchange_result_write_down_trade_id" : "ရှေ့ဆက်ရန် ကုန်သွယ်မှု ID ကို ကူးယူ သို့မဟုတ် ချရေးပါ။", + "trade_id" : "ကုန်သွယ်မှု ID:", + "copied_to_clipboard" : "ကလစ်ဘုတ်သို့ ကူးယူထားသည်။", + "saved_the_trade_id" : "ကုန်သွယ်မှု ID ကို သိမ်းဆည်းပြီးပါပြီ။", + "fetching" : "ခေါ်ယူခြင်း။", + "id" : "ID:", + "amount" : "ပမာဏ:", + "payment_id" : "ငွေပေးချေမှု ID:", + "status" : "အခြေအနေ:", + "offer_expires_in" : "ကမ်းလှမ်းချက် သက်တမ်းကုန်သည်:", + "trade_is_powered_by" : "ဤကုန်သွယ်မှုကို ${provider} မှ လုပ်ဆောင်သည်", + "copy_address" : "လိပ်စာကို ကူးယူပါ။", + "exchange_result_confirm" : "အတည်ပြုချက်ကို နှိပ်ခြင်းဖြင့်၊ သင်သည် ${fetchingLabel} ${from} ဟုခေါ်သော သင့်ပိုက်ဆံအိတ်မှ ${walletName} ကို အောက်ဖော်ပြပါလိပ်စာသို့ ပေးပို့မည်ဖြစ်ပါသည်။ သို့မဟုတ် သင့်ပြင်ပပိုက်ဆံအိတ်မှ အောက်ပါလိပ်စာ/QR ကုဒ်သို့ ပေးပို့နိုင်ပါသည်။\n\nပမာဏများကို ပြောင်းလဲရန် ဆက်လက်လုပ်ဆောင်ရန် သို့မဟုတ် ပြန်သွားရန် အတည်ပြုချက်ကို နှိပ်ပါ။", + "exchange_result_description" : "သင်သည် အနည်းဆုံး ${fetchingLabel} ${from} ကို နောက်စာမျက်နှာတွင် ပြသထားသည့် လိပ်စာသို့ ပေးပို့ရပါမည်။ ${fetchingLabel} ${from} ထက်နည်းသော ပမာဏကို ပေးပို့ပါက ၎င်းသည် ပြောင်းလဲ၍မရသည့်အပြင် ပြန်အမ်းမည်မဟုတ်ပါ။", + "exchange_result_write_down_ID" : "* ကျေးဇူးပြု၍ အထက်ဖော်ပြပါ သင်၏ ID ကို ကော်ပီ သို့မဟုတ် ရေးမှတ်ပါ။", + "confirm" : "အတည်ပြုပါ။", + "confirm_sending" : "ပေးပို့အတည်ပြုပါ။", + "commit_transaction_amount_fee" : "ငွေလွှဲခြင်း\nပမာဏ- ${amount}\nအခကြေးငွေ- ${fee}", + "sending" : "ပေးပို့ခြင်း။", + "transaction_sent" : "ငွေပေးချေမှု ပို့ပြီးပါပြီ။!", + "expired" : "သက်တမ်းကုန်သွားပြီ", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "XMR ပို့ပါ။", + "exchange_new_template" : "ပုံစံအသစ်", + + "faq" : "အမြဲမေးလေ့ရှိသောမေးခွန်းများ", + + + "enter_your_pin" : "သင်၏ PIN ကိုထည့်ပါ။", + "loading_your_wallet" : "သင့်ပိုက်ဆံအိတ်ကို ဖွင့်နေသည်။", + + + "new_wallet" : "ပိုက်ဆံအိတ်အသစ်", + "wallet_name" : "ပိုက်ဆံအိတ်နာမည", + "continue_text" : "ဆက်လက်", + "choose_wallet_currency" : "ပိုက်ဆံအိတ်ငွေကြေးကို ရွေးပါ-", + + + "node_new" : "နော်ဒီအသစ်", + "node_address" : "နိုဒီ လိပ်စာ", + "node_port" : "နော်ဒီဆိပ်ကမ်း", + "login" : "လော့ဂ်အင်", + "password" : "စကားဝှက်", + "nodes" : "ဆုံမှတ်များ", + "node_reset_settings_title" : "ဆက်တင်များကို ပြန်လည်သတ်မှတ်ပါ။", + "nodes_list_reset_to_default_message" : "ဆက်တင်များကို မူရင်းအတိုင်း ပြန်လည်သတ်မှတ်လိုသည်မှာ သေချာပါသလား။", + "change_current_node" : "လက်ရှိ နှာခေါင်း ကို ${node} သို့ ပြောင်းရန် သေချာပါသလား။", + "change" : "ပြောင်းလဲပါ။", + "remove_node" : "နှာခေါင်း ကို ဖယ်ရှားပါ။", + "remove_node_message" : "ရွေးချယ်ထားသော ကုဒ်ကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။", + "remove" : "ဖယ်ရှားပါ။", + "delete" : "ဖျက်ပါ။", + "add_new_node" : "နှာခေါင်း အသစ်ထည့်ပါ။", + "change_current_node_title" : "လက်ရှိ နှာခေါင်း ကိုပြောင်းပါ။", + "node_test" : "စမ်း", + "node_connection_successful" : "ချိတ်ဆက်မှု အောင်မြင်ခဲ့သည်။", + "node_connection_failed" : "ချိတ်ဆက်မှု မအောင်မြင်ပါ။", + "new_node_testing" : "နှာခေါင်း အသစ်စမ်းသပ်ခြင်း။", + + + "use" : "သို့ပြောင်းပါ။", + "digit_pin" : "-ဂဏန်း PIN", + + + "share_address" : "လိပ်စာမျှဝေပါ။", + "receive_amount" : "ပမာဏ", + "subaddresses" : "လိပ်စာများ", + "addresses" : "လိပ်စာများ", + "scan_qr_code" : "လိပ်စာရယူရန် QR ကုဒ်ကို စကင်န်ဖတ်ပါ။", + "qr_fullscreen" : "မျက်နှာပြင်အပြည့် QR ကုဒ်ကိုဖွင့်ရန် တို့ပါ။", + "rename" : "အမည်ပြောင်းပါ။", + "choose_account" : "အကောင့်ကို ရွေးပါ။", + "create_new_account" : "အကောင့်အသစ်ဖန်တီးပါ။", + "accounts_subaddresses" : "အကောင့်များနှင့် လိပ်စာများ", + + + "restore_restore_wallet" : "ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + "restore_title_from_seed_keys" : "မျိုးစေ့/သော့များမှ ပြန်လည်ရယူပါ။", + "restore_description_from_seed_keys" : "သင့်ပိုက်ဆံအိတ်ကို လုံခြုံသောနေရာတွင် သိမ်းဆည်းထားသော မျိုးစေ့/သော့များမှ ပြန်လည်ရယူပါ။", + "restore_next" : "နောက်တစ်ခု", + "restore_title_from_backup" : "အရန်သိမ်းခြင်းမှ ပြန်လည်ရယူပါ။", + "restore_description_from_backup" : "သင့်အရန်ဖိုင်မှ Cake Wallet အက်ပ်တစ်ခုလုံးကို သင်ပြန်လည်ရယူနိုင်သည်။", + "restore_seed_keys_restore" : "မျိုးစေ့/သော့များ ပြန်လည်ရယူပါ။", + "restore_title_from_seed" : "မျိုးစေ့မှပြန်လည်ရယူပါ။", + "restore_description_from_seed" : "25 စကားလုံး သို့မဟုတ် 13 စကားလုံးပေါင်းစပ်ကုဒ်မှ သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူပါ။", + "restore_title_from_keys" : "သော့များမှ ပြန်လည်ရယူပါ။", + "restore_description_from_keys" : "သင့်ကိုယ်ပိုင်သော့များမှ သိမ်းဆည်းထားသော ထုတ်ပေးထားသော သော့ချက်များမှ သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူပါ။", + "restore_wallet_name" : "ပိုက်ဆံအိတ်နာမည်", + "restore_address" : "လိပ်စာ", + "restore_view_key_private" : "သော့ကိုကြည့်ရန် (သီးသန့်)", + "restore_spend_key_private" : "သော့သုံးရန် (သီးသန့်)", + "restore_recover" : "ပြန်ယူပါ။", + "restore_wallet_restore_description" : "Wallet ပြန်လည်ရယူသည့် ဖော်ပြချက်", + "restore_new_seed" : "မျိုးစေ့အသစ်", + "restore_active_seed" : "တက်ကြွသောအစေ့", + "restore_bitcoin_description_from_seed" : "24 စကားလုံးပေါင်းစပ်ကုဒ်မှ သင့်ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + "restore_bitcoin_description_from_keys" : "သင့်ကိုယ်ပိုင်သော့များမှ ထုတ်လုပ်ထားသော WIF စာကြောင်းမှ သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူပါ။", + "restore_bitcoin_title_from_keys" : "WIF မှ ပြန်လည်ရယူပါ။", + "restore_from_date_or_blockheight" : "ဤပိုက်ဆံအိတ်ကို သင်မဖန်တီးမီ ရက်အနည်းငယ်အလိုတွင် ရက်စွဲတစ်ခု ထည့်သွင်းပါ။ သို့မဟုတ် ဘလော့ခ်ဟိုက် ကို သိပါက ၎င်းအစား ၎င်းကို ထည့်ပါ။", + + + "seed_reminder" : "ကျေးဇူးပြု၍ သင့်ဖုန်းကို ပျောက်ဆုံးသွားပါက သို့မဟုတ် ဖျက်မိပါက ၎င်းတို့ကို ချရေးပါ။", + "seed_title" : "မျိုးစေ့", + "seed_share" : "မျိုးစေ့မျှဝေပါ။", + "copy" : "ကော်ပီ", + + + "seed_language_choose" : "ကျေးဇူးပြု၍ မျိုးစေ့ဘာသာစကားကို ရွေးပါ-", + "seed_choose" : "မျိုးစေ့ဘာသာစကားကို ရွေးချယ်ပါ။", + "seed_language_next" : "နောက်တစ်ခု", + "seed_language_english" : "အင်္ဂလိပ်စာ", + "seed_language_chinese" : "တရုတ်", + "seed_language_dutch" : "ဒတ်ခ်ျ", + "seed_language_german" : "ဂျာမန်", + "seed_language_japanese" : "ဂျပန်", + "seed_language_portuguese" : "ပေါ်တူဂီ", + "seed_language_russian" : "ရုရှ", + "seed_language_spanish" : "ငပိ", + "seed_language_french" : "ပြင်သစ်", + "seed_language_italian" : "အီတလီ", + + + "send_title" : "ပို့ပါ။", + "send_your_wallet" : "သင့်ပိုက်ဆံအိတ်", + "send_address" : "${cryptoCurrency} လိပ်စာ", + "send_payment_id" : "ငွေပေးချေမှု ID (ချန်လှပ်ထား)", + "all" : "အားလုံး", + "send_error_minimum_value" : "ပမာဏ၏ အနည်းဆုံးတန်ဖိုးမှာ 0.01 ဖြစ်သည်။", + "send_error_currency" : "ငွေကြေးတွင် နံပါတ်များသာ ပါဝင်နိုင်သည်။", + "send_estimated_fee" : "ခန့်မှန်းကြေး-", + "send_priority" : "လောလောဆယ်အခကြေးငွေကို ${transactionPriority} ဦးစားပေးတွင် သတ်မှတ်ထားပါသည်။\nငွေပေးငွေယူဦးစားပေးကို ဆက်တင်များတွင် ချိန်ညှိနိုင်ပါသည်။", + "send_creating_transaction" : "အရောင်းအဝယ်ပြုလုပ်ခြင်း။", + "send_templates" : "ပုံစံများ", + "send_new" : "အသစ်", + "send_amount" : "ပမာဏ-", + "send_fee" : "အခကြေးငွေ-", + "send_name" : "နာမည်", + "send_got_it" : "ရပြီ", + "send_sending" : "ပို့နေသည်...", + "send_success" : "သင်၏ ${crypto} ကို အောင်မြင်စွာ ပို့လိုက်ပါပြီ။", + + + "settings_title" : "ဆက်တင်များ", + "settings_nodes" : "ဆုံမှတ်များ", + "settings_current_node" : "လက်ရှိ node", + "settings_wallets" : "ပိုက်ဆံအိတ်", + "settings_display_balance" : "ပြသချိန်ခွင်", + "settings_currency" : "ငွေကြေး", + "settings_fee_priority" : "အခကြေးငွေဦးစားပေး", + "settings_save_recipient_address" : "လက်ခံသူလိပ်စာကို သိမ်းဆည်းပါ။", + "settings_personal" : "ပုဂ္ဂိုလ်ရေး", + "settings_change_pin" : "ပင်နံပါတ်ပြောင်းပါ။", + "settings_change_language" : "ဘာသာစကားပြောင်းပါ။", + "settings_allow_biometrical_authentication" : "ဇီဝဗေဒဆိုင်ရာ အထောက်အထားစိစစ်ခြင်းကို ခွင့်ပြုပါ။", + "settings_dark_mode" : "အမှောင်မုဒ်", + "settings_transactions" : "ငွေပေးငွေယူ", + "settings_trades" : "ကုန်သွယ်မှုများ", + "settings_display_on_dashboard_list" : "ဒက်ရှ်ဘုတ်စာရင်းတွင် ပြသပါ။", + "settings_all" : "အားလုံး", + "settings_only_trades" : "အရောင်းအဝယ်တွေချည်းပဲ။", + "settings_only_transactions" : "အရောင်းအဝယ်များသာ", + "settings_none" : "တစ်ခုမှ", + "settings_support" : "အထောက်အပံ့", + "settings_terms_and_conditions" : "စည်းကမ်းနှင့်သတ်မှတ်ချက်များ", + "pin_is_incorrect" : "ပင်နံပါတ် မမှန်ပါ။", + + + "setup_pin" : "ပင်နံပါတ်ကို စနစ်ထည့်သွင်းပါ။", + "enter_your_pin_again" : "သင့်ပင်နံပါတ်ကို ထပ်မံထည့်သွင်းပါ။", + "setup_successful" : "သင့်ပင်နံပါတ်ကို အောင်မြင်စွာ သတ်မှတ်ပြီးပါပြီ။", + + + "wallet_keys" : "ပိုက်ဆံအိတ် အစေ့/သော့များ", + "wallet_seed" : "ပိုက်ဆံအိတ်စေ့", + "private_key" : "သီးသန့်သော့", + "public_key" : "အများသူငှာသော့", + "view_key_private" : "သော့ကိုကြည့်ရန် (သီးသန့်)", + "view_key_public" : "သော့ကိုကြည့်ရန် (အများပြည်သူ)", + "spend_key_private" : "သော့သုံးရန် (သီးသန့်)", + "spend_key_public" : "သုံးစွဲရန်သော့ (အများပြည်သူ)", + "copied_key_to_clipboard" : "${key} ကို Clipboard သို့ ကူးယူထားသည်။", + + + "new_subaddress_title" : "လိပ်စာအသစ်", + "new_subaddress_label_name" : "အညွှန်းအမည်", + "new_subaddress_create" : "ဖန်တီးပါ။", + + "address_label" : "လိပ်စာတံဆိပ်", + + "subaddress_title" : "လိပ်စာစာရင်း", + + + "trade_details_title" : "ကုန်သွယ်မှုအသေးစိတ်", + "trade_details_id" : "အမှတ်သညာ", + "trade_details_state" : "အဆင့်အတန်း", + "trade_details_fetching" : "ခေါ်ယူခြင်း။", + "trade_details_provider" : "ပံ့ပိုးပေးသူ", + "trade_details_created_at" : "တွင်ဖန်တီးခဲ့သည်။", + "trade_details_pair" : "တွဲ", + "trade_details_copied" : "${title} ကို Clipboard သို့ ကူးယူထားသည်။", + + + "trade_history_title" : "ကုန်သွယ်မှုသမိုင်း", + + + "transaction_details_title" : "ငွေပေးငွေယူအသေးစိတ်", + "transaction_details_transaction_id" : "ငွေပေးငွေယူ ID", + "transaction_details_date" : "ရက်စွဲ", + "transaction_details_height" : "အရပ်အမြင့်", + "transaction_details_amount" : "ပမာဏ", + "transaction_details_fee" : "ကြေး", + "transaction_details_copied" : "${title} ကို Clipboard သို့ ကူးယူထားသည်။", + "transaction_details_recipient_address" : "လက်ခံသူလိပ်စာများ", + + + "wallet_list_title" : "Monero ပိုက်ဆံအိတ်", + "wallet_list_create_new_wallet" : "Wallet အသစ်ဖန်တီးပါ။", + "wallet_list_restore_wallet" : "ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + "wallet_list_load_wallet" : "ပိုက်ဆံအိတ်ကို တင်ပါ။", + "wallet_list_loading_wallet" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖွင့်နေသည်။", + "wallet_list_failed_to_load" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖွင့်၍မရပါ။ ${error}", + "wallet_list_removing_wallet" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖယ်ရှားခြင်း။", + "wallet_list_failed_to_remove" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖယ်ရှား၍မရပါ။ ${error}", + + + "widgets_address" : "လိပ်စာ", + "widgets_restore_from_blockheight" : "အမြင့်မှ ပြန်လည်ရယူပါ။", + "widgets_restore_from_date" : "ရက်စွဲမှ ပြန်လည်ရယူပါ။", + "widgets_or" : "သို့မဟုတ်", + "widgets_seed" : "မျိုးစေ့", + + + "router_no_route" : "${name} အတွက် သတ်မှတ်ထားသော လမ်းကြောင်းမရှိပါ", + + + "error_text_account_name" : "အကောင့်အမည်သည် အက္ခရာများ၊ နံပါတ်များသာ ပါဝင်နိုင်သည်\nနှင့် စာလုံးရေ 1 နှင့် 15 ကြားရှိရပါမည်။", + "error_text_contact_name" : "အဆက်အသွယ်အမည်တွင် ` , ' \" သင်္ကေတများ မပါဝင်နိုင်ပါ\nနှင့် စာလုံးအရှည် 1 နှင့် 32 ကြားရှိရမည်", + "error_text_address" : "Wallet လိပ်စာသည် အမျိုးအစား\no cryptocurrency နှင့် ကိုက်ညီရပါမည်။", + "error_text_node_address" : "ကျေးဇူးပြု၍ iPv4 လိပ်စာကို ထည့်ပါ။", + "error_text_node_port" : "နော်ဒီဆိပ်ကမ်း တွင် 0 နှင့် 65535 အကြား နံပါတ်များသာ ပါဝင်နိုင်သည်။", + "error_text_payment_id" : "ငွေပေးချေမှု ID တွင် hex တွင် စာလုံး 16 လုံးမှ 64 လုံးသာ ပါဝင်နိုင်သည်။", + "error_text_xmr" : "XMR တန်ဖိုးသည် ရနိုင်သောလက်ကျန်ကို ကျော်လွန်၍မရပါ။\nအပိုင်းကိန်းဂဏန်းများ သည် 12 နှင့် လျော့နည်းရမည်", + "error_text_fiat" : "ပမာဏ၏တန်ဖိုးသည် ရနိုင်သောလက်ကျန်ကို မကျော်လွန်နိုင်ပါ။\nအပိုင်းကိန်းဂဏန်းအရေအတွက်သည် 2 နှင့် လျော့နည်းရမည်", + "error_text_subaddress_name" : "လိပ်စာခွဲအမည်တွင် ` , ' \" သင်္ကေတများ မပါဝင်နိုင်ပါ\nနှင့် စာလုံးရေ 1 နှင့် 20 ကြားရှိရမည်", + "error_text_amount" : "ပမာဏသည် နံပါတ်များသာ ပါဝင်နိုင်သည်။", + "error_text_wallet_name" : "ပိုက်ဆံအိတ်အမည်တွင် စာလုံးများ၊ နံပါတ်များ၊ _ - သင်္ကေတများသာ ပါဝင်နိုင်သည် \n နှင့် စာလုံးအရှည် 1 နှင့် 33 ကြားရှိရမည်", + "error_text_keys" : "ပိုက်ဆံအိတ်သော့များတွင် hex တွင် 64 လုံးသာပါဝင်နိုင်သည်။", + "error_text_crypto_currency" : "အပိုင်းကိန်းဂဏန်းများ၏ အရေအတွက်\nလျော့နည်းသည် သို့မဟုတ် 12 နှင့် ညီမျှရပါမည်။", + "error_text_minimal_limit" : "${provider} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။ ပမာဏသည် အနည်းငယ်ထက်နည်းသည်- ${min} ${currency}", + "error_text_maximum_limit" : "${provider} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။ ပမာဏသည် အများဆုံးထက် ပိုများသည်- ${max} ${currency}", + "error_text_limits_loading_failed" : "${provider} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။ ကန့်သတ်ချက်များ တင်ခြင်း မအောင်မြင်ပါ။", + "error_text_template" : "နမူနာပုံစံအမည်နှင့် လိပ်စာတွင် ` , ' \" သင်္ကေတများ မပါဝင်နိုင်ပါ\nနှင့် စာလုံးအရှည် 1 နှင့် 106 ကြား ရှိရမည်", + + + "auth_store_ban_timeout" : "အချိန်ကို ပိတ်ပင်ခြင်း", + "auth_store_banned_for" : "ပိတ်ပင်ထားသည်။", + "auth_store_banned_minutes" : " မိနစ်များ", + "auth_store_incorrect_password" : "ပင်နံပါတ် မှားနေသည်။", + "wallet_store_monero_wallet" : "Monero ပိုက်ဆံအိတ်", + "wallet_restoration_store_incorrect_seed_length" : "မျိုးစေ့အရှည် မမှန်ပါ။", + + + "full_balance" : "Balance အပြည့်", + "available_balance" : "လက်ကျန်ငွေ ရရှိနိုင်", + "hidden_balance" : "Hidden Balance", + + + "sync_status_syncronizing" : "ထပ်တူပြုခြင်း။", + "sync_status_syncronized" : "ထပ်တူပြုထားသည်။", + "sync_status_not_connected" : "မချိတ်ဆက်ပါ။", + "sync_status_starting_sync" : "စင့်ခ်လုပ်ခြင်း။", + "sync_status_failed_connect" : "အဆက်အသွယ်ဖြတ်ထားသည်။", + "sync_status_connecting" : "ချိတ်ဆက်ခြင်း။", + "sync_status_connected" : "ချိတ်ဆက်ထားသည်။", + "sync_status_attempting_sync" : "ချိန်ကိုက်ခြင်းကို ကြိုးစားနေသည်။", + + + "transaction_priority_slow" : "နှေးနှေး", + "transaction_priority_regular" : "ပုံမှန်အစည်းအဝေး", + "transaction_priority_medium" : "အလယ်အလတ်", + "transaction_priority_fast" : "မြန်သည်။", + "transaction_priority_fastest" : "အမြန်ဆုံး", + + + "trade_for_not_created" : "${title} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။", + "trade_not_created" : "ကုန်သွယ်မှု မဖန်တီးပါ။", + "trade_id_not_found" : "${title} ၏ ${tradeId} ကုန်သွယ်မှုကို ရှာမတွေ့ပါ။", + "trade_not_found" : "ကုန်သွယ်မှု မတွေ့။", + + + "trade_state_pending" : "ဆိုင်းငံ့ထားသည်။", + "trade_state_confirming" : "အတည်ပြုခြင်း။", + "trade_state_trading" : "ရောင်းဝယ်ရေး", + "trade_state_traded" : "အရောင်းအဝယ်ဖြစ်ခဲ့သည်။", + "trade_state_complete" : "ပြီးအောင်", + "trade_state_to_be_created" : "ဖန်တီးဖို့", + "trade_state_unpaid" : "အခကြေးငွေမယူရသေး", + "trade_state_underpaid" : "ပေးချေမှုနည်းပါးသည်။", + "trade_state_paid_unconfirmed" : "အတည်မပြုနိုင်သေးပါ။", + "trade_state_paid" : "အခကြေးငွေ", + "trade_state_btc_sent" : "Btc ပို့လိုက်ပါတယ်။", + "trade_state_timeout" : "ခဏပွဲရပ်ခြင်း", + "trade_state_created" : "ဖန်တီးခဲ့သည်။", + "trade_state_finished" : "ပြီးပြီ။", + + "change_language" : "ဘာသာစကားပြောင်းပါ။", + "change_language_to" : "ဘာသာစကားကို ${language} သို့ ပြောင်းမလား။", + + "paste" : "ငါးပိ", + "restore_from_seed_placeholder" : "သင့်အစေ့ကို ဤနေရာတွင် ထည့်ပါ သို့မဟုတ် ကူးထည့်ပါ။", + "add_new_word" : "စကားလုံးအသစ်ထည့်ပါ။", + "incorrect_seed" : "ထည့်သွင်းထားသော စာသားသည် မမှန်ကန်ပါ။", + + "biometric_auth_reason" : "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။", + "version" : "ဗားရှင်း ${currentVersion}", + + "extracted_address_content" : "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်", + + "card_address" : "လိပ်စာ-", + "buy" : "ဝယ်ပါ။", + "sell" : "ရောင်း", + + "placeholder_transactions" : "သင်၏ ငွေပေးငွေယူများကို ဤနေရာတွင် ပြသပါမည်။", + "placeholder_contacts" : "သင့်အဆက်အသွယ်များကို ဤနေရာတွင် ပြသပါမည်။", + + "template" : "ပုံစံခွက်", + "confirm_delete_template" : "ဤလုပ်ဆောင်ချက်သည် ဤပုံစံပြားကို ဖျက်လိုက်ပါမည်။ ဆက်လုပ်လိုပါသလား။", + "confirm_delete_wallet" : "ဤလုပ်ဆောင်ချက်သည် ဤပိုက်ဆံအိတ်ကို ဖျက်လိုက်ပါမည်။ ဆက်လုပ်လိုပါသလား။", + + "picker_description" : "ChangeNOW သို့မဟုတ် MorphToken ကိုရွေးချယ်ရန်၊ ကျေးဇူးပြု၍ သင်၏ကုန်သွယ်မှုအတွဲကို ဦးစွာပြောင်းလဲပါ။", + + "change_wallet_alert_title" : "လက်ရှိပိုက်ဆံအိတ်ကို ပြောင်းပါ။", + "change_wallet_alert_content" : "လက်ရှိပိုက်ဆံအိတ်ကို ${wallet_name} သို့ ပြောင်းလိုပါသလား။", + + "creating_new_wallet" : "ပိုက်ဆံအိတ်အသစ်ဖန်တီးခြင်း။", + "creating_new_wallet_error" : "အမှား- ${description}", + + "seed_alert_title" : "အာရုံ", + "seed_alert_content" : "မျိုးစေ့သည် သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ရေးပြီးပြီလား။", + "seed_alert_back" : "ပြန်သွားသည်", + "seed_alert_yes" : "ဟုတ်ကဲ့၊", + + "exchange_sync_alert_content" : "သင့်ပိုက်ဆံအိတ်ကို စင့်ခ်လုပ်ထားသည့်အချိန်အထိ စောင့်ပါ။", + + "pre_seed_title" : "အရေးကြီးသည်။", + "pre_seed_description" : "နောက်စာမျက်နှာတွင် ${words} စကားလုံးများ အတွဲလိုက်ကို တွေ့ရပါမည်။ ၎င်းသည် သင်၏ထူးခြားပြီး သီးသန့်မျိုးစေ့ဖြစ်ပြီး ပျောက်ဆုံးခြင်း သို့မဟုတ် ချွတ်ယွင်းမှုရှိပါက သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ၎င်းကို Cake Wallet အက်ပ်၏အပြင်ဘက်တွင် လုံခြုံသောနေရာတွင် သိမ်းဆည်းရန်မှာ သင်၏တာဝန်ဖြစ်သည်။", + "pre_seed_button_text" : "ကျွန်တော်နားလည်ပါတယ်။ ငါ့အမျိုးအနွယ်ကို ပြလော့", + + "xmr_to_error" : "XMR.TO အမှား", + "xmr_to_error_description" : "ပမာဏ မမှန်ပါ။ ဒဿမအမှတ်ပြီးနောက် ဂဏန်း ၈ လုံးတွင် အများဆုံးကန့်သတ်ချက်", + + "provider_error" : "${provider} အမှား", + + "use_ssl" : "SSL ကိုသုံးပါ။", + "trusted" : "ယုံတယ်။", + + "color_theme" : "အရောင်အပြင်အဆင်", + "light_theme" : "အလင်း", + "bright_theme" : "တောက်ပ", + "dark_theme" : "မှောငျမိုကျသော", + "enter_your_note" : "သင့်မှတ်စုကို ထည့်ပါ...", + "note_optional" : "မှတ်ချက် (ချန်လှပ်ထားနိုင်သည်)", + "note_tap_to_change" : "မှတ်ချက် (ပြောင်းလဲရန် တို့ပါ)", + "view_in_block_explorer" : "Block Explorer တွင်ကြည့်ရှုပါ။", + "view_transaction_on" : "ငွေလွှဲခြင်းကို ဖွင့်ကြည့်ပါ။", + "transaction_key" : "ငွေသွင်းငွေထုတ်ကီး", + "confirmations" : "အတည်ပြုချက်များ", + "recipient_address" : "လက်ခံသူလိပ်စာ", + + "extra_id" : "အပို ID-", + "destination_tag" : "ခရီးဆုံးအမှတ်-", + "memo" : "မှတ်စုတို:", + + "backup" : "မိတ္တူ", + "change_password" : "စကားဝှက်ကိုပြောင်းရန်", + "backup_password" : "စကားဝှက်ကို အရန်သိမ်းဆည်းပါ။", + "write_down_backup_password" : "သင်၏ အရန်ဖိုင်များကို တင်သွင်းရန်အတွက် အသုံးပြုသည့် သင်၏ အရန်စကားဝှက်ကို ချရေးပါ။", + "export_backup" : "အရန်ကူးထုတ်ရန်", + "save_backup_password" : "သင်၏ အရန်စကားဝှက်ကို သိမ်းဆည်းထားကြောင်း သေချာပါစေ။ ၎င်းမပါဘဲ သင်၏ အရန်ဖိုင်များကို တင်သွင်းနိုင်မည် မဟုတ်ပါ။", + "backup_file" : "အရန်ဖိုင်", + + "edit_backup_password" : "Backup Password ကို တည်းဖြတ်ပါ။", + "save_backup_password_alert" : "အရန်စကားဝှက်ကို သိမ်းဆည်းပါ။", + "change_backup_password_alert" : "အရန်စကားဝှက်အသစ်ဖြင့် သင်၏ယခင်မိတ္တူဖိုင်များကို တင်သွင်းရန် မရနိုင်ပါ။ အရန်စကားဝှက်အသစ်ကို အရန်ဖိုင်အသစ်အတွက်သာ အသုံးပြုပါမည်။ အရန်စကားဝှက်ကို ပြောင်းလိုသည်မှာ သေချာပါသလား။", + + "enter_backup_password" : "အရန်စကားဝှက်ကို ဤနေရာတွင် ထည့်ပါ။", + "select_backup_file" : "အရန်ဖိုင်ကို ရွေးပါ။", + "import" : "သွင်းကုန်", + "please_select_backup_file" : "အရန်ဖိုင်ကို ရွေးပြီး အရန်စကားဝှက်ကို ထည့်ပါ။", + + "fixed_rate" : "ပုံသေနှုန်း", + "fixed_rate_alert" : "ပုံသေနှုန်းထားမုဒ်ကို စစ်ဆေးသည့်အခါ လက်ခံပမာဏကို ထည့်သွင်းနိုင်မည်ဖြစ်သည်။ ပုံသေနှုန်းမုဒ်သို့ ပြောင်းလိုပါသလား။", + + "xlm_extra_info" : "လဲလှယ်မှုအတွက် XLM ငွေလွှဲပို့နေစဉ် Memo ID ကို သတ်မှတ်ရန် မမေ့ပါနှင့်", + "xrp_extra_info" : "လဲလှယ်မှုအတွက် XRP ငွေလွှဲပို့နေစဉ် Destination Tag ကို သတ်မှတ်ရန် မမေ့ပါနှင့်", + + "exchange_incorrect_current_wallet_for_xmr" : "သင်၏ Cake Wallet Monero လက်ကျန်မှ XMR ကိုလဲလှယ်လိုပါက၊ သင်၏ Monero ပိုက်ဆံအိတ်သို့ ဦးစွာပြောင်းပါ။", + "confirmed" : "အတည်ပြုခဲ့သည်။", + "unconfirmed" : "အတည်မပြုနိုင်ပါ။", + "displayable" : "ပြသနိုင်သည်။", + + "submit_request" : "တောင်းဆိုချက်တစ်ခုတင်ပြပါ။", + + "buy_alert_content" : "လောလောဆယ် ကျွန်ုပ်တို့သည် Bitcoin နှင့် Litecoin ဝယ်ယူမှုကိုသာ ပံ့ပိုးပေးပါသည်။ Bitcoin သို့မဟုတ် Litecoin ဝယ်ယူရန်၊ သင်၏ Bitcoin သို့မဟုတ် Litecoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။", + "sell_alert_content" : "ကျွန်ုပ်တို့သည် လက်ရှိတွင် Bitcoin ရောင်းချခြင်းကိုသာ ပံ့ပိုးပေးပါသည်။ Bitcoin ရောင်းချရန်၊ သင်၏ Bitcoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။", + + "outdated_electrum_wallet_description" : "ယခု Cake တွင်ဖန်တီးထားသော Bitcoin ပိုက်ဆံအိတ်အသစ်တွင် စကားလုံး 24 မျိုးရှိသည်။ Bitcoin ပိုက်ဆံအိတ်အသစ်တစ်ခုကို ဖန်တီးပြီး သင့်ငွေအားလုံးကို 24 စကားလုံးပိုက်ဆံအိတ်အသစ်သို့ လွှဲပြောင်းပြီး 12 စကားလုံးမျိုးစေ့ဖြင့် ပိုက်ဆံအိတ်များကို အသုံးပြုခြင်းကို ရပ်တန့်ရန် မဖြစ်မနေလိုအပ်ပါသည်။ သင့်ရန်ပုံငွေများကို လုံခြုံစေရန်အတွက် ၎င်းကိုချက်ချင်းလုပ်ဆောင်ပါ။", + "understand" : "ကျွန်တော်နားလည်ပါတယ်", + + "apk_update" : "APK အပ်ဒိတ်", + + "buy_bitcoin" : "Bitcoin ကိုဝယ်ပါ။", + "buy_with" : "အတူဝယ်ပါ။", + "moonpay_alert_text" : "ပမာဏ၏တန်ဖိုးသည် ${minAmount} ${fiatCurrency} နှင့် ပိုနေရမည်", + + "outdated_electrum_wallet_receive_warning" : "ဤပိုက်ဆံအိတ်တွင် စာလုံး 12 လုံးပါပြီး ကိတ်မုန့်တွင် ဖန်တီးပါက၊ Bitcoin ကို ဤပိုက်ဆံအိတ်ထဲသို့ မထည့်ပါနှင့်။ ဤပိုက်ဆံအိတ်သို့ လွှဲပြောင်းပေးသည့် မည်သည့် BTC မဆို ဆုံးရှုံးနိုင်သည်။ 24 စကားလုံးပိုက်ဆံအိတ်အသစ်တစ်ခုဖန်တီးပါ (ညာဘက်အပေါ်ထောင့်ရှိမီနူးကိုနှိပ်ပါ၊ Wallets ကိုရွေးချယ်ပါ၊ ပိုက်ဆံအိတ်အသစ်ဖန်တီးရန်ကိုရွေးချယ်ပါ၊ ထို့နောက် Bitcoin ကိုရွေးချယ်ပါ) နှင့်သင်၏ BTC ကိုထိုနေရာသို့ချက်ချင်းရွှေ့ပါ။ Cake မှ (24 စာလုံး) BTC ပိုက်ဆံအိတ်အသစ်များသည် လုံခြုံပါသည်။", + "do_not_show_me" : "ဒါကို ထပ်မပြနဲ့", + + "unspent_coins_title" : "အသုံးမဝင်သော အကြွေစေ့များ", + "unspent_coins_details_title" : "အသုံးမဝင်သော အကြွေစေ့အသေးစိတ်များ", + "freeze" : "အေးခဲ", + "frozen" : "ဖြူဖြူ", + "coin_control" : "အကြွေစေ့ထိန်းချုပ်မှု (ချန်လှပ်ထားနိုင်သည်)", + + "address_detected" : "လိပ်စာကို တွေ့ရှိခဲ့သည်။", + "address_from_domain" : "ဤလိပ်စာသည် Unstoppable Domains ရှိ ${domain} မှဖြစ်သည်။", + + "add_receiver" : "အခြားလက်ခံသူ ထည့်ပါ (ချန်လှပ်ထားနိုင်သည်)", + + "manage_yats" : "Yats ကို စီမံပါ။", + "yat_alert_title" : "Yat ဖြင့် crypto ကိုပိုမိုလွယ်ကူစွာပေးပို့လက်ခံပါ။", + "yat_alert_content" : "Cake Wallet အသုံးပြုသူများသည် တစ်မျိုးတည်းသော အီမိုဂျီအခြေခံအသုံးပြုသူအမည်ဖြင့် ၎င်းတို့၏ စိတ်ကြိုက်ငွေကြေးအားလုံးကို ပေးပို့နိုင်ပါပြီ။", + "get_your_yat" : "မင်းရဲ့ Yat ကိုယူလိုက်ပါ။", + "connect_an_existing_yat" : "ရှိပြီးသား Yat ကို ချိတ်ဆက်ပါ။", + "connect_yats" : "Yats ကိုချိတ်ဆက်ပါ။", + "yat_address" : "Yat လိပ်စာ", + "yat" : "ယတ်", + "address_from_yat" : "ဤလိပ်စာသည် Yat ရှိ ${emoji} မှဖြစ်သည်။", + "yat_error" : "Yat အမှား", + "yat_error_content" : "ဤ Yat နှင့် ချိတ်ဆက်ထားသော လိပ်စာမရှိပါ။ နောက်ထပ် Yat စမ်းကြည့်ပါ။", + "choose_address" : "\n\nလိပ်စာကို ရွေးပါ-", + "yat_popup_title" : "သင့်ပိုက်ဆံအိတ်လိပ်စာကို emojified လုပ်နိုင်ပါသည်။", + "yat_popup_content" : "သင်၏ Yat - တိုတောင်းသော အီမိုဂျီအခြေခံအသုံးပြုသူအမည်ဖြင့် Cake Wallet တွင် crypto ကို ယခု ပေးပို့နိုင်ပါပြီ။ ဆက်တင်စခရင်ပေါ်တွင် Yats ကို အချိန်မရွေး စီမံခန့်ခွဲပါ။", + "second_intro_title" : "၎င်းတို့အားလုံးကို အုပ်ချုပ်ရန် အီမိုဂျီလိပ်စာတစ်ခု", + "second_intro_content" : "သင်၏ Yat သည် သင့်ငွေကြေးအားလုံးအတွက် သင်၏ ရှည်လျားသော ဆဋ္ဌမကိန်းဂဏန်းများအားလုံးကို အစားထိုးသည့် တစ်မူထူးခြားသော အီမိုဂျီလိပ်စာတစ်ခုဖြစ်သည်။", + "third_intro_title" : "Yat သည် အခြားသူများနှင့် ကောင်းစွာကစားသည်။", + "third_intro_content" : "Yats သည် Cake Wallet အပြင်ဘက်တွင် နေထိုင်ပါသည်။ ကမ္ဘာပေါ်ရှိ မည်သည့်ပိုက်ဆံအိတ်လိပ်စာကို Yat ဖြင့် အစားထိုးနိုင်ပါသည်။", + "learn_more" : "ပိုမိုသိရှိရန်", + "search" : "ရှာရန်", + "search_language" : "ဘာသာစကားရှာပါ။", + "search_currency" : "ငွေကြေးကိုရှာပါ။", + "new_template" : "ပုံစံအသစ်", + "electrum_address_disclaimer" : "သင်အသုံးပြုသည့်အချိန်တိုင်းတွင် ကျွန်ုပ်တို့သည် လိပ်စာအသစ်များကို ထုတ်ပေးသော်လည်း ယခင်လိပ်စာများသည် ဆက်လက်အလုပ်လုပ်နေပါသည်။", + "wallet_name_exists" : "ထိုအမည်ဖြင့် ပိုက်ဆံအိတ်တစ်ခု ရှိနှင့်ပြီးဖြစ်သည်။ အခြားအမည်တစ်ခုကို ရွေးပါ သို့မဟုတ် အခြားပိုက်ဆံအိတ်ကို ဦးစွာ အမည်ပြောင်းပါ။", + "market_place" : "ဈေး", + "cake_pay_title" : "ကိတ်မုန့်လက်ဆောင်ကတ်များ", + "cake_pay_subtitle" : "လျှော့စျေးလက်ဆောင်ကတ်များဝယ်ပါ (USA သာ)", + "cake_pay_web_cards_title" : "Cake Pay ဝဘ်ကတ်များ", + "cake_pay_web_cards_subtitle" : "ကမ္ဘာတစ်ဝှမ်း ကြိုတင်ငွေပေးကတ်များနှင့် လက်ဆောင်ကတ်များကို ဝယ်ယူပါ။", + "about_cake_pay" : "Cake Pay သည် အမေရိကန်ပြည်ထောင်စုရှိ ကုန်သည် 150,000 ကျော်တွင် လက်ဆောင်ကတ်များကို လက်ဆောင်ကတ်များကို အလွယ်တကူ ဝယ်ယူနိုင်စေပါသည်။", + "cake_pay_account_note" : "ကတ်များကြည့်ရှုဝယ်ယူရန် အီးမေးလ်လိပ်စာတစ်ခုဖြင့် စာရင်းသွင်းပါ။ အချို့ကို လျှော့ဈေးဖြင့်ပင် ရနိုင်သည်။", + "already_have_account" : "အကောင့်ရှိပြီးသားလား?", + "create_account" : "အကောင့်ပြုလုပ်ပါ", + "privacy_policy" : "ကိုယ်ရေးအချက်အလက်မူဝါဒ", + "welcome_to_cakepay" : "Cake Pay မှကြိုဆိုပါသည်။", + "sign_up" : "ဆိုင်းအပ်", + "forgot_password" : "စကားဝှက်မေ့နေပါသလား", + "reset_password" : "လျှို့ဝှတ်နံပါတ်အားမူလအတိုင်းပြန်လုပ်သည်", + "gift_cards" : "လက်ဆောင်ကဒ်ပြား", + "setup_your_debit_card" : "သင့်ဒက်ဘစ်ကတ်ကို စနစ်ထည့်သွင်းပါ။", + "no_id_required" : "ID မလိုအပ်ပါ။ ငွေဖြည့်ပြီး ဘယ်နေရာမဆို သုံးစွဲပါ။", + "how_to_use_card" : "ဒီကတ်ကို ဘယ်လိုသုံးမလဲ။", + "purchase_gift_card" : "လက်ဆောင်ကတ်ဝယ်ပါ။", + "verification" : "စိစစ်ခြင်း။", + "fill_code" : "သင့်အီးမေးလ်သို့ ပေးထားသည့် အတည်ပြုကုဒ်ကို ဖြည့်ပါ။", + "dont_get_code" : "ကုဒ်ကို မရဘူးလား?", + "resend_code" : "ကျေးဇူးပြု၍ ပြန်ပို့ပါ။", + "debit_card" : "ဒက်ဘစ်ကတ်", + "cakepay_prepaid_card" : "CakePay ကြိုတင်ငွေဖြည့်ဒက်ဘစ်ကတ်", + "no_id_needed" : "ID မလိုအပ်ပါ။", + "frequently_asked_questions" : "မေးလေ့ရှိသောမေးခွန်းများ", + "debit_card_terms" : "ဤဒစ်ဂျစ်တယ်ပိုက်ဆံအိတ်ရှိ သင့်ငွေပေးချေမှုကတ်နံပါတ် (နှင့် သင့်ငွေပေးချေကတ်နံပါတ်နှင့် သက်ဆိုင်သောအထောက်အထားများ) ၏ သိုလှောင်မှုနှင့် အသုံးပြုမှုသည် အချိန်အခါနှင့်အမျှ သက်ရောက်မှုရှိသကဲ့သို့ ကတ်ကိုင်ဆောင်ထားသူ၏ သဘောတူညီချက်၏ စည်းကမ်းသတ်မှတ်ချက်များနှင့် ကိုက်ညီပါသည်။", + "please_reference_document" : "နောက်ထပ်အချက်အလက်များအတွက် အောက်ပါစာရွက်စာတမ်းများကို ကိုးကားပါ။", + "cardholder_agreement" : "ကတ်ကိုင်ဆောင်သူ သဘောတူညီချက်", + "e_sign_consent" : "E-Sign သဘောတူညီချက်", + "agree_and_continue" : "သဘောတူပြီး ရှေ့ဆက်ပါ။", + "email_address" : "အီးမေးလ်လိပ်စာ", + "agree_to" : "အကောင့်ဖန်တီးခြင်းဖြင့် သင်သည် ဤအရာကို သဘောတူပါသည်။", + "and" : "နှင့်", + "enter_code" : "ကုဒ်ထည့်ပါ။", + "congratulations" : "ဂုဏ်ယူပါသည်။", + "you_now_have_debit_card" : "ယခု သင့်တွင် ဒက်ဘစ်ကတ်တစ်ခုရှိသည်။", + "min_amount" : "အနည်းဆုံး- ${value}", + "max_amount" : "အများဆုံး- ${value}", + "enter_amount" : "ပမာဏကို ထည့်ပါ။", + "billing_address_info" : "ငွေပေးချေရမည့်လိပ်စာကို တောင်းဆိုပါက သင့်ပို့ဆောင်ရေးလိပ်စာကို ပေးပါ။", + "order_physical_card" : "ရုပ်ပိုင်းဆိုင်ရာကတ်ကို မှာယူပါ။", + "add_value" : "တန်ဖိုးထည့်ပါ။", + "activate" : "အသက်သွင်းပါ။", + "get_a" : "တစ်ခုရယူပါ။", + "digital_and_physical_card" : " ဒစ်ဂျစ်တယ်နှင့် ရုပ်ပိုင်းဆိုင်ရာ ကြိုတင်ငွေပေးချေသော ဒက်ဘစ်ကတ်", + "get_card_note" : " ဒစ်ဂျစ်တယ်ငွေကြေးများဖြင့် ပြန်လည်စတင်နိုင်သည်။ နောက်ထပ် အချက်အလက် မလိုအပ်ပါ။", + "signup_for_card_accept_terms" : "ကတ်အတွက် စာရင်းသွင်းပြီး စည်းကမ်းချက်များကို လက်ခံပါ။", + "add_fund_to_card" : "ကတ်များသို့ ကြိုတင်ငွေပေးငွေများ ထည့်ပါ (${value} အထိ)", + "use_card_info_two" : "ဒစ်ဂျစ်တယ်ငွေကြေးများဖြင့်မဟုတ်ဘဲ ကြိုတင်ငွေပေးချေသည့်အကောင့်တွင် သိမ်းထားသည့်အခါ ရန်ပုံငွေများကို USD သို့ ပြောင်းလဲပါသည်။", + "use_card_info_three" : "ဒစ်ဂျစ်တယ်ကတ်ကို အွန်လိုင်း သို့မဟုတ် ထိတွေ့မှုမဲ့ ငွေပေးချေမှုနည်းလမ်းများဖြင့် အသုံးပြုပါ။", + "optionally_order_card" : "ရုပ်ပိုင်းဆိုင်ရာကတ်ကို ရွေးချယ်နိုင်သည် ။", + "hide_details" : "အသေးစိတ်ကို ဝှက်ပါ။", + "show_details" : "အသေးစိတ်ပြ", + "upto" : "${value} အထိ", + "discount" : "${value}% ချွေတာ", + "gift_card_amount" : "လက်ဆောင်ကတ် ပမာဏ", + "bill_amount" : "ဘီလ်ပမာဏ", + "you_pay" : "သင်ပေးချေပါ။", + "tip" : "အကြံပြုချက်-", + "custom" : "စိတ်ကြိုက်", + "by_cake_pay" : "Cake Pay ဖြင့်", + "expires" : "သက်တမ်းကုန်သည်။", + "mm": "MM", + "yy": "YY", + "online" : "အွန်လိုင်း", + "offline" : "အော့ဖ်လိုင်း", + "gift_card_number" : "လက်ဆောင်ကတ်နံပါတ်", + "pin_number" : "လျှို့ဝှက်နံပါတ်", + "total_saving" : "စုစုပေါင်းစုဆောင်းငွေ", + "last_30_days" : "လွန်ခဲ့သော ရက် 30", + "avg_savings" : "ပျမ်းမျှ စုဆောင်းငွေ", + "view_all" : "အားလုံးကိုကြည့်ရှုပါ။", + "active_cards" : "အသက်ဝင်သောကတ်များ", + "delete_account" : "အကောင့်ဖျက်ပါ။", + "cards" : "ကတ်များ", + "active" : "အသက်ဝင်သည်။", + "redeemed" : "ရွေးနှုတ်ခဲ့သည်။", + "gift_card_balance_note" : "လက်ကျန်လက်ကျန်ရှိသည့် လက်ဆောင်ကတ်များ ဤနေရာတွင် ပေါ်လာပါမည်။", + "gift_card_redeemed_note" : "သင်ရွေးယူထားသော လက်ဆောင်ကတ်များ ဤနေရာတွင် ပေါ်လာပါမည်။", + "logout" : "ထွက်လိုက်ပါ။", + "add_tip" : "အကြံပြုချက်ထည့်ပါ။", + "percentageOf" : "${amount} ၏", + "is_percentage" : "သည်", + "search_category" : "ရှာဖွေမှုအမျိုးအစား", + "mark_as_redeemed" : "ရွေးနှုတ်ခြင်းအဖြစ် အမှတ်အသားပြုပါ။", + "more_options" : "နောက်ထပ် ရွေးချယ်စရာများ", + "awaiting_payment_confirmation" : "ငွေပေးချေမှု အတည်ပြုချက်ကို စောင့်မျှော်နေပါသည်။", + "transaction_sent_notice" : "မျက်နှာပြင်သည် ၁ မိနစ်အကြာတွင် ဆက်လက်မလုပ်ဆောင်ပါက၊ ပိတ်ဆို့ရှာဖွေသူနှင့် သင့်အီးမေးလ်ကို စစ်ဆေးပါ။", + "agree" : "သဘောတူသည်။", + "in_store" : "စတိုးတွင်", + "generating_gift_card" : "လက်ဆောင်ကတ်ထုတ်ပေးခြင်း။", + "payment_was_received" : "သင့်ငွေပေးချေမှုကို လက်ခံရရှိခဲ့သည်။", + "proceed_after_one_minute" : "မျက်နှာပြင်သည် ၁ မိနစ်အကြာတွင် ဆက်လက်မလုပ်ဆောင်ပါက သင့်အီးမေးလ်ကို စစ်ဆေးပါ။", + "order_id" : "မှာယူမှု ID", + "gift_card_is_generated" : "Gift Card ထုတ်ပေးပါသည်။", + "open_gift_card" : "Gift Card ကိုဖွင့်ပါ။", + "contact_support" : "ပံ့ပိုးကူညီမှုထံ ဆက်သွယ်ပါ။", + "gift_cards_unavailable" : "လက်ဆောင်ကတ်များကို ယခုအချိန်တွင် Monero၊ Bitcoin နှင့် Litecoin တို့ဖြင့်သာ ဝယ်ယူနိုင်ပါပြီ။", + "introducing_cake_pay" : "Cake Pay ကို မိတ်ဆက်ခြင်း။", + "cake_pay_learn_more" : "အက်ပ်ရှိ လက်ဆောင်ကတ်များကို ချက်ချင်းဝယ်ယူပြီး ကူပွန်ဖြင့် လဲလှယ်ပါ။\nပိုမိုလေ့လာရန် ဘယ်မှညာသို့ ပွတ်ဆွဲပါ။", + "automatic" : "အလိုအလျောက်", + "fixed_pair_not_supported" : "ရွေးချယ်ထားသော ဖလှယ်မှုများဖြင့် ဤပုံသေအတွဲကို ပံ့ပိုးမထားပါ။", + "variable_pair_not_supported" : "ရွေးချယ်ထားသော ဖလှယ်မှုများဖြင့် ဤပြောင်းလဲနိုင်သောအတွဲကို ပံ့ပိုးမထားပါ။", + "none_of_selected_providers_can_exchange" : "ရွေးချယ်ထားသော ဝန်ဆောင်မှုပေးသူများမှ ဤလဲလှယ်မှုကို ပြုလုပ်၍မရပါ။", + "choose_one" : "တစ်ခုရွေးပါ။", + "choose_from_available_options" : "ရနိုင်သောရွေးချယ်မှုများမှ ရွေးပါ-", + "custom_redeem_amount" : "စိတ်ကြိုက်သုံးငွေပမာဏ", + "add_custom_redemption" : "စိတ်ကြိုက်ရွေးယူမှုကို ထည့်ပါ။", + "remaining" : "ကျန်", + "delete_wallet" : "ပိုက်ဆံအိတ်ကို ဖျက်ပါ။", + "delete_wallet_confirm_message" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖျက်လိုသည်မှာ သေချာပါသလား။", + "low_fee" : "အနိမ့်ကြေး", + "low_fee_alert" : "သင်သည် လက်ရှိတွင် သက်သာသော ကွန်ရက်အခကြေးငွေဦးစားပေးကို အသုံးပြုနေပါသည်။ ၎င်းသည် အကြာကြီးစောင့်ဆိုင်းခြင်း၊ မတူညီသောနှုန်းထားများ သို့မဟုတ် ပယ်ဖျက်ထားသော ကုန်သွယ်မှုများကို ဖြစ်စေနိုင်သည်။ ပိုမိုကောင်းမွန်သော အတွေ့အကြုံအတွက် ပိုမိုမြင့်မားသော အခကြေးငွေ သတ်မှတ်ပေးရန် အကြံပြုအပ်ပါသည်။", + "ignor" : "လျစ်လျူရှုပါ။", + "use_suggested" : "အကြံပြုထားသည်ကို အသုံးပြုပါ။", + "do_not_share_warning_text" : "ပံ့ပိုးကူညီမှုအပါအဝင် ဤအရာများကို အခြားမည်သူနှင့်မျှ မမျှဝေပါနှင့်။\n\nသင့်ငွေများကို ခိုးယူခံရနိုင်သည်!", + "help" : "ကူညီပါ", + "all_transactions" : "အရောင်းအဝယ်အားလုံး", + "all_trades" : "ကုန်သွယ်မှုအားလုံး", + "connection_sync" : "ချိတ်ဆက်မှုနှင့် ထပ်တူပြုခြင်း။", + "security_and_backup" : "လုံခြုံရေးနှင့် မိတ္တူ", + "create_backup" : "အရန်သိမ်းခြင်းကို ဖန်တီးပါ။", + "privacy_settings" : "Privacy settings တွေကို", + "privacy" : "ကိုယ်ရေးကိုယ်တာ", + "display_settings" : "ပြသရန် ဆက်တင်များ", + "other_settings" : "အခြားဆက်တင်များ", + "require_pin_after" : "ပြီးနောက် PIN လိုအပ်ပါသည်။", + "always" : "အမြဲတမ်း", + "minutes_to_pin_code" : "${minute} မိနစ်", + "disable_exchange" : "လဲလှယ်မှုကို ပိတ်ပါ။", + "advanced_privacy_settings" : "အဆင့်မြင့် ကိုယ်ရေးကိုယ်တာ ဆက်တင်များ", + "settings_can_be_changed_later" : "အက်ပ်ဆက်တင်များတွင် ဤဆက်တင်များကို နောက်ပိုင်းတွင် ပြောင်းလဲနိုင်သည်။", + "add_custom_node" : "စိတ်ကြိုက် Node အသစ်ကို ထည့်ပါ။", + "disable_fiat" : "Fiat ကိုပိတ်ပါ။", + "fiat_api" : "Fiat API", + "disabled" : "မသန်စွမ်း", + "enabled" : "ဖွင့်ထားသည်။", + "tor_only" : "Tor သာ", + "unmatched_currencies" : "သင့်လက်ရှိပိုက်ဆံအိတ်၏ငွေကြေးသည် စကင်ဖတ်ထားသော QR နှင့် မကိုက်ညီပါ။", + "orbot_running_alert": "ဤ node သို့မချိတ်ဆက်မီ Orbot အလုပ်လုပ်နေကြောင်း သေချာပါစေ။", + "contact_list_contacts" : "အဆက်အသွယ်များ", + "contact_list_wallets" : "ကျွန်ုပ်၏ ပိုက်ဆံအိတ်များ", + "bitcoin_payments_require_1_confirmation": "Bitcoin ငွေပေးချေမှုများသည် မိနစ် 20 သို့မဟုတ် ထို့ထက်ပိုကြာနိုင်သည် 1 အတည်ပြုချက် လိုအပ်သည်။ မင်းရဲ့စိတ်ရှည်မှုအတွက် ကျေးဇူးတင်ပါတယ်။ ငွေပေးချေမှုကို အတည်ပြုပြီးသောအခါ သင့်ထံ အီးမေးလ်ပို့ပါမည်။", + "send_to_this_address" : "ဤလိပ်စာသို့ ${currency} ${tag}သို့ ပို့ပါ။", + "arrive_in_this_address" : "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။", + "do_not_send": "မပို့ပါနှင့်", + "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။" +} diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index c8cdffa19..a4c5d1cc4 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -48,7 +48,7 @@ "outgoing" : "Uitgaande", "transactions_by_date" : "Transacties op datum", "trades" : "Trades", - "filters" : "Filter", + "filter_by": "Filteren op", "today" : "Vandaag", "yesterday" : "Gisteren", "received" : "Ontvangen", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scan uw vingerafdruk om te verifiëren", "version" : "Versie ${currentVersion}", - "openalias_alert_title" : "Adres Gedetecteerd", - "openalias_alert_content" : "U stuurt geld naar\n${recipient_name}", + "extracted_address_content" : "U stuurt geld naar\n${recipient_name}", "card_address" : "Adres:", "buy" : "Kopen", @@ -539,7 +538,9 @@ "wallet_name_exists": "Portemonnee met die naam bestaat al", "market_place": "Marktplaats", "cake_pay_title": "Cake Pay-cadeaubonnen", - "cake_pay_subtitle": "Koop cadeaubonnen en wissel ze direct in", + "cake_pay_subtitle": "Koop cadeaubonnen met korting (alleen VS)", + "cake_pay_web_cards_title": "Cake Pay-webkaarten", + "cake_pay_web_cards_subtitle": "Koop wereldwijd prepaidkaarten en cadeaubonnen", "about_cake_pay": "Met Cake Pay kunt u eenvoudig cadeaubonnen kopen met virtuele activa, die direct kunnen worden uitgegeven bij meer dan 150.000 handelaren in de Verenigde Staten.", "cake_pay_account_note": "Meld u aan met alleen een e-mailadres om kaarten te bekijken en te kopen. Sommige zijn zelfs met korting verkrijgbaar!", "already_have_account": "Heb je al een account?", @@ -654,6 +655,8 @@ "use_suggested": "Gebruik aanbevolen", "do_not_share_warning_text" : "Deel deze met niemand anders, ook niet met support.\n\nUw geld kan en zal worden gestolen!", "help": "helpen", + "all_transactions": "Alle transacties", + "all_trades": "Alle transacties", "connection_sync": "Verbinding en synchronisatie", "security_and_backup": "Beveiliging en back-up", "create_backup": "Maak een back-up", @@ -674,5 +677,13 @@ "enabled": "Ingeschakeld", "tor_only": "Alleen Tor", "unmatched_currencies": "De valuta van uw huidige portemonnee komt niet overeen met die van de gescande QR", + "orbot_running_alert": "Zorg ervoor dat Orbot actief is voordat u verbinding maakt met dit knooppunt.", + "contact_list_contacts": "Contacten", + "contact_list_wallets": "Mijn portefeuilles", + "bitcoin_payments_require_1_confirmation": "Bitcoin-betalingen vereisen 1 bevestiging, wat 20 minuten of langer kan duren. Dank voor uw geduld! U ontvangt een e-mail wanneer de betaling is bevestigd.", + "send_to_this_address" : "Stuur ${currency} ${tag}naar dit adres", + "arrive_in_this_address" : "${currency} ${tag}komt aan op dit adres", + "do_not_send": "Niet sturen", + "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren.", "settings": "Instellingen" } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 690a103e4..238d007c8 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -2,7 +2,7 @@ "welcome" : "Witamy w", "cake_wallet" : "Cake Wallet", "first_wallet_text" : "Świetny portfel na Monero, Bitcoin, Litecoin, i Haven", - "please_make_selection" : "Wybierz poniżej, aby cutwórz lub odzyskaj swój portfel.", + "please_make_selection" : "Wybierz poniżej, aby utworzyć lub przywrócić swój portfel.", "create_new" : "Utwórz nowy portfel", "restore_wallet" : "Przywróć portfel", @@ -13,90 +13,90 @@ "haven_app_wallet_text": "Awesome wallet for Haven", "accounts" : "Konta", - "edit" : "Edytować", + "edit" : "Edytuj", "account" : "Konto", "add" : "Dodaj", - "address_book" : "Książka adresowa", + "address_book" : "Kontakty", "contact" : "Kontakt", "please_select" : "Proszę wybrać:", - "cancel" : "Anulować", - "ok" : "Dobrze", + "cancel" : "Anuluj", + "ok" : "Ok", "contact_name" : "Nazwa Kontaktu", - "reset" : "Nastawić", - "save" : "Zapisać", + "reset" : "Wyczyść", + "save" : "Zapisz", "address_remove_contact" : "Usuń kontakt", "address_remove_content" : "Czy na pewno chcesz usunąć wybrany kontakt?", - "authenticated" : "Zalegalizowany", - "authentication" : "Poświadczenie", + "authenticated" : "Uwierzytelniony", + "authentication" : "Uwierzytelnianie", "failed_authentication" : "Nieudane uwierzytelnienie. ${state_error}", "wallet_menu" : "Menu portfela", - "Blocks_remaining" : "${status} Bloki pozostałe", + "Blocks_remaining" : "Pozostało ${status} bloków", "please_try_to_connect_to_another_node" : "Spróbuj połączyć się z innym węzłem", "xmr_hidden" : "Ukryty", - "xmr_available_balance" : "Dostępne saldo", - "xmr_full_balance" : "Pełna równowaga", - "send" : "Wysłać", - "receive" : "Otrzymać", + "xmr_available_balance" : "Dostępne środki", + "xmr_full_balance" : "Pełne saldo", + "send" : "Wyślij", + "receive" : "Otrzymaj", "transactions" : "Transakcje", "incoming" : "Przychodzące", - "outgoing" : "Towarzyski", + "outgoing" : "Wychodzące", "transactions_by_date" : "Transakcje według daty", "trades" : "Transakcje", - "filters" : "Filtr", + "filter_by": "Filtruj według", "today" : "Dzisiaj", "yesterday" : "Wczoraj", "received" : "Odebrane", "sent" : "Wysłano", "pending" : " (w oczekiwaniu)", "rescan" : "Skanuj ponownie", - "reconnect" : "Na nowo połączyć", + "reconnect" : "Połącz ponownie", "wallets" : "Portfele", - "show_seed" : "Pokaż nasiona", - "show_keys" : "Pokaż nasiona/klucze", - "address_book_menu" : "Książka adresowa", - "reconnection" : "Ponowne połączenie", - "reconnect_alert_text" : "Czy na pewno ponownie się połączysz?", + "show_seed" : "Pokaż frazy seed", + "show_keys" : "Pokaż seed/klucze", + "address_book_menu" : "Kontakty", + "reconnection" : "Ponowne łączenie", + "reconnect_alert_text" : "Czy na pewno ponownie się ponownie połączysz?", - "exchange" : "Wymieniać się", + "exchange" : "Wymień", "clear" : "Wyczyść", - "refund_address" : "Adres zwrotu", - "change_exchange_provider" : "Zmień dostawcę programu Exchange", + "refund_address" : "Adres do zwrotu", + "change_exchange_provider" : "Zmień dostawcę wymiany", "you_will_send" : "Konwertuj z", "you_will_get" : "Konwertuj na", "amount_is_guaranteed" : "Otrzymana kwota jest gwarantowana", "amount_is_estimate" : "Otrzymana kwota jest wartością szacunkową", - "powered_by" : "Zasilany przez ${title}", + "powered_by" : "Obsługiwane przez ${title}", "error" : "Błąd", "estimated" : "Oszacowano", "min_value" : "Min: ${value} ${currency}", "max_value" : "Max: ${value} ${currency}", - "change_currency" : "Change Currency", - "overwrite_amount" : "Overwrite amount", - "qr_payment_amount" : "This QR code contains a payment amount. Do you want to overwrite the current value?", + "change_currency" : "Zmień walutę", + "overwrite_amount" : "Nadpisz ilość", + "qr_payment_amount" : "Ten kod QR zawiera kwotę do zapłaty. Czy chcesz nadpisać obecną wartość?", - "copy_id" : "ID kopii", - "exchange_result_write_down_trade_id" : "Skopiuj lub zanotuj identyfikator transakcji, aby kontynuować.", - "trade_id" : "Identyfikator handlu:", - "copied_to_clipboard" : "Skopiowane do schowka", + "copy_id" : "skopiuj ID", + "exchange_result_write_down_trade_id" : "Skopiuj lub zanotuj identyfikator transakcji (ID), aby kontynuować.", + "trade_id" : "ID transakcji:", + "copied_to_clipboard" : "Skopiowano do schowka", "saved_the_trade_id" : "Zapisałem ID", - "fetching" : "Ujmujący", + "fetching" : "Pobieranie", "id" : "ID: ", "amount" : "Ilość: ", - "payment_id" : "Płatności ID: ", + "payment_id" : "ID Płatności: ", "status" : "Status: ", "offer_expires_in" : "Oferta wygasa za ", - "trade_is_powered_by" : "Ten handel jest zasilany przez ${provider}", + "trade_is_powered_by" : "Ta wymiana jest obsługiwana przez ${provider}", "copy_address" : "Skopiuj adress", "exchange_result_confirm" : "Naciskając Potwierdź, wyślesz ${fetchingLabel} ${from} z twojego portfela ${walletName} na adres podany poniżej. Lub możesz wysłać z zewnętrznego portfela na poniższy adres / kod QR.\n\nNaciśnij Potwierdź, aby kontynuować lub wróć, aby zmienić kwoty.", - "exchange_result_description" : "Musisz wysłać co najmniej ${fetchingLabel} ${from} na adres podany na następnej stronie. Jeśli wyślesz kwotę niższą niż ${fetchingLabel} ${from}, może ona nie zostać przeliczona i może nie zostać zwrócona.", - "exchange_result_write_down_ID" : "*Skopiuj lub zanotuj swój identyfikator pokazany powyżej.", + "exchange_result_description" : "Musisz wysłać co najmniej ${fetchingLabel} ${from} na adres podany na następnej stronie. Jeśli wyślesz kwotę niższą niż ${fetchingLabel} ${from}, może ona nie zostać uwzględniona i może nie zostać zwrócona.", + "exchange_result_write_down_ID" : "*Skopiuj lub zanotuj identyfikator transakcji pokazany powyżej.", "confirm" : "Potwierdzać", "confirm_sending" : "Potwierdź wysłanie", "commit_transaction_amount_fee" : "Zatwierdź transakcję\nIlość: ${amount}\nOpłata: ${fee}", @@ -104,13 +104,13 @@ "transaction_sent" : "Transakcja wysłana!", "expired" : "Przedawniony", "time" : "${minutes}m ${seconds}s", - "send_xmr" : "Wysłać XMR", - "exchange_new_template" : "Nowy szablon", + "send_xmr" : "Wyślij XMR", + "exchange_new_template" : "Nowy szablon wymiany", "faq" : "FAQ", - "enter_your_pin" : "Wpisz Twój kod PIN", + "enter_your_pin" : "Wpisz kod PIN", "loading_your_wallet" : "Ładowanie portfela", @@ -123,17 +123,17 @@ "node_new" : "Nowy węzeł", "node_address" : "Adres węzła", "node_port" : "Port węzła", - "login" : "Zaloguj Się", + "login" : "Login", "password" : "Hasło", "nodes" : "Węzły", - "node_reset_settings_title" : "Resetowanie ustawień", + "node_reset_settings_title" : "Zresetuj ustawienia węzłów", "nodes_list_reset_to_default_message" : "Czy na pewno chcesz przywrócić ustawienia domyślne?", - "change_current_node" : "Czy na pewno chcesz przywrócić ustawienia domyślne? ${node}?", - "change" : "Zmiana", + "change_current_node" : "Czy na pewno chcesz wybrać ten węzeł? ${node}?", + "change" : "Zmień", "remove_node" : "Usuń węzeł", "remove_node_message" : "Czy na pewno chcesz usunąć wybrany węzeł?", - "remove" : "Usunąć", - "delete" : "Kasować", + "remove" : "Usuń", + "delete" : "Skasuj", "add_new_node" : "Dodaj nowy węzeł", "change_current_node_title" : "Zmień bieżący węzeł", "node_test" : "Test", @@ -142,8 +142,8 @@ "new_node_testing" : "Testowanie nowych węzłów", - "use" : "Używać ", - "digit_pin" : "-znak PIN", + "use" : "Użyj ", + "digit_pin" : "-znakowy PIN", "share_address" : "Udostępnij adres", @@ -152,46 +152,46 @@ "addresses" : "Adresy", "scan_qr_code" : "Zeskanuj kod QR, aby uzyskać adres", "qr_fullscreen" : "Dotknij, aby otworzyć pełnoekranowy kod QR", - "rename" : "Przemianować", + "rename" : "Zmień nazwę", "choose_account" : "Wybierz konto", "create_new_account" : "Stwórz nowe konto", "accounts_subaddresses" : "Konta i podadresy", "restore_restore_wallet" : "Przywróć portfel", - "restore_title_from_seed_keys" : "Przywróć z nasion / kluczy", - "restore_description_from_seed_keys" : "Odzyskaj swój portfel z nasion / kluczy, które zapisałeś w bezpiecznym miejscu", + "restore_title_from_seed_keys" : "Przywróć z seedów / kluczy", + "restore_description_from_seed_keys" : "Odzyskaj swój portfel z seedów / kluczy, które zapisałeś w bezpiecznym miejscu", "restore_next" : "Kolejny", "restore_title_from_backup" : "Przywróć z pliku kopii zapasowej", - "restore_description_from_backup" : "Możesz przywrócić całą aplikację Cake Wallet z plik kopii zapasowej", - "restore_seed_keys_restore" : "Przywracanie nasion / kluczy", - "restore_title_from_seed" : "Przywróć z nasion", - "restore_description_from_seed" : "Przywróć swój portfel z 25 słów lub 13-słowny kod kombinacji", + "restore_description_from_backup" : "Możesz przywrócić całą aplikację Cake Wallet z pliku kopii zapasowej", + "restore_seed_keys_restore" : "Przywracanie seedów / kluczy", + "restore_title_from_seed" : "Przywróć z seedów", + "restore_description_from_seed" : "Przywróć swój portfel z 25 lub 13-słownej frazy seed", "restore_title_from_keys" : "Przywróć z kluczy", - "restore_description_from_keys" : "Przywróć swój portfel z wygenerowanego naciśnięcia klawiszy zapisane z kluczy prywatnych", + "restore_description_from_keys" : "Przywróć swój portfel z kluczy prywatnych", "restore_wallet_name" : "Nazwa portfela", "restore_address" : "Adres", - "restore_view_key_private" : "Wyświetl klucz (prywatny)", - "restore_spend_key_private" : "Wydaj klucz (prywatny)", - "restore_recover" : "Wyzdrowieć", - "restore_wallet_restore_description" : "Opis przywracania portfela", - "restore_new_seed" : "Nowe nasienie", - "restore_active_seed" : "Aktywne nasiona", - "restore_bitcoin_description_from_seed" : "Przywróć swój portfel z kodu złożonego z 24 słów", - "restore_bitcoin_description_from_keys" : "Przywróć swój portfel z wygenerowanego ciągu WIF z kluczy prywatnych", - "restore_bitcoin_title_from_keys" : "Przywróć z WIF", - "restore_from_date_or_blockheight" : "Wprowadź datę na kilka dni przed utworzeniem tego portfela. Lub jeśli znasz wysokość bloku, wprowadź go zamiast tego", + "restore_view_key_private" : "Podaj klucz prywatny", + "restore_spend_key_private" : "Podaj prywatny klucz wglądu (view key)", + "restore_recover" : "Przywróć", + "restore_wallet_restore_description" : "Przywracanie portfela", + "restore_new_seed" : "Nowy seed", + "restore_active_seed" : "Aktywne seedy", + "restore_bitcoin_description_from_seed" : "Przywróć swój portfel z frazy seed złożonej z 24 słów", + "restore_bitcoin_description_from_keys" : "Przywróć swój portfel z klucza prywatnego", + "restore_bitcoin_title_from_keys" : "Przywróć z klucza prywatnego", + "restore_from_date_or_blockheight" : "Wprowadź datę na kilka dni przed utworzeniem tego portfela, lub jeśli znasz wysokość bloku, wprowadź go zamiast daty", - "seed_reminder" : "Zapisz je na wypadek zgubienia lub wyczyszczenia telefonu", - "seed_title" : "Ziarno", - "seed_share" : "Udostępnij ziarno", + "seed_reminder" : "Musisz zapisać tą fraze, bo bez niej możesz nie odzyskać portfela!", + "seed_title" : "Seed", + "seed_share" : "Udostępnij seed", "copy" : "Kopiuj", - "seed_language_choose" : "Proszę wybrać język początkowy:", - "seed_choose" : "Wybierz język początkowy", - "seed_language_next" : "Kolejny", + "seed_language_choose" : "Proszę wybrać język słów we frazie seed:", + "seed_choose" : "Wybierz język", + "seed_language_next" : "Następny", "seed_language_english" : "Angielski", "seed_language_chinese" : "Chiński", "seed_language_dutch" : "Holenderski", @@ -209,7 +209,7 @@ "send_address" : "Adres ${cryptoCurrency}", "send_payment_id" : "Identyfikator płatności (opcjonalny)", "all" : "WSZYSTKO", - "send_error_minimum_value" : "Minimalna wartość kwoty to 0,01", + "send_error_minimum_value" : "Minimalna wartość to 0,01", "send_error_currency" : "Waluta może zawierać tylko cyfry", "send_estimated_fee" : "Szacowana opłata:", "send_priority" : "Obecnie opłata ustalona jest na ${transactionPriority} priorytet.\nPriorytet transakcji można zmienić w ustawieniach", @@ -219,7 +219,7 @@ "send_amount" : "Ilość:", "send_fee" : "Opłata:", "send_name" : "Imię", - "send_got_it" : "Rozumiem", + "send_got_it" : "Wysłano", "send_sending" : "Wysyłanie...", "send_success" : "Twoje ${crypto} zostało pomyślnie wysłane", @@ -232,21 +232,21 @@ "settings_currency" : "Waluta", "settings_fee_priority" : "Priorytet opłaty", "settings_save_recipient_address" : "Zapisz adres odbiorcy", - "settings_personal" : "Osobisty", + "settings_personal" : "Osobiste", "settings_change_pin" : "Zmień PIN", "settings_change_language" : "Zmień język", "settings_allow_biometrical_authentication" : "Zezwalaj na uwierzytelnianie biometryczne", "settings_dark_mode" : "Tryb ciemny", "settings_transactions" : "Transakcje", "settings_trades" : "Transakcje", - "settings_display_on_dashboard_list" : "Wyświetl na liście kokpitu", - "settings_all" : "Cały", + "settings_display_on_dashboard_list" : "Wyświetl na pulpicie", + "settings_all" : "Wszystkie", "settings_only_trades" : "Tylko transakcje", "settings_only_transactions" : "Tylko transakcje", "settings_none" : "Żaden", "settings_support" : "Wsparcie", "settings_terms_and_conditions" : "Zasady i warunki", - "pin_is_incorrect" : "PPIN jest niepoprawny", + "pin_is_incorrect" : "PIN jest niepoprawny", "setup_pin" : "Ustaw PIN", @@ -254,47 +254,47 @@ "setup_successful" : "Twój kod PIN został pomyślnie skonfigurowany!", - "wallet_keys" : "Nasiono portfela/klucze", - "wallet_seed" : "Nasiono portfela", - "private_key" : "Prywatny klucz", + "wallet_keys" : "Klucze portfela", + "wallet_seed" : "Seed portfela", + "private_key" : "Klucz prywatny", "public_key" : "Klucz publiczny", - "view_key_private" : "Wyświetl klucz (prywatny)", - "view_key_public" : "Wyświetl klucz (publiczny)", - "spend_key_private" : "Wydaj klucz (prywatny)", - "spend_key_public" : "Wydaj klucz (publiczny)", - "copied_key_to_clipboard" : "Skopiowane ${key} do schowka", + "view_key_private" : "Prywatny Klucz Wglądu", + "view_key_public" : "Publiczny Klucz Wglądu", + "spend_key_private" : "Klucz prywatny", + "spend_key_public" : "Klucz publiczny", + "copied_key_to_clipboard" : "Skopiowaneo ${key} do schowka", "new_subaddress_title" : "Nowy adres", - "new_subaddress_label_name" : "Nazwa etykiety", + "new_subaddress_label_name" : "Etykieta nazwy adresu", "new_subaddress_create" : "Stwórz", - "address_label" : "Address label", + "address_label" : "Etykieta Adresu", "subaddress_title" : "Lista podadresów", - "trade_details_title" : "Szczegóły handlu", + "trade_details_title" : "Szczegóły transakcji", "trade_details_id" : "ID", - "trade_details_state" : "Stan", - "trade_details_fetching" : "Ujmujący", + "trade_details_state" : "Status", + "trade_details_fetching" : "Pobieranie", "trade_details_provider" : "Dostawca", - "trade_details_created_at" : "Utworzono w", + "trade_details_created_at" : "Utworzono ", "trade_details_pair" : "Para", "trade_details_copied" : "${title} skopiowane do schowka", - "trade_history_title" : "Historia handlu", + "trade_history_title" : "Historia wymian", "transaction_details_title" : "Szczegóły transakcji", - "transaction_details_transaction_id" : "Transakcja ID", + "transaction_details_transaction_id" : "ID Trancakcji", "transaction_details_date" : "Data", - "transaction_details_height" : "Wysokość", + "transaction_details_height" : "Wysokość Bloku", "transaction_details_amount" : "Ilość", "transaction_details_fee" : "Opłata", "transaction_details_copied" : "${title} skopiowane do schowka", - "transaction_details_recipient_address" : "Adresy odbiorców", + "transaction_details_recipient_address" : "Adres odbiorcy", "wallet_list_title" : "Portfel Monero", @@ -311,23 +311,23 @@ "widgets_restore_from_blockheight" : "Przywróć z wysokości bloku", "widgets_restore_from_date" : "Przywróć od daty", "widgets_or" : "lub", - "widgets_seed" : "Ziarno", + "widgets_seed" : "Seed", "router_no_route" : "Brak zdefiniowanej trasy dla ${name}", "error_text_account_name" : "Nazwa konta może zawierać tylko litery, cyfry\ni musi mieć od 1 do 15 znaków", - "error_text_contact_name" : "Nazwa kontaktu nie może zawierać` , ' \" symbolika\ni musi mieć od 1 do 32 znaków ", - "error_text_address" : "Wallet address must correspond to the type\nof cryptocurrency", + "error_text_contact_name" : "Nazwa kontaktu nie może zawierać symboli ` , ' \"\ni musi mieć od 1 do 32 znaków ", + "error_text_address" : "Adres musi odpowiadać typowi kryptowaluty", "error_text_node_address" : "Wpisz adres iPv4", "error_text_node_port" : "Port węzła może zawierać tylko liczby od 0 do 65535", "error_text_payment_id" : "ID może zawierać od 16 do 64 znaków w formacie szesnastkowym", "error_text_xmr" : "Wartość XMR nie może przekraczać dostępnego salda.\nLiczba cyfr ułamkowych musi być mniejsza lub równa 12", "error_text_fiat" : "Wartość kwoty nie może przekroczyć dostępnego salda.\nLiczba cyfr ułamkowych musi być mniejsza lub równa 2", - "error_text_subaddress_name" : "Nazwa podadresu nie może zawierać ` , ' \" symbolika\ni musi mieć od 1 do 20 znaków", + "error_text_subaddress_name" : "Nazwa podadresu nie może zawierać symboli ` , ' \"\ni musi mieć od 1 do 20 znaków", "error_text_amount" : "Kwota może zawierać tylko liczby", - "error_text_wallet_name" : "Nazwa portfela może zawierać tylko litery, cyfry, _ - symbole\ni musi mieć od 1 do 33 znaków", + "error_text_wallet_name" : "Nazwa portfela może zawierać tylko litery, cyfry lub symbole _ - \ni musi mieć od 1 do 33 znaków", "error_text_keys" : "Klucze portfela mogą zawierać tylko 64 znaki w systemie szesnastkowym", "error_text_crypto_currency" : "Liczba cyfr ułamkowych\nmusi być mniejsza lub równa 12", "error_text_minimal_limit" : "Wymiana dla ${provider} nie została utworzona. Kwota jest mniejsza niż minimalna: ${min} ${currency}", @@ -337,69 +337,68 @@ "auth_store_ban_timeout" : "przekroczenie limitu czasu", - "auth_store_banned_for" : "Bzbanowany za ", + "auth_store_banned_for" : "Zablokowany za ", "auth_store_banned_minutes" : " minuty", "auth_store_incorrect_password" : "Niepoprawny PIN", "wallet_store_monero_wallet" : "Portfel Monero", - "wallet_restoration_store_incorrect_seed_length" : "Nieprawidłowa długość nasion", + "wallet_restoration_store_incorrect_seed_length" : "Nieprawidłowa długość frazy seed", - "full_balance" : "Pełna równowaga", - "available_balance" : "Dostępne saldo", - "hidden_balance" : "Ukryta równowaga", + "full_balance" : "Pełne saldo", + "available_balance" : "Dostępne środki", + "hidden_balance" : "Ukryte saldo", "sync_status_syncronizing" : "SYNCHRONIZACJA", - "sync_status_syncronized" : "SYNCHRONIZOWANY", + "sync_status_syncronized" : "SYNCHRONIZOWANIE", "sync_status_not_connected" : "NIE POŁĄCZONY", "sync_status_starting_sync" : "ROZPOCZĘCIE SYNCHRONIZACJI", - "sync_status_failed_connect" : "NIEPOWIĄZANY", - "sync_status_connecting" : "ZŁĄCZONY", + "sync_status_failed_connect" : "POŁĄCZENIE NIEUDANE", + "sync_status_connecting" : "ŁĄCZENIE", "sync_status_connected" : "POŁĄCZONY", "sync_status_attempting_sync" : "PRÓBA SYNCHRONIZACJI", - "transaction_priority_slow" : "Powolny", - "transaction_priority_regular" : "Regularny", - "transaction_priority_medium" : "Średni", - "transaction_priority_fast" : "Szybki", - "transaction_priority_fastest" : "Najszybszy", + "transaction_priority_slow" : "Wolna(Zalecane)", + "transaction_priority_regular" : "Regularna", + "transaction_priority_medium" : "Średnia", + "transaction_priority_fast" : "Szybka", + "transaction_priority_fastest" : "Najszybsza", - "trade_for_not_created" : "Zamienić się za ${title} nie jest tworzony.", - "trade_not_created" : "Handel nie utworzony", - "trade_id_not_found" : "Handel ${tradeId} of ${title} nie znaleziono.", - "trade_not_found" : "Nie znaleziono handlu.", + "trade_for_not_created" : "Wymiana za ${title} nie została utworzona.", + "trade_not_created" : "Wymiana nie została utworzona", + "trade_id_not_found" : "Transakcja ${tradeId} ${title} nie znaleziona.", + "trade_not_found" : "Nie znaleziono transakcji.", - "trade_state_pending" : "W oczekiwaniu", - "trade_state_confirming" : "Potwierdzam", - "trade_state_trading" : "Handlowy", - "trade_state_traded" : "Handlowane", - "trade_state_complete" : "Kompletny", - "trade_state_to_be_created" : "Zostać stworzonym", - "trade_state_unpaid" : "Nie zapłacony", + "trade_state_pending" : "Oczekująca", + "trade_state_confirming" : "Potwierdzanie", + "trade_state_trading" : "Wymiana", + "trade_state_traded" : "Wymienione", + "trade_state_complete" : "Ukończona", + "trade_state_to_be_created" : "Została stworzona", + "trade_state_unpaid" : "Nie opłacona", "trade_state_underpaid" : "Niedopłacone", - "trade_state_paid_unconfirmed" : "Płatne niepotwierdzone", - "trade_state_paid" : "Płatny", - "trade_state_btc_sent" : "Wysłane", + "trade_state_paid_unconfirmed" : "Transakcja niepotwierdzona", + "trade_state_paid" : "Opłacona", + "trade_state_btc_sent" : "Wysłanie", "trade_state_timeout" : "Koniec czasu", - "trade_state_created" : "Stworzony", - "trade_state_finished" : "Skończone", + "trade_state_created" : "Stworzona", + "trade_state_finished" : "Zakończona", "change_language" : "Zmień język", "change_language_to" : "Zmień język na ${language}?", - "paste" : "Pasta", - "restore_from_seed_placeholder" : "Wpisz lub wklej tutaj swoją frazę kodową", + "paste" : "Wklej", + "restore_from_seed_placeholder" : "Wpisz lub wklej tutaj swoją frazę seed", "add_new_word" : "Dodaj nowe słowo", - "incorrect_seed" : "Wprowadzony tekst jest nieprawidłowy.", + "incorrect_seed" : "Wprowadzony seed jest nieprawidłowy.", - "biometric_auth_reason" : "Zeskanuj swój odcisk palca, aby go uwierzytelnić", + "biometric_auth_reason" : "Zeskanuj swój odcisk palca, aby uwierzytelnić", "version" : "Wersja ${currentVersion}", - "openalias_alert_title" : "Wykryto Adres", - "openalias_alert_content" : "Będziesz wysyłać środki na\n${recipient_name}", + "extracted_address_content" : "Wysyłasz środki na\n${recipient_name}", "card_address" : "Adres:", "buy" : "Kup", @@ -418,36 +417,36 @@ "change_wallet_alert_content" : "Czy chcesz zmienić obecny portfel na ${wallet_name}?", "creating_new_wallet" : "Tworzenie nowego portfela", - "creating_new_wallet_error" : "Pomyłka: ${description}", + "creating_new_wallet_error" : "Błąd: ${description}", "seed_alert_title" : "Uwaga", - "seed_alert_content" : "Ziarno to jedyny sposób na odzyskanie portfela. Zapisałeś to?", + "seed_alert_content" : "Fraza Seed to jedyny sposób na odzyskanie portfela. Zapisałeś ją?", "seed_alert_back" : "Wróć", "seed_alert_yes" : "Tak", "exchange_sync_alert_content" : "Poczekaj, aż portfel zostanie zsynchronizowany", "pre_seed_title" : "WAŻNY", - "pre_seed_description" : "Na następnej stronie zobaczysz serię ${words} słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet.", - "pre_seed_button_text" : "Rozumiem. Pokaż mi moje nasienie", + "pre_seed_description" : "Na następnej stronie zobaczysz serię ${words} słów. To jest Twoja unikalna i prywatna fraza seed i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii telefonu. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu (np. na kartce w SEJFIE).", + "pre_seed_button_text" : "Rozumiem. Pokaż mi moją fraze seed", - "xmr_to_error" : "Pomyłka XMR.TO", - "xmr_to_error_description" : "Nieprawidłowa kwota. Maksymalny limit 8 cyfr po przecinku", + "xmr_to_error" : "Błąd XMR.TO", + "xmr_to_error_description" : "Nieprawidłowa kwota. Maksymalny limit to 8 cyfr po przecinku", "provider_error" : "${provider} pomyłka", "use_ssl" : "Użyj SSL", - "trusted" : "zaufany", + "trusted" : "Zaufany", "color_theme" : "Motyw kolorystyczny", - "light_theme" : "Lekki", - "bright_theme" : "Jasny", + "light_theme" : "Jasny", + "bright_theme" : "Biały", "dark_theme" : "Ciemny", "enter_your_note" : "Wpisz notatkę…", "note_optional" : "Notatka (opcjonalnie)", "note_tap_to_change" : "Notatka (dotknij, aby zmienić)", - "view_in_block_explorer" : "View in Block Explorer", - "view_transaction_on" : "View Transaction on ", + "view_in_block_explorer" : "Zobacz w eksploratorze bloków", + "view_transaction_on" : "Zobacz transakcje na ", "transaction_key" : "Klucz transakcji", "confirmations" : "Potwierdzenia", "recipient_address" : "Adres odbiorcy", @@ -456,27 +455,27 @@ "destination_tag" : "Tag docelowy:", "memo" : "Notatka:", - "backup" : "Kopię zapasową", + "backup" : "Kopia zapasowa", "change_password" : "Zmień hasło", - "backup_password" : "Hasło zapasowe", - "write_down_backup_password" : "Zapisz swoje hasło zapasowe, które jest używane do importowania plików kopii zapasowych.", + "backup_password" : "Hasło kpoii zapasowej", + "write_down_backup_password" : "Zapisz swoje hasło kopii zapasowej, które jest używane do importowania plików kopii zapasowych.", "export_backup" : "Eksportuj kopię zapasową", - "save_backup_password" : "Upewnij się, że zapisałeś swoje zapasowe hasło. Bez tego nie będziesz mógł importować plików kopii zapasowej.", + "save_backup_password" : "Upewnij się, że zapisałeś swoje hasło kopii zapasowej. Bez tego nie będziesz mógł zaimportować pliku kopii zapasowej.", "backup_file" : "Plik kopii zapasowej", "edit_backup_password" : "Edytuj hasło kopii zapasowej", - "save_backup_password_alert" : "Zapisz hasło zapasowe", - "change_backup_password_alert" : "Twoje poprzednie pliki kopii zapasowej nie będą dostępne do zaimportowania z nowym hasłem kopii zapasowej. Nowe hasło zapasowe będzie używane tylko dla nowych plików kopii zapasowych. Czy na pewno chcesz zmienić hasło zapasowe?", + "save_backup_password_alert" : "Zapisz hasło kopii zapasowej", + "change_backup_password_alert" : "Twoje poprzednie pliki kopii zapasowej nie będą dostępne do zaimportowania z nowym hasłem kopii zapasowej. Nowe hasło kopii zapasowej będzie używane tylko dla nowych plików kopii zapasowych. Czy na pewno chcesz zmienić hasło zapasowe?", - "enter_backup_password" : "Wprowadź tutaj hasło zapasowe", + "enter_backup_password" : "Wprowadź tutaj hasło kopii zapasowej", "select_backup_file" : "Wybierz plik kopii zapasowej", - "import" : "Import", - "please_select_backup_file" : "Wybierz plik kopii zapasowej i wprowadź hasło zapasowe.", + "import" : "Zaimportuj", + "please_select_backup_file" : "Wybierz plik kopii zapasowej i wprowadź hasło.", "fixed_rate" : "Stała stawka", - "fixed_rate_alert" : "Będziesz mógł wprowadzić kwotę otrzymaną, gdy zaznaczony jest tryb stałej stawki. Czy chcesz przejść do trybu stałej stawki?", + "fixed_rate_alert" : "Będziesz mógł wprowadzić kwotę do otrzymania, gdy wybrany bedzie tryb stałego przeliczenia. Czy chcesz przejść do trybu stałej stawki?", - "xlm_extra_info" : "Nie zapomnij podać identyfikatora notatki podczas wysyłania transakcji XLM do wymiany", + "xlm_extra_info" : "Nie zapomnij podać dodatkowego identyfikatora (memo) podczas wysyłania transakcji XLM do wymiany", "xrp_extra_info" : "Nie zapomnij podać tagu docelowego podczas wysyłania transakcji XRP do wymiany", "exchange_incorrect_current_wallet_for_xmr" : "Jeśli chcesz wymienić XMR z salda Cake Wallet Monero, najpierw przełącz się na portfel Monero.", @@ -484,12 +483,12 @@ "unconfirmed" : "Niepotwierdzony", "displayable" : "Wyświetlane", - "submit_request" : "złożyć wniosek", + "submit_request" : "Złóż wniosek", - "buy_alert_content" : "Obecnie obsługujemy tylko zakup Bitcoin i Litecoin. Aby kupić Bitcoin lub Litecoin, utwórz lub przełącz się na swój portfel Bitcoin lub Litecoin.", + "buy_alert_content" : "Obecnie obsługujemy tylko zakup Bitcoina i Litecoina. Aby kupić Bitcoin lub Litecoin, utwórz lub przełącz się na swój portfel Bitcoin lub Litecoin.", "sell_alert_content": "Obecnie obsługujemy tylko sprzedaż Bitcoina. Aby sprzedać Bitcoin, utwórz lub przełącz się na swój portfel Bitcoin.", - "outdated_electrum_wallet_description" : "Nowe portfele Bitcoin utworzone w Cake mają teraz ziarno składające się z 24 słów. Konieczne jest utworzenie nowego portfela Bitcoin i przeniesienie wszystkich środków do nowego portfela na 24 słowa oraz zaprzestanie korzystania z portfeli z zalążkiem na 12 słów. Zrób to natychmiast, aby zabezpieczyć swoje fundusze.", + "outdated_electrum_wallet_description" : "Nowe portfele Bitcoin utworzone w Cake mają teraz fraze seed składające się z 24 słów. Konieczne jest utworzenie nowego portfela Bitcoin i przeniesienie wszystkich środków do nowego portfela na 24 słowa oraz zaprzestanie korzystania z portfeli z frazą seed na 12 słów. Zrób to natychmiast, aby zabezpieczyć swoje fundusze.", "understand" : "Rozumiem", "apk_update" : "Aktualizacja APK", @@ -498,19 +497,19 @@ "buy_with" : "Kup za pomocą", "moonpay_alert_text" : "Wartość kwoty musi być większa lub równa ${minAmount} ${fiatCurrency}", - "outdated_electrum_wallet_receive_warning": "Jeśli ten portfel ma 12-wyrazowy seed i został utworzony w Cake, NIE Wpłacaj Bitcoina do tego portfela. Wszelkie BTC przeniesione do tego portfela mogą zostać utracone. Utwórz nowy portfel z 24 słowami (dotknij menu w prawym górnym rogu, wybierz Portfele, wybierz Utwórz nowy portfel, a następnie Bitcoin) i NATYCHMIAST przenieś tam swoje BTC. Nowe (24 słowa) portfele BTC firmy Cake są bezpieczne", + "outdated_electrum_wallet_receive_warning": "Jeśli ten portfel ma 12-wyrazowy seed i został utworzony w Cake, NIE Wpłacaj Bitcoina do tego portfela. Wszelkie BTC przeniesione do tego portfela mogą zostać utracone. Utwórz nowy portfel z 24 słowami (dotknij menu w prawym górnym rogu, wybierz Portfele, wybierz Utwórz nowy portfel, a następnie Bitcoin) i NATYCHMIAST przenieś tam swoje BTC. Nowe (24 słowa) portfele BTC Cake Wallet są bezpieczne", "do_not_show_me": "Nie pokazuj mi tego ponownie", "unspent_coins_title" : "Niewydane monety", "unspent_coins_details_title" : "Szczegóły niewydanych monet", - "freeze" : "Zamrażać", - "frozen" : "Mrożony", + "freeze" : "Zamróź", + "frozen" : "Zamrożone", "coin_control" : "Kontrola monet (opcjonalnie)", "address_detected" : "Wykryto adres", - "address_from_domain" : "Ten adres jest od ${domain} na Unstoppable Domains", + "address_from_domain" : "Ten adres to ${domain} na Unstoppable Domains", - "add_receiver" : "Dodaj kolejny odbiornik (opcjonalnie)", + "add_receiver" : "Dodaj kolejnego odbiorcę (opcjonalnie)", "manage_yats" : "Zarządzaj Yats", "yat_alert_title" : "Łatwiejsze wysyłanie i odbieranie kryptowalut dzięki Yat", @@ -521,25 +520,27 @@ "yat" : "Yat", "connect_yats": "Połącz Yats", "address_from_yat" : "Ten adres jest od ${emoji} na Yat", - "yat_error" : "Pomyłka Yata", + "yat_error" : "Błąd Yat", "yat_error_content" : "Brak adresów powiązanych z tym Yat. Wypróbuj inny Yat", "choose_address" : "\n\nWybierz adres:", - "yat_popup_title" : "Twój adres portfela może być emojified.", + "yat_popup_title" : "Twój adres portfela może być zemotkowany.", "yat_popup_content" : "Możesz teraz wysyłać i odbierać krypto w Cake Wallet za pomocą swojego Yat – krótkiej nazwy użytkownika opartej na emotikonach. Zarządzaj Yats w dowolnym momencie na ekranie ustawień", - "second_intro_title" : "Jeden adres emoji, aby rządzić nimi wszystkimi", + "second_intro_title" : "Jeden adres emoji, aby zarzadzać wszystkimi walutami", "second_intro_content" : "Twój Yat to jeden unikalny adres emoji, który zastępuje wszystkie Twoje długie adresy szesnastkowe dla wszystkich Twoich walut.", "third_intro_title" : "Yat ładnie bawi się z innymi", "third_intro_content" : "Yats mieszkają również poza Cake Wallet. Każdy adres portfela na ziemi można zastąpić Yat!", - "learn_more" : "Ucz się więcej", + "learn_more" : "Dowiedz się więcej", "search": "Szukaj", "search_language": "Wyszukaj język", "search_currency": "Wyszukaj walutę", "new_template" : "Nowy szablon", - "electrum_address_disclaimer": "Za każdym razem, gdy korzystasz z jednego z nich, generujemy nowe adresy, ale poprzednie adresy nadal działają", + "electrum_address_disclaimer": "Za każdym razem, gdy wykorzystasz adres, dla wiekszej prywatności generujemy nowy, ale poprzednie adresy nadal działają, i moga odbierać środki", "wallet_name_exists": "Portfel o tej nazwie już istnieje", "market_place": "Rynek", "cake_pay_title": "Karty podarunkowe Cake Pay", - "cake_pay_subtitle": "Kup karty podarunkowe i wykorzystaj je natychmiast", + "cake_pay_subtitle": "Kup karty upominkowe ze zniżką (tylko USA)", + "cake_pay_web_cards_title": "Cake Pay Web Cards", + "cake_pay_web_cards_subtitle": "Kupuj na całym świecie karty przedpłacone i karty podarunkowe", "about_cake_pay": "Cake Pay umożliwia łatwe kupowanie kart podarunkowych z wirtualnymi aktywami, które można natychmiast wydać u ponad 150 000 sprzedawców w Stanach Zjednoczonych.", "cake_pay_account_note": "Zarejestruj się, używając tylko adresu e-mail, aby przeglądać i kupować karty. Niektóre są nawet dostępne ze zniżką!", "already_have_account": "Masz już konto?", @@ -551,16 +552,16 @@ "reset_password": "Zresetuj hasło", "gift_cards": "Karty podarunkowe", "setup_your_debit_card": "Skonfiguruj swoją kartę debetową", - "no_id_required": "Nie wymagamy ID. Doładuj i wydawaj gdziekolwiek", - "how_to_use_card": "Jak korzystać z tej karty", + "no_id_required": "Nie wymagamy Dowodu. Doładuj i wydawaj gdziekolwiek", + "how_to_use_card": "Jak korzystać z tej karty?", "purchase_gift_card": "Kup kartę podarunkową", "verification": "Weryfikacja", - "fill_code": "Proszę wpisać kod weryfikacyjny podany w wiadomości e-mail", - "dont_get_code": "Nie odbierasz kodu?", + "fill_code": "Proszę wpisać kod weryfikacyjny który otrzymałeś w wiadomości e-mail", + "dont_get_code": "Nie dostałeś kodu?", "resend_code": "Wyślij go ponownie", "debit_card": "Karta debetowa", "cakepay_prepaid_card": "Przedpłacona karta debetowa CakePay", - "no_id_needed": "Nie potrzeba ID!", + "no_id_needed": "Nie potrzeba Dowodu!", "frequently_asked_questions": "Często zadawane pytania", "debit_card_terms": "Przechowywanie i używanie numeru karty płatniczej (oraz danych uwierzytelniających odpowiadających numerowi karty płatniczej) w tym portfelu cyfrowym podlega Warunkom odpowiedniej umowy posiadacza karty z wydawcą karty płatniczej, zgodnie z obowiązującym od od czasu do czasu.", "please_reference_document": "Proszę odwołać się do poniższych dokumentów, aby uzyskać więcej informacji.", @@ -624,7 +625,7 @@ "mark_as_redeemed": "Oznacz jako wykorzystany", "more_options": "Więcej opcji", "awaiting_payment_confirmation": "Oczekiwanie na potwierdzenie płatności", - "transaction_sent_notice": "Jeśli ekran nie pojawi się po 1 minucie, sprawdź eksplorator bloków i swój e-mail.", + "transaction_sent_notice": "Jeśli ekran nie zmieni się po 1 minucie, sprawdź eksplorator bloków i swój e-mail.", "agree": "Zgadzam się", "in_store": "W Sklepie", "generating_gift_card": "Generowanie karty podarunkowej", @@ -635,7 +636,7 @@ "open_gift_card": "Otwórz kartę podarunkową", "contact_support": "Skontaktuj się z pomocą techniczną", "gift_cards_unavailable": "Karty podarunkowe można obecnie kupić tylko za pośrednictwem Monero, Bitcoin i Litecoin", - "introducing_cake_pay": "Przedstawiamy Ciasto Pay!", + "introducing_cake_pay": "Przedstawiamy Cake Pay!", "cake_pay_learn_more": "Kupuj i wykorzystuj karty podarunkowe od razu w aplikacji!\nPrzesuń od lewej do prawej, aby dowiedzieć się więcej.", "automatic": "Automatyczny", "fixed_pair_not_supported": "Ta stała para nie jest obsługiwana na wybranych giełdach", @@ -652,8 +653,10 @@ "low_fee_alert": "Obecnie korzystasz z niskiego priorytetu opłaty sieciowej. Może to spowodować długie oczekiwanie, różne stawki lub anulowane transakcje. Zalecamy ustawienie wyższej opłaty, aby zapewnić lepsze wrażenia.", "ignor": "Ignorować", "use_suggested": "Użyj sugerowane", - "do_not_share_warning_text" : "Nie udostępniaj ich nikomu innemu, w tym pomocy.\n\nTwoje środki mogą i zostaną skradzione!", + "do_not_share_warning_text" : "NIE udostępniaj ich nikomu innemu, w tym pomocy technicznej.\n\nTwoje środki wtedy prawdopodobnie zostaną skradzione!", "help": "pomoc", + "all_transactions": "Wszystkie transakcje", + "all_trades": "Wszystkie operacje", "connection_sync": "Połączenie i synchronizacja", "security_and_backup": "Bezpieczeństwo i kopia zapasowa", "create_backup": "Utwórz kopię zapasową", @@ -668,11 +671,19 @@ "advanced_privacy_settings": "Zaawansowane ustawienia prywatności", "settings_can_be_changed_later": "Te ustawienia można później zmienić w ustawieniach aplikacji", "add_custom_node": "Dodaj nowy węzeł niestandardowy", - "disable_fiat": "Wyłącz fiat", - "fiat_api": "API Fiata", + "disable_fiat": "Wyłącz waluty FIAT", + "fiat_api": "API Walut FIAT", "disabled": "Wyłączone", - "enabled": "Włączony", - "tor_only": "Tylko Tor", - "unmatched_currencies": "Waluta Twojego obecnego portfela nie odpowiada walucie zeskanowanego kodu QR", + "enabled": "Włączone", + "tor_only": "Tylko sieć Tor", + "unmatched_currencies": "Waluta Twojego obecnego portfela nie zgadza się z waluctą zeskanowanego kodu QR", + "orbot_running_alert": "Upewnij się, że Orbot działa przed połączeniem z tym węzłem.", + "contact_list_contacts": "Łączność", + "contact_list_wallets": "Moje portfele", + "bitcoin_payments_require_1_confirmation": "Płatności Bitcoin wymagają 1 potwierdzenia, co może zająć 20 minut lub dłużej. Dziękuję za cierpliwość! Otrzymasz wiadomość e-mail, gdy płatność zostanie potwierdzona.", + "send_to_this_address" : "Wyślij ${currency} ${tag}na ten adres", + "arrive_in_this_address" : "${currency} ${tag}dotrze na ten adres", + "do_not_send": "Nie wysyłaj", + "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację.", "settings": "Ustawienia" } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 5077904e6..fccd1bfab 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -48,7 +48,7 @@ "outgoing" : "Enviadas", "transactions_by_date" : "Transações por data", "trades" : "Trocas", - "filters" : "Filtro", + "filter_by": "Filtrar por", "today" : "Hoje", "yesterday" : "Ontem", "received" : "Recebida", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Digitalize sua impressão digital para autenticar", "version" : "Versão ${currentVersion}", - "openalias_alert_title" : "Endereço Detectado", - "openalias_alert_content" : "Você enviará fundos para\n${recipient_name}", + "extracted_address_content" : "Você enviará fundos para\n${recipient_name}", "card_address" : "Endereço:", "buy" : "Comprar", @@ -539,7 +538,9 @@ "wallet_name_exists": "A carteira com esse nome já existe", "market_place": "Mercado", "cake_pay_title": "Cartões de presente de pagamento de bolo", - "cake_pay_subtitle": "Compre vales-presente e resgate instantaneamente", + "cake_pay_subtitle": "Compre vales-presente com desconto (somente nos EUA)", + "cake_pay_web_cards_title": "Cartões Cake Pay Web", + "cake_pay_web_cards_subtitle": "Compre cartões pré-pagos e cartões-presente em todo o mundo", "about_cake_pay": "O Cake Pay permite que você compre facilmente cartões-presente com ativos virtuais, que podem ser gastos instantaneamente em mais de 150.000 comerciantes nos Estados Unidos.", "cake_pay_account_note": "Inscreva-se com apenas um endereço de e-mail para ver e comprar cartões. Alguns estão até com desconto!", "already_have_account": "Já tem uma conta?", @@ -653,6 +654,8 @@ "use_suggested": "Uso sugerido", "do_not_share_warning_text" : "Não os compartilhe com mais ninguém, incluindo suporte.\n\nSeus fundos podem e serão roubados!", "help": "ajuda", + "all_transactions": "Todas as transacções", + "all_trades": "Todas as negociações", "connection_sync": "Conexão e sincronização", "security_and_backup": "Segurança e backup", "create_backup": "Criar backup", @@ -673,5 +676,13 @@ "enabled": "Habilitado", "tor_only": "Tor apenas", "unmatched_currencies": "A moeda da sua carteira atual não corresponde à do QR digitalizado", + "orbot_running_alert": "Certifique-se de que o Orbot esteja em execução antes de se conectar a este nó.", + "contact_list_contacts": "Contatos", + "contact_list_wallets": "minhas carteiras", + "bitcoin_payments_require_1_confirmation": "Os pagamentos em Bitcoin exigem 1 confirmação, o que pode levar 20 minutos ou mais. Obrigado pela sua paciência! Você receberá um e-mail quando o pagamento for confirmado.", + "send_to_this_address" : "Envie ${currency} ${tag}para este endereço", + "arrive_in_this_address" : "${currency} ${tag}chegará neste endereço", + "do_not_send": "não envie", + "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo.", "settings": "Configurações" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 43e64e689..e230881c3 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -48,7 +48,7 @@ "outgoing" : "Исходящие", "transactions_by_date" : "Сортировать по дате", "trades" : "Сделки", - "filters" : "Фильтр", + "filter_by": "Фильтровать по", "today" : "Сегодня", "yesterday" : "Вчера", "received" : "Полученные", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Отсканируйте свой отпечаток пальца для аутентификации", "version" : "Версия ${currentVersion}", - "openalias_alert_title" : "Адрес Обнаружен", - "openalias_alert_content" : "Вы будете отправлять средства\n${recipient_name}", + "extracted_address_content" : "Вы будете отправлять средства\n${recipient_name}", "card_address" : "Адрес:", "buy" : "Купить", @@ -539,7 +538,9 @@ "wallet_name_exists": "Кошелек с таким именем уже существует", "market_place": "Торговая площадка", "cake_pay_title": "Подарочные карты Cake Pay", - "cake_pay_subtitle": "Купите подарочные карты и моментально погасите их", + "cake_pay_subtitle": "Покупайте подарочные карты со скидкой (только для США)", + "cake_pay_web_cards_title": "Веб-карты Cake Pay", + "cake_pay_web_cards_subtitle": "Покупайте карты предоплаты и подарочные карты по всему миру", "about_cake_pay": "Cake Pay позволяет вам легко покупать подарочные карты с виртуальными активами, которые можно мгновенно потратить в более чем 150 000 продавцов в Соединенных Штатах.", "cake_pay_account_note": "Зарегистрируйтесь, указав только адрес электронной почты, чтобы просматривать и покупать карты. Некоторые даже доступны со скидкой!", "already_have_account": "У вас уже есть аккаунт?", @@ -654,6 +655,8 @@ "use_suggested": "Использовать предложенный", "do_not_share_warning_text" : "Не сообщайте их никому, включая техподдержку.\n\nВаши средства могут и будут украдены!", "help": "помощь", + "all_transactions": "Все транзакции", + "all_trades": "Все сделки", "connection_sync": "Подключение и синхронизация", "security_and_backup": "Безопасность и резервное копирование", "create_backup": "Создать резервную копию", @@ -674,5 +677,13 @@ "enabled": "Включено", "tor_only": "Только Tor", "unmatched_currencies": "Валюта вашего текущего кошелька не соответствует валюте отсканированного QR-кода.", + "orbot_running_alert": "Перед подключением к этому узлу убедитесь, что Orbot запущен.", + "contact_list_contacts": "Контакты", + "contact_list_wallets": "Мои кошельки", + "bitcoin_payments_require_1_confirmation": "Биткойн-платежи требуют 1 подтверждения, что может занять 20 минут или дольше. Спасибо тебе за твое терпение! Вы получите электронное письмо, когда платеж будет подтвержден.", + "send_to_this_address" : "Отправить ${currency} ${tag}на этот адрес", + "arrive_in_this_address" : "${currency} ${tag}придет на этот адрес", + "do_not_send": "Не отправлять", + "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше.", "settings": "Настройки" } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb new file mode 100644 index 000000000..2ecf1bf75 --- /dev/null +++ b/res/values/strings_th.arb @@ -0,0 +1,686 @@ +{ + "welcome" : "ยินดีต้อนรับสู่", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "กระเป๋าสตางค์ที่สวยงามสำหรับ Monero, Bitcoin, Litecoin และ Haven", + "please_make_selection" : "โปรดเลือกตามด้านล่างเพื่อสร้างหรือกู้กระเป๋าของคุณ", + "create_new" : "สร้างกระเป๋าใหม่", + "restore_wallet" : "กู้กระเป๋า", + + "monero_com": "Monero.com ของ Cake Wallet", + "monero_com_wallet_text": "กระเป๋าสตางค์ที่สวยงามสำหรับ Monero", + + "haven_app": "Haven ของ Cake Wallet", + "haven_app_wallet_text": "กระเป๋าสตางค์ที่สวยงามสำหรับ Haven", + + "accounts" : "บัญชี", + "edit" : "แก้ไข", + "account" : "บัญชี", + "add" : "เพิ่ม", + + + "address_book" : "สมุดที่อยู่", + "contact" : "ผู้ติดต่อ", + "please_select" : "โปรดเลือก:", + "cancel" : "ยกเลิก", + "ok" : "ตกลง", + "contact_name" : "ชื่อผู้ติดต่อ", + "reset" : "รีเซ็ต", + "save" : "บันทึก", + "address_remove_contact" : "ลบผู้ติดต่อ", + "address_remove_content" : "คุณแน่ใจหรือว่าต้องการลบผู้ติดต่อที่เลือก?", + + + "authenticated" : "ได้รับการยืนยันสิทธิ์", + "authentication" : "การยืนยันสิทธิ์", + "failed_authentication" : "การยืนยันสิทธิ์ล้มเหลว ${state_error}", + + + "wallet_menu" : "เมนู", + "Blocks_remaining" : "${status} บล็อกที่เหลืออยู่", + "please_try_to_connect_to_another_node" : "โปรดลองเชื่อมต่อกับโหนดอื่น", + "xmr_hidden" : "ซ่อน", + "xmr_available_balance" : "ยอดคงเหลือที่สามารถใช้งานได้", + "xmr_full_balance" : "ยอดคงเหลือแบบเต็ม", + "send" : "ส่ง", + "receive" : "รับ", + "transactions" : "ธุรกรรม", + "incoming" : "ขาเข้า", + "outgoing" : "ขาออก", + "transactions_by_date" : "ธุรกรรมตามวันที่", + "trades" : "การซื้อขาย", + "filter_by": "กรองตาม", + "today" : "วันนี้", + "yesterday" : "เมื่อวาน", + "received" : "รับ", + "sent" : "ส่ง", + "pending" : " (อยู่ระหว่างดำเนินการ)", + "rescan" : "สแกนใหม่", + "reconnect" : "เชื่อมต่อใหม่", + "wallets" : "กระเป๋า", + "show_seed" : "แสดงซีด", + "show_keys" : "แสดงซีด/คีย์", + "address_book_menu" : "สมุดที่อยู่", + "reconnection" : "เชื่อมต่อใหม่", + "reconnect_alert_text" : "คุณแน่ใจหรือไม่ว่าต้องการเชื่อมต่อใหม่?", + + + "exchange" : "แลกเปลี่ยน", + "clear" : "ล้าง", + "refund_address" : "ที่อยู่สำหรับส่งคืน", + "change_exchange_provider" : "เปลี่ยนผู้ให้บริการแลกเปลี่ยน", + "you_will_send" : "แปลงจาก", + "you_will_get" : "แปลงเป็น", + "amount_is_guaranteed" : "จำนวนที่จะได้รับมีการรับประกัน", + "amount_is_estimate" : "จำนวนที่จะได้รับเป็นการประมาณการ", + "powered_by" : "พัฒนาขึ้นโดย ${title}", + "error" : "ข้อผิดพลาด", + "estimated" : "ประมาณการ", + "min_value" : "ขั้นต่ำ: ${value} ${currency}", + "max_value" : "ขั้นสูง: ${value} ${currency}", + "change_currency" : "เปลี่ยนสกุลเงิน", + "overwrite_amount" : "เขียนทับจำนวน", + "qr_payment_amount" : "QR code นี้มีจำนวนการชำระเงิน คุณต้องการเขียนทับค่าปัจจุบันหรือไม่?", + + "copy_id" : "คัดลอก ID", + "exchange_result_write_down_trade_id" : "โปรดคัดลอกหรือบันทึก ID ของการซื้อขายเพื่อดำเนินการต่อไป", + "trade_id" : "ID การซื้อขาย:", + "copied_to_clipboard" : "คัดลอกไปยังหน่วยความจำของคอมพิวเตอร์", + "saved_the_trade_id" : "ฉันได้บันทึก ID ของการซื้อขายแล้ว", + "fetching" : "กำลังโหลด", + "id" : "ID: ", + "amount" : "จำนวน: ", + "payment_id" : "ID การชำระเงิน: ", + "status" : "สถานะ: ", + "offer_expires_in" : "ข้อเสนอจะหมดอายุใน: ", + "trade_is_powered_by" : "การซื้อขายนี้จัดสร้างโดย ${provider}", + "copy_address" : "คัดลอกที่อยู่", + "exchange_result_confirm" : "โดยกดปุ่มยืนยัน, คุณจะส่ง ${fetchingLabel} ${from} จากกระเป๋าของคุณที่เรียกว่า ${walletName} ไปยังที่อยู่ที่แสดงข้างล่าง หรือคุณสามารถส่งจากกระเป๋าภายนอกไปยังที่อยู่/รหัส QR ด้านล่าง\n\nโปรดกดปุ่มยืนยันเพื่อดำเนินการต่อหรือกลับไปเปลี่ยนจำนวน", + "exchange_result_description" : "คุณต้องส่งอย่างน้อย ${fetchingLabel} ${from} ไปยังที่อยู่ที่แสดงบนหน้าถัดไป หากคุณส่งจำนวนน้อยกว่า ${fetchingLabel} ${from} อาจจะไม่ถูกแปลงและอาจไม่ถูกเรียกคืน", + "exchange_result_write_down_ID" : "*โปรดคัดลอกหรือเขียนรหัสของคุณด้านบน", + "confirm" : "ยืนยัน", + "confirm_sending" : "ยืนยันการส่ง", + "commit_transaction_amount_fee" : "ยืนยันธุรกรรม\nจำนวน: ${amount}\nค่าธรรมเนียม: ${fee}", + "sending" : "กำลังส่ง", + "transaction_sent" : "ธุรกรรมถูกส่ง!", + "expired" : "หมดอายุ", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "ส่ง XMR", + "exchange_new_template" : "เทมเพลทใหม่", + + "faq" : "คำถามที่พบบ่อย", + + + "enter_your_pin" : "ใส่ PIN ของคุณ", + "loading_your_wallet" : "กำลังโหลดกระเป๋าของคุณ", + + + "new_wallet" : "กระเป๋าใหม่", + "wallet_name" : "ชื่อกระเป๋า", + "continue_text" : "ดำเนินการต่อ", + "choose_wallet_currency" : "โปรดเลือกสกุลเงินของกระเป๋า:", + + + "node_new" : "โหนดใหม่", + "node_address" : "ที่อยู่โหนด", + "node_port" : "พอร์ตโหนด", + "login" : "เข้าสู่ระบบ", + "password" : "รหัสผ่าน", + "nodes" : "โหนด", + "node_reset_settings_title" : "รีเซ็ตการตั้งค่า", + "nodes_list_reset_to_default_message" : "คุณแน่ใจหรือว่าต้องการรีเซ็ตการตั้งค่าเป็นค่าเริ่มต้น?", + "change_current_node" : "คุณแน่ใจหรือว่าต้องการเปลี่ยนโหนดปัจจุบันเป็น ${node}?", + "change" : "เปลี่ยน", + "remove_node" : "ลบโหนด", + "remove_node_message" : "คุณแน่ใจหรือว่าต้องการลบโหนดที่เลือก?", + "remove" : "ลบ", + "delete" : "ลบ", + "add_new_node" : "เพิ่มโหนดใหม่", + "change_current_node_title" : "เปลี่ยนโหนดปัจจุบัน", + "node_test" : "ทดสอบ", + "node_connection_successful" : "เชื่อมต่อสำเร็จ", + "node_connection_failed" : "เชื่อมต่อล้มเหลว", + "new_node_testing" : "การทดสอบโหนดใหม่", + + + "use" : "สลับไปที่ ", + "digit_pin" : "-หลัก PIN", + + + "share_address" : "แชร์ที่อยู่", + "receive_amount" : "จำนวน", + "subaddresses" : "ที่อยู่ย่อย", + "addresses" : "ที่อยู่", + "scan_qr_code" : "สแกน QR code เพื่อรับที่อยู่", + "qr_fullscreen" : "แตะเพื่อเปิดหน้าจอ QR code แบบเต็มจอ", + "rename" : "เปลี่ยนชื่อ", + "choose_account" : "เลือกบัญชี", + "create_new_account" : "สร้างบัญชีใหม่", + "accounts_subaddresses" : "บัญชีและที่อยู่ย่อย", + + + "restore_restore_wallet" : "กู้กระเป๋า", + "restore_title_from_seed_keys" : "กู้จาก seed/keys", + "restore_description_from_seed_keys" : "เรียกกระเป๋าของคุณกลับมาจาก seed/keys ที่คุณได้บันทึกไว้ในที่ปลอดภัย", + "restore_next" : "ถัดไป", + "restore_title_from_backup" : "กู้จากการสำรองข้อมูล", + "restore_description_from_backup" : "คุณสามารถกู้แอพ Cake Wallet ทั้งหมดจากไฟล์สำรองข้อมูลของคุณ", + "restore_seed_keys_restore" : "กู้จาก Seed/Keys", + "restore_title_from_seed" : "กู้จาก seed", + "restore_description_from_seed" : "กู้กระเป๋าของคุณจากรหัสผสมของ 25 คำหรือ 13 คำ", + "restore_title_from_keys" : "กู้จาก keys", + "restore_description_from_keys" : "กู้กระเป๋าของคุณจากการกดปุ่มที่สร้างขึ้นจาก private keys ของคุณที่บันทึกไว้", + "restore_wallet_name" : "ชื่อกระเป๋า", + "restore_address" : "ที่อยู่", + "restore_view_key_private" : "คีย์สำหรับดู (ส่วนตัว)", + "restore_spend_key_private" : "คีย์สำหรับใช้ (ส่วนตัว)", + "restore_recover" : "กู้", + "restore_wallet_restore_description" : "คำอธิบายการกู้กระเป๋า", + "restore_new_seed" : "ซีดใหม่", + "restore_active_seed" : "ซีดที่ใช้งานอยู่", + "restore_bitcoin_description_from_seed" : "กู้กระเป๋าของคุณจากรหัสผสมของ 24 คำ", + "restore_bitcoin_description_from_keys" : "กู้กระเป๋าของคุณจากสตริง WIF ที่สร้างขึ้นจากคีย์ส่วนตัวของคุณ", + "restore_bitcoin_title_from_keys" : "กู้จาก WIF", + "restore_from_date_or_blockheight" : "โปรดป้อนวันที่หลายวันก่อนที่คุณสร้างกระเป๋านี้ หรือหากคุณรู้ความสูงของบล็อก (blockheight) โปรดป้อนมันแทน", + + + "seed_reminder" : "โปรดเขียนข้อมูลนี้ลงสมุดเพื่อความปลอดภัยหากคุณสูญเสียหรือล้างโทรศัพท์ของคุณ", + "seed_title" : "Seed", + "seed_share" : "แบ่งปัน seed", + "copy" : "คัดลอก", + + + "seed_language_choose" : "โปรดเลือกภาษาของ seed:", + "seed_choose" : "เลือกภาษาของ seed", + "seed_language_next" : "ถัดไป", + "seed_language_english" : "อังกฤษ", + "seed_language_chinese" : "จีน", + "seed_language_dutch" : "ดัตช์", + "seed_language_german" : "เยอรมัน", + "seed_language_japanese" : "ญี่ปุ่น", + "seed_language_portuguese" : "โปรตุเกส", + "seed_language_russian" : "รัสเซีย", + "seed_language_spanish" : "สเปน", + "seed_language_french" : "ฝรั่งเศส", + "seed_language_italian" : "อิตาลี", + + + "send_title" : "ส่ง", + "send_your_wallet" : "กระเป๋าของคุณ", + "send_address" : "ที่อยู่ ${cryptoCurrency}", + "send_payment_id" : "ID การชำระเงิน (ไม่จำเป็น)", + "all" : "ทั้งหมด", + "send_error_minimum_value" : "จำนวนขั้นต่ำของจำนวนเงินคือ 0.01", + "send_error_currency" : "สกุลเงินสามารถเป็นเลขเท่านั้น", + "send_estimated_fee" : "ค่าธรรมเนียมที่คาดการณ์:", + "send_priority" : "ในขณะนี้ค่าธรรมเนียมถูกตั้งค่าเป็นความสำคัญ ${transactionPriority} \nความสำคัญของธุรกรรมสามารถปรับได้ในการตั้งค่า", + "send_creating_transaction" : "กำลังสร้างธุรกรรม", + "send_templates" : "แม่แบบ", + "send_new" : "ใหม่", + "send_amount" : "จำนวน:", + "send_fee" : "ค่าธรรมเนียม:", + "send_name" : "ชื่อ", + "send_got_it" : "เข้าใจ", + "send_sending" : "กำลังส่ง...", + "send_success" : "คุณได้ส่ง ${crypto} เรียบร้อยแล้ว", + + + "settings_title" : "การตั้งค่า", + "settings_nodes" : "จุดเชื่อมต่อ", + "settings_current_node" : "จุดเชื่อมต่อปัจจุบัน", + "settings_wallets" : "กระเป๋าสตางค์", + "settings_display_balance" : "แสดงยอดคงเหลือ", + "settings_currency" : "สกุลเงิน", + "settings_fee_priority" : "ความสำคัญของค่าธรรมเนียม", + "settings_save_recipient_address" : "บันทึกที่อยู่ผู้รับ", + "settings_personal" : "ส่วนตัว", + "settings_change_pin" : "เปลี่ยน PIN", + "settings_change_language" : "เปลี่ยนภาษา", + "settings_allow_biometrical_authentication" : "อนุญาตให้ใช้การยืนยันตัวตนทางระบบชีวภาพ", + "settings_dark_mode" : "โหมดดำ", + "settings_transactions" : "ธุรกรรม", + "settings_trades" : "การซื้อขาย", + "settings_display_on_dashboard_list" : "แสดงบนรายการแดชบอร์ด", + "settings_all" : "ทั้งหมด", + "settings_only_trades" : "เฉพาะการซื้อขาย", + "settings_only_transactions" : "เฉพาะธุรกรรม", + "settings_none" : "ไม่มี", + "settings_support" : "สนับสนุน", + "settings_terms_and_conditions" : "ข้อกำหนดและเงื่อนไข", + "pin_is_incorrect" : "PIN ไม่ถูกต้อง", + + + "setup_pin" : "ตั้งค่า PIN", + "enter_your_pin_again" : "ใส่ PIN ของคุณอีกครั้ง", + "setup_successful" : "การตั้งค่า PIN ของคุณสำเร็จแล้ว!", + + "wallet_keys" : "ซีดของกระเป๋า/คีย์", + "wallet_seed" : "ซีดของกระเป๋า", + "private_key" : "คีย์ส่วนตัว", + "public_key" : "คีย์สาธารณะ", + "view_key_private" : "คีย์มุมมอง (ส่วนตัว)", + "view_key_public" : "คีย์มุมมอง (สาธารณะ)", + "spend_key_private" : "คีย์จ่าย (ส่วนตัว)", + "spend_key_public" : "คีย์จ่าย (สาธารณะ)", + "copied_key_to_clipboard" : "คัดลอก ${key} ไปยัง Clipboard แล้ว", + + + "new_subaddress_title" : "ที่อยู่ใหม่", + "new_subaddress_label_name" : "ชื่อป้ายกำกับ", + "new_subaddress_create" : "สร้าง", + + "address_label" : "ป้ายกำกับที่อยู่", + + "subaddress_title" : "รายการที่อยู่ย่อย", + + "trade_details_title" : "รายละเอียดการแลกเปลี่ยน", + "trade_details_id" : "รหัส", + "trade_details_state" : "สถานะ", + "trade_details_fetching" : "กำลังเรียกข้อมูล", + "trade_details_provider" : "ผู้ให้บริการ", + "trade_details_created_at" : "สร้างเมื่อ", + "trade_details_pair" : "คู่", + "trade_details_copied" : "${title} คัดลอกไปยัง Clipboard", + + + "trade_history_title" : "ประวัติการซื้อขาย", + + + "transaction_details_title" : "รายละเอียดการทำรายการ", + "transaction_details_transaction_id" : "ไอดีการทำรายการ", + "transaction_details_date" : "วันที่", + "transaction_details_height" : "ความสูง", + "transaction_details_amount" : "จำนวน", + "transaction_details_fee" : "ค่าธรรมเนียม", + "transaction_details_copied" : "${title} ถูกคัดลอกไปยังคลิปบอร์ด", + "transaction_details_recipient_address" : "ที่อยู่ผู้รับ", + + + "wallet_list_title" : "กระเป๋า Monero", + "wallet_list_create_new_wallet" : "สร้างกระเป๋าใหม่", + "wallet_list_restore_wallet" : "กู้กระเป๋า", + "wallet_list_load_wallet" : "โหลดกระเป๋า", + "wallet_list_loading_wallet" : "กำลังโหลดกระเป๋า ${wallet_name}", + "wallet_list_failed_to_load" : "ไม่สามารถโหลดกระเป๋า ${wallet_name} ได้ ${error}", + "wallet_list_removing_wallet" : "กำลังลบกระเป๋า ${wallet_name}", + "wallet_list_failed_to_remove" : "ไม่สามารถลบกระเป๋า ${wallet_name} ได้ ${error}", + + + "widgets_address" : "ที่อยู่", + "widgets_restore_from_blockheight" : "กู้คืนจากระดับบล็อก", + "widgets_restore_from_date" : "กู้คืนจากวันที่", + "widgets_or" : "หรือ", + "widgets_seed" : "ซีด", + + + "router_no_route" : "ไม่มีเส้นทางที่กำหนดไว้สำหรับ ${name}", + + + "error_text_account_name" : "ชื่อบัญชีสามารถเป็นเพียงตัวอักษรหรือตัวเลขเท่านั้น\nและต้องมีความยาวระหว่าง 1 ถึง 15 ตัวอักษร", + "error_text_contact_name" : "ชื่อผู้ติดต่อไม่สามารถมีสัญลักษณ์ ` , '\" ได้\nและต้องมีความยาวระหว่าง 1 ถึง 32 ตัวอักษร", + "error_text_address" : "ที่อยู่กระเป๋าจะต้องสอดคล้องกับประเภท\nของเหรียญคริปโตเนียม", + "error_text_node_address" : "โปรดป้อนที่อยู่ iPv4", + "error_text_node_port" : "พอร์ตโหนดสามารถมีตัวเลขเท่านั้นระหว่าง 0 ถึง 65535", + "error_text_payment_id" : "Payment ID สามารถมีขนาดระหว่าง 16 ถึง 64 ตัวอักษรตามแบบ hex", + "error_text_xmr" : "มูลค่า XMR ไม่สามารถเกินยอดคงเหลือได้\nจำนวนสตริงทศนิยมต้องน้อยกว่าหรือเท่ากับ 12", + "error_text_fiat" : "มูลค่าของจำนวนเงินไม่สามารถเกินยอดคงเหลือได้\nจำนวนสตริงทศนิยมต้องน้อยกว่าหรือเท่ากับ 2", + "error_text_subaddress_name" : "ชื่อสำหรับที่อยู่ย่อยจะต้องประกอบด้วยตัวอักษร ตัวเลข และสัญลักษณ์ _ - และมีความยาวระหว่าง 1 ถึง 20 ตัวอักษร", + "error_text_amount" : "จำนวนจะต้องประกอบด้วยตัวเลขเท่านั้น", + "error_text_wallet_name" : "ชื่อกระเป๋าสตางค์จะต้องประกอบด้วยตัวอักษร ตัวเลข และสัญลักษณ์ _ - และมีความยาวระหว่าง 1 ถึง 33 ตัวอักษร", + "error_text_keys" : "คีย์ของกระเป๋าสตางค์จะต้องประกอบด้วยตัวอักษรฐาน 16 จำนวน 64 ตัว", + "error_text_crypto_currency" : "จำนวนทศนิยมจะต้องน้อยกว่าหรือเท่ากับ 12", + "error_text_minimal_limit" : "การซื้อขายกับ ${provider} ไม่สามารถดำเนินการได้ จำนวนน้อยกว่าขั้นต่ำ: ${min} ${currency}", + "error_text_maximum_limit" : "การซื้อขายกับ ${provider} ไม่สามารถดำเนินการได้ จำนวนมากกว่าขั้นสูง: ${max} ${currency}", + "error_text_limits_loading_failed" : "การซื้อขายกับ ${provider} ไม่สามารถดำเนินการได้ ไม่สามารถโหลดขอบเขตได้", + "error_text_template" : "ชื่อแม่แบบและที่อยู่ไม่สามารถมีสัญลักษณ์ ` , '\" และต้องมีความยาวระหว่าง 1 ถึง 106 ตัวอักษร", + + + "auth_store_ban_timeout" : "หมดเวลาห้าม", + "auth_store_banned_for" : "ถูกห้ามสำหรับ ", + "auth_store_banned_minutes" : " นาที", + "auth_store_incorrect_password" : "รหัสผ่านไม่ถูกต้อง", + "wallet_store_monero_wallet" : "กระเป๋า Monero", + "wallet_restoration_store_incorrect_seed_length" : "ความยาวของซีดไม่ถูกต้อง", + + + "full_balance" : "ยอดคงเหลือทั้งหมด", + "available_balance" : "ยอดคงเหลือที่ใช้งานได้", + "hidden_balance" : "ยอดคงเหลือซ่อนอยู่", + + + "sync_status_syncronizing" : "กำลังซิงโครไนซ์", + "sync_status_syncronized" : "ซิงโครไนซ์แล้ว", + "sync_status_not_connected" : "ไม่ได้เชื่อมต่อ", + "sync_status_starting_sync" : "กำลังเริ่มซิงโครไนซ์", + "sync_status_failed_connect" : "การเชื่อมต่อล้มเหลว", + "sync_status_connecting" : "กำลังเชื่อมต่อ", + "sync_status_connected" : "เชื่อมต่อแล้ว", + "sync_status_attempting_sync" : "พยายามซิงโครไนซ์", + + + "transaction_priority_slow" : "ช้า", + "transaction_priority_regular" : "ปกติ", + "transaction_priority_medium" : "ปานกลาง", + "transaction_priority_fast" : "เร็ว", + "transaction_priority_fastest" : "เร็วที่สุด", + + + "trade_for_not_created" : "การแลกเปลี่ยนสำหรับ ${title} ยังไม่ได้ถูกสร้างขึ้น", + "trade_not_created" : "การแลกเปลี่ยนยังไม่ได้ถูกสร้าง", + "trade_id_not_found" : "ไม่พบการแลกเปลี่ยน ${tradeId} ของ ${title}", + "trade_not_found" : "ไม่พบการแลกเปลี่ยน", + + + "trade_state_pending" : "รอดำเนินการ", + "trade_state_confirming" : "กำลังยืนยัน", + "trade_state_trading" : "กำลังแลกเปลี่ยน", + "trade_state_traded" : "ถูกแลกเปลี่ยน", + "trade_state_complete" : "เสร็จสมบูรณ์", + "trade_state_to_be_created" : "จะถูกสร้าง", + "trade_state_unpaid" : "ยังไม่ได้จ่าย", + "trade_state_underpaid" : "จ่ายไม่ครบ", + "trade_state_paid_unconfirmed" : "จ่ายแล้วแต่ยังไม่ได้ยืนยัน", + "trade_state_paid" : "จ่ายแล้ว", + "trade_state_btc_sent" : "ส่ง BTC แล้ว", + "trade_state_timeout" : "เวลาหมด", + "trade_state_created" : "ถูกสร้าง", + "trade_state_finished" : "เสร็จสิ้น", + + "change_language" : "เปลี่ยนภาษา", + "change_language_to" : "เปลี่ยนภาษาเป็น ${language}?", + + "paste" : "วาง", + "restore_from_seed_placeholder" : "โปรดป้อนหรือวาง seed ของคุณที่นี่", + "add_new_word" : "เพิ่มคำใหม่", + "incorrect_seed" : "ข้อความที่ป้อนไม่ถูกต้อง", + + "biometric_auth_reason" : "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน", + "version" : "เวอร์ชัน ${currentVersion}", + + "extracted_address_content" : "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}", + + "card_address" : "ที่อยู่:", + "buy" : "ซื้อ", + "sell": "ขาย", + + "placeholder_transactions" : "ธุรกรรมของคุณจะปรากฏที่นี่", + "placeholder_contacts" : "รายชื่อผู้ติดต่อของคุณจะปรากฏที่นี่", + + "template" : "แบบฟอร์ม", + "confirm_delete_template" : "การดำเนินการนี้จะลบแบบฟอร์มนี้ คุณต้องการดำเนินการต่อหรือไม่?", + "confirm_delete_wallet" : "การดำเนินการนี้จะลบกระเป๋านี้ คุณต้องการดำเนินการต่อหรือไม่?", + + "picker_description" : "ในการเลือก ChangeNOW หรือ MorphToken โปรดเปลี่ยนคู่แลกเปลี่ยนก่อน", + + "change_wallet_alert_title" : "เปลี่ยนกระเป๋าปัจจุบัน", + "change_wallet_alert_content" : "คุณต้องการเปลี่ยนกระเป๋าปัจจุบันเป็น ${wallet_name} หรือไม่?", + + "creating_new_wallet" : "กำลังสร้างกระเป๋าใหม่", + "creating_new_wallet_error" : "ข้อผิดพลาด: ${description}", + + "seed_alert_title" : "ความสนใจ", + "seed_alert_content" : "Seed เป็นเพียงวิธีเดียวที่จะกู้กระเป๋าของคุณ คุณได้เขียนมันขึ้นลงกระดาษหรือไม่?", + "seed_alert_back" : "กลับ", + "seed_alert_yes" : "ใช่ ฉันได้เขียน", + + "exchange_sync_alert_content" : "โปรดรอจนกว่ากระเป๋าของคุณจะถูกซิงค์", + + "pre_seed_title" : "สำคัญ", + "pre_seed_description" : "บนหน้าถัดไปคุณจะเห็นชุดของคำ ${words} คำ นี่คือ seed ของคุณที่ไม่ซ้ำใดๆ และเป็นความลับเพียงของคุณ และนี่คือเพียงวิธีเดียวที่จะกู้กระเป๋าของคุณในกรณีที่สูญหายหรือมีปัญหา มันเป็นความรับผิดชอบของคุณเพื่อเขียนมันลงบนกระดาษและจัดเก็บไว้ในที่ปลอดภัยนอกแอป Cake Wallet", + "pre_seed_button_text" : "ฉันเข้าใจ แสดง seed ของฉัน", + + "xmr_to_error" : "ข้อผิดพลาด XMR.TO", + "xmr_to_error_description" : "จำนวนไม่ถูกต้อง จำกัดขั้นสูง 8 หลักหลังจุดทศนิยม", + + "provider_error" : "ข้อผิดพลาด ${provider}", + + "use_ssl" : "ใช้ SSL", + "trusted" : "มั่นคง", + + "color_theme" : "ธีมสี", + "light_theme" : "สว่าง", + "bright_theme" : "สดใส", + "dark_theme" : "เข้ม", + "enter_your_note" : "ใส่บันทึกของคุณ...", + "note_optional" : "บันทึก (ไม่จำเป็น)", + "note_tap_to_change" : "หมายเหตุ (กดเพื่อเปลี่ยน)", + "view_in_block_explorer" : "ดูใน Block Explorer", + "view_transaction_on" : "ดูการทำธุรกรรมบน ", + "transaction_key" : "รหัสธุรกรรม", + "confirmations" : "การยืนยัน", + "recipient_address" : "ที่อยู่ผู้รับ", + + "extra_id" : "ไอดีเพิ่มเติม:", + "destination_tag" : "แท็กปลายทาง:", + "memo" : "หมายเหตุ:", + + "backup" : "สำรองข้อมูล", + "change_password" : "เปลี่ยนรหัสผ่าน", + "backup_password" : "รหัสผ่านสำรองข้อมูล", + "write_down_backup_password" : "โปรดจดรหัสผ่านสำรองข้อมูลของคุณลงบนกระดาษ ซึ่งจะใช้ในการนำเข้าไฟล์สำรองข้อมูลของคุณ", + "export_backup" : "ส่งออกข้อมูลสำรอง", + "save_backup_password" : "โปรดตรวจสอบให้แน่ใจว่าคุณได้บันทึกรหัสผ่านสำรองข้อมูลแล้ว คุณจะไม่สามารถนำเข้าไฟล์สำรองข้อมูลของคุณโดยไม่ใช้รหัสผ่านนั้น", + "backup_file" : "ไฟล์สำรองข้อมูล", + + "edit_backup_password" : "แก้ไขรหัสผ่านสำรอง", + "save_backup_password_alert" : "บันทึกรหัสผ่านสำรอง", + "change_backup_password_alert" : "ไฟล์สำรองที่ผ่านมาจะไม่สามารถนำเข้าด้วยรหัสผ่านสำรองใหม่ได้ รหัสผ่านสำรองใหม่จะถูกใช้เฉพาะสำหรับไฟล์สำรองใหม่ คุณแน่ใจหรือว่าต้องการเปลี่ยนรหัสผ่านสำรอง?", + + "enter_backup_password" : "ป้อนรหัสผ่านสำรองที่นี่", + "select_backup_file" : "เลือกไฟล์สำรอง", + "import" : "นำเข้า", + "please_select_backup_file" : "โปรดเลือกไฟล์สำรองและป้อนรหัสผ่านสำรอง", + + "fixed_rate": "อัตราคงที่", + "fixed_rate_alert": "คุณจะสามารถป้อนจำนวนที่ได้รับเมื่อเลือกโหมดอัตราคงที่ คุณต้องการสลับไปที่โหมดอัตราคงที่?", + + "xlm_extra_info": "โปรดอย่าลืมระบุ Memo ID ในขณะที่ส่งธุรกรรม XLM สำหรับการแลกเปลี่ยน", + "xrp_extra_info": "โปรดอย่าลืมระบุ Destination Tag ในขณะที่ส่งธุรกรรม XRP สำหรับการแลกเปลี่ยน", + + "exchange_incorrect_current_wallet_for_xmr" : "หากคุณต้องการแลกเปลี่ยน XMR จากยอดคงเหลือ Monero ใน Cake Wallet ของคุณ กรุณาเปลี่ยนเป็นกระเป๋า Monero ก่อน", + "confirmed" : "ได้รับการยืนยัน", + "unconfirmed" : "ยังไม่ได้รับการยืนยัน", + "displayable" : "สามารถแสดงได้", + + "submit_request" : "ส่งคำขอ", + + "buy_alert_content" : "ในปัจจุบันเรารองรับการซื้อ Bitcoin และ Litecoin เท่านั้น หากต้องการซื้อ Bitcoin หรือ Litecoin โปรดสร้างหรือเปลี่ยนเป็นกระเป๋า Bitcoin หรือ Litecoin ของคุณ", + "sell_alert_content" : "ในปัจจุบันเรารองรับการขาย Bitcoin เท่านั้น หากต้องการขาย Bitcoin โปรดสร้างหรือเปลี่ยนเป็นกระเป๋า Bitcoin ของคุณ", + + "outdated_electrum_wallet_description" : "กระเป๋า Bitcoin ใหม่ที่สร้างใน Cake มี seed ขนาด 24 คำ ซึ่งจำเป็นต้องสร้างกระเป๋า Bitcoin ใหม่และโอนทุกเงินของคุณไปยังกระเป๋าใหม่ขนาด 24 คำ และหยุดใช้กระเป๋าที่มี seed ขนาด 12 คำ กรุณาทำด่วนเพื่อรักษาเงินของคุณ", + "understand" : "ฉันเข้าใจ", + + "apk_update" : "ปรับปรุง APK", + + "buy_bitcoin" : "ซื้อ Bitcoin", + "buy_with" : "ซื้อด้วย", + "moonpay_alert_text" : "มูลค่าของจำนวนต้องมากกว่าหรือเท่ากับ ${minAmount} ${fiatCurrency}", + + "outdated_electrum_wallet_receive_warning": "หากกระเป๋านี้มีซีดีที่มี 12 คำและถูกสร้างขึ้นใน Cake อย่าโอน Bitcoin เข้ากระเป๋านี้ ทุกจำนวน BTC ที่โอนเข้ากระเป๋านี้อาจสูญหาย สร้างกระเป๋าใหม่ที่มีซีดีที่มี 24 คำ (กดที่เมนูที่มุมขวาบนแล้วเลือก Wallets และเลือก Create New Wallet จากนั้นเลือก Bitcoin) และย้าย BTC ไปที่นั้นทันที กระเป๋า BTC ที่มีซีดีที่มี 24 คำของ Cake ปลอดภัย", + "do_not_show_me": "อย่าแสดงข้อความนี้อีก", + + "unspent_coins_title" : "เหรียญที่ไม่ได้ใช้", + "unspent_coins_details_title" : "รายละเอียดเหรียญที่ไม่ได้ใช้", + "freeze" : "ดักจับ", + "frozen" : "ถูกดักจับ", + "coin_control" : "การควบคุมเหรียญ (ตัวเลือก)", + + "address_detected" : "ตรวจพบที่อยู่", + "address_from_domain" : "ที่อยู่นี้มาจาก ${domain} บน Unstoppable Domains", + + "add_receiver" : "เพิ่มผู้รับอื่น ๆ (ตัวเลือก)", + + "manage_yats" : "จัดการ Yats", + "yat_alert_title" : "ส่งและรับเหรียญออนไลน์ง่ายขึ้นด้วย Yat", + "yat_alert_content" : "ผู้ใช้งาน Cake Wallet สามารถส่งและรับเหรียญออนไลน์ทุกเหรียญที่ชื่นชอบของพวกเขาได้ง่ายขึ้นด้วยชื่อผู้ใช้งานที่พิเศษที่ระบุด้วยอีโมจิ", + "get_your_yat" : "รับ Yat ของคุณ", + "connect_an_existing_yat" : "เชื่อมต่อ Yat ที่มีอยู่", + "connect_yats": "เชื่อมต่อ Yats", + "yat_address" : "ที่อยู่ Yat", + "yat" : "Yat", + "address_from_yat" : "ที่อยู่นี้มาจาก ${emoji} บน Yat", + "yat_error" : "ข้อผิดพลาดของ Yat", + "yat_error_content" : "ไม่มีที่อยู่ที่เชื่อมต่อกับ Yat นี้ ลองใช้ Yat อื่น", + "choose_address" : "\n\nโปรดเลือกที่อยู่:", + "yat_popup_title" : "ที่อยู่กระเป๋าของคุณสามารถถูกอัปโหลดเป็นอิโมจิ", + "yat_popup_content" : "ขณะนี้คุณสามารถส่งและรับเหรียญคริปโตใน Cake Wallet ด้วย Yat ของคุณ - ชื่อผู้ใช้ที่สั้นมีอิโมจิ คุณสามารถจัดการ Yat ได้ทุกเวลาบนหน้าจอการตั้งค่า", + "second_intro_title" : "อิโมจิที่อยู่เดียวที่จะควบคุมพวกเขาทั้งหมด", + "second_intro_content" : "Yat ของคุณเป็นอิโมจิที่อยู่เดียวที่จะแทนที่ทุกที่อยู่และเลขฐานสิบหกของคุณสำหรับเหรียญคริปโตทุกชนิด", + "third_intro_title" : "Yat ปฏิบัติตนอย่างดีกับผู้อื่น", + "third_intro_content" : "Yat อาศัยอยู่นอก Cake Wallet ด้วย ที่อยู่กระเป๋าใดๆ ทั่วโลกสามารถแทนด้วย Yat ได้อีกด้วย!", + "learn_more" : "ศึกษาเพิ่มเติม", + "search": "ค้นหา", + "search_language": "ค้นหาภาษา", + "search_currency": "ค้นหาสกุลเงิน", + "new_template" : "แม่แบบใหม่", + "electrum_address_disclaimer": "เราสร้างที่อยู่ใหม่ทุกครั้งที่คุณใช้หนึ่งอย่าง แต่ที่อยู่เก่ายังสามารถใช้ได้ต่อไป", + "wallet_name_exists": "กระเป๋าที่มีชื่อนี้มีอยู่แล้ว โปรดเลือกชื่ออื่นหรือเปลี่ยนชื่อกระเป๋าอื่นก่อน", + "market_place": "ตลาดพื้นที่", + "cake_pay_title": "บัตรของขวัญ Cake Pay", + "cake_pay_subtitle": "ซื้อบัตรของขวัญราคาถูก (สำหรับสหรัฐอเมริกาเท่านั้น)", + "cake_pay_web_cards_title": "Cake Pay Web Cards", + "cake_pay_web_cards_subtitle": "ซื้อบัตรพร้อมเงินระดับโลกและบัตรของขวัญ", + "about_cake_pay": "Cake Pay ช่วยให้คุณสามารถซื้อบัตรของขวัญง่ายๆ ด้วยการใช้สินทรัพย์อนุกรม ซื้อใช้ได้ทันทีกับมากกว่า 150,000 ร้านค้าในสหรัฐอเมริกา", + "cake_pay_account_note": "ลงทะเบียนด้วยอีเมลเพียงอย่างเดียวเพื่อดูและซื้อบัตร บางบัตรอาจมีส่วนลด!", + "already_have_account": "มีบัญชีอยู่แล้ว?", + "create_account": "สร้างบัญชี", + "privacy_policy": "นโยบายความเป็นส่วนตัว", + "welcome_to_cakepay": "ยินดีต้อนรับสู่ Cake Pay!", + "sign_up": "สมัครสมาชิก", + "forgot_password": "ลืมรหัสผ่าน", + "reset_password": "รีเซ็ตรหัสผ่าน", + "gift_cards": "บัตรของขวัญ", + "setup_your_debit_card": "ตั้งค่าบัตรเดบิตของคุณ", + "no_id_required": "ไม่จำเป็นต้องใช้บัตรประจำตัว ฝากเงินและใช้งานได้ทุกที่", + "how_to_use_card": "วิธีใช้บัตรนี้", + "purchase_gift_card": "ซื้อบัตรของขวัญ", + "verification": "การตรวจสอบ", + "fill_code": "โปรดกรอกรหัสยืนยันที่ส่งไปยังอีเมลของคุณ", + "dont_get_code": "ไม่ได้รับรหัส?", + "resend_code": "โปรดส่งอีกครั้ง", + "debit_card": "บัตรเดบิต", + "cakepay_prepaid_card": "บัตรเดบิตเติมเงินของ CakePay", + "no_id_needed": "ไม่จำเป็นต้องใช้บัตรประชาชน!", + "frequently_asked_questions": "คำถามที่พบบ่อย", + "debit_card_terms": "การเก็บรักษาและใช้หมายเลขบัตรจ่ายเงิน (และข้อมูลประจำตัวที่เกี่ยวข้องกับหมายเลขบัตรจ่ายเงิน) ในกระเป๋าดิจิทัลนี้ จะต้องยึดถือข้อกำหนดและเงื่อนไขของข้อตกลงผู้ใช้บัตรของผู้ถือบัตรที่เกี่ยวข้องกับบัตรผู้ถือบัตร ซึ่งจะมีผลตั้งแต่เวลานั้น", + "please_reference_document": "โปรดอ้างอิงเอกสารด้านล่างสำหรับข้อมูลเพิ่มเติม", + "cardholder_agreement": "ข้อตกลงผู้ใช้บัตร", + "e_sign_consent": "การยอมรับ E-Sign", + "agree_and_continue": "ยอมรับและดำเนินการต่อ", + "email_address": "ที่อยู่อีเมล", + "agree_to": "การสร้างบัญชีของคุณยอมรับเงื่อนไขของ", + "and": "และ", + "enter_code": "กรอกรหัส", + "congratulations": "ขอแสดงความยินดี!", + "you_now_have_debit_card": "ขณะนี้คุณมีบัตรเดบิต", + "min_amount": "จำนวนขั้นต่ำ: ${value}", + "max_amount": "จำนวนสูงสุด: ${value}", + "enter_amount": "กรอกจำนวน", + "billing_address_info": "ถ้าถูกร้องขอที่อยู่สำหรับการวางบิล ให้ใช้ที่อยู่จัดส่งของคุณ", + "order_physical_card": "สั่งซื้อบัตรดิบิต", + "add_value": "เพิ่มมูลค่า", + "activate": "เปิดใช้งาน", + "get_a": "รับ ", + "digital_and_physical_card": "บัตรเดบิตดิจิตอลและบัตรพื้นฐาน", + "get_card_note": "ที่คุณสามารถเติมเงินด้วยสกุลเงินดิจิตอล ไม่จำเป็นต้องใส่ข้อมูลเพิ่มเติม!", + "signup_for_card_accept_terms": "ลงทะเบียนสำหรับบัตรและยอมรับเงื่อนไข", + "add_fund_to_card": "เพิ่มเงินสำรองไว้บนบัตร (ถึง ${value})", + "use_card_info_two": "เงินจะถูกแปลงค่าเป็นดอลลาร์สหรัฐเมื่อถือไว้ในบัญชีสำรองเงิน ไม่ใช่สกุลเงินดิจิตอล", + "use_card_info_three": "ใช้บัตรดิจิตอลออนไลน์หรือผ่านวิธีการชำระเงินแบบไม่ต้องใช้บัตรกระดาษ", + "optionally_order_card": "เลือกเพิ่มสั่งการ์ดจริง", + "hide_details" : "ซ่อนรายละเอียด", + "show_details" : "แสดงรายละเอียด", + "upto": "สูงสุด ${value}", + "discount": "ประหยัด ${value}%", + "gift_card_amount": "จำนวนบัตรของขวัญ", + "bill_amount": "จำนวนบิล", + "you_pay": "คุณจ่าย", + "tip": "เพิ่มค่าตอบแทน:", + "custom": "กำหนดเอง", + "by_cake_pay": "โดย Cake Pay", + "expires": "หมดอายุ", + "mm": "เดือน", + "yy": "ปี", + "online": "ออนไลน์", + "offline": "ออฟไลน์", + "gift_card_number": "หมายเลขบัตรของขวัญ", + "pin_number": "หมายเลข PIN", + "total_saving": "ประหยัดรวม", + "last_30_days": "30 วันล่าสุด", + "avg_savings": "ประหยัดเฉลี่ย", + "view_all": "ดูทั้งหมด", + "active_cards": "บัตรที่ใช้งานได้", + "delete_account": "ลบบัญชี", + "cards": "บัตร", + "active": "ทำงาน", + "redeemed": "แลกของขวัญ", + "gift_card_balance_note": "บัตรของขวัญที่มียอดคงเหลือจะปรากฏที่นี่", + "gift_card_redeemed_note": "บัตรของขวัญที่คุณแลกไปแล้วจะปรากฏที่นี่", + "logout": "ออกจากระบบ", + "add_tip": "เพิ่มคำแนะนำ", + "percentageOf": "${amount} ของ", + "is_percentage": "เป็น", + "search_category": "ค้นหาหมวดหมู่", + "mark_as_redeemed": "ทำเครื่องหมายว่าเคยใช้แล้ว", + "more_options": "ตัวเลือกเพิ่มเติม", + "awaiting_payment_confirmation": "รอการยืนยันการชำระเงิน", + "transaction_sent_notice": "ถ้าหน้าจอไม่ขึ้นหลังจาก 1 นาทีแล้ว ให้ตรวจสอบ block explorer และอีเมลของคุณ", + "agree": "ยอมรับ", + "in_store": "ในร้าน", + "generating_gift_card": "กำลังสร้างบัตรของขวัญ", + "payment_was_received": "การชำระเงินของคุณได้รับการรับทราบแล้ว", + "proceed_after_one_minute": "หากหน้าจอไม่ดำเนินการหลังจาก 1 นาทีโปรดตรวจสอบอีเมลของคุณ", + "order_id": "เลขที่ออร์เดอร์", + "gift_card_is_generated": "บัตรของขวัญถูกสร้างขึ้น", + "open_gift_card": "เปิดบัตรของขวัญ", + "contact_support": "ติดต่อฝ่ายสนับสนุน", + "gift_cards_unavailable": "บัตรของขวัญจะมีจำหน่ายเฉพาะกับ Monero, Bitcoin, และ Litecoin เท่านั้นในขณะนี้", + "introducing_cake_pay": "ยินดีต้อนรับสู่ Cake Pay!", + "cake_pay_learn_more": "ซื้อและเบิกบัตรของขวัญในแอพพลิเคชันทันที!\nกระแทกขวาไปซ้ายเพื่อเรียนรู้เพิ่มเติม", + "automatic": "อัตโนมัติ", + "fixed_pair_not_supported": "คู่ความสัมพันธ์ที่ถูกกำหนดไว้นี้ไม่สนับสนุนกับหุ้นที่เลือก", + "variable_pair_not_supported": "คู่ความสัมพันธ์ที่เปลี่ยนแปลงได้นี้ไม่สนับสนุนกับหุ้นที่เลือก", + "none_of_selected_providers_can_exchange": "ไม่มีผู้ให้บริการที่เลือกที่สามารถแลกเปลี่ยนนี้ได้", + "choose_one": "เลือกหนึ่งรายการ", + "choose_from_available_options": "เลือกจากตัวเลือกที่มีอยู่:", + "custom_redeem_amount": "จำนวนรับคืนที่กำหนดเอง", + "add_custom_redemption": "เพิ่มการรับคืนที่กำหนดเอง", + "remaining": "เหลืออยู่", + "delete_wallet": "ลบกระเป๋า", + "delete_wallet_confirm_message" : "คุณแน่ใจหรือว่าต้องการลบกระเป๋า${wallet_name}?", + "low_fee": "ค่าธรรมเนียมต่ำ", + "low_fee_alert": "ขณะนี้คุณกำลังใช้ค่าธรรมเนียมของเครือข่ายที่มีความสำคัญต่ำ ซึ่งอาจทำให้เกิดการรอนาน ราคาที่แตกต่างกัน หรือยกเลิกการซื้อขาย เราแนะนำให้กำหนดค่าธรรมเนียมที่สูงขึ้นเพื่อประสบการณ์ที่ดีขึ้น", + "ignor": "ละเว้น", + "use_suggested": "ใช้ที่แนะนำ", + "do_not_share_warning_text" : "อย่าแชร์ข้อมูลนี้กับใครอื่น รวมถึงฝ่ายสนับสนุนด้วย\n\nการเงินของคุณอาจถูกขโมยโดยไม่หวังดี!", + "help": "ช่วยเหลือ", + "all_transactions": "การทำธุรกรรมทั้งหมด", + "all_trades": "การซื้อขายทั้งหมด", + "connection_sync": "การเชื่อมต่อและการซิงค์", + "security_and_backup": "ความปลอดภัยและการสำรองข้อมูล", + "create_backup": "สร้างการสำรองข้อมูล", + "privacy_settings": "การตั้งค่าความเป็นส่วนตัว", + "privacy": "ความเป็นส่วนตัว", + "display_settings": "การตั้งค่าการแสดงผล", + "other_settings": "การตั้งค่าอื่น ๆ", + "require_pin_after": "ต้องการ PIN หลังจาก", + "always": "เสมอ", + "minutes_to_pin_code": "${minute} นาที", + "disable_exchange": "ปิดใช้งานการแลกเปลี่ยน", + "advanced_privacy_settings": "การตั้งค่าความเป็นส่วนตัวขั้นสูง", + "settings_can_be_changed_later" : "การตั้งค่านี้สามารถเปลี่ยนแปลงได้ภายหลังในการตั้งค่าแอพฯ", + "add_custom_node" : "เพิ่มจุดโหนดแบบกำหนดเอง", + "disable_fiat" : "ปิดใช้งานสกุลเงินตรา", + "fiat_api" : "API สกุลเงินตรา", + "disabled" : "ปิดใช้งาน", + "enabled" : "เปิดใช้งาน", + "tor_only" : "Tor เท่านั้น", + "unmatched_currencies" : "สกุลเงินของกระเป๋าปัจจุบันของคุณไม่ตรงกับของ QR ที่สแกน", + "orbot_running_alert": "โปรดตรวจสอบว่า Orbot กำลังทำงานก่อนที่จะเชื่อมต่อกับโหนดนี้", + "contact_list_contacts": "ติดต่อ", + "contact_list_wallets": "กระเป๋าเงินของฉัน", + "bitcoin_payments_require_1_confirmation": "การชำระเงินด้วย Bitcoin ต้องการการยืนยัน 1 ครั้ง ซึ่งอาจใช้เวลา 20 นาทีหรือนานกว่านั้น ขอบคุณสำหรับความอดทนของคุณ! คุณจะได้รับอีเมลเมื่อการชำระเงินได้รับการยืนยัน", + "send_to_this_address" : "ส่ง ${currency} ${tag}ไปยังที่อยู่นี้", + "arrive_in_this_address" : "${currency} ${tag}จะมาถึงที่อยู่นี้", + "do_not_send": "อย่าส่ง", + "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น" +} diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb new file mode 100644 index 000000000..08dec0649 --- /dev/null +++ b/res/values/strings_tr.arb @@ -0,0 +1,688 @@ +{ + "welcome" : "Hoş Geldiniz", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "Monero, Bitcoin, Litecoin ve Haven için harika cüzdan", + "please_make_selection" : "Cüzdan oluşturmak veya geri döndürmek için aşağıdan seçim yap.", + "create_new" : "Yeni Cüzdan Oluştur", + "restore_wallet" : "Cüzdanı Geri Döndür", + + "monero_com": "Cake Wallet tarafından Monero.com", + "monero_com_wallet_text": "Monero için harika cüzdan", + + "haven_app": "Cake Wallet tarafından Haven", + "haven_app_wallet_text": "Haven için harika cüzdan ", + + "accounts" : "Hesaplar", + "edit" : "Düzenle", + "account" : "Hesap", + "add" : "Ekle", + + + "address_book" : "Adres Defteri", + "contact" : "Rehber", + "please_select" : "Lütfen seçim yap:", + "cancel" : "İptal", + "ok" : "Tamam", + "contact_name" : "Kişi ismi", + "reset" : "Sıfırla", + "save" : "Kaydet", + "address_remove_contact" : "Kişiyi sil", + "address_remove_content" : "Seçili kişiyi silmek istediğinden emin misin?", + + + "authenticated" : "Doğrulandı", + "authentication" : "Doğrulama", + "failed_authentication" : "Doğrulama başarısız oldu. ${state_error}", + + + "wallet_menu" : "Menü", + "Blocks_remaining" : "${status} Blok Kaldı", + "please_try_to_connect_to_another_node" : "Lütfen farklı düğüme bağlanmayı dene", + "xmr_hidden" : "Gizli", + "xmr_available_balance" : "Kullanılabilir Bakiye", + "xmr_full_balance" : "Tüm Bakiye", + "send" : "Para Gönder", + "receive" : "Para Al", + "transactions" : "İşlemler", + "incoming" : "Gelen", + "outgoing" : "Giden", + "transactions_by_date" : "Tarihe göre transferler", + "trades" : "Takaslar", + "filter_by": "Şuna göre filtrele", + "today" : "Bugün", + "yesterday" : "Dün", + "received" : "Alındı", + "sent" : "Gönderildi", + "pending" : " (bekleyen)", + "rescan" : "Yeniden Tara", + "reconnect" : "Yeniden Bağlan", + "wallets" : "Cüzdanlar", + "show_seed" : "Tohumları göster", + "show_keys" : "Tohumları/anahtarları göster", + "address_book_menu" : "Adres defteri", + "reconnection" : "Yeniden bağlantı", + "reconnect_alert_text" : "Yeniden bağlanmak istediğinden emin misin?", + + + "exchange" : "Takas", + "clear" : "Temizle", + "refund_address" : "İade adresi", + "change_exchange_provider" : "Takas sağlayıcısını değiştir", + "you_will_send" : "Biçiminden dönüştür:", + "you_will_get" : "Biçimine dönüştür:", + "amount_is_guaranteed" : "Alacağınız tutar garantilidir", + "amount_is_estimate" : "Alacağınız tutar tahminidir", + "powered_by" : "${title} tarafından desteklenmektedir", + "error" : "Hata", + "estimated" : "Tahmini", + "min_value" : "En az: ${value} ${currency}", + "max_value" : "En fazla: ${value} ${currency}", + "change_currency" : "Para Birimini Değiştir", + "overwrite_amount" : "Miktarın üzerine yaz", + "qr_payment_amount" : "Bu QR kodu ödeme tutarını içeriyor. Geçerli miktarın üzerine yazmak istediğine emin misin?", + + "copy_id" : "ID'yi kopyala", + "exchange_result_write_down_trade_id" : "Devam etmek için lütfen ID'yi kopyala veya bir yere yaz.", + "trade_id" : "Takas ID'si:", + "copied_to_clipboard" : "Panoya Kopyalandı", + "saved_the_trade_id" : "Takas ID'imi kaydettim", + "fetching" : "Getiriliyor", + "id" : "ID: ", + "amount" : "Miktar: ", + "payment_id" : "Ödeme ID'si: ", + "status" : "Durum: ", + "offer_expires_in" : "Teklifin bitmesine kalan: ", + "trade_is_powered_by" : "Bu takas ${provider} tarafından desteklenmektedir", + "copy_address" : "Adresi kopyala", + "exchange_result_confirm" : "Onaylaya basarak, ${fetchingLabel} ${from} miktarında ${walletName} olarak adlandırılan cüzdanından aşağıda gösterilen adrese gönderilecek. Veya harici cüzdanından aşağıdaki adrese / QR koduna gönderebilirsin.\n\nLütfen devam etmek için onayla'ya bas veya tutarı değiştirmek için geri dön.", + "exchange_result_description" : "Lütfen en az ${fetchingLabel} miktarındaki ${from}'yi sonraki sayfada gönsterilen adrese gönder. Eğer ${fetchingLabel} ${from}'den az gönderirsen takas gerçekleşmeyebilir ve size geri iade edilebilir.", + "exchange_result_write_down_ID" : "*Lütfen yukarıda gösterilen ID'ni kopyala veya bir yere yaz.", + "confirm" : "Onayla", + "confirm_sending" : "Göndermeyi onayla", + "commit_transaction_amount_fee" : "Transferi gerçekleştir\nMiktar: ${amount}\nKomisyon: ${fee}", + "sending" : "Gönderiliyor", + "transaction_sent" : "Transfer gönderildi!", + "expired" : "Süresi doldu", + "time" : "${minutes}d ${seconds}s", + "send_xmr" : "XMR gönder", + "exchange_new_template" : "Yeni şablon", + + "faq" : "SSS", + + + "enter_your_pin" : "PIN'ini gir", + "loading_your_wallet" : "Cüzdanın yükleniyor", + + + "new_wallet" : "Yeni Cüzdan", + "wallet_name" : "Cüzdan ismi", + "continue_text" : "Devam et", + "choose_wallet_currency" : "Lütfen cüzdanın para birimini seç:", + + + "node_new" : "Yeni düğüm", + "node_address" : "Düğüm adresi", + "node_port" : "Düğüm port'u", + "login" : "Login", + "password" : "Parola", + "nodes" : "Düğümler", + "node_reset_settings_title" : "Ayarları sıfırla", + "nodes_list_reset_to_default_message" : "Ayarları varsayılana sıfırlamak istediğinizden emin misin?", + "change_current_node" : "Şimdiki düğümü ${node} düğümüne değiştirmek istediğinizden emin misin?", + "change" : "Değiştir", + "remove_node" : "Düğümü kaldır", + "remove_node_message" : "Seçili düğümü kaldırmak istediğinden emin misin?", + "remove" : "Kaldır", + "delete" : "Sil", + "add_new_node" : "Yeni düğüm ekle", + "change_current_node_title" : "Şimdiki düğümü değiştir", + "node_test" : "Test Et", + "node_connection_successful" : "Bağlantı başarılı oldu", + "node_connection_failed" : "Bağlantı başarısız oldu", + "new_node_testing" : "Yeni düğüm test ediliyor", + + + "use" : "Şuna geç: ", + "digit_pin" : " haneli PIN", + + + "share_address" : "Adresi paylaş", + "receive_amount" : "Miktar", + "subaddresses" : "Alt adresler", + "addresses" : "Adresler", + "scan_qr_code" : "Adresi getirmek için QR kodunu tara", + "qr_fullscreen" : "QR kodunu tam ekranda açmak için dokun", + "rename" : "Yeniden adlandır", + "choose_account" : "Hesabı seç", + "create_new_account" : "Yeni hesap oluştur", + "accounts_subaddresses" : "Hesaplar ve alt adresler", + + + "restore_restore_wallet" : "Cüzdanı Geri Döndür", + "restore_title_from_seed_keys" : "Tohumdan/anahtarlardan geri döndür", + "restore_description_from_seed_keys" : "Güvenli bir yere kaydettiğin tohumdan/anahtarlardan cüzdanını geri döndür", + "restore_next" : "İleri", + "restore_title_from_backup" : "Yedekten geri döndür", + "restore_description_from_backup" : "Yedek dosyandan tüm Cake Wallet uygulamasını geri döndürebilirsin", + "restore_seed_keys_restore" : "Tohumu/Anahtarları Geri Döndür", + "restore_title_from_seed" : "Tohumdan geri döndür", + "restore_description_from_seed" : "Cüzdanınızı 25 veya 13 kelimelik kombinasyon kodundan geri döndürün", + "restore_title_from_keys" : "Anahtarlardan geri döndür", + "restore_description_from_keys" : "Cüzdanınızı özel anahtarlarınızdan kaydedilen oluşturulmuş tuş vuruşlarından geri yükleyin", + "restore_wallet_name" : "Cüzdan ismi", + "restore_address" : "Adres", + "restore_view_key_private" : "İzleme anahtarı (Özel)", + "restore_spend_key_private" : "Harcama anahtarı (Özel)", + "restore_recover" : "Geri döndür", + "restore_wallet_restore_description" : "Cüzdan geri döndürme açıklaması", + "restore_new_seed" : "Yeni tohum", + "restore_active_seed" : "Tohumu aktifleştir", + "restore_bitcoin_description_from_seed" : "Cüzdanınızı 24 kelimelik kombinasyon kodundan geri yükle", + "restore_bitcoin_description_from_keys" : "Cüzdanını, oluşturulan WIF dizesinden veya özel anahtarlarından geri yükle", + "restore_bitcoin_title_from_keys" : "WIF'den geri yükle", + "restore_from_date_or_blockheight" : "Lütfen bu cüzdanı oluşturmadan birkaç gün önceki bir tarihi girin. Veya blok yüksekliğini biliyorsan, lütfen bunu gir", + + + "seed_reminder" : "Telefonunu kaybetmen veya silinmesi ihtimaline karşı lütfen bunları not et", + "seed_title" : "Tohum", + "seed_share" : "Tohumu paylaş", + "copy" : "Kopyala", + + + "seed_language_choose" : "Lütfen tohum dilini seç:", + "seed_choose" : "Tohum dilini seçin", + "seed_language_next" : "İleri", + "seed_language_english" : "İngilizce", + "seed_language_chinese" : "Çince", + "seed_language_dutch" : "Flemenkçe", + "seed_language_german" : "Almanca", + "seed_language_japanese" : "Japonca", + "seed_language_portuguese" : "Portekizce", + "seed_language_russian" : "Rusça", + "seed_language_spanish" : "İspanyolca", + "seed_language_french": "Fransızca", + "seed_language_italian": "İtalyanca", + + + "send_title" : "Gönder", + "send_your_wallet" : "Cüzdanın", + "send_address" : "${cryptoCurrency} adresi", + "send_payment_id" : "Ödeme ID'si (isteğe bağlı)", + "all" : "HEPSİ", + "send_error_minimum_value" : "Minimum tutar değeri 0.01'dir", + "send_error_currency" : "Para birimi sadece sayı içerebilir", + "send_estimated_fee" : "Tahmini komisyon:", + "send_priority" : "Şu anda ücret ${transactionPriority} önceliğine ayarlanmıştır.\nİşlem önceliği ayarlardan değiştirilebilir", + "send_creating_transaction" : "İşlem oluşturuluyor", + "send_templates" : "Şablonlar", + "send_new" : "Yeni", + "send_amount" : "Miktar:", + "send_fee" : "Komisyon:", + "send_name" : "İsim", + "send_got_it" : "Tamamdır", + "send_sending" : "Gönderiliyor...", + "send_success" : "${crypto} başarıyla gönderildi", + + + "settings_title" : "Ayarlar", + "settings_nodes" : "Düğümler", + "settings_current_node" : "Şimdiki düğüm", + "settings_wallets" : "Cüzdanlar", + "settings_display_balance" : "Bakiyeyi göster", + "settings_currency" : "Para birimi", + "settings_fee_priority" : "İşlem Komsiyonu önceliği", + "settings_save_recipient_address" : "Gönderilen adresi kaydet", + "settings_personal" : "Kişisel", + "settings_change_pin" : "PIN'i değiştir", + "settings_change_language" : "Dili değiştir", + "settings_allow_biometrical_authentication" : "Biyometrik doğrulamaya izin ver", + "settings_dark_mode" : "Karanlık mod", + "settings_transactions" : "İşlemler", + "settings_trades" : "Takaslar", + "settings_display_on_dashboard_list" : "Gösterge tablosu listesinde göster", + "settings_all" : "HEPSİ", + "settings_only_trades" : "Sadece takaslar", + "settings_only_transactions" : "Sadece transferler", + "settings_none" : "Hiçbiri", + "settings_support" : "Destek", + "settings_terms_and_conditions" : "Şartlar ve Koşullar", + "pin_is_incorrect" : "PIN kodu hatalı", + + + "setup_pin" : "PIN kodu kurulumu", + "enter_your_pin_again" : "PIN kodunu tekrar girin", + "setup_successful" : "PIN kodun başarıyla ayarlandı!", + + + "wallet_keys" : "Cüzdan tohumu/anahtarları", + "wallet_seed" : "Cüzdan tohumu", + "private_key" : "Özel anahtar", + "public_key" : "Genel Anahtar", + "view_key_private" : "İzleme anahtarı (özel)", + "view_key_public" : "İzleme anahtarı (genel)", + "spend_key_private" : "Harcama anahtarı (özel)", + "spend_key_public" : "Harcama anahtarı (genel)", + "copied_key_to_clipboard" : "${key} panoya kopyalandı", + + + "new_subaddress_title" : "Yeni adres", + "new_subaddress_label_name" : "Etiket ismi", + "new_subaddress_create" : "Oluştur", + + "address_label" : "Adres etiketi", + + "subaddress_title" : "Alt adres listesi", + + + "trade_details_title" : "Takas Detayları", + "trade_details_id" : "ID", + "trade_details_state" : "Durum", + "trade_details_fetching" : "Getiriliyor", + "trade_details_provider" : "Sağlayıcı", + "trade_details_created_at" : "'da oluşturuldu", + "trade_details_pair" : "Parite", + "trade_details_copied" : "${title} panoya kopyalandı", + + + "trade_history_title" : "Takas geçmişi", + + + "transaction_details_title" : "İşlem Detayları", + "transaction_details_transaction_id" : "İşem ID'si", + "transaction_details_date" : "Tarih", + "transaction_details_height" : "Yükseklik", + "transaction_details_amount" : "Miktar", + "transaction_details_fee" : "Fee", + "transaction_details_copied" : "${title} panoya kopyalandı", + "transaction_details_recipient_address" : "Alıcı adres", + + + "wallet_list_title" : "Monero Cüzdanı", + "wallet_list_create_new_wallet" : "Yeni Cüzdan Oluştur", + "wallet_list_restore_wallet" : "Cüzdanı Geri Yükle", + "wallet_list_load_wallet" : "Cüzdanı yükle", + "wallet_list_loading_wallet" : "${wallet_name} cüzdanı yükleniyor", + "wallet_list_failed_to_load" : "Failed to load ${wallet_name} wallet. ${error}", + "wallet_list_removing_wallet" : "Removing ${wallet_name} wallet", + "wallet_list_failed_to_remove" : "${wallet_name} cüzdanı yüklenirken hata oluştu. ${error}", + + + "widgets_address" : "Adres", + "widgets_restore_from_blockheight" : "Blok yüksekliğinden geri yükle", + "widgets_restore_from_date" : "Tarihten geri yükle", + "widgets_or" : "veya", + "widgets_seed" : "Tohum", + + + "router_no_route" : "${name} için rota tanımlanmadı", + + + "error_text_account_name" : "Hesap ismi yalnızca harf, rakam \nve 1 ile 15 uzunluğunda karakter içermelidir.", + "error_text_contact_name" : "Kişi ismi ` , ' \" sembollerini içeremez \nve 1 ile 32 uzunluğunda karakter içermelidir", + "error_text_address" : "Cüzdan adresi kripto para biriminin\ntürüne karşılık gelmelidir", + "error_text_node_address" : "Lütfen iPv4 adresi girin", + "error_text_node_port" : "Düğüm port'u yalnızca 0 ve 65535 arasında rakam içerebilir", + "error_text_payment_id" : "Ödeme ID'si yalnızca onaltılık (hex) olarak 16 veya 64 karakter içerebilir", + "error_text_xmr" : "XMR miktarı kullanılabilir bakiyeyi aşamaz.\nKesir basamaklarının sayısı 12'ye eşit veya daha az olmalıdır", + "error_text_fiat" : "Tutarın değeri, mevcut bakiyeyi aşamaz.\nKesir basamaklarının sayısı 2'ye eşit veya daha az olmalıdır", + "error_text_subaddress_name" : "Alt adres ismi ` , ' \" sembolleri içeremez\nve 1 ile 20 karakter arasında olmalıdır", + "error_text_amount" : "Miktar sadece sayı içerebilir", + "error_text_wallet_name" : "Cüzdan ismi yalnızca harf, rakam \nve 1 ile 33 uzunluğunda karakter içermelidir.", + "error_text_keys" : "Cüzdan anahtarları onaltılık (hex) olarak yalnızca 64 karakter içerebilir", + "error_text_crypto_currency" : "Kesir basamaklarının sayısı\n12'ye eşit veya daha az olmalıdır", + "error_text_minimal_limit" : "${provider} için işlem oluşturulmadı. Miktar minimumdan daha azdır: ${min} ${currency}", + "error_text_maximum_limit" : "${provider} için işlem oluşturulmadı. Miktar maksimumdan daha fazla: ${max} ${currency}", + "error_text_limits_loading_failed" : "${provider} için işlem oluşturulmadı. Limitler yüklenirken hata oluştu.", + "error_text_template" : "Şablon adı ve adresi ` , ' \" sembolleri içeremez\nve 1 ila 106 karakter uzunluğunda olmalı", + + + "auth_store_ban_timeout" : "ban_timeout", + "auth_store_banned_for" : "Bu kadar süreliğine yasaklandınız: ", + "auth_store_banned_minutes" : " dakika", + "auth_store_incorrect_password" : "Hatalı PIN", + "wallet_store_monero_wallet" : "Monero Cüzdanı", + "wallet_restoration_store_incorrect_seed_length" : "Yanlış tohum uzunluğu", + + + "full_balance" : "Tüm bakiye", + "available_balance" : "Kullanılabilir Bakiye", + "hidden_balance" : "Gizli Bakiye", + + + "sync_status_syncronizing" : "SENKRONİZE EDİLİYOR", + "sync_status_syncronized" : "SENKRONİZE EDİLDİ", + "sync_status_not_connected" : "BAĞLI DEĞİL", + "sync_status_starting_sync" : "SENKRONİZE BAŞLATILIYOR", + "sync_status_failed_connect" : "BAĞLANTI KESİLDİ", + "sync_status_connecting" : "BAĞLANILIYOR", + "sync_status_connected" : "BAĞLANILDI", + "sync_status_attempting_sync" : "SENKRONİZE EDİLMEYE ÇALIŞILIYOR", + + + "transaction_priority_slow" : "Yavaş", + "transaction_priority_regular" : "Normal", + "transaction_priority_medium" : "Orta", + "transaction_priority_fast" : "Hızlı", + "transaction_priority_fastest" : "En Hızlı", + + + "trade_for_not_created" : "${title} için takas oluşturulmadı.", + "trade_not_created" : "Takas oluşturulmadı", + "trade_id_not_found" : "Trade ${tradeId} of ${title} not found.", + "trade_not_found" : "Takas bulunamadı.", + + + "trade_state_pending" : "Beklemede", + "trade_state_confirming" : "Onaylanıyor", + "trade_state_trading" : "Takas yapılıyor", + "trade_state_traded" : "Takas yapıldı", + "trade_state_complete" : "Tamamlandı", + "trade_state_to_be_created" : "Oluşturulacak", + "trade_state_unpaid" : "Ödenmedi", + "trade_state_underpaid" : "Eksik ödendi", + "trade_state_paid_unconfirmed" : "Ödendi onaylanmadı", + "trade_state_paid" : "Ödendi", + "trade_state_btc_sent" : "Btc gönderildi", + "trade_state_timeout" : "Zaman aşımı", + "trade_state_created" : "Oluşturuldu", + "trade_state_finished" : "Tamamlandı", + + "change_language" : "Dili değiştir", + "change_language_to" : "Dili şuna değiştir: ${language}?", + + "paste" : "Yapıştır", + "restore_from_seed_placeholder" : "Lütfen tohumunu buraya gir veya yapıştır", + "add_new_word" : "Yeni kelime ekle", + "incorrect_seed" : "Girilen metin geçerli değil.", + + "biometric_auth_reason" : "Kimlik doğrulaması için parmak izini okutun", + "version" : "Sürüm ${currentVersion}", + + "extracted_address_content" : "Parayı buraya gönderceksin:\n${recipient_name}", + + "card_address" : "Adres:", + "buy" : "Alış", + "sell": "Satış", + + "placeholder_transactions" : "İşlemlerin burada görüntülenecek", + "placeholder_contacts" : "Kişilerin burada görüntülenecek", + + "template" : "Şablon", + "confirm_delete_template" : "Bu eylem, bu şablonu silecek. Devam etmek istiyor musun?", + "confirm_delete_wallet" : "Bu eylem, bu cüzdanı silecek. Devam etmek istiyor musun?", + + "picker_description" : "ChangeNOW veya MorphToken'ı seçmek için lütfen önce işlem paritenizi değiştirin", + + "change_wallet_alert_title" : "Şimdiki cüzdanı değiştir", + "change_wallet_alert_content" : "Şimdiki cüzdanı ${wallet_name} cüzdanı ile değiştirmek istediğinden emin misin?", + + "creating_new_wallet" : "Cüzdan oluşturuluyor", + "creating_new_wallet_error" : "Hata: ${description}", + + "seed_alert_title" : "Dikkat", + "seed_alert_content" : "Cüzdanını kurtarmanın tek yolu tohumdur. Tohumunu yazdın mı?", + "seed_alert_back" : "Geriye dön", + "seed_alert_yes" : "Evet yazdım", + + "exchange_sync_alert_content" : "Lütfen cüzdanın senkronize olana kadar bekle", + + "pre_seed_title" : "UYARI", + "pre_seed_description" : "Bir sonraki sayfada ${words} kelime göreceksin. Bu senin benzersiz ve özel tohumundur, kaybetmen veya silinmesi durumunda cüzdanını kurtarmanın TEK YOLUDUR. Bunu yazmak ve Cake Wallet uygulaması dışında güvenli bir yerde saklamak tamamen SENİN sorumluluğunda.", + "pre_seed_button_text" : "Anladım. Bana tohumumu göster.", + + "xmr_to_error" : "XMR.TO hatası", + "xmr_to_error_description" : "Geçersiz tutar. Ondalık noktadan sonra maksimum limit 8 basamaktır", + + "provider_error" : "${provider} hatası", + + "use_ssl" : "SSL kullan", + "trusted" : "Güvenilir", + + "color_theme" : "Renk teması", + "light_theme" : "Aydınlık", + "bright_theme" : "Parlak", + "dark_theme" : "Karanlık", + "enter_your_note" : "Notunu gir…", + "note_optional" : "Not (isteğe bağlı)", + "note_tap_to_change" : "Not (değiştirmek için dokunun)", + "view_in_block_explorer" : "Blok Gezgini'nde görüntüle", + "view_transaction_on" : "İşlemi şurada görüntüle ", + "transaction_key" : "İşlem Anahtarı", + "confirmations" : "Onay", + "recipient_address" : "Alıcı adresi", + + "extra_id" : "Ekstra ID:", + "destination_tag" : "Hedef Etiketi:", + "memo" : "Memo:", + + "backup" : "Yedek", + "change_password" : "Parolayı değiştir", + "backup_password" : "Yedek parolası", + "write_down_backup_password" : "Lütfen yedekleme dosyasının içe aktarılması için kullanılan yedekleme parolanı not et.", + "export_backup" : "Yedeği dışa aktar", + "save_backup_password" : "Lütfen yedekleme parolanı kaydettiğinden emin ol. Bu parola olmadan yedekleme dosyasını içe aktaramazsın.", + "backup_file" : "Yedek dosyası", + + "edit_backup_password" : "Yedek parolasını değiştir", + "save_backup_password_alert" : "Yedek parolasını kaydet", + "change_backup_password_alert" : "Önceki yedekleme dosyaların yeni yedek parolası ile içe aktarılamayacaktır. Yeni yedekleme parolası yalnızca yeni yedekleme dosyaları için kullanılabilir olacak. Yedekleme parolasını değiştirmek istediğinden emin misin?", + + "enter_backup_password" : "Yedekleme parolasını buraya gir", + "select_backup_file" : "Yedek dosyası seç", + "import" : "İçe aktar", + "please_select_backup_file" : "Lütfen yedekleme dosyasını seç ve yedekleme parolasını gir.", + + "fixed_rate" : "Sabit oran", + "fixed_rate_alert" : "Sabit oran modunu işaretlersen alım tutarını girebilirsin. Sabit oran moduna geçmek ister misin?", + + "xlm_extra_info" : "Lütfen takas için XLM işlemi gönderirken Memo ID'yi belirtmeyi unutmayın", + "xrp_extra_info" : "Lütfen takas için XRP işlemi gönderirken Hedef Etiketi (Destination Tag) belirtmeyi unutmayın", + + "exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet'daki Monero bakiyenizi kullanarak takas yapmak istiyorsan, lütfen önce Monero cüzdanına geç.", + "confirmed" : "Onaylı", + "unconfirmed" : "Onaylanmamış", + "displayable" : "Gösterilebilir", + + "submit_request" : "talep gönder", + + "buy_alert_content" : "Şu anda sadece Bitcoin ve Litecoin satın alımını destekliyoruz. Bitcoin veya Litecoin satın almak için lütfen Bitcoin veya Litecoin cüzdanınızı oluşturun veya bu cüzdanlardan birine geçiş yapın.", + "sell_alert_content": "Şu anda sadece Bitcoin satışını destekliyoruz. Bitcoin satmak için lütfen Bitcoin cüzdanınızı oluşturun veya Bitcoin cüzdanınıza geçiş yapın.", + + "outdated_electrum_wallet_description" : "Cake'te oluşturulan yeni Bitcoin cüzdanları artık 24 kelimelik bir tohuma sahip. Yeni bir Bitcoin cüzdanı oluşturmanız ve tüm paranızı 24 kelimelik yeni cüzdana aktarmanız ve 12 kelimelik tohuma sahip cüzdanları kullanmayı bırakmanız zorunludur. Lütfen paranızı güvence altına almak için bunu hemen yapın.", + "understand" : "Anladım", + + "apk_update" : "APK güncellemesi", + + "buy_bitcoin" : "Bitcoin Satın Al", + "buy_with" : "Şunun ile al: ", + "moonpay_alert_text" : "Tutar ${minAmount} ${fiatCurrency} miktarına eşit veya daha fazla olmalıdır", + + "outdated_electrum_wallet_receive_warning": "Bu cüzdanın 12 kelimelik bir tohumu varsa ve Cake'te oluşturulduysa, bu cüzdana Bitcoin YATIRMAYIN. Bu cüzdana aktarılan tüm BTC'ler kaybolabilir. 24 kelimelik yeni bir cüzdan oluşturun (sağ üstteki menüye dokunun, Cüzdanlar'ı seçin, Yeni Cüzdan Oluştur'u seçin, ardından Bitcoin'i seçin) ve BTC'nizi HEMEN oraya taşıyın. Cake'in yeni (24 kelimelik) BTC cüzdanları güvenlidir", + "do_not_show_me": "Bana bunu bir daha gösterme", + + "unspent_coins_title" : "Harcanmamış koinler", + "unspent_coins_details_title" : "Harcanmamış koin detayları", + "freeze" : "Dondur", + "frozen" : "Dondurulmuş", + "coin_control" : "Koin kontrolü (isteğe bağlı)", + + "address_detected" : "Adres tespit edildi", + "address_from_domain" : "Bu adres Unstoppable Domains'deki' ${domain} adresinden alındı", + + "add_receiver" : "Başka bir alıcı ekle (isteğe bağlı)", + + "manage_yats" : "Yats'ları yönet", + "yat_alert_title" : "Yat ile daha kolay kripto gönderin ve alın", + "yat_alert_content" : "Cake Wallet kullanıcıları artık tüm favori koin birimlerini benzersiz emoji tabanlı kullanıcı adıyla gönderebilir ve alabilirler.", + "get_your_yat" : "Yat'ını al", + "connect_an_existing_yat" : "Mevcut bir Yat'ı bağla", + "connect_yats": "Yat'lara bağlan", + "yat_address" : "Yat adresi", + "yat" : "Yat", + "address_from_yat" : "Bu adres Yat'taki ${emoji} adresinden alındı", + "yat_error" : "Yat hatası", + "yat_error_content" : "Bu Yat'a bağlı bir adres yok. Başka bir Yat'ı deneyin", + "choose_address" : "\n\nLütfen adresi seçin:", + "yat_popup_title" : "Cüzdan adresiniz emojileştirilebilir.", + "yat_popup_content" : "Artık Cake Wallet'ta kısa, emoji tabanlı bir kullanıcı adı olan Yat'ınızla kripto gönderebilir ve alabilirsiniz. Yats'ı istediğiniz zaman ayarlar ekranından yönetebilirsiniz", + "second_intro_title" : "Hepsini yönetebilen tek bir emoji adresi", + "second_intro_content" : "Yat'ınız, tüm para birimleriniz için uzun onaltılık adreslerinizin yerini alan benzersiz emoji adresidir.", + "third_intro_title" : "Yat diğerleriyle iyi çalışır", + "third_intro_content" : "Yat'lar Cake Wallet'ın dışında da çalışabilir. Dünya üzerindeki herhangi bir cüzdan adresi Yat ile değiştirilebilir!", + "learn_more" : "Daha fazla öğren", + "search": "Arat", + "search_language": "Dil arat", + "search_currency": "Para birimi ara", + "new_template" : "Yeni Şablon", + "electrum_address_disclaimer": "Adresini her kullandığında yeni adres oluşturuyoruz, ancak önceki adresler de çalışmaya devam eder", + "wallet_name_exists": "Bu isimde bir cüzdan zaten mevcut. Lütfen farklı bir isim seç veya önce diğer cüzdanı yeniden adlandır.", + "market_place": "Pazar Alanı", + "cake_pay_title": "Cake Pay Hediye Kartları", + "cake_pay_subtitle": "İndirimli hediye kartları satın alın (yalnızca ABD)", + "cake_pay_web_cards_title": "Cake Pay Web Kartları", + "cake_pay_web_cards_subtitle": "Dünya çapında ön ödemeli kartlar ve hediye kartları satın alın", + "about_cake_pay": "Cake Pay, Amerika Birleşik Devletleri'ndeki 150.000'den fazla işyerinde anında harcanabilen sanal varlıklarla kolayca hediye kartları satın almanızı sağlar.", + "cake_pay_account_note": "Kartları görmek ve satın almak için sadece bir e-posta adresiyle kaydolun. Hatta bazıları indirimli olarak bile mevcut!", + "already_have_account": "Zaten bir hesabınız var mı?", + "create_account": "Hesap oluştur", + "privacy_policy": "Gizlilik Politikası", + "welcome_to_cakepay": "Cake Pay'e Hoş Geldiniz!", + "sign_up": "Kaydol", + "forgot_password": "Parolamı unuttum", + "reset_password": "Parolamı sıfırla", + "gift_cards": "Hediye kartları", + "setup_your_debit_card": "Banka kartını ayarla", + "no_id_required": "Kimlik gerekmez. Para yükleyin ve istediğiniz yerde harcayın", + "how_to_use_card": "Bu kart nasıl kullanılır", + "purchase_gift_card": "Hediye Kartı Satın Al", + "verification": "Doğrulama", + "fill_code": "Lütfen e-postanıza gelen doğrulama kodunu girin", + "dont_get_code": "Kod gelmedi mi?", + "resend_code": "Lütfen tekrar gönder", + "debit_card": "Ön ödemeli Kart", + "cakepay_prepaid_card": "CakePay Ön Ödemeli Kart", + "no_id_needed": "Kimlik gerekmez!", + "frequently_asked_questions": "Sıkça sorulan sorular", + "debit_card_terms": "Ödeme kartı numaranızın (ve kart numaranıza karşılık gelen kimlik bilgilerinin) bu dijital cüzdanda saklanması ve kullanılması, zaman zaman yürürlükte olan ödeme kartı veren kuruluşla yapılan ilgili kart sahibi sözleşmesinin Hüküm ve Koşullarına tabidir.", + "please_reference_document": "Daha fazla bilgi için lütfen aşağıdaki belgelere bakınız.", + "cardholder_agreement": "Kart Sahibi Sözleşmesi", + "e_sign_consent": "E-İmza Onayı", + "agree_and_continue": "Kabul Et & Devam Et", + "email_address": "E-posta Adresi", + "agree_to": "Hesap oluşturarak bunları kabul etmiş olursunuz ", + "and": "ve", + "enter_code": "Kodu girin", + "congratulations": "Tebrikler!", + "you_now_have_debit_card": "Artık bir ön ödemeli kartın var", + "min_amount" : "Min: ${value}", + "max_amount" : "Maks: ${value}", + "enter_amount": "Miktar Girin", + "billing_address_info": "Eğer fatura adresi istenirse, kargo adresinizi girin", + "order_physical_card": "Fiziksel Kart Siparişi", + "add_value": "Değer ekle", + "activate": "Aktifleştir", + "get_a": "Bir ", + "digital_and_physical_card": " Dijital para birimleri ile para yükleyebileceğiniz ve ek bilgiye gerek olmayan", + "get_card_note": " dijital ve fiziksel ön ödemeli banka kartı edinin!", + "signup_for_card_accept_terms": "Kart için kaydol ve koşulları kabul et.", + "add_fund_to_card": "Ön ödemeli kartlara para ekle (En fazla yüklenebilir tutar: ${value})", + "use_card_info_two": "Paralar, dijital para birimlerinde değil, ön ödemeli hesapta tutulduğunda USD'ye dönüştürülür.", + "use_card_info_three": "Dijital kartı çevrimiçi olarak veya temassız ödeme yöntemleriyle kullanın.", + "optionally_order_card": "İsteğe bağlı olarak fiziksel bir kart sipariş edin.", + "hide_details" : "Detayları Gizle", + "show_details" : "Detayları Göster", + "upto": "Şu miktara kadar: ${value}", + "discount": "%${value} tasarruf et", + "gift_card_amount": "Hediye Kartı Tutarı", + "bill_amount": "Fatura Tutarı", + "you_pay": "Şu kadar ödeyeceksin: ", + "tip": "Bahşiş:", + "custom": "özel", + "by_cake_pay": "Cake Pay tarafından", + "expires": "Son kullanma tarihi", + "mm": "AA", + "yy": "YY", + "online": "Çevrimiçi", + "offline": "Çevrimdışı", + "gift_card_number": "Hediye kartı numarası", + "pin_number": "PIN kodu", + "total_saving": "Toplam Tasarruf", + "last_30_days": "Son 30 gün", + "avg_savings": "Ortalama Tasarruf", + "view_all": "Hepsini göster", + "active_cards": "Aktif kartlar", + "delete_account": "Hesabı sil", + "cards": "Kartlar", + "active": "Aktif", + "redeemed": "Kullanılmış", + "gift_card_balance_note": "Bakiyesi kalan olan hediye kartları burada görünecek", + "gift_card_redeemed_note": "Harcadığın hediye kartları burada görünecek", + "logout": "Çıkış yap", + "add_tip": "Bahşiş Ekle", + "percentageOf": "of ${amount}", + "is_percentage": "is", + "search_category": "Kategori ara", + "mark_as_redeemed": "Harcanmış olarak işaretle", + "more_options": "Daha Fazla Seçenek", + "awaiting_payment_confirmation": "Ödemenin onaylanması bekleniyor", + "transaction_sent_notice": "Ekran 1 dakika sonra ilerlemezse, blok gezgininden ve e-postanızdan kontrol edin.", + "agree": "Kabul Et", + "in_store": "Mağazada", + "generating_gift_card": "Hediye Kartı Oluşturuluyor", + "payment_was_received": "Ödemeniz alındı.", + "proceed_after_one_minute": "Ekran 1 dakika sonra ilerlemezse, e-postanızı kontrol edin.", + "order_id": "Sipariş ID'si", + "gift_card_is_generated": "Hediye Kartı oluşturuldu", + "open_gift_card": "Hediye Kartını Aç", + "contact_support": "Destek ile İletişime Geç", + "gift_cards_unavailable": "Hediye kartları şu anda yalnızca Monero, Bitcoin ve Litecoin ile satın alınabilir", + "introducing_cake_pay": "Cake Pay ile tanışın!", + "cake_pay_learn_more": "Uygulamada anında hediye kartları satın alın ve harcayın!\nDaha fazla öğrenmek için soldan sağa kaydır.", + "automatic": "Otomatik", + "fixed_pair_not_supported": "Bu sabit paritesi seçilen borsalarda desteklenmemekte", + "variable_pair_not_supported": "Bu değişken paritesi seçilen borsalarda desteklenmemekte", + "none_of_selected_providers_can_exchange": "Seçilen sağlayıcılardan hiçbiri bu takası yapamaz", + "choose_one": "Birini seç", + "choose_from_available_options": "Mevcut seçenekler arasından seçim yap:", + "custom_redeem_amount": "Özel Harcama Tutarı", + "add_custom_redemption": "Özel Bozdurma Ekle", + "remaining": "kalan", + "delete_wallet": "Cüzdanı sil", + "delete_wallet_confirm_message" : "${wallet_name} isimli cüzdanını silmek istediğinden emin misin?", + "low_fee": "Düşük komisyon", + "low_fee_alert": "Şu anda düşük bir ağ ücreti önceliği kullanıyorsunuz. Bu durum uzun beklemeler, farklı oranlar veya iptal edilen işlemlere neden olabilir. Daha iyi bir deneyim için daha yüksek bir ücret belirlemenizi öneririz.", + "ignor": "Yoksay", + "use_suggested": "Önerileni Kullan", + "do_not_share_warning_text" : "Bunları destek de dahil olmak üzere başka kimseyle paylaşma.\n\nParan çalınabilir ve çalınacaktır!", + "help": "yardım", + "all_transactions": "Tüm transferler", + "all_trades": "Tüm takaslar", + "connection_sync": "Bağlantı ve senkronizasyon", + "security_and_backup": "Güvenlik ve yedekleme", + "create_backup": "Yedek oluştur", + "privacy_settings": "Gizlilik ayarları", + "privacy": "Gizlilik", + "display_settings": "Görüntü ayarları", + "other_settings": "Diğer ayarlar", + "require_pin_after": "Şu kadar süre sonra PIN iste", + "always": "Her Zaman", + "minutes_to_pin_code": "${minute} dakika", + "disable_exchange": "Borsayı devre dışı bırak", + "advanced_privacy_settings": "Gelişmiş Gizlilik Ayarları", + "settings_can_be_changed_later": "Bu ayarlar daha sonra uygulama ayarlarından da değiştirilebilir", + "add_custom_node": "Yeni Özel Düğüm Ekleme", + "disable_fiat": "İtibari paraları devre dışı bırak", + "fiat_api": "İtibari Para API", + "disabled": "Devre dışı", + "enabled": "Etkin", + "tor_only": "Yalnızca Tor", + "unmatched_currencies": "Mevcut cüzdanınızın para birimi taranan QR ile eşleşmiyor", + "orbot_running_alert": "Lütfen bu düğüme bağlanmadan önce Orbot'un çalıştığından emin olun.", + "contact_list_contacts": "Rehberim", + "contact_list_wallets": "Cüzdanlarım", + "bitcoin_payments_require_1_confirmation": "Bitcoin ödemeleri, 20 dakika veya daha uzun sürebilen 1 onay gerektirir. Sabrınız için teşekkürler! Ödeme onaylandığında e-posta ile bilgilendirileceksiniz.", + "send_to_this_address" : "Bu adrese ${currency} ${tag}gönder", + "arrive_in_this_address" : "${currency} ${tag}bu adrese ulaşacak", + "do_not_send": "Gönderme", + "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin." +} diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index c152f2d75..ab0462b4b 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -48,7 +48,7 @@ "outgoing" : "Вихідні", "transactions_by_date" : "Сортувати по даті", "trades" : "Торгові операції", - "filters" : "Фільтр", + "filter_by": "Фільтрувати по", "today" : "Сьогодні", "yesterday" : "Вчора", "received" : "Отримані", @@ -397,8 +397,7 @@ "biometric_auth_reason" : "Відскануйте свій відбиток пальця для аутентифікації", "version" : "Версія ${currentVersion}", - "openalias_alert_title" : "Виявлено адресу", - "openalias_alert_content" : "Ви будете відправляти кошти\n${recipient_name}", + "extracted_address_content" : "Ви будете відправляти кошти\n${recipient_name}", "card_address" : "Адреса:", "buy" : "Купити", @@ -538,7 +537,9 @@ "wallet_name_exists": "Гаманець з такою назвою вже існує", "market_place": "Ринок", "cake_pay_title": "Подарункові картки Cake Pay", - "cake_pay_subtitle": "Купуйте подарункові картки та використовуйте їх миттєво", + "cake_pay_subtitle": "Купуйте подарункові картки зі знижкою (тільки для США)", + "cake_pay_web_cards_title": "Веб-картки Cake Pay", + "cake_pay_web_cards_subtitle": "Купуйте передоплачені та подарункові картки по всьому світу", "about_cake_pay": "Cake Pay дозволяє вам легко купувати подарункові картки з віртуальними активами, які можна миттєво витратити в понад 150 000 продавців у Сполучених Штатах.", "cake_pay_account_note": "Зареєструйтеся, використовуючи лише адресу електронної пошти, щоб переглядати та купувати картки. Деякі навіть доступні зі знижкою!", "already_have_account": "Вже є обліковий запис?", @@ -653,6 +654,8 @@ "use_suggested": "Використати запропоноване", "do_not_share_warning_text" : "Не діліться цим нікому, включно зі службою підтримки.\n\nВаші кошти можуть і будуть вкрадені!", "help": "допомога", + "all_transactions": "Всі транзакції", + "all_trades": "Всі операції", "connection_sync": "Підключення та синхронізація", "security_and_backup": "Безпека та резервне копіювання", "create_backup": "Створити резервну копію", @@ -673,5 +676,13 @@ "enabled": "Увімкнено", "tor_only": "Тільки Tor", "unmatched_currencies": "Валюта вашого гаманця не збігається з валютою сканованого QR-коду", + "orbot_running_alert": "Перед підключенням до цього вузла переконайтеся, що Orbot запущено.", + "contact_list_contacts": "Контакти", + "contact_list_wallets": "Мої гаманці", + "bitcoin_payments_require_1_confirmation": "Платежі Bitcoin потребують 1 підтвердження, яке може зайняти 20 хвилин або більше. Дякую за Ваше терпіння! Ви отримаєте електронний лист, коли платіж буде підтверджено.", + "send_to_this_address" : "Надіслати ${currency} ${tag}на цю адресу", + "arrive_in_this_address" : "${currency} ${tag}надійде на цю адресу", + "do_not_send": "Не надсилайте", + "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток.", "settings": "Налаштування" } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index bdf69b891..52fc9cd7a 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -48,7 +48,7 @@ "outgoing" : "发送", "transactions_by_date" : "按日期交易", "trades" : "交易", - "filters" : "过滤", + "filter_by": "过滤", "today" : "今天", "yesterday" : "昨天", "received" : "已收到", @@ -398,8 +398,7 @@ "biometric_auth_reason" : "扫描指纹进行身份认证", "version" : "版本 ${currentVersion}", - "openalias_alert_title" : "检测到地址", - "openalias_alert_content" : "您将汇款至\n${recipient_name}", + "extracted_address_content" : "您将汇款至\n${recipient_name}", "card_address" : "地址:", "buy" : "购买", @@ -537,7 +536,9 @@ "wallet_name_exists": "同名的钱包已经存在", "market_place": "市场", "cake_pay_title": "Cake Pay 礼品卡", - "cake_pay_subtitle": "购买礼品卡并立即兑换", + "cake_pay_subtitle": "购买打折礼品卡(仅限美国)", + "cake_pay_web_cards_title": "蛋糕支付网络卡", + "cake_pay_web_cards_subtitle": "购买全球预付卡和礼品卡", "about_cake_pay": "Cake Pay 让您可以轻松购买带有虚拟资产的礼品卡,可立即在美国超过 150,000 家商家消费。", "cake_pay_account_note": "只需使用電子郵件地址註冊即可查看和購買卡片。有些甚至可以打折!", "already_have_account": "已经有账号了?", @@ -652,6 +653,8 @@ "use_suggested": "使用建议", "do_not_share_warning_text" : "请勿与其他任何人分享这些信息,包括支持人员。\n\n您的资金可能而且将会被盗!", "help": "帮助", + "all_transactions": "所有交易", + "all_trades": "所有的变化", "connection_sync": "连接和同步", "security_and_backup": "安全和备份", "create_backup": "创建备份", @@ -672,5 +675,12 @@ "enabled": "启用", "tor_only": "仅限 Tor", "unmatched_currencies": "您当前钱包的货币与扫描的 QR 的货币不匹配", - "settings": "设置" + "orbot_running_alert": "请确保 Orbot 在连接到此节点之前正在运行。", + "contact_list_contacts": "联系人", + "contact_list_wallets": "我的钱包", + "bitcoin_payments_require_1_confirmation": "比特币支付需要 1 次确认,这可能需要 20 分钟或更长时间。谢谢你的耐心!确认付款后,您将收到电子邮件。", + "send_to_this_address" : "发送 ${currency} ${tag}到这个地址", + "arrive_in_this_address" : "${currency} ${tag}将到达此地址", + "do_not_send": "不要发送", + "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队,以改进应用程序。" } diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 5b704eea1..eabd192ce 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -14,14 +14,14 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.2.2" -MONERO_COM_BUILD_NUMBER=33 +MONERO_COM_VERSION="1.2.7" +MONERO_COM_BUILD_NUMBER=38 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.5.3" -CAKEWALLET_BUILD_NUMBER=138 +CAKEWALLET_VERSION="4.5.8" +CAKEWALLET_BUILD_NUMBER=144 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" diff --git a/scripts/android/build_haven.sh b/scripts/android/build_haven.sh index 6d22f7778..f745e942e 100755 --- a/scripts/android/build_haven.sh +++ b/scripts/android/build_haven.sh @@ -1,7 +1,7 @@ #!/bin/sh . ./config.sh -HAVEN_VERSION=tags/v2.2.2 +HAVEN_VERSION=tags/v3.0.7 HAVEN_SRC_DIR=${WORKDIR}/haven git clone https://github.com/haven-protocol-org/haven-main.git ${HAVEN_SRC_DIR} diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index fbf8233e5..f0dea9b4c 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.2.2" -MONERO_COM_BUILD_NUMBER=30 +MONERO_COM_VERSION="1.2.7" +MONERO_COM_BUILD_NUMBER=35 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.5.3" -CAKEWALLET_BUILD_NUMBER=135 +CAKEWALLET_VERSION="4.5.8" +CAKEWALLET_BUILD_NUMBER=140 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" HAVEN_NAME="Haven" diff --git a/scripts/ios/build_haven.sh b/scripts/ios/build_haven.sh index cc79d7a26..8de8b4c83 100755 --- a/scripts/ios/build_haven.sh +++ b/scripts/ios/build_haven.sh @@ -4,7 +4,7 @@ HAVEN_URL="https://github.com/haven-protocol-org/haven-main.git" HAVEN_DIR_PATH="${EXTERNAL_IOS_SOURCE_DIR}/haven" -HAVEN_VERSION=tags/v2.2.2 +HAVEN_VERSION=tags/v3.0.7 BUILD_TYPE=release PREFIX=${EXTERNAL_IOS_DIR} DEST_LIB_DIR=${EXTERNAL_IOS_LIB_DIR}/haven diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index e5202a829..d0fa39bfc 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -29,6 +29,7 @@ class SecretKey { SecretKey('anypayToken', () => ''), SecretKey('onramperApiKey', () => ''), SecretKey('ioniaClientId', () => ''), + SecretKey('twitterBearerToken', () => ''), ]; final String name;