Browse Source

Added parser to extract i18n strings (#1710)

* Added parser to extract i18n strings

* Fixed issues with eslint for config file

* Moved i18n locales to apps/public folder

* Updated script to have i18n strings as default value
Eswara Sai 5 years ago
parent
commit
2a4d761e0f
65 changed files with 1841 additions and 61 deletions
  1. 1 0
      .eslintignore
  2. 89 0
      i18next-scanner.config.js
  3. 2 0
      package.json
  4. 1 1
      packages/app-123code/src/translate.ts
  5. 1 1
      packages/app-accounts/src/Vanity/translate.ts
  6. 1 1
      packages/app-accounts/src/translate.ts
  7. 1 1
      packages/app-address-book/src/translate.ts
  8. 1 1
      packages/app-claims/src/translate.ts
  9. 1 1
      packages/app-contracts/src/translate.ts
  10. 1 1
      packages/app-council/src/translate.ts
  11. 1 1
      packages/app-dashboard/src/translate.ts
  12. 1 1
      packages/app-democracy/src/translate.ts
  13. 1 1
      packages/app-explorer/src/NodeInfo/translate.ts
  14. 1 1
      packages/app-explorer/src/translate.ts
  15. 1 1
      packages/app-extrinsics/src/translate.ts
  16. 1 1
      packages/app-generic-asset/src/translate.ts
  17. 1 1
      packages/app-js/src/translate.ts
  18. 1 1
      packages/app-parachains/src/translate.ts
  19. 1 1
      packages/app-settings/src/translate.ts
  20. 1 1
      packages/app-staking/src/translate.ts
  21. 1 1
      packages/app-storage/src/translate.ts
  22. 1 1
      packages/app-sudo/src/translate.ts
  23. 1 1
      packages/app-toolbox/src/Rpc/translate.ts
  24. 1 1
      packages/app-toolbox/src/translate.ts
  25. 1 1
      packages/app-treasury/src/translate.ts
  26. 0 0
      packages/apps/public/locales/en/app-123code.json
  27. 81 0
      packages/apps/public/locales/en/app-accounts.json
  28. 18 0
      packages/apps/public/locales/en/app-address-book.json
  29. 15 0
      packages/apps/public/locales/en/app-claims.json
  30. 55 0
      packages/apps/public/locales/en/app-contracts.json
  31. 34 0
      packages/apps/public/locales/en/app-council.json
  32. 0 0
      packages/apps/public/locales/en/app-dashboard.json
  33. 34 0
      packages/apps/public/locales/en/app-democracy.json
  34. 44 0
      packages/apps/public/locales/en/app-explorer.json
  35. 9 0
      packages/apps/public/locales/en/app-extrinsics.json
  36. 24 0
      packages/apps/public/locales/en/app-generic-asset.json
  37. 8 0
      packages/apps/public/locales/en/app-js.json
  38. 11 0
      packages/apps/public/locales/en/app-parachains.json
  39. 24 0
      packages/apps/public/locales/en/app-settings.json
  40. 91 0
      packages/apps/public/locales/en/app-staking.json
  41. 8 0
      packages/apps/public/locales/en/app-storage.json
  42. 10 0
      packages/apps/public/locales/en/app-sudo.json
  43. 41 0
      packages/apps/public/locales/en/app-toolbox.json
  44. 0 0
      packages/apps/public/locales/en/app-transfer.json
  45. 36 0
      packages/apps/public/locales/en/app-treasury.json
  46. 0 0
      packages/apps/public/locales/en/apps-routing.json
  47. 12 1
      packages/apps/public/locales/en/apps.json
  48. 0 0
      packages/apps/public/locales/en/react-api.json
  49. 63 0
      packages/apps/public/locales/en/react-components.json
  50. 8 0
      packages/apps/public/locales/en/react-params.json
  51. 0 0
      packages/apps/public/locales/en/react-query.json
  52. 25 0
      packages/apps/public/locales/en/react-signer.json
  53. 0 1
      packages/apps/public/locales/en/staking.json
  54. 0 1
      packages/apps/public/locales/en/storage.json
  55. 0 1
      packages/apps/public/locales/en/toolbox.json
  56. 568 1
      packages/apps/public/locales/en/ui.json
  57. 0 1
      packages/apps/public/locales/en/validators.json
  58. 0 1
      packages/apps/public/locales/en/vanitygen.json
  59. 1 1
      packages/apps/src/Content/index.tsx
  60. 1 1
      packages/apps/src/translate.ts
  61. 36 6
      packages/react-components/src/i18n.ts
  62. 1 1
      packages/react-components/src/translate.ts
  63. 1 1
      packages/react-params/src/translate.ts
  64. 1 1
      packages/react-signer/src/translate.ts
  65. 467 21
      yarn.lock

+ 1 - 0
.eslintignore

@@ -1,3 +1,4 @@
 **/build/*
 **/coverage/*
 **/node_modules/*
+i18next-scanner.config.js

+ 89 - 0
i18next-scanner.config.js

@@ -0,0 +1,89 @@
+const fs = require('fs');
+const path = require('path');
+const typescript = require('typescript');
+
+module.exports = {
+  input: [
+    'packages/*/src/**/*.{ts,tsx}',
+    // Use ! to filter out files or directories
+    '!packages/*/src/**/*.spec.{ts,tsx}',
+    '!packages/*/src/i18n/**',
+    '!**/node_modules/**'
+  ],
+  output: './',
+  options: {
+    debug: true,
+    func: {
+      list: ['t', 'i18next.t', 'i18n.t'],
+      extensions: ['.tsx']
+    },
+    trans: {
+      component: 'Trans'
+    },
+    lngs: ['en'],
+    defaultLng: 'en',
+    ns: [
+      'app-123code',
+      'app-accounts',
+      'app-address-book',
+      'app-claims',
+      'app-contracts',
+      'app-council',
+      'app-dashboard',
+      'app-democracy',
+      'app-explorer',
+      'app-extrinsics',
+      'app-generic-asset',
+      'app-js',
+      'app-parachains',
+      'app-settings',
+      'app-staking',
+      'app-storage',
+      'app-sudo',
+      'app-toolbox',
+      'app-transfer',
+      'app-treasury',
+      'apps',
+      'apps-routing',
+      'react-api',
+      'react-components',
+      'react-params',
+      'react-query',
+      'react-signer',
+      'ui'
+    ],
+    defaultNs: 'ui',
+    resource: {
+      loadPath: 'packages/apps/public/locales/{{lng}}/{{ns}}.json',
+      savePath: 'packages/apps/public/locales/{{lng}}/{{ns}}.json',
+      jsonIndent: 2,
+      lineEnding: '\n'
+    },
+    nsSeparator: false, // namespace separator
+    keySeparator: false // key separator
+  },
+  transform: function transform (file, enc, done) {
+    const { ext } = path.parse(file.path);
+
+    if (ext === '.tsx') {
+      const content = fs.readFileSync(file.path, enc);
+
+      const { outputText } = typescript.transpileModule(content, {
+        compilerOptions: {
+          target: 'es2018'
+        },
+        fileName: path.basename(file.path)
+      });
+
+      const parserHandler = (key, options) => {
+        options.defaultValue = key;
+        options.ns = /packages\/(.*?)\/src/g.exec(file.path)[1];
+        this.parser.set(key, options);
+      };
+
+      this.parser.parseFuncFromString(outputText, parserHandler);
+    }
+
+    done();
+  }
+};

+ 2 - 0
package.json

@@ -25,6 +25,7 @@
     "build": "NODE_ENV=production polkadot-dev-build-ts",
     "check": "yarn lint",
     "clean": "polkadot-dev-clean-build",
+    "i18n-scanner": "i18next-scanner --config i18next-scanner.config.js",
     "lint": "eslint --ext .js,.jsx,.ts,.tsx . && tsc --noEmit --pretty",
     "postinstall": "polkadot-dev-yarn-only",
     "test": "echo \"skipping tests\"",
@@ -40,6 +41,7 @@
     "empty": "^0.10.1",
     "gh-pages": "^2.1.1",
     "html-loader": "^0.5.5",
+    "i18next-scanner": "^2.10.3",
     "markdown-loader": "^5.1.0",
     "postcss": "^7.0.18",
     "postcss-clean": "^1.1.0",

+ 1 - 1
packages/app-123code/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['123code', 'ui']);
+export default withTranslation(['app-123code']);

+ 1 - 1
packages/app-accounts/src/Vanity/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['vanitygen', 'ui']);
+export default withTranslation(['app-accounts']);

+ 1 - 1
packages/app-accounts/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['accounts', 'ui']);
+export default withTranslation(['app-accounts']);

+ 1 - 1
packages/app-address-book/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['address-book', 'ui']);
+export default withTranslation(['app-address-book']);

+ 1 - 1
packages/app-claims/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['sudo', 'ui']);
+export default withTranslation(['app-claims']);

+ 1 - 1
packages/app-contracts/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['contracts', 'ui']);
+export default withTranslation(['app-contracts']);

+ 1 - 1
packages/app-council/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['council', 'ui']);
+export default withTranslation(['app-council']);

+ 1 - 1
packages/app-dashboard/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['dashboard', 'ui']);
+export default withTranslation(['app-dashboard']);

+ 1 - 1
packages/app-democracy/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['democracy', 'ui']);
+export default withTranslation(['app-democracy']);

+ 1 - 1
packages/app-explorer/src/NodeInfo/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['status', 'ui']);
+export default withTranslation(['app-explorer']);

+ 1 - 1
packages/app-explorer/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['explorer', 'ui']);
+export default withTranslation(['app-explorer']);

+ 1 - 1
packages/app-extrinsics/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['extrinsics', 'ui']);
+export default withTranslation(['app-extrinsics']);

+ 1 - 1
packages/app-generic-asset/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['generic-asset', 'ui']);
+export default withTranslation(['app-generic-asset']);

+ 1 - 1
packages/app-js/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['js', 'ui']);
+export default withTranslation(['app-js']);

+ 1 - 1
packages/app-parachains/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['parachains', 'ui']);
+export default withTranslation(['app-parachains']);

+ 1 - 1
packages/app-settings/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['settings', 'ui']);
+export default withTranslation(['app-settings']);

+ 1 - 1
packages/app-staking/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['staking', 'ui']);
+export default withTranslation(['app-staking']);

+ 1 - 1
packages/app-storage/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['storage', 'ui']);
+export default withTranslation(['app-storage']);

+ 1 - 1
packages/app-sudo/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['sudo', 'ui']);
+export default withTranslation(['app-sudo']);

+ 1 - 1
packages/app-toolbox/src/Rpc/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['rpc', 'ui']);
+export default withTranslation(['app-toolbox']);

+ 1 - 1
packages/app-toolbox/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['toolbox', 'ui']);
+export default withTranslation(['app-toolbox']);

+ 1 - 1
packages/app-treasury/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['democracy', 'ui']);
+export default withTranslation(['app-treasury']);

+ 0 - 0
packages/apps/public/locales/en/accounts.json → packages/apps/public/locales/en/app-123code.json


+ 81 - 0
packages/apps/public/locales/en/app-accounts.json

@@ -0,0 +1,81 @@
+{
+  "account forgotten": "account forgotten",
+  "Forget this account": "Forget this account",
+  "Create a backup file for this account": "Create a backup file for this account",
+  "Change this account's password": "Change this account's password",
+  "send": "send",
+  "Send funds from this account": "Send funds from this account",
+  "It is recommended that you create/store your accounts securely and externally from the app. On {{yourBrowser}} the following browser extensions are available for use -": "It is recommended that you create/store your accounts securely and externally from the app. On {{yourBrowser}} the following browser extensions are available for use -",
+  "Accounts injected from any of these extensions will appear in this application and be available for use. The above list is updated as more extensions with external signing capability become available.": "Accounts injected from any of these extensions will appear in this application and be available for use. The above list is updated as more extensions with external signing capability become available.",
+  "Learn more...": "Learn more...",
+  "My accounts": "My accounts",
+  "Vanity address": "Vanity address",
+  "account backed up": "account backed up",
+  "Backup account": "Backup account",
+  "Cancel": "Cancel",
+  "Download": "Download",
+  "An encrypted backup file will be created once you have pressed the \"Download\" button. This can be used to re-import your account on any other machine.": "An encrypted backup file will be created once you have pressed the \"Download\" button. This can be used to re-import your account on any other machine.",
+  "Save this backup file in a secure location. Additionally, the password associated with this account is needed together with this backup file in order to restore your account.": "Save this backup file in a secure location. Additionally, the password associated with this account is needed together with this backup file in order to restore your account.",
+  "The account password as specified when creating the account. This is used to encrypt the backup file and subsequently decrypt it when restoring the account.": "The account password as specified when creating the account. This is used to encrypt the backup file and subsequently decrypt it when restoring the account.",
+  "password": "password",
+  "password changed": "password changed",
+  "Change account password": "Change account password",
+  "Change": "Change",
+  "This will apply to any future use of this account as stored on this browser. Ensure that you securely store this new password and that it is strong and unique to the account.": "This will apply to any future use of this account as stored on this browser. Ensure that you securely store this new password and that it is strong and unique to the account.",
+  "The existing account password as specified when this account was created or when it was last changed.": "The existing account password as specified when this account was created or when it was last changed.",
+  "your current password": "your current password",
+  "The new account password. Once set, all future account unlocks will be performed with this new password.": "The new account password. Once set, all future account unlocks will be performed with this new password.",
+  "your new password": "your new password",
+  "created account": "created account",
+  "Add an account via seed": "Add an account via seed",
+  "Name given to this account. You can edit it. To use the account to validate or nominate, it is a good practice to append the function of the account in the name, e.g \"name_you_want - stash\".": "Name given to this account. You can edit it. To use the account to validate or nominate, it is a good practice to append the function of the account in the name, e.g \"name_you_want - stash\".",
+  "name": "name",
+  "The private key for your account is derived from this seed. This seed must be kept secret as anyone in its possession has access to the funds of this account. If you validate, use the seed of the session account as the \"--key\" parameter of your node.": "The private key for your account is derived from this seed. This seed must be kept secret as anyone in its possession has access to the funds of this account. If you validate, use the seed of the session account as the \"--key\" parameter of your node.",
+  "mnemonic seed": "mnemonic seed",
+  "development seed": "development seed",
+  "seed (hex or string)": "seed (hex or string)",
+  "Development": "Development",
+  "Mnemonic": "Mnemonic",
+  "Raw seed": "Raw seed",
+  "This password is used to encrypt your private key. It must be strong and unique! You will need it to sign transactions with this account. You can recover this account using this password together with the backup file (generated in the next step).": "This password is used to encrypt your private key. It must be strong and unique! You will need it to sign transactions with this account. You can recover this account using this password together with the backup file (generated in the next step).",
+  "Advanced creation options": "Advanced creation options",
+  "Determines what cryptography will be used to create this account. Note that to validate on Polkadot, the session account must use \"ed25519\".": "Determines what cryptography will be used to create this account. Note that to validate on Polkadot, the session account must use \"ed25519\".",
+  "keypair crypto type": "keypair crypto type",
+  "You can set a custom derivation path for this account using the following syntax \"/<soft-key>//<hard-key>\". The \"/<soft-key>\" and \"//<hard-key>\" may be repeated and mixed`.": "You can set a custom derivation path for this account using the following syntax \"/<soft-key>//<hard-key>\". The \"/<soft-key>\" and \"//<hard-key>\" may be repeated and mixed`.",
+  "secret derivation path": "secret derivation path",
+  "Save": "Save",
+  "Important notice": "Important notice",
+  "We will provide you with a generated backup file after your account is created. As long as you have access to your account you can always download this file later by clicking on \"Backup\" button from the Accounts section.": "We will provide you with a generated backup file after your account is created. As long as you have access to your account you can always download this file later by clicking on \"Backup\" button from the Accounts section.",
+  "Please make sure to save this file in a secure location as it is required, together with your password, to restore your account.": "Please make sure to save this file in a secure location as it is required, together with your password, to restore your account.",
+  "Create and backup account": "Create and backup account",
+  "account restored": "account restored",
+  "Add via backup file": "Add via backup file",
+  "Restore": "Restore",
+  "Select the JSON key file that was downloaded when you created the account. This JSON file contains your private key encrypted with your password.": "Select the JSON key file that was downloaded when you created the account. This JSON file contains your private key encrypted with your password.",
+  "backup file": "backup file",
+  "Type the password chosen at the account creation. It was used to encrypt your account's private key in the backup file.": "Type the password chosen at the account creation. It was used to encrypt your account's private key in the backup file.",
+  "Add account via Qr": "Add account via Qr",
+  "Name given to this account. You can change it at any point in the future.": "Name given to this account. You can change it at any point in the future.",
+  "Create": "Create",
+  "available ": "available ",
+  "Send funds": "Send funds",
+  "The account you will send funds from.": "The account you will send funds from.",
+  "send from account": "send from account",
+  "Select a contact or paste the address you want to send funds to.": "Select a contact or paste the address you want to send funds to.",
+  "send to address": "send to address",
+  "Type the amount you want to transfer. Note that you can select the unit on the right e.g sending 1 mili is equivalent to sending 0.001.": "Type the amount you want to transfer. Note that you can select the unit on the right e.g sending 1 mili is equivalent to sending 0.001.",
+  "amount": "amount",
+  "Make Transfer": "Make Transfer",
+  "Add account": "Add account",
+  "Restore JSON": "Restore JSON",
+  "Add via Qr": "Add via Qr",
+  "Query Ledger": "Query Ledger",
+  "No account yet?": "No account yet?",
+  "Stop generation": "Stop generation",
+  "Start generation": "Start generation",
+  "Type here what you would like your address to contain. This tool will generate the keys and show the associated addresses that best match your search. You can use \"?\" as a wildcard for a character.": "Type here what you would like your address to contain. This tool will generate the keys and show the associated addresses that best match your search. You can use \"?\" as a wildcard for a character.",
+  "Search for": "Search for",
+  "Should the search be case sensitive, e.g if you select \"no\" your search for \"Some\" may return addresses containing \"somE\" or \"sOme\"...": "Should the search be case sensitive, e.g if you select \"no\" your search for \"Some\" may return addresses containing \"somE\" or \"sOme\"...",
+  "case sensitive": "case sensitive",
+  "Evaluated {{count}} keys in {{elapsed}}s ({{avg}} keys/s)": "Evaluated {{count}} keys in {{elapsed}}s ({{avg}} keys/s)"
+}

+ 18 - 0
packages/apps/public/locales/en/app-address-book.json

@@ -0,0 +1,18 @@
+{
+  "address forgotten": "address forgotten",
+  "Forget this address": "Forget this address",
+  "deposit": "deposit",
+  "Send funds to this address": "Send funds to this address",
+  "My contacts": "My contacts",
+  "address edited": "address edited",
+  "address created": "address created",
+  "Add an address": "Add an address",
+  "Paste here the address of the contact you want to add to your address book.": "Paste here the address of the contact you want to add to your address book.",
+  "address": "address",
+  "Type the name of your contact. This name will be used across all the apps. It can be edited later on.": "Type the name of your contact. This name will be used across all the apps. It can be edited later on.",
+  "name": "name",
+  "Cancel": "Cancel",
+  "Save": "Save",
+  "Add contact": "Add contact",
+  "No contacts found.": "No contacts found."
+}

+ 15 - 0
packages/apps/public/locales/en/app-claims.json

@@ -0,0 +1,15 @@
+{
+  "Your Ethereum account": "Your Ethereum account",
+  "has a valid claim for": "has a valid claim for",
+  "does not appear to have a valid claim. Please double check that you have signed the transaction correctly on the correct ETH account.": "does not appear to have a valid claim. Please double check that you have signed the transaction correctly on the correct ETH account.",
+  "Redeem": "Redeem",
+  "1. Select your {{chain}} account": "1. Select your {{chain}} account",
+  "The account you want to claim to.": "The account you want to claim to.",
+  "claim to account": "claim to account",
+  "Continue": "Continue",
+  "2. Sign ETH transaction": "2. Sign ETH transaction",
+  "copied": "copied",
+  "click to copy": "click to copy",
+  "Copy the above string and sign an Ethereum transaction with the account you used during the pre-sale in the wallet of your choice, using the string as the payload, and then paste the transaction signature object below": "Copy the above string and sign an Ethereum transaction with the account you used during the pre-sale in the wallet of your choice, using the string as the payload, and then paste the transaction signature object below",
+  "Confirm claim": "Confirm claim"
+}

+ 55 - 0
packages/apps/public/locales/en/app-contracts.json

@@ -0,0 +1,55 @@
+{
+  "invalid ABI file selected": "invalid ABI file selected",
+  "click to select or drag and drop a JSON ABI file": "click to select or drag and drop a JSON ABI file",
+  "The code hash for the on-chain deployed code.": "The code hash for the on-chain deployed code.",
+  "code hash": "code hash",
+  "Save": "Save",
+  "Add an existing code hash": "Add an existing code hash",
+  "Forget this code hash": "Forget this code hash",
+  "deploy": "deploy",
+  "Deploy this code hash as a smart contract": "Deploy this code hash as a smart contract",
+  "No code hashes available": "No code hashes available",
+  "Upload WASM": "Upload WASM",
+  "The compiled WASM for the contract that you wish to deploy. Each unique code blob will be attached with a code hash that can be used to create new instances.": "The compiled WASM for the contract that you wish to deploy. Each unique code blob will be attached with a code hash that can be used to create new instances.",
+  "compiled contract WASM": "compiled contract WASM",
+  "The code is not recognized as being in valid WASM format": "The code is not recognized as being in valid WASM format",
+  "Upload": "Upload",
+  "Unable to find on-chain WASM code for the supplied codeHash": "Unable to find on-chain WASM code for the supplied codeHash",
+  "The codeHash is not a valid hex hash": "The codeHash is not a valid hex hash",
+  "The address for the deployed contract instance.": "The address for the deployed contract instance.",
+  "contract address": "contract address",
+  "Add an existing contract": "Add an existing contract",
+  "Call a contract": "Call a contract",
+  "Specify the user account to use for this contract call. And fees will be deducted from this account.": "Specify the user account to use for this contract call. And fees will be deducted from this account.",
+  "call from account": "call from account",
+  "A deployed contract that has either been deployed or attached. The address and ABI are used to construct the parameters.": "A deployed contract that has either been deployed or attached. The address and ABI are used to construct the parameters.",
+  "contract to use": "contract to use",
+  "The message to send to this contract. Parameters are adjusted based on the ABI provided.": "The message to send to this contract. Parameters are adjusted based on the ABI provided.",
+  "message to send": "message to send",
+  "The allotted value for this contract, i.e. the amount transferred to the contract as part of this call.": "The allotted value for this contract, i.e. the amount transferred to the contract as part of this call.",
+  "value": "value",
+  "The maximum amount of gas that can be used by this deployment, if the code requires more, the deployment will fail.": "The maximum amount of gas that can be used by this deployment, if the code requires more, the deployment will fail.",
+  "maximum gas allowed": "maximum gas allowed",
+  "Cancel": "Cancel",
+  "Call": "Call",
+  "address forgotten": "address forgotten",
+  "Forget this contract": "Forget this contract",
+  "execute": "execute",
+  "Call a method on this contract": "Call a method on this contract",
+  "No contracts available": "No contracts available",
+  "Deploy a code hash": "Deploy a code hash",
+  "Unable to find deployed contract code at the specified address": "Unable to find deployed contract code at the specified address",
+  "The value is not in a valid address format": "The value is not in a valid address format",
+  "The contract WASM previously deployed. Internally this is identified by the hash of the code, as either created or attached.": "The contract WASM previously deployed. Internally this is identified by the hash of the code, as either created or attached.",
+  "code for this contract": "code for this contract",
+  "The deployment constructor information for this contract, as provided by the ABI.": "The deployment constructor information for this contract, as provided by the ABI.",
+  "The allotted endownment for this contract, i.e. the amount transferred to the contract upon instantiation.": "The allotted endownment for this contract, i.e. the amount transferred to the contract upon instantiation.",
+  "endowment": "endowment",
+  "Deploy": "Deploy",
+  "Specify the user account to use for this deployment. And fees will be deducted from this account.": "Specify the user account to use for this deployment. And fees will be deducted from this account.",
+  "deployment account": "deployment account",
+  "Confirm ABI removal": "Confirm ABI removal",
+  "You are about to remove this code's ABI. Once completed, should you need to access it again, you will have to manually re-upload it.": "You are about to remove this code's ABI. Once completed, should you need to access it again, you will have to manually re-upload it.",
+  "This operaion does not impact the associated on-chain code or any of its contracts.": "This operaion does not impact the associated on-chain code or any of its contracts.",
+  "Remove": "Remove"
+}

+ 34 - 0
packages/apps/public/locales/en/app-council.json

@@ -0,0 +1,34 @@
+{
+  "Council overview": "Council overview",
+  "Motions": "Motions",
+  "No council motions": "No council motions",
+  "ayes ({{ayes}}/{{threshold}} to approve)": "ayes ({{ayes}}/{{threshold}} to approve)",
+  "Aye": "Aye",
+  "nays ({{nays}})": "nays ({{nays}})",
+  "Nay": "Nay",
+  "Propose a council motion": "Propose a council motion",
+  "threshold": "threshold",
+  "The minimum number of council votes required to approve this motion": "The minimum number of council votes required to approve this motion",
+  "Positive number between 1 and {{memberCount}}": "Positive number between 1 and {{memberCount}}",
+  "proposal": "proposal",
+  "candidate": "candidate",
+  "active until": "active until",
+  "council member": "council member",
+  "No members found": "No members found",
+  "members": "members",
+  "candidates": "candidates",
+  "Submit your council candidacy": "Submit your council candidacy",
+  "Candidate account": "Candidate account",
+  "This account will be nominated to fill the council slot you specify.": "This account will be nominated to fill the council slot you specify.",
+  "Submit candidacy": "Submit candidacy",
+  "seats": "seats",
+  "voting round": "voting round",
+  "term duration": "term duration",
+  "Vote for current candidates": "Vote for current candidates",
+  "Voting account": "Voting account",
+  "This account will be use to approve or disapprove each candidate.": "This account will be use to approve or disapprove each candidate.",
+  "Vote": "Vote",
+  "You have already voted in this round": "You have already voted in this round",
+  "Retract vote": "Retract vote",
+  "No vote": "No vote"
+}

+ 0 - 0
packages/apps/public/locales/en/addresses.json → packages/apps/public/locales/en/app-dashboard.json


+ 34 - 0
packages/apps/public/locales/en/app-democracy.json

@@ -0,0 +1,34 @@
+{
+  "Democracy overview": "Democracy overview",
+  "depositors": "depositors",
+  "balance": "balance",
+  "No available proposals": "No available proposals",
+  "proposals": "proposals",
+  "Submit proposal": "Submit proposal",
+  "propose": "propose",
+  "The amount that will be bonded to submit the proposal": "The amount that will be bonded to submit the proposal",
+  "value": "value",
+  "ending at": "ending at",
+  "block #{{blockNumber}}, {{remaining}} blocks remaining": "block #{{blockNumber}}, {{remaining}} blocks remaining",
+  "activate at (if passed)": "activate at (if passed)",
+  "block #{{blockNumber}}": "block #{{blockNumber}}",
+  "vote threshold": "vote threshold",
+  "No available referendums": "No available referendums",
+  "referendum": "referendum",
+  "Second proposal": "Second proposal",
+  "Select the account you wish to second with. This will lock your funds until the proposal is either approved or rejected": "Select the account you wish to second with. This will lock your funds until the proposal is either approved or rejected",
+  "second with account": "second with account",
+  "Cancel": "Cancel",
+  "Second": "Second",
+  "referenda": "referenda",
+  "active": "active",
+  "launch period": "launch period",
+  "Vote on proposal": "Vote on proposal",
+  "Select the account you wish to vote with. You can approve \"aye\" or deny \"nay\" the proposal.": "Select the account you wish to vote with. You can approve \"aye\" or deny \"nay\" the proposal.",
+  "vote with account": "vote with account",
+  "Select your vote preferences for this proposal, either to approve or disapprove": "Select your vote preferences for this proposal, either to approve or disapprove",
+  "record my vote as": "record my vote as",
+  "Aye, I approve": "Aye, I approve",
+  "Nay, I do not approve": "Nay, I do not approve",
+  "Vote": "Vote"
+}

+ 44 - 0
packages/apps/public/locales/en/app-explorer.json

@@ -0,0 +1,44 @@
+{
+  "events": "events",
+  "index": "index",
+  "Details": "Details",
+  "mortal, valid from #{{startAt}} to #{{endsAt}}": "mortal, valid from #{{startAt}} to #{{endsAt}}",
+  "mortal": "mortal",
+  "immortal": "immortal",
+  "No pending extrinsics are in the queue": "No pending extrinsics are in the queue",
+  "extrinsics": "extrinsics",
+  "logs": "logs",
+  "no events available": "no events available",
+  "blocks": "blocks",
+  "forks": "forks",
+  "Chain info": "Chain info",
+  "Block details": "Block details",
+  "Forks": "Forks",
+  "Node info": "Node info",
+  "recent blocks": "recent blocks",
+  "recent events": "recent events",
+  "pending extrinsics": "pending extrinsics",
+  "connected peers": "connected peers",
+  "role": "role",
+  "peer id": "peer id",
+  "best #": "best #",
+  "best hash": "best hash",
+  "no peers connected": "no peers connected",
+  "refresh in": "refresh in",
+  "total peers": "total peers",
+  "syncing": "syncing",
+  "yes": "yes",
+  "no": "no",
+  "queued tx": "queued tx",
+  "peer best": "peer best",
+  "our best": "our best",
+  "block hash or number to query": "block hash or number to query",
+  "last block": "last block",
+  "target": "target",
+  "total issuance": "total issuance",
+  "finalized": "finalized",
+  "best": "best",
+  "epoch": "epoch",
+  "session": "session",
+  "era": "era"
+}

+ 9 - 0
packages/apps/public/locales/en/app-extrinsics.json

@@ -0,0 +1,9 @@
+{
+  "Extrinsic submission": "Extrinsic submission",
+  "using the selected account": "using the selected account",
+  "with an account balance": "with an account balance",
+  "with a transaction nonce": "with a transaction nonce",
+  "submit the following extrinsic": "submit the following extrinsic",
+  "Submit Unsigned": "Submit Unsigned",
+  "Submit Transaction": "Submit Transaction"
+}

+ 24 - 0
packages/apps/public/locales/en/app-generic-asset.json

@@ -0,0 +1,24 @@
+{
+  "Forget this asset": "Forget this asset",
+  "Asset ID": "Asset ID",
+  "Register Asset": "Register Asset",
+  "No assets found.": "No assets found.",
+  "Assets": "Assets",
+  "Transfer": "Transfer",
+  "Register an Asset": "Register an Asset",
+  "Enter the Asset ID of the token you want to manage.": "Enter the Asset ID of the token you want to manage.",
+  "asset id": "asset id",
+  "Type the name of this Asset. This name will be used across all the apps. It can be edited later on.": "Type the name of this Asset. This name will be used across all the apps. It can be edited later on.",
+  "name": "name",
+  "Cancel": "Cancel",
+  "Register": "Register",
+  "available ": "available ",
+  "The account you will send funds from.": "The account you will send funds from.",
+  "send from account": "send from account",
+  "Select a contact or paste the address you want to send funds to.": "Select a contact or paste the address you want to send funds to.",
+  "send to address": "send to address",
+  "Enter the Asset ID of the token you want to transfer.": "Enter the Asset ID of the token you want to transfer.",
+  "Type the amount you want to transfer. Note that you can select the unit on the right e.g sending 1 mili is equivalent to sending 0.001.": "Type the amount you want to transfer. Note that you can select the unit on the right e.g sending 1 mili is equivalent to sending 0.001.",
+  "amount": "amount",
+  "Make Transfer": "Make Transfer"
+}

+ 8 - 0
packages/apps/public/locales/en/app-js.json

@@ -0,0 +1,8 @@
+{
+  "Generate link to share code example": "Generate link to share code example",
+  "Copied to clipboard": "Copied to clipboard",
+  "Delete this custom example": "Delete this custom example",
+  "Name your example": "Name your example",
+  "Save snippet to local storage": "Save snippet to local storage",
+  "Select example": "Select example"
+}

+ 11 - 0
packages/apps/public/locales/en/app-parachains.json

@@ -0,0 +1,11 @@
+{
+  "Parachains overview": "Parachains overview",
+  "the last heads of this parachain": "the last heads of this parachain",
+  "heads": "heads",
+  "<unknown>": "<unknown>",
+  "the relay dispatch queue size": "the relay dispatch queue size",
+  "relay queue": "relay queue",
+  "no deployed parachains": "no deployed parachains",
+  "parachains": "parachains",
+  "next id": "next id"
+}

+ 24 - 0
packages/apps/public/locales/en/app-settings.json

@@ -0,0 +1,24 @@
+{
+  "This is not a valid JSON object.": "This is not a valid JSON object.",
+  "Your custom types have been added": "Your custom types have been added",
+  "Save the type definitions for your custom structures as key-value pairs in a valid JSON file. The key should be the name of your custom structure and the value an object containing your type definitions.": "Save the type definitions for your custom structures as key-value pairs in a valid JSON file. The key should be the name of your custom structure and the value an object containing your type definitions.",
+  "Additional types as a JSON file (or edit below)": "Additional types as a JSON file (or edit below)",
+  "Reset": "Reset",
+  "Save": "Save",
+  "Override the default ss58 prefix for address generation": "Override the default ss58 prefix for address generation",
+  "address prefix": "address prefix",
+  "Override the default identity icon display with a specific theme": "Override the default identity icon display with a specific theme",
+  "default icon theme": "default icon theme",
+  "Adjust the mode from basic (with a limited number of beginner-user-friendly apps) to full (with all basic & advanced apps available)": "Adjust the mode from basic (with a limited number of beginner-user-friendly apps) to full (with all basic & advanced apps available)",
+  "interface operation mode": "interface operation mode",
+  "Manage your connection to Ledger S": "Manage your connection to Ledger S",
+  "manage hardware connections": "manage hardware connections",
+  "default interface language": "default interface language",
+  "Cancel": "Cancel",
+  "Save & Reload": "Save & Reload",
+  "General": "General",
+  "Developer": "Developer",
+  "Select the remote endpoint, either from the dropdown on manual entered via the custom toggle": "Select the remote endpoint, either from the dropdown on manual entered via the custom toggle",
+  "remote node/endpoint to connect to": "remote node/endpoint to connect to",
+  "custom endpoint": "custom endpoint"
+}

+ 91 - 0
packages/apps/public/locales/en/app-staking.json

@@ -0,0 +1,91 @@
+{
+  "Cancel": "Cancel",
+  "Bond more": "Bond more",
+  "available ": "available ",
+  "Bond more funds": "Bond more funds",
+  "stash account": "stash account",
+  "Amount to add to the currently bonded funds. This is adjusted using the available funds on the account.": "Amount to add to the currently bonded funds. This is adjusted using the available funds on the account.",
+  "additionnal bonded funds": "additionnal bonded funds",
+  "stash": "stash",
+  "session": "session",
+  "nominating": "nominating",
+  "controller": "controller",
+  "Stop Nominating": "Stop Nominating",
+  "Stop Validating": "Stop Validating",
+  "Set Session Key": "Set Session Key",
+  "Validate": "Validate",
+  "Nominate": "Nominate",
+  "Unbond funds": "Unbond funds",
+  "Change controller account": "Change controller account",
+  "Change reward destination": "Change reward destination",
+  "Change validator preferences": "Change validator preferences",
+  "Rotate session keys": "Rotate session keys",
+  "Change session account": "Change session account",
+  "Change nominee(s)": "Change nominee(s)",
+  "Inject session keys (advanced)": "Inject session keys (advanced)",
+  "ed25519, Edwards": "ed25519, Edwards",
+  "sr15519, Schnorrkel": "sr15519, Schnorrkel",
+  "Inject Keys": "Inject Keys",
+  "suri (seed & derivation)": "suri (seed & derivation)",
+  "key type to set": "key type to set",
+  "Aura": "Aura",
+  "Babe": "Babe",
+  "Grandpa": "Grandpa",
+  "I'm Online": "I'm Online",
+  "Parachains": "Parachains",
+  "crypto type to use": "crypto type to use",
+  "generated public key": "generated public key",
+  "This operation will submit the seed via an RPC call. Do not perform this operation on a public RPC node, but ensure that the node is local, connected to your validator and secure.": "This operation will submit the seed via an RPC call. Do not perform this operation on a public RPC node, but ensure that the node is local, connected to your validator and secure.",
+  "Submit key": "Submit key",
+  "A controller account should not map to another stash. This selected controller is a stash, controlled by {{bondedId}}": "A controller account should not map to another stash. This selected controller is a stash, controlled by {{bondedId}}",
+  "A controller account should not be set to manages multiple stashes. The selected controller is already controlling {{stashId}}": "A controller account should not be set to manages multiple stashes. The selected controller is already controlling {{stashId}}",
+  "For fund security, your session key should not match your stash key.": "For fund security, your session key should not match your stash key.",
+  "The Threshold must be a positive number": "The Threshold must be a positive number",
+  "The Threshold must lower than 11": "The Threshold must lower than 11",
+  "Nominate Validators": "Nominate Validators",
+  "controller account": "controller account",
+  "Stash accounts that are to be nominated. Block rewards are split between validators and nominators": "Stash accounts that are to be nominated. Block rewards are split between validators and nominators",
+  "nominate the following addresses": "nominate the following addresses",
+  "select accounts(s) nominate": "select accounts(s) nominate",
+  "Warning - Changing the controller while validating will modify the associated session account. It is advised to stop validating before changing the controller account.": "Warning - Changing the controller while validating will modify the associated session account. It is advised to stop validating before changing the controller account.",
+  "The controller is the account that will be used to control any nominating or validating actions. Should not match another stash or controller.": "The controller is the account that will be used to control any nominating or validating actions. Should not match another stash or controller.",
+  "Set controller": "Set controller",
+  "Set reward destination": "Set reward destination",
+  "Bonding Preferences": "Bonding Preferences",
+  "The controller is the account that is be used to control any nominating or validating actions. I will sign this transaction.": "The controller is the account that is be used to control any nominating or validating actions. I will sign this transaction.",
+  "The destination account for any payments as either a nominator or validator": "The destination account for any payments as either a nominator or validator",
+  "payment destination": "payment destination",
+  "Changing the key only takes effect at the start of the next session. The input here is generates from the author_rotateKeys command": "Changing the key only takes effect at the start of the next session. The input here is generates from the author_rotateKeys command",
+  "Keys from rotateKeys": "Keys from rotateKeys",
+  "Changing the key only takes effect at the start of the next session. If validating, it must be an ed25519 key.": "Changing the key only takes effect at the start of the next session. If validating, it must be an ed25519 key.",
+  "Session key (ed25519)": "Session key (ed25519)",
+  "Unbond": "Unbond",
+  "The amount of funds to unbond, this is adjusted using the bonded funds on the stash account.": "The amount of funds to unbond, this is adjusted using the bonded funds on the stash account.",
+  "unbond amount": "unbond amount",
+  "Set validator preferences": "Set validator preferences",
+  "The number of time this validator can get slashed before being automatically unstaked (maximum of 10 allowed)": "The number of time this validator can get slashed before being automatically unstaked (maximum of 10 allowed)",
+  "automatic unstake threshold": "automatic unstake threshold",
+  "Amount taken up-front from the reward by the validator before spliting the remainder between themselves and the nominators": "Amount taken up-front from the reward by the validator before spliting the remainder between themselves and the nominators",
+  "reward commission": "reward commission",
+  "New stake": "New stake",
+  "No funds staked yet.": "No funds staked yet.",
+  "The total amount of the stash balance that will be at stake in any forthcoming rounds (should be less than the total amount available)": "The total amount of the stash balance that will be at stake in any forthcoming rounds (should be less than the total amount available)",
+  "value bonded": "value bonded",
+  "Bond": "Bond",
+  "Staking overview": "Staking overview",
+  "Account actions": "Account actions",
+  "Nominators ({{count}})": "Nominators ({{count}})",
+  "Show all validators and intentions": "Show all validators and intentions",
+  "Show only my nominations": "Show only my nominations",
+  "Show only with nominators": "Show only with nominators",
+  "Show only without nominators": "Show only without nominators",
+  "Show only with warnings": "Show only with warnings",
+  "Show only without warnings": "Show only without warnings",
+  "No addresses found": "No addresses found",
+  "validators": "validators",
+  "validator": "validator",
+  "next up": "next up",
+  "intention": "intention",
+  "waiting": "waiting",
+  "last block": "last block"
+}

+ 8 - 0
packages/apps/public/locales/en/app-storage.json

@@ -0,0 +1,8 @@
+{
+  "selected constant query": "selected constant query",
+  "Storage": "Storage",
+  "Constants": "Constants",
+  "Raw storage": "Raw storage",
+  "selected state query": "selected state query",
+  "hex-encoded storage key": "hex-encoded storage key"
+}

+ 10 - 0
packages/apps/public/locales/en/app-sudo.json

@@ -0,0 +1,10 @@
+{
+  "Sudo access": "Sudo access",
+  "Set sudo key": "Set sudo key",
+  "You do not have access to the current sudo key": "You do not have access to the current sudo key",
+  "sudo key": "sudo key",
+  "Reassign": "Reassign",
+  "You will no longer have sudo access": "You will no longer have sudo access",
+  "submit the following change": "submit the following change",
+  "Submit Sudo": "Submit Sudo"
+}

+ 41 - 0
packages/apps/public/locales/en/app-toolbox.json

@@ -0,0 +1,41 @@
+{
+  "The input data to hash. This can be either specified as a hex value (0x-prefix) or as a string.": "The input data to hash. This can be either specified as a hex value (0x-prefix) or as a string.",
+  "from the following data": "from the following data",
+  "Detection on the input string to determine if it is hex or non-hex.": "Detection on the input string to determine if it is hex or non-hex.",
+  "hex input data": "hex input data",
+  "Yes": "Yes",
+  "No": "No",
+  "The blake2b 256-bit hash of the actual input data.": "The blake2b 256-bit hash of the actual input data.",
+  "the resulting hash is": "the resulting hash is",
+  "RPC calls": "RPC calls",
+  "Hash data": "Hash data",
+  "Sign message": "Sign message",
+  "Verify signature": "Verify signature",
+  "sign data from account": "sign data from account",
+  "with an index of": "with an index of",
+  "The actual JSONRPC module and function to make a call to.": "The actual JSONRPC module and function to make a call to.",
+  "call the selected endpoint": "call the selected endpoint",
+  "Submit RPC call": "Submit RPC call",
+  "select the account you wish to sign data with": "select the account you wish to sign data with",
+  "account": "account",
+  "The input data to sign. This can be either specified as a hex value (0x-prefix) or as a string.": "The input data to sign. This can be either specified as a hex value (0x-prefix) or as a string.",
+  "sign the following data": "sign the following data",
+  "The resulting signature of the input data, as done with the crypto algorithm from the account. (This could be non-deterministic for some types such as sr25519).": "The resulting signature of the input data, as done with the crypto algorithm from the account. (This could be non-deterministic for some types such as sr25519).",
+  "signature of supplied data": "signature of supplied data",
+  "You need to unlock this account to be able to sign data.": "You need to unlock this account to be able to sign data.",
+  "Unlock account": "Unlock account",
+  "Cancel": "Cancel",
+  "Unlock": "Unlock",
+  "You are about to unlock your account to allow for the signing of messages. Once active the signature will be generated based on the content provided.": "You are about to unlock your account to allow for the signing of messages. Once active the signature will be generated based on the content provided.",
+  "The account's password specified at the creation of this account.": "The account's password specified at the creation of this account.",
+  "password": "password",
+  "Crypto not detected": "Crypto not detected",
+  "The account that signed the input": "The account that signed the input",
+  "verify using address": "verify using address",
+  "The data that was signed. This is used in combination with the signature for the verification. It can either be hex or a string.": "The data that was signed. This is used in combination with the signature for the verification. It can either be hex or a string.",
+  "using the following data": "using the following data",
+  "The signature as by the account being checked, supplied as a hex-formatted string.": "The signature as by the account being checked, supplied as a hex-formatted string.",
+  "the supplied signature": "the supplied signature",
+  "Cryptography used to create this signature. It is auto-detected on valid signatures.": "Cryptography used to create this signature. It is auto-detected on valid signatures.",
+  "signature crypto type": "signature crypto type"
+}

+ 0 - 0
packages/apps/public/locales/en/democracy.json → packages/apps/public/locales/en/app-transfer.json


+ 36 - 0
packages/apps/public/locales/en/app-treasury.json

@@ -0,0 +1,36 @@
+{
+  "Treasury overview": "Treasury overview",
+  "Edit settings": "Edit settings",
+  "Aye, I approve": "Aye, I approve",
+  "Nay, I do not approve": "Nay, I do not approve",
+  "Approve or reject proposal": "Approve or reject proposal",
+  "Respond": "Respond",
+  "Propose a majority council motion to either approve or reject this spend proposal": "Propose a majority council motion to either approve or reject this spend proposal",
+  "proposed council action": "proposed council action",
+  "Approved": "Approved",
+  "No approved proposals": "No approved proposals",
+  "No pending proposals": "No pending proposals",
+  "Proposals": "Proposals",
+  "Submit a spend proposal": "Submit a spend proposal",
+  "beneficiary": "beneficiary",
+  "The account to which the proposed balance will be transferred if approved": "The account to which the proposed balance will be transferred if approved",
+  "The amount that will be allocated from the treasury pot": "The amount that will be allocated from the treasury pot",
+  "value": "value",
+  "proposals": "proposals",
+  "approved": "approved",
+  "pot": "pot",
+  "using my account": "using my account",
+  "The account used to change your settings": "The account used to change your settings",
+  "configuration": "configuration",
+  "Proposal bond": "Proposal bond",
+  "proposal bond": "proposal bond",
+  "Proposal bond minimum": "Proposal bond minimum",
+  "proposal bond minimum": "proposal bond minimum",
+  "Spend period": "Spend period",
+  "spend period": "spend period",
+  "Burn percentage": "Burn percentage",
+  "burn percentage": "burn percentage",
+  "Submit": "Submit",
+  "Pot": "Pot",
+  "pot size": "pot size"
+}

+ 0 - 0
packages/apps/public/locales/en/explorer.json → packages/apps/public/locales/en/apps-routing.json


+ 12 - 1
packages/apps/public/locales/en/apps.json

@@ -1 +1,12 @@
-{}
+{
+  "Waiting for API to be connected and ready.": "Waiting for API to be connected and ready.",
+  "transfer received": "transfer received",
+  "update on #{{index}}": "update on #{{index}}",
+  "Select Network": "Select Network",
+  "You don't have any accounts. Some features are currently hidden and will only become available once you have accounts.": "You don't have any accounts. Some features are currently hidden and will only become available once you have accounts.",
+  "Create an account now.": "Create an account now.",
+  "Waiting for authorization from the extension. Please open the installed extension and approve or reject access.": "Waiting for authorization from the extension. Please open the installed extension and approve or reject access.",
+  "You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.": "You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.",
+  "With the Firefox browser connecting to insecure WebSockets ({{wsUrl}}) will fail due to the browser not allowing localhost access from a secure site.": "With the Firefox browser connecting to insecure WebSockets ({{wsUrl}}) will fail due to the browser not allowing localhost access from a secure site.",
+  "You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint.": "You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint."
+}

+ 0 - 0
packages/apps/public/locales/en/extrinsics.json → packages/apps/public/locales/en/react-api.json


+ 63 - 0
packages/apps/public/locales/en/react-components.json

@@ -0,0 +1,63 @@
+{
+  "bonded": "bonded",
+  "transactions": "transactions",
+  "type": "type",
+  "{{value}}, {{remaining}} blocks left": "{{value}}, {{remaining}} blocks left",
+  "unstake threshold": "unstake threshold",
+  "commission": "commission",
+  "total": "total",
+  "available": "available",
+  "redeemable": "redeemable",
+  "Redeem these funds": "Redeem these funds",
+  "unbonding": "unbonding",
+  "session keys": "session keys",
+  "reward destination": "reward destination",
+  "or": "or",
+  "extrinsic hash": "extrinsic hash",
+  "lifetime": "lifetime",
+  "tip": "tip",
+  "No items": "No items",
+  "only this network": "only this network",
+  "use on any network": "use on any network",
+  "clipboard": "clipboard",
+  "address copied": "address copied",
+  "You are about to remove this account from your list of available accounts. Once completed, should you need to access it again, you will have to re-create the account either via seed or via a backup file.": "You are about to remove this account from your list of available accounts. Once completed, should you need to access it again, you will have to re-create the account either via seed or via a backup file.",
+  "This operaion does not remove the history of the account from the chain, nor any associated funds from the account. The forget operation only limits your access to the account on this browser.": "This operaion does not remove the history of the account from the chain, nor any associated funds from the account. The forget operation only limits your access to the account on this browser.",
+  "You are about to remove this address from your address book. Once completed, should you need to access it again, you will have to re-add the address.": "You are about to remove this address from your address book. Once completed, should you need to access it again, you will have to re-add the address.",
+  "This operation does not remove the history of the account from the chain, nor any associated funds from the account. The forget operation only limits your access to the address on this browser.": "This operation does not remove the history of the account from the chain, nor any associated funds from the account. The forget operation only limits your access to the address on this browser.",
+  "You are about to remove this contract from your list of available contracts. Once completed, should you need to access it again, you will have to manually add the contract's address in the Instantiate tab.": "You are about to remove this contract from your list of available contracts. Once completed, should you need to access it again, you will have to manually add the contract's address in the Instantiate tab.",
+  "This operaion does not remove the history of the contract from the chain, nor any associated funds from its account. The forget operation only limits your access to the contract on this browser.": "This operaion does not remove the history of the contract from the chain, nor any associated funds from its account. The forget operation only limits your access to the contract on this browser.",
+  "You are about to remove this code from your list of available code hashes. Once completed, should you need to access it again, you will have to manually add the code hash again.": "You are about to remove this code from your list of available code hashes. Once completed, should you need to access it again, you will have to manually add the code hash again.",
+  "This operaion does not remove the uploaded code WASM and ABI from the chain, nor any deployed contracts. The forget operation only limits your access to the code on this browser.": "This operaion does not remove the uploaded code WASM and ABI from the chain, nor any deployed contracts. The forget operation only limits your access to the code on this browser.",
+  "Confirm account removal": "Confirm account removal",
+  "Confirm address removal": "Confirm address removal",
+  "Confirm contract removal": "Confirm contract removal",
+  "Confirm code removal": "Confirm code removal",
+  "Cancel": "Cancel",
+  "Forget": "Forget",
+  "click to select or drag and drop the file here": "click to select or drag and drop the file here",
+  "{{name}} ({{size}} bytes)": "{{name}} ({{size}} bytes)",
+  "Positive number": "Positive number",
+  "View this {{type}} on Polkascan.io": "View this {{type}} on Polkascan.io",
+  "Remove ABI": "Remove ABI",
+  "Reported offline {{count}} times, last at {{blockNumber}}": "Reported offline {{count}} times, last at {{blockNumber}}",
+  "Reported online at #{{blockNumber}}": "Reported online at #{{blockNumber}}",
+  "Reported online in the current session": "Reported online in the current session",
+  "Dismiss all notifications": "Dismiss all notifications",
+  "proposed by": "proposed by",
+  "beneficiary": "beneficiary",
+  "value": "value",
+  "bond": "bond",
+  "Select the account to use for this action.": "Select the account to use for this action.",
+  "using my account": "using my account",
+  "Submit": "Submit",
+  "Vote on council proposal": "Vote on council proposal",
+  "Vote on proposal": "Vote on proposal",
+  "Vote with account": "Vote with account",
+  "Select the account you wish to vote with. You can approve \"aye\" or deny \"nay\" the proposal.": "Select the account you wish to vote with. You can approve \"aye\" or deny \"nay\" the proposal.",
+  "Select your vote preferences for this proposal, either to approve or disapprove": "Select your vote preferences for this proposal, either to approve or disapprove",
+  "record my vote as": "record my vote as",
+  "Vote": "Vote",
+  "Aye, I approve": "Aye, I approve",
+  "Nay, I do not approve": "Nay, I do not approve"
+}

+ 8 - 0
packages/apps/public/locales/en/react-params.json

@@ -0,0 +1,8 @@
+{
+  "{{count}} key/value pairs encoded for submission": "{{count}} key/value pairs encoded for submission",
+  "include option": "include option",
+  "exclude option": "exclude option",
+  "<empty>": "<empty>",
+  "Add item": "Add item",
+  "Remove item": "Remove item"
+}

+ 0 - 0
packages/apps/public/locales/en/signer.json → packages/apps/public/locales/en/react-query.json


+ 25 - 0
packages/apps/public/locales/en/react-signer.json

@@ -0,0 +1,25 @@
+{
+  "The selected account does not exist on your keyring": "The selected account does not exist on your keyring",
+  "The selected account does not have the required balance available for this transaction": "The selected account does not have the required balance available for this transaction",
+  "Submitting this transaction will drop the account balance to below the existential amount ({{existentialDeposit}}), which can result in the account being removed from the chain state and its associated funds burned.": "Submitting this transaction will drop the account balance to below the existential amount ({{existentialDeposit}}), which can result in the account being removed from the chain state and its associated funds burned.",
+  "This account does have a reserved/locked balance, not taken into account": "This account does have a reserved/locked balance, not taken into account",
+  "Fees includes the transaction fee and the per-byte fee": "Fees includes the transaction fee and the per-byte fee",
+  "Fees totalling {{fees}} will be applied to the submission": "Fees totalling {{fees}} will be applied to the submission",
+  "{{total}} estimated total amount (fees + value)": "{{total}} estimated total amount (fees + value)",
+  "Estimation does not account for the transaction weight": "Estimation does not account for the transaction weight",
+  "The deposit is below the {{minimum}} minimum required for the proposal to be evaluated": "The deposit is below the {{minimum}} minimum required for the proposal to be evaluated",
+  "The deposit of {{deposit}} will be reserved until the proposal is completed": "The deposit of {{deposit}} will be reserved until the proposal is completed",
+  "The final recipient balance is less or equal to {{existentialDeposit}} (the existential amount) and will not be reflected": "The final recipient balance is less or equal to {{existentialDeposit}} (the existential amount) and will not be reflected",
+  "A fee of {{creationFee}} will be deducted from the sender since the destination account does not exist": "A fee of {{creationFee}} will be deducted from the sender since the destination account does not exist",
+  "Cancel": "Cancel",
+  "Scan Signature Qr": "Scan Signature Qr",
+  "Submit (no signature)": "Submit (no signature)",
+  "Sign via {{hardwareType}}": "Sign via {{hardwareType}}",
+  "Sign via Qr": "Sign via Qr",
+  "Sign and Submit": "Sign and Submit",
+  "Add a tip to this extrinsic, paying the block author for greater priority": "Add a tip to this extrinsic, paying the block author for greater priority",
+  "Tip (optional)": "Tip (optional)",
+  "wrong password": "wrong password",
+  "sending from my account": "sending from my account",
+  "unlock account with password": "unlock account with password"
+}

+ 0 - 1
packages/apps/public/locales/en/staking.json

@@ -1 +0,0 @@
-{}

+ 0 - 1
packages/apps/public/locales/en/storage.json

@@ -1 +0,0 @@
-{}

+ 0 - 1
packages/apps/public/locales/en/toolbox.json

@@ -1 +0,0 @@
-{}

+ 568 - 1
packages/apps/public/locales/en/ui.json

@@ -1 +1,568 @@
-{}
+{
+  "any text": "",
+  "account forgotten": "",
+  "Forget this account": "",
+  "Create a backup file for this account": "",
+  "Change this account's password": "",
+  "send": "",
+  "Send funds from this account": "",
+  "It is recommended that you create/store your accounts securely and externally from the app. On {{yourBrowser}} the following browser extensions are available for use -": "",
+  "Accounts injected from any of these extensions will appear in this application and be available for use. The above list is updated as more extensions with external signing capability become available.": "",
+  "Learn more...": "",
+  "My accounts": "",
+  "Vanity address": "",
+  "Backup account": "",
+  "Cancel": "",
+  "Download": "",
+  "An encrypted backup file will be created once you have pressed the \"Download\" button. This can be used to re-import your account on any other machine.": "",
+  "Save this backup file in a secure location. Additionally, the password associated with this account is needed together with this backup file in order to restore your account.": "",
+  "The account password as specified when creating the account. This is used to encrypt the backup file and subsequently decrypt it when restoring the account.": "",
+  "password": "",
+  "account backed up": "",
+  "Change account password": "",
+  "Change": "",
+  "This will apply to any future use of this account as stored on this browser. Ensure that you securely store this new password and that it is strong and unique to the account.": "",
+  "The existing account password as specified when this account was created or when it was last changed.": "",
+  "your current password": "",
+  "The new account password. Once set, all future account unlocks will be performed with this new password.": "",
+  "your new password": "",
+  "password changed": "",
+  "created account": "",
+  "Add an account via seed": "",
+  "Name given to this account. You can edit it. To use the account to validate or nominate, it is a good practice to append the function of the account in the name, e.g \"name_you_want - stash\".": "",
+  "name": "",
+  "The private key for your account is derived from this seed. This seed must be kept secret as anyone in its possession has access to the funds of this account. If you validate, use the seed of the session account as the \"--key\" parameter of your node.": "",
+  "mnemonic seed": "",
+  "development seed": "",
+  "seed (hex or string)": "",
+  "Development": "",
+  "Mnemonic": "",
+  "Raw seed": "",
+  "This password is used to encrypt your private key. It must be strong and unique! You will need it to sign transactions with this account. You can recover this account using this password together with the backup file (generated in the next step).": "",
+  "Advanced creation options": "",
+  "Determines what cryptography will be used to create this account. Note that to validate on Polkadot, the session account must use \"ed25519\".": "",
+  "keypair crypto type": "",
+  "You can set a custom derivation path for this account using the following syntax \"/<soft-key>//<hard-key>\". The \"/<soft-key>\" and \"//<hard-key>\" may be repeated and mixed`.": "",
+  "secret derivation path": "",
+  "Save": "",
+  "Important notice": "",
+  "We will provide you with a generated backup file after your account is created. As long as you have access to your account you can always download this file later by clicking on \"Backup\" button from the Accounts section.": "",
+  "Please make sure to save this file in a secure location as it is required, together with your password, to restore your account.": "",
+  "Create and backup account": "",
+  "Add via backup file": "",
+  "Restore": "",
+  "Select the JSON key file that was downloaded when you created the account. This JSON file contains your private key encrypted with your password.": "",
+  "backup file": "",
+  "Type the password chosen at the account creation. It was used to encrypt your account's private key in the backup file.": "",
+  "account restored": "",
+  "Add account via Qr": "",
+  "Name given to this account. You can change it at any point in the future.": "",
+  "Create": "",
+  "available ": "",
+  "Send funds": "",
+  "The account you will send funds from.": "",
+  "send from account": "",
+  "Select a contact or paste the address you want to send funds to.": "",
+  "send to address": "",
+  "Type the amount you want to transfer. Note that you can select the unit on the right e.g sending 1 mili is equivalent to sending 0.001.": "",
+  "amount": "",
+  "Make Transfer": "",
+  "Add account": "",
+  "Restore JSON": "",
+  "Add via Qr": "",
+  "Query Ledger": "",
+  "No account yet?": "",
+  "Stop generation": "",
+  "Start generation": "",
+  "Type here what you would like your address to contain. This tool will generate the keys and show the associated addresses that best match your search. You can use \"?\" as a wildcard for a character.": "",
+  "Search for": "",
+  "Should the search be case sensitive, e.g if you select \"no\" your search for \"Some\" may return addresses containing \"somE\" or \"sOme\"...": "",
+  "case sensitive": "",
+  "Evaluated {{count}} keys in {{elapsed}}s ({{avg}} keys/s)": "",
+  "address forgotten": "",
+  "Forget this address": "",
+  "deposit": "",
+  "Send funds to this address": "",
+  "My contacts": "",
+  "address edited": "",
+  "address created": "",
+  "Add an address": "",
+  "Paste here the address of the contact you want to add to your address book.": "",
+  "address": "",
+  "Type the name of your contact. This name will be used across all the apps. It can be edited later on.": "",
+  "Add contact": "",
+  "No contacts found.": "",
+  "Your Ethereum account": "",
+  "has a valid claim for": "",
+  "does not appear to have a valid claim. Please double check that you have signed the transaction correctly on the correct ETH account.": "",
+  "1. Select your {{chain}} account": "",
+  "The account you want to claim to.": "",
+  "claim to account": "",
+  "Continue": "",
+  "2. Sign ETH transaction": "",
+  "copied": "",
+  "click to copy": "",
+  "Copy the above string and sign an Ethereum transaction with the account you used during the pre-sale in the wallet of your choice, using the string as the payload, and then paste the transaction signature object below": "",
+  "Confirm claim": "",
+  "Redeem": "",
+  "invalid ABI file selected": "",
+  "click to select or drag and drop a JSON ABI file": "",
+  "Add an existing code hash": "",
+  "The code hash for the on-chain deployed code.": "",
+  "code hash": "",
+  "Forget this code hash": "",
+  "deploy": "",
+  "Deploy this code hash as a smart contract": "",
+  "No code hashes available": "",
+  "Upload WASM": "",
+  "The compiled WASM for the contract that you wish to deploy. Each unique code blob will be attached with a code hash that can be used to create new instances.": "",
+  "compiled contract WASM": "",
+  "The code is not recognized as being in valid WASM format": "",
+  "Upload": "",
+  "Unable to find on-chain WASM code for the supplied codeHash": "",
+  "The codeHash is not a valid hex hash": "",
+  "Add an existing contract": "",
+  "The address for the deployed contract instance.": "",
+  "contract address": "",
+  "Call a contract": "",
+  "Specify the user account to use for this contract call. And fees will be deducted from this account.": "",
+  "call from account": "",
+  "A deployed contract that has either been deployed or attached. The address and ABI are used to construct the parameters.": "",
+  "contract to use": "",
+  "The message to send to this contract. Parameters are adjusted based on the ABI provided.": "",
+  "message to send": "",
+  "The allotted value for this contract, i.e. the amount transferred to the contract as part of this call.": "",
+  "value": "",
+  "The maximum amount of gas that can be used by this deployment, if the code requires more, the deployment will fail.": "",
+  "maximum gas allowed": "",
+  "Call": "",
+  "Forget this contract": "",
+  "execute": "",
+  "Call a method on this contract": "",
+  "No contracts available": "",
+  "Deploy a code hash": "",
+  "Unable to find deployed contract code at the specified address": "",
+  "The value is not in a valid address format": "",
+  "The contract WASM previously deployed. Internally this is identified by the hash of the code, as either created or attached.": "",
+  "code for this contract": "",
+  "The deployment constructor information for this contract, as provided by the ABI.": "",
+  "The allotted endownment for this contract, i.e. the amount transferred to the contract upon instantiation.": "",
+  "endowment": "",
+  "Deploy": "",
+  "Specify the user account to use for this deployment. And fees will be deducted from this account.": "",
+  "deployment account": "",
+  "Confirm ABI removal": "",
+  "You are about to remove this code's ABI. Once completed, should you need to access it again, you will have to manually re-upload it.": "",
+  "This operaion does not impact the associated on-chain code or any of its contracts.": "",
+  "Remove": "",
+  "Council overview": "",
+  "Motions": "",
+  "No council motions": "",
+  "ayes ({{ayes}}/{{threshold}} to approve)": "",
+  "Aye": "",
+  "nays ({{nays}})": "",
+  "Nay": "",
+  "Propose a council motion": "",
+  "threshold": "",
+  "The minimum number of council votes required to approve this motion": "",
+  "Positive number between 1 and {{memberCount}}": "",
+  "proposal": "",
+  "candidate": "",
+  "active until": "",
+  "council member": "",
+  "No members found": "",
+  "members": "",
+  "candidates": "",
+  "Submit your council candidacy": "",
+  "Candidate account": "",
+  "This account will be nominated to fill the council slot you specify.": "",
+  "Submit candidacy": "",
+  "seats": "",
+  "voting round": "",
+  "term duration": "",
+  "Vote for current candidates": "",
+  "Voting account": "",
+  "This account will be use to approve or disapprove each candidate.": "",
+  "Vote": "",
+  "You have already voted in this round": "",
+  "Retract vote": "",
+  "No vote": "",
+  "Democracy overview": "",
+  "depositors": "",
+  "balance": "",
+  "No available proposals": "",
+  "proposals": "",
+  "Submit proposal": "",
+  "propose": "",
+  "The amount that will be bonded to submit the proposal": "",
+  "ending at": "",
+  "block #{{blockNumber}}, {{remaining}} blocks remaining": "",
+  "activate at (if passed)": "",
+  "block #{{blockNumber}}": "",
+  "vote threshold": "",
+  "No available referendums": "",
+  "referendum": "",
+  "Second proposal": "",
+  "Select the account you wish to second with. This will lock your funds until the proposal is either approved or rejected": "",
+  "second with account": "",
+  "Second": "",
+  "referenda": "",
+  "active": "",
+  "launch period": "",
+  "Vote on proposal": "",
+  "Select the account you wish to vote with. You can approve \"aye\" or deny \"nay\" the proposal.": "",
+  "vote with account": "",
+  "Select your vote preferences for this proposal, either to approve or disapprove": "",
+  "record my vote as": "",
+  "Aye, I approve": "",
+  "Nay, I do not approve": "",
+  "events": "",
+  "index": "",
+  "Details": "",
+  "mortal, valid from #{{startAt}} to #{{endsAt}}": "",
+  "mortal": "",
+  "immortal": "",
+  "No pending extrinsics are in the queue": "",
+  "extrinsics": "",
+  "logs": "",
+  "no events available": "",
+  "blocks": "",
+  "forks": "",
+  "Chain info": "",
+  "Block details": "",
+  "Forks": "",
+  "Node info": "",
+  "recent blocks": "",
+  "recent events": "",
+  "pending extrinsics": "",
+  "connected peers": "",
+  "role": "",
+  "peer id": "",
+  "best #": "",
+  "best hash": "",
+  "no peers connected": "",
+  "refresh in": "",
+  "total peers": "",
+  "syncing": "",
+  "yes": "",
+  "no": "",
+  "queued tx": "",
+  "peer best": "",
+  "our best": "",
+  "block hash or number to query": "",
+  "last block": "",
+  "target": "",
+  "total issuance": "",
+  "finalized": "",
+  "best": "",
+  "epoch": "",
+  "session": "",
+  "era": "",
+  "Extrinsic submission": "",
+  "using the selected account": "",
+  "with an account balance": "",
+  "with a transaction nonce": "",
+  "submit the following extrinsic": "",
+  "Submit Unsigned": "",
+  "Submit Transaction": "",
+  "Forget this asset": "",
+  "Asset ID": "",
+  "Register Asset": "",
+  "No assets found.": "",
+  "Assets": "",
+  "Transfer": "",
+  "Register an Asset": "",
+  "Enter the Asset ID of the token you want to manage.": "",
+  "asset id": "",
+  "Type the name of this Asset. This name will be used across all the apps. It can be edited later on.": "",
+  "Register": "",
+  "Enter the Asset ID of the token you want to transfer.": "",
+  "Generate link to share code example": "",
+  "Copied to clipboard": "",
+  "Delete this custom example": "",
+  "Name your example": "",
+  "Save snippet to local storage": "",
+  "Select example": "",
+  "Parachains overview": "",
+  "the last heads of this parachain": "",
+  "heads": "",
+  "<unknown>": "",
+  "the relay dispatch queue size": "",
+  "relay queue": "",
+  "no deployed parachains": "",
+  "parachains": "",
+  "next id": "",
+  "This is not a valid JSON object.": "",
+  "Your custom types have been added": "",
+  "Save the type definitions for your custom structures as key-value pairs in a valid JSON file. The key should be the name of your custom structure and the value an object containing your type definitions.": "",
+  "Additional types as a JSON file (or edit below)": "",
+  "Reset": "",
+  "Override the default ss58 prefix for address generation": "",
+  "address prefix": "",
+  "Override the default identity icon display with a specific theme": "",
+  "default icon theme": "",
+  "Adjust the mode from basic (with a limited number of beginner-user-friendly apps) to full (with all basic & advanced apps available)": "",
+  "interface operation mode": "",
+  "Manage your connection to Ledger S": "",
+  "manage hardware connections": "",
+  "default interface language": "",
+  "Save & Reload": "",
+  "General": "",
+  "Developer": "",
+  "Select the remote endpoint, either from the dropdown on manual entered via the custom toggle": "",
+  "remote node/endpoint to connect to": "",
+  "custom endpoint": "",
+  "Bond more": "",
+  "Bond more funds": "",
+  "stash account": "",
+  "Amount to add to the currently bonded funds. This is adjusted using the available funds on the account.": "",
+  "additionnal bonded funds": "",
+  "stash": "",
+  "nominating": "",
+  "controller": "",
+  "Stop Nominating": "",
+  "Stop Validating": "",
+  "Set Session Key": "",
+  "Validate": "",
+  "Nominate": "",
+  "Unbond funds": "",
+  "Change controller account": "",
+  "Change reward destination": "",
+  "Change validator preferences": "",
+  "Rotate session keys": "",
+  "Change session account": "",
+  "Change nominee(s)": "",
+  "Inject session keys (advanced)": "",
+  "ed25519, Edwards": "",
+  "sr15519, Schnorrkel": "",
+  "Inject Keys": "",
+  "suri (seed & derivation)": "",
+  "key type to set": "",
+  "Aura": "",
+  "Babe": "",
+  "Grandpa": "",
+  "I'm Online": "",
+  "Parachains": "",
+  "crypto type to use": "",
+  "generated public key": "",
+  "This operation will submit the seed via an RPC call. Do not perform this operation on a public RPC node, but ensure that the node is local, connected to your validator and secure.": "",
+  "Submit key": "",
+  "A controller account should not map to another stash. This selected controller is a stash, controlled by {{bondedId}}": "",
+  "A controller account should not be set to manages multiple stashes. The selected controller is already controlling {{stashId}}": "",
+  "For fund security, your session key should not match your stash key.": "",
+  "The Threshold must be a positive number": "",
+  "The Threshold must lower than 11": "",
+  "Nominate Validators": "",
+  "controller account": "",
+  "Stash accounts that are to be nominated. Block rewards are split between validators and nominators": "",
+  "nominate the following addresses": "",
+  "select accounts(s) nominate": "",
+  "Warning - Changing the controller while validating will modify the associated session account. It is advised to stop validating before changing the controller account.": "",
+  "The controller is the account that will be used to control any nominating or validating actions. Should not match another stash or controller.": "",
+  "Set controller": "",
+  "Set reward destination": "",
+  "Bonding Preferences": "",
+  "The controller is the account that is be used to control any nominating or validating actions. I will sign this transaction.": "",
+  "The destination account for any payments as either a nominator or validator": "",
+  "payment destination": "",
+  "Changing the key only takes effect at the start of the next session. The input here is generates from the author_rotateKeys command": "",
+  "Keys from rotateKeys": "",
+  "Changing the key only takes effect at the start of the next session. If validating, it must be an ed25519 key.": "",
+  "Session key (ed25519)": "",
+  "Unbond": "",
+  "The amount of funds to unbond, this is adjusted using the bonded funds on the stash account.": "",
+  "unbond amount": "",
+  "Set validator preferences": "",
+  "The number of time this validator can get slashed before being automatically unstaked (maximum of 10 allowed)": "",
+  "automatic unstake threshold": "",
+  "Amount taken up-front from the reward by the validator before spliting the remainder between themselves and the nominators": "",
+  "reward commission": "",
+  "New stake": "",
+  "No funds staked yet.": "",
+  "The total amount of the stash balance that will be at stake in any forthcoming rounds (should be less than the total amount available)": "",
+  "value bonded": "",
+  "Bond": "",
+  "Staking overview": "",
+  "Account actions": "",
+  "Nominators ({{count}})": "",
+  "Show all validators and intentions": "",
+  "Show only my nominations": "",
+  "Show only with nominators": "",
+  "Show only without nominators": "",
+  "Show only with warnings": "",
+  "Show only without warnings": "",
+  "No addresses found": "",
+  "validators": "",
+  "validator": "",
+  "next up": "",
+  "intention": "",
+  "waiting": "",
+  "selected constant query": "",
+  "Storage": "",
+  "Constants": "",
+  "Raw storage": "",
+  "selected state query": "",
+  "hex-encoded storage key": "",
+  "Sudo access": "",
+  "Set sudo key": "",
+  "You do not have access to the current sudo key": "",
+  "sudo key": "",
+  "Reassign": "",
+  "You will no longer have sudo access": "",
+  "submit the following change": "",
+  "Submit Sudo": "",
+  "The input data to hash. This can be either specified as a hex value (0x-prefix) or as a string.": "",
+  "from the following data": "",
+  "Detection on the input string to determine if it is hex or non-hex.": "",
+  "hex input data": "",
+  "Yes": "",
+  "No": "",
+  "The blake2b 256-bit hash of the actual input data.": "",
+  "the resulting hash is": "",
+  "RPC calls": "",
+  "Hash data": "",
+  "Sign message": "",
+  "Verify signature": "",
+  "sign data from account": "",
+  "with an index of": "",
+  "The actual JSONRPC module and function to make a call to.": "",
+  "call the selected endpoint": "",
+  "Submit RPC call": "",
+  "select the account you wish to sign data with": "",
+  "account": "",
+  "The input data to sign. This can be either specified as a hex value (0x-prefix) or as a string.": "",
+  "sign the following data": "",
+  "The resulting signature of the input data, as done with the crypto algorithm from the account. (This could be non-deterministic for some types such as sr25519).": "",
+  "signature of supplied data": "",
+  "You need to unlock this account to be able to sign data.": "",
+  "Unlock account": "",
+  "Unlock": "",
+  "You are about to unlock your account to allow for the signing of messages. Once active the signature will be generated based on the content provided.": "",
+  "The account's password specified at the creation of this account.": "",
+  "Crypto not detected": "",
+  "The account that signed the input": "",
+  "verify using address": "",
+  "The data that was signed. This is used in combination with the signature for the verification. It can either be hex or a string.": "",
+  "using the following data": "",
+  "The signature as by the account being checked, supplied as a hex-formatted string.": "",
+  "the supplied signature": "",
+  "Cryptography used to create this signature. It is auto-detected on valid signatures.": "",
+  "signature crypto type": "",
+  "Treasury overview": "",
+  "Edit settings": "",
+  "Approve or reject proposal": "",
+  "Respond": "",
+  "Propose a majority council motion to either approve or reject this spend proposal": "",
+  "proposed council action": "",
+  "Approved": "",
+  "No approved proposals": "",
+  "No pending proposals": "",
+  "Proposals": "",
+  "Submit a spend proposal": "",
+  "beneficiary": "",
+  "The account to which the proposed balance will be transferred if approved": "",
+  "The amount that will be allocated from the treasury pot": "",
+  "approved": "",
+  "pot": "",
+  "using my account": "",
+  "The account used to change your settings": "",
+  "configuration": "",
+  "Proposal bond": "",
+  "proposal bond": "",
+  "Proposal bond minimum": "",
+  "proposal bond minimum": "",
+  "Spend period": "",
+  "spend period": "",
+  "Burn percentage": "",
+  "burn percentage": "",
+  "Submit": "",
+  "Pot": "",
+  "pot size": "",
+  "Waiting for API to be connected and ready.": "",
+  "transfer received": "",
+  "update on #{{index}}": "",
+  "Select Network": "",
+  "You don't have any accounts. Some features are currently hidden and will only become available once you have accounts.": "",
+  "Create an account now.": "",
+  "Waiting for authorization from the extension. Please open the installed extension and approve or reject access.": "",
+  "You are not connected to a node. Ensure that your node is running and that the Websocket endpoint is reachable.": "",
+  "With the Firefox browser connecting to insecure WebSockets ({{wsUrl}}) will fail due to the browser not allowing localhost access from a secure site.": "",
+  "You are connecting from a secure location to an insecure WebSocket ({{wsUrl}}). Due to browser mixed-content security policies this connection type is not allowed. Change the RPC service to a secure 'wss' endpoint.": "",
+  "bonded": "",
+  "transactions": "",
+  "type": "",
+  "{{value}}, {{remaining}} blocks left": "",
+  "unstake threshold": "",
+  "commission": "",
+  "total": "",
+  "available": "",
+  "redeemable": "",
+  "Redeem these funds": "",
+  "unbonding": "",
+  "session keys": "",
+  "reward destination": "",
+  "or": "",
+  "extrinsic hash": "",
+  "lifetime": "",
+  "tip": "",
+  "No items": "",
+  "only this network": "",
+  "use on any network": "",
+  "clipboard": "",
+  "address copied": "",
+  "You are about to remove this account from your list of available accounts. Once completed, should you need to access it again, you will have to re-create the account either via seed or via a backup file.": "",
+  "This operaion does not remove the history of the account from the chain, nor any associated funds from the account. The forget operation only limits your access to the account on this browser.": "",
+  "You are about to remove this address from your address book. Once completed, should you need to access it again, you will have to re-add the address.": "",
+  "This operation does not remove the history of the account from the chain, nor any associated funds from the account. The forget operation only limits your access to the address on this browser.": "",
+  "You are about to remove this contract from your list of available contracts. Once completed, should you need to access it again, you will have to manually add the contract's address in the Instantiate tab.": "",
+  "This operaion does not remove the history of the contract from the chain, nor any associated funds from its account. The forget operation only limits your access to the contract on this browser.": "",
+  "You are about to remove this code from your list of available code hashes. Once completed, should you need to access it again, you will have to manually add the code hash again.": "",
+  "This operaion does not remove the uploaded code WASM and ABI from the chain, nor any deployed contracts. The forget operation only limits your access to the code on this browser.": "",
+  "Confirm account removal": "",
+  "Confirm address removal": "",
+  "Confirm contract removal": "",
+  "Confirm code removal": "",
+  "Forget": "",
+  "click to select or drag and drop the file here": "",
+  "{{name}} ({{size}} bytes)": "",
+  "Positive number": "",
+  "View this {{type}} on Polkascan.io": "",
+  "Remove ABI": "",
+  "Reported offline {{count}} times, last at {{blockNumber}}": "",
+  "Reported online at #{{blockNumber}}": "",
+  "Reported online in the current session": "",
+  "Dismiss all notifications": "",
+  "proposed by": "",
+  "bond": "",
+  "Select the account to use for this action.": "",
+  "Vote on council proposal": "",
+  "Vote with account": "",
+  "{{count}} key/value pairs encoded for submission": "",
+  "include option": "",
+  "exclude option": "",
+  "<empty>": "",
+  "Add item": "",
+  "Remove item": "",
+  "The selected account does not exist on your keyring": "",
+  "The selected account does not have the required balance available for this transaction": "",
+  "Submitting this transaction will drop the account balance to below the existential amount ({{existentialDeposit}}), which can result in the account being removed from the chain state and its associated funds burned.": "",
+  "This account does have a reserved/locked balance, not taken into account": "",
+  "Fees includes the transaction fee and the per-byte fee": "",
+  "Fees totalling {{fees}} will be applied to the submission": "",
+  "{{total}} estimated total amount (fees + value)": "",
+  "Estimation does not account for the transaction weight": "",
+  "The deposit is below the {{minimum}} minimum required for the proposal to be evaluated": "",
+  "The deposit of {{deposit}} will be reserved until the proposal is completed": "",
+  "The final recipient balance is less or equal to {{existentialDeposit}} (the existential amount) and will not be reflected": "",
+  "A fee of {{creationFee}} will be deducted from the sender since the destination account does not exist": "",
+  "Scan Signature Qr": "",
+  "Submit (no signature)": "",
+  "Sign via {{hardwareType}}": "",
+  "Sign via Qr": "",
+  "Sign and Submit": "",
+  "Add a tip to this extrinsic, paying the block author for greater priority": "",
+  "Tip (optional)": "",
+  "wrong password": "",
+  "sending from my account": "",
+  "unlock account with password": ""
+}

+ 0 - 1
packages/apps/public/locales/en/validators.json

@@ -1 +0,0 @@
-{}

+ 0 - 1
packages/apps/public/locales/en/vanitygen.json

@@ -1 +0,0 @@
-{}

+ 1 - 1
packages/apps/src/Content/index.tsx

@@ -27,7 +27,7 @@ const unknown = {
   name: ''
 };
 
-function Content ({ isApiConnected, isApiReady, className, location, t }: Props): React.ReactElement<Props> {
+function Content ({ isApiConnected, isApiReady, className, location, t, i18n }: Props): React.ReactElement<Props> {
   const app = location.pathname.slice(1) || '';
   const { Component, display: { needsApi }, name } = routing.routes.find((route): boolean =>
     !!(route && app.startsWith(route.name))

+ 1 - 1
packages/apps/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['apps', 'ui']);
+export default withTranslation(['apps']);

+ 36 - 6
packages/react-components/src/i18n.ts

@@ -4,17 +4,17 @@
 
 import i18n from 'i18next';
 // import LanguageDetector from 'i18next-browser-languagedetector';
-// import Backend from 'i18next-xhr-backend';
+import Backend from 'i18next-xhr-backend';
 import { initReactI18next } from 'react-i18next';
 
 i18n
-  // .use(Backend)
+  .use(Backend)
   // .use(LanguageDetector)
   .use(initReactI18next)
   .init({
-    // backend: {
-    //   loadPath: 'locales/{{lng}}/{{ns}}.json'
-    // },
+    backend: {
+      loadPath: 'locales/{{lng}}/{{ns}}.json'
+    },
     debug: false,
     defaultNS: 'ui',
     fallbackLng: false,
@@ -22,7 +22,37 @@ i18n
       escapeValue: false
     },
     lng: 'en',
-    ns: ['ui'],
+    ns: [
+      'app-123code',
+      'app-accounts',
+      'app-address-book',
+      'app-claims',
+      'app-contracts',
+      'app-council',
+      'app-dashboard',
+      'app-democracy',
+      'app-explorer',
+      'app-extrinsics',
+      'app-generic-asset',
+      'app-js',
+      'app-parachains',
+      'app-settings',
+      'app-staking',
+      'app-storage',
+      'app-sudo',
+      'app-toolbox',
+      'app-transfer',
+      'app-treasury',
+      'apps',
+      'apps-routing',
+      'react-api',
+      'react-components',
+      'react-params',
+      'react-query',
+      'react-signer'
+    ],
+    keySeparator: false,
+    nsSeparator: false,
     react: {
       wait: true
     }

+ 1 - 1
packages/react-components/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['ui']);
+export default withTranslation(['react-components']);

+ 1 - 1
packages/react-params/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['ui-params']);
+export default withTranslation(['react-params']);

+ 1 - 1
packages/react-signer/src/translate.ts

@@ -4,4 +4,4 @@
 
 import { withTranslation } from 'react-i18next';
 
-export default withTranslation(['signer', 'ui']);
+export default withTranslation(['react-signer']);

+ 467 - 21
yarn.lock

@@ -3146,6 +3146,28 @@ accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
     mime-types "~2.1.24"
     negotiator "0.6.2"
 
+acorn-bigint@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/acorn-bigint/-/acorn-bigint-0.3.1.tgz#edb40a414dcaf5a09c2933db6bed79454b3ff46a"
+  integrity sha512-WT9LheDC4/d/sD/jgC6L5UMq4U9X3KNMy0JrXp/MdJL83ZqcuPQuMkj50beOX0dMub8IoZUYycfN7bIVZuU5zg==
+
+acorn-class-fields@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/acorn-class-fields/-/acorn-class-fields-0.3.1.tgz#032ce47a9688a71d4713ee366fadcb7fefaea9e0"
+  integrity sha512-X/8hSJuregAnrvfV1Y80VJNfeJx1uhw7yskOwvL631ygYeCGVLPumCnnPDHYZ8acV3ytHhg53K171H3tAemgiw==
+  dependencies:
+    acorn-private-class-elements "^0.1.1"
+
+acorn-dynamic-import@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
+  integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==
+
+acorn-export-ns-from@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-export-ns-from/-/acorn-export-ns-from-0.1.0.tgz#192687869bba3bcb2ef1a1ba196486ea7e100e5c"
+  integrity sha512-QDQJBe2DfxNBIMxs+19XY2i/XXilJn+kPgX30HWNYK4IXoNj3ACNSWPU7szL0SzqjFyOG4zoZxG9P7JfNw5g7A==
+
 acorn-globals@^4.1.0:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
@@ -3154,12 +3176,51 @@ acorn-globals@^4.1.0:
     acorn "^6.0.1"
     acorn-walk "^6.0.1"
 
-acorn-jsx@^5.0.2:
+acorn-import-meta@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-import-meta/-/acorn-import-meta-1.0.0.tgz#6cff1f01db3b60148934823d3d2dd0c08354aead"
+  integrity sha512-yX652u86bKzuM+mzEHV84T0R+srQwTOmprUiFC3zlhlc02lBQzqxkB/H/7jexX9vlz/TRuQiZs9mKEDK3bbmhw==
+
+acorn-jsx@^5.0.1, acorn-jsx@^5.0.2:
   version "5.0.2"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f"
   integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
 
-acorn-walk@^6.0.1:
+acorn-private-class-elements@^0.1.0, acorn-private-class-elements@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-private-class-elements/-/acorn-private-class-elements-0.1.1.tgz#85209cb5791ab84fde2362cb208fa51e7679bcdc"
+  integrity sha512-bZpmSnaOsK3jkF7J8xaLJ05f008vapPX+XliIv8+jjkclvDR+M4OnTHLhFnCCSeJ0fMwRKjbY+BXsglSNpVZtw==
+  dependencies:
+    mocha "^5.2.0"
+
+acorn-private-methods@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/acorn-private-methods/-/acorn-private-methods-0.3.0.tgz#a5a9f8cd83d175bc138fa22592fababd0afda35d"
+  integrity sha512-+gWTjSA+13lsv1mwCPosSrLzEyghYtWgrr/1Ck7i7Pu5iK7Ke0hOgw3IW1RUxhc4qS2QTQBQx2+qHYqsa4Qlqw==
+  dependencies:
+    acorn-private-class-elements "^0.1.0"
+
+acorn-stage3@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-stage3/-/acorn-stage3-2.0.0.tgz#cf9efacec9323bdef36a416c385c833fcf39a0c6"
+  integrity sha512-1Li6EwvFv/O0rZMDduZY2lOly9fyXanmIsyqe26NppIszWhEQlb7IbUrjFGWyRVjQg3H8k7rO0I/tbAr6dORoQ==
+  dependencies:
+    acorn-bigint "^0.3.1"
+    acorn-class-fields "^0.3.1"
+    acorn-dynamic-import "^4.0.0"
+    acorn-export-ns-from "^0.1.0"
+    acorn-import-meta "^1.0.0"
+    acorn-private-methods "^0.3.0"
+    acorn-static-class-features "^0.2.0"
+
+acorn-static-class-features@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-static-class-features/-/acorn-static-class-features-0.2.0.tgz#8a12b0b280b2e067e268fdbb14116a5b02affd71"
+  integrity sha512-46IooHSRsvgSi+t36Wx9iPfF9BKFKVDcAWELXVqvKHmZogSCk11iUCi2FiZmLeTaM0hlJ3EYDyYiVmHRUGPzWA==
+  dependencies:
+    acorn-private-class-elements "^0.1.0"
+
+acorn-walk@^6.0.0, acorn-walk@^6.0.1:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
   integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
@@ -3169,7 +3230,7 @@ acorn@^5.2.1, acorn@^5.5.3:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
 
-acorn@^6.0.1, acorn@^6.2.1:
+acorn@^6.0.0, acorn@^6.0.1, acorn@^6.2.1:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e"
   integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==
@@ -3342,6 +3403,13 @@ anymatch@^2.0.0:
     micromatch "^3.1.4"
     normalize-path "^2.1.1"
 
+append-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
+  integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=
+  dependencies:
+    buffer-equal "^1.0.0"
+
 aproba@^1.0.3, aproba@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@@ -3926,6 +3994,11 @@ browser-resolve@^1.11.3:
   dependencies:
     resolve "1.1.7"
 
+browser-stdout@1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+  integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
 browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
@@ -4018,6 +4091,11 @@ btoa@^1.2.1:
   resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
   integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
 
+buffer-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+  integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
+
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -4482,11 +4560,44 @@ cliui@^5.0.0:
     strip-ansi "^5.2.0"
     wrap-ansi "^5.1.0"
 
+clone-buffer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+  integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
+
+clone-deep@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+  integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+  dependencies:
+    is-plain-object "^2.0.4"
+    kind-of "^6.0.2"
+    shallow-clone "^3.0.0"
+
+clone-stats@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+  integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
+
 clone@^1.0.2:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
+clone@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
+
+cloneable-readable@^1.0.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
+  integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
+  dependencies:
+    inherits "^2.0.1"
+    process-nextick-args "^2.0.0"
+    readable-stream "^2.3.5"
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -4580,6 +4691,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
+commander@2.15.1:
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+  integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
+
 commander@2.17.x:
   version "2.17.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
@@ -4595,6 +4711,11 @@ commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.5.0, comma
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
 
+commander@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
+  integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
+
 commander@~2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@@ -4820,7 +4941,7 @@ conventional-recommended-bump@^5.0.0:
     meow "^4.0.0"
     q "^1.5.1"
 
-convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
   integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
@@ -5444,6 +5565,11 @@ deepmerge@^1.5.2:
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
   integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==
 
+deepmerge@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.1.1.tgz#ee0866e4019fe62c1276b9062d4c4803d9aea14c"
+  integrity sha512-+qO5WbNBKBaZez95TffdUDnGIo4+r5kmsX8aOb7PDHvXsTbghAmleuxjs6ytNaf5Eg4FGBXDS5vqO61TRi6BMg==
+
 default-gateway@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
@@ -5600,6 +5726,11 @@ diff-sequences@^24.9.0:
   resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
   integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
 
+diff@3.5.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+  integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
 diffie-hellman@^5.0.0:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -5823,6 +5954,14 @@ edgeware-node-types@^1.0.10:
   resolved "https://registry.yarnpkg.com/edgeware-node-types/-/edgeware-node-types-1.0.10.tgz#eb40ef4308f84d64975edc99d12ac5da891ee6a3"
   integrity sha512-iGMjkxtaT0FE5TR8DTucF+63IbtGHiieNxNkPTlsGYGt1JaPc6aP0ApnSQKYu2NiQaVcg1RB+BDMmGfFk1bnhw==
 
+editions@^2.1.3:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/editions/-/editions-2.2.0.tgz#dacd0c2a9441ebef592bba316a6264febb337f35"
+  integrity sha512-RYg3iEA2BDLCNVe8PUkD+ox5vAKxB9XS/mAhx1bdxGCF0CpX077C0pyTA9t5D6idCYA3avl5/XDHKPsHFrygfw==
+  dependencies:
+    errlop "^1.1.2"
+    semver "^6.3.0"
+
 ee-first@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -5910,6 +6049,11 @@ enhanced-resolve@^4.1.0:
     memory-fs "^0.5.0"
     tapable "^1.0.0"
 
+ensure-array@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/ensure-array/-/ensure-array-1.0.0.tgz#317e9fc632c656bb849eb649133528e205b23abc"
+  integrity sha512-A+3Ntl5WS+GjDnHtC67dKIjw+IoGoeFdNvjn3ZfKEmZgWUz0nxBPE4W52QMCbGZsat0VwWskD5T6AEpe3T2d1g==
+
 entities@^1.1.1, entities@~1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
@@ -6008,11 +6152,23 @@ enzyme@^3.10.0:
     rst-selector-parser "^2.2.3"
     string.prototype.trim "^1.1.2"
 
+eol@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd"
+  integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==
+
 err-code@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
   integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
 
+errlop@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.2.tgz#a99a48f37aa264d614e342ffdbbaa49eec9220e0"
+  integrity sha512-djkRp+urJ+SmqDBd7F6LUgm4Be1TTYBxia2bhjNdFBuBDQtJDHExD2VbxR6eyst3h1TZy3qPRCdqb6FBoFttTA==
+  dependencies:
+    editions "^2.1.3"
+
 errno@^0.1.3, errno@~0.1.7:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@ -6118,7 +6274,7 @@ escape-html@^1.0.3, escape-html@~1.0.3:
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
   integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
 
-escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
@@ -6869,7 +7025,7 @@ flatten@^1.0.2:
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
   integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=
 
-flush-write-stream@^1.0.0:
+flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
   integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
@@ -6970,6 +7126,14 @@ fs-minipass@^1.2.5:
   dependencies:
     minipass "^2.6.0"
 
+fs-mkdirp-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
+  integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=
+  dependencies:
+    graceful-fs "^4.1.11"
+    through2 "^2.0.3"
+
 fs-readdir-recursive@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
@@ -7202,6 +7366,22 @@ glob-parent@^5.0.0, glob-parent@^5.1.0:
   dependencies:
     is-glob "^4.0.1"
 
+glob-stream@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
+  integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
+  dependencies:
+    extend "^3.0.0"
+    glob "^7.1.1"
+    glob-parent "^3.1.0"
+    is-negated-glob "^1.0.0"
+    ordered-read-streams "^1.0.0"
+    pumpify "^1.3.5"
+    readable-stream "^2.1.5"
+    remove-trailing-separator "^1.0.1"
+    to-absolute-glob "^2.0.0"
+    unique-stream "^2.0.2"
+
 glob-to-regexp@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
@@ -7214,6 +7394,18 @@ glob2base@^0.0.12:
   dependencies:
     find-index "^0.1.1"
 
+glob@7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 glob@^5.0.15:
   version "5.0.15"
   resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
@@ -7351,7 +7543,7 @@ good-listener@^1.2.2:
   dependencies:
     delegate "^3.1.2"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
   version "4.2.2"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
   integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
@@ -7366,7 +7558,7 @@ gray-matter@^4.0.1:
     section-matter "^1.0.0"
     strip-bom-string "^1.0.0"
 
-"growl@~> 1.10.0":
+growl@1.10.5, "growl@~> 1.10.0":
   version "1.10.5"
   resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
   integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
@@ -7381,6 +7573,13 @@ gud@^1.0.0:
   resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
   integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
 
+gulp-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-sort/-/gulp-sort-2.0.0.tgz#c6762a2f1f0de0a3fc595a21599d3fac8dba1aca"
+  integrity sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=
+  dependencies:
+    through2 "^2.0.1"
+
 handle-thing@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
@@ -7496,6 +7695,11 @@ hash.js@^1.0.0, hash.js@^1.0.3:
     inherits "^2.0.3"
     minimalistic-assert "^1.0.1"
 
+he@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+  integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
+
 he@1.2.x, he@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
@@ -7808,6 +8012,32 @@ i18next-browser-languagedetector@^3.1.1:
   resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-3.1.1.tgz#1a0c236d4339476cc3632da60ff947bbc2e3ba3c"
   integrity sha512-JBgFWijjI1t6as4WgGvDdX4GLJPZwC/SMHzLQQ3ef7XaJsEkomlXFqXifKvOVJg09Hj2BVWe6strDdIF4J/0ng==
 
+i18next-scanner@^2.10.3:
+  version "2.10.3"
+  resolved "https://registry.yarnpkg.com/i18next-scanner/-/i18next-scanner-2.10.3.tgz#b31e159d6023361ecd9c94ac32c538af56841999"
+  integrity sha512-353SC3nbogtsLgbYQEz6zVFLPX91ERPt2ylQ6ljPR0dcewcyyRK8pJUBHr8+089f+ugohnEWkcL8/Me0cRY9Sw==
+  dependencies:
+    acorn "^6.0.0"
+    acorn-dynamic-import "^4.0.0"
+    acorn-jsx "^5.0.1"
+    acorn-stage3 "^2.0.0"
+    acorn-walk "^6.0.0"
+    chalk "^2.4.1"
+    clone-deep "^4.0.0"
+    commander "^3.0.1"
+    deepmerge "^4.0.0"
+    ensure-array "^1.0.0"
+    eol "^0.9.1"
+    esprima "^4.0.0"
+    gulp-sort "^2.0.0"
+    i18next "*"
+    lodash "^4.0.0"
+    parse5 "^5.0.0"
+    sortobject "^1.1.1"
+    through2 "^3.0.1"
+    vinyl "^2.2.0"
+    vinyl-fs "^3.0.1"
+
 i18next-xhr-backend@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/i18next-xhr-backend/-/i18next-xhr-backend-3.2.0.tgz#f2ac0792c38ca8ee653fab723fc9dcc7b0ff4d71"
@@ -8064,6 +8294,14 @@ is-absolute-url@^3.0.3:
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
   integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
 
+is-absolute@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
+  integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
+  dependencies:
+    is-relative "^1.0.0"
+    is-windows "^1.0.1"
+
 is-accessor-descriptor@^0.1.6:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -8283,6 +8521,11 @@ is-hexadecimal@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee"
   integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==
 
+is-negated-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+  integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
+
 is-number-object@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799"
@@ -8377,6 +8620,13 @@ is-regex@^1.0.4:
   dependencies:
     has "^1.0.1"
 
+is-relative@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
+  integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
+  dependencies:
+    is-unc-path "^1.0.0"
+
 is-resolvable@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
@@ -8435,11 +8685,23 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
   integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 
-is-utf8@^0.2.0:
+is-unc-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
+  integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
+  dependencies:
+    unc-path-regex "^0.1.2"
+
+is-utf8@^0.2.0, is-utf8@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
   integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
 
+is-valid-glob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
+  integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=
+
 is-what@^3.3.1:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.3.1.tgz#79502181f40226e2d8c09226999db90ef7c1bcbe"
@@ -9252,6 +9514,13 @@ last-call-webpack-plugin@^3.0.0:
     lodash "^4.17.5"
     webpack-sources "^1.1.0"
 
+lazystream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
+  integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
+  dependencies:
+    readable-stream "^2.0.5"
+
 lcid@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
@@ -9264,6 +9533,13 @@ lcov-parse@^0.0.10:
   resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
   integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=
 
+lead@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
+  integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=
+  dependencies:
+    flush-write-stream "^1.0.2"
+
 ledger-polkadot@^0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/ledger-polkadot/-/ledger-polkadot-0.0.4.tgz#3f9b56287fe25e51314df7c573a5b4dc8e620c7f"
@@ -9509,7 +9785,7 @@ lodash.uniq@^4.5.0:
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
   integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
 
-lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1:
+lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -10002,7 +10278,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
   integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
 
-"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -10083,7 +10359,7 @@ mkdirp-promise@^5.0.1:
   dependencies:
     mkdirp "*"
 
-mkdirp@*, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x:
+mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1, mkdirp@~0.5.x:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@@ -10095,6 +10371,23 @@ mkdirp@0.3.0:
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
   integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=
 
+mocha@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
+  integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
+  dependencies:
+    browser-stdout "1.3.1"
+    commander "2.15.1"
+    debug "3.1.0"
+    diff "3.5.0"
+    escape-string-regexp "1.0.5"
+    glob "7.1.2"
+    growl "1.10.5"
+    he "1.1.1"
+    minimatch "3.0.4"
+    mkdirp "0.5.1"
+    supports-color "5.4.0"
+
 modify-values@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
@@ -10491,6 +10784,13 @@ normalize-url@^3.0.0, normalize-url@^3.3.0:
   resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
   integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
 
+now-and-later@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c"
+  integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==
+  dependencies:
+    once "^1.3.2"
+
 npm-bundled@^1.0.1:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
@@ -10634,7 +10934,7 @@ object-visit@^1.0.0:
   dependencies:
     isobject "^3.0.0"
 
-object.assign@^4.1.0:
+object.assign@^4.0.4, object.assign@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
   integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
@@ -10719,7 +11019,7 @@ on-headers@~1.0.2:
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
   integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
 
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
+once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
@@ -10799,6 +11099,13 @@ optionator@^0.8.1, optionator@^0.8.2:
     type-check "~0.3.2"
     wordwrap "~1.0.0"
 
+ordered-read-streams@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
+  integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
+  dependencies:
+    readable-stream "^2.0.1"
+
 original@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
@@ -11102,6 +11409,11 @@ parse5@^3.0.1:
   dependencies:
     "@types/node" "*"
 
+parse5@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
+  integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
+
 parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -12154,7 +12466,7 @@ private@^0.1.6, private@~0.1.5:
   resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
   integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
 
-process-nextick-args@~2.0.0:
+process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
   integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
@@ -12288,7 +12600,7 @@ pump@^3.0.0:
     end-of-stream "^1.1.0"
     once "^1.3.1"
 
-pumpify@^1.3.3:
+pumpify@^1.3.3, pumpify@^1.3.5:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
   integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
@@ -12730,7 +13042,7 @@ read@1, read@~1.0.1:
   dependencies:
     mute-stream "~0.0.4"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
   integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -12934,6 +13246,23 @@ remark-parse@^5.0.0:
     vfile-location "^2.0.0"
     xtend "^4.0.1"
 
+remove-bom-buffer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
+  integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==
+  dependencies:
+    is-buffer "^1.1.5"
+    is-utf8 "^0.2.1"
+
+remove-bom-stream@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
+  integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=
+  dependencies:
+    remove-bom-buffer "^3.0.0"
+    safe-buffer "^5.1.0"
+    through2 "^2.0.3"
+
 remove-trailing-separator@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -12967,7 +13296,7 @@ repeating@^2.0.0:
   dependencies:
     is-finite "^1.0.0"
 
-replace-ext@1.0.0:
+replace-ext@1.0.0, replace-ext@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
   integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
@@ -13064,6 +13393,13 @@ resolve-from@^4.0.0:
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
   integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 
+resolve-options@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
+  integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=
+  dependencies:
+    value-or-function "^3.0.0"
+
 resolve-path@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
@@ -13455,6 +13791,13 @@ sha.js@^2.4.0, sha.js@^2.4.8:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
+shallow-clone@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+  integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+  dependencies:
+    kind-of "^6.0.2"
+
 shallowequal@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
@@ -13653,6 +13996,13 @@ sort-keys@^2.0.0:
   dependencies:
     is-plain-obj "^1.0.0"
 
+sortobject@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/sortobject/-/sortobject-1.2.0.tgz#f24dbd1c1eb53013823f4045c5cae75e0aea273a"
+  integrity sha512-b/UBYCIXcloH6NO0CSG+/8dYsDA+egku07g0oeYPBmmt8CS64pORXPYmQ/W65UBGxYz7dTacjWgBVlq/TzxmQQ==
+  dependencies:
+    editions "^2.1.3"
+
 source-list-map@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
@@ -14160,6 +14510,13 @@ subarg@^1.0.0:
   dependencies:
     minimist "^1.1.0"
 
+supports-color@5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+  integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
+  dependencies:
+    has-flag "^3.0.0"
+
 supports-color@6.1.0, supports-color@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
@@ -14365,7 +14722,15 @@ throat@^4.0.0:
   resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
   integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
 
-through2@^2.0.0, through2@^2.0.2:
+through2-filter@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254"
+  integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==
+  dependencies:
+    through2 "~2.0.0"
+    xtend "~4.0.0"
+
+through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
   integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
@@ -14373,7 +14738,7 @@ through2@^2.0.0, through2@^2.0.2:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
-through2@^3.0.0:
+through2@^3.0.0, through2@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
   integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
@@ -14437,6 +14802,14 @@ tmpl@1.0.x:
   resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
   integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
 
+to-absolute-glob@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
+  integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
+  dependencies:
+    is-absolute "^1.0.0"
+    is-negated-glob "^1.0.0"
+
 to-arraybuffer@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
@@ -14484,6 +14857,13 @@ to-regex@^3.0.1, to-regex@^3.0.2:
     regex-not "^1.0.2"
     safe-regex "^1.1.0"
 
+to-through@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
+  integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=
+  dependencies:
+    through2 "^2.0.3"
+
 toggle-selection@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
@@ -14735,6 +15115,11 @@ umask@^1.1.0:
   resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
   integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
 
+unc-path-regex@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
+  integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
+
 underscore@>=1.8.3, underscore@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
@@ -14817,6 +15202,14 @@ unique-slug@^2.0.0:
   dependencies:
     imurmurhash "^0.1.4"
 
+unique-stream@^2.0.2:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac"
+  integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==
+  dependencies:
+    json-stable-stringify-without-jsonify "^1.0.1"
+    through2-filter "^3.0.0"
+
 unist-util-is@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd"
@@ -15037,6 +15430,11 @@ value-equal@^1.0.1:
   resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
   integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
 
+value-or-function@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
+  integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
+
 vary@^1.1.2, vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -15078,6 +15476,54 @@ vfile@^2.0.0:
     unist-util-stringify-position "^1.0.0"
     vfile-message "^1.0.0"
 
+vinyl-fs@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
+  integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
+  dependencies:
+    fs-mkdirp-stream "^1.0.0"
+    glob-stream "^6.1.0"
+    graceful-fs "^4.0.0"
+    is-valid-glob "^1.0.0"
+    lazystream "^1.0.0"
+    lead "^1.0.0"
+    object.assign "^4.0.4"
+    pumpify "^1.3.5"
+    readable-stream "^2.3.3"
+    remove-bom-buffer "^3.0.0"
+    remove-bom-stream "^1.2.0"
+    resolve-options "^1.1.0"
+    through2 "^2.0.0"
+    to-through "^2.0.0"
+    value-or-function "^3.0.0"
+    vinyl "^2.0.0"
+    vinyl-sourcemap "^1.1.0"
+
+vinyl-sourcemap@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
+  integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=
+  dependencies:
+    append-buffer "^1.0.2"
+    convert-source-map "^1.5.0"
+    graceful-fs "^4.1.6"
+    normalize-path "^2.1.1"
+    now-and-later "^2.0.0"
+    remove-bom-buffer "^3.0.0"
+    vinyl "^2.0.0"
+
+vinyl@^2.0.0, vinyl@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86"
+  integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==
+  dependencies:
+    clone "^2.1.1"
+    clone-buffer "^1.0.0"
+    clone-stats "^1.0.0"
+    cloneable-readable "^1.0.0"
+    remove-trailing-separator "^1.0.1"
+    replace-ext "^1.0.0"
+
 vm-browserify@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
@@ -15652,7 +16098,7 @@ xml-name-validator@^3.0.0:
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
-xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
+xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==