diff --git a/Loc.test.js b/Loc.test.js new file mode 100644 index 00000000..d51d869b --- /dev/null +++ b/Loc.test.js @@ -0,0 +1,39 @@ +/* global it, describe */ +let assert = require('assert'); + +describe('Localization', () => { + it('has all keys in all locales', async () => { + let en = require('./loc/en'); + let noErrors = true; + for (let key1 of Object.keys(en)) { + for (let key2 of Object.keys(en[key1])) { + // iterating all keys and subkeys in EN locale, which is main + + for (let lang of ['es', 'pt_BR', 'pt_PT', 'ru', 'ua']) { + // iteratin all locales except EN + let locale = require('./loc/' + lang); + + if (typeof locale[key1] === 'undefined') { + console.error('Missing: ' + lang + '.' + key1); + noErrors = false; + } else if (typeof locale[key1][key2] === 'undefined') { + console.error('Missing: ' + lang + '.' + key1 + '.' + key2); + noErrors = false; + } + + // level 1 & 2 done, doing level 3 (if it exists): + + if (typeof en[key1][key2] !== 'string') { + for (let key3 of Object.keys(en[key1][key2])) { + if (typeof locale[key1][key2][key3] === 'undefined') { + console.error('Missing: ' + lang + '.' + key1 + '.' + key2 + '.' + key3); + noErrors = false; + } + } + } + } + } + } + assert.ok(noErrors, 'Some localizations are missing keys'); + }); +}); diff --git a/loc/es.js b/loc/es.js index 6686bc5a..ded99e85 100644 --- a/loc/es.js +++ b/loc/es.js @@ -1,4 +1,13 @@ module.exports = { + _: { + storage_is_encrypted: 'Your storage is encrypted. Password is required to decrypt it', + enter_password: 'Enter password', + bad_password: 'Bad pasword, try again', + months_ago: 'months ago', + days_ago: 'days ago', + hours_ago: 'hours ago', + never: 'never', + }, wallets: { list: { tabBarLabel: 'Monederos', @@ -6,6 +15,12 @@ module.exports = { title: 'Mi Monederos de Bitcoin', header: 'Un Monedero esta representado con secreto (clave privada) y una dirección' + 'que puedes compartir para recibir monedas.', add: 'Añadir Monedero', + create_a_wallet: 'Create a wallet', + create_a_wallet1: "It's free and you can create", + create_a_wallet2: 'as many as you like', + latest_transaction: 'latest transaction', + empty_txs1: 'Your transactions will appear here,', + empty_txs2: 'none at the moment', }, add: { title: 'Añadir Monedero', @@ -14,6 +29,14 @@ module.exports = { scan: 'Escaniar', create: 'Crear', label_new_segwit: 'Nuevo SegWit', + wallet_name: 'wallet name', + wallet_type: 'wallet type', + or: 'or', + import_wallet: 'Import wallet', + imported: 'Imported', + coming_soon: 'Coming soon', + lightning: 'Lightning', + bitcoin: 'Bitcoin', }, details: { title: 'Detalles del Monedero', @@ -29,6 +52,16 @@ module.exports = { export: { title: 'Exportacion de Monedero', }, + import: { + title: 'import', + explanation: + "Write here you mnemonic, private key, WIF, or anything you've got. BlueWallet will do it's best to guess the correct format and import your wallet", + imported: 'Imported', + error: 'Failed to import. Is it event valid?', + success: 'Success', + do_import: 'Import', + scan_qr: 'or scan QR code instead?', + }, scanQrWif: { go_back: 'Regresar', cancel: 'Cancelar', @@ -42,6 +75,7 @@ module.exports = { with_address: ' con dirección ', imported_segwit: 'Importado SegWit', imported_legacy: 'Importado Legado', + imported_watchonly: 'Imported Watch-only', }, }, transactions: { @@ -88,6 +122,7 @@ module.exports = { satoshi_per_byte: 'satoshiPorByte', memo: 'Comentario', broadcast: 'Transmitir', + not_enough_fee: 'Not enough fee. Increase the fee', }, }, receive: { @@ -104,6 +139,7 @@ module.exports = { header: 'Ajustes', plausible_deniability: 'Negación plausible...', storage_not_encrypted: 'Almacenamiento: no esta encriptado', + storage_encrypted: 'Storage: encrypted', password: 'Contraseña', password_explain: 'Crea la contraseña que usarás para descifrar el almacenamiento', retype_password: 'Ingresa la contraseña de nuevo', @@ -111,4 +147,24 @@ module.exports = { encrypt_storage: 'Cifrar almacenamiento', about: 'Sobre nosotros', }, + plausibledeniability: { + title: 'Plausible Deniability', + help: + 'Under certain circumstances, you might be forced to disclose a ' + + 'password. To keep your coins safe, BlueWallet can create another ' + + 'encrypted storage, with a different password. Under the pressure, ' + + 'you can disclose this password to a 3rd party. If entered in ' + + "BlueWallet, it will unlock new 'fake' storage. This will seem " + + 'legit to a 3rd party, but will secretly keep your main storage ' + + 'with coins safe.', + help2: 'New storage will be fully functional, and you can store some ' + 'minimum amounts there so it looks more believable.', + create_fake_storage: 'Create fake encrypted storage', + go_back: 'Go Back', + create_password: 'Create a password', + create_password_explanation: 'Password for fake storage should not match password for your main storage', + password_should_not_match: 'Password for fake storage should not match password for your main storage', + retype_password: 'Retype password', + passwords_do_not_match: 'Passwords do not match, try again', + success: 'Success', + }, }; diff --git a/loc/pt_BR.js b/loc/pt_BR.js index bd601174..293e0368 100644 --- a/loc/pt_BR.js +++ b/loc/pt_BR.js @@ -3,6 +3,10 @@ module.exports = { storage_is_encrypted: 'O armazenamento está encriptado. Uma password é necessaria para desencriptar', enter_password: 'Inserir password', bad_password: 'pasword errada, tentar novamente', + months_ago: 'months ago', + days_ago: 'days ago', + hours_ago: 'hours ago', + never: 'never', }, wallets: { list: { @@ -11,6 +15,12 @@ module.exports = { title: 'Minhas Bitcoin Wallets', header: 'Uma wallet representa um par entre um segredo (chave privada) e um endereço' + 'que pode partilhar para receber Bitcoin.', add: 'Adicionar Wallet', + create_a_wallet: 'Create a wallet', + create_a_wallet1: "It's free and you can create", + create_a_wallet2: 'as many as you like', + latest_transaction: 'latest transaction', + empty_txs1: 'Your transactions will appear here,', + empty_txs2: 'none at the moment', }, add: { title: 'Adicionar Wallet', @@ -19,6 +29,14 @@ module.exports = { scan: 'Scanear', create: 'Criar', label_new_segwit: 'Novo SegWit', + wallet_name: 'wallet name', + wallet_type: 'wallet type', + or: 'or', + import_wallet: 'Import wallet', + imported: 'Imported', + coming_soon: 'Coming soon', + lightning: 'Lightning', + bitcoin: 'Bitcoin', }, details: { title: 'Detalhes da Wallet', @@ -34,6 +52,16 @@ module.exports = { export: { title: 'Exportar Wallet', }, + import: { + title: 'import', + explanation: + "Write here you mnemonic, private key, WIF, or anything you've got. BlueWallet will do it's best to guess the correct format and import your wallet", + imported: 'Imported', + error: 'Failed to import. Is it event valid?', + success: 'Success', + do_import: 'Import', + scan_qr: 'or scan QR code instead?', + }, scanQrWif: { go_back: 'Voltar', cancel: 'Cancelar', @@ -47,6 +75,7 @@ module.exports = { with_address: ' com endereço ', imported_segwit: 'SegWit transferido', imported_legacy: 'Legacy transferido', + imported_watchonly: 'Imported Watch-only', }, }, transactions: { @@ -93,6 +122,7 @@ module.exports = { satoshi_per_byte: 'satoshiPerByte', memo: 'Nota pessoal', broadcast: 'Difundir', + not_enough_fee: 'Not enough fee. Increase the fee', }, }, receive: { diff --git a/loc/pt_PT.js b/loc/pt_PT.js index 1faa01cf..af2be785 100644 --- a/loc/pt_PT.js +++ b/loc/pt_PT.js @@ -3,6 +3,10 @@ module.exports = { storage_is_encrypted: 'O armazenamento está encriptado. Uma password é necessaria para desencriptar', enter_password: 'Inserir password', bad_password: 'pasword errada, tente novamente', + months_ago: 'months ago', + days_ago: 'days ago', + hours_ago: 'hours ago', + never: 'never', }, wallets: { list: { @@ -11,6 +15,12 @@ module.exports = { title: 'Minhas Bitcoin Wallets', header: 'Uma wallet representa um par entre um segredo (chave privada) e um endereço' + 'que pode partilhar para receber Bitcoin.', add: 'Adicionar Wallet', + create_a_wallet: 'Create a wallet', + create_a_wallet1: "It's free and you can create", + create_a_wallet2: 'as many as you like', + latest_transaction: 'latest transaction', + empty_txs1: 'Your transactions will appear here,', + empty_txs2: 'none at the moment', }, add: { title: 'Adicionar Wallet', @@ -19,6 +29,14 @@ module.exports = { scan: 'Scan', create: 'Criar', label_new_segwit: 'Novo SegWit', + wallet_name: 'wallet name', + wallet_type: 'wallet type', + or: 'or', + import_wallet: 'Import wallet', + imported: 'Imported', + coming_soon: 'Coming soon', + lightning: 'Lightning', + bitcoin: 'Bitcoin', }, details: { title: 'Detalhes da Wallet', @@ -34,6 +52,16 @@ module.exports = { export: { title: 'Exportar Wallet', }, + import: { + title: 'import', + explanation: + "Write here you mnemonic, private key, WIF, or anything you've got. BlueWallet will do it's best to guess the correct format and import your wallet", + imported: 'Imported', + error: 'Failed to import. Is it event valid?', + success: 'Success', + do_import: 'Import', + scan_qr: 'or scan QR code instead?', + }, scanQrWif: { go_back: 'Voltar', cancel: 'Cancelar', @@ -47,6 +75,7 @@ module.exports = { with_address: ' com endereço ', imported_segwit: 'SegWit transferido', imported_legacy: 'Legacy transferido', + imported_watchonly: 'Imported Watch-only', }, }, transactions: { @@ -93,6 +122,7 @@ module.exports = { satoshi_per_byte: 'satoshiPerByte', memo: 'Nota pessoal', broadcast: 'Difundir', + not_enough_fee: 'Not enough fee. Increase the fee', }, }, receive: { diff --git a/loc/ru.js b/loc/ru.js index b4b52131..f0ede1dc 100644 --- a/loc/ru.js +++ b/loc/ru.js @@ -29,6 +29,14 @@ module.exports = { scan: 'Отсканировать', create: 'Создать', label_new_segwit: 'Новый SegWit', + wallet_name: 'wallet name', + wallet_type: 'wallet type', + or: 'or', + import_wallet: 'Import wallet', + imported: 'Imported', + coming_soon: 'Coming soon', + lightning: 'Lightning', + bitcoin: 'Bitcoin', }, details: { title: 'Информация о Кошельке', @@ -44,6 +52,16 @@ module.exports = { export: { title: 'Экспорт Кошелька', }, + import: { + title: 'import', + explanation: + "Write here you mnemonic, private key, WIF, or anything you've got. BlueWallet will do it's best to guess the correct format and import your wallet", + imported: 'Imported', + error: 'Failed to import. Is it event valid?', + success: 'Success', + do_import: 'Import', + scan_qr: 'or scan QR code instead?', + }, scanQrWif: { go_back: 'Назад', cancel: 'Отмена', @@ -57,6 +75,7 @@ module.exports = { with_address: ' с адресом ', imported_segwit: 'Импортированый SegWit', imported_legacy: 'Импортированый Legacy', + imported_watchonly: 'Imported Watch-only', }, }, transactions: { @@ -103,6 +122,7 @@ module.exports = { satoshi_per_byte: 'Сатоши на байт', memo: 'Примечание', broadcast: 'Отправить', + not_enough_fee: 'Not enough fee. Increase the fee', }, }, receive: { diff --git a/loc/ua.js b/loc/ua.js index 7c55bf7c..d1322042 100644 --- a/loc/ua.js +++ b/loc/ua.js @@ -3,6 +3,10 @@ module.exports = { storage_is_encrypted: 'Ваше сховище зашифроване. Введіть пароль для розшифровки', enter_password: 'Введіть пароль', bad_password: 'Невірний пароль, спробуйте ще раз', + months_ago: 'months ago', + days_ago: 'days ago', + hours_ago: 'hours ago', + never: 'never', }, wallets: { list: { @@ -11,6 +15,12 @@ module.exports = { title: 'Мої Біткоїн Гаманці', header: 'Гаманець це секретний (приватний) ключ, і відповідна йому адреса на яку можна отримувати біткоїни', add: 'Додати Гаманець', + create_a_wallet: 'Create a wallet', + create_a_wallet1: "It's free and you can create", + create_a_wallet2: 'as many as you like', + latest_transaction: 'latest transaction', + empty_txs1: 'Your transactions will appear here,', + empty_txs2: 'none at the moment', }, add: { title: 'Додати Гаманець', @@ -19,6 +29,14 @@ module.exports = { scan: 'Відсканувати', create: 'Створити', label_new_segwit: 'Новий SegWit', + wallet_name: 'wallet name', + wallet_type: 'wallet type', + or: 'or', + import_wallet: 'Import wallet', + imported: 'Imported', + coming_soon: 'Coming soon', + lightning: 'Lightning', + bitcoin: 'Bitcoin', }, details: { title: 'Інформація про Гаманець', @@ -34,6 +52,16 @@ module.exports = { export: { title: 'Експорт Гаманця', }, + import: { + title: 'import', + explanation: + "Write here you mnemonic, private key, WIF, or anything you've got. BlueWallet will do it's best to guess the correct format and import your wallet", + imported: 'Imported', + error: 'Failed to import. Is it event valid?', + success: 'Success', + do_import: 'Import', + scan_qr: 'or scan QR code instead?', + }, scanQrWif: { go_back: 'Назад', cancel: 'Відміна', @@ -47,6 +75,7 @@ module.exports = { with_address: ' з адресою ', imported_segwit: 'Імпортований SegWit', imported_legacy: 'Імпортований Legacy', + imported_watchonly: 'Imported Watch-only', }, }, transactions: { @@ -93,6 +122,7 @@ module.exports = { satoshi_per_byte: 'Сатоші на байт', memo: 'Примітка', broadcast: 'Відправити', + not_enough_fee: 'Not enough fee. Increase the fee', }, }, receive: {