Merge pull request #242 from Bitcoin-com/wallet/prod

Wallet/prod
This commit is contained in:
Jean-Baptiste Dominguez 2018-08-07 23:01:10 +09:00 committed by GitHub
commit e127b81e7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
133 changed files with 20650 additions and 5514 deletions

View file

@ -8,6 +8,21 @@ module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
exec: {
get_nwjs_for_pkg: {
command: 'if [ ! -d ./cache/0.19.5-pkg/osx64/nwjs.app ]; then cd ./cache; curl https://dl.nwjs.io/v0.19.5-mas-beta/nwjs-mas-v0.19.5-osx-x64.zip --output nwjs.zip; unzip nwjs.zip; mkdir -p ./0.19.5-pkg/osx64; cp -R ./nwjs-mas-v0.19.5-osx-x64/nwjs.app ./0.19.5-pkg/osx64/; fi'
},
create_others_dist: {
command: 'sh webkitbuilds/create-others-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"'
},
create_dmg_dist: {
command: 'sh webkitbuilds/create-dmg-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"'
},
create_pkg_dist: {
command: 'sh webkitbuilds/create-pkg-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>" "<%= pkg.nameCaseNoSpace %>" "<%= pkg.title %>"'
},
sign_desktop_dist: {
command: 'sh webkitbuilds/sign-desktop-dist.sh "<%= pkg.name %>" "<%= pkg.fullVersion %>"'
},
appConfig: {
command: 'node ./util/buildAppConfig.js'
},
@ -20,9 +35,6 @@ module.exports = function(grunt) {
cordovaclean: {
command: 'make -C cordova clean'
},
macos: {
command: 'sh webkitbuilds/build-macos.sh sign'
},
coveralls: {
command: 'cat coverage/report-lcov/lcov.info |./node_modules/coveralls/bin/coveralls.js'
},
@ -61,7 +73,7 @@ module.exports = function(grunt) {
stdin: true,
},
desktopsign: {
cmd: 'gpg -u E0AE67E7 --output webkitbuilds/<%= pkg.title %>-linux.zip.sig --detach-sig webkitbuilds/<%= pkg.title %>-linux.zip ; gpg -u E0AE67E7 --output webkitbuilds/<%= pkg.title %>.exe.sig --detach-sig webkitbuilds/<%= pkg.title %>.exe'
cmd: 'gpg -u E0AE67E7 --output webkitbuilds/others/<%= pkg.title %>-linux.zip.sig --detach-sig webkitbuilds/others/<%= pkg.title %>-linux.zip ; gpg -u E0AE67E7 --output webkitbuilds/others/<%= pkg.title %>.exe.sig --detach-sig webkitbuilds/others/<%= pkg.title %>.exe'
},
desktopverify: {
cmd: 'gpg --verify webkitbuilds/<%= pkg.title %>-linux.zip.sig webkitbuilds/<%= pkg.title %>-linux.zip; gpg --verify webkitbuilds/<%= pkg.title %>.exe.sig webkitbuilds/<%= pkg.title %>.exe'
@ -124,6 +136,7 @@ module.exports = function(grunt) {
},
angular: {
src: [
'src/shim/shim.js',
'bower_components/qrcode-generator/js/qrcode.js',
'bower_components/qrcode-generator/js/qrcode_UTF8.js',
'bower_components/moment/min/moment-with-locales.js',
@ -148,15 +161,33 @@ module.exports = function(grunt) {
],
dest: 'www/lib/bitcoin-cash-js.js'
},
bitanalytics: {
src: [
'bitanalytics/bitanalytics-0.1.0.js'
],
dest: 'www/lib/bitanalytics.js'
},
js: {
src: [
'src/js/app.js',
'src/js/routes.js',
'src/js/decorators/*.js',
'src/js/directives/*.js',
'!src/js/directives/*.spec.js',
'src/js/filters/*.js',
'!src/js/filters/*.spec.js',
'src/js/models/*.js',
'!src/js/models/*.spec.js',
'src/js/services/*.js',
'!src/js/services/*.spec.js',
'src/js/controllers/**/*.js',
'!src/js/controllers/**/*.spec.js',
'src/js/translations.js',
'src/js/appConfig.js',
'src/js/externalServices.js',
@ -177,7 +208,8 @@ module.exports = function(grunt) {
files: {
'www/js/app.js': ['www/js/app.js'],
'www/lib/angular-components.js': ['www/lib/angular-components.js'],
'www/lib/bitcoin-cash-js.js': ['www/lib/bitcoin-cash-js.js']
'www/lib/bitcoin-cash-js.js': ['www/lib/bitcoin-cash-js.js'],
'www/lib/bitanalytics.js': ['www/lib/bitanalytics.js']
}
}
},
@ -222,38 +254,78 @@ module.exports = function(grunt) {
expand: true,
cwd: 'webkitbuilds/',
src: ['.desktop', '../www/img/app/favicon.ico', '../resources/<%= pkg.name %>/linux/512x512.png'],
dest: 'webkitbuilds/<%= pkg.title %>/linux64/',
dest: 'webkitbuilds/others/<%= pkg.title %>/linux64/',
flatten: true,
filter: 'isFile'
}],
}
},
nwjs: {
options: {
appName: '<%= pkg.title %>',
platforms: ['win64', 'osx64', 'linux64'],
buildDir: './webkitbuilds',
version: '0.19.5',
macIcns: './resources/<%= pkg.name %>/mac/app.icns',
exeIco: './www/img/app/logo.ico',
macPlist: {
'CFBundleURLTypes': [
{
'CFBundleURLName': 'URI Handler',
'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>']
}
]
}
others: {
options: {
appName: '<%= pkg.nameCaseNoSpace %>',
platforms: ['win64', 'linux64'],
buildDir: './webkitbuilds/others',
version: '0.19.5',
exeIco: './www/img/app/logo.ico'
},
src: ['./package.json', './www/**/*']
},
dmg: {
options: {
appName: '<%= pkg.nameCaseNoSpace %>',
platforms: ['osx64'],
buildDir: './webkitbuilds/dmg',
version: '0.19.5',
macIcns: './resources/<%= pkg.name %>/mac/app.icns',
exeIco: './www/img/app/logo.ico',
macPlist: {
'CFBundleDisplayName': '<%= pkg.title %>',
'CFBundleShortVersionString': '<%= pkg.version %>',
'CFBundleVersion': '<%= pkg.androidVersion %>',
'LSApplicationCategoryType': 'public.app-category.finance',
'CFBundleURLTypes': [
{
'CFBundleURLName': 'URI Handler',
'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>']
}
]
}
},
src: ['./package.json', './www/**/*']
},
pkg: {
options: {
appName: '<%= pkg.nameCaseNoSpace %>',
platforms: ['osx64'],
buildDir: './webkitbuilds/pkg',
version: '0.19.5',
macIcns: './resources/<%= pkg.name %>/mac/pkg/app.icns',
exeIco: './www/img/app/logo.ico',
macPlist: {
'CFBundleIdentifier': 'com.bitcoin.mwallet.mac',
'CFBundleDisplayName': '<%= pkg.title %>',
'CFBundleShortVersionString': '<%= pkg.version %>',
'CFBundleVersion': '<%= pkg.androidVersion %>',
'LSApplicationCategoryType': 'public.app-category.finance',
'CFBundleURLTypes': [
{
'CFBundleURLName': 'URI Handler',
'CFBundleURLSchemes': ['bitcoin', '<%= pkg.name %>']
}
]
}
},
src: ['./package.json', './www/**/*']
},
src: ['./package.json', './www/**/*']
},
compress: {
linux: {
options: {
archive: './webkitbuilds/<%= pkg.title %>-linux.zip'
archive: './webkitbuilds/others/<%= pkg.title %>-linux.zip'
},
expand: true,
cwd: './webkitbuilds/<%= pkg.title %>/linux64/',
cwd: './webkitbuilds/others/<%= pkg.title %>/linux64/',
src: ['**/*'],
dest: '<%= pkg.title %>-linux/'
}
@ -272,9 +344,6 @@ module.exports = function(grunt) {
grunt.registerTask('default', ['nggettext_compile', 'exec:appConfig', 'exec:externalServices', 'browserify', 'sass', 'concat', 'copy:ionic_fonts', 'copy:ionic_js']);
grunt.registerTask('prod', ['default', 'uglify']);
grunt.registerTask('translate', ['nggettext_extract']);
grunt.registerTask('desktop', ['prod', 'nwjs', 'copy:linux', 'compress:linux']);
grunt.registerTask('osx', ['prod', 'nwjs', 'exec:macos', 'exec:osxsign']);
grunt.registerTask('osx-debug', ['default', 'nwjs']);
grunt.registerTask('chrome', ['default','exec:chrome']);
grunt.registerTask('wp', ['prod', 'exec:wp']);
grunt.registerTask('wp-copy', ['default', 'exec:wpcopy']);
@ -286,6 +355,23 @@ module.exports = function(grunt) {
grunt.registerTask('android-debug', ['exec:androiddebug', 'exec:androidrun']);
grunt.registerTask('android', ['exec:android']);
grunt.registerTask('android-release', ['prod', 'exec:android', 'exec:androidsign']);
grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']);
grunt.registerTask('desktopsign', ['exec:desktopsign', 'exec:desktopverify']);
// Build desktop
grunt.registerTask('desktop-build', ['desktop-others', 'desktop-osx-dmg', 'desktop-osx-pkg']);
// Build desktop win64 & linux64
grunt.registerTask('desktop-others', ['prod', 'nwjs:others', 'copy:linux', 'exec:create_others_dist']);
// Build desktop osx pkg
grunt.registerTask('desktop-osx-pkg', ['prod', 'exec:get_nwjs_for_pkg', 'nwjs:pkg', 'exec:create_pkg_dist']);
// Build desktop osx dmg
grunt.registerTask('desktop-osx-dmg', ['prod', 'nwjs:dmg', 'exec:create_dmg_dist']);
// Sign desktop
grunt.registerTask('desktop-sign', ['exec:sign_desktop_dist']);
// Release desktop
grunt.registerTask('desktop-release', ['desktop-build', 'desktop-sign']);
};

View file

@ -11,7 +11,10 @@ var templates = {
'ionic.config.json': '/',
'.desktop': 'webkitbuilds/',
'setup-win.iss': 'webkitbuilds/',
'build-macos.sh': 'webkitbuilds/',
'create-dmg-dist.sh': 'webkitbuilds/',
'create-others-dist.sh': 'webkitbuilds/',
'create-pkg-dist.sh': 'webkitbuilds/',
'sign-desktop-dist.sh': 'webkitbuilds/',
'manifest.json': 'chrome-app/',
// 'bower.json': '/',
};

View file

@ -2,7 +2,7 @@
"packageName": "bitcoin.com",
"packageDescription": "Bitcoin.com Wallet",
"packageNameId": "com.bitcoin.mwallet",
"userVisibleName": "Bitcoin.com",
"userVisibleName": "Bitcoin.com Wallet",
"purposeLine": "Bitcoin.com Wallet",
"bundleName": "bitcoincom",
"appUri": "bitcoincom",
@ -18,15 +18,15 @@
"appDescription": "Bitcoin.com Wallet",
"winAppName": "BitcoinWallet",
"WindowsStoreIdentityName": "18C7659D.Bitcoin.com-SecureBitcoinWallet",
"WindowsStoreDisplayName": "Bitcoin.com - Secure Bitcoin Wallet",
"WindowsStoreDisplayName": "Bitcoin.com Wallet",
"wpPublisherId": "{31cdd08b-457c-413d-b440-f6665eec847d}",
"wpProductId": "{5381aa50-9069-11e4-84cc-293caf9cbdc8}",
"windowsAppId": "804636ee-b017-4cad-8719-e58ac97ffa5c",
"pushSenderId": "1036948132229",
"description": "A Secure Bitcoin Wallet",
"version": "4.11.1",
"fullVersion": "4.11-hotfix1",
"androidVersion": "411100",
"version": "4.13.2",
"fullVersion": "4.13-rc3",
"androidVersion": "413200",
"_extraCSS": "",
"_enabledExtensions": {
"coinbase": false,

View file

@ -72,6 +72,9 @@
<plugin name="cordova-plugin-queries-schemes" spec="~0.1.5" />
<plugin name="cordova-plugin-firebase" spec="https://github.com/arnesson/cordova-plugin-firebase.git" />
<plugin name="cordova-plugin-wkwebview-inputfocusfix" spec="https://github.com/onderceylan/cordova-plugin-wkwebview-inputfocusfix.git" />
<plugin name="cordova-plugin-media" spec="~5.0.2">
<variable name="KEEP_AVAUDIOSESSION_ALWAYS_ACTIVE" value="NO" />
</plugin>
<!-- Supported Platforms -->
<engine name="ios" spec="~4.5.3" />
<engine name="android" spec="~6.3.0" />

View file

@ -1,11 +1,5 @@
#!/bin/bash
SHOULD_SIGN=$1
if [ "$SHOULD_SIGN" ]
then
echo "Will sign the APP"
fi
# by Andy Maloney
# http://asmaloney.com/2013/07/howto/packaging-a-mac-os-x-application-using-a-dmg/
@ -16,21 +10,25 @@ if [ -d "$dir" ]; then
fi
# set up your app name, architecture, and background image file name
APP_NAME="*USERVISIBLENAME*"
APP_PACKAGE=$1
APP_VERSION=$2
APP_NAME=$3
APP_FULLNAME=$4
rm dmg-background.tiff
ln -s ../resources/*PACKAGENAME*/mac/dmg-background.tiff dmg-background.tiff
ln -s ../resources/bitcoin.com/mac/dmg-background.tiff dmg-background.tiff
rm volume-icon.icns
ln -s ../resources/*PACKAGENAME*/mac/volume-icon.icns volume-icon.icns
ln -s ../resources/bitcoin.com/mac/volume-icon.icns volume-icon.icns
DMG_VOLUME_ICON="volume-icon.icns"
DMG_BACKGROUND_IMG="dmg-background.tiff"
PATH_NAME="${APP_NAME}/osx64/"
PATH_NAME="dmg/${APP_NAME}/osx64/"
# you should not need to change these
APP_EXE="${PATH_NAME}${APP_NAME}.app/Contents/MacOS/nwjs"
VOL_NAME="${APP_NAME}"
DMG_TMP="${VOL_NAME}-temp.dmg"
DMG_FINAL="${VOL_NAME}.dmg"
DMG_TMP="dmg/${VOL_NAME}-temp.dmg"
DMG_FINAL="dmg/${VOL_NAME}.dmg"
STAGING_DIR="tmp"
# Check the background image DPI and convert it if it isn't 72x72
@ -66,25 +64,6 @@ SIZE=250
if [ $? -ne 0 ]; then
echo "Error: Cannot compute size of staging dir"
exit
fi
# Sign Code (MATIAS)
if [ $SHOULD_SIGN ]
then
echo "Signing ${APP_NAME} DMG"
export IDENTITY="3rd Party Mac Developer Application: BitPay, Inc. (884JRH5R93)"
# not need for 'out of app store' distribution (?)
# export PARENT_PLIST=parent.plist
# export CHILD_PLIST=child.plist
export APP_PATH=${STAGING_DIR}/${APP_NAME}.app
codesign --deep -s "${IDENTITY}" $APP_PATH"/Contents/Versions/52.0.2743.82/nwjs Helper.app" && echo "Sign 1"
codesign --deep -s "${IDENTITY}" $APP_PATH"/Contents/Versions/52.0.2743.82/nwjs Framework.framework/Resources/app_mode_loader.app" && echo "Sign 2"
codesign --deep -s "${IDENTITY}" $APP_PATH && echo "Sign 3"
echo "Signing Done"
fi
# create the temp DMG file
@ -175,6 +154,14 @@ hdiutil detach "${DEVICE}"
echo "Creating compressed image"
hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}"
export DIST_PATH="dist"
if [ ! -d $DIST_PATH ]; then
mkdir $DIST_PATH
fi
cp -vR "${DMG_FINAL}" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg"
# clean up
rm -rf "${DMG_TMP}"
rm -rf "${STAGING_DIR}"

View file

@ -0,0 +1,54 @@
#!/bin/bash
# make sure we are in the correct dir when we double-click a .command file
dir=${0%/*}
if [ -d "$dir" ]; then
cd "$dir"
fi
# set up your app name, architecture, and background image file name
APP_PACKAGE=$1
APP_VERSION=$2
APP_NAME=$3
APP_FULLNAME=$4
export APP_LINUX_PATH="others/${APP_NAME}/linux64"
export APP_WIN_PATH="others/${APP_NAME}/win64"
export DIST_PATH="dist"
if [ ! -d $DIST_PATH ]; then
mkdir $DIST_PATH
fi
##
# LINUX
echo "Building Linux..."
# Building package
cp -R $APP_LINUX_PATH bitcoin-com-wallet
tar -cvzf "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz" bitcoin-com-wallet
# Clean
rm -R bitcoin-com-wallet
echo "Linux Done."
##
# WINDOWS
echo "Building Windows..."
# Building package
cp -R $APP_WIN_PATH bitcoin-com-wallet
zip -r "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip" bitcoin-com-wallet
# Clean
rm -R bitcoin-com-wallet
echo "Windows Done."
echo "Done."
exit

View file

@ -0,0 +1,45 @@
#!/bin/bash
# make sure we are in the correct dir when we double-click a .command file
dir=${0%/*}
if [ -d "$dir" ]; then
cd "$dir"
fi
# set up your app name, architecture, and background image file name
APP_PACKAGE=$1
APP_VERSION=$2
APP_NAME=$3
APP_FULLNAME=$4
rm entitlements-child.plist
ln -s ../resources/bitcoin.com/mac/pkg/entitlements-child.plist entitlements-child.plist
rm entitlements-parent.plist
ln -s ../resources/bitcoin.com/mac/pkg/entitlements-parent.plist entitlements-parent.plist
rm build.cfg
ln -s ../resources/bitcoin.com/mac/pkg/build.cfg build.cfg
rm build_mas.py
ln -s ../resources/bitcoin.com/mac/pkg/build_mas.py build_mas.py
echo "Signing ${APP_NAME}"
export APP_PATH="pkg/${APP_NAME}/osx64/${APP_NAME}"
export TMP_PATH="tmp"
export DIST_PATH="dist"
rm -rf $TMP_PATH
mkdir $TMP_PATH
if [ ! -d $DIST_PATH ]; then
mkdir $DIST_PATH
fi
python build_mas.py -C build.cfg -O "${TMP_PATH}/${APP_NAME}.app" -I "${APP_PATH}.app" -P "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg"
echo "Signing Done"
echo "Done."
exit

View file

@ -11,7 +11,7 @@
<link rel="stylesheet" type="text/css" href="css/chartist.css">
<link rel="stylesheet" type="text/css" href="css/bitcoin.com.css">
<link rel="stylesheet" type="text/css" href="css/icomoon.css">
<title>*USERVISIBLENAME* - *PURPOSELINE*</title>
<title>*USERVISIBLENAME*</title>
<link rel="shortcut icon" href="img/app/favicon.ico">
</head>
<body>
@ -31,6 +31,7 @@
<script src="lib/ionic.bundle.min.js"></script>
<script src="lib/angular-components.js"></script>
<script src="lib/bitcoin-cash-js.js"></script>
<script src="lib/bitanalytics.js"></script>
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script src="js/moment.min.js"></script>

View file

@ -3,6 +3,7 @@
"description": "*DESCRIPTION*",
"author": "BitPay",
"version": "*VERSION*",
"androidVersion": "*ANDROIDVERSION*",
"fullVersion": "*FULLVERSION*",
"keywords": [
"bitcoin",
@ -14,8 +15,9 @@
],
"main": "www/index.html",
"title": "*USERVISIBLENAME*",
"nameCaseNoSpace": "*NAMECASENOSPACE*",
"window": {
"title": "*USERVISIBLENAME* - *PURPOSELINE*",
"title": "*USERVISIBLENAME*",
"icon": "www/img/app/icon.png",
"toolbar": false,
"show": true,
@ -69,6 +71,8 @@
"grunt-angular-gettext": "^2.2.3",
"grunt-browserify": "^5.0.0",
"grunt-cli": "^1.2.0",
"grunt-curl": "^2.4.1",
"grunt-zip": "^0.17.1",
"grunt-contrib-compress": "^1.3.0",
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-copy": "^1.0.0",
@ -85,6 +89,7 @@
"scripts": {
"postinstall": "bower install",
"start": "npm run build:www && ionic serve --nolivereload --nogulp -s --address 0.0.0.0",
"start:chrome": "npm run build:www && ionic serve --nolivereload --nogulp -s --address 0.0.0.0 --browser \"google chrome\"",
"start:ios": "npm run build:www && npm run build:ios && npm run open:ios",
"start:android": "npm run build:www && npm run build:android && npm run run:android",
"start:windows": "npm run build:www && npm run build:windows",
@ -98,23 +103,27 @@
"build:ios-release": "cordova prepare ios && cordova build ios --release",
"build:android-release": "cordova prepare android && cordova build android --release",
"build:windows-release": "cordova prepare windows && cordova build windows --release --arch=\"ARM\"",
"build:desktop": "grunt desktop",
"build:osx": "grunt osx",
"build:desktop-release": "grunt desktop-release",
"build:desktop": "grunt desktop-build",
"build:osx-pkg": "grunt desktop-osx-pkg",
"build:osx-dmg": "grunt desktop-osx-dmg",
"build:others": "grunt desktop-others",
"sign:desktop": "grunt desktop-sign",
"open:ios": "open platforms/ios/*.xcodeproj",
"open:android": "open -a open -a /Applications/Android\\ Studio.app platforms/android",
"final:www": "npm run build:www-release",
"final:ios": "npm run final:www && npm run build:ios-release && npm run open:ios",
"final:android": "npm run final:www && npm run build:android-release && npm run sign:android && npm run run:android-release",
"final:windows": "npm run final:www && npm run build:windows-release",
"final:desktop": "npm run build:desktop && npm run build:osx",
"final:desktop": "npm run final:www && npm run build:desktop-release",
"run:android": "cordova run android --device",
"run:android-release": "cordova run android --device --release",
"log:android": "adb logcat | grep chromium",
"sign:android": "rm -f platforms/android/build/outputs/apk/android-release-signed-aligned.apk; jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../bitcoin-com-release-key.jks -signedjar platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-unsigned.apk bitcoin-com && $ANDROID_HOME/build-tools/27.0.1/zipalign -v 4 platforms/android/build/outputs/apk/android-release-signed.apk platforms/android/build/outputs/apk/android-release-signed-aligned.apk",
"apply:copay": "npm i fs-extra && cd app-template && node apply.js copay && npm i && cordova prepare",
"apply:bitpay": "npm i fs-extra && cd app-template && node apply.js bitpay && npm i && cordova prepare",
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare",
"test": "echo \"no package tests configured\"",
"apply:bitcoincom": "npm i fs-extra && cd app-template && node apply.js bitcoincom && npm i && cordova prepare",
"test": "karma start test/karma.conf.js --single-run",
"clean": "trash platforms && trash plugins && cordova prepare",
"unstage-package": "git reset package.json",
"clean-all": "git clean -dfx"
@ -123,6 +132,10 @@
"cordova": "^6.3.1",
"grunt": "^1.0.1",
"ionic": "^3.6.0",
"jasmine-core": "^3.1.0",
"karma": "^2.0.2",
"karma-chrome-launcher": "^2.2.0",
"karma-jasmine": "^1.1.2",
"trash-cli": "^1.4.0",
"lodash": "^4.17.4",
"pre-commit": "^1.1.3"

View file

@ -0,0 +1,40 @@
#!/bin/bash
# make sure we are in the correct dir when we double-click a .command file
dir=${0%/*}
if [ -d "$dir" ]; then
cd "$dir"
fi
APP_PACKAGE=$1
APP_VERSION=$2
export DIST_PATH="dist"
##
# INIT GPG (YOU NEED THE PRIVATE KEY CONNECTED TO YOUR DESKTOP)
# gpg --card-edit
##
# LINUX
# Sig tar.gz
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-linux-x64.tar.gz"
##
# WINDOWS
# Sig zip
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-win-x64.zip"
##
# OSX
# Sig dmg
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.dmg"
# Sig pkg
gpg --yes --output "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" --detach-sig "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg"
gpg --verify "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg.sig" "$DIST_PATH/${APP_PACKAGE}-wallet-${APP_VERSION}-osx.pkg"

File diff suppressed because it is too large Load diff

View file

@ -1,23 +1,23 @@
Secure bitcoin on your own terms with an open source, multisignature wallet from BitPay.
Copay users can hold funds individually or share finances securely with other users with multisignature wallets, which prevent unauthorized payments by requiring multiple approvals. Here are some ways Copay can be used with others:
To save for vacations or joint purchases with friends
To track family spending and allowances
To manage business, club, or organization funds and expenses
We built the following features into this version of Copay for a bitcoin wallet that doesn't compromise on security or accessibility:
Multiple wallet creation and management in-app
Intuitive multisignature security for personal or shared wallets
Easy spending proposal flow for shared wallets and group payments
Hierarchical deterministic (HD) address generation and wallet backups
Device-based security: all private keys are stored locally, not in the cloud
Support for Bitcoin testnet wallets
Synchronous access across all major mobile and desktop platforms
Payment protocol (BIP70-BIP73) support: easily-identifiable payment requests and verifiably secure bitcoin payments
Support for 150+ currency pricing options and unit denomination in BTC or bits
Email notifications for payments and transfers
Customizable wallet naming and background colors
9 supported languages (EN, CS, FR, DE, IT, ES, JA, PL, RU)
Copay is free and open source software run on non-proprietary servers, so there's no need to rely on any company for continuous support. Anyone can review or contribute to Copay's source code on GitHub (https://github.com/bitpay/copay).
Secure bitcoin on your own terms with an open source, multisignature wallet from BitPay.
Copay users can hold funds individually or share finances securely with other users with multisignature wallets, which prevent unauthorized payments by requiring multiple approvals. Here are some ways Copay can be used with others:
To save for vacations or joint purchases with friends
To track family spending and allowances
To manage business, club, or organization funds and expenses
We built the following features into this version of Copay for a bitcoin wallet that doesn't compromise on security or accessibility:
Multiple wallet creation and management in-app
Intuitive multisignature security for personal or shared wallets
Easy spending proposal flow for shared wallets and group payments
Hierarchical deterministic (HD) address generation and wallet backups
Device-based security: all private keys are stored locally, not in the cloud
Support for Bitcoin testnet wallets
Synchronous access across all major mobile and desktop platforms
Payment protocol (BIP70-BIP73) support: easily-identifiable payment requests and verifiably secure bitcoin payments
Support for 150+ currency pricing options and unit denomination in BTC or bits
Email notifications for payments and transfers
Customizable wallet naming and background colors
9 supported languages (EN, CS, FR, DE, IT, ES, JA, PL, RU)
Copay is free and open source software run on non-proprietary servers, so there's no need to rely on any company for continuous support. Anyone can review or contribute to Copay's source code on GitHub (https://github.com/bitpay/copay).

View file

@ -1 +1 @@

3760
i18n/po/ca/template-ca.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Czech\n"
"Language: cs\n"
"PO-Revision-Date: 2018-05-08 00:44-0400\n"
"PO-Revision-Date: 2018-07-27 08:43\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Účet"
msgid "Account Number"
msgstr "Číslo účtu"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Okamžité transakce s nízkou platbou"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Účty"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Koupit &amp; prodat Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Koupit Bitcoin"
@ -615,10 +620,14 @@ msgstr "Připojování ke Glidera..."
msgid "Connection reset by peer"
msgstr "Připojení přerušeno druhou stranou"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Kontakty"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Uložené, často používané adresy"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Pokračovat"
@ -819,7 +828,7 @@ msgstr "Vytvořit sdílenou peněženku"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Vytvořit Bitcoin peněženku"
@ -989,7 +998,7 @@ msgstr "Povolit push notifikace"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr ""
msgstr "Povolit zvuky"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
@ -1342,7 +1351,7 @@ msgstr "Začněte"
#: www/views/addressbook.html:20
msgid "Get started by adding your first one."
msgstr "Začněte přidáním své první."
msgstr "Začněte přidáním prvního."
#: src/js/services/onGoingProcess.js:23
msgid "Getting fee levels..."
@ -1582,7 +1591,7 @@ msgstr "Nesprávná síťová adresa"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr ""
msgstr "Nedostatečné potvrzené prostředky"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1709,7 +1718,7 @@ msgstr "Načítání informací o transakci..."
#: www/views/tab-settings.html:100
msgid "Lock App"
msgstr "Uzamknout aplikaci"
msgstr "Uzamknutí aplikace"
#: src/js/controllers/lockSetup.js:23
msgid "Lock by Fingerprint"
@ -2049,7 +2058,7 @@ msgstr "Otevřít GitHub projekt"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr ""
msgstr "Otevřít Explorer"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2256,7 +2265,7 @@ msgstr "Stiskněte znovu pro ukončení"
#: src/js/services/feeService.js:11
msgid "Priority"
msgstr "Priorita"
msgstr "Priorit"
#: www/views/includes/incomingDataMenu.html:80
msgid "Private Key"
@ -2529,6 +2538,14 @@ msgstr "Vyhledávání transakcí"
msgid "Search or enter bitcoin address"
msgstr "Vyhledat nebo zadat Bitcoin adresu"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Schránka"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Vaše schránka je prázdná"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Vyhledávání transakcí"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Poslat e-mailem"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Odeslat z"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Odeslat"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Vložit ze schránky"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Vložit adresu"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Převod mezi peněženkami"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Skenovat QR kód"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Odesílejte Bitcoin rychleji!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Odesílejte Bitcoin rychleji!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Uložte si často používané adresy a posílejte jim Bitcoin jedním kliknutím"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Přidat váš první kontakt"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Vaše Bitcoin peněženka je prázdná"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Chcete-li začít, nakupte Bitcoin Cash (BCH) nebo Bitcoin Core (BTC), nebo sdílejte svou adresu."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Můžete přijímat Bitcoin z jakékoliv peněženky nebo služby."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Chcete-li začít, budete muset vytvořit Bitcoin peněženku a Bitcoin získat."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Koupit Bitcoin"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Zobrazit mou adresu"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Odeslat maximální částku"
@ -3026,7 +3104,7 @@ msgstr "Chcete-li začít, nakupte Bitcoin nebo sdílejte svou adresu. Můžete
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Chcete-li začít, budete muset vytvořit Bitcoin peněženku a Bitcoin získat."
msgstr "Chcete-li začít, budete potřebovat vytvořit Bitcoin peněženku a získat Bitcoin."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3196,7 +3274,7 @@ msgstr "Zobrazit Podmínky použití"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr ""
msgstr "Zobrazit transakci na Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transakcí staženo"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-z-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Komunita"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Prohlédnout Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash hry"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Novinky"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Těžební pool"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Nástroje"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Grafy cen Bitcoinu"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash zdarma"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "Vaše Bitcoin peněženka je připravena!"

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Spanish\n"
"Language: es\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Cuenta"
msgid "Account Number"
msgstr "Número de cuenta"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Transacciones instantáneas con comisiones bajas"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Cuentas"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Comprar &amp; Vender Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Comprar Bitcoin"
@ -615,10 +620,14 @@ msgstr "Conectando a Glidera..."
msgid "Connection reset by peer"
msgstr "Conexión re establecida"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contactos"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Direcciones frecuentes guardadas"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continuar"
@ -819,7 +828,7 @@ msgstr "Crear billetera compartida"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Crear billetera"
@ -2529,6 +2538,14 @@ msgstr "Buscar transacciones"
msgid "Search or enter bitcoin address"
msgstr "Buscar o introducir dirección bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Portapapeles"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Portapapeles vacío"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Buscar transacciones"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Enviar por correo electrónico"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Enviar desde"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Enviar a"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Pegar portapapeles"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Pegar dirección"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Billetera a billetera"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Escanear código QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "¡Envía Bitcoin más rápido!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "¡Envía Bitcoin más rápido!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Guardar las direcciones que usas frecuentemente y envía Bitcoin en un click"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Añadie tu primer contacto"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Tu billetera Bitcoin está vacía"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Para empezar, compra Bitcoin Cash (BCH) o Bitcoin Core (BTC), o comparte tu dirección."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Puedes recibir bitcoin desde cualquier billetera o servicio."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para empezar, necesitarás crear una billetera y obtener bitcoins."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Comprar Bitcoin ahora"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Ver mi dirección"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Enviar la máxima cantidad"
@ -3026,7 +3104,7 @@ msgstr "Para empezar, compra bitcoin o comparte tu dirección. Puedes recibir bi
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para empezar, necesitarás crear una billetera y obtener bitcoins."
msgstr "Para empezar, necesitarás crear una billetera y obtener Bitcoins."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transacciones descargadas"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-de-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift - Cambia BTC a BCH"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Comunidad"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Reddit de Bitcoin Cash"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter de Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Explora Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Juegos de Bitcoin Cash"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Noticias"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Minería en la nube"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Herramientas"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Gráfica de precios Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash gratis"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "¡Tus billeteras Bitcoin están listas!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Persian\n"
"Language: fa\n"
"PO-Revision-Date: 2018-05-08 00:44-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "حساب"
msgid "Account Number"
msgstr "شماره حساب"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "معاملات فوری با پرداخت کم"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "حساب ها"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "خرید &amp; فروش بیتکوین"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "خرید بیتکوین"
@ -615,10 +620,14 @@ msgstr "در حال اتصال به Glidera..."
msgid "Connection reset by peer"
msgstr "ریست اتصال توسط همکار"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "تماسها"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "آدرس های ذخیره شده که اغلب مورد استفاده قرار گرفته اند"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "ادامه"
@ -819,7 +828,7 @@ msgstr "ایجاد کیف پول مشترک"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "ایجاد کیف پول بیتکوین"
@ -989,7 +998,7 @@ msgstr "فعال کردن اعلان های با فرمت push"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr ""
msgstr "فعال کردن صدا"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
@ -1582,7 +1591,7 @@ msgstr "آدرس شبکه نادرست"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr ""
msgstr "موجودی تائید شذه ناکافی"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -2049,7 +2058,7 @@ msgstr "باز کردن پروژه GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr ""
msgstr "باز کردن مرورگر"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2529,6 +2538,14 @@ msgstr "جستجوی تراکنش ها"
msgid "Search or enter bitcoin address"
msgstr "جستجو و یا وارد کردن آدرس بیتکوین"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "کلیپ بورد"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "کلیپ بورد شما خالی است"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "جستجوی تراکنش ها"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "ارسال توسط ایمیل"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "ارسال از"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "ارسال به"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "جای گذاری کلیپ برد"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "جای گذاری آدرس"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "انتقال پول از کیف پول به کیف پول"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "اسکن کد QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "ارسال سریع تر بیت کوین!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "ارسال سریع تر بیت کوین!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "ذخیره آدرس های اغلب استفاده شده و ارسال بیت کوین به آنها تنها با یک ضربه"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "اولین تماس خود اضافه کنید"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "کیف پول بیت کوین شما خالی است"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "برای شروع، Bitcoin Cash (BCH) یا Bitcoin Core (BTC) بخرید و یا آدرس خود را به اشتراک بگذارید."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "شما می توانید از هر کیف پول و یا خدمات بیت کوین دریافت کنید."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "برای شروع، شما نیاز دارید که یک کیف پول ایجاد کنید و مقداری بیتکوین تهیه کنید."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "خرید بیت کوین همین الان"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "نمایش آدرس من"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "ارسال حداکثر مقدار"
@ -3026,7 +3104,7 @@ msgstr "برای شروع، بیتکوین بخرید و یا آدرس خود ر
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "برای شروع، شما نیاز دارید که یک کیف پول ایجاد کنید و مقداری بیتکوین تهیه کنید."
msgstr "برای شروع، شما نیاز دارید که یک کیف پول بیت کوین ایجاد کرده و مقداری بیت کوین تهیه کنید."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3196,7 +3274,7 @@ msgstr "مشاهده شرایط و ضوابط خدمات"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr ""
msgstr "مشاهده تراکنش در Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} تراکنش دانلود شد"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}} از {{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "جامعه"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "توییتر Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "کاوش Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash Games"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "اخبار"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "استخر استخراج"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "ابزارها"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "نمودارهای قیمت بیت کوین"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "رایگان Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "کیف پول بیت کوین شما آماده است!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: French\n"
"Language: fr\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Compte"
msgid "Account Number"
msgstr "Numéro de compte"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Instant transactions with low fees"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Comptes"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Acheter &amp; vendre des bitcoins"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Acheter des bitcoins"
@ -615,10 +620,14 @@ msgstr "Connexion à Glidera..."
msgid "Connection reset by peer"
msgstr "Connexion réinitialisée par un pair"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contacts"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Adresses fréquemment utilisées enregistrées"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continuer"
@ -819,7 +828,7 @@ msgstr "Créer un portefeuille partagé"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Créer un portefeuille bitcoin"
@ -989,7 +998,7 @@ msgstr "Autoriser les notifications"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "Activer le son"
msgstr "Malayu"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
@ -2529,6 +2538,14 @@ msgstr "Rechercher des transactions"
msgid "Search or enter bitcoin address"
msgstr "Recherchez ou saisissez une adresse bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Presse-papiers"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Votre presse-papiers est vide"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Rechercher des transactions"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Envoyer par e-mail"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Envoyer à partir de"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Envoyer à"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Coller le contenu du presse-papiers"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Coller l'adresse"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Transfert de portefeuille à portefeuille"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Numérisez le code QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Envoyez des Bitcoin plus vite !"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Envoyez des Bitcoin plus vite !"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Enregistrez les adresses fréquemment utilisées et envoyez-leurs des Bitcoins en un seul geste"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Ajoutez votre premier contact"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Votre portefeuille Bitcoin est vide"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Pour commencer, achetez des Bitcoins Cash (BCH) ou des Bitcoins Core (BTC), ou partagez votre adresse."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Vous pouvez recevoir des Bitcoins de n'importe quel portefeuille ou service."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Acheter des Bitcoins maintenant"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Afficher mon adresse"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Envoyer le montant maximal"
@ -3026,7 +3104,7 @@ msgstr "Pour commencer, achetez des bitcoins ou partagez votre adresse. Vous pou
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Pour commencer, vous aurez besoin de créer un portefeuille bitcoin et d'obtenir quelques bitcoins."
msgstr "Pour commencer, vous aurez besoin de créer un portefeuille Bitcoin et d'obtenir quelques bitcoins."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transactions téléchargées"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-sur-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Communauté"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Reddit Bitcoin Cash"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Explorez Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Jeux Bitcoin Cash"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Nouvelles"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Coopératives de mineurs"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Outils"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Graphiques du prix du Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash Gratuit"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "Vos portefeuilles bitcoin sont prêts !"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Italian\n"
"Language: it\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Conto"
msgid "Account Number"
msgstr "Numero del Conto"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Transazioni istantanee con commissioni basse"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Account"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Comprare &amp; Vendere Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Acquista Bitcoin"
@ -615,10 +620,14 @@ msgstr "Connessione a Glidera..."
msgid "Connection reset by peer"
msgstr "Connessione ripristinata dall'utente"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contatti"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Indirizzi più utilizzati salvati"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continua"
@ -819,7 +828,7 @@ msgstr "Creare portafoglio condiviso"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Creare portafoglio bitcoin"
@ -2529,6 +2538,14 @@ msgstr "Cerca Transazioni"
msgid "Search or enter bitcoin address"
msgstr "Cerca o inserisci indirizzo bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Appunti"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Gli appunti sono vuoti"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Ricerca transazioni"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Invia via email"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Inviata Da"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Invia a"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Incolla appunti"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Incolla indirizzo"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Trasferimento da portafoglio a portafoglio"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Scansiona codice QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Invia Bitcoin più velocemente!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Invia Bitcoin più velocemente!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Salva gli indirizzi più utilizzati e invia Bitcoin con un solo tocco"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Aggiungi il tuo primo contatto"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Il tuo portafoglio Bitcoin è vuoto"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Per iniziare, acquista Bitcoin Cash (BCH) o Bitcoin Core (BTC), oppure condividi il tuo indirizzo."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Puoi ricevere Bitcoin da qualsiasi portafoglio o servizio."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Per iniziare, è necessario che tu crei un portafoglio bitcoin e ottenerne qualcuno."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Acquista subito Bitcoin"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Visualizza il mio indirizzo"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Inviare l'importo massimo"
@ -3026,7 +3104,7 @@ msgstr "Per iniziare, acquista bitcoin o condividi il tuo indirizzo. È possibil
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Per iniziare, è necessario che tu crei un portafoglio bitcoin e ottenerne qualcuno."
msgstr "Per iniziare, devi creare un portafoglio bitcoin e ottenere qualche bitcoin."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transazioni scaricate"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-di-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Community"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash su Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com su Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Esplora Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Giochi Bitcoin Cash"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "News"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Mining Pool"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Strumenti"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Tabella prezzi Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash gratis"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "I tuoi portafogli Bitcoin sono pronti!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "ポケット"
msgid "Account Number"
msgstr "ポケット番号"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "僅かな手数料で即時決済"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "アカウント一覧"
@ -402,7 +406,7 @@ msgstr "ビットコインは世界で<br>最も安全な仮想通貨。"
#: www/views/preferencesFee.html:11
msgid "Bitcoin transactions include a fee collected by miners on the network."
msgstr "ビットコインの取引はネットワークの安全を守る「採掘者」と呼ばれる達に送る手数料が含まれます。"
msgstr "ビットコインの取引はネットワークの安全を守る「採掘者」と呼ばれる達に送る手数料が含まれます。"
#: www/views/buyAmazon.html:108
msgid "Bought {{amountUnitStr}}"
@ -435,6 +439,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "ビットコインの購入&amp;売却"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "ビットコインを購入"
@ -617,10 +622,14 @@ msgstr "Glidera に接続中…"
msgid "Connection reset by peer"
msgstr "接続がピアによってリセットされました"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "連絡先"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "よく使う保存済みのアドレス"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "続ける"
@ -631,7 +640,7 @@ msgstr "翻訳に協力"
#: src/js/controllers/confirm.js:130
msgid "Copay only supports Bitcoin Cash using new version numbers addresses"
msgstr "Copay のビットコインキャッシュはビットコインと完全に異なる別通貨なので、アドレスの頭文字が異なります。"
msgstr "のビットコインキャッシュはビットコインと完全に異なる別通貨なので、アドレスの頭文字が異なります。"
#: src/js/services/bwcError.js:62
msgid "Copayer already in this wallet"
@ -821,7 +830,7 @@ msgstr "共有ウォレットを作成"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "ビットコインウォレット作成"
@ -991,7 +1000,7 @@ msgstr "プッシュ通知を有効化"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr "を有効にする"
msgstr "サウンドを有効にする"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
@ -1344,7 +1353,7 @@ msgstr "始めよう"
#: www/views/addressbook.html:20
msgid "Get started by adding your first one."
msgstr "初めての連絡先を追加しましょう。"
msgstr "連絡先を追加しましょう。"
#: src/js/services/onGoingProcess.js:23
msgid "Getting fee levels..."
@ -1869,7 +1878,7 @@ msgstr "バックアップは非常に重要です!"
#: www/views/addressbook.html:19
msgid "No contacts yet"
msgstr "連絡先が無い"
msgstr "連絡先はありません"
#: www/views/preferencesLogs.html:16
msgid "No entries for this log level"
@ -2002,7 +2011,7 @@ msgstr "今一度周りの環境をよく見てみましょう。隠しカメラ
#: src/js/services/popupService.js:72
#: www/views/modals/chooseFeeLevel.html:6
msgid "OK"
msgstr "わかりました"
msgstr "OK"
#: www/views/modals/tx-status.html:12
#: www/views/modals/tx-status.html:24
@ -2225,7 +2234,7 @@ msgstr "正しい順序で各単語をタップしてください。"
#: src/js/services/bwcError.js:101
msgid "Please upgrade Copay to perform this action"
msgstr "この操作を実行するにはCopayを最新バージョンに更新してください"
msgstr "この操作を実行するにはを最新バージョンに更新してください"
#: www/views/walletDetails.html:142
#: www/views/walletDetails.html:62
@ -2531,6 +2540,14 @@ msgstr "取引を検索"
msgid "Search or enter bitcoin address"
msgstr "連絡先検索かビットコインアドレスを指定"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "クリップボード"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "クリップボードは空です"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "取引を検索"
@ -2589,9 +2606,70 @@ msgid "Send by email"
msgstr "メールで送信"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "ここから送金"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "送金先:"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "クリップボードからペースト"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "アドレスをペースト"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "ウォレット間送金"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "QRコードを読み取る"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "ビットコイン送金をより高速に!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "ビットコイン送金をより高速に!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "よく使うアドレスを保存すればワンタップでビットコインを送金できます"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "最初の連絡先を追加"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "ビットコインウォレットが空です"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "始めるには、Bitcoin Cash (BCH) または Bitcoin Core (BTC) を購入するか、あなたのアドレスを共有してください。"
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "どのウォレットやサービスからでもビットコインを受け取ることができます。"
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "はじめに、ビットコインウォレットを作成し、ビットコインを入手する必要があります。"
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "今すぐビットコインを購入"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "自分のアドレスを表示"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "全残高を送金"
@ -3446,7 +3524,7 @@ msgstr "送金発生時のメール通知はどのメールアドレスで受け
#: www/views/addresses.html:19
msgid "Why?"
msgstr "なぜ?"
msgstr "なぜですか"
#: www/views/feedback/rateApp.html:10
msgid "Would you be willing to rate {{appName}} in the app store?"
@ -3638,3 +3716,51 @@ msgstr "{{updatingTxHistoryProgress}} 個の取引ダウンロード済み"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}} の{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "コミュニティ"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Bitcoin.com を参照"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash ゲーム"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "ニュース"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "マイニングプール"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "ツール"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "ビットコインの価格チャート"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "無料 Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "ビットコインウォレットが完成しました!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Korean\n"
"Language: ko\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "계정"
msgid "Account Number"
msgstr "계정 번호"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "낮은 수수료로 빠른 송금을"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "계정들"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "비트코인 구매 &amp; 판매"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "비트코인 구매"
@ -615,10 +620,14 @@ msgstr "Glidera에 연결 중..."
msgid "Connection reset by peer"
msgstr "연결 실패"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "연락처"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "자주 사용하는 저장된 주소"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "계속하기"
@ -819,7 +828,7 @@ msgstr "공유 지갑 만들기"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "비트코인 지갑 만들기"
@ -2529,6 +2538,14 @@ msgstr "거래 기록 검색하기"
msgid "Search or enter bitcoin address"
msgstr "비트코인 주소를 찾거나 작성"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "클립보드"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "클립보드가 비어 있습니다"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "거래 기록 검색"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "이메일로 보내기"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "출처"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "보내기"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "클립보드 붙여넣기"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "주소 붙여넣기"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "지갑 간 전송"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "QR 코드 스캔"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "비트코인 속성 전송!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "비트코인 속성 전송!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "자주 사용하는 주소를 저장하고 한 번의 탭으로 저장된 주소에 비트코인 전송"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "첫 번째 연락처 추가"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "비트코인 지갑이 비어 있습니다"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "시작하려면 비트코인 캐시(BCH) 또는 비트코인 코어(BTC)를 구매하거나 주소를 공유합니다."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "지갑 또는 서비스에서 비트코인을 받을 수 있습니다."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "시작하시기 위해선 비트코인 지갑을 생성하시거나 비트코인을 구매하세요."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "지금 비트코인 구매"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "내 주소 보기"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "최대 수량 보내기"
@ -3026,7 +3104,7 @@ msgstr "시작하시려면 비트코인을 구매하시거나 주소를 등록
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "시작하시기 위해선 비트코인 지갑을 생성하시거나 비트코인을 구매하세요."
msgstr "시작하려면 비트코인 지갑을 만들고 비트코인을 구매하십시오."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} 거래 내역 다운로드 완료"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.n}}의 {{wallet.m}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "커뮤니티"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "BCH Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com 트위터"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Bitcoin.com 탐색"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "BCH 게임"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "소식"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "채굴 풀"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "도구"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "비트코인 가격 차트"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "무료 BCH"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "비트코인 지갑이 완료되었습니다!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Dutch\n"
"Language: nl\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Account"
msgid "Account Number"
msgstr "Account Nummer"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Directe transacties tegen lage kosten"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Accounts"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Koop &amp; Verkoop Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Bitcoin kopen"
@ -615,10 +620,14 @@ msgstr "Verbinding maken met Glidera..."
msgid "Connection reset by peer"
msgstr "Verbinding is gereset door peer"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contactpersonen"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Opgeslagen veelgebruikte adressen"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Ga verder"
@ -819,7 +828,7 @@ msgstr "Gedeelde Portemonnee Aanmaken"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Bitcoin portemonnee aanmaken"
@ -2529,6 +2538,14 @@ msgstr "Doorzoek Transacties"
msgid "Search or enter bitcoin address"
msgstr "Zoeken of bitcoin adres invullen"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Klembord"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Uw klembord is leeg"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Doorzoek transacties"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Verstuur via email"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Verzenden vanuit"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Verzenden naar"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Klembord plakken"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Adres plakken"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Portemonnee overdracht"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Scan QR-code"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Stuur Bitcoin sneller!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Stuur Bitcoin sneller!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Sla veelgebruikte adressen op en verstuur ze Bitcoin met een druk op de knop"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Uw eerste contact toevoegen"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Uw Bitcoin portemonnee is leeg"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Om aan de slag te gaan, koop Bitcoin Cash (BCH) of Bitcoin Core (BTC), of deel uw adres."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "U kunt Bitcoin ontvangen van elke portemonnee of dienst."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Om aan de slag te gaan zult u een bitcoin portemonnee moeten aanmaken en wat bitcoin moeten verkrijgen."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Bitcoin kopen"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Toon mijn adres"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Verzend maximale hoeveelheid"
@ -3026,7 +3104,7 @@ msgstr "Om aan de slag te gaan, koop bitcoin of deel uw adres. U kunt bitcoin on
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Om aan de slag te gaan zult u een bitcoin portemonnee moeten aanmaken en wat bitcoin moeten verkrijgen."
msgstr "Om aan de slag te gaan, zult u een Bitcoin-portemonnee aan moeten maken en wat Bitcoin moeten verkrijgen."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transacties gedownload"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-van-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Community"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Bitcoin.com verkennen"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash spellen"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Nieuws"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Mining Pool"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Hulpmiddelen"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Bitcoin prijs grafieken"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Gratis Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "Uw bitcoin portemonnee is gereed!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Polish\n"
"Language: pl\n"
"PO-Revision-Date: 2018-05-08 00:44-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Konto"
msgid "Account Number"
msgstr "Numer konta"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Natychmiastowe transakcje z niskimi prowizjami"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Konta"
@ -359,12 +363,12 @@ msgstr "Adres bitcoin"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr ""
msgstr "Salda Bitcoin Cash (BCH)"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr ""
msgstr "Wsparcie Bitcoin Cash"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
@ -380,7 +384,7 @@ msgstr "Polityka prowizji sieci bitcoin"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr ""
msgstr "Portfele Bitcoin Core"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Kup &amp; sprzedaj bitcoiny"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Kup bitcoiny"
@ -615,10 +620,14 @@ msgstr "Łączenie z Gildera..."
msgid "Connection reset by peer"
msgstr "Połączenie zostało zresetowane"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Kontakty"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Zapisane często używane adresy"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Dalej"
@ -819,7 +828,7 @@ msgstr "Utwórz współdzielony portfel"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Utwórz portfel bitcoin"
@ -973,7 +982,7 @@ msgstr "Puste adresy osiągnęły limit. Nowe adresy nie mogą być generowane."
#: www/views/preferencesCash.html:17
msgid "Enable Bitcoin Cash wallet creation and operation within the App."
msgstr ""
msgstr "Włącz tworzenie i obsługę portfela Bitcoin Cash w aplikacji."
#: www/views/tab-scan.html:19
msgid "Enable camera access in your device settings to get started."
@ -989,7 +998,7 @@ msgstr "Włącz powiadomienia"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr ""
msgstr "Włącz dźwięk"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
@ -997,7 +1006,7 @@ msgstr "Włącz kamerę aby rozpocząć."
#: www/views/tab-settings.html:49
msgid "Enabled"
msgstr ""
msgstr "Włączono"
#: src/js/services/walletService.js:1047
#: src/js/services/walletService.js:1062
@ -1582,7 +1591,7 @@ msgstr "Nieprawidłowy adres"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr ""
msgstr "Niewystarczające potwierdzone środki"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -1927,7 +1936,7 @@ msgstr "Nie BIP44 portfel"
#: www/views/cashScan.html:46
msgid "Non eligible BTC wallets"
msgstr ""
msgstr "Niewspierane portfele BTC"
#: src/js/services/feeService.js:12
msgid "Normal"
@ -2000,7 +2009,7 @@ msgstr "Nadszedł czas, aby sprawdzić swoje otoczenie. Czy jesteś w pobliżu o
#: src/js/services/popupService.js:72
#: www/views/modals/chooseFeeLevel.html:6
msgid "OK"
msgstr ""
msgstr "OK"
#: www/views/modals/tx-status.html:12
#: www/views/modals/tx-status.html:24
@ -2019,7 +2028,7 @@ msgstr "O nie!"
#: src/js/controllers/buyMercadoLibre.js:306
msgid "Ok"
msgstr ""
msgstr "Ok"
#: www/views/tab-home.html:39
msgid "On this screen you can see all your wallets, accounts, and assets."
@ -2049,7 +2058,7 @@ msgstr "Otwórz projekt GitHub"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr ""
msgstr "Otwórz Explorer"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2065,7 +2074,7 @@ msgstr "Otwórz stronę internetową"
#: src/js/controllers/preferencesCash.js:32
msgid "Open bitcoincash.org?"
msgstr ""
msgstr "Otworzyć bitcoincash.org?"
#: src/js/controllers/cashScan.js:18
msgid "Open the recovery tool."
@ -2236,7 +2245,7 @@ msgstr "Proszę wybrać plik kopii zapasowej"
#: www/views/bitpayCard.html:81
msgid "Pre-Auth Holds"
msgstr ""
msgstr "Wstrzymanie przedautoryzacyjne"
#: www/views/tab-settings.html:40
msgid "Preferences"
@ -2349,7 +2358,7 @@ msgstr "Otrzymaj"
#: www/views/customAmount.html:44
msgid "Receive in"
msgstr ""
msgstr "Otrzymaj w"
#: www/views/includes/walletHistory.html:24
#: www/views/tx-details.html:18
@ -2507,7 +2516,7 @@ msgstr "Proszę zeskanować linie papilarne"
#: www/views/preferencesCash.html:23
msgid "Scan your wallets for Bitcoin Cash"
msgstr ""
msgstr "Skanuj portfele w poszukiwaniu Bitcoin Cash"
#: src/js/services/onGoingProcess.js:30
msgid "Scanning Wallet funds..."
@ -2529,6 +2538,14 @@ msgstr "Szukaj transakcji"
msgid "Search or enter bitcoin address"
msgstr "Wyszukaj lub wpisz adres bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Schowek"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "Schowek jest pusty"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Szukaj transakcji"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Wyślij przez e-mail"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Wyślij z"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Wyślij do"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Wklej ze schowka"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Wklej adres"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Transfer z portfela do portfela"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Zeskanuj kod QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Przesyłaj Bitcoiny szybciej!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Przesyłaj Bitcoiny szybciej!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Zapisz często używane adresy i wyślij im Bitcoin za pomocą jednego dotknięcia"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Dodaj swój pierwszy kontakt"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Twój portfel jest pusty"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Aby zacząć, kup Bitcoin Cash (BCH) lub Bitcoin Core (BTC), albo udostępnij swój adres."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Bitcoiny można odbierać z dowolnego portfela lub usługi."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Aby rozpocząć należy utworzyć portfel i dostać trochę bitcoinów."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Kup Bitcoin teraz"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Pokaż mój adres"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Wyślij całą kwotę"
@ -2760,7 +2838,7 @@ msgstr "Przesuń, aby wysłać"
#: www/views/cashScan.html:56
msgid "Some of your wallets are not eligible for Bitcoin Cash support. You can try to access BCH funds from these wallets using the"
msgstr ""
msgstr "Niektóre z twoich portfeli nie kwalifikują się do wsparcia Bitcoin Cash. Dostęp do środków BCH z tych portfeli można spróbować uzyskać, korzystając z"
#: src/js/controllers/create.js:88
#: src/js/controllers/join.js:71
@ -2781,7 +2859,7 @@ msgstr "Wymagane hasło wypłat"
#: www/views/walletDetails.html:173
msgid "Spending this balance will need significant Bitcoin network fees"
msgstr ""
msgstr "Wydanie tego salda będzie wymagało znacznych opłat sieciowych Bitcoin"
#: www/views/tab-send.html:28
msgid "Start sending bitcoin"
@ -2806,7 +2884,7 @@ msgstr "Super Ekonomiczna"
#: www/views/preferencesCash.html:11
msgid "Support Bitcoin Cash"
msgstr ""
msgstr "Wsparcie Bitcoin Cash"
#: www/views/paperWallet.html:7
msgid "Sweep"
@ -2856,7 +2934,7 @@ msgstr "Warunki użytkowania"
#: www/views/tab-create-personal.html:118
#: www/views/tab-import-phrase.html:68
msgid "Testnet"
msgstr ""
msgstr "Testnet"
#: www/views/includes/incomingDataMenu.html:61
msgid "Text"
@ -2995,7 +3073,7 @@ msgstr "Ta kluczowa fraza został utworzona przy użyciu hasła. Aby odzyskać p
#: www/views/tx-details.html:91
msgid "This transaction amount is too small compared to current Bitcoin network fees. Spending these funds will need a Bitcoin network fee cost comparable to the funds itself."
msgstr ""
msgstr "Ta kwota transakcji jest zbyt mała w porównaniu z obecnymi opłatami sieci Bitcoin. Wydanie tych środków będzie wymagało opłaty sieciowej Bitcoin, która jest porównywalna do kosztów samych funduszy."
#: www/views/tx-details.html:87
msgid "This transaction could take a long time to confirm or could be dropped due to the low fees set by the sender"
@ -3030,15 +3108,15 @@ msgstr "Aby rozpocząć należy utworzyć portfel i dostać trochę bitcoinów."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
msgstr ""
msgstr "Aby móc wykonać czynność {{reason}}, musisz przedtem dodać swoje konto BitPay {{email}}"
#: src/js/services/onGoingProcess.js:48
msgid "Top up in progress..."
msgstr ""
msgstr "Doładowanie w trakcie..."
#: src/js/controllers/topup.js:206
msgid "Top up {{amountStr}} to debit card ({{cardLastNumber}})"
msgstr ""
msgstr "Doładuj o {{amountStr}} kartę debetową ({{cardLastNumber}})"
#: www/views/buyAmazon.html:61
#: www/views/buyMercadoLibre.html:60
@ -3057,7 +3135,7 @@ msgstr "Liczba współwłaścicieli portfela"
#: www/views/addresses.html:81
msgid "Total wallet inputs"
msgstr ""
msgstr "Dane wejściowe portfela łącznie"
#: src/js/services/fingerprintService.js:63
#: src/js/services/fingerprintService.js:68
@ -3196,7 +3274,7 @@ msgstr "Zobacz zasady użytkowania"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr ""
msgstr "Zobacz transakcję na Explorer.Bitcoin.com"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3208,7 +3286,7 @@ msgstr "Zobacz na blockchainie"
#: www/views/mercadoLibre.html:26
msgid "Visit mercadolivre.com.br &rarr;"
msgstr ""
msgstr "Odwiedź mercadolivre.com.br &rarr;"
#: www/views/walletDetails.html:182
msgid "WARNING: Key derivation is not working on this device/wallet. Actions cannot be performed on this wallet."
@ -3270,7 +3348,7 @@ msgstr "Informacje o portfelu"
#: www/views/addresses.html:76
msgid "Wallet Inputs"
msgstr ""
msgstr "Dane wejściowe portfela"
#: www/views/join.html:26
msgid "Wallet Invitation"
@ -3324,7 +3402,7 @@ msgstr "Portfel już istnieje"
#: src/js/services/profileService.js:516
msgid "Wallet already in {{appName}}"
msgstr ""
msgstr "Portfel już w aplikacji {{appName}}"
#: www/views/includes/walletActivity.html:6
msgid "Wallet created"
@ -3504,7 +3582,7 @@ msgstr "Nie należy ustawiać opłatę wyższą niż {{maxFeeRecommended}} satos
#: www/views/modals/bitpay-card-confirmation.html:5
msgid "You will need to log back for fill in your BitPay Card."
msgstr ""
msgstr "Musisz zalogować się ponownie, aby wypełnić swoją kartę BitPay."
#: www/views/preferencesNotifications.html:34
msgid "You'll receive email notifications about payments sent and received from your wallets."
@ -3576,7 +3654,7 @@ msgstr "[Balans ukryty]"
#: www/views/walletDetails.html:141
#: www/views/walletDetails.html:61
msgid "[Scanning Funds]"
msgstr ""
msgstr "[Skanowanie środków]"
#: src/js/controllers/bitpayCardIntro.js:11
msgid "add your BitPay Visa card(s)"
@ -3608,7 +3686,7 @@ msgstr "{{amountStr}} dla karty upominkowej Amazon.com"
#: src/js/controllers/buyMercadoLibre.js:237
msgid "{{amountStr}} for Mercado Livre Brazil Gift Card"
msgstr ""
msgstr "{{amountStr}} na karcie podarunkowej Mercado Livre Brazil"
#: www/views/preferencesBwsUrl.html:21
msgid "{{appName}} depends on Bitcore Wallet Service (BWS) for blockchain information, networking and Copayer synchronization. The default configuration points to https://bws.bitpay.com (BitPay's public BWS instance)."
@ -3620,7 +3698,7 @@ msgstr "{{fee}} zostanie potrącone jako prowizja sieci bitcoin."
#: www/views/confirm.html:85
msgid "{{tx.txp[wallet.id].feeRatePerStr}} of the sending amount"
msgstr ""
msgstr "{{tx.txp[wallet.id].feeRatePerStr}} wysyłanej kwoty"
#: www/views/walletDetails.html:218
msgid "{{updatingTxHistoryProgress}} transactions downloaded"
@ -3632,3 +3710,51 @@ msgstr "{{updatingTxHistoryProgress}} transakcje pobrane"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-z-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Społeczność"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Reddit Bitcoin Cash"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Poznaj Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Gry Bitcoin Cash"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Aktualności"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Pula kopalni"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Narzędzia"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Wykresy kursu Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Darmowa Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "Twoje portfele Bitcoin są gotowe!"

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Conta"
msgid "Account Number"
msgstr "Número de conta"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "Transações instantâneas com taxas baixas"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Contas"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "Comprar &amp; Vender Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "Comprar Bitcoin"
@ -615,10 +620,14 @@ msgstr "A conectar ao Glidera..."
msgid "Connection reset by peer"
msgstr "Ligação redefinida pelo mesmo nível"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "Contactos"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Salvou os endereços usados com frequência"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "Continuar"
@ -819,7 +828,7 @@ msgstr "Criar carteira partilhada"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "Criar carteira bitcoin"
@ -2529,6 +2538,14 @@ msgstr "Procurar transações"
msgid "Search or enter bitcoin address"
msgstr "Procure ou digite o endereço bitcoin"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "Área de transferência"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "A sua área de transferência está vazia"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "Procurar transações"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "Enviar por E-mail"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "Enviar De"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "Enviar para"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "Colar na área de trabalho"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "Colar endereço"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "Transferência de carteira para carteira"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "Digitalizar o código QR"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Envie Bitcoin mais rápido!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "Envie Bitcoin mais rápido!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "Salvar endereços usados com frequência e enviar Bitcoin com apenas um toque"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "Adicionar o seu primeiro contato"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "Sua carteira de Bitcoin está vazia"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "Para começar, compre Bitcoin Cash (BCH) ou Bitcoin Core (BTC) ou compartilhe o seu endereço."
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "Você pode receber bitcoin de qualquer carteira ou serviço."
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter alguns bitcoins."
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "Compre Bitcoin agora"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "Mostrar meu endereço"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "Quantidade Máxima de envio"
@ -3026,7 +3104,7 @@ msgstr "Para começar, compre bitcoins ou compartilhe seu endereço. Você pode
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "Para começar, você precisa criar uma carteira de bitcoins e obter alguns bitcoins."
msgstr "Para começar, você precisará criar uma carteira e obter algum bitcoin."
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3632,3 +3710,51 @@ msgstr "Transações de {{updatingTxHistoryProgress}} transferidas"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}-de-{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "Comunidade"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Twitter Bitcoin.com"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "Explore Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Jogos Bitcoin Cash"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "Notícias"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "Pool de mineração"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "Ferramentas"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "Gráficos de preço do Bitcoin"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "Bitcoin Cash grátis"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "As suas carteiras de Bitcoin estão prontas!"

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Swedish\n"
"Language: sv\n"
"PO-Revision-Date: 2018-05-08 00:44-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "Konto"
msgid "Account Number"
msgstr "Kontonummer"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr ""
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "Konton"
@ -187,11 +191,11 @@ msgstr ""
#: www/views/tab-scan.html:21
msgid "Allow Camera Access"
msgstr ""
msgstr "Tillåt kameraåtkomst"
#: www/views/onboarding/notifications.html:7
msgid "Allow notifications"
msgstr ""
msgstr "Tillåt notificationer"
#: www/views/onboarding/disclaimer.html:14
msgid "Almost done! Let's review."
@ -200,149 +204,149 @@ msgstr ""
#: www/views/preferencesAltCurrency.html:4
#: www/views/tab-settings.html:79
msgid "Alternative Currency"
msgstr ""
msgstr "Alternativ Valuta"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr ""
msgstr "Amazon.com är inte tillgängligt för tillfället. Försök igen senare."
#: www/views/amount.html:44
#: www/views/customAmount.html:34
#: www/views/includes/output.html:7
msgid "Amount"
msgstr ""
msgstr "Belopp"
#: src/js/services/bwcError.js:110
msgid "Amount below minimum allowed"
msgstr ""
msgstr "Belopp under minsta tillåtna"
#: src/js/controllers/confirm.js:216
msgid "Amount too big"
msgstr ""
msgstr "Beloppet för stort"
#: www/views/includes/walletHistory.html:31
msgid "Amount too low to spend"
msgstr ""
msgstr "Beloppet för lågt för att spendera"
#: src/js/controllers/tab-home.js:147
msgid "An update to this app is available. For your security, please update to the latest version."
msgstr ""
msgstr "En uppdatering för appen är tillgänglig. För din säkerhet, var vänlig uppdatera till den senaste versionen."
#: www/views/backupWarning.html:14
msgid "Anyone with your backup phrase can access or spend your bitcoin."
msgstr ""
msgstr "Vem som helst med din återhämtnings fras kan kommat åt eller spendera dina bitcoin."
#: www/views/addresses.html:94
msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)"
msgstr ""
msgstr "Ungefärlig Bitcoin nätverks avgift för att överföra plånbokens saldo (med normal prioritet)"
#: www/views/backupWarning.html:10
msgid "Are you being watched?"
msgstr ""
msgstr "Håller någon ögonen på dig?"
#: src/js/controllers/preferencesExternal.js:15
msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin."
msgstr ""
msgstr "Håller någon ögonen på dig? Vem som helst med din återhämtnings fras kan kommat åt eller spendera dina bitcoin."
#: src/js/controllers/copayers.js:56
msgid "Are you sure you want to cancel and delete this wallet?"
msgstr ""
msgstr "Är du säker på att du vill avbryta och ta bort denna plånboken?"
#: src/js/controllers/addressbookView.js:37
msgid "Are you sure you want to delete this contact?"
msgstr ""
msgstr "Är du säker på att du vill ta bort denna kontakten?"
#: src/js/controllers/preferencesDelete.js:25
msgid "Are you sure you want to delete this wallet?"
msgstr ""
msgstr "Är du säker på att du vill ta bort denna plånboken?"
#: src/js/controllers/modals/txpDetails.js:154
msgid "Are you sure you want to reject this transaction?"
msgstr ""
msgstr "Är du säker på att du vill avvisa denna transaktion?"
#: src/js/controllers/modals/txpDetails.js:171
msgid "Are you sure you want to remove this transaction?"
msgstr ""
msgstr "Är du säker på att du vill ta bort denna transaktion?"
#: src/js/controllers/onboarding/backupRequest.js:23
msgid "Are you sure you want to skip it?"
msgstr ""
msgstr "Är du säker på att du vill hoppa över detta?"
#: www/views/modals/bitpay-card-confirmation.html:4
msgid "Are you sure you would like to log out of your BitPay Card account?"
msgstr ""
msgstr "Är du säker på att du vill logga ut från ditt BitPay Card konto?"
#: src/js/controllers/preferencesBitpayCard.js:7
#: src/js/controllers/preferencesBitpayServices.js:20
msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?"
msgstr ""
msgstr "Är du säker på att du vill ta bort ditt BitPay Card ({{lastFourDigits}}) från denna enheten?"
#: www/views/includes/walletInfo.html:10
msgid "Auditable"
msgstr ""
msgstr "Granskningsbar"
#: www/views/modals/wallet-balance.html:42
msgid "Available"
msgstr ""
msgstr "Tillgänglig"
#: www/views/includes/available-balance.html:3
msgid "Available Balance"
msgstr ""
msgstr "Tillgängligt Saldo"
#: www/views/modals/chooseFeeLevel.html:24
#: www/views/preferencesFee.html:15
msgid "Average confirmation time"
msgstr ""
msgstr "Genomsnittlig bekräftelsetid"
#: www/views/join.html:143
#: www/views/tab-create-personal.html:113
#: www/views/tab-create-shared.html:142
#: www/views/tab-import-phrase.html:51
msgid "BIP32 path for address derivation"
msgstr ""
msgstr "BIP32 sökväg för adress derivering"
#: www/views/cashScan.html:25
msgid "BTC wallets"
msgstr ""
msgstr "BTC plånböcker"
#: www/views/preferences.html:34
msgid "Backup"
msgstr ""
msgstr "Säkerhetskopiera"
#: www/views/includes/backupNeededPopup.html:7
msgid "Backup Needed"
msgstr ""
msgstr "Säkerhetskopiering Behövs"
#: src/js/controllers/lockSetup.js:87
msgid "Backup all livenet wallets before using this function"
msgstr ""
msgstr "Säkerhetskopiera alla livenet plånböcker innan du använder denna funktion"
#: src/js/controllers/cashScan.js:64
#: www/views/includes/walletListSettings.html:12
#: www/views/preferences.html:36
msgid "Backup needed"
msgstr ""
msgstr "Säkerhetskopiering behövs"
#: www/views/includes/backupNeededPopup.html:9
msgid "Backup now"
msgstr ""
msgstr "Säkerhetskopiera nu"
#: www/views/onboarding/backupRequest.html:11
#: www/views/tab-export-file.html:89
msgid "Backup wallet"
msgstr ""
msgstr "Säkerhetskopiera plånbok"
#: src/js/controllers/lockSetup.js:84
msgid "Backup your wallet before using this function"
msgstr ""
msgstr "Säkerhetskopiera din plånbok innan du använder denna funktion"
#: src/js/services/profileService.js:446
msgid "Bad wallet invitation"
msgstr ""
msgstr "Fel på plånboks inbjudan"
#: www/views/preferencesInformation.html:102
msgid "Balance By Address"
msgstr ""
msgstr "Saldo av Address"
#: www/views/includes/confirmBackupPopup.html:7
msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it."
@ -369,7 +373,7 @@ msgstr ""
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
msgid "Bitcoin Cash Wallets"
msgstr ""
msgstr "Bitcoin Cash plånböcker"
#: www/views/modals/chooseFeeLevel.html:4
#: www/views/preferencesFee.html:4
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr ""
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr ""
@ -615,10 +620,14 @@ msgstr ""
msgid "Connection reset by peer"
msgstr ""
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr ""
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr ""
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr ""
@ -819,7 +828,7 @@ msgstr ""
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr ""
@ -2529,6 +2538,14 @@ msgstr ""
msgid "Search or enter bitcoin address"
msgstr ""
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr ""
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr ""
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr ""
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr ""
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr ""
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr ""
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr ""
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr ""
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr ""
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr ""
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr ""
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr ""
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr ""
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr ""
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr ""
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr ""
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr ""
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr ""
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr ""
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr ""
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr ""
@ -3632,3 +3710,51 @@ msgstr ""
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr ""
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr ""
#: www/views/includes/community.html:3
msgid "Community"
msgstr ""
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr ""
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr ""
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr ""
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr ""
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr ""
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr ""
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr ""
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr ""
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr ""
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -11,11 +11,11 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Vietnamese\n"
"Language: vi\n"
"PO-Revision-Date: 2018-05-15 20:18-0400\n"
"PO-Revision-Date: 2018-07-27 08:44\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
msgstr "(Đáng tin cậy)"
msgstr "(Tin cậy)"
#: www/views/includes/txp.html:23
#: www/views/includes/walletHistory.html:64
@ -24,11 +24,11 @@ msgstr "(có thể chi tiêu gấp đôi)"
#: www/views/modals/txp-details.html:159
msgid "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created."
msgstr ""
msgstr "* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created."
#: www/views/tx-details.html:82
msgid "- {{btx.feeRateStr}} of the transaction"
msgstr "{{btx.feeRateStr}} của giao dịch"
msgstr "- {{btx.feeRateStr}} of the transaction"
#: www/views/modals/txp-details.html:102
msgid "- {{tx.feeRateStr}} of the transaction"
@ -41,417 +41,425 @@ msgstr "Xếp hạng 5 sao giúp chúng tôi để {{appName}} đến tay nhiề
#: www/views/mercadoLibre.html:18
#: www/views/mercadoLibre.html:40
msgid "<b>Only</b> redeemable on Mercado Livre (Brazil)"
msgstr ""
msgstr "<b>Only</b> redeemable on \n"
"Mercado Livre (Brazil) #\n\n"
"2"
#: src/js/controllers/feedback/send.js:27
#: www/views/feedback/complete.html:21
msgid "A member of the team will review your feedback as soon as possible."
msgstr ""
msgstr "A member of the team will review your feedback as soon as possible."
#: src/js/controllers/confirm.js:401
msgid "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded."
msgstr ""
msgstr "A total of {{amountAboveMaxSizeStr}} were excluded. The maximum size allowed for a transaction was exceeded."
#: src/js/controllers/confirm.js:395
msgid "A total of {{amountBelowFeeStr}} were excluded. These funds come from UTXOs smaller than the network fee provided."
msgstr ""
msgstr "Tổng cộng {{amountBelowFeeStr}} đã bị loại trừ. Số tiền này đến từ UTXOs nhỏ hơn chi phí mạng cung cấp.#\n"
"1"
#: src/js/controllers/preferencesAbout.js:6
#: www/views/tab-settings.html:156
msgid "About"
msgstr ""
msgstr "About"
#: src/js/controllers/modals/txpDetails.js:62
#: src/js/controllers/tx-details.js:79
msgid "Accepted"
msgstr ""
msgstr "Accepted"
#: www/views/preferencesInformation.html:72
msgid "Account"
msgstr ""
msgstr "Account"
#: www/views/join.html:72
#: www/views/tab-create-personal.html:45
#: www/views/tab-create-shared.html:74
#: www/views/tab-import-hardware.html:19
msgid "Account Number"
msgstr ""
msgstr "Account Number"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "2"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr ""
msgstr "Accounts"
#: www/views/bitpayCard.html:56
msgid "Activity"
msgstr ""
msgstr "Activity"
#: src/js/services/bitpayAccountService.js:83
msgid "Add Account"
msgstr ""
msgstr "Add Account"
#: src/js/services/bitpayAccountService.js:69
msgid "Add BitPay Account?"
msgstr ""
msgstr "Add BitPay Account?"
#: www/views/addressbook.add.html:4
#: www/views/addressbook.html:22
msgid "Add Contact"
msgstr ""
msgstr "Add Contact"
#: www/views/bitpayCard.html:28
msgid "Add Funds"
msgstr ""
msgstr "Add Funds"
#: www/views/confirm.html:94
msgid "Add Memo"
msgstr ""
msgstr "Add Memo"
#: www/views/join.html:87
#: www/views/tab-create-personal.html:59
#: www/views/tab-create-shared.html:88
msgid "Add a password"
msgstr ""
msgstr "Add a password"
#: www/views/includes/accountSelector.html:27
msgid "Add account"
msgstr ""
msgstr "Add account"
#: www/views/join.html:90
#: www/views/tab-create-personal.html:62
#: www/views/tab-create-shared.html:91
msgid "Add an optional password to secure the recovery phrase"
msgstr ""
msgstr "Add a password option to allow a secure cluster"
#: www/views/includes/incomingDataMenu.html:41
msgid "Add as a contact"
msgstr ""
msgstr "Thêm như một liên hệ"
#: src/js/controllers/confirm.js:424
msgid "Add description"
msgstr ""
msgstr "Thêm mô tả"
#: www/views/topup.html:6
msgid "Add funds"
msgstr ""
msgstr "Nạp tiền"
#: src/js/services/bitpayAccountService.js:78
msgid "Add this BitPay account ({{email}})?"
msgstr ""
msgstr "Thêm BitPay ({{email}}) tài khoản này?"
#: www/views/add.html:3
msgid "Add wallet"
msgstr ""
msgstr "Thêm ví"
#: www/views/addressbook.view.html:26
#: www/views/customAmount.html:28
#: www/views/modals/paypro.html:24
msgid "Address"
msgstr ""
msgstr "Địa chỉ"
#: www/views/addressbook.html:6
#: www/views/tab-settings.html:13
msgid "Address Book"
msgstr ""
msgstr "Sổ địa chỉ"
#: www/views/preferencesInformation.html:41
msgid "Address Type"
msgstr ""
msgstr "Loại địa chỉ"
#: www/views/addresses.html:64
msgid "Addresses With Balance"
msgstr ""
msgstr "Địa chỉ với số dư"
#: www/views/tab-settings.html:149
msgid "Advanced"
msgstr ""
msgstr "Nâng cao"
#: www/views/advancedSettings.html:3
msgid "Advanced Settings"
msgstr ""
msgstr "Cài đặt nâng cao"
#: www/views/bitpayCard.html:62
msgid "All"
msgstr ""
msgstr "Tất cả"
#: www/views/allAddresses.html:3
msgid "All Addresses"
msgstr ""
msgstr "Tất cả địa chỉ"
#: www/views/modals/wallet-balance.html:18
msgid "All of your bitcoin wallet balance may not be available for immediate spending."
msgstr ""
msgstr "Tất cả số dư ví bitcoin của bạn có thể không có sẵn cho chi tiêu ngay lập tức."
#: www/views/tab-receive.html:25
msgid "All signing devices must be added to this multisig wallet before bitcoin addresses can be created."
msgstr ""
msgstr "All contract device will be added to this multisig before the bitcoin address has been created."
#: www/views/tab-scan.html:21
msgid "Allow Camera Access"
msgstr ""
msgstr "Allow camera access"
#: www/views/onboarding/notifications.html:7
msgid "Allow notifications"
msgstr ""
msgstr "Allow notification"
#: www/views/onboarding/disclaimer.html:14
msgid "Almost done! Let's review."
msgstr ""
msgstr "Most as completed! We see review."
#: www/views/preferencesAltCurrency.html:4
#: www/views/tab-settings.html:79
msgid "Alternative Currency"
msgstr ""
msgstr "Money Currency instead"
#: src/js/controllers/buyAmazon.js:98
msgid "Amazon.com is not available at this moment. Please try back later."
msgstr ""
msgstr "Amazon.com is not available at this time. Please try again again."
#: www/views/amount.html:44
#: www/views/customAmount.html:34
#: www/views/includes/output.html:7
msgid "Amount"
msgstr ""
msgstr "Quantity"
#: src/js/services/bwcError.js:110
msgid "Amount below minimum allowed"
msgstr ""
msgstr "Maximum amount of the minimum amount"
#: src/js/controllers/confirm.js:216
msgid "Amount too big"
msgstr ""
msgstr "Amount too large"
#: www/views/includes/walletHistory.html:31
msgid "Amount too low to spend"
msgstr ""
msgstr "Amount too low for standard"
#: src/js/controllers/tab-home.js:147
msgid "An update to this app is available. For your security, please update to the latest version."
msgstr ""
msgstr "Hotel have a Update for this application. To preserve your password, please please update the latest version."
#: www/views/backupWarning.html:14
msgid "Anyone with your backup phrase can access or spend your bitcoin."
msgstr ""
msgstr "Każdy, kto ma Twoją kluczową là một trong những điều tuyệt vời nhất."
#: www/views/addresses.html:94
msgid "Approximate Bitcoin network fee to transfer wallet's balance (with normal priority)"
msgstr ""
msgstr "La taxa approssimativa della rete Bitcoin cho mỗi lần gửi tiền theo yêu cầu của bạn"
#: www/views/backupWarning.html:10
msgid "Are you being watched?"
msgstr ""
msgstr "Chúng tôi vigilen?"
#: src/js/controllers/preferencesExternal.js:15
msgid "Are you being watched? Anyone with your recovery phrase can access or spend your bitcoin."
msgstr ""
msgstr "You are tracking? Bất cứ ai có thể phục hồi từ bạn, bạn có thể truy cập hoặc bitcoin chi tiêu của bạn."
#: src/js/controllers/copayers.js:56
msgid "Are you sure you want to cancel and delete this wallet?"
msgstr ""
msgstr "Are you sure you want to cancel and remove this video?"
#: src/js/controllers/addressbookView.js:37
msgid "Are you sure you want to delete this contact?"
msgstr ""
msgstr "Bạn có chắc chắn muốn xóa địa chỉ liên hệ này không?"
#: src/js/controllers/preferencesDelete.js:25
msgid "Are you sure you want to delete this wallet?"
msgstr ""
msgstr "Are you sure you want to delete this wallet?"
#: src/js/controllers/modals/txpDetails.js:154
msgid "Are you sure you want to reject this transaction?"
msgstr ""
msgstr "Are you sure you want to reject this transaction?"
#: src/js/controllers/modals/txpDetails.js:171
msgid "Are you sure you want to remove this transaction?"
msgstr ""
msgstr "Are you sure you want to remove this transaction?"
#: src/js/controllers/onboarding/backupRequest.js:23
msgid "Are you sure you want to skip it?"
msgstr ""
msgstr "Are you sure you want to skip it?"
#: www/views/modals/bitpay-card-confirmation.html:4
msgid "Are you sure you would like to log out of your BitPay Card account?"
msgstr ""
msgstr "Bạn có chắc chắn muốn đăng xuất khỏi tài khoản Thẻ BitPay của mình không?"
#: src/js/controllers/preferencesBitpayCard.js:7
#: src/js/controllers/preferencesBitpayServices.js:20
msgid "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?"
msgstr ""
msgstr "Are you sure you would like to remove your BitPay Card ({{lastFourDigits}}) from this device?"
#: www/views/includes/walletInfo.html:10
msgid "Auditable"
msgstr ""
msgstr "Auditable"
#: www/views/modals/wallet-balance.html:42
msgid "Available"
msgstr ""
msgstr "Available"
#: www/views/includes/available-balance.html:3
msgid "Available Balance"
msgstr ""
msgstr "Available Balance"
#: www/views/modals/chooseFeeLevel.html:24
#: www/views/preferencesFee.html:15
msgid "Average confirmation time"
msgstr ""
msgstr "Average confirmation time"
#: www/views/join.html:143
#: www/views/tab-create-personal.html:113
#: www/views/tab-create-shared.html:142
#: www/views/tab-import-phrase.html:51
msgid "BIP32 path for address derivation"
msgstr ""
msgstr "Đường dẫn BIP32 cho dẫn xuất địa chỉ"
#: www/views/cashScan.html:25
msgid "BTC wallets"
msgstr ""
msgstr "Ví BTC"
#: www/views/preferences.html:34
msgid "Backup"
msgstr ""
msgstr "Backup"
#: www/views/includes/backupNeededPopup.html:7
msgid "Backup Needed"
msgstr ""
msgstr "Backup Needed"
#: src/js/controllers/lockSetup.js:87
msgid "Backup all livenet wallets before using this function"
msgstr ""
msgstr "Backup all livenet wallets before using this function"
#: src/js/controllers/cashScan.js:64
#: www/views/includes/walletListSettings.html:12
#: www/views/preferences.html:36
msgid "Backup needed"
msgstr ""
msgstr "Cần sao lưu"
#: www/views/includes/backupNeededPopup.html:9
msgid "Backup now"
msgstr ""
msgstr "Sao lưu ngay"
#: www/views/onboarding/backupRequest.html:11
#: www/views/tab-export-file.html:89
msgid "Backup wallet"
msgstr ""
msgstr "Backup wallet"
#: src/js/controllers/lockSetup.js:84
msgid "Backup your wallet before using this function"
msgstr ""
msgstr "Backup your wallet before using this function"
#: src/js/services/profileService.js:446
msgid "Bad wallet invitation"
msgstr ""
msgstr "Bad wallet invitation"
#: www/views/preferencesInformation.html:102
msgid "Balance By Address"
msgstr ""
msgstr "Balance By Address"
#: www/views/includes/confirmBackupPopup.html:7
msgid "Be sure to store your recovery phrase in a secure place. If this app is deleted, your money cannot be recovered without it."
msgstr ""
msgstr "Hãy chắc chắn lưu trữ cụm từ khôi phục của bạn ở một nơi an toàn. Nếu ứng dụng này bị xóa, tiền của bạn không thể được phục hồi mà không có nó."
#: www/views/preferencesBitpayServices.html:9
msgid "BitPay Visa&reg; Cards"
msgstr ""
msgstr "BitPay Visa & reg; thẻ"
#: www/views/addressbook.add.html:38
#: www/views/includes/incomingDataMenu.html:29
msgid "Bitcoin Address"
msgstr ""
msgstr "Bitcoin Address"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr ""
msgstr "Bitcoin Cash (BCH) Balances"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr ""
msgstr "Bitcoin Cash Support"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
msgid "Bitcoin Cash Wallets"
msgstr ""
msgstr "Bitcoin Cash Wallets"
#: www/views/modals/chooseFeeLevel.html:4
#: www/views/preferencesFee.html:4
#: www/views/tab-settings.html:90
msgid "Bitcoin Network Fee Policy"
msgstr ""
msgstr "Bitcoin Network Fee Policy"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr ""
msgstr "Bitcoin Core Wallets"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
msgstr ""
msgstr "Bitcoin cash Payment"
#: www/views/onboarding/tour.html:31
msgid "Bitcoin is a currency."
msgstr ""
msgstr "Bitcoin is a currency."
#: www/views/onboarding/disclaimer.html:15
msgid "Bitcoin is different &ndash; it cannot be safely held with a bank or web service."
msgstr ""
msgstr "&ndash;."
#: www/views/onboarding/tour.html:18
msgid "Bitcoin is secure,<br>digital money."
msgstr ""
msgstr "Bitcoin là an toàn, <br> tiền kỹ thuật số."
#: www/views/preferencesFee.html:11
msgid "Bitcoin transactions include a fee collected by miners on the network."
msgstr ""
msgstr "Bitcoin transactions include a fee collected by miners on the network."
#: www/views/buyAmazon.html:108
msgid "Bought {{amountUnitStr}}"
msgstr ""
msgstr "Bought {{amountUnitStr}}"
#: www/views/modals/txp-details.html:36
msgid "Broadcast Payment"
msgstr ""
msgstr "Broadcast Payment"
#: src/js/controllers/modals/txpDetails.js:64
#: src/js/controllers/tx-details.js:81
msgid "Broadcasted"
msgstr ""
msgstr "Broadcasted"
#: src/js/services/onGoingProcess.js:11
msgid "Broadcasting transaction"
msgstr ""
msgstr "Broadcasting transaction"
#: www/views/unsupported.html:6
msgid "Browser unsupported"
msgstr ""
msgstr "Browser unsupported"
#: www/views/buyAmazon.html:5
#: www/views/buyMercadoLibre.html:6
msgid "Buy"
msgstr ""
msgstr "Buy"
#: www/views/includes/buyAndSellCard.html:3
msgid "Buy &amp; Sell Bitcoin"
msgstr ""
msgstr "Buy &amp; Sell Bitcoin"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr ""
msgstr "Buy Bitcoin"
#: www/views/mercadoLibre.html:22
#: www/views/mercadoLibre.html:50
msgid "Buy a Gift Card"
msgstr ""
msgstr "Buy a Gift Card"
#: src/js/controllers/buyAmazon.js:334
msgid "Buy from"
msgstr ""
msgstr "Buy from"
#: src/js/services/onGoingProcess.js:40
msgid "Buying Bitcoin..."
msgstr ""
msgstr "Mua Bitcoin..."
#: src/js/services/onGoingProcess.js:12
msgid "Calculating fee"
msgstr ""
msgstr "Phí tính toán"
#: src/js/controllers/buyAmazon.js:313
#: src/js/controllers/buyMercadoLibre.js:307
@ -470,65 +478,65 @@ msgstr ""
#: www/views/modals/bitpay-card-confirmation.html:8
#: www/views/modals/confirmation.html:13
msgid "Cancel"
msgstr ""
msgstr "Hủy bỏ"
#: www/views/copayers.html:36
msgid "Cancel invitation"
msgstr ""
msgstr "Hủy lời mời"
#: src/js/controllers/onboarding/tour.js:52
msgid "Cannot Create Wallet"
msgstr ""
msgstr "Không thể tạo Wallet"
#: src/js/services/profileService.js:442
msgid "Cannot join the same wallet more that once"
msgstr ""
msgstr "Cannot join the same wallet more that once"
#: www/views/includes/bitpayCardsCard.html:2
msgid "Cards"
msgstr ""
msgstr "Cards"
#: www/views/modals/paypro.html:30
msgid "Certified by"
msgstr ""
msgstr "Certified by"
#: www/views/preferencesExternal.html:19
msgid "Check installation and retry."
msgstr ""
msgstr "Check installation and retry."
#: www/views/tab-import-file.html:4
msgid "Choose a backup file from your computer"
msgstr ""
msgstr "Chọn tệp sao lưu từ máy tính của bạn"
#: www/views/modals/wallets.html:9
msgid "Choose your destination wallet"
msgstr ""
msgstr "Choose your destination wallet"
#: www/views/modals/wallets.html:10
msgid "Choose your source wallet"
msgstr ""
msgstr "Chọn ví nguồn của bạn"
#: www/views/backup.html:61
msgid "Clear"
msgstr ""
msgstr "Clear"
#: www/views/preferencesHistory.html:24
msgid "Clear cache"
msgstr ""
msgstr "Clear cache"
#: src/js/controllers/confirm.js:373
#: src/js/controllers/modals/txpDetails.js:49
msgid "Click to accept"
msgstr ""
msgstr "Click to accept"
#: src/js/controllers/confirm.js:367
msgid "Click to pay"
msgstr ""
msgstr "Click to pay"
#: src/js/controllers/confirm.js:379
#: src/js/controllers/modals/txpDetails.js:42
msgid "Click to send"
msgstr ""
msgstr "Click to send"
#: www/views/customAmount.html:4
#: www/views/modals/mercadolibre-card-details.html:3
@ -538,28 +546,28 @@ msgstr ""
#: www/views/modals/wallet-balance.html:3
#: www/views/modals/wallets.html:5
msgid "Close"
msgstr ""
msgstr "Close"
#: www/views/includes/cash.html:2
#: www/views/preferencesInformation.html:17
msgid "Coin"
msgstr ""
msgstr "Coin"
#: www/views/preferences.html:22
msgid "Color"
msgstr ""
msgstr "Màu"
#: www/views/preferencesAbout.html:21
msgid "Commit hash"
msgstr ""
msgstr "Commit hash"
#: www/views/preferences.html:49
msgid "Complete the backup process to use this option"
msgstr ""
msgstr "Complete the backup process to use this option"
#: www/views/bitpayCard.html:93
msgid "Completed"
msgstr ""
msgstr "Completed"
#: src/js/controllers/buyAmazon.js:311
#: src/js/controllers/buyMercadoLibre.js:305
@ -571,95 +579,99 @@ msgstr ""
#: www/views/confirm.html:4
#: www/views/onboarding/collectEmail.html:32
msgid "Confirm"
msgstr ""
msgstr "Confirm"
#: www/views/modals/terms.html:26
#: www/views/onboarding/disclaimer.html:44
msgid "Confirm &amp; Finish"
msgstr ""
msgstr "Confirm &amp; Finish"
#: www/views/buyAmazon.html:90
msgid "Confirm purchase"
msgstr ""
msgstr "Confirm purchase"
#: www/views/modals/pin.html:10
msgid "Confirm your PIN"
msgstr ""
msgstr "Confirm your PIN"
#: src/js/services/walletService.js:1033
msgid "Confirm your new spending password"
msgstr ""
msgstr "Confirm your new spending password"
#: www/views/tx-details.html:98
msgid "Confirmations"
msgstr ""
msgstr "Confirmations"
#: www/views/bitpayCard.html:68
#: www/views/modals/wallet-balance.html:61
msgid "Confirming"
msgstr ""
msgstr "Xác nhận"
#: www/views/bitpayCardIntro.html:37
msgid "Connect my BitPay Card"
msgstr ""
msgstr "Kết nối thẻ BitPay của tôi"
#: src/js/services/onGoingProcess.js:13
msgid "Connecting to Coinbase..."
msgstr ""
msgstr "Connecting to Coinbase..."
#: src/js/services/onGoingProcess.js:14
msgid "Connecting to Glidera..."
msgstr ""
msgstr "Đang kết nối với Glidera ..."
#: src/js/services/bwcError.js:53
msgid "Connection reset by peer"
msgstr ""
msgstr "Đặt lại kết nối theo ngang hàng"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr ""
msgstr "Contacts"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "Save the regular usage"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr ""
msgstr "Continue"
#: www/views/preferencesLanguage.html:26
msgid "Contribute Translations"
msgstr ""
msgstr "Contribute Translations"
#: src/js/controllers/confirm.js:130
msgid "Copay only supports Bitcoin Cash using new version numbers addresses"
msgstr ""
msgstr "Copay chỉ hỗ trợ Bitcoin Cash bằng cách sử dụng số phiên bản mới"
#: src/js/services/bwcError.js:62
msgid "Copayer already in this wallet"
msgstr ""
msgstr "Copayer already in this wallet"
#: src/js/services/bwcError.js:77
msgid "Copayer already voted on this spend proposal"
msgstr ""
msgstr "Coper is this option"
#: src/js/services/bwcError.js:107
msgid "Copayer data mismatch"
msgstr ""
msgstr "Dữ liệu Copayer không khớp"
#: www/views/includes/walletActivity.html:2
msgid "Copayer joined"
msgstr ""
msgstr "Copayer joined"
#: www/views/preferencesInformation.html:94
msgid "Copayer {{$index}}"
msgstr ""
msgstr "Copayer {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
#: www/views/includes/copyToClipboard.html:4
msgid "Copied to clipboard"
msgstr ""
msgstr "Sao chép vào clipboard"
#: www/views/tab-export-file.html:94
msgid "Copy this text as it is to a safe place (notepad or email)"
msgstr ""
msgstr "Copy this text as it is to a safe place (notepad or email)"
#: www/views/includes/incomingDataMenu.html:51
#: www/views/includes/incomingDataMenu.html:70
@ -667,35 +679,35 @@ msgstr ""
#: www/views/includes/logOptions.html:9
#: www/views/tab-export-file.html:78
msgid "Copy to clipboard"
msgstr ""
msgstr "Sao chép vào clipboard"
#: src/js/controllers/buyMercadoLibre.js:102
msgid "Could not access Gift Card Service"
msgstr ""
msgstr "Could not access Gift Card Service"
#: www/views/tab-import-phrase.html:2
msgid "Could not access the wallet at the server. Please check:"
msgstr ""
msgstr "Could not access the wallet at the server. Please check:"
#: src/js/controllers/buyAmazon.js:102
msgid "Could not access to Amazon.com"
msgstr ""
msgstr "Could not access to Amazon.com"
#: src/js/services/profileService.js:511
msgid "Could not access wallet"
msgstr ""
msgstr "Could not access wallet"
#: src/js/controllers/confirm.js:210
msgid "Could not add message to imported wallet without shared encrypting key"
msgstr ""
msgstr "Could not add message to imported wallet without shared encrypting key"
#: src/js/controllers/modals/txpDetails.js:199
msgid "Could not broadcast payment"
msgstr ""
msgstr "Could not broadcast payment"
#: src/js/services/bwcError.js:41
msgid "Could not build transaction"
msgstr ""
msgstr "Cannot build transaction"
#: src/js/services/walletService.js:854
msgid "Could not create address"
@ -819,7 +831,7 @@ msgstr ""
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr ""
@ -912,7 +924,7 @@ msgstr ""
#: www/views/modals/mercadolibre-card-details.html:6
#: www/views/topup.html:45
msgid "Details"
msgstr ""
msgstr "Chi tiết"
#: src/js/controllers/lockSetup.js:9
#: src/js/controllers/tab-settings.js:65
@ -2529,6 +2541,14 @@ msgstr ""
msgid "Search or enter bitcoin address"
msgstr ""
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr ""
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr ""
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr ""
@ -2587,9 +2607,70 @@ msgid "Send by email"
msgstr ""
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr ""
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr ""
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr ""
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr ""
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr ""
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr ""
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr ""
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr ""
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr ""
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr ""
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr ""
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr ""
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr ""
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr ""
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr ""
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr ""
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr ""
@ -3632,3 +3713,51 @@ msgstr ""
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr ""
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr ""
#: www/views/includes/community.html:3
msgid "Community"
msgstr ""
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr ""
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr ""
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr ""
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr ""
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr ""
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr ""
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr ""
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr ""
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr ""
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr ""

View file

@ -11,7 +11,7 @@ msgstr ""
"Last-Translator: emilold\n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
"PO-Revision-Date: 2018-05-08 00:44-0400\n"
"PO-Revision-Date: 2018-07-27 08:43\n"
#: www/views/modals/paypro.html:34
msgid "(Trusted)"
@ -77,6 +77,10 @@ msgstr "帐户"
msgid "Account Number"
msgstr "帐号"
#: www/views/tab-home.html:61
msgid "Instant transactions with low fees"
msgstr "以较低费用进行即时交易"
#: www/views/preferencesBitpayServices.html:23
msgid "Accounts"
msgstr "帐户"
@ -359,12 +363,12 @@ msgstr "比特币地址"
#: www/views/cashScan.html:4
msgid "Bitcoin Cash (BCH) Balances"
msgstr ""
msgstr "Bitcoin Cash (BCH) 余额"
#: www/views/preferencesCash.html:3
#: www/views/tab-settings.html:47
msgid "Bitcoin Cash Support"
msgstr ""
msgstr "Bitcoin Cash 支持"
#: www/views/tab-home.html:98
#: www/views/tab-settings.html:115
@ -380,7 +384,7 @@ msgstr "比特币网络手续费策略"
#: www/views/tab-home.html:83
#: www/views/tab-settings.html:107
msgid "Bitcoin Core Wallets"
msgstr ""
msgstr "Bitcoin Core 钱包"
#: src/js/services/incomingData.js:151
msgid "Bitcoin cash Payment"
@ -433,6 +437,7 @@ msgid "Buy &amp; Sell Bitcoin"
msgstr "购买或出售比特币"
#: www/views/tab-send.html:35
#: src/js/services/buyAndSellService.js:26
msgid "Buy Bitcoin"
msgstr "购买比特币"
@ -615,10 +620,14 @@ msgstr "正在连接 Glidera..."
msgid "Connection reset by peer"
msgstr "连接被对方重置"
#: www/views/tab-send.html:45
#: www/views/tab-send.html:85
msgid "Contacts"
msgstr "联系人"
#: www/views/tab-send.html:86
msgid "Saved frequently used addresses"
msgstr "保存的常用地址"
#: www/views/onboarding/notifications.html:9
msgid "Continue"
msgstr "继续"
@ -649,7 +658,7 @@ msgstr "Copayer 加入"
#: www/views/preferencesInformation.html:94
msgid "Copayer {{$index}}"
msgstr ""
msgstr "Copayer {{$index}}"
#: src/js/controllers/copayers.js:79
#: src/js/controllers/export.js:193
@ -819,7 +828,7 @@ msgstr "创建自己的免费钱包"
#: www/views/onboarding/tour.html:51
#: www/views/tab-home.html:75
#: www/views/tab-send.html:36
#: www/views/tab-send.html:75
msgid "Create bitcoin wallet"
msgstr "创建比特币的钱包"
@ -973,7 +982,7 @@ msgstr "已达到空地址限制。无法生成新的地址。"
#: www/views/preferencesCash.html:17
msgid "Enable Bitcoin Cash wallet creation and operation within the App."
msgstr ""
msgstr "在应用内启用 Bitcoin Cash 创建和操作。"
#: www/views/tab-scan.html:19
msgid "Enable camera access in your device settings to get started."
@ -989,7 +998,7 @@ msgstr "启用推式通知"
#: www/views/preferencesNotifications.html:33
msgid "Enable sound"
msgstr ""
msgstr "启用声音"
#: www/views/tab-scan.html:18
msgid "Enable the camera to get started."
@ -997,7 +1006,7 @@ msgstr "使该摄像机开始。"
#: www/views/tab-settings.html:49
msgid "Enabled"
msgstr ""
msgstr "已启用"
#: src/js/services/walletService.js:1047
#: src/js/services/walletService.js:1062
@ -1582,7 +1591,7 @@ msgstr "网络地址不正确"
#: src/js/controllers/confirm.js:306
#: src/js/services/bwcError.js:44
msgid "Insufficient confirmed funds"
msgstr ""
msgstr "确认的资金不足"
#: src/js/controllers/topup.js:165
#: src/js/controllers/topup.js:177
@ -2007,7 +2016,7 @@ msgstr "好的"
#: www/views/modals/tx-status.html:36
#: www/views/modals/tx-status.html:46
msgid "OKAY"
msgstr ""
msgstr "确定"
#: www/views/modals/terms.html:15
msgid "Official English Disclaimer"
@ -2049,7 +2058,7 @@ msgstr "打开 GitHub 项目"
#: src/js/controllers/bitpayCard.js:123
#: src/js/controllers/tx-details.js:192
msgid "Open Explorer"
msgstr ""
msgstr "打开浏览器"
#: www/views/tab-scan.html:22
msgid "Open Settings"
@ -2065,7 +2074,7 @@ msgstr "打开网站"
#: src/js/controllers/preferencesCash.js:32
msgid "Open bitcoincash.org?"
msgstr ""
msgstr "打开 bitcoincash.org"
#: src/js/controllers/cashScan.js:18
msgid "Open the recovery tool."
@ -2507,7 +2516,7 @@ msgstr "请扫描你的指纹"
#: www/views/preferencesCash.html:23
msgid "Scan your wallets for Bitcoin Cash"
msgstr ""
msgstr "扫描您的 Bitcoin Cash 钱包"
#: src/js/services/onGoingProcess.js:30
msgid "Scanning Wallet funds..."
@ -2529,6 +2538,14 @@ msgstr "搜索交易"
msgid "Search or enter bitcoin address"
msgstr "搜索或输入比特币地址"
#: src/js/controllers/tab-send.js:28
msgid "Clipboard"
msgstr "剪贴板"
#: src/js/controllers/tab-send.js:29
msgid "Your Clipboard is empty"
msgstr "您的剪贴板为空"
#: www/views/modals/search.html:16
msgid "Search transactions"
msgstr "搜索交易"
@ -2587,9 +2604,70 @@ msgid "Send by email"
msgstr "通过电邮发送"
#: src/js/controllers/confirm.js:177
#: src/js/controllers/tab-send.js:94
msgid "Send from"
msgstr "从发送"
#: src/js/controllers/tab-send.js:77
msgid "Send to"
msgstr "发送到"
#: www/views/tab-send.html:20
msgid "Paste Clipboard"
msgstr "粘贴剪贴板"
#: www/views/tab-send.html:21
msgid "Paste Address"
msgstr "粘贴地址"
#: www/views/tab-send.html:27
msgid "Wallet to Wallet Transfer"
msgstr "钱包转账"
#: www/views/tab-send.html:35
msgid "Scan QR Code"
msgstr "扫描二维码"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "更快地发送比特币!"
#: www/views/tab-send.html:46
msgid "Send Bitcoin faster!"
msgstr "更快地发送比特币!"
#: www/views/tab-send.html:50
msgid "Save frequently used addresses and send them Bitcoin in just one tap"
msgstr "保存常用地址,只需点击一下即可将比特币发送到这些地址"
#: www/views/tab-send.html:55
msgid "Add your first contact"
msgstr "添加您的第一个联系人"
#: www/views/tab-send.html:65
msgid "Your Bitcoin wallet is empty"
msgstr "您的比特币钱包为空"
#: www/views/tab-send.html:69
msgid "To get started, buy Bitcoin Cash (BCH) or Bitcoin Core (BTC), or share your address."
msgstr "首先,购买 Bitcoin Cash (BCH) 或 Bitcoin Core (BTC),或者共享您的地址。"
#: www/views/tab-send.html:70
msgid "You can receive bitcoin from any wallet or service."
msgstr "您可以从任何钱包或服务接收比特币。"
#: www/views/tab-send.html:72
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "若要开始,您将需要创建一个比特币的钱包,并获得一些比特币。"
#: www/views/tab-send.html:74
msgid "Buy Bitcoin now"
msgstr "立即购买比特币"
#: www/views/tab-send.html:76
msgid "Show my address"
msgstr "显示我的地址"
#: www/views/includes/itemSelector.html:8
msgid "Send max amount"
msgstr "发送最大数量"
@ -2806,7 +2884,7 @@ msgstr "超级经济"
#: www/views/preferencesCash.html:11
msgid "Support Bitcoin Cash"
msgstr ""
msgstr "支持 Bitcoin Cash"
#: www/views/paperWallet.html:7
msgid "Sweep"
@ -2856,7 +2934,7 @@ msgstr "使用条款"
#: www/views/tab-create-personal.html:118
#: www/views/tab-import-phrase.html:68
msgid "Testnet"
msgstr ""
msgstr "测试网"
#: www/views/includes/incomingDataMenu.html:61
msgid "Text"
@ -3026,7 +3104,7 @@ msgstr "若要开始,请买比特币或共享您的地址。你可以从任何
#: www/views/tab-send.html:33
msgid "To get started, you'll need to create a bitcoin wallet and get some bitcoin."
msgstr "若要开始,您将需要创建一个比特币的钱包,并获得一些比特币。"
msgstr "首先,您需要创建一个比特币钱包,并获得一些比特币。"
#: src/js/services/bitpayAccountService.js:73
msgid "To {{reason}} you must first add your BitPay account - {{email}}"
@ -3196,7 +3274,7 @@ msgstr "查看服务条款"
#: src/js/controllers/bitpayCard.js:122
#: src/js/controllers/tx-details.js:191
msgid "View Transaction on Explorer.Bitcoin.com"
msgstr ""
msgstr "在 Explorer.Bitcoin.com 上查看交易"
#: src/js/controllers/tab-home.js:148
msgid "View Update"
@ -3592,7 +3670,7 @@ msgstr "我"
#: www/views/addressbook.add.html:32
msgid "name@example.com"
msgstr ""
msgstr "name@example.com"
#: www/views/preferencesHistory.html:15
msgid "preparing..."
@ -3632,3 +3710,51 @@ msgstr "下载的 {{updatingTxHistoryProgress}} 交易"
msgid "{{wallet.m}}-of-{{wallet.n}}"
msgstr "{{wallet.m}}{{wallet.n}}"
#: src/js/services/shapeshiftService.js:8
msgid "Shapeshift"
msgstr "Shapeshift"
#: www/views/includes/community.html:3
msgid "Community"
msgstr "社区"
#: src/js/services/communityService.js:40
msgid "Bitcoin Cash Reddit"
msgstr "Bitcoin Cash Reddit"
#: src/js/services/communityService.js:47
msgid "Bitcoin.com Twitter"
msgstr "Bitcoin.com Twitter"
#: www/views/includes/nextSteps.html:3
msgid "Explore Bitcoin.com"
msgstr "探索 Bitcoin.com"
#: src/js/services/bitcoincomService.js:21
msgid "Bitcoin Cash Games"
msgstr "Bitcoin Cash 游戏"
#: src/js/services/bitcoincomService.js:28
msgid "News"
msgstr "新闻"
#: src/js/services/bitcoincomService.js:35
msgid "Mining Pool"
msgstr "矿池"
#: src/js/services/bitcoincomService.js:42
msgid "Tools"
msgstr "工具"
#: src/js/services/bitcoincomService.js:49
msgid "Bitcoin Price Charts"
msgstr "比特币价格图表"
#: src/js/services/bitcoincomService.js:56
msgid "Free Bitcoin Cash"
msgstr "免费的 Bitcoin Cash"
#: www/views/tab-home.html:30
msgid "Your Bitcoin Wallets are ready!"
msgstr "您的比特币钱包已就绪!"

Binary file not shown.

View file

@ -0,0 +1,32 @@
[Sign]
## [REQUIRED] Your Application Certificate Identity
ApplicationIdentity = 3rd Party Mac Developer Application: Saint Bitts LLC (299HJ3G3BP)
## [OPTIONAL] Parent entitlements file
ParentEntitlements = entitlements-parent.plist
## [OPTIONAL] Child entitlements file
ChildEntitlements = entitlements-child.plist
## [OPTIONAL] Sandbox. Default: Yes
Sandbox = Yes
[Package]
## [REQUIRED for --pkg] Your Installer Certificate Identity
InstallerIdentity = 3rd Party Mac Developer Installer: Saint Bitts LLC (299HJ3G3BP)
## [OPTIONAL for --pkg] Installation path
InstallPath = /Applications
[Info.plist]
## [OPTIONAL] Your app bundle identifier
CFBundleIdentifier = com.bitcoin.mwallet.mac
## [REQUIRED] Team ID obtained from Apple Developer -> Membership -> Team ID
NWTeamID = 299HJ3G3BP
## Properties of Info.plist will be overwritten in this section.
[Resources]
## [OPTIONAL] Your custom icon file
Icon = ../resources/bitcoin.com/mac/pkg/app.icns
## [OPTIONAL] Locales
## If Locales is not set, all current locales are preserved.
## If comma separated locale list (e.g. en,fr,zh_CN) is given, you should have
## additional [Locale locale_name] section for each locale containing localized strings.
## Locales not in the list will be removed.
Locales = en

View file

@ -0,0 +1,253 @@
#!/usr/bin/env python
import argparse
import ConfigParser
import shutil
import os
import fnmatch
import plistlib
import tempfile
from datetime import datetime
import sys
import io
bundleid = None
verbose = False
def info(msg):
global verbose
if verbose:
print '[INFO] %s' % msg
def error(msg):
print '[ERROR] %s' % msg
print '\nFailed.'
sys.exit(1)
def system(cmd):
info(cmd)
os.system(cmd)
def check_options(config, section, required_options, msg):
missed_options = []
for option in required_options:
if not config.has_option(section, option):
missed_options.append(option)
if len(missed_options) != 0:
error(msg % (section, ', '.join(missed_options)))
def glob(pathname, pattern, returnOnFound=False):
matches = []
for root, dirnames, filenames in os.walk(pathname):
for dirname in fnmatch.filter(dirnames, pattern):
if returnOnFound:
return os.path.join(root, dirname)
matches.append(os.path.join(root, dirname))
for filename in fnmatch.filter(filenames, pattern):
if returnOnFound:
return os.path.join(root, filename)
matches.append(os.path.join(root, filename))
return matches
def get_bundle_id(args):
global bundleid
if bundleid is None:
plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist'))
bundleid = plist['CFBundleIdentifier']
return bundleid
def get_from_info_plist(args, key, default=None):
plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist'))
if key in plist:
return plist[key]
else:
return default
def patch_info_plist_file(file, replaces):
plist = plistlib.readPlist(file)
for (key, val) in replaces:
plist[key] = val
plistlib.writePlist(plist, file)
def generate_infoplist_strings_file(file, items):
with io.open(file, 'w', encoding='utf-16') as fd:
for item in items:
fd.write(unicode('%s = "%s";\n' % item, 'utf-8'))
def read_config(args):
print '\nParsing config file %s' % args.config_file
if not os.path.isfile(args.config_file):
error('%s does not exist' % args.config_file)
config = ConfigParser.SafeConfigParser()
config.optionxform = str # set to str to prevent transforming into lower cases
config.read(args.config_file)
check_options(config, 'Sign', ['ApplicationIdentity'], 'Missed options in [%s]: %s')
if args.pkg:
check_options(config, 'Package', ['InstallerIdentity'], 'Missed options for --pkg in [%s]: %s')
return config
def copy_to_output(args):
print '\nCopying %s to %s' % (args.input, args.output)
shutil.rmtree(args.output, ignore_errors=True)
shutil.copytree(args.input, args.output, symlinks=True) # symblic links are required
def patch_info_plist(config, args):
print '\nPatching Info.plist files'
replaces = []
for (key, val) in config.items('Info.plist'):
replaces.append((key, val))
file = os.path.join(args.output, 'Contents/Info.plist')
info(file)
patch_info_plist_file(file, replaces)
info_plist_files = glob(os.path.join(args.output, 'Contents/Versions'), 'Info.plist')
for file in info_plist_files:
if 'nwjs Framework' in file:
tmp_replaces = [('CFBundleIdentifier', '%s.framework' % get_bundle_id(args))]
elif 'nwjs Helper' in file:
tmp_replaces = [('CFBundleIdentifier', '%s.helper' % get_bundle_id(args))]
else:
error('Cannot patch unknown Info.plist %s' % file)
info(file)
patch_info_plist_file(file, tmp_replaces)
def patch_locales(config, args):
print '\nPatching locales'
locales = config.get('Resources', 'Locales').split(',')
removed_locales = []
generated_locales = []
for infoplist_strings_file in glob(os.path.join(args.output, 'Contents/Resources'), 'InfoPlist.strings'):
locale_dir = os.path.dirname(infoplist_strings_file)
(locale, _) = os.path.splitext(os.path.basename(locale_dir))
if locale not in locales:
removed_locales.append(locale)
shutil.rmtree(locale_dir)
elif config.has_section('Locale %s' % locale):
generated_locales.append(locale)
generate_infoplist_strings_file(infoplist_strings_file, config.items('Locale %s' % locale))
else:
error('Missing [Locale %s] section' % locale)
if len(generated_locales) > 0:
info('Generated locales for %s' % ', '.join(generated_locales))
if len(removed_locales) > 0:
info('Removed locales for %s' % ', '.join(removed_locales))
removed_paks = []
for local_pak in glob(os.path.join(args.output, 'Contents/Versions'), 'locale.pak'):
locale_dir = os.path.dirname(local_pak)
(locale, _) = os.path.splitext(os.path.basename(locale_dir))
if locale != 'en' and locale not in locales:
removed_paks.append(locale)
shutil.rmtree(locale_dir)
if len(removed_paks) > 0:
info('Removed .pak files for %s' % ', '.join(removed_locales))
def patch_icon(config, args):
plist = plistlib.readPlist(os.path.join(args.output, 'Contents/Info.plist'))
icon = os.path.join(os.path.dirname(args.config_file), config.get('Resources', 'Icon'))
dest_icon = os.path.join(args.output, 'Contents/Resources/%s' % plist['CFBundleIconFile'])
info('Copying icon from %s to %s' % (icon, dest_icon))
shutil.copy2(icon, dest_icon)
def codesign_app(config, args):
print '\nCodesigning'
bundleid = get_bundle_id(args)
identity = config.get('Sign', 'ApplicationIdentity')
sandbox = True
if config.has_option('Sign', 'Sandbox'):
sandbox = config.getboolean('Sign', 'Sandbox')
## sign child frameworks and helpers
(_, tmp_child_entitlements) = tempfile.mkstemp()
if config.has_option('Sign', 'ChildEntitlements'):
child = config.get('Sign', 'ChildEntitlements')
child_entitlements = plistlib.readPlist(child)
else:
child_entitlements = {
'com.apple.security.app-sandbox' : sandbox,
'com.apple.security.inherit' : True
}
plistlib.writePlist(child_entitlements, tmp_child_entitlements)
info('Child entitlements: %s' % tmp_child_entitlements)
framework = glob(args.output, 'nwjs Framework.framework', returnOnFound=True)
system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, framework))
helperApp = glob(args.output, 'nwjs Helper.app', returnOnFound=True)
system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_child_entitlements, helperApp))
## sign parent app
(_, tmp_parent_entitlements) = tempfile.mkstemp()
if config.has_option('Sign', 'ParentEntitlements'):
parent = config.get('Sign', 'ParentEntitlements')
parent_entitlements = plistlib.readPlist(parent)
else:
parent_entitlements = {}
teamid = get_from_info_plist(args, 'NWTeamID', default=None)
if teamid is None:
groupid = bundleid
else:
groupid = '%s.%s' % (teamid, bundleid)
parent_entitlements['com.apple.security.app-sandbox'] = sandbox
parent_entitlements['com.apple.security.application-groups'] = [groupid]
plistlib.writePlist(parent_entitlements, tmp_parent_entitlements)
info('Parent entitlements: %s' % tmp_parent_entitlements)
system('codesign -f --verbose -s "%s" --entitlements %s --deep "%s"' % (identity, tmp_parent_entitlements, args.output))
def productbuild(config, args):
print '\nRunning productbuild'
installer_identity = config.get('Package', 'InstallerIdentity')
if config.has_option('Package', 'InstallPath'):
install_path = config.get('Package', 'InstallPath')
else:
install_path = '/Applications'
system('productbuild --component "%s" "%s" --sign "%s" "%s"' % (args.output, install_path, installer_identity, args.pkg))
def main():
parser = argparse.ArgumentParser(description='Signing tool for NW.js app')
parser.add_argument('-C', '--config-file', default='build.cfg', help='config file. (default: build.cfg)')
parser.add_argument('-I', '--input', default='nwjs.app', help='path to input app. (default: nwjs.app)')
parser.add_argument('-O', '--output', default='nwjs_output.app', help='path to output app. (default: nwjs_output.app)')
parser.add_argument('-S', '--skip-patching', default=False, help='run codesign without patching the app. (default: False)', action='store_true')
parser.add_argument('-P', '--pkg', default=None, help='run productbuild to generate .pkg after codesign. (default: None)')
parser.add_argument('-V', '--verbose', default=False, help='display detailed information. (default: False)', action='store_true')
args = parser.parse_args()
global verbose
verbose = args.verbose
# read config file
config = read_config(args)
# make a copy
copy_to_output(args)
if not args.skip_patching:
# patch Info.plist
patch_info_plist(config, args)
# process resources & locales
if config.has_section('Resources'):
if config.has_option('Resources', 'Locales'):
patch_locales(config, args)
if config.has_option('Resources', 'Icon'):
patch_icon(config, args)
# codesign
codesign_app(config, args)
if args.pkg:
productbuild(config, args)
print '\nDone.'
if __name__ == "__main__":
main()

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<string>$GROUPID</string>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
</dict>
</plist>

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService) {
angular.module('copayApp.controllers').controller('addressbookAddController', function($scope, $state, $stateParams, $timeout, $ionicHistory, gettextCatalog, addressbookService, popupService, configService, bitcoinCashJsService, platformInfo) {
var config = configService.getSync();
var defaults = configService.getDefaults();
@ -35,6 +35,16 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu
var translated = bitcoinCashJsService.readAddress(addressbook.address);
addressbook.address = translated.legacy;
}
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
var log = new window.BitAnalytics.LogEvent("contact_created", [{
"coin": $scope.addressbookEntry.coin
}], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
$timeout(function() {
addressbookService.add(addressbook, function(err, ab) {
if (err) {

View file

@ -38,9 +38,11 @@ angular.module('copayApp.controllers').controller('amountController', function($
$scope.minShapeshiftAmount = parseFloat(data.stateParams.minShapeshiftAmount);
$scope.maxShapeshiftAmount = parseFloat(data.stateParams.maxShapeshiftAmount);
$scope.shapeshiftOrderId = data.stateParams.shapeshiftOrderId;
$scope.fromWalletId = data.stateParams.fromWalletId;
}
// To get the wallet from with the new flow
$scope.fromWalletId = data.stateParams.fromWalletId;
if (data.stateParams.noPrefix) {
$scope.showWarningMessage = data.stateParams.noPrefix != 0;
if ($scope.showWarningMessage) {
@ -458,7 +460,8 @@ angular.module('copayApp.controllers').controller('amountController', function($
amount: $scope.useSendMax ? null : _amount,
currency: unit.id.toUpperCase(),
coin: coin,
useSendMax: $scope.useSendMax
useSendMax: $scope.useSendMax,
fromWalletId: $scope.fromWalletId
});
} else {
var amount = _amount;
@ -479,6 +482,7 @@ angular.module('copayApp.controllers').controller('amountController', function($
toColor: $scope.toColor,
coin: coin,
useSendMax: $scope.useSendMax,
fromWalletId: $scope.fromWalletId
};
if ($scope.shapeshiftOrderId) {

View file

@ -1,7 +1,9 @@
'use strict';
angular.module('copayApp.controllers').controller('buyBitcoindotcomController',
function($scope, $timeout, $ionicModal, $log, $state, $ionicHistory, lodash, bitcoincomService, externalLinkService, popupService) {
function($scope, platformInfo, externalLinkService) {
$scope.os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop';
$scope.openExternalLink = function(url) {
externalLinkService.open(url);

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService) {
angular.module('copayApp.controllers').controller('confirmController', function($rootScope, $scope, $interval, $filter, $timeout, $ionicScrollDelegate, gettextCatalog, walletService, platformInfo, lodash, configService, $stateParams, $window, $state, $log, profileService, bitcore, bitcoreCash, txFormatService, ongoingProcess, $ionicModal, popupService, $ionicHistory, $ionicConfig, payproService, feeService, bwcError, txConfirmNotification, externalLinkService, firebaseEventsService, soundService) {
var countDown = null;
var FEE_TOO_HIGH_LIMIT_PER = 15;
@ -287,7 +287,10 @@ angular.module('copayApp.controllers').controller('confirmController', function(
tx.amountValueStr = tx.amountStr.split(' ')[0];
tx.amountUnitStr = tx.amountStr.split(' ')[1];
txFormatService.formatAlternativeStr(wallet.coin, tx.toAmount, function(v) {
var parts = v.split(' ');
tx.alternativeAmountStr = v;
tx.alternativeAmountValueStr = parts[0];
tx.alternativeAmountUnitStr = (parts.length > 0) ? parts[1] : '';
});
}
@ -426,6 +429,8 @@ angular.module('copayApp.controllers').controller('confirmController', function(
function showSendMaxWarning(wallet, sendMaxInfo) {
var feeAlternative = '',
msg = '';
function verifyExcludedUtxos() {
var warningMsg = [];
@ -443,9 +448,18 @@ angular.module('copayApp.controllers').controller('confirmController', function(
return warningMsg.join('\n');
};
var msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees.", {
fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee)
});
feeAlternative = txFormatService.formatAlternativeStr(wallet.coin, sendMaxInfo.fee);
if (feeAlternative) {
msg = gettextCatalog.getString("{{feeAlternative}} will be deducted for bitcoin networking fees ({{fee}}).", {
fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee),
feeAlternative: feeAlternative
});
} else {
msg = gettextCatalog.getString("{{fee}} will be deducted for bitcoin networking fees).", {
fee: txFormatService.formatAmountStr(wallet.coin, sendMaxInfo.fee)
});
}
var warningMsg = verifyExcludedUtxos();
if (!lodash.isEmpty(warningMsg))
@ -624,10 +638,24 @@ angular.module('copayApp.controllers').controller('confirmController', function(
(processName == 'sendingTx' && !$scope.wallet.canSign() && !$scope.wallet.isPrivKeyExternal())
) && !isOn) {
$scope.sendStatus = 'success';
if (config.soundsEnabled && $scope.wallet.coin == 'bch') {
var audio = new Audio('misc/bch_sent.mp3');
audio.play();
if ($state.current.name === "tabs.send.confirm") { // XX SP: Otherwise all open wallets on other devices play this sound if you have been in a send flow before on that device.
soundService.play('misc/payment_sent.mp3');
}
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
"coin": $scope.wallet.coin,
"type": "outgoing",
"amount": $scope.amount,
"fees": $scope.fee
}], [channel, "adjust"]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
// Should be removed
firebaseEventsService.logEvent('sent_bitcoin', { coin: $scope.wallet.coin });
$timeout(function() {
$scope.$digest();

View file

@ -1,53 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('rateAppController', function($scope, $state, $stateParams, $window, lodash, externalLinkService, configService, platformInfo, feedbackService, ongoingProcess, popupService, appConfigService) {
$scope.score = parseInt($stateParams.score);
$scope.appName = appConfigService.nameCase;
var isAndroid = platformInfo.isAndroid;
var isIOS = platformInfo.isIOS;
var config = configService.getSync();
$scope.skip = function() {
var dataSrc = {
"Email": lodash.values(config.emailFor)[0] || ' ',
"Feedback": ' ',
"Score": $stateParams.score,
"AppVersion": $window.version,
"Platform": ionic.Platform.platform(),
"DeviceVersion": ionic.Platform.version()
};
feedbackService.send(dataSrc, function(err) {
if (err) {
// try to send, but not essential, since the user didn't add a message
$log.warn('Could not send feedback.');
}
});
$state.go('tabs.rate.complete', {
score: $stateParams.score,
skipped: true
});
};
$scope.sendFeedback = function() {
$state.go('tabs.rate.send', {
score: $scope.score
});
};
$scope.goAppStore = function() {
var defaults = configService.getDefaults();
var url;
if (isAndroid)
url = defaults.rateApp.bitcoincom.android;
if (isIOS)
url = defaults.rateApp.bitcoincom.ios;
externalLinkService.open(url);
$state.go('tabs.rate.complete', {
score: $stateParams.score,
skipped: true,
rated: true
});
};
});

View file

@ -1,60 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('rateCardController', function($scope, $state, $timeout, $log, gettextCatalog, platformInfo, storageService, appConfigService) {
$scope.isCordova = platformInfo.isCordova;
$scope.score = 0;
$scope.appName = appConfigService.nameCase;
$scope.goFeedbackFlow = function() {
$scope.hideCard();
if ($scope.isCordova && $scope.score == 5) {
$state.go('tabs.rate.rateApp', {
score: $scope.score
});
} else {
$state.go('tabs.rate.send', {
score: $scope.score
});
}
};
$scope.setScore = function(score) {
$scope.score = score;
switch ($scope.score) {
case 1:
$scope.button_title = gettextCatalog.getString("I think this app is terrible.");
break;
case 2:
$scope.button_title = gettextCatalog.getString("I don't like it");
break;
case 3:
$scope.button_title = gettextCatalog.getString("Meh - it's alright");
break;
case 4:
$scope.button_title = gettextCatalog.getString("I like the app");
break;
case 5:
$scope.button_title = gettextCatalog.getString("This app is fantastic!");
break;
}
$timeout(function() {
$scope.$apply();
});
};
$scope.hideCard = function() {
$log.debug('Feedback card dismissed.')
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = JSON.parse(info);
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
$scope.showRateCard.value = false;
$timeout(function() {
$scope.$apply();
}, 100);
});
});
}
});

View file

@ -1,102 +0,0 @@
'use strict';
angular.module('copayApp.controllers').controller('sendController', function($scope, $state, $log, $timeout, $stateParams, $ionicNavBarDelegate, $ionicHistory, $ionicConfig, $window, gettextCatalog, popupService, configService, lodash, feedbackService, ongoingProcess, platformInfo, appConfigService) {
$scope.sendFeedback = function(feedback, goHome) {
var config = configService.getSync();
var dataSrc = {
"Email": lodash.values(config.emailFor)[0] || ' ',
"Feedback": goHome ? ' ' : feedback,
"Score": $stateParams.score || ' ',
"AppVersion": $window.version,
"Platform": ionic.Platform.platform(),
"DeviceVersion": ionic.Platform.version()
};
if (!goHome) ongoingProcess.set('sendingFeedback', true);
feedbackService.send(dataSrc, function(err) {
if (goHome) return;
ongoingProcess.set('sendingFeedback', false);
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Feedback could not be submitted. Please try again later.'));
return;
}
if (!$stateParams.score) {
popupService.showAlert(gettextCatalog.getString('Thank you!'), gettextCatalog.getString('A member of the team will review your feedback as soon as possible.'), function() {
$scope.feedback.value = '';
$ionicHistory.nextViewOptions({
disableAnimate: false,
historyRoot: true
});
$ionicHistory.goBack();
}, gettextCatalog.getString('Finish'));
return;
}
$state.go('tabs.rate.complete', {
score: $stateParams.score
});
});
if (goHome) $state.go('tabs.home');
};
$scope.$on("$ionicView.beforeLeave", function(event, data) {
$ionicConfig.views.swipeBackEnabled(true);
});
$scope.$on("$ionicView.enter", function(event, data) {
if ($scope.score)
$ionicConfig.views.swipeBackEnabled(false);
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isCordova = platformInfo.isCordova;
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
$scope.feedback = {};
switch ($scope.score) {
case 1:
$scope.reaction = "Ouch!";
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 2:
$scope.reaction = gettextCatalog.getString("Oh no!");
$scope.comment = gettextCatalog.getString("There's obviously something we're doing wrong.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 3:
$scope.reaction = "Hmm...";
$scope.comment = gettextCatalog.getString("We'd love to do better.") + ' ' + gettextCatalog.getString("How could we improve your experience?");
break;
case 4:
$scope.reaction = gettextCatalog.getString("Thanks!");
$scope.comment = gettextCatalog.getString("That's exciting to hear. We'd love to earn that fifth star from you how could we improve your experience?");
break;
case 5:
$scope.reaction = gettextCatalog.getString("Thank you!");
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}.", {
appName: appConfigService.nameCase
}) + ' ' + gettextCatalog.getString("Is there anything we could do better?");
break;
default:
$scope.justFeedback = true;
$scope.comment = gettextCatalog.getString("We're always looking for ways to improve {{appName}}. How could we improve your experience?", {
appName: appConfigService.nameCase
});
break;
}
});
$scope.$on("$ionicView.afterEnter", function() {
$scope.showForm = true;
});
$scope.goBack = function() {
$ionicHistory.nextViewOptions({
disableAnimate: false,
historyRoot: true
});
$ionicHistory.goBack();
};
});

View file

@ -75,6 +75,15 @@ angular.module('copayApp.controllers').controller('preferencesNotificationsContr
};
emailService.updateEmail(opts);
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
var log = new window.BitAnalytics.LogEvent("settings_email_notification_toggle", [{
"toggle": $scope.emailNotifications.value
}], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
};
$scope.soundNotificationsChange = function() {

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('completeController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) {
angular.module('copayApp.controllers').controller('shareAppController', function($scope, $stateParams, $timeout, $log, $ionicHistory, $state, $ionicNavBarDelegate, $ionicConfig, platformInfo, configService, storageService, lodash, appConfigService, gettextCatalog) {
$scope.isCordova = platformInfo.isCordova;
$scope.title = gettextCatalog.getString("Share {{appName}}", {
appName: appConfigService.nameCase
@ -57,28 +57,8 @@ angular.module('copayApp.controllers').controller('completeController', function
$ionicConfig.views.swipeBackEnabled(true);
});
$scope.$on("$ionicView.enter", function() {
if (!$scope.fromSettings)
$ionicConfig.views.swipeBackEnabled(false);
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.score = (data.stateParams && data.stateParams.score) ? parseInt(data.stateParams.score) : null;
$scope.skipped = (data.stateParams && data.stateParams.skipped) ? true : false;
$scope.rated = (data.stateParams && data.stateParams.rated) ? true : false;
$scope.fromSettings = (data.stateParams && data.stateParams.fromSettings) ? true : false;
if (!$scope.fromSettings) {
$ionicNavBarDelegate.showBackButton(false);
} else {
$ionicNavBarDelegate.showBackButton(true);
}
storageService.getFeedbackInfo(function(error, info) {
var feedbackInfo = lodash.isString(info) ? JSON.parse(info) : null;
feedbackInfo.sent = true;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {});
});
$ionicNavBarDelegate.showBackButton(true);
if (!$scope.isCordova) return;
$scope.animate = true;
@ -133,13 +113,4 @@ angular.module('copayApp.controllers').controller('completeController', function
}
}, 100);
});
$scope.close = function() {
$ionicHistory.nextViewOptions({
disableAnimate: false,
historyRoot: true
});
if ($scope.score == 5) $ionicHistory.goBack(-3);
else $ionicHistory.goBack(-2);
};
});

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.controllers').controller('tabHomeController',
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, feedbackService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) {
function($rootScope, $timeout, $scope, $state, $stateParams, $ionicModal, $ionicScrollDelegate, $window, gettextCatalog, lodash, popupService, ongoingProcess, bannerService, externalLinkService, latestReleaseService, profileService, walletService, configService, $log, platformInfo, storageService, txpModalService, appConfigService, startupService, addressbookService, bwcError, nextStepsService, buyAndSellService, homeIntegrationsService, bitpayCardService, pushNotificationsService, timeService, bitcoincomService, pricechartService, firebaseEventsService, servicesService, shapeshiftService, $ionicNavBarDelegate, signVerifyMessageService) {
var wallet;
var listeners = [];
var notifications = [];
@ -14,11 +14,20 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.isAndroid = platformInfo.isAndroid;
$scope.isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
$scope.isNW = platformInfo.isNW;
$scope.showRateCard = {};
$scope.showServices = false;
$scope.bannerIsLoading = true;
$scope.bannerImageUrl = '';
$scope.bannerUrl = '';
$scope.$on("$ionicView.afterEnter", function() {
startupService.ready();
bannerService.getBanner(function (banner) {
$scope.bannerImageUrl = banner.imageURL;
$scope.bannerUrl = banner.url;
$scope.bannerIsLoading = false;
});
});
$scope.$on("$ionicView.beforeEnter", function(event, data) {
@ -42,43 +51,6 @@ angular.module('copayApp.controllers').controller('tabHomeController',
}
});
}
storageService.getFeedbackInfo(function(error, info) {
if ($scope.isWindowsPhoneApp) {
$scope.showRateCard.value = false;
return;
}
if (!info) {
initFeedBackInfo();
} else {
var feedbackInfo = JSON.parse(info);
//Check if current version is greater than saved version
var currentVersion = $scope.version;
var savedVersion = feedbackInfo.version;
var isVersionUpdated = feedbackService.isVersionUpdated(currentVersion, savedVersion);
if (!isVersionUpdated) {
initFeedBackInfo();
return;
}
var now = moment().unix();
var timeExceeded = (now - feedbackInfo.time) >= 24 * 7 * 60 * 60;
$scope.showRateCard.value = timeExceeded && !feedbackInfo.sent;
$timeout(function() {
$scope.$apply();
});
}
});
function initFeedBackInfo() {
var feedbackInfo = {};
feedbackInfo.time = moment().unix();
feedbackInfo.version = $scope.version;
feedbackInfo.sent = false;
storageService.setFeedbackInfo(JSON.stringify(feedbackInfo), function() {
$scope.showRateCard.value = false;
});
};
});
$scope.$on("$ionicView.enter", function(event, data) {
@ -155,8 +127,8 @@ angular.module('copayApp.controllers').controller('tabHomeController',
externalLinkService.open(url, optIn, title, message, okText, cancelText);
};
$scope.openStore = function() {
externalLinkService.open('https://store.bitcoin.com/', false);
$scope.openBannerUrl = function() {
externalLinkService.open($scope.bannerUrl, false);
};
$scope.openNotificationModal = function(n) {

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService) {
angular.module('copayApp.controllers').controller('tabReceiveController', function($rootScope, $scope, $timeout, $log, $ionicModal, $state, $ionicHistory, $ionicPopover, storageService, platformInfo, walletService, profileService, configService, lodash, gettextCatalog, popupService, bwcError, bitcoinCashJsService, $ionicNavBarDelegate, txFormatService, soundService, clipboardService) {
var listeners = [];
$scope.bchAddressType = { type: 'cashaddr' };
@ -13,6 +13,8 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
var currentAddressSocket = {};
var paymentSubscriptionObj = { op:"addr_sub" }
var config;
$scope.displayBalanceAsFiat = true;
$scope.requestSpecificAmount = function() {
@ -22,7 +24,7 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
});
};
$scope.setAddress = function(newAddr) {
$scope.setAddress = function(newAddr, copyAddress) {
$scope.addr = null;
if (!$scope.wallet || $scope.generatingAddress || !$scope.wallet.isComplete()) return;
$scope.generatingAddress = true;
@ -56,6 +58,14 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
paymentSubscriptionObj.addr = $scope.addr
}
if (copyAddress === true) {
try {
clipboardService.copyToClipboard($scope.wallet.coin == 'bch' && $scope.bchAddressType.type == 'cashaddr' ? 'bitcoincash:' + $scope.addr : $scope.addr);
} catch (error) {
$log.debug("Error copying to clipboard:");
$log.debug(error);
}
}
// create subscription
var msg = JSON.stringify(paymentSubscriptionObj);
currentAddressSocket.onopen = function (event) {
@ -125,9 +135,30 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
for (var i = 0; i < data.x.out.length; i++) {
if (data.x.out[i].addr == watchAddress) {
$scope.paymentReceivedAmount = txFormatService.formatAmount(data.x.out[i].value, 'full');
$scope.paymentReceivedAlternativeAmount = ''; // For when a subsequent payment is received.
txFormatService.formatAlternativeStr($scope.wallet.coin, data.x.out[i].value, function(alternativeStr){
if (alternativeStr) {
$scope.paymentReceivedAlternativeAmount = alternativeStr;
}
});
}
}
$scope.paymentReceivedCoin = $scope.wallet.coin;
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
var log = new window.BitAnalytics.LogEvent("transfer_success", [{
"coin": $scope.wallet.coin,
"type": "incoming"
}], [channel, "adjust"]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
if ($state.current.name === "tabs.receive") {
soundService.play('misc/payment_received.mp3');
}
$scope.$apply(function () {
$scope.showingPaymentReceived = true;
});
@ -215,12 +246,14 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi
})
];
configService.whenAvailable(function(config) {
$scope.displayBalanceAsFiat = config.wallet.settings.priceDisplay === 'fiat';
configService.whenAvailable(function(_config) {
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
config = _config;
});
});
$scope.$on("$ionicView.enter", function(event, data) {
$scope.showingPaymentReceived = false;
$ionicNavBarDelegate.showBar(true);
});

View file

@ -122,8 +122,11 @@ angular.module('copayApp.controllers').controller('tabScanController', function(
scannerService.openSettings();
};
$scope.reactivationCount = 0;
$scope.attemptToReactivate = function(){
scannerService.reinitialize();
scannerService.reinitialize(function(){
$scope.reactivationCount++;
});
};
$scope.toggleLight = function(){

View file

@ -1,32 +1,139 @@
'use strict';
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicNavBarDelegate) {
angular.module('copayApp.controllers').controller('tabSendController', function($scope, $rootScope, $log, $timeout, $ionicScrollDelegate, $ionicLoading, addressbookService, profileService, lodash, $state, walletService, incomingData, popupService, platformInfo, bwcError, gettextCatalog, scannerService, configService, bitcoinCashJsService, $ionicPopup, $ionicNavBarDelegate, clipboardService) {
var clipboardHasAddress = false;
var clipboardHasContent = false;
var originalList;
var CONTACTS_SHOW_LIMIT;
var currentContactsPage;
$scope.isChromeApp = platformInfo.isChromeApp;
$scope.sectionDisplay = {
transferToWallet: false
$scope.displayBalanceAsFiat = true;
$scope.walletSelectorTitleForce = true;
$scope.addContact = function() {
$state.go('tabs.send.addressbook');
};
$scope.pasteClipboard = function() {
if ($scope.clipboardHasAddress || $scope.clipboardHasContent) {
clipboardService.readFromClipboard(function(text) {
$scope.$apply(function() {
$scope.formData.search = text;
$scope.findContact($scope.formData.search);
});
});
} else {
$ionicPopup.alert({
title: gettextCatalog.getString('Clipboard'),
template: gettextCatalog.getString('Your Clipboard is empty')
});
}
};
$scope.$on("$ionicView.enter", function(event, data) {
clipboardService.readFromClipboard(function(text) {
if (text.length > 200) {
text = text.substring(0, 200);
}
$scope.clipboardHasAddress = false;
$scope.clipboardHasContent = false;
if ((text.indexOf('bitcoincash:') === 0 || text[0] === 'C' || text[0] === 'H' || text[0] === 'p' || text[0] === 'q') && text.replace('bitcoincash:', '').length === 42) { // CashAddr
$scope.clipboardHasAddress = true;
} else if ((text[0] === "1" || text[0] === "3" || text.substring(0, 3) === "bc1") && text.length >= 26 && text.length <= 35) { // Legacy Addresses
$scope.clipboardHasAddress = true;
} else if (text.length > 1) {
$scope.clipboardHasContent = true;
}
});
$ionicNavBarDelegate.showBar(true);
if (!$scope.hasWallets) {
$scope.checkingBalance = false;
return;
}
updateHasFunds();
updateContactsList(function() {
updateList();
});
});
var wallets;
var walletsBch;
var walletsBtc;
var walletToWalletFrom = false;
$scope.onWalletSelect = function(wallet) {
if (!$scope.walletToWalletFrom) {
$scope.walletToWalletFrom = wallet;
if (wallet.coin === 'bch') {
$scope.showWalletsBch = true;
} else if (wallet.coin === 'btc') {
$scope.showWalletsBtc = true;
}
$scope.walletSelectorTitleTo = gettextCatalog.getString('Send to');
} else {
$ionicLoading.show();
walletService.getAddress(wallet, true, function(err, addr) {
$ionicLoading.hide();
return $state.transitionTo('tabs.send.amount', {
displayAddress: $scope.walletToWalletFrom.coin === 'bch' ? bitcoinCashJsService.translateAddresses(addr).cashaddr : addr,
recipientType: 'wallet',
fromWalletId: $scope.walletToWalletFrom.id,
toAddress: addr,
coin: $scope.walletToWalletFrom.coin
});
});
}
};
$scope.showWalletSelector = function() {
$scope.walletToWalletFrom = false;
$scope.walletSelectorTitleFrom = gettextCatalog.getString('Send from');
$scope.showWallets = true;
};
$scope.findContact = function(search) {
if (incomingData.redir(search)) {
return;
}
if (!search || search.length < 1) {
$scope.list = originalList;
$timeout(function() {
$scope.$apply();
});
return;
}
var result = lodash.filter(originalList, function(item) {
var val = item.name;
return lodash.startsWith(val.toLowerCase(), search.toLowerCase());
});
$scope.list = result;
};
var hasWallets = function() {
$scope.walletsWithFunds = profileService.getWallets({
onlyComplete: true,
hasFunds: true
});
$scope.wallets = profileService.getWallets({
onlyComplete: true
onlyComplete: true,
});
$scope.walletsBch = profileService.getWallets({
onlyComplete: true,
coin: 'bch'
});
$scope.walletsBtc = profileService.getWallets({
onlyComplete: true,
coin: 'btc'
});
$scope.hasWallets = lodash.isEmpty($scope.wallets) ? false : true;
};
// THIS is ONLY to show the 'buy bitcoins' message
// does not has any other function.
var updateHasFunds = function() {
if ($rootScope.everHasFunds) {
$scope.hasFunds = true;
return;
}
$scope.hasFunds = false;
var index = 0;
lodash.each($scope.wallets, function(w) {
@ -41,10 +148,9 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
$scope.hasFunds = true;
} else if (status.availableBalanceSat > 0) {
$scope.hasFunds = true;
$rootScope.everHasFunds = true;
}
if (index == $scope.wallets.length) {
if (index === $scope.wallets.length) {
$scope.checkingBalance = false;
$timeout(function() {
$scope.$apply();
@ -54,49 +160,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
});
};
var updateWalletsList = function() {
var config = configService.getSync();
var networkResult = lodash.countBy($scope.wallets, 'network');
$scope.showTransferCard = $scope.hasWallets && (networkResult.livenet > 1 || networkResult.testnet > 1);
if ($scope.showTransferCard) {
var walletsToTransfer = $scope.wallets;
if (!(networkResult.livenet > 1)) {
walletsToTransfer = lodash.filter(walletsToTransfer, function(item) {
return item.network == 'testnet';
});
}
if (!(networkResult.testnet > 1)) {
walletsToTransfer = lodash.filter(walletsToTransfer, function(item) {
return item.network == 'livenet';
});
}
var walletList = [];
lodash.each(walletsToTransfer, function(v) {
var displayBalanceAsFiat =
v.status.alternativeBalanceAvailable &&
config.wallet.settings.priceDisplay === 'fiat';
walletList.push({
color: v.color,
name: v.name,
recipientType: 'wallet',
coin: v.coin,
network: v.network,
balanceString: displayBalanceAsFiat ?
v.status.totalBalanceAlternative + ' ' + v.status.alternativeIsoCode :
v.cachedBalance,
getAddress: function(cb) {
walletService.getAddress(v, false, cb);
},
});
});
originalList = originalList.concat(walletList);
}
}
var updateContactsList = function(cb) {
var config = configService.getSync();
var defaults = configService.getDefaults();
@ -115,16 +178,14 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
recipientType: 'contact',
coin: v.coin,
displayCoin: (v.coin == 'bch'
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(),
? (config.bitcoinCashAlias || defaults.bitcoinCashAlias)
: (config.bitcoinAlias || defaults.bitcoinAlias)).toUpperCase(),
getAddress: function(cb) {
return cb(null, k);
},
});
});
var contacts = completeContacts.slice(0, (currentContactsPage + 1) * CONTACTS_SHOW_LIMIT);
$scope.contactsShowMore = completeContacts.length > contacts.length;
originalList = originalList.concat(contacts);
originalList = completeContacts;
return cb();
});
};
@ -137,28 +198,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
}, 10);
};
$scope.openScanner = function() {
var isWindowsPhoneApp = platformInfo.isCordova && platformInfo.isWP;
if (!isWindowsPhoneApp) {
$state.go('tabs.scan');
return;
}
scannerService.useOldScanner(function(err, contents) {
if (err) {
popupService.showAlert(gettextCatalog.getString('Error'), err);
return;
}
incomingData.redir(contents);
});
};
$scope.showMore = function() {
currentContactsPage++;
updateWalletsList();
};
$scope.searchInFocus = function() {
$scope.searchFocus = true;
};
@ -169,28 +208,6 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
}
};
$scope.findContact = function(search) {
if (incomingData.redir(search)) {
return;
}
if (!search || search.length < 2) {
$scope.list = originalList;
$timeout(function() {
$scope.$apply();
});
return;
}
var result = lodash.filter(originalList, function(item) {
var val = item.name;
return lodash.includes(val.toLowerCase(), search.toLowerCase());
});
$scope.list = result;
};
$scope.goToAmount = function(item) {
$timeout(function() {
item.getAddress(function(err, addr) {
@ -233,34 +250,19 @@ angular.module('copayApp.controllers').controller('tabSendController', function(
};
$scope.$on("$ionicView.beforeEnter", function(event, data) {
$scope.isIOS = platformInfo.isIOS && platformInfo.isCordova;
$scope.showWalletsBch = $scope.showWalletsBtc = $scope.showWallets = false;
$scope.checkingBalance = true;
$scope.formData = {
search: null
};
originalList = [];
CONTACTS_SHOW_LIMIT = 10;
currentContactsPage = 0;
hasWallets();
});
$scope.$on("$ionicView.enter", function(event, data) {
$ionicNavBarDelegate.showBar(true);
if (!$scope.hasWallets) {
$scope.checkingBalance = false;
return;
}
updateHasFunds();
updateWalletsList();
updateContactsList(function() {
updateList();
configService.whenAvailable(function(_config) {
$scope.displayBalanceAsFiat = _config.wallet.settings.priceDisplay === 'fiat';
});
});
$scope.toggle = function(section) {
$scope.sectionDisplay[section] = !$scope.sectionDisplay[section];
$timeout(function() {
$ionicScrollDelegate.resize();
$scope.$apply();
}, 10);
};
});

View file

@ -45,6 +45,18 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct
});
};
$scope.sendFeedback = function() {
var mailToLink = 'mailto:wallet@bitcoin.com?subject=Feedback%20for%20Bitcoin.com%20Wallet';
if (platformInfo.isNW) {
nw.Shell.openExternal(mailToLink);
} else if (platformInfo.isCordova) {
var mailWindow = window.open(mailToLink, '_system');
mailWindow.close(); // XX SP: bugfix for some browsers in cordova to change the view entirely
} else {
window.location.href = mailToLink;
}
};
$scope.openExternalLink = function() {
var appName = appConfigService.name;
var url = appName == 'copay' ? 'https://github.com/bitcoin-com/wallet/issues' : 'https://www.bitcoin.com/wallet-support';

View file

@ -12,6 +12,13 @@ angular.module('copayApp.controllers').controller('walletDetailsController', fun
$scope.isAndroid = platformInfo.isAndroid;
$scope.isIOS = platformInfo.isIOS;
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
var log = new window.BitAnalytics.LogEvent("wallet_details_open", [], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
$scope.amountIsCollapsible = !$scope.isAndroid;
$scope.openExternalLink = function(url, target) {

View file

@ -0,0 +1,15 @@
angular.module('copayApp')
.config(['$provide', '$logProvider', function($provide, $logProvider) {
// expose a provider to reach debugEnabled in $log
$provide.value('$logProvider', $logProvider);
}])
.decorator('$log', ['$logProvider', '$delegate', function($logProvider, $delegate) {
// override $log.debug to display in Chrome
$delegate.debug = function () {
if ($logProvider.debugEnabled()) {
$delegate.info.apply($delegate, arguments);
}
};
return $delegate;
}]);

View file

@ -1,38 +1,26 @@
'use strict';
angular.module('copayApp.directives')
.directive('copyToClipboard', function(platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) {
.directive('copyToClipboard', function(clipboardService, ionicToast, gettextCatalog) {
return {
restrict: 'A',
scope: {
copyToClipboard: '=copyToClipboard'
},
link: function(scope, elem, attrs, ctrl) {
var isCordova = platformInfo.isCordova;
var isChromeApp = platformInfo.isChromeApp;
var isNW = platformInfo.isNW;
elem.bind('mouseover', function() {
elem.css('cursor', 'pointer');
});
var msg = gettextCatalog.getString('Copied to clipboard');
elem.bind('click', function() {
var data = scope.copyToClipboard;
if (!data) return;
clipboardService.copyToClipboard(data);
if (isCordova) {
cordova.plugins.clipboard.copy(data);
} else if (isNW) {
nodeWebkitService.writeToClipboard(data);
} else if (clipboard.supported) {
clipboard.copyText(data);
} else {
// No supported
return;
}
scope.$apply(function() {
var msg = gettextCatalog.getString('Copied to clipboard');
scope.$apply(function () {
ionicToast.show(msg, 'bottom', false, 1000);
});
});
}
}

View file

@ -1,7 +1,7 @@
'use strict';
angular.module('copayApp.directives')
.directive('gravatar', function(md5) {
.directive('gravatar', function(md5, $http) {
return {
restrict: 'AE',
replace: true,
@ -9,13 +9,24 @@ angular.module('copayApp.directives')
name: '@',
height: '@',
width: '@',
email: '@'
email: '@',
url: '@'
},
link: function(scope, el, attr) {
if (typeof scope.email === "string") {
scope.emailHash = md5.createHash(scope.email.toLowerCase() || '');
var req = {
method: 'GET',
url: 'https://secure.gravatar.com/'+scope.emailHash+'.json',
};
scope.url = 'img/contact-placeholder.svg';
$http(req).then(function (response) {
scope.url = 'https://secure.gravatar.com/avatar/'+scope.emailHash+'.jpg?s='+scope.width+'&d=mm';
}, function (error) {
scope.url = 'img/contact-placeholder.svg';
});
}
},
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="https://secure.gravatar.com/avatar/{{ emailHash }}.jpg?s={{ width }}&d=mm">'
template: '<img class="gravatar" alt="{{ name }}" height="{{ height }}" width="{{ width }}" src="{{ url }}">'
};
});

View file

@ -8,15 +8,21 @@ angular.module('copayApp.directives')
transclude: true,
scope: {
title: '=walletSelectorTitle',
forceTitle: '=walletSelectorForceTitle',
show: '=walletSelectorShow',
wallets: '=walletSelectorWallets',
selectedWallet: '=walletSelectorSelectedWallet',
onSelect: '=walletSelectorOnSelect',
onHide: '=walletSelectorOnHide',
displayBalanceAsFiat : '=walletSelectorDisplayBalanceAsFiat'
},
link: function(scope, element, attrs) {
console.log(scope, element, attrs);
scope.hide = function() {
scope.show = false;
if (typeof scope.onHide === "function") {
scope.onHide()
}
};
scope.selectWallet = function(wallet) {
$timeout(function() {

View file

@ -9,12 +9,12 @@ function Profile() {
this.version = '1.0.0';
};
Profile.create = function(opts) {
opts = opts || {};
Profile.create = function(appVersion) {
var x = new Profile();
x.appVersion = appVersion;
x.createdOn = Date.now();
x.credentials = opts.credentials || [];
x.credentials = [];
x.disclaimerAccepted = true;
x.checked = {};
return x;
@ -23,6 +23,7 @@ Profile.create = function(opts) {
Profile.fromObj = function(obj) {
var x = new Profile();
x.appVersion = obj.appVersion;
x.createdOn = obj.createdOn;
x.credentials = obj.credentials;
x.disclaimerAccepted = obj.disclaimerAccepted;
@ -62,6 +63,39 @@ Profile.prototype.isDeviceChecked = function(ua) {
return this.checkedUA == ua;
};
/**
*
* @param {Profile} other
*/
Profile.prototype.merge = function(other) {
var newCredentials = [];
var otherCredentialsLength = other.credentials.length;
var thisProfile = this;
other.credentials.forEach(function(otherCredential) {
var credentialExists = false;
thisProfile.credentials.forEach(function(thisCredential) {
if (otherCredential.walletId === thisCredential.walletId) {
credentialExists = true;
}
});
if (!credentialExists) {
newCredentials.push(otherCredential);
}
});
Array.prototype.push.apply(this.credentials, newCredentials);
};
/**
* It's a simple operation, but it means that all the profile logic stays
* in this file.
* @param {string} appVersion - ie "4.11.0"
*/
Profile.prototype.setAppVersion = function(appVersion) {
this.appVersion = appVersion;
}
Profile.prototype.setChecked = function(ua, walletId) {
if (this.checkedUA != ua) {

View file

@ -795,63 +795,15 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
fromOnboarding: null
},
})
/*
*
* Feedback
*
*/
.state('tabs.feedback', {
url: '/feedback',
views: {
'tab-settings@tabs': {
templateUrl: 'views/feedback/send.html',
controller: 'sendController'
}
}
})
.state('tabs.shareApp', {
url: '/shareApp/:score/:skipped/:fromSettings',
url: '/shareApp',
views: {
'tab-settings@tabs': {
controller: 'completeController',
templateUrl: 'views/feedback/complete.html'
controller: 'shareAppController',
templateUrl: 'views/shareApp.html'
}
}
})
.state('tabs.rate', {
url: '/rate',
abstract: true
})
.state('tabs.rate.send', {
url: '/send/:score',
views: {
'tab-home@tabs': {
templateUrl: 'views/feedback/send.html',
controller: 'sendController'
}
}
})
.state('tabs.rate.complete', {
url: '/complete/:score/:skipped',
views: {
'tab-home@tabs': {
controller: 'completeController',
templateUrl: 'views/feedback/complete.html'
}
}
})
.state('tabs.rate.rateApp', {
url: '/rateApp/:score',
views: {
'tab-home@tabs': {
controller: 'rateAppController',
templateUrl: 'views/feedback/rateApp.html'
}
}
})
/*
*
* Buy or Sell Bitcoin
@ -1211,7 +1163,68 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
.run(function($rootScope, $state, $location, $log, $timeout, startupService, ionicToast, fingerprintService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, emailService, /* plugins START HERE => */ buydotbitcoindotcomService, glideraService, amazonService, bitpayCardService, applicationService, mercadoLibreService, rateService) {
$ionicPlatform.ready(function() {
// Init BitAnalytics
var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop';
window.BitAnalytics.initialize(os, $window.fullVersion, {"firebase": {},
"ga": {
"trackingId": "UA-59964190-23",
"eventLabels": ["id", "icon-off"]
},
"adjust": {
"token": "au1onbhgg5q8",
"environment" : "production",
"eventTypes": {
"banner_click": "sc5i8u",
"buy_bitcoin_click": "t1vcdz",
"transfer_success": "f68evo",
"wallet_created": "nd3dg5",
"wallet_opened": "4n39l7"
}
}
});
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
// Send a log to test
var log = new window.BitAnalytics.LogEvent("wallet_opened", [], [channel, "adjust"]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
var actionBanner = new window.BitAnalytics.ActionFactory.createAction('click', {
name: 'banner_click',
class: 'track_banner_click',
params: ['href-banner', 'id'],
channels: [channel, 'adjust']
});
window.BitAnalytics.ActionHandlers.trackAction(actionBanner);
var actionBuyBitcoin = new window.BitAnalytics.ActionFactory.createAction('click', {
name: 'buy_bitcoin_click',
class: 'track_buy_bitcoin_click',
params: ['href', 'id'],
channels: [channel, 'adjust']
});
window.BitAnalytics.ActionHandlers.trackAction(actionBuyBitcoin);
var actionLinkClickOut = new window.BitAnalytics.ActionFactory.createAction('click', {
name: 'link_click_out',
class: 'track_link_click_out',
params: ['href', 'id'],
channels: [channel]
});
window.BitAnalytics.ActionHandlers.trackAction(actionLinkClickOut);
var actionTabOpen = new window.BitAnalytics.ActionFactory.createAction('click', {
name: 'tab_open',
class: 'track_tab_open',
params: ['href', 'title', 'icon-off'],
channels: [channel]
});
window.BitAnalytics.ActionHandlers.trackAction(actionTabOpen);
// Init language
uxLanguage.init(function (lang) {
@ -1381,8 +1394,13 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr
}
win.menu = nativeMenuBar;
}
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
if (document.body.classList.contains('keyboard-open')) {
document.body.classList.remove('keyboard-open');
$log.debug('Prevented keyboard open bug..');
}
$log.debug('Route change from:', fromState.name || '-', ' to:', toState.name);
$log.debug(' toParams:' + JSON.stringify(toParams || {}));
$log.debug(' fromParams:' + JSON.stringify(fromParams || {}));

View file

@ -0,0 +1,78 @@
'use strict';
angular.module('copayApp.services').factory('bannerService', function ($http, $log) {
// Export
var root = {};
// Constant
var API_URL = 'https://bwscash.bitcoin.com/bws/api/v1/marketing';
// Variable
var hasFetched = false;
var banners = [];
var defaultBanner = {
id: 'default-banner',
imageURL: 'img/banner-store.png',
url: 'https://store.bitcoin.com/',
isLocal: true
};
// Private methods
var fetchSettings = function (cb) {
var req = {
method: 'GET',
url: API_URL+'/settings',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
};
$http(req).then(function (response) {
$log.info('Get banner settings: SUCCESS');
banners = response.data;
return cb(true);
}, function (error) {
$log.error('Get banner settings: ERROR ' + error.statusText);
return cb(false);
});
};
root.getBanner = function (cb) {
// If not fetch get the banner
if (!hasFetched) {
hasFetched = true;
// If never fetch, lets fetch
fetchSettings(function (isSuccess) {
root.getBanner(cb);
});
// If fetch, and got banners, lets have a look
} else if (banners.length > 0) {
var selectedBanners = [];
for(var i in banners) {
var banner = banners[i];
// Generate the URL for the banner
var fileName = banner.image.substring(0, banner.image.lastIndexOf('.'));
var extension = banner.image.substring(banner.image.lastIndexOf('.')+1);
banner.imageURL = API_URL +'/banners/'+fileName+"/"+extension;
// Add the banner
selectedBanners.push(banners[i]);
}
// If no banner activated, return the default one
if (selectedBanners.length == 0) {
return cb(defaultBanner);
} else {
return cb(selectedBanners[Math.floor(Math.random()*banners.length)]);
}
} else {
return cb(defaultBanner);
}
};
return root;
});

View file

@ -1,12 +1,13 @@
'use strict';
angular.module('copayApp.services').factory('bitcoincomService', function($http, $log, lodash, moment, storageService, configService, platformInfo, nextStepsService, homeIntegrationsService) {
angular.module('copayApp.services').factory('bitcoincomService', function(platformInfo, nextStepsService) {
var root = {};
var credentials = {};
/*
* Development: 'testnet'
* Production: 'livenet'
*/
*/
var os = platformInfo.isAndroid ? 'android' : platformInfo.isIOS ? 'ios' : 'desktop';
credentials.NETWORK = 'livenet';
//credentials.NETWORK = 'testnet';
@ -20,28 +21,28 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http,
name: 'games',
title: 'Bitcoin Cash Games',
icon: 'icon-games',
href: 'http://cashgames.bitcoin.com'
href: 'https://cashgames.bitcoin.com'
};
var newsItem = {
name: 'news',
title: 'News',
icon: 'icon-news',
href: 'http://news.bitcoin.com'
href: 'https://news.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=News'
};
var poolItem = {
name: 'pool',
title: 'Mining Pool',
icon: 'icon-mining',
href: 'http://pool.bitcoin.com'
href: 'https://pool.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Pool'
};
var toolsItem = {
name: 'tools',
title: 'Tools',
icon: 'icon-tools',
href: 'http://tools.bitcoin.com'
href: 'https://tools.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Tools'
};
var priceChartItem = {
@ -55,7 +56,7 @@ angular.module('copayApp.services').factory('bitcoincomService', function($http,
name: 'faucet',
title: 'Free Bitcoin Cash',
icon: 'icon-faucet',
href: 'https://free.bitcoin.com/'
href: 'https://free.bitcoin.com/?utm_source=WalletApp&utm_medium=' + os + '&utm_campaign=Faucet'
};
var _getBitPay = function(endpoint) {

View file

@ -0,0 +1,46 @@
'use strict';
angular.module('copayApp.services').factory('clipboardService', function ($http, $log, $timeout, platformInfo, nodeWebkitService, gettextCatalog, ionicToast, clipboard) {
var root = {};
root.copyToClipboard = function (data) {
if (!data) return;
$log.debug("Copy '"+data+"' to clipboard");
if (platformInfo.isCordova) {
cordova.plugins.clipboard.copy(data);
} else if (platformInfo.isNW) {
nodeWebkitService.writeToClipboard(data);
} else if (clipboard.supported) {
clipboard.copyText(data);
} else {
// No supported
return;
}
};
root.readFromClipboard = function (cb) {
$log.debug("Read from clipboard");
if (platformInfo.isCordova) {
cordova.plugins.clipboard.paste(function(text) {
cb(text);
})
} else if (platformInfo.isNW) {
$timeout(function() {
cb(nodeWebkitService.readFromClipboard());
},0);
} else {
navigator.clipboard.readText()
.then(function (text) {
cb(text);
})
.catch(function (err) {
$log.debug("Clipboard reading is not supported in browser..");
});
return;
}
};
return root;
});

View file

@ -107,7 +107,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer
enabled: false,
},
soundsEnabled: false,
soundsEnabled: true,
log: {
filter: 'debug',
@ -115,8 +115,8 @@ angular.module('copayApp.services').factory('configService', function(storageSer
bitcoinAlias: 'btc',
bitcoinCashAlias: 'bch',
bitcoinWalletColor: '#fab915', // Observatory
bitcoinCashWalletColor: '#26B03C', // Dollar Green
bitcoinWalletColor: '#535353', // Dark Grey
bitcoinCashWalletColor: '#eeb640', // Observatory
homeSectionIsHidden: {
services: false

View file

@ -0,0 +1,6 @@
'use strict';
angular.module('copayApp.services').factory('desktopSecureStorageService', function($log) {
// Placeholder
return {};
});

View file

@ -1,59 +0,0 @@
'use strict';
angular.module('copayApp.services').factory('feedbackService', function($http, $log, $httpParamSerializer, configService) {
var root = {};
// var URL = "https://script.google.com/macros/s/1pWGRxVSUX9CxPqNAKZTppWHtDvyVtZv9HteY_TRQbWc/exec";
var URL = "https://wallet-data.bitcoin.com/feedback.php";
root.send = function(dataSrc, cb) {
$http(_post(dataSrc)).then(function() {
$log.info("SUCCESS: Feedback sent");
return cb();
}, function(err) {
$log.info("ERROR: Feedback sent anyway.");
return cb(err);
});
};
var _post = function(dataSrc) {
return {
method: 'POST',
url: URL,
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
data: $httpParamSerializer(dataSrc)
};
};
root.isVersionUpdated = function(currentVersion, savedVersion) {
if (!verifyTagFormat(currentVersion))
return 'Cannot verify the format of version tag: ' + currentVersion;
if (!verifyTagFormat(savedVersion))
return 'Cannot verify the format of the saved version tag: ' + savedVersion;
var current = formatTagNumber(currentVersion);
var saved = formatTagNumber(savedVersion);
if (saved.major > current.major || (saved.major == current.major && saved.minor > current.minor))
return false;
return true;
function verifyTagFormat(tag) {
var regex = /^v?\d+\.\d+\.\d+$/i;
return regex.exec(tag);
};
function formatTagNumber(tag) {
var formattedNumber = tag.replace(/^v/i, '').split('.');
return {
major: +formattedNumber[0],
minor: +formattedNumber[1],
patch: +formattedNumber[2]
};
};
};
return root;
});

View file

@ -228,10 +228,12 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat
} else if (/^https?:\/\//.test(data)) {
payproService.getPayProDetails(data, coin, function(err, details) {
if (err) {
root.showMenu({
data: data,
type: 'url'
});
if ($state.includes('tabs.scan')) {
root.showMenu({
data: data,
type: 'url'
});
}
return;
}
handlePayPro(details);

View file

@ -20,8 +20,7 @@ angular.module('copayApp.services')
if (isChromeApp || isNW) {
chrome.storage.local.get(k,
function(data) {
//TODO check for errors
return cb(null, data[k]);
return cb(chrome.runtime.lastError, data[k]);
});
} else {
return cb(null, ls.getItem(k));
@ -56,16 +55,24 @@ angular.module('copayApp.services')
obj[k] = v;
chrome.storage.local.set(obj, cb);
chrome.storage.local.set(obj, function(){
cb(chrome.runtime.lastError);
});
} else {
ls.setItem(k, v);
try {
ls.setItem(k, v);
} catch (e) {
return cb(e);
}
return cb();
}
};
root.remove = function(k, cb) {
if (isChromeApp || isNW) {
chrome.storage.local.remove(k, cb);
chrome.storage.local.remove(k, function(){
cb(chrome.runtime.lastError);
});
} else {
ls.removeItem(k);
return cb();

View file

@ -0,0 +1,88 @@
'use strict';
angular.module('copayApp.services').factory('mobileSecureStorageService', function($log, appConfigService, platformInfo) {
var root = {};
var isReady = false;
var initialisationFailed = false;
var pending = [];
var storage = null;
if (platformInfo.isCordova) {
storage = new cordova.plugins.SecureStorage(
function () {
isReady = true;
for (var i = 0; i < pending.length; i++) {
pending[i]();
}
pending = [];
},
function (error) {
initialisationFailed = true;
},
appConfigService.packageNameId);
}
root.get = function(key, cb) {
if (!platformInfo.isMobile) {
cb(new Error('mobileSecureStorageService is only available on mobile.'));
return;
}
if (!isReady) {
if (initialisationFailed) {
cb(new Error('mobileSecureStorageService initialisation failed.'));
} else {
pending.push(function(){ root.get(key, cb); });
}
return;
}
storage.get(
function (value) {
cb(null, value);
},
function (error) {
$log.debug('mss get failed. ' + error);
if (error.message === 'Failure in SecureStorage.get() - The specified item could not be found in the keychain' || // iOS
error.message === 'Key [_SS_profile] not found.') { // Android
// The callback expects no error, but also no value, if it cannot be found.
cb(null, null);
} else {
cb(new Error(error));
}
},
key);
};
root.set = function(key, value, cb) {
if (!platformInfo.isMobile) {
cb(new Error('mobileSecureStorageService is only available on mobile.'));
}
if (!isReady) {
if (initialisationFailed) {
cb(new Error('mobileSecureStorageService initialisation failed.'));
} else {
pending.push(function(){ root.set(key, value, cb); });
}
return;
}
storage.set(
function (value) {
cb();
},
function (error) {
cb(new Error(error));
},
key, value);
};
return root;
});

View file

@ -427,6 +427,15 @@ angular.module('copayApp.services')
}, function(err, secret) {
if (err) return bwcError.cb(err, gettextCatalog.getString('Error creating wallet'), cb);
var channel = "firebase";
if (platformInfo.isNW) {
channel = "ga";
}
var log = new window.BitAnalytics.LogEvent("wallet_created", [{
"coin": opts.coin
}], [channel]);
window.BitAnalytics.LogEventHandlers.postEvent(log);
return cb(null, walletClient, secret);
});
});
@ -706,7 +715,7 @@ angular.module('copayApp.services')
configService.get(function(err) {
if (err) $log.debug(err);
var p = Profile.create();
var p = Profile.create(appConfigService.version);
storageService.storeNewProfile(p, function(err) {
if (err) return cb(err);
root.bindProfile(p, function(err) {

View file

@ -0,0 +1,53 @@
describe('rateService', function() {
var $httpBackend, rateService, requestHandler;
beforeEach(function() {
module('ngLodash');
module('copayApp.services');
inject(function($injector){
$httpBackend = $injector.get('$httpBackend');
requestHandler = $httpBackend.when('GET', 'https://www.bitcoin.com/special/rates.json')
.respond([
{
"code": "BTC",
"name": "Bitcoin",
"rate": 1
},
{
"code": "BCH_BTC",
"name": "Bitcoin Cash",
"rate": 6.739397
},
{
"code": "USD",
"name": "US Dollar",
"rate": 7602.04
}
]);
rateService = $injector.get('rateService');
$httpBackend.flush();
});
});
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('get rates', function() {
$httpBackend.expectGET('https://www.bitcoin.com/special/rates.json');
rateService.updateRates();
$httpBackend.flush();
var usdRate = rateService.getRate('USD');
expect(usdRate).toEqual(7602.04);
});
});

View file

@ -103,6 +103,7 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti
_completeInitialization(status, callback);
});
} else {
isAvailable = true; // XX SP: Availability can change after permissions are granted after being denied.
_completeInitialization(status, callback);
}
});

View file

@ -0,0 +1,32 @@
'use strict';
angular.module('copayApp.services').factory('secureStorageService', function(desktopSecureStorageService, localStorageService, $log, mobileSecureStorageService, platformInfo) {
var root = {};
// To make wrong code look wrong
function alteredKeyIndicatingDesireForSecureStorage(key) {
return key + ":desiredSecure";
}
root.get = function(k, cb) {
if (platformInfo.isMobile) {
mobileSecureStorageService.get(k, cb);
} else if (platformInfo.isNW) {
desktopSecureStorageService.get(k, cb);
} else { // Browser
localStorageService.get(alteredKeyIndicatingDesireForSecureStorage(k), cb);
}
}
root.set = function(k, v, cb) {
if (platformInfo.isMobile) {
mobileSecureStorageService.set(k, v, cb);
} else if (platformInfo.isNW) {
desktopSecureStorageService.set(k, v, cb);
} else { // Browser
localStorageService.set(alteredKeyIndicatingDesireForSecureStorage(k), v, cb);
}
}
return root;
});

View file

@ -0,0 +1,308 @@
describe('secureStorageService in browser', function(){
var localStorage,
sss;
beforeEach(function(){
module('ngLodash');
module('copayApp.services');
localStorage = {
get: jasmine.createSpy(),
set: jasmine.createSpy()
};
platformInfoStub = {
};
module(function($provide) {
$provide.value('localStorageService', localStorage);
$provide.value('platformInfo', platformInfoStub);
});
inject(function($injector){
sss = $injector.get('secureStorageService');
});
});
it('get fails', function() {
var error, key, result;
localStorage.get.and.callFake(function(k, cb){
key = k;
cb(new Error('Get error.'), null);
});
sss.get('a1234', function(e, res) {
error = e;
result = res;
});
expect(error.message).toBe('Get error.');
expect(result).toBeFalsy();
expect(key).toBe('a1234:desiredSecure');
});
it('get succeeds', function() {
var error, key, result;
localStorage.get.and.callFake(function(k, cb){
key = k;
cb(null, 'The result 1.');
});
sss.get('a123', function(e, res) {
error = e;
result = res;
});
expect(error).toBeFalsy();
expect(result).toBe('The result 1.');
expect(key).toBe('a123:desiredSecure');
});
it('set fails', function() {
var error, key, value;
localStorage.set.and.callFake(function(k, v, cb){
key = k;
value = v;
cb(new Error('Set error.'));
});
sss.set('a12345', 'The value 1.', function(e) {
error = e;
});
expect(error.message).toBe('Set error.');
expect(key).toBe('a12345:desiredSecure');
expect(value).toBe('The value 1.');
});
it('set succeeds', function() {
var error, key, value;
localStorage.set.and.callFake(function(k, v, cb){
key = k;
value = v;
cb(null);
});
sss.set('ab123', 'The value 2.', function(e) {
error = e;
});
expect(error).toBeFalsy();
expect(key).toBe('ab123:desiredSecure');
expect(value).toBe('The value 2.')
});
});
describe('secureStorageService on desktop', function(){
var desktopSss,
sss;
beforeEach(function(){
module('ngLodash');
module('copayApp.services');
desktopSss = {
get: jasmine.createSpy(),
set: jasmine.createSpy()
};
platformInfoStub = {
isNW: true
};
module(function($provide) {
$provide.value('desktopSecureStorageService', desktopSss);
$provide.value('platformInfo', platformInfoStub);
});
inject(function($injector){
sss = $injector.get('secureStorageService');
});
});
it('get fails', function() {
var error, key, result;
desktopSss.get.and.callFake(function(k, cb){
key = k;
cb(new Error('Get error.'), null);
});
sss.get('a1234', function(e, res) {
error = e;
result = res;
});
expect(error.message).toBe('Get error.');
expect(result).toBeFalsy();
expect(key).toBe('a1234');
});
it('get succeeds', function() {
var error, key, result;
desktopSss.get.and.callFake(function(k, cb){
key = k;
cb(null, 'The result 1.');
});
sss.get('a123', function(e, res) {
error = e;
result = res;
});
expect(error).toBeFalsy();
expect(result).toBe('The result 1.');
expect(key).toBe('a123');
});
it('set fails', function() {
var error, key, value;
desktopSss.set.and.callFake(function(k, v, cb){
key = k;
value = v;
cb(new Error('Set error.'));
});
sss.set('a12345', 'The value 1.', function(e) {
error = e;
});
expect(error.message).toBe('Set error.');
expect(key).toBe('a12345');
expect(value).toBe('The value 1.');
});
it('set succeeds', function() {
var error, key, value;
desktopSss.set.and.callFake(function(k, v, cb){
key = k;
value = v;
cb(null);
});
sss.set('ab123', 'The value 2.', function(e) {
error = e;
});
expect(error).toBeFalsy();
expect(key).toBe('ab123');
expect(value).toBe('The value 2.')
});
});
describe('secureStorageService on mobile', function(){
var mobileSss,
sss;
beforeEach(function(){
module('ngLodash');
module('copayApp.services');
mobileSss = {
get: jasmine.createSpy(),
set: jasmine.createSpy()
};
platformInfoStub = {
isMobile: true
};
module(function($provide) {
$provide.value('mobileSecureStorageService', mobileSss);
$provide.value('platformInfo', platformInfoStub);
});
inject(function($injector){
sss = $injector.get('secureStorageService');
});
});
it('get fails', function() {
var error, key, result;
mobileSss.get.and.callFake(function(k, cb){
key = k;
cb(new Error('Get error.'), null);
});
sss.get('a1234', function(e, res) {
error = e;
result = res;
});
expect(error.message).toBe('Get error.');
expect(result).toBeFalsy();
expect(key).toBe('a1234');
});
it('get succeeds', function() {
var error, key, result;
mobileSss.get.and.callFake(function(k, cb){
key = k;
cb(null, 'The result 1.');
});
sss.get('a123', function(e, res) {
error = e;
result = res;
});
expect(error).toBeFalsy();
expect(result).toBe('The result 1.');
expect(key).toBe('a123');
});
it('set fails', function() {
var error, key, value;
mobileSss.set.and.callFake(function(k, v, cb){
key = k;
value = v;
cb(new Error('Set error.'));
});
sss.set('a12345', 'The value 1.', function(e) {
error = e;
});
expect(error.message).toBe('Set error.');
expect(key).toBe('a12345');
expect(value).toBe('The value 1.');
});
it('set succeeds', function() {
var error, key, value;
mobileSss.set.and.callFake(function(k, v, cb){
key = k;
value = v;
cb(null);
});
sss.set('ab123', 'The value 2.', function(e) {
error = e;
});
expect(error).toBeFalsy();
expect(key).toBe('ab123');
expect(value).toBe('The value 2.')
});
});

View file

@ -0,0 +1,44 @@
'use strict';
angular.module('copayApp.services').service('soundService', function($log, $timeout, platformInfo, configService) {
var root = {};
/**
* Play a sound (when enabled in the configuration) using the Cordova Media-plugin (on Mobile) or html5-audio (on Desktop) relative to the www-root
* Make sure there is a .ogg file as well for NW.js (desktop) implementation
* @param soundFile
*/
root.play = function(soundFile) {
configService.whenAvailable(function(config) {
if (config.soundsEnabled) {
if (platformInfo.isCordova) {
if (platformInfo.isAndroid) {
var p = window.location.pathname;
var device_path = p.substring(0, p.lastIndexOf('/'));
soundFile = device_path + '/' + soundFile;
}
var audio = new Media(soundFile,
function () {
$log.debug("playAudio(bch_sent):Audio Success");
},
function (err) {
$log.debug("playAudio():Audio Error: " + err);
}
);
audio.play({playAudioWhenScreenIsLocked: false}); // XX SP: "Locked" is also the mute switch in iOS
} else {
if (platformInfo.isNW) {
soundFile = soundFile.substring(0, soundFile.lastIndexOf('.')) + ".ogg";
$log.debug("Playing .ogg file ("+soundFile+"), as NW.js has no mp3 support");
}
new Audio(soundFile).play();
}
}
});
};
return root;
});

View file

@ -1,6 +1,6 @@
'use strict';
angular.module('copayApp.services')
.factory('storageService', function(logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, $timeout) {
.factory('storageService', function(appConfigService, logHeader, fileStorageService, localStorageService, sjcl, $log, lodash, platformInfo, $timeout) {
var root = {};
var storage;
@ -116,42 +116,105 @@ angular.module('copayApp.services')
};
root.storeNewProfile = function(profile, cb) {
storage.create('profile', profile.toObj(), cb);
root.storeProfile(profile, cb);
};
root.storeProfile = function(profile, cb) {
storage.set('profile', profile.toObj(), cb);
var profileString = profile.toObj();
storage.set('profile', profileString, cb);
};
root.getProfile = function(cb) {
storage.get('profile', function(err, str) {
if (err || !str)
return cb(err);
/**
* @callback getProfileCallback
* @param {Error} error - falsy if profile not found.
* @param {Profile} profile - falsy if error or profile not found.
*/
decryptOnMobile(str, function(err, str) {
if (err) return cb(err);
var p, err;
try {
p = Profile.fromString(str);
} catch (e) {
$log.debug('Could not read profile:', e);
err = new Error('Could not read profile:' + p);
/**
* @param {Error} error
* @param {String} profileStr - containing the profile
* @param {getProfileCallback} cb
*/
function _onOldProfileRetrieved(error, profileStr, cb) {
if (error) {
return cb(error, null);
}
if (!profileStr) {
// No profiles found. No errors either.
return cb(null, null);
}
decryptOnMobile(profileStr, function(decryptErr, decryptedStr) {
if (decryptErr) return cb(decryptErr, null);
var profile;
try {
profile = Profile.fromString(decryptedStr);
} catch (e) {
$log.debug('Could not read profile:', e);
return(new Error('Could not read profile.'), null);
}
cb(null, profile)
});
}
/**
*
* @param {Profile} oldProfile
* @param {Profile} secureProfile - may be falsy if no secure profile found.
* @param {getProfileCallback} cb
*/
function _migrateProfiles(oldProfile, secureProfile, cb) {
var newProfile;
if (secureProfile) {
secureProfile.merge(oldProfile);
newProfile = secureProfile;
} else {
newProfile = oldProfile;
newProfile.setAppVersion(appConfigService.version);
}
root.storeNewProfile(newProfile, function(storeErr) {
if (storeErr) {
cb(storeErr, null);
return;
}
storage.remove('profile', function(removeErr){
if (removeErr) {
cb(removeErr, null);
return;
}
return cb(err, p);
cb(null, newProfile);
});
});
};
root.deleteProfile = function(cb) {
storage.remove('profile', cb);
};
/**
*
* @param {getProfileCallback} cb
*/
root.getProfile = function(cb) {
storage.get('profile', function(getErr, getStr) {
if (getErr) {
cb(getErr, null);
return;
}
root.setFeedbackInfo = function(feedbackValues, cb) {
storage.set('feedback', feedbackValues, cb);
};
root.getFeedbackInfo = function(cb) {
storage.get('feedback', cb);
if (!getStr) {
cb(null, null);
return;
}
var profile = Profile.fromString(getStr);
cb(null, profile);
});
};
root.storeFocusedWalletId = function(id, cb) {

File diff suppressed because one or more lines are too long

View file

@ -72,11 +72,19 @@ angular.module('copayApp.services').factory('txFormatService', function($filter,
var config = configService.getSync().wallet.settings;
var val = function() {
var v1 = parseFloat((rateService.toFiat(satoshis, config.alternativeIsoCode, coin)).toFixed(2));
v1 = $filter('formatFiatAmount')(v1);
var fiatAmount = rateService.toFiat(satoshis, config.alternativeIsoCode, coin);
var roundedStr = fiatAmount.toFixed(2);
var roundedNum = parseFloat(roundedStr);
var subcent = roundedNum === 0 && fiatAmount > 0;
var lessThanPrefix = '';
if (subcent) {
roundedNum = 0.01;
lessThanPrefix = '< ';
}
var v1 = $filter('formatFiatAmount')(roundedNum);
if (!v1) return null;
return v1 + ' ' + config.alternativeIsoCode;
return lessThanPrefix + v1 + ' ' + config.alternativeIsoCode;
};
// Async version

View file

@ -0,0 +1,68 @@
describe('txFormatService', function(){
var configServiceMock,
rateServiceMock,
txFormatService;
beforeEach(function(){
module('ngLodash');
module('bwcModule');
module('copayApp.filters');
module('copayApp.services');
configServiceMock = {
getSync: jasmine.createSpy()
};
rateServiceMock = {
isAvailable: jasmine.createSpy(),
toFiat: jasmine.createSpy()
};
module(function($provide) {
$provide.value('configService', configServiceMock);
$provide.value('rateService', rateServiceMock);
});
inject(function($injector){
txFormatService = $injector.get('txFormatService');
});
});
it('formatAlternativeStr 0.49 cents.', function() {
configServiceMock.getSync.and.returnValue({
wallet: {
settings: {
alternativeIsoCode: 'USD'
}
}
});
rateServiceMock.isAvailable.and.returnValue(true);
rateServiceMock.toFiat.and.returnValue(0.00499);
var formatted = txFormatService.formatAlternativeStr('bch', 123);
expect(formatted).toBe('< 0.01 USD');
});
it('formatAlternativeStr 0.5 cents.', function() {
configServiceMock.getSync.and.returnValue({
wallet: {
settings: {
alternativeIsoCode: 'USD'
}
}
});
rateServiceMock.isAvailable.and.returnValue(true);
rateServiceMock.toFiat.and.returnValue(0.005);
var formatted = txFormatService.formatAlternativeStr('bch', 123);
expect(formatted).toBe('0.01 USD');
});
});

View file

@ -10,6 +10,10 @@ angular.module('copayApp.services')
isoCode: 'en',
rateCode: 'USD'
}, {
name: 'català',
isoCode: 'ca',
rateCode: 'EUR'
},{
name: 'Čeština',
isoCode: 'cs',
rateCode: 'EUR'
@ -55,6 +59,10 @@ angular.module('copayApp.services')
name: 'Português',
isoCode: 'pt',
rateCode: 'EUR'
}, {
name: 'русский язык',
isoCode: 'ru',
rateCode: 'RUB'
}, {
name: '한국어',
isoCode: 'ko',

View file

@ -343,21 +343,19 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
if (err) return cb(err);
if (!txsFromServer.length)
return cb();
return cb(null, []);
var res = lodash.takeWhile(txsFromServer, function(tx) {
return tx.txid != endingTxid;
});
return cb(null, res, res.length >= limit);
return cb(null, txsFromServer);
});
};
var removeAndMarkSoftConfirmedTx = function(txs) {
return lodash.filter(txs, function(tx) {
if (tx.confirmations >= root.SOFT_CONFIRMATION_LIMIT)
return tx;
tx.recent = true;
var isConfirm = (tx.confirmations >= root.SOFT_CONFIRMATION_LIMIT);
if (!isConfirm) {
tx.recent = true;
}
return isConfirm;
});
}
@ -437,12 +435,14 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
var endingTxid = confirmedTxs[0] ? confirmedTxs[0].txid : null;
var endingTs = confirmedTxs[0] ? confirmedTxs[0].time : null;
$log.debug('Confirmed TXs. Got:' + confirmedTxs.length + '/' + txsFromLocal.length);
// First update
progressFn(txsFromLocal, 0);
wallet.completeHistory = txsFromLocal;
function getNewTxs(newTxs, skip, next) {
getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res, shouldContinue) {
getTxsFromServer(wallet, skip, endingTxid, requestLimit, function(err, res) {
if (err) {
$log.warn(bwcError.msg(err, 'Server Error')); //TODO
if (err instanceof errors.CONNECTION_ERROR || (err.message && err.message.match(/5../))) {
@ -454,7 +454,22 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim
return next(err);
}
newTxs = newTxs.concat(processNewTxs(wallet, lodash.compact(res)));
// Check if new txs are founds, if yes, lets investigate in the 50 next
// To be sure we are not missing txs by sorting (maybe a new tx is after the "endingTxid"
var newDiscoveredTxs = res.filter(function (x) {
return confirmedTxs.filter(function (confX) {
return confX.txid == x.txid;
}).length == 0;
});
$log.debug('Discovering TXs. Got:' + newDiscoveredTxs.length);
var shouldContinue = newDiscoveredTxs.length > 0;
// If no new tx, no need to check
if (shouldContinue) {
newTxs = newTxs.concat(processNewTxs(wallet, lodash.compact(newDiscoveredTxs)));
}
progressFn(newTxs.concat(txsFromLocal), newTxs.length);

View file

@ -16,6 +16,8 @@
&.button-primary,
&.button-secondary,
&.button-light,
&.button-white,
&.button-green,
&.button-assertive {
&.button-standard {
@extend %button-standard;
@ -33,6 +35,10 @@
}
}
@mixin button-shadow() {
box-shadow: 0 2px 11px 0 #C1C1C1;;
}
.button {
&.button-secondary {
@include button-style($v-button-secondary-bg, $v-button-secondary-border, $v-button-secondary-active-bg, $v-button-secondary-active-border, $v-button-secondary-color);
@ -47,7 +53,25 @@
}
.button {
border-radius: 6px;
&.button-full {
border-radius: 0;
display: block;
}
&-green {
@include button-style(#719561, #FFF, #606060, #FFF, #FFF);
@include button-clear(#FFF);
@include button-outline(#C1C1C1);
border: 0px;
@include button-shadow();
}
&-white {
@include button-style(#FFF, #C1C1C1, #C1C1C1, #FFF, #606060);
@include button-clear(#FFF);
@include button-outline(#C1C1C1);
@include button-shadow();
&.activated {
color: #FFF;
}
}
}

View file

@ -40,7 +40,7 @@
border-radius: $v-icon-border-radius;
width: 40px;
height: 40px;
box-shadow: $v-hovering-box-shadow;
box-shadow: 0px 0px 9px 0px rgba(0, 0, 0, 0.3);
background-repeat:no-repeat;
background-clip: padding-box;
background-size: 103%;

View file

@ -5,6 +5,7 @@
@import "icons";
@import "buttons";
@import "forms";
@import "qr";
@import "mixins/mixins";
@import "views/views";
@import "directives/directives";

21
src/sass/qr.scss Normal file
View file

@ -0,0 +1,21 @@
qrcode {
position: relative;
&.qr-overlay {
&::before {
content: "";
background-size: 100% 100%;
display: block;
left: 88px;
margin-top: 88px;
width: 44px;
height: 44px;
position:absolute;
}
&--bch::before {
background-image: url('../img/qr-overlay-bch.png');
}
&--btc::before {
background-image: url('../img/qr-overlay-btc.png');
}
}
}

View file

@ -33,8 +33,8 @@ $v-wallet-color-map: (
3: (color: #d0b136, name: 'Metallic Gold'),
4: (color: #9edd72, name: 'Feijoa'),
5: (color: #29bb9c, name: 'Shamrock'),
6: (color: #26B03C, name: 'Dollar Green'),
7: (color: #fab915, name: 'Observatory'),
6: (color: #eeb640, name: 'Light Orange'),
7: (color: #535353, name: 'Dark Grey'),
8: (color: #77dada, name: 'Turquoise Blue'),
9: (color: #4a90e2, name: 'Cornflower Blue'),
10: (color: #484ed3, name: 'Free Speech Blue'),

View file

@ -124,7 +124,6 @@
position: relative;
height: 70px;
border-color: $royal;
background-color: $royal;
padding-top: 20px;
margin-bottom: 50px;
text-align: center;

View file

@ -474,4 +474,10 @@
}
}
}
background: #494949;
ion-content {
margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */
}
}

View file

@ -1,5 +1,5 @@
#view-confirm {
background-color: #ffffff;
background-color: #494949;
@extend .deflash-blue;
.item-note {
float: none;
@ -30,4 +30,11 @@
.toggle {
cursor: pointer;
}
ion-content {
background-color: #ffffff;
}
slide-to-accept, slide-to-accept-success {
margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */
}
}

View file

@ -1,38 +0,0 @@
#rate-app {
background-color: #ffffff;
text-align: center;
.skip-rating {
color: $v-dark-gray;
position: absolute;
top: 5px;
right: 10px;
padding: 15px;
}
.icon-svg > img {
width: 80px;
height: 80px;
margin-top: 15px;
}
.feedback-title {
font-size: 20px;
font-weight: bold;
color: $v-dark-gray;
margin: 80px 50px 10px;
text-align: center;
}
.share-the-love-illustration {
width: 5rem;
margin: 1rem;
}
.subtitle {
padding: 10px 30px 20px 40px;
color: $v-mid-gray;
}
.rate-buttons {
bottom: 0;
width: 100%;
position: absolute;
background-color: $v-subtle-gray;
padding: 30px 0 15px;
}
}

View file

@ -1,18 +0,0 @@
#rate-card {
.item-heading {
font-weight: 700;
}
.row {
border: none;
}
.item-icon-right {
margin: 0;
}
.feedback-flow-button {
margin-bottom: 20px;
}
.icon-svg > img {
height: 1.8rem;
margin-bottom: 5px;
}
}

View file

@ -1,54 +0,0 @@
#send-feedback {
@extend .deflash-blue;
background-color: #ffffff;
.row {
border: none;
}
.skip {
color: rgba(255, 255, 255, 0.3);
}
.feedback-heading {
padding-top: 20px
}
.feedback-title {
padding-left: 10px;
font-size: 20px;
font-weight: bold;
color: $v-dark-gray;
}
.rating {
text-align: right;
padding-right: 15px;
}
.comment {
padding: 0 20px 20px;
font-size: 1rem;
line-height: 1.5em;
font-weight: 300;
color: $v-dark-gray;
}
.user-feedback {
border-top: 1px solid $v-subtle-gray;
border-bottom: 1px solid $v-subtle-gray;
padding: 20px;
width: 100%;
margin-bottom: 20px;
-webkit-appearance: none;
}
.send-feedback-star {
height: 1rem;
margin-left: 5px;
}
.form-fade-in {
opacity: 0;
animation-name: fadeIn;
animation-duration: .5s;
animation-fill-mode: forwards;
animation-timing-function: ease-in;
}
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}

View file

@ -8,6 +8,7 @@ click-to-accept {
.click-to-accept {
&__button.button.button-primary.button-standard {
border-radius: 0;
height: 100%;
max-width: 9999px;
width: 100%;

View file

@ -13,6 +13,9 @@ slide-to-accept {
}
.slide {
.button {
border-radius: 0;
}
&__listener {
height: 100%;
width: 100%;

View file

@ -86,6 +86,9 @@ slide-to-accept-success {
transition: transform $duration ease, opacity $duration ease;
transition-delay: 250ms;
margin-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
margin-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */
&.reveal {
-webkit-transform: translateY(0);
transform: translateY(0);

View file

@ -36,6 +36,11 @@
.amount-label{
line-height: 30px;
.amount{
font-size: 16px;
color: #9B9B9B;
font-family: "Roboto-Light";
}
.alternative {
font-size: 38px;
margin-bottom: .5rem;
@ -43,11 +48,6 @@
font-family: "Roboto-Light";
}
}
.alternative {
font-size: 16px;
font-family: "Roboto-Light";
color: #9B9B9B;
}
}
}
.item {

View file

@ -12,6 +12,11 @@ wallet-selector {
font-weight: bold;
padding-bottom: 10px;
border-bottom: 1px solid #EFEFEF;
.subtitle {
color: $v-mid-gray;
font-size: $font-size-small;
font-weight: 300;
}
.wallet-coin-logo {
vertical-align: middle;
margin-right: 5px;

View file

@ -1,6 +1,6 @@
#complete {
#share-app {
background-color: #fff;
.complete-layout {
.share-app-layout {
display: flex;
flex-direction: column;
height: 100%;
@ -22,17 +22,6 @@
width: 5rem;
margin: 1rem;
}
.send-feedback-illustration {
height: 16rem;
margin: 1rem;
}
.feedback-title {
font-size: 20px;
font-weight: bold;
color: $v-dark-gray;
margin: 20px 10px;
text-align: center;
}
.subtitle {
padding: 10px 30px 20px;
text-align: center;

View file

@ -59,6 +59,9 @@
}
}
&-banner {
svg {
margin: 40px auto 40px;
}
padding: 0;
&__img {
width: 100%;

View file

@ -1,12 +1,28 @@
#tab-send {
@extend .deflash-blue;
&-header{
height: 300px;
width: 100%;
}
&-contacts {
height: calc(100vh - 300px - 50px - 44px); /* screen size - button container - bottom-tab-menu - header top */
&.ios {
height: calc(100vh - 300px - 50px - 44px - 18px); // Remove the notification-bar height on iOS
}
overflow: scroll;
}
.input {
width: 100%;
input {
width: 100%;
height: auto;
}
&.item {
height: 55px;
height: 57px;
background: #FFF;
border: 1px #D9D9D9 solid;
&::placeholder {
color: #DCDCDC;
}
}
i {
&.left {
@ -19,45 +35,22 @@
}
}
}
.qr-scan-icon {
cursor: pointer;
cursor: hand;
border-left: 1px solid rgb(228, 228, 228);
padding-left: 10px;
}
.qr-icon {
line-height: 20px;
}
.zero-state-cta {
padding-bottom: 3vh;
left: 0;
}
.send-heading {
font-size: 14px;
font-weight: bold;
padding: 0 0 16px 0;
border: none;
}
.send-header-wrapper {
padding: 10px;
background-color: white;
box-shadow: 0px 5px 10px 0px #cccccc;
}
.search-wrapper {
.send-wrapper {
&:after {
display: block;
position: relative;
height: 1px;
background: #DEDEDE;
bottom: 0;
content: '';
margin: 10px 6px 0px;
}
padding: 18px 9px 9px 9px;
background-color: #f2f2f2;
border-radius: 3px;
border: none;
.svg#Bitcoin_Symbol {
width: 14px;
.st0 {
fill: #cccccc;
}
}
&.focus {
background: none;
.svg#Bitcoin_Symbol {
display: none;
}
.search-input {
padding-left: 30px;
&:focus::-webkit-input-placeholder {
@ -65,57 +58,88 @@
}
}
}
.buttons {
margin: auto;
margin-top: 18px;
.button {
&-clipboard-paste {
margin-left: 0;
.address {
display: none;
}
.icon {
background: url(../img/icon-clipboard-paste.svg);
width: 15px;
height: 19px;
display: inline-block;
margin-bottom: 4px;
}
&.contains-address, &.contains-content {
.address {
display: none;
}
background: #FAB915;
color: #FFF !important;
border: 0;
@include button-shadow();
.icon {
background: url(../img/icon-clipboard-paste-white.svg);
}
&.contains-address {
.address {
display: inline;
}
.non-address {
display: none;
}
}
}
}
span {
font-size: 14px;
}
img {
height: 16px;
width: auto;
margin: 2px 0 4px;
}
height: 60px;
line-height: 16px;
margin-right: 0px;
width: 95%;
max-width: none;
padding: 2px;
&-qr {
font-weight: bold;
max-width: none;
width: 100%;
height: 95px;
margin-top: 20px;
img {
vertical-align: middle;
margin-right: 12px;
width: 43px;
height: 43px;
}
span {
font-size: 19px;
}
}
}
}
}
.abs-v-center {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
.search-input {
background-color: transparent;
padding-left: 30px;
}
.separator-left {
border-left: 1px solid #d9d9df;
padding-left: 10px;
height: 70%;
}
.bitcoin-address {
border-top: none;
padding-bottom: .5rem;
@media(max-width: 480px) {
input {
font-size: 14px;
}
}
.icon {
line-height: 31px;
padding-top: 2px;
padding-bottom: 1px;
}
}
.show-more {
text-align: center;
padding: 20px;
font-size: 16px;
color: #387ef5;
font-weight: bold;
}
.sendTip {
padding-top: 5vh;
text-align: center;
& > .item-heading {
margin-top: 10px;
background: 0 none;
}
img {
content: $v-tab-send-selected-icon;
}
.item {
border-style: none;
}
& > .title {
font-size: 20px;
font-weight: bold;
color: $v-dark-gray;
margin: 20px 10px;
}
@ -123,34 +147,64 @@
font-size: 1rem;
line-height: 1.5em;
font-weight: 300;
color: $v-dark-gray;
color: #6F6F70;
margin: 20px 1em 2.5em;
}
.big-icon-svg{
.bg.green{
.big-icon-svg {
.bg.green {
padding: 0 10px;
box-shadow: none;
}
}
.buttons {
margin-top: 18px;
.button {
font-weight: bold;
font-size: 19px;
}
}
.button-first-contact img {
height: 19px;
width: 19px;
margin-right: 6px;
vertical-align: sub;
}
}
.item-heading {
line-height: 16px;
font-size: 14px;
font-weight: bold;
.subtitle {
color: #B5B2B2;
font-size: 12px;
font-weight: 300;
}
}
.list {
.item {
font-weight: 600;
p {
font-weight: normal;
}
&.item-icon-left {
padding-left: 64px;
}
color: #444;
border-top: none;
padding-top: 1.5rem;
padding-bottom: 1.5rem;
//border-top: none;
padding-top: 0.6rem;
padding-bottom: 0.6rem;;
.big-icon-svg {
left:5px;
& > .bg{
width:30px;
height:30px;
box-shadow: none;
}
left: 5px;
& > .bg {
width: 30px;
height: 30px;
box-shadow: none;
}
}
&:before {
display: block;
position: absolute;
width: 80%;
width: 100%;
height: 1px;
background: rgba(221, 221, 221, 0.3);
top: 0;
@ -163,7 +217,7 @@
&.item-heading {
&:before {
top: 99%;
width:100%;
width: 100%;
}
}
&:nth-child(2) {
@ -176,5 +230,40 @@
}
}
}
.scroll{height: 100%;}
.scroll {
height: 100%;
}
.card.contacts {
margin: 4px 4px 16px 4px;
border-radius: 6px;
box-shadow: 0px 2px 1px 0 #C1C1C1;
.gravatar {
border-radius: 30px;
height: 40px;
width: 40px;
}
}
///* iPhone 5/SE and other small screen devices */
@media only screen and (min-device-width : 320px) and (max-device-width : 568px) {
.send-wrapper .buttons .button-qr {
height: 60px;
span {
font-size: 16px;
}
}
#tab-send-header {
height: 270px;
}
#tab-send-contacts {
height: calc(100vh - 270px - 50px - 44px); /* screen size - button container - bottom-tab-menu - header top */
&.ios {
height: calc(100vh - 270px - 50px - 44px - 18px); // Remove the notification-bar height on iOS
}
}
}
}

View file

@ -43,6 +43,11 @@
.icon {
color: $v-mid-gray;
}
.subtitle {
color: $v-mid-gray;
font-size: $font-size-small;
font-weight: 300;
}
}
}
}
}

View file

@ -22,10 +22,7 @@
@import "wallet-backup-phrase";
@import "zero-state";
@import "onboarding/onboarding";
@import "feedback/rateCard";
@import "feedback/send";
@import "feedback/complete";
@import "feedback/rateApp";
@import "shareApp";
@import "includes/actionSheet";
@import "export";
@import "import";

View file

@ -131,6 +131,7 @@
.bp-content {
position: relative;
height: 100%;
height: calc(100% - env(safe-area-inset-bottom) * 2);
&.status-bar {
margin-top: 20px;
@ -157,6 +158,8 @@
padding-top: 0;
top: 0;
margin-bottom: 16px;
.scroll {
background: rgb(248, 248, 249);
min-height: 300px;

11
src/shim/shim.js Normal file
View file

@ -0,0 +1,11 @@
//---------------------------------------------------------------------
//
// Add components what are missing in old JavaScript Engine
//
//---------------------------------------------------------------------
if (!ArrayBuffer['isView']) {
ArrayBuffer.isView = function(a) {
return a !== null && typeof(a) === "object" && a['buffer'] instanceof ArrayBuffer;
};
}

Some files were not shown because too many files have changed in this diff Show more