diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index facf101c0fc8b3eaad26a124503e4bbd3185f8ca..f4310d78d856dfe59dd799cc552b75f685069c50 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,17 +1,51 @@ +# --------------------------------------------------------------- +# Global +# --------------------------------------------------------------- + +# default image +image: node:12 + +# stages (main steps of pipeline) stages: - #- build - #- alt_build - #- publish + - build + - alt_build + - deploy -fast-build: - stage: build - image: $CI_REGISTRY_IMAGE +# --------------------------------------------------------------- +# Global variables +# --------------------------------------------------------------- + +variables: + CI_BUILD_IMAGE: $CI_REGISTRY_IMAGE/build:develop + +# --------------------------------------------------------------- +# Jobs templates +# --------------------------------------------------------------- + + +.docker: + image: docker:latest + tags: [redshift] + services: + - docker:dind before_script: - - mv /customCache/node_modules ./ - - cp -rf /customCache/www ./ - - cp -rf /customCache/hooks ./ + - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} + #- docker login -u "duniterteam" -p "$DUNITERTEAM_PASSWD" + after_script: + - docker logout ${CI_REGISTRY} + #- docker logout + allow_failure: false + +# --------------------------------------------------------------- +# Build jobs +# --------------------------------------------------------------- + +.build: + stage: build + tags: [redshift] script: - - node ./node_modules/gulp/bin/gulp webBuild + - yarn install + - yarn run build:web after_script: - ls -la dist/web/ - du -csh dist/web/ @@ -20,51 +54,63 @@ fast-build: paths: - dist/web expire_in: 60 minutes + +build: + extends: .build + image: ${CI_BUILD_IMAGE} + before_script: + - mv /tmp/.build-cache/node_modules ./ only: - - master - - tags + - develop + failsafe-build: + extends: .build stage: alt_build when: on_failure - image: node:10 - script: - - yarn - - node ./node_modules/gulp/bin/gulp config --env default - - node ./node_modules/gulp/bin/gulp webBuild - artifacts: - untracked: true - paths: - - dist/web - expire_in: 60 minutes + before_script: + - yarn global add gulp only: - - master - - tags -docker-for-fast-build: + - develop + +docker:ci: + extends: .docker stage: alt_build when: on_failure allow_failure: true - tags: - - doppler-docker - image: docker:latest - services: - - docker:dind script: - - echo 'FROM node:10' > Dockerfile - - echo 'WORKDIR /customCache' >> Dockerfile + # Create the target directory + - mkdir -p dist/ci + - cd dist/ci + # Create the Dockerfile + - echo 'FROM node:12' > Dockerfile + - echo 'WORKDIR /tmp/.build-cache' >> Dockerfile - echo 'COPY ./ ./' >> Dockerfile - - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"`>/before.txt' >> Dockerfile - - echo 'RUN yarn' >> Dockerfile - - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"`>/after.txt' >> Dockerfile + # Store disk usage (before install) + - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"` > /tmp/before.txt' >> Dockerfile + - echo 'RUN du -s `find /tmp/.cache/yarn -maxdepth 1 | egrep -v "^\.$"` >> /tmp/before.txt' >> Dockerfile + # Install dependencies + - echo 'RUN yarn global add gulp web-ext @ionic/cli' >> Dockerfile + - echo 'RUN yarn install' >> Dockerfile + # Store disk usage (after install) + - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"` > /tmp/after.txt' >> Dockerfile + - echo 'RUN du -s `find /tmp/.cache/yarn -maxdepth 1 | egrep -v "^\.$"` >> /tmp/after.txt' >> Dockerfile + # Force docker to detect any changes + - echo "RUN diff /tmp/before.txt /tmp/after.txt || true" >> Dockerfile - echo 'WORKDIR /build' >> Dockerfile - - echo "RUN diff /before.txt /after.txt || true" >> Dockerfile - - docker login -u "gitlab-ci-token" -p "$CI_BUILD_TOKEN" $CI_REGISTRY - - docker build --pull -t "$CI_REGISTRY_IMAGE" . - - docker push "$CI_REGISTRY_IMAGE" + # Build and push the CI image + - docker build --no-cache -t ${CI_BUILD_IMAGE} . + - docker push ${CI_BUILD_IMAGE} + artifacts: + paths: + - dist/ci/Dockerfile + expire_in: 60 minutes +# --------------------------------------------------------------- +# Deploy jobs +# --------------------------------------------------------------- pages: - stage: publish - image: node:10 + stage: deploy variables: GIT_STRATEGY: none script: @@ -76,8 +122,9 @@ pages: - public only: - master + mirror: - stage: publish + stage: deploy image: liaohuqiu/rsync before_script: - eval $(ssh-agent -s) @@ -94,10 +141,8 @@ mirror: only: - master - -release-web: - stage: publish - image: node:10 +release: + stage: deploy variables: GIT_STRATEGY: none script: diff --git a/Dockerfile b/Dockerfile index f6dba3efd9f826c75603298d1712945637019a0b..e681ac5cebc73764f2e45e34ca2594cb62a52d26 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,18 @@ -FROM node:10-alpine +FROM node:12 LABEL maintainer="benoit [dot] lavenier [at] e-is [dot] pro" -LABEL version="1.6.3" +LABEL version="1.6.12" LABEL description="Cesium Wallet for Ğ1 libre currency" -ARG CESIUM_VER="1.6.3" +ARG CESIUM_VER="1.6.12" ENV DEBIAN_FRONTEND=noninteractive \ - NODE_VERSION=10.20.0 \ - NPM_VERSION=6.14.4 \ - YARN_VERSION=1.22.4 \ - IONIC_CLI_VERSION=6.6.0 \ - CORDOVA_VERSION=8.1.2 \ - GRADLE_VERSION=4.10.3 \ - GULP_VERSION=3.9.1 + NODE_VERSION=12.21.0 \ + NPM_VERSION=7.14.0 \ + YARN_VERSION=1.22.10 \ + IONIC_CLI_VERSION=6.16.3 \ + CORDOVA_VERSION=10.0.0 \ + GRADLE_VERSION=6.5.1 \ + GULP_VERSION=4.0.2 # Install basics RUN apk update && \ @@ -31,6 +31,8 @@ RUN yarn global add gulp@"$GULP_VERSION" @ionic/cli@"$IONIC_CLI_VERSION" # copy source tree COPY ./ ./ +RUN test -f package.json || git clone https://github.com/duniter/cesium.git && cd cesium + # Install project dependencies # Workaround need for node-sass (- )see https://github.com/yarnpkg/yarn/issues/4867) RUN yarn install --ignore-engines && \ diff --git a/README.md b/README.md index 6557a43f8c862d7e3453b4944e7fc5b929a6d6b5..ce1ca3c15bd6d2a0b4e9b6cf56ea4c1d2692d5fa 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Please visit th Cesium web site: [cesium.app](https://cesium.app) * Manual installation: download then install the `.apk` from your smartphone; * [Play Store](https://play.google.com/store/apps/details?id=fr.duniter.cesium); - iOS - * Coming soon...; + * [App Store](https://apps.apple.com/us/app/cesium-%C4%9F1/id1471028018); @@ -58,8 +58,10 @@ A [development tutorial](doc/fr/development_tutorial-01.md) (in French) is also ## Donate -To help developers with donation, use the [Cesium Team Ğ1 account](https://g1.duniter.fr#/app/wot/CitdnuQgZ45tNFCagay7Wh12gwwHM8VLej1sWmfHWnQX/) (public key: `CitdnuQgZ45tNFCagay7Wh12gwwHM8VLej1sWmfHWnQX`) +To help developers with donation, use the [Cesium Team Ğ1 account](https://demo.cesium.app#/app/wot/CitdnuQgZ45tNFCagay7Wh12gwwHM8VLej1sWmfHWnQX/) (public key: `CitdnuQgZ45tNFCagay7Wh12gwwHM8VLej1sWmfHWnQX`) ## License -This software is distributed under [GNU AGPL-3.0](https://raw.github.com/duniter/cesium/master/LICENSE). \ No newline at end of file +This software is distributed under [GNU AGPL-3.0](https://raw.github.com/duniter/cesium/master/LICENSE). + +Please read also our [privacy policy](./doc/privacy_policy.md). \ No newline at end of file diff --git a/config.xml b/config.xml index 8f1cacd27732fbadc794fdd0be7fd5af1235ba64..b49d11205c3eab999f37824beb650f9a880bc8b3 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ <?xml version='1.0' encoding='utf-8'?> -<widget android-versionCode="106120" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.6.12" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0"> +<widget android-versionCode="10700" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.7.0-rc1" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0"> <name>Cesium</name> <description> An simple App for Duniter wallet diff --git a/dist/desktop b/dist/desktop index 366b85e16a589746f53ad260a02abdaa346a1212..6893ddeb3aac99329524151029f44e4cf821502f 160000 --- a/dist/desktop +++ b/dist/desktop @@ -1 +1 @@ -Subproject commit 366b85e16a589746f53ad260a02abdaa346a1212 +Subproject commit 6893ddeb3aac99329524151029f44e4cf821502f diff --git a/doc/build_web_extension.md b/doc/build_web_extension.md index f1f62b6e2f7b9444f6931385f38212892ee9f05b..5fe85e0baf3db1eca69efcf72fb50ce536980d3e 100644 --- a/doc/build_web_extension.md +++ b/doc/build_web_extension.md @@ -13,9 +13,10 @@ After that you should be able to start the application using `npm start`or `yarn ## Build the web extension -- To create a uncompressed extension, use : +- To create an uncompressed extension, use : ```bash cd cesium + gulp build gulp webExtCompile --release ``` @@ -24,6 +25,7 @@ After that you should be able to start the application using `npm start`or `yarn - To create a portable and compressed ZIP extension : ```bash cd cesium + gulp build gulp webExtBuild --release ``` diff --git a/install.sh b/install.sh index 960563ee9bcd9d72037a0d594d0810cf14e296c0..83f95a4df15394155c7cfec890be9af991f394c8 100755 --- a/install.sh +++ b/install.sh @@ -15,7 +15,7 @@ if [ "_$CESIUM_DIR" = "_" ]; then fi latest_version() { - echo "v1.6.12" #lastest + echo "v1.7.0-rc1" #lastest } api_release_url() { diff --git a/package.json b/package.json index 7cb527ff0f8d3c6e13a864b19a750c50175cf740..8121a86ab3bf5cea1f26120349e0b967d775a5d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cesium", - "version": "1.6.12", + "version": "1.7.0-rc1", "description": "Cesium Wallet for G1 libre currency", "author": "Benoit Lavenier <benoit.lavenier@e-is.pro>", "license": "AGPL-3.0", @@ -10,8 +10,9 @@ "url": "git@git.duniter.org:clients/cesium/cesium.git" }, "scripts": { - "clean": "clean webClean webExtClean && trash dist/desktop/**/*.deb platforms/android/**/*.apk", + "clean": "gulp clean webClean webExtClean && rm -rf dist/web dist/android && rm -f desktop/**/cesium-*.deb desktop/**/cesium-*.exe platforms/android/**/*.apk", "postinstall": "node scripts/node/postinstall.js", + "gulp": "gulp", "lint": "gulp lint", "install-platforms": "ionic cordova prepare", "start": "ionic serve", @@ -84,6 +85,7 @@ "@bower_components/socket.io-client": "socketio/socket.io-client#^1.7.4", "@bower_components/ui-leaflet": "angular-ui/ui-leaflet#v2.0.0", "@bower_components/underscore": "jashkenas/underscore#1.10.2", + "@bower_components/jdenticon": "dmester/jdenticon#3.1.0", "through2": "^4.0.2", "uuid": "3.2.1" }, @@ -221,4 +223,4 @@ "node": ">= 12.18.3", "yarn": ">= 1.22.0" } -} \ No newline at end of file +} diff --git a/resources/web-ext/manifest.json b/resources/web-ext/manifest.json index f08c71c28278e834b9c12f3fa41d5487240c6fdb..05cf3aa863349963df8897b9d7872c0c6f6fefd4 100644 --- a/resources/web-ext/manifest.json +++ b/resources/web-ext/manifest.json @@ -1,7 +1,7 @@ { "name": "Cesium", "short_name": "Cesium", - "version": "1.6.12", + "version": "1.7.0-rc1", "description": "Manage your Duniter Wallet on a libre currency, like Ğ1", "background": { "scripts": ["background.js"] diff --git a/scripts/release-desktop.sh b/scripts/release-desktop.sh index 1bdd443fdf43a510c21c90483624214aed8cf002..2b5732a435fb4c765cdb9b8e59b78160fbaea26a 100755 --- a/scripts/release-desktop.sh +++ b/scripts/release-desktop.sh @@ -22,7 +22,7 @@ then fi ### Get version to release -current=$(grep -P "version\": \"\d+.\d+.\d+(\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(\w*)") +current=$(grep -P "version\": \"\d+.\d+.\d+(-?\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(-?\w*)") if [[ "_$current" == "_" ]]; then echo "Unable to read the current version in 'package.json'. Please check version format is: x.y.z (x and y should be an integer)." exit 1; diff --git a/scripts/release-to-github.sh b/scripts/release-to-github.sh index 4cc28e2c1b7ed09f86403b6732cefd0ea4bc1b41..16fa1d61f9f4adcee4468bd98fb6a68de0e9d439 100755 --- a/scripts/release-to-github.sh +++ b/scripts/release-to-github.sh @@ -20,7 +20,7 @@ then fi ### Get version to release -current=$(grep -P "version\": \"\d+.\d+.\d+(\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(\w*)") +current=$(grep -P "version\": \"\d+.\d+.\d+(-?\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(-?\w*)") if [[ "_$current" == "_" ]]; then echo "Unable to read the current version in 'package.json'. Please check version format is: x.y.z (x and y should be an integer)." exit 1; diff --git a/scss/ionic.app.scss b/scss/ionic.app.scss index f031163381ac33b7e26a159959b536c8016571aa..c26db8b3bfe2597c80dac320fbfb701c6e6ecf82 100644 --- a/scss/ionic.app.scss +++ b/scss/ionic.app.scss @@ -2419,6 +2419,10 @@ body.demo { height: 204px; } +.popover.popover-login-methods.auth.scan { + height: 252px; +} + @media (max-width: $screen-xs-max) { .popover.popover-login-methods { height: 256px; diff --git a/www/i18n/locale-ca.json b/www/i18n/locale-ca.json index 2f69ab375545b18f5deb8ee34aaaa086f2233373..8220b40206f790020b0ff4a528c625dac07162fb 100644 --- a/www/i18n/locale-ca.json +++ b/www/i18n/locale-ca.json @@ -12,17 +12,26 @@ "BTN_SEND": "Envia", "BTN_SEND_MONEY": "Fes un pagament", "BTN_SEND_MONEY_SHORT": "Pagament", +<<<<<<< HEAD "BTN_SAVE": "Guarda", "BTN_YES_SAVE": "Sí, guarda", "BTN_YES_CONTINUE": "Sí, continua", "BTN_SHOW": "Mostra", "BTN_SHOW_PUBKEY": "Mostra la clau", +======= + "BTN_SAVE": "Desa", + "BTN_YES_SAVE": "Sí, desa", + "BTN_YES_CONTINUE": "Sí, continua", + "BTN_SHOW": "Mira", + "BTN_SHOW_PUBKEY": "Mira la clau", +>>>>>>> upstream/master "BTN_RELATIVE_UNIT": "Mostra els imports en DU", "BTN_BACK": "Anterior", "BTN_NEXT": "Següent", "BTN_IMPORT": "Importa", "BTN_CANCEL": "Cancel·la", "BTN_CLOSE": "Tanca", +<<<<<<< HEAD "BTN_LATER": "Després", "BTN_LOGIN": "Connecta't", "BTN_LOGOUT": "Desconnecta't", @@ -34,6 +43,19 @@ "BTN_SEARCH": "Busca", "BTN_REFRESH": "Actualitza", "BTN_RETRY": "Torna-ho a provar", +======= + "BTN_LATER": "Més tard", + "BTN_LOGIN": "Connectar-se", + "BTN_LOGOUT": "Desconnexió", + "BTN_ADD_ACCOUNT": "Compte cou", + "BTN_SHARE": "Comparteix", + "BTN_EDIT": "Modifica", + "BTN_DELETE": "Supreix", + "BTN_ADD": "Afegeix", + "BTN_SEARCH": "Busca", + "BTN_REFRESH": "Actualitza", + "BTN_RETRY": "Comença de bell nou", +>>>>>>> upstream/master "BTN_START": "Comença", "BTN_CONTINUE": "Continua", "BTN_CREATE": "Crea", @@ -42,6 +64,7 @@ "BTN_HELP_TOUR": "Visita guiada", "BTN_HELP_TOUR_SCREEN": "Explica'm aquesta pantalla", "BTN_DOWNLOAD": "Descarrega", +<<<<<<< HEAD "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descarrega l'historial del compte", "BTN_MODIFY": "Modifica", "CHOOSE_FILE": "Arrossegui el fitxer<br/>o cliqui per seleccionar-lo", @@ -54,6 +77,20 @@ "FROM": "De", "TO": "A", "COPY": "Còpia", +======= + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descarrega l'històric del compte", + "BTN_MODIFY": "Modifica", + "CHOOSE_FILE": "Arrassegueu el fitxer<br/>o cliqui'l per a seleccionar-lo", + "DAYS": "Dies", + "NO_ACCOUNT_QUESTION": "Encara no sou membre? Faci's un compte!", + "SEARCH_NO_RESULT": "No s'ha trobat res", + "LOADING": "Espereu si us plau...", + "LOADING_WAIT": "Espereu si us plau...<br/><small>(en espera de tenir un node disponible)</small>", + "SEARCHING": "Cerca en procés...", + "FROM": "De", + "TO": "A", + "COPY": "Copia", +>>>>>>> upstream/master "LANGUAGE": "Idioma", "UNIVERSAL_DIVIDEND": "Dividend universal", "UD": "DU", @@ -62,23 +99,40 @@ "DATE_SHORT_PATTERN": "DD/MM/YY", "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", "EMPTY_PARENTHESIS": "(buit)", +<<<<<<< HEAD "UID": "Renom", +======= + "UID": "Pseudònim", +>>>>>>> upstream/master "ENABLE": "Activat", "DISABLE": "Desactivat", "RESULTS_LIST": "Resultats:", "RESULTS_COUNT": "{{count}} resultats", +<<<<<<< HEAD "EXECUTION_TIME": "executat en {{duration|formatDurationMs}}", "SHOW_VALUES": "Mostra la contrasenya", +======= + "EXECUTION_TIME": "executant en {{duration|formatDurationMs}}", + "SHOW_VALUES": "Mostra les contrasenyes", +>>>>>>> upstream/master "POPOVER_ACTIONS_TITLE": "Opcions", "POPOVER_FILTER_TITLE": "Filtres", "SHOW_MORE": "Mostra'n més", "SHOW_MORE_COUNT": "(límit actual {{limit}})", "POPOVER_SHARE": { +<<<<<<< HEAD "TITLE": "Compartir", "SHARE_ON_TWITTER": "Compartir a Twitter", "SHARE_ON_FACEBOOK": "Compartir a Facebook", "SHARE_ON_DIASPORA": "Compartir a Diaspora*", "SHARE_ON_GOOGLEPLUS": "Compartir a Google+" +======= + "TITLE": "Comparteix", + "SHARE_ON_TWITTER": "Comparteix a Twitter", + "SHARE_ON_FACEBOOK": "Comparteix a Facebook", + "SHARE_ON_DIASPORA": "Comparteix a Diaspora*", + "SHARE_ON_GOOGLEPLUS": "Comparteix a Google+" +>>>>>>> upstream/master }, "FILE": { "DATE" : "Data:", @@ -100,6 +154,7 @@ "WALLETS": "Moneders", "SETTINGS": "Ajustos", "NETWORK": "Xarxa", +<<<<<<< HEAD "TRANSACTIONS": "Moviments" }, "ABOUT": { @@ -155,6 +210,63 @@ "KEEP_AUTH": "Caducidad de la autenticación", "KEEP_AUTH_SHORT": "Caducidad", "KEEP_AUTH_HELP": "Defina cuándo expira su sesión", +======= + "TRANSACTIONS": "Transaccions" + }, + "ABOUT": { + "BTN_OPEN_DEV_WINDOW": "Obriu la finestra de depuració", + "TITLE": "A propòsit de", + "LICENSE": "Programari <b>lliure</b> (llicència GNU AGPLv3).", + "LATEST_RELEASE": "Existeix una <b>versió més nova</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)", + "PLEASE_UPDATE": "Si us plau feu l'actualització {{'COMMON.APP_NAME' | translate}} (última versió: <b>v{{version}}</b>)", + "CODE": "Codi font:", + "OFFICIAL_WEB_SITE": "Web oficial:", + "DEVELOPERS": "Desenvolupat per:", + "FORUM": "Fòrum:", + "PLEASE_REPORT_ISSUE": "Si us plau, informeu-nos de les anomalies que trobeu", + "REPORT_ISSUE": "Informeu d'un problema" + }, + "HOME": { + "FEED_SOURCE": "Font", + "READ_MORE": "Llegiu més", + "SHOW_ALL_FEED": "Veure tot", + "TITLE": "Cesium", + "WELCOME": "Benvingut/da a l'aplicació Cesium!", + "MESSAGE": "Rebeu i envieu moneda lliure {{currency|abbreviate}} fàcilment", + "BTN_CURRENCY": "Exploreu la moneda", + "BTN_ABOUT": "A propòsit de", + "BTN_HELP": "Ajuda en línea", + "REPORT_ISSUE": "Informeu d'una anomalia", + "NOT_YOUR_ACCOUNT_QUESTION": "Aquest compte <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}} no és vostre</b>?", + "BTN_CHANGE_ACCOUNT": "Desconnecta aquest compte", + "CONNECTION_ERROR": "Node <b>{{server}}</b> inabastable o adreça invàlida.<br/><br/>Comproveu bé la vostra connexió a Internet, o el node Duniter <a class=\"positive\" ng-click=\"doQuickFix('settings')\">als ajustos</a>." + }, + "SETTINGS": { + "TITLE": "Ajustos", + "DISPLAY_DIVIDER": "Visualització", + "STORAGE_DIVIDER": "Emmagatzematge", + "NETWORK_SETTINGS": "Xarxa", + "PEER": "Adreça del node Duniter", + "PEER_CHANGED_TEMPORARY": "Adreça usada temporalment", + "PEER_SHORT": "Node Duniter", + "PERSIST_CACHE": "Conserva les dades de navegació (experimental)", + "PERSIST_CACHE_HELP": "Permet una navegació més ràpida, conservant localment les dades rebudes, per fer servir d'una sessió a una altra.", + "USE_LOCAL_STORAGE": "Activa l'emmagatzematge local", + "USE_LOCAL_STORAGE_HELP": "Permet conservar els vostres ajustos", + "WALLETS_SETTINGS": "Els meus moneders", + "USE_WALLETS_ENCRYPTION": "Xifra el llistat", + "USE_WALLETS_ENCRYPTION_HELP": "Permet protegir el listat dels vostres moneders (mitjançant xifrat), exigint una autenticació per accedir-hi.", + "ENABLE_HELPTIP": "Activa l'ajuda contextual", + "ENABLE_UI_EFFECTS": "Activa els efectes visuals", + "HISTORY_SETTINGS": "Transaccions del compte", + "DISPLAY_UD_HISTORY": "Mostra els DU creats", + "TX_HISTORY_AUTO_REFRESH": "Activa l'actualització automàtica", + "TX_HISTORY_AUTO_REFRESH_HELP": "Actualitza el saldo i les transaccions automàticament, amb cada bloc nou.", + "AUTHENTICATION_SETTINGS": "Autenticació", + "KEEP_AUTH": "Caducitat de l'autenticació", + "KEEP_AUTH_SHORT": "Caducitat", + "KEEP_AUTH_HELP": "Defineixi quan expira la seva sessió", +>>>>>>> upstream/master "KEEP_AUTH_OPTION": { "NEVER": "Después de cada operación", "SECONDS": "Después de {{value}} segundos de inactividad", diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json index f156db794b5ed4e9510d98c95081faf17fed7ced..e9ddd3a84dea60b2b2d74721028d3332360ed07a 100644 --- a/www/i18n/locale-en-GB.json +++ b/www/i18n/locale-en-GB.json @@ -154,6 +154,7 @@ "ENABLE_HELPTIP": "Enable contextual help tips", "DISABLE_HELPTIP": "Disable contextual help tips", "ENABLE_UI_EFFECTS": "Enable visual effects", + "ENABLE_UI_EFFECTS_HELP": "Transition between pages, animation of list", "HISTORY_SETTINGS": "Account operations", "DISPLAY_UD_HISTORY": "Display produced dividends?", "TX_HISTORY_AUTO_REFRESH": "Enable automatic refresh?", @@ -528,10 +529,10 @@ "SELECT_ACCOUNT_TYPE": "Choose the type of account to create:", "MEMBER_ACCOUNT": "Member account", "MEMBER_ACCOUNT_TITLE": "Create a member account", - "MEMBER_ACCOUNT_HELP": "If you are not yet registered as an individual (one account possible per individual).", + "MEMBER_ACCOUNT_HELP": "You know enough about libre money and want to participate in its production?<br/>As an individual, you can create your member account (only one per individual). This works like a simple wallet account, but also allows you to co-produce the money, by <b>receiving for each {{parameters.dt|formatPeriod}} a universal dividend</b>: it's then up to you to put to good use!", "WALLET_ACCOUNT": "Simple wallet", "WALLET_ACCOUNT_TITLE": "Create a wallet", - "WALLET_ACCOUNT_HELP": "If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.", + "WALLET_ACCOUNT_HELP": "Are you <b>new to libre money</b>? You need an additional account?<br/>This type of account will suit you. Although it does not co-produce the money (unlike a member account - see below), you will be able to receive and send payments there, as soon as registration is complete.<br/>If necessary, you can convert it into a member account later.", "SALT_WARNING": "Choose a secret identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!", "PASSWORD_WARNING": "Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!", "PSEUDO_WARNING": "Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>", @@ -805,6 +806,7 @@ "EMPTY_TX_HISTORY": "No operations to export" }, "CONFIRM": { + "CAN_CONTINUE": "<b>Are you sure</b> you want to continue?", "POPUP_TITLE": "<b>Confirmation</b>", "POPUP_WARNING_TITLE": "<b>Warning</b>", "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Security warning</b>", diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json index 2b8e0e7782cfc08b1e1275d9b4dd123615474bbf..8e328acf2bd937d49e138a4bf18e1a28ac240c4e 100644 --- a/www/i18n/locale-en.json +++ b/www/i18n/locale-en.json @@ -154,6 +154,7 @@ "ENABLE_HELPTIP": "Enable contextual help tips", "DISABLE_HELPTIP": "Disable contextual help tips", "ENABLE_UI_EFFECTS": "Enable visual effects", + "ENABLE_UI_EFFECTS_HELP": "Transition between pages, animation of list", "HISTORY_SETTINGS": "Account operations", "DISPLAY_UD_HISTORY": "Display produced dividends?", "TX_HISTORY_AUTO_REFRESH": "Enable automatic refresh?", @@ -528,10 +529,10 @@ "SELECT_ACCOUNT_TYPE": "Choose the type of account to create:", "MEMBER_ACCOUNT": "Member account", "MEMBER_ACCOUNT_TITLE": "Create a member account", - "MEMBER_ACCOUNT_HELP": "If you are not yet registered as an individual (one account possible per individual).", + "MEMBER_ACCOUNT_HELP": "You know enough about libre money and want to participate in its production?<br/>As an individual, you can create your member account (only one per individual). This works like a simple wallet account, but also allows you to co-produce the money, by <b>receiving for each {{parameters.dt|formatPeriod}} a universal dividend</b>: it's then up to you to put to good use!", "WALLET_ACCOUNT": "Simple wallet", "WALLET_ACCOUNT_TITLE": "Create a wallet", - "WALLET_ACCOUNT_HELP": "If you represent a company, association, etc. or simply need an additional wallet. No universal dividend will be created by this account.", + "WALLET_ACCOUNT_HELP": "Are you <b>new to libre money</b>? You need an additional account?<br/>This type of account will suit you. Although it does not co-produce the money (unlike a member account - see below), you will be able to receive and send payments there, as soon as registration is complete.<br/>If necessary, you can convert it into a member account later.", "SALT_WARNING": "Choose a secret identifier.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this identifier</b>.<br/>If lost, there are no means to retrieve it!", "PASSWORD_WARNING": "Choose a password.<br/>You need it for each connection to this account.<br/><br/><b>Make sure to remember this password</b>.<br/>If lost, there are no means to retrieve it!", "PSEUDO_WARNING": "Choose a pseudonym.<br/>It may be used by other people to find you more easily.<br/><br/>.Use of <b>commas, spaces and accents</b> is not allowed.<br/><div class='hidden-xs'><br/>Example: <span class='gray'>JohnDalton, JackieChan, etc.</span>", @@ -805,6 +806,7 @@ "EMPTY_TX_HISTORY": "No operations to export" }, "CONFIRM": { + "CAN_CONTINUE": "<b>Are you sure</b> you want to continue?", "POPUP_TITLE": "<b>Confirmation</b>", "POPUP_WARNING_TITLE": "<b>Warning</b>", "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Security warning</b>", diff --git a/www/i18n/locale-eo-EO.json b/www/i18n/locale-eo-EO.json index bf0b2cd252d4031a064f22eaaf122a023c719d23..f819ccd635cf9409e411ba4058e90d39148bd1c9 100644 --- a/www/i18n/locale-eo-EO.json +++ b/www/i18n/locale-eo-EO.json @@ -805,6 +805,7 @@ "EMPTY_TX_HISTORY": "Neniu spezo elportota" }, "CONFIRM": { + "CAN_CONTINUE": "<b>Ĉu vi certas</b>, ke vi volas daŭrigi?", "POPUP_TITLE": "<b>Konfirmo</b>", "POPUP_WARNING_TITLE": "<b>Averto</b>", "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Averto pri sekureco</b>", diff --git a/www/i18n/locale-es-ES.json b/www/i18n/locale-es-ES.json index 4f692577b2638b319f1299e2c192b4a11e2f8f91..3fbcf2e130b27460da69179934693d054cfdf36c 100644 --- a/www/i18n/locale-es-ES.json +++ b/www/i18n/locale-es-ES.json @@ -890,6 +890,7 @@ "EMPTY_TX_HISTORY": "Ninguna operación a exportar" }, "CONFIRM": { + "CAN_CONTINUE": "<b>¿Desea</b> continuar?", "EXIT_APP": "¿ Cerrar la aplicación ?", "FULLSCREEN": "¿ Mostrar la aplicación en pantalla completa ?", "ISSUE_524_SEND_LOG": "La transacción ha sido rechazada a causa de una anomalía conocida (ticket #524) pero todavía <b>no replicable</b>.<br/><br/>Para ayudar a los/as desarrolladores/as a corregir este error, ¿ <b>acepta el envío de los logs(trazas del programa)</b> ?<br/><small>(ningún dato confidencia será enviado)</small>.", diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json index 6e4086281f0628b60e30d0b9a3474a736598e177..8622064c4589fffe14d56ca9d8c5243757c5bc7f 100644 --- a/www/i18n/locale-fr-FR.json +++ b/www/i18n/locale-fr-FR.json @@ -151,9 +151,10 @@ "WALLETS_SETTINGS": "Mes portefeuilles", "USE_WALLETS_ENCRYPTION": "Sécuriser la liste ?", "USE_WALLETS_ENCRYPTION_HELP": "Permet de sécuriser la liste de vos portefeuilles (par chiffrement), en exigeant une authentification pour y accéder.", - "ENABLE_HELPTIP": "Activer les bulles d'aide contextuelles", + "ENABLE_HELPTIP": "Activer les bulles d'aide contextuelles ?", "DISABLE_HELPTIP": "Désactiver les bulles d'aide contextuelles", - "ENABLE_UI_EFFECTS": "Activer les effets visuels", + "ENABLE_UI_EFFECTS": "Activer les effets visuels ?", + "ENABLE_UI_EFFECTS_HELP": "Transition entre les pages, animation des listes, etc.", "HISTORY_SETTINGS": "Mes opérations", "DISPLAY_UD_HISTORY": "Afficher les dividendes produits ?", "TX_HISTORY_AUTO_REFRESH": "Rafraîchir automatiquement", @@ -528,10 +529,10 @@ "SELECT_ACCOUNT_TYPE": "Choisissez le type de compte à créer :", "MEMBER_ACCOUNT": "Compte membre", "MEMBER_ACCOUNT_TITLE": "Création d'un compte membre", - "MEMBER_ACCOUNT_HELP": "Si vous n'êtes pas encore inscrit en tant qu'individu (un seul compte possible par individu). Ce compte permet de co-produire la monnaie, en recevant un <b>dividende universel</b> chaque {{parameters.dt|formatPeriod}}.", - "WALLET_ACCOUNT": "Simple portefeuille", + "MEMBER_ACCOUNT_HELP": "Vous connaissez suffisamment la monnaie libre et vous voulez participer à sa création ?<br/>En tant qu'individu, vous pouvez créer votre compte membre (un seul par individu). Celui-ci fonctionne comme un compte simple portefeuille, mais permet en plus de co-produire la monnaie, en <b>recevant chaque {{parameters.dt|formatPeriod}} un dividende universel</b> : à vous ensuite d'en faire bon usage !", + "WALLET_ACCOUNT": "Compte simple portefeuille", "WALLET_ACCOUNT_TITLE": "Création d'un portefeuille", - "WALLET_ACCOUNT_HELP": "Pour tous les autres cas, par exemple si vous avez besoin d'un compte supplémentaire.<br/>Aucun dividende universel ne sera créé par ce compte.", + "WALLET_ACCOUNT_HELP": "Vous <b>découvrez la monnaie libre</b> ? Vous avez besoin d'un compte supplémentaire ?<br/>Ce type de compte vous conviendra. Bien qu'il ne co-produise la monnaie (contrairement à un compte membre - voir ci-dessous), vous pourrez y recevoir et envoyer des paiements, dès la fin de l'inscription.<br/>Si besoin, vous pourrez le transformer en compte membre ultérieurement.", "SALT_WARNING": "Choisissez votre identifiant secret.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez le bien</b> : en cas de perte, plus personne ne pourra accéder à votre compte !", "PASSWORD_WARNING": "Choisissez un mot de passe.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez bien ce mot de passe</b : en cas de perte, plus personne ne pourra accéder à votre compte !", "PSEUDO_WARNING": "Choisissez un pseudonyme.<br/>Il sert aux autres membres, pour vous identifier plus facilement.<div class='hidden-xs'><br/>Il <b>ne pourra pas être modifié</b>, sans refaire un compte.</div><br/><br/>Il ne doit contenir <b>ni espace, ni de caractère accentué</b>.<div class='hidden-xs'><br/>Exemple : <span class='gray'>SophieDupond, MarcelChemin, etc.</span>", @@ -590,8 +591,8 @@ "ADD_QUESTION": "Ajouter une question personnalisée", "BTN_CLEAN": "Vider", "BTN_RESET": "Réinitialiser", - "DOWNLOAD_REVOKE": "Sauvegarder mon fichier de révocation", - "DOWNLOAD_REVOKE_HELP": "Disposer d'un fichier de révocation est important, par exemple en cas de perte de vos identifiants. Il vous permet de <b>sortir ce compte de la toile de confiance</b>, en redevenant ainsi un simple portefeuille.", + "DOWNLOAD_REVOKE": "Sauvegarder mon fichier de révocation (uniquement sur ordinateur)", + "DOWNLOAD_REVOKE_HELP": "Disposer d'un fichier de révocation est important, par exemple en cas de perte de vos identifiants. Il vous permet de <b>sortir ce compte de la toile de confiance</b>, en redevenant ainsi un simple portefeuille. Ne fonctionne pas sur smartphone.", "GENERATE_KEYFILE": "Générer mon fichier de trousseau...", "GENERATE_KEYFILE_HELP": "Génère un fichier permettant de vous authentifier sans saisir vos identifiants.<br/><b>Attention :</b> ce fichier contiendra votre trousseau de compte (clefs publique et secrète) ; il est donc très important de le mettre en lieu sûr !", "KEYFILE_FILENAME": "trousseau-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey", @@ -805,6 +806,7 @@ "EMPTY_TX_HISTORY": "Aucune opération à exporter" }, "CONFIRM": { + "CAN_CONTINUE": "<b>Êtes-vous sûr</b> de vouloir continuer ?", "POPUP_TITLE": "<b>Confirmation</b>", "POPUP_WARNING_TITLE": "<b>Avertissement</b>", "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Avertissement de sécurité</b>", diff --git a/www/i18n/locale-it-IT.json b/www/i18n/locale-it-IT.json index 13ab1f37cb47592312a5045a2be2a5be2a621200..8533a2bbfc2426823ecb18f7d1d5e97b89bf0495 100644 --- a/www/i18n/locale-it-IT.json +++ b/www/i18n/locale-it-IT.json @@ -1,935 +1,1025 @@ { - "COMMON": { - "APP_NAME": "Cesium", - "APP_VERSION": "v{{version}}", - "APP_BUILD": "build {{build}}", - "PUBKEY": "Chiave privata", - "MEMBER": "Membro", - "BLOCK" : "Blocco", - "BTN_OK": "OK", - "BTN_YES": "Si", - "BTN_NO": "No", - "BTN_SEND": "Inviare", - "BTN_SEND_MONEY": "Trasferire soldi", - "BTN_SEND_MONEY_SHORT": "Trasferire", - "BTN_SAVE": "Salvare", - "BTN_YES_SAVE": "Si, salvare", - "BTN_YES_CONTINUE": "Si, continuare", - "BTN_SHOW": "Mostrare", - "BTN_SHOW_PUBKEY": "Mostrare chiave pubblica", - "BTN_RELATIVE_UNIT": "Mostra importi in DU?", - "BTN_BACK": "Indietro", - "BTN_NEXT": "Avanti", - "BTN_IMPORT": "Importazione", - "BTN_CANCEL": "Cancellare", - "BTN_CLOSE": "Chiudere", - "BTN_LATER": "Più tardi", - "BTN_LOGIN": "Accedi", - "BTN_LOGOUT": "Log out", - "BTN_ADD_ACCOUNT": "Nuovo conto", - "BTN_SHARE": "Condividere", - "BTN_EDIT": "Modificare", - "BTN_DELETE": "Eliminare", - "BTN_ADD": "Aggiungere", - "BTN_SEARCH": "Cercare", - "BTN_REFRESH": "Aggiornare", - "BTN_RETRY": "Riprovare", - "BTN_START": "Iniziare", - "BTN_CONTINUE": "Continuare", - "BTN_CREATE": "Creare", - "BTN_UNDERSTOOD": "Ho capito", - "BTN_OPTIONS": "Opzioni", - "BTN_HELP_TOUR": "Mostrami le funzionalità", - "BTN_HELP_TOUR_SCREEN": "Scoprire questo schermo", - "BTN_DOWNLOAD": "Scaricare", - "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Scaricare estratto conto", - "BTN_MODIFY": "Modificare", - "CHOOSE_FILE": "Trascini un file <br/>o cliccare per selezionare", - "DAYS": "giorni", - "NO_ACCOUNT_QUESTION": "Non sei ancora membro? Registrati subito!", - "SEARCH_NO_RESULT": "Nessun risultato trovato", - "LOADING": "Caricando...", - "LOADING_WAIT": "Caricando...<br/><small>(Cesium interroga dal nodo peer Duniter)</small>", - "SEARCHING": "Cercando...", - "FROM": "Da", - "TO": "A", - "COPY": "Copiare", - "LANGUAGE": "Lingua", - "UNIVERSAL_DIVIDEND": "Dividendo universale", - "UD": "UD", - "DATE_PATTERN": "DD/MM/YYYY HH:mm", - "DATE_FILE_PATTERN": "YYYY-MM-DD", - "DATE_SHORT_PATTERN": "DD/MM/YY", - "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", - "EMPTY_PARENTHESIS": "(empty)", - "UID": "Pseudonimo", - "ENABLE": "Attivato", - "DISABLE": "Disattivato", - "RESULTS_LIST": "Risultati:", - "RESULTS_COUNT": "{{count}} risultati", - "EXECUTION_TIME": "eeseguit in {{duration|formatDurationMs}}", - "SHOW_VALUES": "Mostrare valori in modo trasparente?", - "POPOVER_ACTIONS_TITLE": "Opzioni", - "POPOVER_FILTER_TITLE": "Filtri", - "SHOW_MORE": "Mostrare di più", - "SHOW_MORE_COUNT": "(limite attuale di {{limit}})", - "POPOVER_SHARE": { - "TITLE": "Condividere", - "SHARE_ON_TWITTER": "Condividere su Twitter", - "SHARE_ON_FACEBOOK": "Condividere su Facebook", - "SHARE_ON_DIASPORA": "Condividere su Diaspora*", - "SHARE_ON_GOOGLEPLUS":"Condividere su Google+" - }, - "FILE": { - "DATE" : "Data:", - "TYPE" : "Tipo:", - "SIZE": "Dimensioni del file:", - "VALIDATING": "Validazione in corso..." - } - }, - "SYSTEM": { - "PICTURE_CHOOSE_TYPE": "Scegliere un file:", - "BTN_PICTURE_GALLERY": "Galleria", - "BTN_PICTURE_CAMERA": "<b>Camera</b>" - }, - "MENU": { - "HOME": "Home", - "WOT": "Annuario", - "CURRENCY": "Moneta", - "ACCOUNT": "Mio conto", - "WALLETS": "I miei portafogli", - "SETTINGS": "Impostazioni", - "NETWORK": "Rete", - "TRANSACTIONS": "Miei pagamenti" - }, - "ABOUT": { - "TITLE": "A proposito", - "LICENSE": "<b>Free/libre software</b> (License GNU AGPLv3).", - "CODE": "Codice sorgente:", - "OFFICIAL_WEB_SITE": "Sito ufficiale:", - "DEVELOPERS": "Sviluppatori:", - "FORUM": "Forum:", - "PLEASE_REPORT_ISSUE": "Non esitate a parlarci delle anomalie riscontrate", - "REPORT_ISSUE": "Segnalare un bug" - }, - "HOME": { - "TITLE": "Cesium", - "WELCOME": "Benvenuti nell'Cesium App!", - "WELCOME_READONLY": "Benvenuti nell'Cesium <span class='badge badge-balanced'>Monit</span>!", - "MESSAGE": "Scambiate in moneta libera {{currency|abbreviate}}", - "MESSAGE_READONLY": "Monitoraggio in tempo reale di moneta libera {{currency|abbreviate}}", - "BTN_CURRENCY": "Esplorare la moneta {{currency|abbreviate}}", - "BTN_ABOUT": "a proposito", - "BTN_HELP": "Aiuto", - "BTN_NETWORK": "Stato della rete", - "FREE_SOFTWARE": "Free software", - "FORK_ME": "Fork me!", - "SHOW_LICENSE": "Mostra licenza", - "REPORT_ISSUE": "Segnalare un bug", - "NOT_YOUR_ACCOUNT_QUESTION" : "Non sei proprietario del conto <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?", - "BTN_CHANGE_ACCOUNT": "Disconettere questo conto", - "CONNECTION_ERROR": "Peer <b>{{server}}</b> irraggiungibile o indirizzo invalido. <br/><br/> Verifica tua connessione or cambia nodo. <a class=\"positive\" ng-click=\"doQuickFix('settings')\">nell impostazioni. </a>.", - "SHOW_ALL_FEED": "Mostra tutto", - "READ_MORE": "Leggi di più", - "FEED_SOURCE": "Fonte" - }, - "SETTINGS": { - "TITLE": "Impostazioni", - "DISPLAY_DIVIDER": "Schermo", - "STORAGE_DIVIDER": "Conservazione", - "NETWORK_SETTINGS": "Rete", - "PEER": "Indirizzo peer Duniter", - "PEER_SHORT": "Indirizzo peer", - "PEER_CHANGED_TEMPORARY": "Indirizzo usato per un tempo determinato", - "PERSIST_CACHE": "Conserva i dati di navigazione (sperimentale)", - "USE_LOCAL_STORAGE": "Abilitare local storage", - "USE_LOCAL_STORAGE_HELP": "Permette di salvare tue impostazioni", - "ENABLE_HELPTIP": "Abilitare consigli dinamici", - "ENABLE_UI_EFFECTS": "Abilitare effetti visivi", - "HISTORY_SETTINGS": "Mio conto", - "DISPLAY_UD_HISTORY": "Mostrare dividendi prodotti?", - "AUTHENTICATION_SETTINGS": "Autenticazione", - "KEEP_AUTH": "Scadenza dell'autenticazione", - "KEEP_AUTH_SHORT": "Scadenza", - "KEEP_AUTH_HELP": "Definire quando l'autenticazione verrà eliminata dalla memoria.", - "KEEP_AUTH_OPTION": { - "NEVER": "Dopo ogni operazione", - "SECONDS": "Dopo {{value}}s d'inattività", - "MINUTE": "Dopo{{value}}min d'inattività", - "MINUTES": "Dopo {{value}}min d'inattività", - "HOUR": "Dopo {{value}}h d'inattività", - "ALWAYS": "Alla fine della sessione" - }, - "REMEMBER_ME": "Ricordarsi di me?", - "REMEMBER_ME_HELP": "Rimanere identificato/a da una sessione all'altra, conservando la chiave localmente.", - "PLUGINS_SETTINGS": "Estensioni", - "BTN_RESET": "Ripristini valori predefiniti", - "EXPERT_MODE": "Abilitare modlità eseperto", - "EXPERT_MODE_HELP": "Permette di vedere più dettagli", - "POPUP_PEER": { - "TITLE" : "Peer Duniter", - "HOST" : "Indirizzo", - "HOST_HELP": "Indirizzo: server:port", - "USE_SSL" : "Securizzato?", - "USE_SSL_HELP" : "(SSL Encryption)", - "BTN_SHOW_LIST" : "Lista dei peers" - } - }, - "BLOCKCHAIN": { - "HASH": "Hash: {{hash}}", - "VIEW": { - "HEADER_TITLE": "Blocco #{{number}}-{{hash|formatHash}}", - "TITLE_CURRENT": "Blocco attuale", - "TITLE": "Blocco #{{number|formatInteger}}", - "COMPUTED_BY": "Calcolato da", - "SHOW_RAW": "Mostrare dati grezzi", - "TECHNICAL_DIVIDER": "Informazioni tecniche", - "VERSION": "Versione di formatto", - "HASH": "Hash calcolato", - "UNIVERSAL_DIVIDEND_HELP": "Moneta co-prodotta da ciasciun dei {{membersCount}} membri", - "EMPTY": "Nessun dati in questo blocco", - "POW_MIN": "Difficoltà minimale", - "POW_MIN_HELP": "Difficoltà imposta nel calcolo del hash", - "DATA_DIVIDER": "Dati", - "IDENTITIES_COUNT": "Nuove identità", - "JOINERS_COUNT": "Nuovi membri", - "ACTIVES_COUNT": "Rinnovi", - "ACTIVES_COUNT_HELP": "Membri che hanno rinnovato la loro presenza nella rete", - "LEAVERS_COUNT": "", - "LEAVERS_COUNT_HELP": "Membri che si sono fatti escludere dalla rete", - "EXCLUDED_COUNT": "Membri esclusi", - "EXCLUDED_COUNT_HELP": "Vecchi membri, esclusi per certificazione non rinnovata o soglia di certificazioni non raggiunta.", - "REVOKED_COUNT": "Identità revocate", - "REVOKED_COUNT_HELP": "Può essere che questi conti non siano più attivi", - "TX_COUNT": "Transazioni", - "CERT_COUNT": "Certificazioni", - "TX_TO_HIMSELF": "Cambio", - "TX_OUTPUT_UNLOCK_CONDITIONS": "Sbloccare condizioni", - "TX_OUTPUT_OPERATOR": { - "AND": "e", - "OR": "o" - }, - "TX_OUTPUT_FUNCTION": { - "SIG": "<b>Firma</b> della chive pubblica", - "XHX": "<b>Password</b>, incluso SHA256 =", - "CSV": "Bloccato per", - "CLTV": "Bloccato fino a" - } - }, - "LOOKUP": { - "TITLE": "Blocchi", - "NO_BLOCK": "Nessun blocco", - "LAST_BLOCKS": "Ultimi blocchi:", - "BTN_COMPACT": "Compact" - } - }, - "CURRENCY": { - "VIEW": { - "TITLE": "Moneta", - "TAB_CURRENCY": "Moneta", - "TAB_WOT": "Web of trust", - "TAB_NETWORK": "Rete", - "TAB_BLOCKS": "Blocchi", - "CURRENCY_SHORT_DESCRIPTION": "{{currency|capitalize}} è <b>una moneta libera</b>, {{firstBlockTime | formatFromNow}}. La rete comprende <b>{{N}} membri </b>, che produccono e ricevono un <a ng-click=\"showHelpModal('ud')\">Dividendo Universale</a> (DU), ogni {{dt | formatPeriod}}.", - "NETWORK_RULES_DIVIDER": "Regole della rete", - "CURRENCY_NAME": "Nome della moneta", - "MEMBERS": "Numero di membri", - "MEMBERS_VARIATION": "Variazione da {{duration|formatDuration}} (dall' ultimo UD)", - "MONEY_DIVIDER": "Moneta", - "MASS": "Massa monetaria", - "SHARE": "Quantità a testa", - "UD": "Dividendo universale", - "C_ACTUAL": "Crescita attuale", - "MEDIAN_TIME": "Current blockchain time", - "POW_MIN": "Difficoltà commune", - "MONEY_RULES_DIVIDER": "Regole della moneta", - "C_RULE": "Obbietivo teorico di crescità", - "UD_RULE": "Dividendo universale (formula)", - "DT_REEVAL": "Periodo tra due re-evaluazioni del UD", - "REEVAL_SYMBOL": "reeval", - "DT_REEVAL_VALUE": "Ogni <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})", - "UD_REEVAL_TIME0": "Data della prima re-evaluzione del UD", - "SIG_QTY_RULE": "Numero di certificazioni requisiti per diventare membro", - "SIG_STOCK": "Numero massimo di certificazioni inviate da un membro", - "SIG_PERIOD": "Tempo minimo tra 2 certificazioni inviate da un unico membro.", - "SIG_WINDOW": "Periodo massimo prima che una certificazione venga studiata", - "SIG_VALIDITY": "Durata di vita di una certificazione che è state presa in conto", - "MS_WINDOW": "Periodo massimo prima che una certificazione pendente sia validata", - "MS_VALIDITY": "Durata di vita di un'adesione che è state presa in conto", - "STEP_MAX": "Distanza massima tra un nuovo membro e ogni membro referente.", - "WOT_RULES_DIVIDER": "Regole della Web of Trust", - "SENTRIES": "Numero di certificazioni (date <b>e</b> ricevute) per diventare membro referente ", - "SENTRIES_FORMULA": "Numero di certificazioni necessarie per diventare membro (formula)", - "XPERCENT":"Percentaggio minimino di membri referenti per rispettare la regola di distanza tra i membri", - "AVG_GEN_TIME": "Tempo medio tra due blocchi", - "CURRENT": "attuale", - "MATH_CEILING": "CEILING", - "DISPLAY_ALL_RULES": "Mostrare tutte le regole?", - "BTN_SHOW_LICENSE": "Mostrare licenza", - "WOT_DIVIDER": "Web of trust" - }, - "LICENSE": { - "TITLE": "Licensa attuale", - "BTN_DOWNLOAD": "Scaricare il file", - "NO_LICENSE_FILE": "File di licenza non trovato ." - } - }, - "NETWORK": { - "VIEW": { - "MEDIAN_TIME": "Blockchain time", - "LOADING_PEERS": "Caricando peers...", - "NODE_ADDRESS": "Indirizzo del peer", - "SOFTWARE": "Software", - "WARN_PRE_RELEASE": "Pre-versione (ultima versione stabile: <b>{{version}}</b>)", - "WARN_NEW_RELEASE": "Versione <b>{{version}}</b> disponibile", - "WS2PID": "Identificativo :", - "PRIVATE_ACCESS": "Accesso privato", - "POW_PREFIX": "Prefisso Prova di Lavoro :", - "ENDPOINTS": { - "BMAS": "Endpoint sicuro (SSL)", - "BMATOR": "Interfaccia rete TOR", - "WS2P": "Interfaccia WS2P", - "ES_USER_API": "Cesium+ data node" - } - }, - "INFO": { - "ONLY_SSL_PEERS": "I nodi non-SSL hanno un display semplificato perche Cesium funziona in modalità HTTPS." - } - }, - "PEER": { - "PEERS": "Peers-Nodi", - "SIGNED_ON_BLOCK": "Firmato nel blocco", - "MIRROR": "Specchio", - "MIRRORS": "Specchio", - "MIRROR_PEERS": "Peers specchio", - "PEER_LIST" : "Lista dei peers", - "MEMBERS" : "Membri", - "MEMBER_PEERS" : "Peers membri", - "ALL_PEERS" : "Tutti i peers", - "DIFFICULTY" : "Difficoltà", - "API" : "API", - "CURRENT_BLOCK" : "Blocco #", - "POPOVER_FILTER_TITLE": "Filtro", - "OFFLINE": "Sconessi", - "OFFLINE_PEERS": "Peers sconessi", - "BTN_SHOW_PEER": "Mostrare peer", - "VIEW": { - "TITLE": "Peer", - "OWNER": "Proprietà di ", - "SHOW_RAW_PEERING": "Vedere il documento di peering", - "SHOW_RAW_CURRENT_BLOCK": "Vedere l'utimo blocco (formatto grezzo)", - "LAST_BLOCKS": "Ultimi blocchi", - "KNOWN_PEERS": "Peers conosciuti :", - "GENERAL_DIVIDER": "Informazioni generali", - "ERROR": { - "LOADING_TOR_NODE_ERROR": "Impossibile ottenere i dati del peer, periodo di attesa scaduto.", - "LOADING_NODE_ERROR": "Impossibile ottenere i dati del peer" - } - } - }, - "WOT": { - "SEARCH_HELP": "Cercare (membro o chiave pubblica)", - "SEARCH_INIT_PHASE_WARNING": "La ricerca per le certificazioni pendenti <b>può essere lunga</b> durante la fase di pre-certificazione. La preghiamo di attendere...", - "REGISTERED_SINCE": "Certificato/a dal", - "REGISTERED_SINCE_BLOCK": "Certificato/a dal blocco #", - "NO_CERTIFICATION": "Nessuna certificazione valida", - "NO_GIVEN_CERTIFICATION": "Nessuna certificazione data", - "NOT_MEMBER_PARENTHESIS": "(non-membro)", - "IDENTITY_REVOKED_PARENTHESIS": "(identità revocata)", - "MEMBER_PENDING_REVOCATION_PARENTHESIS": "(Cancellazione dell'identità pendente)", - "EXPIRE_IN": "Scade", - "NOT_WRITTEN_EXPIRE_IN": "Scadenza <br/> ", - "EXPIRED": "Scaduto", - "PSEUDO": "Pseudonimo", - "SIGNED_ON_BLOCK": "Emessa nel blocco #{{block}}", - "WRITTEN_ON_BLOCK": "Scritta nel blocco #{{block}}", - "GENERAL_DIVIDER": "Informazioni generali", - "NOT_MEMBER_ACCOUNT": "Conto non-membro", - "NOT_MEMBER_ACCOUNT_HELP": "Questo è un semplice portafoglio osservatore, senza richiesta di certificazione emessa.", - "TECHNICAL_DIVIDER": "Dati tecnici", - "BTN_CERTIFY": "Certificare", - "BTN_YES_CERTIFY": "Si, certificare", - "BTN_SELECT_AND_CERTIFY": "Nuova certificazione", - "ACCOUNT_OPERATIONS": "Operazioni sul conto", - "VIEW": { - "POPOVER_SHARE_TITLE": "Identità {{title}}" - }, - "LOOKUP": { - "TITLE": "Annuario", - "NEWCOMERS": "Nuovi membri:", - "NEWCOMERS_COUNT": "{{count}} membri", - "PENDING": "Registrazioni pendenti", - "PENDING_COUNT": "{{count}} inscrizioni pendenti", - "REGISTERED": "Registrato {{sigDate | formatFromNow}}", - "MEMBER_FROM": "Membro dal {{memberDate|medianFromNowShort}}", - "BTN_NEWCOMERS": "Ultimi membri", - "BTN_PENDING": "Registrazioni pendenti", - "SHOW_MORE": "Vedere di più", - "SHOW_MORE_COUNT": "(limite attuale di {{limit}})", - "NO_PENDING": "Nessuna certificazione pendente.", - "NO_NEWCOMERS": "Nessun membro." - }, - "CONTACTS": { - "TITLE": "Contatti" + "COMMON": { + "APP_NAME": "Cesium", + "APP_VERSION": "v{{version}}", + "APP_BUILD": "build {{build}}", + "PUBKEY": "Chiave pubblica", + "MEMBER": "Membro", + "BLOCK" : "Blocco", + "BTN_OK": "Ok", + "BTN_YES": "Sì", + "BTN_NO": "No", + "BTN_SEND": "Inviare", + "BTN_SEND_MONEY": "Effettuare un pagamento", + "BTN_SEND_MONEY_SHORT": "Pagare", + "BTN_SAVE": "Salvare", + "BTN_YES_SAVE": "Sì, salvare", + "BTN_YES_CONTINUE": "Sì, continuare", + "BTN_SHOW": "Mostrare", + "BTN_SHOW_PUBKEY": "Mostrare chiave pubblica", + "BTN_RELATIVE_UNIT": "Mostra importi in DU?", + "BTN_BACK": "Indietro", + "BTN_NEXT": "Avanti", + "BTN_IMPORT": "Importare", + "BTN_CANCEL": "Cancellare", + "BTN_CLOSE": "Chiudere", + "BTN_LATER": "Più tardi", + "BTN_LOGIN": "Accedi", + "BTN_LOGOUT": "Esci", + "BTN_ADD_ACCOUNT": "Nuovo conto", + "BTN_SHARE": "Condividere", + "BTN_EDIT": "Modificare", + "BTN_DELETE": "Eliminare", + "BTN_ADD": "Aggiungere", + "BTN_SEARCH": "Cercare", + "BTN_REFRESH": "Aggiornare", + "BTN_RETRY": "Riprovare", + "BTN_START": "Iniziare", + "BTN_CONTINUE": "Continuare", + "BTN_CREATE": "Creare", + "BTN_UNDERSTOOD": "Ho capito", + "BTN_OPTIONS": "Opzioni", + "BTN_HELP_TOUR": "Mostrami le funzionalità", + "BTN_HELP_TOUR_SCREEN": "Scoprire questa schermata", + "BTN_DOWNLOAD": "Scaricare", + "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Scaricare estratto conto", + "BTN_MODIFY": "Modificare", + "CHOOSE_FILE": "Trascina un file <br/>o clicca per selezionare", + "DAYS": "Giorni", + "NO_ACCOUNT_QUESTION": "Non sei ancora membro? Registrati subito!", + "SEARCH_NO_RESULT": "Nessun risultato trovato", + "LOADING": "Caricando...", + "LOADING_WAIT": "Caricando...<br/><small>(Cesium interroga il nodo nodo Duniter)</small>", + "SEARCHING": "Cercando...", + "FROM": "Da", + "TO": "A", + "COPY": "Copiare", + "LANGUAGE": "Lingua", + "UNIVERSAL_DIVIDEND": "Dividendo Universale", + "UD": "DU", + "DATE_PATTERN": "DD/MM/YYYY HH:mm", + "DATE_FILE_PATTERN": "YYYY-MM-DD", + "DATE_SHORT_PATTERN": "DD/MM/YY", + "DATE_MONTH_YEAR_PATTERN": "MM/YYYY", + "EMPTY_PARENTHESIS": "(empty)", + "UID": "Pseudonimo", + "ENABLE": "Attivato", + "DISABLE": "Disattivato", + "RESULTS_LIST": "Risultati:", + "RESULTS_COUNT": "{{count}} risultati", + "EXECUTION_TIME": "Eseguito in {{duration|formatDurationMs}}", + "SHOW_VALUES": "Mostrare valori in modo trasparente?", + "POPOVER_ACTIONS_TITLE": "Opzioni", + "POPOVER_FILTER_TITLE": "Filtri", + "SHOW_MORE": "Mostrare di più", + "SHOW_MORE_COUNT": "(limite attuale di {{limit}})", + "POPOVER_SHARE": { + "TITLE": "Condividere", + "SHARE_ON_TWITTER": "Condividere su Twitter", + "SHARE_ON_FACEBOOK": "Condividere su Facebook", + "SHARE_ON_DIASPORA": "Condividere su Diaspora*", + "SHARE_ON_GOOGLEPLUS":"Condividere su Google+" }, - "MODAL": { - "TITLE": "Ricerca" - }, - "CERTIFICATIONS": { - "TITLE": "{{uid}} - Certificazioni", - "SUMMARY": "Certificazioni ricevute", - "LIST": "Dettagli delle certificazioni ricevute", - "PENDING_LIST": "Certificazioni pendenti", - "RECEIVED": "Certificazioni ricevute", - "RECEIVED_BY": "Certifications ricevute da {{uid}}", - "ERROR": "Certificazioni ricevute per errore", - "SENTRY_MEMBER": "Membro referente" - }, - "OPERATIONS": { - "TITLE": "{{uid}} - Operazioni" - }, - "GIVEN_CERTIFICATIONS": { - "TITLE": "{{uid}} - Certificazioni inviate", - "SUMMARY": "Certificazioni inviate", - "LIST": "Dettagli delle certificazioni inviate", - "PENDING_LIST": "Certificazioni ", - "SENT": "Certificazioni inviate", - "SENT_BY": "Certificazioni inviate da {{uid}}", - "ERROR": "Certificazioni inviate per errore" - } - }, - "LOGIN": { - "TITLE": "<i class=\"icon ion-log-in\"></i> Accedi", - "SCRYPT_FORM_HELP": "Accedi con tuoi dati <br> Ricordati di verificare che stai utilizzando la chiave del tuo conto.", - "PUBKEY_FORM_HELP": "Scrivi qui la tua chiave privata:", - "FILE_FORM_HELP": "Scegliere un portachiavi da utilizzare:", - "SCAN_FORM_HELP": "Scansiona il codice QR di un portafoglio.", - "SALT": "Identificativo segreto", - "SALT_HELP": "Identificativo segreto", - "SHOW_SALT": "Mostrare identificativo segreto?", - "PASSWORD": "Passsord", - "PASSWORD_HELP": "Password", - "PUBKEY_HELP": "Chiave pubblica, pseudonimo", - "NO_ACCOUNT_QUESTION": "Ancora non hai un conto?", - "HAVE_ACCOUNT_QUESTION": "Hai già un account?", - "CREATE_ACCOUNT": "Creare un conto", - "CREATE_FREE_ACCOUNT": "Crea un conto gratuito", - "FORGOTTEN_ID": "Non ricordi la password?", - "ASSOCIATED_PUBKEY": "Chiave pubblica:", - "BTN_METHODS": "Altri metodi", - "BTN_METHODS_DOTS": "Cambiare metodo...", - "METHOD_POPOVER_TITLE": "Metodi", - "MEMORIZE_AUTH_FILE": "Memorizzare questo portachiavi per la durata di questa sessione", - "SCRYPT_PARAMETERS": "Parametri (Scrypt) :", - "AUTO_LOGOUT": { - "TITLE": "Informazioni", - "MESSAGE": "<i class=\"ion-android-time\"></i> Sei stato <b>sconesso/ b> automaticamente, per un periodo di inattività prolongata", - "BTN_RELOGIN": "Accedi", - "IDLE_WARNING": "Sarai disconesso in... {{countdown}}" - }, - "METHOD": { - "SCRYPT_DEFAULT": "Salatura standard (imp. predefinita)", - "SCRYPT_ADVANCED": "Salatura avanzata", - "FILE": "File del portachiavi", - "PUBKEY": "Chiave pubblica soltanto", - "SCAN": "Scansiona un codice QR" - }, - "SCRYPT": { - "SIMPLE": "Salatura leggera", - "DEFAULT": "Salatura standard", - "SECURE": "Salatura sicura", - "HARDEST": "Salatura più sicura", - "EXTREME": "Salatura estrema", - "USER": "Salatura personalizzata", - "N": "N (Loop):", - "r": "r (RAM):", - "p": "p (CPU):" - }, - "FILE": { - "HELP": "Format del file atteso: <b>.dunikey</b> (type PubSec). Altri formati in sviluppo (EWIF, WIF)." - } - }, - "AUTH": { - "TITLE": "<i class=\"icon ion-locked\"></i> Autenticazione", - "BTN_AUTH": "Autenticarsi", - "GENERAL_HELP": "Autenticati :", - "EXPECTED_UID_HELP": "Effettua il login nell'account <i class=\"ion-person\"></i> {{uid}}:", - "EXPECTED_PUBKEY_HELP": "Si prega di autenticarsi sul portafoglio <i class=\"ion-key\"></i> {{pubkey|formatPubkey}}:", - "SCAN_FORM_HELP": "Scansiona il codice QR della <b>chiave privata</b> del portafoglio." - }, - "ACCOUNT": { - "TITLE": "Mio conto", - "BALANCE": "Saldo", - "LAST_TX": "Ultime transazioni", - "BALANCE_ACCOUNT": "Saldo del conto", - "NO_TX": "Nessuna transazione", - "SHOW_MORE_TX": "Mostrare di più", - "SHOW_ALL_TX": "Mostrare tutte", - "TX_FROM_DATE": "(limite attuale del {{fromTime|medianFromNowShort}})", - "PENDING_TX": "Transazioni pendenti", - "VALIDATING_TX": "Transazioni in corso di convalida", - "ERROR_TX": "Transaction non eseguite", - "ERROR_TX_SENT": "Transazioni inviate", - "PENDING_TX_RECEIVED": "Transazioni in attesa di recezione", - "EVENTS": "Eventi", - "WAITING_MEMBERSHIP": "Richiesta di certificazione inviata. In attesa di validazione.", - "WAITING_CERTIFICATIONS": "Hai bisogno di {{needCertificationCount}} certificazione(i) per diventare membro.", - "WILL_MISSING_CERTIFICATIONS": "Mancherai a breve <b>di certificazioni</b> (occorrono almeno {{willNeedCertificationCount}} altre certificazioni)", - "WILL_NEED_RENEW_MEMBERSHIP": "Tua certificazione <b>scaderà{{membershipExpiresIn|formatDurationTo}}</b>. Ricordati di <a ng-click=\"doQuickFix('renew')\">rinnovarla</a> prima.", - "NEED_RENEW_MEMBERSHIP": "You are no longer a member because your membership <b>has expired</b>. Remember to <a ng-click=\"doQuickFix('renew')\">renew your membership</a>.", - "NO_WAITING_MEMBERSHIP": "Nessuna domanda di adesione pendente. Se desideri <b>diventare membro</b>, ricordati di <a ng-click=\"doQuickFix('membership')\">inviare tua domanda di adesione</a>.", - "CERTIFICATION_COUNT": "Certificazioni ricevute", - "CERTIFICATION_COUNT_SHORT": "Certificazioni", - "SIG_STOCK": "Stock di certificazioni da inviare", - "BTN_RECEIVE_MONEY": "Ricevere", - "BTN_SELECT_ALTERNATIVES_IDENTITIES": "Usare un'altra identità..", - "BTN_FIX_MEMBERSHIP": "Invia nuovamente di adesione...", - "BTN_MEMBERSHIP_RENEW": "Rinnovare adesione", - "BTN_MEMBERSHIP_RENEW_DOTS": "Rinnovare adesione ...", - "BTN_MEMBERSHIP_OUT_DOTS": "Revocare adesione...", - "BTN_SECURITY_DOTS": "Login e securità...", - "BTN_SHOW_DETAILS": "Visualizzare dati tecnici", - "LOCKED_OUTPUTS_POPOVER": { - "TITLE": "Importo bloccata", - "DESCRIPTION": "Ecco le condizioni per sbloccare questo importo:", - "DESCRIPTION_MANY": "Questa transazione è fatta da diverse parti, di cui queste sono le condizioni di sblocco:", - "LOCKED_AMOUNT": "Condizioni per l'importo:" - }, - "NEW": { - "TITLE": "Registrazione", - "INTRO_WARNING_TIME": "Crearsi un conto su {{name|capitalize}} è molto semplice. E consigliato prendere il giusto tempo per farlo correttamente (per evitare di dimenticare passwords, pseudonimi etc.).", - "INTRO_WARNING_SECURITY": "Occorre verificare che il hardware che stai utilizzando (computer, tablet, cellulare) <b>è sicuro e affidabile</b>.", - "INTRO_WARNING_SECURITY_HELP": "Anti-virus aggiornato, firewall abilitato, session protteta da un password o codice PIN...", - "INTRO_HELP": "Cliccare <b> {{'COMMON.BTN_START'|translate}}</b> per avviare la creazione del conto. Ti accompagniamo passo alla volta.", - "REGISTRATION_NODE": "Tua iscrizione verrà salvata dal nodo peer Duniter <b>{{server}}</b>, è verrà poi condivisa nella rete della moneta.", - "REGISTRATION_NODE_HELP": "Se non ti fidi di questo peer, per favore cambialo <a ng-click=\"doQuickFix('settings')\">nelle impostazioni/a> di Cesium.", - "SELECT_ACCOUNT_TYPE": "Scegliere un tipo di conto:", - "MEMBER_ACCOUNT": "Conto membro", - "MEMBER_ACCOUNT_TITLE": "Creare un conto membro", - "MEMBER_ACCOUNT_HELP": "Se non sei ancora registrato come individuo (un conto a persona soltanto).", - "WALLET_ACCOUNT": "Semplice portafoglio", - "WALLET_ACCOUNT_TITLE": "Creare un portafoglio", - "WALLET_ACCOUNT_HELP": "Se rappresenti un'azienda, associazione, altra ente o hai necessita di un altro portafoglio. Nessun Dividendo Universale sarà prodotto da questo conto.", - "SALT_WARNING": "Scegliere un identificativo segreto.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarlo!</b>.<br/>Se lo dimentichi non ti potrà aiutare nessuno!", - "PASSWORD_WARNING": "Scegliere una password.<br/>E necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarla!</b>.<br/>Se la dimentichi non ti potrà aiutare nessuno!", - "PSEUDO_WARNING": "Segliere uno pseudonimo.<br/>Puo essere utile per chi ti cerca nella rete.<br/><br/>.L'utilizzo delle<b>virgole, spazi e accenti</b> è vietato.<br/><div class='hidden-xs'><br/>Esempio: <span class='gray'>JohnDalton, JackieChan, etc.</span>", - "PSEUDO": "Pseudonimo", - "PSEUDO_HELP": "joe123", - "SALT_CONFIRM": "Confermare", - "SALT_CONFIRM_HELP": "Confermare l'identificativo segreto", - "PASSWORD_CONFIRM": "Confermare", - "PASSWORD_CONFIRM_HELP": "Confermare la password", - "SLIDE_6_TITLE": "Conferma:", - "COMPUTING_PUBKEY": "Calcolando...", - "LAST_SLIDE_CONGRATULATION": "Hai riempito tutti i campi richiesti.<br/><b>Puoi inviare la richiesta di creazione del conto</b>.<br/><br/>Per tua informazione, la chiave pubblica qui sotto identifica il tuo futuro conto.<br/>Puo essere communicata a chi ti deve pagare per esempio.<br/>Quando tuo conto verrà approvato potrai trovare la chiave qui <b>{{'ACCOUNT.TITLE'|translate}}</b>.", - "CONFIRMATION_MEMBER_ACCOUNT": "<b class=\"assertive\">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare.<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b>di voler inviare questa richiesta di creazione di conto?", - "CONFIRMATION_WALLET_ACCOUNT": "<b class=\"assertive\">Warning:</b> tuo identificare segreto, tua password e tuo pseudonimo non si possono cambiare..<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b> di voler continuare?", - "CHECKING_PSEUDO": "Verificazione in corso...", - "PSEUDO_AVAILABLE": "Pseudonimo disponibile", - "PSEUDO_NOT_AVAILABLE": "Pseudonimo indisponibile", - "INFO_LICENSE": "TPer aderire alla moneta, ti chiediamo di leggere e accetare le condizioni della licenza.", - "BTN_ACCEPT": "Accetto", - "BTN_ACCEPT_LICENSE": "Accetto la licenza" - }, - "POPUP_REGISTER": { - "TITLE": "Pseudonimo", - "HELP": "Un pseudonimo è necessario per che gli altri ti possino trovare." - }, - "SELECT_IDENTITY_MODAL": { - "TITLE": "Selezionare una identità", - "HELP": "Più <b>identità diverse</b> sono state inviate per la chiave pubblica <span class=\"gray\"><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</span>.<br/>Seleziona un dossier da usare :" + "FILE": { + "DATE" : "Data:", + "TYPE" : "Tipo:", + "SIZE": "Dimensioni del file:", + "VALIDATING": "Validazione in corso..." + } + }, + "SYSTEM": { + "PICTURE_CHOOSE_TYPE": "Scegliere un file:", + "BTN_PICTURE_GALLERY": "Galleria", + "BTN_PICTURE_CAMERA": "<b>Camera</b>" + }, + "MENU": { + "HOME": "Inizio", + "WOT": "Rubrica", + "CURRENCY": "Moneta", + "ACCOUNT": "Il mio conto", + "WALLETS": "I miei portafogli", + "SETTINGS": "Impostazioni", + "NETWORK": "Rete", + "TRANSACTIONS": "I miei pagamenti" + }, + "ABOUT": { + "TITLE": "A proposito", + "LICENSE": "<b>Software Libre</b> (License GNU AGPLv3).", + "LATEST_RELEASE": "È disponibile una <b>nuova versione</ b> di {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)", + "PLEASE_UPDATE": "Per favore aggiorna il {{'COMMON.APP_NAME' | translate}} (latest version: <b>v{{version}}</b>)", + "CODE": "Codice sorgente:", + "OFFICIAL_WEB_SITE": "Pagina web ufficiale:", + "DEVELOPERS": "Sviluppatori:", + "FORUM": "Forum:", + "PLEASE_REPORT_ISSUE": "Per favore comunicaci qualunque problema!", + "REPORT_ISSUE": "Comunica un problema", + "BTN_OPEN_DEV_WINDOW": "Apri la finestra di debug" + }, + "HOME": { + "TITLE": "Cesium", + "WELCOME": "Benvenuti all' App Cesium!", + "WELCOME_READONLY": "Benvenuti nel Cesium <span class='badge badge-balanced'>Monit</span>!", + "MESSAGE": "Scambiate in moneta libera {{currency|abbreviate}}", + "MESSAGE_READONLY": "Monitoraggio in tempo reale della moneta libera {{currency|abbreviate}}", + "BTN_CURRENCY": "Esplorare la moneta {{currency|abbreviate}}", + "BTN_ABOUT": "A proposito", + "BTN_HELP": "Aiuto", + "BTN_NETWORK": "Stato della rete", + "FREE_SOFTWARE": "Software Libre", + "FORK_ME": "Fork me!", + "SHOW_LICENSE": "Mostra licenza", + "REPORT_ISSUE": "Segnalare un bug", + "NOT_YOUR_ACCOUNT_QUESTION" : "Non sei proprietario del conto <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?", + "BTN_CHANGE_ACCOUNT": "Disconettere questo conto", + "CONNECTION_ERROR": "Nodo <b>{{server}}</b> irraggiungibile o indirizzo non valido. <br/><br/> Verifica la tua connessione o cambia nodo. <a class=\"positive\" ng-click=\"doQuickFix('settings')\">nelle impostazioni. </a>.", + "SHOW_ALL_FEED": "Mostra tutto", + "READ_MORE": "Leggi di più", + "FEED_SOURCE": "Fonte" + }, + "SETTINGS": { + "TITLE": "Impostazioni", + "DISPLAY_DIVIDER": "Schermo", + "STORAGE_DIVIDER": "Memoria", + "NETWORK_SETTINGS": "Rete", + "PEER": "Indirizzo nodo Duniter", + "PEER_SHORT": "Indirizzo nodo", + "PEER_CHANGED_TEMPORARY": "Indirizzo usato temporaneamente", + "PERSIST_CACHE": "Mantenere i dati di navigazione (sperimentale)", + "PERSIST_CACHE_HELP": "per la fruizione da una sessione all'altra., Consente una navigazione più veloce, conservando localmente i dati ricevuti, per un utilizzo da una sessione all'altra.", + "USE_LOCAL_STORAGE": "Permetti salvataggio locale", + "USE_LOCAL_STORAGE_HELP": "Permette di salvare le tue impostazioni", + "WALLETS_SETTINGS": "I miei portafogli", + "USE_WALLETS_ENCRYPTION": "Metti in sicurezza la lista", + "USE_WALLETS_ENCRYPTION_HELP": "Ti permette di cifrare la lista dei tuou portafogli. È necessario autenticarsi per accedervi.", + "ENABLE_HELPTIP": "Consenti aiuto contestuale", + "DISABLE_HELPTIP": "Disabilita aiuto contestuale", + "ENABLE_UI_EFFECTS": "Abilita effetti visuali", + "ENABLE_UI_EFFECTS_HELP": "Transizione tra pagine, animazione della lista", + "HISTORY_SETTINGS": "Operazioni del conto", + "DISPLAY_UD_HISTORY": "Mostra i DU cocreati?", + "TX_HISTORY_AUTO_REFRESH": "Abilita l'aggiornamento automatico?", + "TX_HISTORY_AUTO_REFRESH_HELP": "Aggiorna la lista delle operazioni ad ogni nuovo blocco.", + "AUTHENTICATION_SETTINGS": "Autenticazione", + "KEEP_AUTH": "Scadenza dell'autenticazione", + "KEEP_AUTH_SHORT": "Scadenza", + "KEEP_AUTH_HELP": "Definisci quando l'autenticazione è rimossa dalla memoria.", + "KEEP_AUTH_OPTION": { + "NEVER": "Dopo ogni operazione", + "SECONDS": "Dopo {{value}}s di inattività", + "MINUTE": "Dopo {{value}}min di inattività", + "MINUTES": "Dopo {{value}}min di inattività", + "HOUR": "Dopo {{value}}h di inattività", + "ALWAYS": "Alla fine della sessione" }, - "SELECT_WALLET_MODAL": { - "TITLE": "Selezione del portafoglio" - }, - "WALLET_LIST": { - "TITLE": "Portafoglio secondario", - "BTN_NEW": "Aggiungi un portfolio", - "NO_WALLET": "Nessun portafoglio secondario", - "BTN_DELETE": "Rimuovi un portafoglio secondario ...", - "BTN_RENAME": "Rinominare il portafoglio", - "EDIT_POPOVER": { - "TITLE": "Rinominare il portafoglio", - "HELP": "Compila il nuovo nome", - "NAME_HELP": "Nome del portafoglio" - } - }, - "SECURITY":{ - "ADD_QUESTION" : "Aggiungere domanda personalizzata", - "BTN_CLEAN" : "Svuotare", - "BTN_RESET" : "Reset", - "DOWNLOAD_REVOKE": "Salvare un file di revoca", - "DOWNLOAD_REVOKE_HELP" : "Avere une file di revoca è necessario in caso di smarrimento dei tuoi credenziali. Ti permette <b> di rimuovere tuo conto dalla Web Of Trust</b>, per farlo tornare ad essere un semplice portafoglio.", - "HELP_LEVEL": "Scegliere <strong> almeno{{nb}} domande </strong> :", - "LEVEL": "Livello di sicurezza", - "LOW_LEVEL": "Basso <span class=\"hidden-xs\">(minimo di 2 domande)</span>", - "MEDIUM_LEVEL": "Medio <span class=\"hidden-xs\">(minimo di 4 domande)</span>", - "QUESTION_1": "Qual'era il nome del tuo miglior amico quando eri adolescente ?", - "QUESTION_2": "Qual'era il nome del tuo primo animale domestico?", - "QUESTION_3": "Qual'è il primo piatto che imparasti a cucinare?", - "QUESTION_4": "Qual'è il primo film che hai visto al cinema?", - "QUESTION_5": "Qual'era la destinazione del tuo primo volo?", - "QUESTION_6": "Qual'era il nome del tuo professore preferito in scuola ?", - "QUESTION_7": "Quale sarebbe il tuo lavoro preferito?", - "QUESTION_8": "Qual'è il tuo libro per bimbi preferito?", - "QUESTION_9": "Qual'era il marchio della tua prima macchina?", - "QUESTION_10": "Qual'era il tuo nomignolo da ragazzino/a ?", - "QUESTION_11": "Qual'era il tuo personaggio di film o attore preferito quand eri studente?", - "QUESTION_12": "Qual'era il tuo musicista/cantante/grupo preferito quand eri studente ?", - "QUESTION_13": "In che città si sono conosciuti tuoi genitori ?", - "QUESTION_14": "Qual'era il nome del tuo primo capo ?", - "QUESTION_15": "Qual'è il nome della strada dove sei cresciuto/a ?", - "QUESTION_16": "Qual'è il nome della tua spiaggia preferita ?", - "QUESTION_17": "Qual'è il primo album che ti sei comprato ?", - "QUESTION_18": "Qual'è il nome della squadra di sport preferita ?", - "QUESTION_19": "Cosa faceva tuo nonno ?", - "RECOVER_ID": "Ricuperare mia password...", - "RECOVER_ID_HELP": "Se hai un<b<file di backup dei tuoi credenziali</b>, li puoi trovare rispondendo correttamente alle tue domande personalizzate.", - "REVOCATION_WITH_FILE" : "Revocare il mio conto membro...", - "REVOCATION_WITH_FILE_DESCRIPTION": "Se pensi di aver perso <b>definitivamente tuoi credenziali</b> di conto membro (o che la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per forzare la sua uscita permanente dalla Tela di Fiducia</b>.", - "REVOCATION_WITH_FILE_HELP": "Se hai <b>definitivamente perso tuoi credenziali (o se la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per uscire dalla Web Of Trust</b>.", - "REVOCATION_WALLET": "Revocare questo conto subito", - "REVOCATION_WALLET_HELP": "Richiedere la cancellazione dell'identità <b>revocherà la tua adesione alla tua rete</ b> (con certezza per il pseudonimo e la chiave pubblica associata). Il conto non potrà più produrre il Dividendo Universale.<br/>Nonostante ciò, puoi ancora usare il conto come semplice portafoglio.", - "REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt", - "SAVE_ID": "Salvare miei credenziali...", - "SAVE_ID_HELP": "Creare un file di backup, per <b>ricuperare vostra password</b> (e l'identificativo segreto) <b> in caso di smarrimento</b>. Il file è <b>sicuro</ b> (cryptato) utilizzando le domande personalizzate.", - "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(minimo di 6 domande)</span>", - "TITLE": "Conto e sicurezza" - }, - "FILE_NAME": "{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv", - "HEADERS": { - "TIME": "Date", - "AMOUNT": "Amount", - "COMMENT": "Comment" - } + "KEYRING_FILE": "Archivio portachiavi", + "KEYRING_FILE_HELP": "Permetti la connessione automatica all'inizio, o di autenticarsi (solo se \"la scadenza dell'autenticazione\" è \"alla fine della sessione\"", + "REMEMBER_ME": "Ricordarsi di me?", + "REMEMBER_ME_HELP": "Rimanere identificato da una sessione all'altra, conservando la chiave localmente.", + "PLUGINS_SETTINGS": "Estensioni", + "BTN_RESET": "Ripristina valori predefiniti", + "EXPERT_MODE": "Abilitare modalità esperto", + "EXPERT_MODE_HELP": "Permette di vedere più dettagli", + "BLOCK_VALIDITY_WINDOW": "Tempo di incertezza del blocco", + "BLOCK_VALIDITY_WINDOW_SHORT": "Tempo di incertezza", + "BLOCK_VALIDITY_WINDOW_HELP": "Tempo di attesa prima di considerare un'informazione convalidata", + "BLOCK_VALIDITY_OPTION": { + "NONE": "Nessuna attesa", + "N": "{{time | formatDuration}} ({{count}} blocks)" + }, + "POPUP_PEER": { + "TITLE" : "Nodo Duniter", + "HOST" : "Indirizzo", + "HOST_HELP": "Indirizzo: server:port", + "USE_SSL" : "Cifrato?", + "USE_SSL_HELP" : "(Cifratura SSL)", + "BTN_SHOW_LIST" : "Lista dei nodi" + } + }, + "BLOCKCHAIN": { + "HASH": "Hash: {{hash}}", + "VIEW": { + "HEADER_TITLE": "Blocco #{{number}}-{{hash|formatHash}}", + "TITLE_CURRENT": "Blocco attuale", + "TITLE": "Blocco #{{number|formatInteger}}", + "COMPUTED_BY": "Calcolato da", + "SHOW_RAW": "Mostrare dati grezzi", + "TECHNICAL_DIVIDER": "Informazioni tecniche", + "VERSION": "Versione del formato", + "HASH": "Hash calcolato", + "UNIVERSAL_DIVIDEND_HELP": "Moneta cocreata da ciascuno dei {{membersCount}} membri", + "EMPTY": "Nessun dato in questo blocco", + "POW_MIN": "Difficoltà minima", + "POW_MIN_HELP": "Difficoltà imposta nel calcolo del hash", + "DATA_DIVIDER": "Dati", + "IDENTITIES_COUNT": "Nuove identità", + "JOINERS_COUNT": "Nuovi membri", + "ACTIVES_COUNT": "Rinnovi", + "ACTIVES_COUNT_HELP": "Membri che hanno rinnovato la loro adesione alla RdF", + "LEAVERS_COUNT": "Abbandoni", + "LEAVERS_COUNT_HELP": "Membri che hanno abbandonato la rete", + "EXCLUDED_COUNT": "Membri esclusi", + "EXCLUDED_COUNT_HELP": "Vecchi membri, esclusi per certificazione non rinnovata o soglia di certificazioni non raggiunta.", + "REVOKED_COUNT": "Identità revocate", + "REVOKED_COUNT_HELP": "Può essere che queste identità non siano più membri", + "TX_COUNT": "Transazioni", + "CERT_COUNT": "Certificazioni", + "TX_TO_HIMSELF": "Cambio", + "TX_OUTPUT_UNLOCK_CONDITIONS": "Sbloccare condizioni", + "TX_OUTPUT_OPERATOR": { + "AND": "e", + "OR": "o" + }, + "TX_OUTPUT_FUNCTION": { + "SIG": "<b>Firma</b> della chive pubblica", + "XHX": "<b>Password</b>, incluso SHA256 =", + "CSV": "Bloccato per", + "CLTV": "Bloccato fino a" + } + }, + "LOOKUP": { + "TITLE": "Blocchi", + "NO_BLOCK": "Nessun blocco", + "LAST_BLOCKS": "Ultimi blocchi:", + "BTN_COMPACT": "Compact" + } + }, + "CURRENCY": { + "VIEW": { + "TITLE": "Moneta", + "TAB_CURRENCY": "Moneta", + "TAB_WOT": "Rete di Fiducia", + "TAB_NETWORK": "Rete", + "TAB_BLOCKS": "Blocchi", + "CURRENCY_SHORT_DESCRIPTION": "{{currency|capitalize}} è <b>una moneta libera</b>, {{firstBlockTime | formatFromNow}}. La rete comprende <b>{{N}} membri </b>, che producono e ricevono un <a ng-click=\"showHelpModal('ud')\">Dividendo Universale</a> (DU), ogni {{dt | formatPeriod}}.", + "NETWORK_RULES_DIVIDER": "Regole della rete", + "CURRENCY_NAME": "Nome della moneta", + "MEMBERS": "Numero di membri", + "MEMBERS_VARIATION": "Variazione da {{duration|formatDuration}} (dall' ultimo DU)", + "MONEY_DIVIDER": "Moneta", + "MASS": "Massa monetaria", + "SHARE": "Quantità pro capite", + "UD": "Dividendo universale", + "C_ACTUAL": "Crescita attuale", + "MEDIAN_TIME": "Tempo attuale della blockchain", + "POW_MIN": "Difficoltà comune", + "MONEY_RULES_DIVIDER": "Regole della moneta", + "C_RULE": "Obiettivo teorico di crescità", + "UD_RULE": "Dividendo universale (formula)", + "DT_REEVAL": "Periodo tra due rivalutazioni del DU", + "REEVAL_SYMBOL": "rival", + "DT_REEVAL_VALUE": "Ogni <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})", + "UD_REEVAL_TIME0": "Data della prima rivalutazione del DU", + "SIG_QTY_RULE": "Numero di certificazioni richieste per diventare membro", + "SIG_STOCK": "Numero massimo di certificazioni inviate da un membro", + "SIG_PERIOD": "Tempo minimo tra 2 certificazioni inviate da un unico membro.", + "SIG_WINDOW": "Periodo massimo prima che una candidatura a membro venga studiata", + "SIG_VALIDITY": "Durata di vita di una certificazione convalidata", + "MS_WINDOW": "Periodo massimo prima che una certificazione in attesa sia convalidata", + "MS_VALIDITY": "Durata di vita di un'adesione convalidata", + "STEP_MAX": "Distanza massima tra un nuovo membro e ogni membro referente.", + "WOT_RULES_DIVIDER": "Regole della Rete di Fiducia", + "SENTRIES": "Numero di certificazioni (date <b>e</b> ricevute) per diventare membro referente ", + "SENTRIES_FORMULA": "Numero di certificazioni necessarie per diventare membro (formula)", + "XPERCENT":"Percentuale minima di membri referenti per rispettare la regola di distanza tra i membri", + "AVG_GEN_TIME": "Tempo medio tra due blocchi", + "CURRENT": "attuale", + "MATH_CEILING": "TETTO", + "DISPLAY_ALL_RULES": "Mostrare tutte le regole?", + "BTN_SHOW_LICENSE": "Mostrare licenza", + "WOT_DIVIDER": "Rete di Fiducia" + }, + "LICENSE": { + "TITLE": "Licenza attuale", + "BTN_DOWNLOAD": "Scaricare il file", + "NO_LICENSE_FILE": "File di licenza non trovato." + } + }, + "NETWORK": { + "VIEW": { + "MEDIAN_TIME": "Blockchain tempo", + "LOADING_PEERS": "Caricando la lista dei nodi...", + "NODE_ADDRESS": "Indirizzo del nodo", + "SOFTWARE": "Software", + "WARN_PRE_RELEASE": "Pre-versione (ultima versione stabile: <b>{{version}}</b>)", + "WARN_NEW_RELEASE": "Versione <b>{{version}}</b> disponibile", + "WS2PID": "Identificativo:", + "PRIVATE_ACCESS": "Accesso privato", + "POW_PREFIX": "Prefisso Prova di Lavoro:", + "ENDPOINTS": { + "BMAS": "Endpoint sicuro (SSL)", + "BMATOR": "Interfaccia rete TOR", + "WS2P": "Interfaccia WS2P", + "ES_USER_API": "Cesium+ data node" + } + }, + "INFO": { + "ONLY_SSL_PEERS": "I nodi non-SSL hanno un display semplificato perche Cesium funziona in modalità HTTPS." + } + }, + "PEER": { + "PEERS": "Nodi", + "SIGNED_ON_BLOCK": "Firmato nel blocco", + "MIRROR": "Specchio", + "MIRRORS": "Specchi", + "MIRROR_PEERS": "Nodi specchio", + "PEER_LIST" : "Lista dei nodi", + "MEMBERS" : "Membri", + "MEMBER_PEERS" : "Nodi membri", + "ALL_PEERS" : "Tutti i nodi", + "DIFFICULTY" : "Difficoltà", + "API" : "API", + "CURRENT_BLOCK" : "Blocco #", + "POPOVER_FILTER_TITLE": "Filtro", + "OFFLINE": "Sconessi", + "OFFLINE_PEERS": "Nodi sconessi", + "BTN_SHOW_PEER": "Mostrare Nodo", + "VIEW": { + "TITLE": "Nodo", + "OWNER": "Proprietà di", + "SHOW_RAW_PEERING": "Vedere il documento di peering", + "SHOW_RAW_CURRENT_BLOCK": "Vedere l'utimo blocco (formatto grezzo)", + "LAST_BLOCKS": "Ultimi blocchi", + "KNOWN_PEERS": "Nodi conosciuti:", + "GENERAL_DIVIDER": "Informazioni generali", + "ERROR": { + "LOADING_TOR_NODE_ERROR": "Impossibile ottenere i dati del nodo, tempo di attesa scaduto.", + "LOADING_NODE_ERROR": "Impossibile ottenere i dati del nodo" + } + } + }, + "WOT": { + "SEARCH_HELP": "Cercare (membro o chiave pubblica)", + "SEARCH_INIT_PHASE_WARNING": "La ricerca per le certificazioni in attesa <b>può essere lunga</b> durante la fase di pre-certificazione. La preghiamo di attendere...", + "REGISTERED_SINCE": "Certificato dal", + "REGISTERED_SINCE_BLOCK": "Certificato dal blocco #", + "NO_CERTIFICATION": "Nessuna certificazione valida", + "NO_GIVEN_CERTIFICATION": "Nessuna certificazione data", + "NOT_MEMBER_PARENTHESIS": "(non-membro)", + "IDENTITY_REVOKED_PARENTHESIS": "(identità revocata)", + "MEMBER_PENDING_REVOCATION_PARENTHESIS": "(Cancellazione dell'identità in corso)", + "EXPIRE_IN": "Scade", + "NOT_WRITTEN_EXPIRE_IN": "Scadenza <br/> ", + "EXPIRED": "Scaduto", + "PSEUDO": "Pseudonimo", + "SIGNED_ON_BLOCK": "Emessa nel blocco #{{block}}", + "WRITTEN_ON_BLOCK": "Scritta nel blocco #{{block}}", + "GENERAL_DIVIDER": "Informazioni generali", + "NOT_MEMBER_ACCOUNT": "Conto non-membro", + "NOT_MEMBER_ACCOUNT_HELP": "Questo è un portafoglio semplice, senza richiesta di certificazione emessa.", + "TECHNICAL_DIVIDER": "Dati tecnici", + "BTN_CERTIFY": "Certificare", + "BTN_YES_CERTIFY": "Si, certificare", + "BTN_SELECT_AND_CERTIFY": "Nuova certificazione", + "ACCOUNT_OPERATIONS": "Operazioni sul conto", + "VIEW": { + "POPOVER_SHARE_TITLE": "Identità {{title}}" + }, + "LOOKUP": { + "TITLE": "Annuario", + "NEWCOMERS": "Nuovi membri:", + "NEWCOMERS_COUNT": "{{count}} membri", + "PENDING": "Registrazioni in attesa", + "PENDING_COUNT": "{{count}} inscrizioni in attesa", + "REGISTERED": "Registrato {{sigDate | formatFromNow}}", + "MEMBER_FROM": "Membro dal {{memberDate|medianFromNowShort}}", + "BTN_NEWCOMERS": "Ultimi membri", + "BTN_PENDING": "Registrazioni in attesa", + "SHOW_MORE": "Vedere di più", + "SHOW_MORE_COUNT": "(limite attuale di {{limit}})", + "NO_PENDING": "Nessuna certificazione in attesa.", + "NO_NEWCOMERS": "Nessun membro." + }, + "CONTACTS": { + "TITLE": "Contatti" }, - "TRANSFER": { - "TITLE": "Bonifico", - "SUB_TITLE": "Fare un bonifico", - "FROM": "Da", - "TO": "A", - "AMOUNT": "Importo", - "AMOUNT_HELP": "Importo", - "COMMENT": "Commenti", - "COMMENT_HELP": "Commenti", - "BTN_SEND": "Inviare", - "BTN_ADD_COMMENT": "Scrivere un comento ?", - "WARN_COMMENT_IS_PUBLIC": "Ti avvertiamo <b>che i commenti sono pubblici</b> (non cifrati).", - "MODAL": { - "TITLE": "Bonifico" - } + "MODAL": { + "TITLE": "Ricerca" + }, + "CERTIFICATIONS": { + "TITLE": "{{uid}} - Certificazioni", + "SUMMARY": "Certificazioni ricevute", + "LIST": "Dettagli delle certificazioni ricevute", + "PENDING_LIST": "Certificazioni in attesa", + "RECEIVED": "Certificazioni ricevute", + "RECEIVED_BY": "Certifications ricevute da {{uid}}", + "ERROR": "Certificazioni ricevute per errore", + "SENTRY_MEMBER": "Membro referente" + }, + "OPERATIONS": { + "TITLE": "{{uid}} - Operazioni" + }, + "GIVEN_CERTIFICATIONS": { + "TITLE": "{{uid}} - Certificazioni inviate", + "SUMMARY": "Certificazioni inviate", + "LIST": "Dettagli delle certificazioni inviate", + "PENDING_LIST": "Certificazioni ", + "SENT": "Certificazioni inviate", + "SENT_BY": "Certificazioni inviate da {{uid}}", + "ERROR": "Certificazioni inviate per errore" + } + }, + "LOGIN": { + "TITLE": "<i class=\"icon ion-log-in\"></i> Accedi", + "SCRYPT_FORM_HELP": "Accedi con tuoi dati <br> Ricordati di verificare che stai utilizzando la chiave del tuo conto.", + "PUBKEY_FORM_HELP": "Scrivi qui la tua chiave pubblica:", + "FILE_FORM_HELP": "Scegliere un portachiavi da utilizzare:", + "SCAN_FORM_HELP": "Scansiona il codice QR di un portafoglio.", + "SALT": "Identificativo segreto", + "SALT_HELP": "Identificativo segreto", + "SHOW_SALT": "Mostrare identificativo segreto?", + "PASSWORD": "Password", + "PASSWORD_HELP": "Password", + "PUBKEY_HELP": "Chiave pubblica, pseudonimo", + "NO_ACCOUNT_QUESTION": "Non hai ancora un conto?", + "HAVE_ACCOUNT_QUESTION": "Hai già un conto?", + "CREATE_ACCOUNT": "Creare un conto", + "CREATE_FREE_ACCOUNT": "Crea un conto gratuito", + "FORGOTTEN_ID": "Non ricordi la password?", + "ASSOCIATED_PUBKEY": "Chiave pubblica:", + "BTN_METHODS": "Altri metodi", + "BTN_METHODS_DOTS": "Cambiare metodo...", + "METHOD_POPOVER_TITLE": "Metodi", + "MEMORIZE_AUTH_FILE": "Memorizzare questo portachiavi per la durata di questa sessione", + "SCRYPT_PARAMETERS": "Parametri (Scrypt) :", + "AUTO_LOGOUT": { + "TITLE": "Informazioni", + "MESSAGE": "<i class=\"ion-android-time\"></i> Sei stato <b>sconesso/ b> automaticamente, per un periodo di inattività prolongata", + "BTN_RELOGIN": "Accedi", + "IDLE_WARNING": "Sarai disconesso in... {{countdown}}" + }, + "METHOD": { + "SCRYPT_DEFAULT": "Accesso standard (imp. predefinita)", + "SCRYPT_ADVANCED": "Accesso avanzato", + "FILE": "File del portachiavi", + "PUBKEY": "Chiave pubblica soltanto", + "SCAN": "Scansiona un codice QR" + }, + "SCRYPT": { + "SIMPLE": "Accesso rapido", + "DEFAULT": "Accesso standard", + "SECURE": "Accesso sicuro", + "HARDEST": "Accesso più sicuro", + "EXTREME": "Accesso estremo", + "USER": "Accesso personalizzato", + "N": "N (Loop):", + "r": "r (RAM):", + "p": "p (CPU):" + }, + "FILE": { + "HELP": "Formato del file atteso: <b>.dunikey</b> (type PubSec). Altri formati in sviluppo (EWIF, WIF)." + } + }, + "AUTH": { + "TITLE": "<i class=\"icon ion-locked\"></i> Autenticazione", + "BTN_AUTH": "Autenticarsi", + "GENERAL_HELP": "Autenticati :", + "EXPECTED_UID_HELP": "Effettua il login nel conto <i class=\"ion-person\"></i> {{uid}}:", + "EXPECTED_PUBKEY_HELP": "Si prega di autenticarsi nel portafoglio <i class=\"ion-key\"></i> {{pubkey|formatPubkey}}:", + "SCAN_FORM_HELP": "Scansiona il codice QR della <b>chiave pubblica</b> del portafoglio." + }, + "ACCOUNT": { + "TITLE": "Il mio conto", + "BALANCE": "Saldo", + "LAST_TX": "Ultime transazioni", + "BALANCE_ACCOUNT": "Saldo del conto", + "NO_TX": "Nessuna transazione", + "SHOW_MORE_TX": "Mostrare di più", + "SHOW_ALL_TX": "Mostrare tutte", + "TX_FROM_DATE": "(limite attuale del {{fromTime|medianFromNowShort}})", + "PENDING_TX": "Transazioni in attesa", + "VALIDATING_TX": "Transazioni in corso di convalida", + "ERROR_TX": "Transazioni non eseguite", + "ERROR_TX_SENT": "Transazioni inviate", + "PENDING_TX_RECEIVED": "Transazioni in attesa di recezione", + "EVENTS": "Eventi", + "OUT_DISTANCED": "Le tue certificazioni attuali provengono da un gruppo troppo isolato dalla <a ng-click=\"showHelpModal('wot')\">Rete di Fiducia</a> (WoT): la <a ng-click=\"showHelpModal('distance_rule')\">la regola della distanza</a> massima non è rispettata.<br/>Devi ottenere una certificazione da un'altra zona della RdF, o aspettare che si rinforzi.", + "WAITING_MEMBERSHIP": "Richiesta di certificazione inviata. In attesa di validazione.", + "WAITING_CERTIFICATIONS": "Hai bisogno di {{needCertificationCount}} certificazione(i) per diventare membro.", + "WAITING_CERTIFICATIONS_HELP": "Per ottenere le certificazioni necessarie, richiedile solo ai membri <b>che già conosci a sufficienza</b>, come richiesto dalla <a ng-click=\"showLicenseModal()\">licenza della moneta libera</a> che hai accettato.<br/>Se non conosci abbastanza membri, fatti conoscere <a ng-click=\"openLink($event, $root.settings.userForumUrl)\">nel forum</a>.", + "WILL_MISSING_CERTIFICATIONS": "Ti serviranno a breve <b>delle certificazioni</b> (occorrono almeno altre{{willNeedCertificationCount}} certificazioni)", + "WILL_NEED_RENEW_MEMBERSHIP": "La tua certificazione <b>scadrà{{membershipExpiresIn|formatDurationTo}}</b>. Ricordati di <a ng-click=\"doQuickFix('renew')\">rinnovarla</a> prima.", + "NEED_RENEW_MEMBERSHIP": "Non sei più un membro perchè la tua adesione <b>è scaduta</b>. Ricordati di <a ng-click=\"doQuickFix('renew')\">rinnovare la tua adesione</a>.", + "NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED": "Non sei più membro perchè la tua adesione <b>è stata cancellata</b> per mancanza di certificazioni. Ricordati di <a ng-click=\"doQuickFix('renew')\">rinnovare la tua adesione alla RdF</a>.", + "NO_WAITING_MEMBERSHIP": "Nessuna domanda di adesione in attesa. Se desideri <b>diventare membro</b>, ricordati di <a ng-click=\"doQuickFix('membership')\">inviare tua domanda di adesione</a>.", + "CERTIFICATION_COUNT": "Certificazioni ricevute", + "CERTIFICATION_COUNT_SHORT": "Certificazioni", + "SIG_STOCK": "Stock di certificazioni da inviare", + "BTN_RECEIVE_MONEY": "Ricevere", + "BTN_SELECT_ALTERNATIVES_IDENTITIES": "Usare un'altra identità..", + "BTN_FIX_MEMBERSHIP": "Invia nuovamente una richiesta di adesione...", + "BTN_MEMBERSHIP_RENEW": "Rinnovare adesione", + "BTN_MEMBERSHIP_RENEW_DOTS": "Rinnovare adesione ...", + "BTN_MEMBERSHIP_OUT_DOTS": "Revocare adesione...", + "BTN_SECURITY_DOTS": "Accesso e securità...", + "BTN_SHOW_DETAILS": "Visualizza dati tecnici", + "LOCKED_OUTPUTS_POPOVER": { + "TITLE": "Importo bloccato", + "DESCRIPTION": "Ecco le condizioni per sbloccare questo importo:", + "DESCRIPTION_MANY": "Questa transazione è fatta da diverse parti, queste sono le condizioni di sblocco:", + "LOCKED_AMOUNT": "Importo bloccato:" + }, + "NEW": { + "TITLE": "Registrazione", + "INTRO_WARNING_TIME": "Crearsi un conto su {{name|capitalize}} è molto semplice. È consigliato prendere il giusto tempo per farlo correttamente (per evitare di dimenticare passwords, pseudonimi etc.).", + "INTRO_WARNING_SECURITY": "Occorre verificare che l'hardware che stai utilizzando (computer, tablet, cellulare) <b>è sicuro e affidabile</b>.", + "INTRO_WARNING_SECURITY_HELP": "Anti-virus aggiornato, firewall abilitato, sessione protteta da una password o codice PIN...", + "INTRO_HELP": "Cliccare <b> {{'COMMON.BTN_START'|translate}}</b> per avviare la creazione del conto. Ti accompagniamo passo a passo.", + "REGISTRATION_NODE": "La tua iscrizione verrà salvata dal nodo Duniter <b>{{server}}</b>, è verrà poi condivisa nella rete della moneta.", + "REGISTRATION_NODE_HELP": "Se non ti fidi di questo nodo, per favore cambialo <a ng-click=\"doQuickFix('settings')\">nelle impostazioni/a> di Cesium.", + "SELECT_ACCOUNT_TYPE": "Scegliere un tipo di conto:", + "MEMBER_ACCOUNT": "Conto membro", + "MEMBER_ACCOUNT_TITLE": "Creare un conto membro", + "MEMBER_ACCOUNT_HELP": "Se non sei ancora registrato come individuo (un conto per persona soltanto).", + "WALLET_ACCOUNT": "Portafoglio semplice", + "WALLET_ACCOUNT_TITLE": "Creare un portafoglio", + "WALLET_ACCOUNT_HELP": "Se rappresenti un'azienda, associazione, altro ente o hai necessita di un altro portafoglio. Nessun Dividendo Universale sarà prodotto da questo conto.", + "SALT_WARNING": "Scegliere un identificativo segreto.<br/>È necessario per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarlo!</b>.<br/>Se lo dimentichi non ti potrà aiutare nessuno!", + "PASSWORD_WARNING": "Scegliere una password.<br/>È necessaria per ogni connessione a questo conto.<br/><br/><b>Accertati di ricordarla!</b>.<br/>Se la dimentichi non ti potrà aiutare nessuno!", + "PSEUDO_WARNING": "Segliere uno pseudonimo.<br/>Puo essere utile per chi ti cerca nella rete.<br/><br/>.L'utilizzo delle<b>virgole, spazi e accenti</b> è vietato.<br/><div class='hidden-xs'><br/>Esempio: <span class='gray'>JohnDalton, JackieChan, etc.</span>", + "PSEUDO": "Pseudonimo", + "PSEUDO_HELP": "joe123", + "SALT_CONFIRM": "Confermare", + "SALT_CONFIRM_HELP": "Confermare l'identificativo segreto", + "PASSWORD_CONFIRM": "Confermare", + "PASSWORD_CONFIRM_HELP": "Confermare la password", + "SLIDE_6_TITLE": "Conferma:", + "COMPUTING_PUBKEY": "Calcolando...", + "LAST_SLIDE_CONGRATULATION": "Hai riempito tutti i campi richiesti.<br/><b>Puoi inviare la richiesta di creazione del conto</b>.<br/><br/>Per tua informazione, la chiave pubblica qui sotto identifica il tuo futuro conto.<br/>Puo essere comunicata a chi ti deve pagare.<br/>Quando il tuo conto verrà approvato potrai trovare la chiave qui <b>{{'ACCOUNT.TITLE'|translate}}</b>.", + "CONFIRMATION_MEMBER_ACCOUNT": "<b class=\"assertive\">Warning:</b>Il tuo identificatore segreto, la tua password e il tuo pseudonimo non si possono cambiare.<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b>di voler inviare questa richiesta di creazione di conto?", + "CONFIRMATION_WALLET_ACCOUNT": "<b class=\"assertive\">Warning:</b>Il tuo identificatore segreto, la tua password e tuo pseudonimo non si possono cambiare..<br/><b>Ricordali per sempre!</b><br/><b>Sei sicuro/a</b> di voler continuare?", + "CHECKING_PSEUDO": "Verificazione in corso...", + "PSEUDO_AVAILABLE": "Pseudonimo disponibile", + "PSEUDO_NOT_AVAILABLE": "Pseudonimo indisponibile", + "INFO_LICENSE": "Per aderire alla moneta, ti chiediamo di leggere e accetare le condizioni della licenza.", + "BTN_ACCEPT": "Accetto", + "BTN_ACCEPT_LICENSE": "Accetto la licenza" + }, + "POPUP_REGISTER": { + "TITLE": "Pseudonimo", + "HELP": "Uno pseudonimo è necessario affinchè gli altri ti possino trovare." + }, + "SELECT_IDENTITY_MODAL": { + "TITLE": "Selezionare una identità", + "HELP": "Più <b>identità diverse</b> sono state inviate per la chiave pubblica <span class=\"gray\"><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</span>.<br/>Seleziona un dossier da usare :" }, - "ERROR": { - "UNKNOWN_URI_FORMAT": "Formato URI sconosciuto", - "POPUP_TITLE": "Errore", - "UNKNOWN_ERROR": "Errore", - "CRYPTO_UNKNOWN_ERROR": "Suo navigatore non sembra compatibile con le funzionalità di cryptografia.", - "EQUALS_TO_PSEUDO": "Deve essere diverso dal pseudonimo", - "EQUALS_TO_SALT": "Deve essere diverso dal identificativo segreto", - "FIELD_REQUIRED": "Campo obbligatorio.", - "FIELD_TOO_SHORT": "Valore troppo corto.", - "FIELD_TOO_SHORT_WITH_LENGTH": "Valore troppo corto ({{minLength}} caratteri min)", - "FIELD_TOO_LONG": "Valore troppo lungo", - "FIELD_TOO_LONG_WITH_LENGTH": "Valore troppo lungo ({{maxLength}} caractteri max)", - "FIELD_MIN": "Valore minimo : {{min}}", - "FIELD_MAX": "Valore massimo : {{max}}", - "FIELD_ACCENT": "Virgole e caratteri accentati vietati", - "FIELD_NOT_NUMBER": "Valore numerico atteso", - "FIELD_NOT_INT": "Valore intero atteso", - "FIELD_NOT_EMAIL": "Indirizzo mail non valido", - "PASSWORD_NOT_CONFIRMED": "Non corrisponde alla password.", - "SALT_NOT_CONFIRMED": "Non corrisponde al identificativo segreto.", - "SEND_IDENTITY_FAILED": "Iscrizione fallita.", - "SEND_CERTIFICATION_FAILED": "Certificazione fallita.", - "NEED_MEMBER_ACCOUNT_TO_CERTIFY": "Non puoi inviare certificazioni perche tuo conto <b>non è ancora un conto membro</b>.", - "NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF": "Non puoi inviare certificazioni adesso perche <b>non sei ancora membro</b>.<br/><br/>Devi ancora entrare nella WOT.", - "IDENTITY_TO_CERTIFY_HAS_NO_SELF": "Impossibile certificare questo conto. Nessuna richiesta di certificazione trovata o bisogna rinnovarla.", - "LOGIN_FAILED": "Errore di login.", - "LOAD_IDENTITY_FAILED": "Impossibile caricare la tua identità.", - "LOAD_REQUIREMENTS_FAILED": "Impossibile caricare i prerequisiti dell'identità.", - "SEND_MEMBERSHIP_IN_FAILED": "Ingresso nella WOT fallito.", - "SEND_MEMBERSHIP_OUT_FAILED": "Errore nel invio della revocazione.", - "REFRESH_WALLET_DATA": "Impossibile aggiornare il portafoglio.", - "GET_CURRENCY_PARAMETER": "Impossibile ricuperare i parametri della moneta.", - "GET_CURRENCY_FAILED": "Impossibile caricare la moneta. Riprovare più tardi.", - "SEND_TX_FAILED": "Impossibile eseguire la transazione.", - "ALL_SOURCES_USED": "Per favore aspetta il calcolo del prossimo blocco (Tutte le tue fonti di moneta sono state utilizzate).", - "NOT_ENOUGH_SOURCES": "Non hai abbastanza cambio per inviare questo importo in una sola transazione.<br/>Importo massimo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.", - "ACCOUNT_CREATION_FAILED": "Errore nella creazione del tuo conto membro.", - "RESTORE_WALLET_DATA_ERROR": "Errore nel aggiornamento delle impostazioni definite in local storage.", - "LOAD_WALLET_DATA_ERROR": "Errore nel caricamento dei dati del portafoglio.", - "COPY_CLIPBOARD_FAILED": "Impossibile copiare al clipboard", - "TAKE_PICTURE_FAILED": "Impossibile ricuperare foto.", - "SCAN_FAILED": "Impossibile scansionare il codice QR.", - "SCAN_UNKNOWN_FORMAT": "Codice non riconosciuto.", - "WOT_LOOKUP_FAILED": "Ricerca fallita.", - "LOAD_PEER_DATA_FAILED": "Peer Duniter non accessibile. Riprovare più tardi.", - "NEED_LOGIN_FIRST": "Accedi al tuo conto prima.", - "AMOUNT_REQUIRED": "Importo necessario.", - "AMOUNT_NEGATIVE": "Importo negativo non consentito.", - "NOT_ENOUGH_CREDIT": "Saldo insufficiente", - "INVALID_NODE_SUMMARY": "Impossibile comunicare col peer o indirizzo non valido", - "INVALID_USER_ID": "Il campo del 'pseudonimo' non deve avere spazi vuoti o caratteri speciali.", - "INVALID_COMMENT": "Il formato del campo 'reference' è errato.", - "INVALID_PUBKEY": "If formato della chiave pubblica è errato.", - "INVALID_PUBKEY_CHECKSUM": "Checkum non valido.", - "IDENTITY_REVOKED": "Questa identità <b>è stata revocata</b>. Non puo più diventare membro.", - "IDENTITY_REVOKED_WITH_TIME": "Questa identità <b>è stata revocata {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Non puo più diventare membro.", - "IDENTITY_PENDING_REVOCATION": "L'<b>annulamento di questa identità</b> è stata richiesta ed è in corso di evaluazione. Capacità ad inviare certificazioni disabilitata", - "IDENTITY_INVALID_BLOCK_HASH": "Questa richiesta di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers): la persona deve rinnovare la sua domanda di certificazione <b>prima</b> di essere certificata.", - "IDENTITY_EXPIRED": "Questa identità è scaduta: la persona deve fare una nuova domanda di certificazione <b>prima di</b> essere certificata.", - "IDENTITY_SANDBOX_FULL": "Il nodo Duniter utilizzato da Cesium non puo ricevere altre domande di certificazione per ora, la lista d'attesa è piena.<br/><br/>Riprova più tardi o scegli un'altro peer Duniter (nelle <b>Impostazioni</b>).", - "IDENTITY_NOT_FOUND": "Identità non trovata", - "IDENTITY_TX_FAILED": "Impossibile caricare le operazioni", - "WOT_PENDING_INVALID_BLOCK_HASH": "Adesione non valida.", - "WALLET_INVALID_BLOCK_HASH": "Tua domanda di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai peers).<br/>Devi <a ng-click=\"doQuickFix('renew')\">rinnvoare la tua richiesta di adesione alla WOT</a> per risolvere il problema.", - "WALLET_IDENTITY_EXPIRED": "La pubblicazione della tua identità <b>è scaduta</b>.<br/>Devi <a ng-click=\"doQuickFix('fixIdentity')\">ripubblicare la tua identità</a> per risolvere il problema.", - "WALLET_REVOKED": "La tua identità è stata <b>revocata</b>: ne tuo pseudonimo ne tua chiave pubblica sarano utilizzati in futuro.", - "WALLET_HAS_NO_SELF": "La tua identità deve prima essere stata pubblicata e non essere ancora scaduta.", - "AUTH_REQUIRED": "Autenticazione necessaria.", - "AUTH_INVALID_PUBKEY": "La chiave pubblica non corrisponde al conto conesso.", - "AUTH_INVALID_SCRYPT": "Password o nome di utente non valido.", - "AUTH_INVALID_FILE": "File di portachiavi non valido.", - "AUTH_FILE_ERROR": "Impossibile aprire il file di portachiavi", - "IDENTITY_ALREADY_CERTIFY": "Hai <b>già certificato</b> questa identità.<br/><br/>Tuo certificato è ancora valido (scade {{expiresIn|formatDuration}}).", - "IDENTITY_ALREADY_CERTIFY_PENDING": "Hai <b>già certificato</b> questa identità.<br/><br/>Tua certificazione è ancora pendente (Scadenza del periodo di treatment {{expiresIn|formatDuration}}).", - "UNABLE_TO_CERTIFY_TITLE": "Impossibile certificare", - "LOAD_NEWCOMERS_FAILED": "Impossibile caricare i nuovi membri.", - "LOAD_PENDING_FAILED": "Impossibile caricare le certificazioni pendenti.", - "ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION": "Devi <b>essere membro</b> per poter fare questo.", - "ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION": "Devi <b>essere membro</b> (o era un membro) per poter fare questo.", - "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Devi aver <b>publiccato tua identità</b> per poter fare questo.", - "GET_BLOCK_FAILED": "Impossibile caricare il blocco", - "INVALID_BLOCK_HASH": "Blocco non trovato (hash errato)", - "DOWNLOAD_REVOCATION_FAILED": "Errore avvenuto nel download del file di cancellazione d'identità.", - "REVOCATION_FAILED": "Errore avvenuto durante la richiesta di cancellazione dell'identità.", - "SALT_OR_PASSWORD_NOT_CONFIRMED": "identificativo segreto o password sbagliati", - "RECOVER_ID_FAILED": "Impossibile ricuperare la password", - "LOAD_FILE_FAILED" : "Impossibile caricare il file", - "NOT_VALID_REVOCATION_FILE": "File di cancellazione dell'identità errato (formato di file incorreto)", - "NOT_VALID_SAVE_ID_FILE": "File di backup dei credenziali errato (formato di file incorreto)", - "NOT_VALID_KEY_FILE": "File di portachiavi non valido (formato non riconosciuto)", - "EXISTING_ACCOUNT": "Tuoi credenziali corrispondono a quelli di un conto già esistente,di cui <a ng-click=\"showHelpModal('pubkey')\">la chiave pubblica</a> è:", - "EXISTING_ACCOUNT_REQUEST": "Per favore cambi tuoi credenziali in modo che corrispondino ad un conto non utilizzato.", - "GET_LICENSE_FILE_FAILED": "Impossibile caricare il file della licenza", - "CHECK_NETWORK_CONNECTION": "Nessun peer sembra disponibile.<br/><br/>Per favore <b>verifica la tua connessione Internet</b>.", - "ISSUE_524_TX_FAILED": "Bonifico .<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>." + "SELECT_WALLET_MODAL": { + "TITLE": "Selezione del portafoglio" }, - "INFO": { - "POPUP_TITLE": "Informazioni", - "CERTIFICATION_DONE": "Identità firmata con successo", - "NOT_ENOUGH_CREDIT": "Saldo insufficiente", - "TRANSFER_SENT": "Transazione inviata con successo", - "COPY_TO_CLIPBOARD_DONE": "Copiato con successo", - "MEMBERSHIP_OUT_SENT": "Revoca dell'identità inviata", - "NOT_NEED_MEMBERSHIP": "Già un membro.", - "IDENTITY_WILL_MISSING_CERTIFICATIONS": "Questa identità mancherà a breve di certificazioni (almeno {{willNeedCertificationCount}}).", - "REVOCATION_SENT": "Revoca dell'identità inviata", - "REVOCATION_SENT_WAITING_PROCESS": "Cancellazione dell'identità <b>inviata con successo</b>. In attesa di validazione.", - "FEATURES_NOT_IMPLEMENTED": "Questa funzionalità non è ancora disponibile.<br/><br/>Vuoi contribuire per velocizzarne la disponibilità? ;)", - "EMPTY_TX_HISTORY": "Nessuna operazione da esportare" + "WALLET_LIST": { + "TITLE": "Portafoglio secondario", + "BTN_NEW": "Aggiungi un portafoglio", + "BTN_DOWNLOAD": "Scarica la lista", + "BTN_IMPORT_FILE_DOTS": "Importa da un file...", + "NO_WALLET": "Nessun portafoglio secondario", + "BTN_DELETE": "Rimuovi un portafoglio secondario ...", + "BTN_RENAME": "Rinominare il portafoglio", + "EXPORT_FILENAME": "my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv", + "TOTAL_DOTS": "Totale: ", + "EDIT_POPOVER": { + "TITLE": "Rinominare il portafoglio", + "HELP": "Compila il nuovo nome", + "NAME_HELP": "Nome del portafoglio" + }, + "IMPORT_MODAL": { + "TITLE": "Importare un portafoglio secondario", + "HELP": "Per <b>importare un portafoglio secondario</b>,per favore trascina il file nella casella sottostante, o fai click nella casella per cercare un file.", + "WALLET_COUNT": "<b>{{count}}</b> Nuovo portafoglio{{count > 1 ? 's' : ''}}", + "NO_NEW_WALLET": "Nessun nuovo portafoglio" + } + }, + "SECURITY":{ + "ADD_QUESTION" : "Aggiungere domanda personalizzata", + "BTN_CLEAN" : "Svuotare", + "BTN_RESET" : "Reset", + "DOWNLOAD_REVOKE": "Salvare un file di revoca", + "DOWNLOAD_REVOKE_HELP" : "Avere une file di revoca è necessario in caso di smarrimento delle tue credenziali. Ti permette <b> di rimuovere tuo conto dalla Rete di Fiducia</b>, per farlo tornare ad essere un semplice portafoglio.", + "GENERATE_KEYFILE": "Genera il mio file portachiavi ...", + "GENERATE_KEYFILE_HELP": "Genera un file che ti permette di autenticarti senza digitare le tue credenziali.<br/><b>Attenzione:</b> questo file contiene la tua chiave segreta: è perciò oltremodo importante salvarlo in un posto sicuro!", + "KEYFILE_FILENAME": "portachiavi-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey", + "MEMBERSHIP_IN": "Iscriviti come membro...", + "MEMBERSHIP_IN_HELP": "Ti permette <b>convertire </b> un conto semplice <b>in un conto membro</b>, inviando una richiesta di adesione alla RdF. Utile solo se non sei già in possesso di un conto membro.", + "SEND_IDENTITY": "Pubblica identità...", + "SEND_IDENTITY_HELP": "Ti permette associare uno pseudonimo a questo conto, ma <b>ma senza richiedere l'adesione</b> per diventare membro. Questa funzione non è ancora molto utile perchè la validità di questo pseudonimo è limitata nel tempo.", + "HELP_LEVEL": "Scegliere <strong> almeno{{nb}} domande </strong> :", + "LEVEL": "Livello di sicurezza", + "LOW_LEVEL": "Basso <span class=\"hidden-xs\">(minimo di 2 domande)</span>", + "MEDIUM_LEVEL": "Medio <span class=\"hidden-xs\">(minimo di 4 domande)</span>", + "QUESTION_1": "Qual'era il nome del tuo miglior amico quando eri adolescente?", + "QUESTION_2": "Qual'era il nome del tuo primo animale domestico?", + "QUESTION_3": "Qual'è il primo piatto che imparasti a cucinare?", + "QUESTION_4": "Qual'è il primo film che hai visto al cinema?", + "QUESTION_5": "Qual'era la destinazione del tuo primo volo?", + "QUESTION_6": "Qual'era il nome del tuo professore preferito a scuola?", + "QUESTION_7": "Quale sarebbe il tuo lavoro preferito?", + "QUESTION_8": "Qual'è il tuo libro per bimbi preferito?", + "QUESTION_9": "Qual'era il marchio della tua prima macchina?", + "QUESTION_10": "Qual'era il tuo nomignolo da ragazzino/a?", + "QUESTION_11": "Qual'era il tuo personaggio di film o attore preferito quand eri studente?", + "QUESTION_12": "Qual'era il tuo musicista/cantante/grupo preferito quando eri studente?", + "QUESTION_13": "In che città si sono conosciuti i tuoi genitori?", + "QUESTION_14": "Qual'era il nome del tuo primo capo?", + "QUESTION_15": "Qual'è il nome della strada dove sei cresciuto/a?", + "QUESTION_16": "Qual'è il nome della tua spiaggia preferita?", + "QUESTION_17": "Qual'è il primo album che ti sei comprato?", + "QUESTION_18": "Qual'è il nome della squadra di sport preferita?", + "QUESTION_19": "Cosa faceva il tuo nonno?", + "RECOVER_ID": "Recuperare la mia password...", + "RECOVER_ID_HELP": "Se hai un<b<file di backup delle tue credenziali</b>, lo puoi trovare rispondendo correttamente alle tue domande personalizzate.", + "REVOCATION_WITH_FILE" : "Revocare il mio conto membro...", + "RECOVER_ID_SELECT_FILE": "Seleziona il <b>file di backup dei tuoi identificatori</b> da usare:", + "REVOCATION_WITH_FILE_DESCRIPTION": "Se pensi di aver perso <b>definitivamente le tue credenziali</b> di conto membro (o che la sicurezza del tuo conto sia compromessa), puoi usare <b>il file di revoca</b> del conto <b>per forzare la sua uscita permanente dalla Rete di Fiducia</b>.", + "REVOCATION_WITH_FILE_HELP": "Se hai <b>definitivamente perso le tue credenziali (o se la sicurezza del tuo conto è compromessa), puoi usare <b>il file di revoca</b> del conto <b>per uscire dalla Rete di Fiducia</b>.", + "REVOCATION_WALLET": "Revocare immediatamente questo conto", + "REVOCATION_WALLET_HELP": "Richiedere la cancellazione dell'identità <b>revocherà la tua adesione alla Rete di Fiducia</ b> (definitivamente per lo pseudonimo e per la chiave pubblica associata). Il conto non potrà più produrre il Dividendo Universale.<br/>Nonostante ciò, puoi ancora usare il conto come semplice portafoglio.", + "REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt", + "SAVE_ID": "Salvare le mie credenziali...", + "SAVE_ID_HELP": "Creare un file di backup, per <b>recuperare la tua password</b> (e l'identificativo segreto) <b> in caso di smarrimento</b>. Il file è <b>sicuro</ b> (cifrato) utilizzando le domande personalizzate.", + "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(minimo di 6 domande)</span>", + "TITLE": "Conto e sicurezza", + "KEYFILE": { + "PUBSEC_FORMAT": "PubSec format.", + "PUBSEC_FORMAT_HELP": "Questo formato di file è compatibile in particolare con Cesium e Gannounce. Il tuo portachiavi è conservato <b>senza cifratura</b>: chiunque con una copia di questo file sarà in grado di svuotare il tuo conto.", + "WIF_FORMAT": "Wallet Import Format (WIF)", + "WIF_FORMAT_HELP": "Questo formato è usato in particolare dai portafogli cartacei. Il tuo portachiavi è conservato <b>senza cifratura</b>: chiunque con una copia di questo file sará in grado di svuotare il tuo conto.", + "EWIF_FORMAT": "Encrypted Wallet Import Format (WIF)", + "EWIF_FORMAT_HELP": "Questo formato è usato in particolare dai portafogli cartacei. Tuttavia, <b>il portachiavi è cifrato</b> con una passphrase di tua scelta.", + "PASSWORD_POPUP": { + "TITLE": "File del portachiavi cifrato", + "HELP": "Per favore introduci la passphrase:", + "PASSWORD_HELP": "Passphrase" + }, + "ERROR": { + "BAD_PASSWORD": "Passphrase errata", + "BAD_CHECKSUM": "Checksum errato" + } + } + }, + "FILE_NAME": "{{currency}} - Account statement {{pubkey|formatPubkey}} to {{currentTime|formatDateForFile}}.csv", + "HEADERS": { + "TIME": "Data", + "AMOUNT": "Importo", + "COMMENT": "Commento" + } + }, + "TRANSFER": { + "TITLE": "Bonifico", + "SUB_TITLE": "Fare un bonifico", + "SUB_TITLE_ALL": "Svuota il conto", + "FROM": "Da", + "TO": "A", + "AMOUNT": "Importo", + "AMOUNT_HELP": "Importo", + "COMMENT": "Commenti", + "COMMENT_HELP": "Commenti", + "BTN_SEND": "Inviare", + "BTN_ADD_COMMENT": "Scrivere un commento?", + "REST": "Resto del conto", + "REST_TO": "a", + "WARN_COMMENT_IS_PUBLIC": "Ti avvertiamo <b>che i commenti sono pubblici</b> (non cifrati).", + "MODAL": { + "TITLE": "Bonifico" + } + }, + "ERROR": { + "UNKNOWN_URI_FORMAT": "Formato URI sconosciuto", + "PUBKEY_INVALID_CHECKSUM": "Chiave pubblica non valida (checksum errato).", + "POPUP_TITLE": "Errore", + "UNKNOWN_ERROR": "Errore", + "CRYPTO_UNKNOWN_ERROR": "Il tuo navigatore non sembra compatibile con le funzionalità di cryptografia.", + "DOWNLOAD_KEYFILE_FAILED": "Errore nel generare il file del portachiavi", + "EQUALS_TO_PSEUDO": "Deve essere diverso dallo pseudonimo", + "EQUALS_TO_SALT": "Deve essere diverso dall'identificativo segreto", + "FIELD_REQUIRED": "Campo obbligatorio.", + "FIELD_TOO_SHORT": "Valore troppo corto.", + "FIELD_TOO_SHORT_WITH_LENGTH": "Valore troppo corto ({{minLength}} caratteri min)", + "FIELD_TOO_LONG": "Valore troppo lungo", + "FIELD_TOO_LONG_WITH_LENGTH": "Valore troppo lungo ({{maxLength}} caractteri max)", + "FIELD_MIN": "Valore minimo : {{min}}", + "FIELD_MAX": "Valore massimo : {{max}}", + "FIELD_ACCENT": "Virgole e caratteri accentati vietati", + "FIELD_NOT_NUMBER": "Valore numerico atteso", + "FIELD_NOT_INT": "Valore intero atteso", + "FIELD_NOT_EMAIL": "Indirizzo mail non valido", + "PASSWORD_NOT_CONFIRMED": "Non corrisponde alla password.", + "SALT_NOT_CONFIRMED": "Non corrisponde all'identificativo segreto.", + "SEND_IDENTITY_FAILED": "Iscrizione fallita.", + "SEND_CERTIFICATION_FAILED": "Certificazione fallita.", + "NEED_MEMBER_ACCOUNT_TO_CERTIFY": "Non puoi inviare certificazioni perchè il tuo conto <b>non è ancora un conto membro</b>.", + "NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF": "Non puoi inviare certificazioni adesso perchè <b>non sei ancora membro</b>.<br/><br/>Devi ancora entrare nella Rete di Fiducia.", + "IDENTITY_TO_CERTIFY_HAS_NO_SELF": "Impossibile certificare questo conto. Nessuna richiesta di certificazione trovata o bisogna rinnovarla.", + "LOGIN_FAILED": "Errore di login.", + "LOAD_IDENTITY_FAILED": "Impossibile caricare la tua identità.", + "LOAD_REQUIREMENTS_FAILED": "Impossibile caricare i prerequisiti dell'identità.", + "SEND_MEMBERSHIP_IN_FAILED": "Ingresso nella RdF fallito.", + "SEND_MEMBERSHIP_OUT_FAILED": "Errore nell'invio della revocazione.", + "REFRESH_WALLET_DATA": "Impossibile aggiornare il portafoglio.", + "GET_CURRENCY_PARAMETER": "Impossibile recuperare i parametri della moneta.", + "GET_CURRENCY_FAILED": "Impossibile caricare la moneta. Riprovare più tardi.", + "SEND_TX_FAILED": "Impossibile eseguire la transazione.", + "ALL_SOURCES_USED": "Per favore aspetta il calcolo del prossimo blocco (Tutte le tue fonti di moneta sono state utilizzate).", + "NOT_ENOUGH_SOURCES": "Non hai abbastanza fondi per inviare questo importo in una sola transazione.<br/>Importo massimo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.", + "ACCOUNT_CREATION_FAILED": "Errore nella creazione del tuo conto membro.", + "RESTORE_WALLET_DATA_ERROR": "Errore nell'aggiornamento delle impostazioni definite in local storage.", + "LOAD_WALLET_DATA_ERROR": "Errore nel caricamento dei dati del portafoglio.", + "COPY_CLIPBOARD_FAILED": "Impossibile copiare al clipboard", + "TAKE_PICTURE_FAILED": "Impossibile recuperare foto.", + "SCAN_FAILED": "Impossibile scansionare il codice QR.", + "SCAN_UNKNOWN_FORMAT": "Codice non riconosciuto.", + "WOT_LOOKUP_FAILED": "Ricerca fallita.", + "LOAD_PEER_DATA_FAILED": "Nodo Duniter non accessibile. Riprovare più tardi.", + "NEED_LOGIN_FIRST": "Accedi prima al tuo conto.", + "AMOUNT_REQUIRED": "Importo necessario.", + "AMOUNT_NEGATIVE": "Importo negativo non consentito.", + "NOT_ENOUGH_CREDIT": "Saldo insufficiente", + "INVALID_NODE_SUMMARY": "Impossibile comunicare col nodo o indirizzo non valido", + "INVALID_USER_ID": "Il campo dello 'pseudonimo' non deve avere spazi vuoti o caratteri speciali.", + "INVALID_COMMENT": "Il formato del campo 'reference' è errato.", + "INVALID_PUBKEY": "If formato della chiave pubblica è errato.", + "INVALID_PUBKEY_CHECKSUM": "Checksum non valido.", + "IDENTITY_REVOKED": "Questa identità <b>è stata revocata</b>. Non puo più diventare membro.", + "IDENTITY_REVOKED_WITH_TIME": "Questa identità <b>è stata revocata {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Non puo più diventare membro.", + "IDENTITY_PENDING_REVOCATION": "L'<b>annulamento di questa identità</b> è stata richiesta ed è in corso di valutazione. Capacità ad inviare certificazioni disabilitata", + "IDENTITY_INVALID_BLOCK_HASH": "Questa richiesta di certificazione non è più valida (perche si riferisce ad un blocco che è stato eliminato dai nodi): la persona deve rinnovare la sua domanda di certificazione <b>prima</b> di essere certificata.", + "IDENTITY_EXPIRED": "Questa identità è scaduta: la persona deve fare una nuova domanda di certificazione <b>prima di</b> essere certificata.", + "IDENTITY_SANDBOX_FULL": "Il nodo Duniter utilizzato dal Cesium non può ricevere altre domande di certificazione per ora, la lista d'attesa è piena.<br/><br/>Riprova più tardi o scegli un'altro nodo Duniter (nelle <b>Impostazioni</b>).", + "IDENTITY_NOT_FOUND": "Identità non trovata", + "IDENTITY_TX_FAILED": "Impossibile caricare le operazioni", + "WOT_PENDING_INVALID_BLOCK_HASH": "Adesione non valida.", + "WALLET_INVALID_BLOCK_HASH": "La tua domanda di certificazione non è più valida (perché si riferisce ad un blocco che è stato eliminato dai nodi).<br/>Devi <a ng-click=\"doQuickFix('renew')\">rinnovare la tua richiesta di adesione alla RdF</a> per risolvere il problema.", + "WALLET_IDENTITY_EXPIRED": "La pubblicazione della tua identità <b>è scaduta</b>.<br/>Devi <a ng-click=\"doQuickFix('fixIdentity')\">ripubblicare la tua identità</a> per risolvere il problema.", + "WALLET_REVOKED": "La tua identità è stata <b>revocata</b>: né il tuo pseudonimo né la tua chiave pubblica sarano utilizzati in futuro.", + "WALLET_HAS_NO_SELF": "La tua identità deve prima essere stata pubblicata e non essere ancora scaduta.", + "AUTH_REQUIRED": "Autenticazione necessaria.", + "AUTH_INVALID_PUBKEY": "La chiave pubblica non corrisponde al conto conesso.", + "AUTH_INVALID_SCRYPT": "Password o nome di utente non valido.", + "AUTH_INVALID_FILE": "File di portachiavi non valido.", + "AUTH_FILE_ERROR": "Impossibile aprire il file di portachiavi", + "IDENTITY_ALREADY_CERTIFY": "Hai <b>già certificato</b> questa identità.<br/><br/>Il tuo certificato è ancora valido (scade {{expiresIn|formatDuration}}).", + "IDENTITY_ALREADY_CERTIFY_PENDING": "Hai <b>già certificato</b> questa identità.<br/><br/>La tua certificazione è ancora pendente (Scadenza del periodo di trattamento {{expiresIn|formatDuration}}).", + "UNABLE_TO_CERTIFY_TITLE": "Impossibile certificare", + "LOAD_NEWCOMERS_FAILED": "Impossibile caricare i nuovi membri.", + "LOAD_PENDING_FAILED": "Impossibile caricare le certificazioni pendenti.", + "ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION": "Devi <b>essere membro</b> per poter fare questo.", + "ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION": "Devi <b>essere membro</b> (o un ex-membro) per poter fare questo.", + "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Devi aver <b>pubblicato la tua identità</b> per poter fare questo.", + "GET_BLOCK_FAILED": "Impossibile caricare il blocco", + "INVALID_BLOCK_HASH": "Blocco non trovato (hash errato)", + "DOWNLOAD_REVOCATION_FAILED": "Errore avvenuto nel download del file di cancellazione d'identità.", + "REVOCATION_FAILED": "Errore avvenuto durante la richiesta di cancellazione dell'identità.", + "SALT_OR_PASSWORD_NOT_CONFIRMED": "Identificativo segreto o password sbagliati", + "RECOVER_ID_FAILED": "Impossibile recuperare la password", + "LOAD_FILE_FAILED" : "Impossibile caricare il file", + "NOT_VALID_REVOCATION_FILE": "File di cancellazione dell'identità errato (formato di file incorreto)", + "NOT_VALID_SAVE_ID_FILE": "File di backup delle credenziali errato (formato di file incorreto)", + "NOT_VALID_KEY_FILE": "File del portachiavi non valido (formato non riconosciuto)", + "EXISTING_ACCOUNT": "Le tue credenziali corrispondono a quelli di un conto già esistente,di cui <a ng-click=\"showHelpModal('pubkey')\">la chiave pubblica</a> è:", + "EXISTING_ACCOUNT_REQUEST": "Per favore cambia le tue credenziali in modo che corrispondino ad un conto non utilizzato.", + "GET_LICENSE_FILE_FAILED": "Impossibile caricare il file della licenza", + "CHECK_NETWORK_CONNECTION": "Nessun nodo sembra disponibile.<br/><br/>Per favore <b>verifica la tua connessione Internet</b>.", + "ISSUE_524_TX_FAILED": "Bonifico .<br/><br/>Un messaggio è stato inviato agli sviluppatori per aiutare a risolvere il problema. <b>Grazie per il tuo aiuto</b>.", + "ADD_SECONDARY_WALLET_FAILED": "Impossibile aggiungere un portafoglio secondario.", + "REMOVE_SECONDARY_WALLET_FAILED": "Impossibile rimuovere un portafoglio secondario.", + "UPDATE_WALLET_LIST_FAILED": "Impossibile aggiornare la lista dei portafogli.", + "LOAD_WALLET_LIST_FAILED": "Impossibile caricare la lista dei portafogli.", + "SAVE_WALLET_LIST_FAILED": "Impossibile salvare la lista dei portafogli.", + "COULD_NOT_ADD_MAIN_WALLET": "Questo portafoglio <b>è il conto principale</b> con il quale sei connesso. Impossibile aggiungerlo come un portafoglio secondario.", + "COULD_NOT_ADD_EXISTING_WALLET": "Portafoglio già presente nella lista.", + "UNKNOWN_WALLET_ID": "Portafoglio secondario sconosciuto.", + "RESTORE_WALLET_LIST_FAILED": "Impossibile recuperare la lista dei portafogli.", + "INVALID_FILE_FORMAT": "Formato file invalido.", + "SAME_TX_RECIPIENT": "Il destinatario deve essere diverso dall'emittente." }, - "CONFIRM": { + "INFO": { + "POPUP_TITLE": "Informazioni", + "CERTIFICATION_DONE": "Identità firmata con successo", + "NOT_ENOUGH_CREDIT": "Saldo insufficiente", + "TRANSFER_SENT": "Transazione inviata con successo", + "COPY_TO_CLIPBOARD_DONE": "Copiato con successo", + "MEMBERSHIP_OUT_SENT": "Revoca dell'identità inviata", + "NOT_NEED_MEMBERSHIP": "Già membro.", + "IDENTITY_WILL_MISSING_CERTIFICATIONS": "A questa identità mancheranno a breve certificazioni (almeno {{willNeedCertificationCount}}).", + "IDENTITY_NEED_MEMBERSHIP": "Questa identità non ha ancora spedito una richiesta di adesione alla RdF. Dovrà farlo se desidera diventare membro.", + "HAS_ALTERNATIVE_IDENTITIES": "Ci sono <b>più identità</b> associate a questa chiave pubblica. <b>Prima di qualsiasi certificazione</b>, <a ng-click=\"doQuickFix('showSelectIdentities')\">controlla altre identità</a> per scegliere quella corretta oppure contatta il proprietario del portafoglio.", + "REVOCATION_SENT": "Revoca dell'identità inviata", + "REVOCATION_SENT_WAITING_PROCESS": "Cancellazione dell'identità <b>inviata con successo</b>. In attesa di validazione.", + "FEATURES_NOT_IMPLEMENTED": "Questa funzionalità non è ancora disponibile.<br/><br/>Vuoi contribuire per velocizzarne la disponibilità? ;)", + "EMPTY_TX_HISTORY": "Nessuna operazione da esportare" + }, + "CONFIRM": { + "CAN_CONTINUE": "<b>Sei sicuro/a</b> di voler procedere?", "POPUP_TITLE": "<b>Conferma</b>", - "POPUP_WARNING_TITLE": "<b>Avviso</b>", - "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Avvertimento di sicurezza</b>", - "CERTIFY_RULES_TITLE_UID": "Certificare {{uid}}", - "CERTIFY_RULES": "<b class=\"assertive\">Non certificare un conto</b> se credi che: <ul><li>1.) l'identità della persona potrebbe essere finta.<li>2.) la oersona ha già un conto certicato.<li>3.) la persona trasgredisce la regola 1 o 2 o entrambe. (Certifica conti finti o gemelli).</ul></small><br/>Sei sicuro/a di voler certificare questa identità?", - "TRANSFER": "<b>Resoconto del bonifico:</b><br/><br/><ul><li> - Inviato da: <b>{{from}}</b></li><li> - A: <b>{{to}}</b></li><li> - Importo: <b>{{amount}} {{unit}}</b></li><li> - Comento: <i>{{comment}}</i></li></ul><br/><b>Sei sicuro di voler procedere con questo bonifico?</b>", - "MEMBERSHIP_OUT": "Questa operazione è <b>irreversibile</b>.<br/></br/><b>Sei sicuro/a di voler cancellare la tua presenza nella WOT?</b>", - "MEMBERSHIP_OUT_2": "Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a <b>di voler revocare la tua identità</b>?", - "LOGIN_UNUSED_WALLET_TITLE": "Errore di battitura?", - "LOGIN_UNUSED_WALLET": "Il conto sembra <b>inattivo</b>.<br/><br/>Probabilmente è un<b>errore di battitura</b> mientre digitavi i tuoi credenziali. Per favore riprova, verificando che la <b>chiave pubblica sia tua<b/>.", - "FIX_IDENTITY": "Lo pseudonimo <b>{{uid}}</b> verrà pubblicato nuovamente. Si sostituirà alla precedente pubblicazione che è scaduta.<br/></br/><b>Sei sicuro/a</b> di voler procedere?", - "FIX_MEMBERSHIP": "Tua domanda di certificazione sarà inviata alla rete.<br/></br/><b>Sei sicuro/a?</b>", - "MEMBERSHIP": "Tua domanda per diventare membro sta per essere inviata alla rete.<br/></br/><b>Sei sicuro/a/b> di voler continuare ?", - "RENEW_MEMBERSHIP": "Tua adesione verrà rinnovata.<br/></br/><b>Sei sicuro/a?</b>", - "REVOKE_IDENTITY": "Stai per <b>revocare definitivamente questa identità</b>.<br/><br/>La chiave pubblica e lo pseudonimo associato <b>non saranno mai più utilizzati</b> (per un conto membro).<br/></br/><b>Sei sicuro/a</b> di voler revocare questa identità?", - "REVOKE_IDENTITY_2": "Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro/a di volern<b>revocare questa identità</b>?", - "NOT_NEED_RENEW_MEMBERSHIP": "Tua presenza nella rete non deve ancora essere rinnovata (scaderà tra {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Sei sicuro/a</b> di voler rinnovare la tua presenza?", - "SAVE_BEFORE_LEAVE": "Vuoi <b>salvare tue modifiche</b> prima di uscira dalla pagina?", - "SAVE_BEFORE_LEAVE_TITLE": "Modifiche non salvate", - "LOGOUT": "Sei sicuro/a di voler chiudere la sessione?", - "USE_FALLBACK_NODE": "Peer <b>{{old}}</b> indisponibile o indirizzo errato.<br/><br/>Vuoi utilizzare temporanemante il <b>{{new}}</b> nodo?", - "INVALID_FILE_FORMAT": "Formato file non valido.", - "SAME_TX_RECIPIENT": "Il destinatario deve essere diverso dall'emittente." + "POPUP_WARNING_TITLE": "<b>Avviso</b>", + "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Avvertimento di sicurezza</b>", + "CERTIFY_RULES_TITLE_UID": "Certificare {{uid}}", + "CERTIFY_RULES": "<b class=\"assertive\">Non certificare un conto</b> se credi che: <ul><li>1.) L'identità della persona potrebbe essere finta.<li>2.) La persona ha già un conto certicato.<li>3.) La persona trasgredisce la regola 1 o 2 o entrambe. (Certifica conti finti o gemelli).</ul></small><br/>Sei sicuro di voler certificare questa identità?", + "FULLSCREEN": "Aprire l'applicazione a schermo intero?", + "EXIT_APP": "Chiudere l'applicazione?", +"TRANSFER": "<b>Resoconto del bonifico:</b><br/><br/><ul><li> - Inviato da: <b>{{from}}</b></li><li> - A: <b>{{to}}</b></li><li> - Importo: <b>{{amount}} {{unit}}</b></li><li> - Comemnto: <i>{{comment}}</i></li></ul><br/><b>Sei sicuro di voler procedere con questo bonifico?</b>", + "TRANSFER_ALL": "<b>Riepilogo del bonifico:</b><br/><br/><ul><li> - Da: <b>{{from}}</b></li><li> - A: <b>{{to}}</b></li><li> - Importo: <b>{{amount}} {{unit}}</b></li><li> - Commento: <i>{{comment}}</i></li><br/><li> - Resto : <b>{{restAmount}} {{unit}}</b> a <b>{{restTo}}</b></li></ul><br/><b>Sicuro di voler fare questo bonifico?</b>", + "MEMBERSHIP_OUT": "Questa operazione è <b>irreversibile</b>.<br/></br/><b>Sei sicuro di voler cancellare la tua presenza nella RdF?</b>", + "MEMBERSHIP_OUT_2": "Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro <b>di voler revocare la tua identità</b>?", + "LOGIN_UNUSED_WALLET_TITLE": "Errore di battitura?", + "LOGIN_UNUSED_WALLET": "Il conto sembra <b>inattivo</b>.<br/><br/>Probabilmente è un<b>errore di battitura</b> delle tue credenziali. Per favore riprova, verificando che la <b>chiave pubblica sia la tua<b/>.", + "FIX_IDENTITY": "Lo pseudonimo <b>{{uid}}</b> verrà pubblicato nuovamente. Si sostituirà alla precedente pubblicazione che è scaduta.<br/></br/><b>Sei sicuro</b> di voler procedere?", + "FIX_MEMBERSHIP": "La tua domanda di certificazione sarà inviata alla rete.<br/></br/><b>Sei sicuro?</b>", + "MEMBERSHIP": "La tua domanda per diventare membro sta per essere inviata alla rete.<br/></br/><b>Sei sicuro</b> di voler continuare ?", + "RENEW_MEMBERSHIP": "La tua adesione verrà rinnovata.<br/></br/><b>Sei sicuro?</b>", + "REVOKE_IDENTITY": "Stai per <b>revocare definitivamente questa identità</b>.<br/><br/>La chiave pubblica e lo pseudonimo associato <b>non saranno mai più utilizzati</b> (da un conto membro).<br/></br/><b>Sei sicuro</b> di voler revocare questa identità?", + "REVOKE_IDENTITY_2": "Questa operazione è <b>irreversibile</b>!<br/><br/>Sei sicuro di voler <b>revocare questa identità</b>?", + "NOT_NEED_RENEW_MEMBERSHIP": "La tua adesione nella rete non deve ancora essere rinnovata (scadrà tra {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Sei sicuro</b> di voler rinnovare la tua adesione?", + "SAVE_BEFORE_LEAVE": "Vuoi <b>salvare le tue modifiche</b> prima di uscira dalla pagina?", + "SAVE_BEFORE_LEAVE_TITLE": "Modifiche non salvate", + "LOGOUT": "Sei sicuro di voler chiudere la sessione?", + "USE_FALLBACK_NODE": "Nodo <b>{{old}}</b> indisponibile o indirizzo errato.<br/><br/>Vuoi utilizzare temporanemante il <b>{{new}}</b> nodo?", + "ISSUE_524_SEND_LOG": "La transazione è stata annullata a causa di un errore conosciuto (issue #524) ma non riprodotto. <br/><br/>Per aiutare gli sviluppatori a risolvere questo errore, acconsenti all'<b>invio dei tuoi logs</b> per messaggio?<br/><small>(Non viene inviato nessun dato confidenziale)</small>" + }, + "MODE": { + "DEMO": { + "BADGE": "Demo", + "MODE": "Modalità dimostrativa", + "FEATURE_NOT_AVAILABLE": "Funzionalità <b>non disponibile</b> su questo sito dimostrativo.", + "MODE_HELP": "Il Cesium funziona in <b>modalità dimostrativa</b>: è disponibile la consultazione del conto, ma non è possibile eseguire alcuna operazione.", + "INSTALL_HELP": "Per <b>motivi di sicurezza</b> ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza." + }, + "READONLY": { + "BADGE": "Monit", + "MODE": "Modalità di monitoraggio", + "MODE_HELP": "Il Cesium funziona in <b>modalità monitoraggio</b>: sono disponibili solo le funzionalità di monitoraggio della valuta.", + "INSTALL_HELP": "Se desidera <b>creare un account di portafoglio</b> per inviare o ricevere valuta, ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza." + } + }, + "DOWNLOAD": { + "POPUP_TITLE": "<b>File di revoca dell'identità/b>", + "POPUP_REVOKE_MESSAGE": "Per migliorare la sicurezza del tuo conto, scarica <b>il documento di revoca del conto</b>. Ti consentirà di revocare il tuo conto (nel caso di violazione del conto, della tua identità, conto creato con errori, etc.).<br/><br/><b>Hai salvato questo documento in un luogo sicuro.</b>" }, - "MODE": { - "DEMO": { - "BADGE": "Demo", - "MODE": "Modalità dimostrativa", - "FEATURE_NOT_AVAILABLE": "Funzionalità <b>non disponibile</b> su questo sito dimostrativo.", - "MODE_HELP": "Il cesio funziona in <b>modalità dimostrativa</b>: è disponibile la consultazione per conto, ma non è possibile eseguire alcuna operazione per conto.", - "INSTALL_HELP": "Per <b>motivi di sicurezza</b> ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza." + "HELP": { + "TITLE": "Aiuto online", + "JOIN": { + "SECTION": "Entrare nella rete", + "SALT": "Il tuo identificativo segreto è molto importante. È utilizzato per cifrare la tua password che permette poi di calcolare la tua <span class=\"text-italic\">chiave pubblica</span> (suo numero) e la chiave privata per consentire l'accesso.<br/><b>Ricordati bene di questo identificativo</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non può essere cambiato senza dover creare un conto nuovo.<br/><br/>Raccomandiamo che sia abbastanza lungo (8 caratteri almeno) è il più originale possibile (buona entropia).", + "PASSWORD": "La password è molto importante, è utilizzata per calcolare il tuo numero di conto (la tua chiave pubblica) e la chiave privata per consentire l'accesso.<br/><b>Ricordatela bene</b>, perché non ti potrà aiutare nessuno se la perdi.<br/>Tra l'altro, non puo essere cambiata senza dover creare un conto nuovo.<br/><br/>Una buona password (preferibilmente) è composta da almeno 8 caratteri, con almeno una maiuscola e un numero.", + "PSEUDO": "Un pseudonimo è utilizzato quando ti iscrivi come <span class=\"text-italic\">membro</span>. E sempre associato ad un portafoglio (con la sua <span class=\"text-italic\">chiave pubblica</span>).<br/>È pubblicato sulla rete perche gli altri membri possano identificarla, certificarla o invarle moneta. <br/> Lo pseudonimo deve essere unico nella rete (tra quelli utilizzati adesso e in passato)." + }, + "LOGIN": { + "SECTION": "Accedi", + "PUBKEY": "Chiave pubblica del conto", + "PUBKEY_DEF": "La chiave pubblica del portachiavi è generata dalle credenziali, ma non corrispode ad un conto già utilizzato.<br/><b>Accertati che tua chiave pubblica corrisponda al tuo conto</b>. Nel caso contrario, sarai conesso/a ad un conto probabilmente mai usato, datto che il rischio di collisione con un conto esistente è molto ridotto.<br/><a href=\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\" target=\"_ system\">Saperne di più sulla cryptografia </a> con chiave pubblica.", + "METHOD": "Metodi di connessione", + "METHOD_DEF": "Hai diverse opzioni per accedere ad un portafoglio:<br/> - Accedendo con <b>cifratura (leggera o sicura)</b> tua password sarà cifrata dal tuo identificativo segreto per scoraggiare tentativi di attacchi di 'brute force' (per esempio con passwords conosciute).<br/> - Accedendo con la <b>chiave pubblica</b> ti evita di dover digitare le tue credenziali che ti saranno chieste solo quando vorrai fare una operazione sul conto.<br/> - Accedendo <b>con un portachiavi</b> che leggerà le tue chiavi pubblica e privata da un file esterno, senza che tu li debba introdurre." }, - "READONLY": { - "BADGE": "Monit", - "MODE": "Modalità di monitoraggio", - "MODE_HELP": "Il cesio funziona in <b>modalità monitoraggio</b>: sono disponibili solo le funzionalità di monitoraggio della valuta.", - "INSTALL_HELP": "Se desidera <b>creare un account di portafoglio</b> per inviare o ricevere valuta, ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza." + "GLOSSARY": { + "SECTION": "Glossario", + "PUBKEY_DEF": "Una chiave pubblica permette di identificare un portafoglio. Puo anche identificare un membro. Nel Cesium è calcolata con la password e lo pseudonimo.", + "MEMBER": "Membro", + "MEMBER_DEF": "Un membro è una persona reale e viva, che desidera participare liberamente alla communità monetaria. Questo membro riceverà un Dividendo Universale, a secondo delle regole definite <span class=\"text-italic\">nei parametri della moneta</span>.", + "CURRENCY_RULES": "Regole della moneta", + "CURRENCY_RULES_DEF": "I parametri delle moneta sono state definite per sempre e per tutti. I parametri con i quali la moneta si comporta: il calcolo del Dividendo Universale, il numero di certificazioni necessarie per diventare membro, il numero massimo di certificazioni che un membro può inviare, etc.<br/><br/>I parametri non possono essere modificati perche c'è una<span class=\"text-italic\">Blockchain</span> che implementa ed esegue queste regole e verifica costantemente la loro applicazione. <a href=\"#/app/currency\">Vedere i parametri </a>.", + "BLOCKCHAIN": "Blockchain", + "BLOCKCHAIN_DEF": "La Blockchain è un sistema decentralizzato che, nel caso di Duniter, permette di rispettare e implementare <span class=\"text-italic\">le regole della moneta</span>.<br/><a href=\"http://en.duniter.org/presentation/\" target=\"_blank\">Saperne di più su Duniter</a> e il funzionamento della blockchain.", + "UNIVERSAL_DIVIDEND_DEF": "Il Dividendo Universale (DU) è la quantità di moneta cocreata da ogni membro, seguendo le formule matematiche definite nelle <span class=\"text-italic\">regole della moneta</span>.<br/>All'inizio di ogni periodo, il conto di ogni membro riceve una quantità uguale della nuova moneta creata. <br/><br/>Il DU prevede una crescita costante per rimanere equo nei confronti dei membri (attuali e passati). Viene calcolato tenendo in conto la speranza di vita media, cosi come dimostrato nella Teoria Relativa della Moneta (TRM).<br/><a href=\"http://trm.creationmonetaire.info\" target=\"_system\">Peraperne di più sulla TRM</a> e la moneta libera.", + "WOT": "Web of Trust (WoT)", + "WOT_DEF": "La Rete di Fiducia è costituita da tutti i membri della moneta libera, ed i collegamenti delle certificazioni che li collegano.", + "DISTANCE_RULE": "Regola della distanza", + "DISTANCE_RULE_DEF": "La regola della distanza definisce la <b>distanza massima da trovare</b> tra un candidato membro e un numero minimo di mebri referenti. Questa distanza è calcolata usando i collegamenti delle certificazioni." + }, + "TIP": { + "MENU_BTN_CURRENCY": "Menu che <b>{{'MENU.CURRENCY'|translate}}</b> permette la scoperta dei <b>parametri della moneta</b> e la sua condizione presente.", + "CURRENCY_WOT": "Il <b>numero di membri</b> mostra <b>le dimensioni della RdF e la sua evoluzione </b>.", + "CURRENCY_MASS": "In evidenza qui è <b>l'importo totale</b> attualmente in circolazione e la sua <b> ripartizione media </b> pro capite. <br/><br/>Questa cifra permette di avere un'idea <b>del valore di qualsiasi importo</b>, in base a quello che <b>hanno gli altri</b> sul loro conto (in media).", + "CURRENCY_UNIT_RELATIVE": "L'unità usata qui (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa che gli importi in {{currency|capitalize}} sono stati divisi dal <b>Dividendo Universale</b> (DU).<br/><br/><small>Questa unità relativa <b>ha senso</b> perche è stabile in contrasto con la massa monetaria che cresce costantemente.</small>", + "CURRENCY_CHANGE_UNIT": "Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette di <b>permutare unità</b> per vedere gli importi in <b>{{currency|capitalize}}</b>, non divisi dal Dividendo Universale (piuttosto che in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).", + "CURRENCY_CHANGE_UNIT_TO_RELATIVE": "Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette <b>di permutare unità</b> per vedere gli importi in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, che è relativo al Dividendo Universale (l'importo co-prodotto da ogni membro).", + "CURRENCY_RULES": "Le<b>regole</b> della moneta determinano il suo <b>esatto e previdibile</b> comportamento.<br/><br/> Considerate come il proprio DNA della moneta, queste regole rendono il codice monetario <b>trasparente e comprensibile</b>.", + "MENU_BTN_NETWORK": "Menu che<b>{{'MENU.NETWORK'|translate}}</b> permette la scopertà dello <b>stato della rete<b>.", + "NETWORK_BLOCKCHAIN": "Tutte le transazioni monetarie sono registrate in un <b>registro sicuro e a prova di manomissione</b>, spesso chiamato <b>blockchain</b>.", + "NETWORK_PEERS": "I <b>nodi</b> mostrati qui corrispondono a <b>dei computers che aggiornano e monitorano</b> la blockchain.<br/><br/>Più nodi ci sono, più <b>decentralizzata</b> e più affidabile diventa la moneta.", + "NETWORK_PEERS_BLOCK_NUMBER": "Questo <b>numero</b> (in verde) indica <b>l'ultimo blocco validato</b> dal nodo (ultima pagina scritta nel regitro).<br/><br/>Il verde indica che il blocco è stato validato anche dalla <b>maggioranza degli altri nodi</b>.", + "NETWORK_PEERS_PARTICIPATE": "<b>Ogni membro</b>, che dispone di un computer connesso a Internet <b>puo partecipare, aggiungendosi come nodo installando il software Duniter</b> (free/libre). <a target=\"_new\" href=\"{{installDocUrl}}\" target=\"_system\">Leggi il manuale d'installazione >></a>.", + "MENU_BTN_ACCOUNT": "<b>{{'ACCOUNT.TITLE'|translate}}</b> permette l'accesso al saldo del conto e la cronologia delle transazioni.", + "MENU_BTN_ACCOUNT_MEMBER": "Qui puoi consultare lo stato del tuo conto, la cronologia delle transazioni e le tue certificazioni.", + "WALLET_CERTIFICATIONS": "Clicca qui per vedere i dettagli delle tue certificazioni (date o ricevute).", + "WALLET_RECEIVED_CERTIFICATIONS": "Clicca qui per vedere i dettagli delle <b>certificazioni che hai ricevuto</b>.", + "WALLET_GIVEN_CERTIFICATIONS": "Clicca qui per vedere i dettagli delle <b>certificazioni che hai dato</b>.", + "WALLET_BALANCE": "Il <b>saldo</b> del tuo conto è visibile qui.", + "WALLET_BALANCE_RELATIVE": "{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unità utilizzata (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa che questo importo in {{currency|capitalize}} è stato diviso dal <b>Dividendo Universale</b> (DU) co-creato da ogni membro.<br/>Ad oggi, 1 DU equivale a {{currentUD}} {{currency|capitalize}}.", + "WALLET_BALANCE_CHANGE_UNIT": "Puoi <b>cambiare l'unità</b> in cui sono mostrati gli importi in <b><i class=\"icon ion-android-settings\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Per esempio, per mostrare gli importi <b>direttamente in {{currency|capitalize}}</b> piuttosto che in unità relativa.", + "WALLET_PUBKEY": "Questa è la chiave pubblica del tuo conto. La puoi dare ad un terzo perché possa identificare tuo conto.", + "WALLET_SEND": "Paghi in pochi clics.", + "WALLET_SEND_NO_MONEY": "Paghi in pochi clics.<br/>(Il tuo saldo ancora non lo permette)", + "WALLET_OPTIONS": "Questo bottone permette di fare <b>altre, meno frequenti azioni</b>.<br/><br/> Non dimenticarti di fare il tour guidato del Cesium quando hai un attimo!", + "WALLET_RECEIVED_CERTS": "Questo mostra l'elenco delle persone che ti hanno fatto entrare nella RdF.", + "WALLET_CERTIFY": "Questo bottone <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permette di selezionare e certificare una identità.<br/><br/>Solo gli utenti <b>che sono già membri</b> possono certificare gli altri.", + "WALLET_CERT_STOCK": "Il tuo stock di certificazioni da dare è limitato a <b>{{sigStock}} certificazioni</b>.<br/><br/>Questo stock si rifornisce con il tempo, man mano che le certificazioni inviate scadono.", + "MENU_BTN_WALLETS": "Il menu <b>{{'MENU.WALLETS'|translate}}</b> ti permette aggiungere portafogli addizionali che amministri.", + "MENU_BTN_TX": "<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.", + "MENU_BTN_WOT": "Il menu<b>{{'MENU.WOT'|translate}}</b> permette di cercare <b>utenti</b> della moneta (membri o non).", + "WOT_SEARCH_TEXT_XS": "Per fare una ricerca nella rubrica, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>La ricerca inizierà automaticamente.", + "WOT_SEARCH_TEXT": "Per cercare nella rubrica, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>Dopodichè premi <b>Invio</b> per avviare la ricerca.", + "WOT_SEARCH_RESULT": "Visualizza la scheda dettagliata di un utente con un semplice click sulla linea.", + "WOT_VIEW_CERTIFICATIONS": "La linea <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> mostra quanti membri hanno certificato questa identità.<br/><br/>Queste certificazioni dimostrano che il conto appartiene ad <b>una persona viva</b> e che questa persona non ha <b>nessun altro conto membro</b>.", + "WOT_VIEW_CERTIFICATIONS_COUNT": "Ci vogliono almeno <b>{{sigQty}} certificazioni</b> per diventare membro e cocreare il <b>Dividendo Universale</b>.", + "WOT_VIEW_CERTIFICATIONS_CLICK": "Clicca qui per aprire <b>una lista di tutte le certificazioni</b> ricevute e date da questa identità.", + "WOT_VIEW_CERTIFY": "Il bottone <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permette di aggiungere la tua certificazione a questa identità.", + "CERTIFY_RULES": "<b>Attenzione:</b> Certifica <b>solo persone reali e vive</b> che non hanno nessun altro conto membro.<br/><br/>L'affidabilità della moneta dipende della vigilanza di ciascuno.", + "MENU_BTN_SETTINGS": "Le <b>{{'MENU.SETTINGS'|translate}}</b> ti permettono di configurare il Cesium.<br/><br/>Per esempio, puoi <b>cambiare l'unità</b> in cui visualizzi la moneta.", + "HEADER_BAR_BTN_PROFILE": "Clicca qui per entrare nel <b>tuo profilo utente</b>", + "SETTINGS_CHANGE_UNIT": "Puoi cambiare <b>l'unità</b> della moneta cliccando qui.<br/><br/>- Disabilita questa opzione per vedere gli importi in {{currency|capitalize}}.<br/>- Abilita l'opzione per importi relativi in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divisi</b> dal attuale Dividendo Universale).", + "END_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Benvenuto nel <b>economia libera</b>!", + "END_NOT_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Rete di Fiducia {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto.", + "END_READONLY": "Il tour guidato <b>è finito</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}." } }, - "DOWNLOAD": { - "POPUP_TITLE": "<b>File di cancellazione dell'identità/b>", - "POPUP_REVOKE_MESSAGE": "Per migliorare la sicurezza del tuo conto, scarica <b>il documento di revoca del conto</b>. Ti consentirà di revocare tuo conto (nel caso di violazione del conto, della tua identità, conto creato con errori, etc.).<br/><br/><b>Tiene questo document al sicuro.</b>" + "API" :{ + "COMMON": { + "LINK_DOC": "documentazione API", + "LINK_DOC_HELP": "Documentazione dello sviluppatore", + "LINK_STANDARD_APP": "versione classica", + "LINK_STANDARD_APP_HELP": "Apri la versione classica di {{'COMMON.APP_NAME'|translate}}", + "CONNECTION_ERROR": "Nodo <b>{{server}}</b>irraggiungibile o indirizzo invalido.<br/><br/>Controlla la tua connessione a Internet, o contatta con l'amministratore della pàgina web." }, - "HELP": { - "TITLE": "Aiuto online", - "JOIN": { - "SECTION": "Entrare nella rete", - "SALT": "Il tuo identificativo segreto è molto importante. E utilizzato per cryptare tua password che permette poi di calcolare tua <span class=\"text-italic\">chiave pubblica</span> (suo numero) è la chiave privata che ne consenta l'accesso.<br/><b>Ricordati bene di questo identificativo</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiato senza dover creare un conto nuovo.<br/><br/>Raccomandiamo che sia abbastanza lungo (8 caratteri almeno) è il più originale possibile. (buona entropia)", - "PASSWORD": "La password è molto importante, è utilizzata per calcolare tuo numero di conto (tua chiave pubblica) e la chiave privata che ne consento l'accesso.<br/><b>Ricordatila bene</b>, perche non ti potrà aiutare nessuno se lo perdi.<br/>Tra l'altro, non puo essere cambiata senza dover creare un conto nuovo.<br/><br/>Una buona password (preferibilmente) è composta da almeno 8 caratteri, con almeno una maiuscola e un numero.", - "PSEUDO": "Un pseudonimo è utilizzato quando ti iscrivi come <span class=\"text-italic\">membro</span>. E sempre associato ad un portafoglio (con sua <span class=\"text-italic\">chiave pubblica</span>).<br/>E pubblicato sulla rete perche gli altri membri possino identificarla, certificarla o invarle soldi. <br/> Lo pseudonimo deve essere unico nella rete (tra quelli utilizzati adesso e in passato)." - }, - "LOGIN": { - "SECTION": "Accedi", - "PUBKEY": "Chiave pubblica del conto", - "PUBKEY_DEF": "La chiave pubblica del portachiavi è generata dai credenziali, ma non corrispode ad un conto già utilizzato.<br/><b>Accertati che tua chiave pubblica corrisponda al tuo conto</b>. Nel caso contrario, sarai conesso/a ad un conto probabilmente mai usato, datto che il rischio di collisione con un conto esistente è molto ridotto.<br/><a href=\"https://en.wikipedia.org/wiki/Elliptic_curve_cryptography\" target=\"_ system\">Saperne di più sulla cryptografia </a> con chiave pubblica.", - "METHOD": "Metodi di connessione", - "METHOD_DEF": "Hai diverse opzioni per accedere ad un portafoglio:<br/> - Accedendo con <b>salatura (leggera o sicura)</b> tua password sarà cryptata dal tuo identificativo segreto per scoraggiare tentativi di attachi di 'brute force' (per esempio con passwords conosciute).<br/> - Accedendo con la <b>chiave pubblica</b> ti evita di dover digitare tuoi credenziali che ti saranno chiesti solo quando vorrai fare una operazione col conto.<br/> - Accedendo <b>con un portachiavi</b> che leggerà tue chiave pubbliche e private da un file esterno, senza che tu li debba entrare." + "HOME": { + "TITLE": "Documentazione API {{'COMMON.APP_NAME'|translate}}", + "MESSAGE": "Benvenuto alla <b>documentazione dell'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connettiti alla pagina web <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> molto facilmente!", + "MESSAGE_SHORT": "Connettiti alla pagina web <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> molto facilmente!", + "DOC_HEADER": "Servizi disponibili:" + }, + "TRANSFER": { + "TITLE": "{{'COMMON.APP_NAME'|translate}} - Pagamento online", + "TITLE_SHORT": "Pagamento online", + "SUMMARY": "Riepilogo dell'ordine:", + "AMOUNT": "Importo:", + "AMOUNTS_HELP": "Per favore selezioni l'importo:", + "NAME": "Nome :", + "PUBKEY": "Chiave pubblica del destinatario:", + "COMMENT": "Riferimento dell'ordine:", + "NODE": "Indirizzo del nodo", + "DEMO": { + "SALT": "demo", + "PASSWORD": "demo", + "PUBKEY": "3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1", + "HELP": "<b>Modo dimostrativo</b>: Nessun pagamento sarà realmente inviato con questa simulazione.<br/>Per favore usa le credenziali: <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>", + "BAD_CREDENTIALS": "Credenziali non valide.<br/>In modalità demo, le credenziali sono: {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}" }, - "GLOSSARY": { - "SECTION": "Glossario", - "PUBKEY_DEF": "Una chiave pubblica permette di identificare un portafoglio. Puo anche identificare un membro. In Cesium è calcolata con la password e lo pseudonimo.", - "MEMBER": "Membro", - "MEMBER_DEF": "Un membro è una persona reale e viva, che desidera participare liberamente alla communità monetaria. Questo membro riceverà un Dividendo Universale, a secondo delle regole definite <span class=\"text-italic\">nei parametri della moneta</span>.", - "CURRENCY_RULES": "Regole della moneta", - "CURRENCY_RULES_DEF": "I parametri delle moneta sono state definite per sempre e per tutti. I parametri con i quali la moneta si comporta: il calcolo del Dividendo Universale, il numero di certificazioni necessarie per diventare membro, il numero massimo di certificazioni che un membro puo inviare, etc.<br/><br/>I parametri non possono essere modificati perche c'è una<span class=\"text-italic\">Blockchain</span> che implementa e esegue queste regole e verifica costantemente la loro applicazione. <a href=\"#/app/currency\">Vedere i parametri </a>.", - "BLOCKCHAIN": "Blockchain", - "BLOCKCHAIN_DEF": "La Blockchain è un sistema decentralizzato che, nel caso di Duniter, permette di rispettare e implementare <span class=\"text-italic\">le regole della moneta</span>.<br/><a href=\"http://en.duniter.org/presentation/\" target=\"_blank\">Saperne di più su Duniter</a> e il funzionamento della blockchain.", - "UNIVERSAL_DIVIDEND_DEF": "Il Dividendo Universale (UD) è la quantità di moneta co-creata da ogni membro, seguendo le formule mathematiche definite nelle <span class=\"text-italic\">regole della moneta</span>.<br/>Al inizio di ogni periodo, il conto di ogni membro riceve una quantità uguale della nuova moneta creata. <br/><br/>Il DU conosce una crescita costante per rimanere equo nei confronti dei membri (attuali e passati). Viene calcolato tenendo in conto la speranza di vità media, cosi come dimostrato nella Teoria Relativa della Moneta (TRM).<br/><a href=\"http://trm.creationmonetaire.info\" target=\"_system\">Saperne di più sulla TRM</a> e la moneta libera." + "INFO": { + "SUCCESS_REDIRECTING_WITH_NAME": "Pagamento inviato.<br/>Ridirigendo a <b>{{name}}</b>...", + "SUCCESS_REDIRECTING": "Pagamento inviato.<br/>Ridirigendo al sito del venditore...", + "CANCEL_REDIRECTING_WITH_NAME": "Pagamento annullato.<br/>Ridirigendo a<b>{{name}}</b>...", + "CANCEL_REDIRECTING": "Pagamento annullato.<br/>Ridirigendo al sito del venditore..." }, - "TIP": { - "MENU_BTN_CURRENCY": "Menu <b>{{'MENU.CURRENCY'|translate}}</b> permette la scoperta dei <b>parametri della moneta</b> e la sua condizione presente.", - "CURRENCY_WOT": "Il <b>numero di membri</b> mostra <b>le dimensioni della WoT e la sua evoluzione </b>.", - "CURRENCY_MASS": "In evidenza qui è <b>l'importo totale</b> attualmente in circolazione e la sua <b> ripartizione media </b> a testa.<br/><br/>Questa cifra permette di avere un'idea <b>del valore di qualsiasi importo</b>, in base a quello <b>hanno gli altri</b> sul loro conto (in media).", - "CURRENCY_UNIT_RELATIVE": "L'unità usata qui (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa che gli importi in {{currency|capitalize}} sono stati divisi dal <b>Dividendo Universale</b> (DU).<br/><br/><small>Questa unità relativa <b>ha senso</b> perche è stabile in contrasto con la massa monetaria che cresce costantemente.</small>", - "CURRENCY_CHANGE_UNIT": "Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette di <b>permutare unità</b> per vedere gli importi in <b>{{currency|capitalize}}</b>, non divisi dal Dividendo Universale (piuttosto che in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”).", - "CURRENCY_CHANGE_UNIT_TO_RELATIVE": "Questa opzione <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permette <b>di permutare unità</b> per vedere gli importi in “<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”, che è relativo al Dividendo Universale (l'importo co-prodotto da ogni membro).", - "CURRENCY_RULES": "Le<b>regole</b> della moneta determinano il suo <b>esatto e previdibile</b> comportamento.<br/><br/> Considerate come il proprio DNA della moneta, queste regole rendono il codice monetario <b>trasparente e comprensibile</b>.", - "MENU_BTN_NETWORK": "Menu <b>{{'MENU.NETWORK'|translate}}</b> permette la scopertà dello <b>stato della rete<b>.", - "NETWORK_BLOCKCHAIN": "Tutte le transazioni monetarie sono registrate in <b>registro sicuro e a prova di manomissione</b>, spesso chiamato <b>blockchain</b>.", - "NETWORK_PEERS": "I<b>peers</b> mostrati qui corrispondono a <b>dei computers che aggiornano e monitorano</b> la blockchain.<br/><br/>Più peers ci sono, più <b>decentralizzata</b> e più affidabile diventa la moneta.", - "NETWORK_PEERS_BLOCK_NUMBER": "Questo <b>numero</b> (in verda) indica <b>l'ultimo blocco validato</b> dal peer (ultima pagina scritta nel regitro).<br/><br/>Il verda indica che il blocco è stato validato anche dalla <b>maggioranza degli altri peers</b>.", - "NETWORK_PEERS_PARTICIPATE": "<b>Ogni membro</b>, che dispone di un computer connesso a Internet <b>puo partecipare, aggiungendosi come peer installando il software Duniter</b> (free/libre). <a target=\"_new\" href=\"{{installDocUrl}}\" target=\"_system\">Leggi il manuale d'installazione >></a>.", - "MENU_BTN_ACCOUNT": "<b>{{'ACCOUNT.TITLE'|translate}}</b> permette l'accesso al saldo del conto e la cronologia delle transazioni.", - "MENU_BTN_ACCOUNT_MEMBER": "Qui puoi consultare lo stato del tuo conto, la cronologia delle transazioni e le tue certificazioni.", - "WALLET_CERTIFICATIONS": "Clicca qui per vedere i dettagli delle tue certificazioni (date o ricevute).", - "WALLET_RECEIVED_CERTIFICATIONS": "Clicca qui per vedere i dettagli delle <b>certificazioni che hai ricevuto</b>.", - "WALLET_GIVEN_CERTIFICATIONS": "Clicca qui per vedere i dettagli delle <b>certificazioni che hai date</b>.", - "WALLET_BALANCE": "Il <b>soldo</b> del tuo conto è visibile qui.", - "WALLET_BALANCE_RELATIVE": "{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unità utilizzata (“<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>”) significa che questo importo in {{currency|capitalize}} è stato diviso dal <b>Dividendo Universale</b> (DU) co-creato da ogni membro.<br/>Ad oggi, 1 DU equivale a {{currentUD}} {{currency|capitalize}}.", - "WALLET_BALANCE_CHANGE_UNIT": "Puoi <b>cambiare l'unità</b> in cui sono mostrati gli importi in <b><i class=\"icon ion-android-settings\"></i> {{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Per esempio, per mostrare gli importi <b>direttamente in {{currency|capitalize}}</b> piuttosto che in unità relativa.", - "WALLET_PUBKEY": "Questa è la chiave pubblica del tuo conto. La puoi dare ad un terzo perche possa identificare tuo conto.", - "WALLET_SEND": "Paghi in pochi clics.", - "WALLET_SEND_NO_MONEY": "Paghi in pochi clics.<br/>(Tuo saldo ancora non lo permette)", - "WALLET_OPTIONS": "Questo bottone permette di fare <b>altre, meno frequenti azioni</b>.<br/><br/> Non dimenticarti di fare il tour guidato di Cesium quando hai un attimo!", - "WALLET_RECEIVED_CERTS": "Questo mostra l'elenco delle persone che ti hanno fatto entrare nella WoT.", - "WALLET_CERTIFY": "Questo bottone <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permette di selezionare e certificare una identità.<br/><br/>Solo gli utenti <b>che sono già membri</b> possono certificare gli altri.", - "WALLET_CERT_STOCK": "Tuo stock di certificazioni da dare è limitato a <b>{{sigStock}} certificazioni</b>.<br/><br/>Questo stock si rifornisce col tempo, man mano che le certificazioni inviate scadono.", - "MENU_BTN_TX": "<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.", - "MENU_BTN_WOT": "Il menu<b>{{'MENU.WOT'|translate}}</b> permette di cercare <b>utenti</b> della moneta (membri o non).", - "WOT_SEARCH_TEXT_XS": "Per fare una ricerca nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>La ricerca inizierà automaticamente.", - "WOT_SEARCH_TEXT": "Per cercare nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>Dopodichè calca <b>Enter</b> per avviare la ricerca.", - "WOT_SEARCH_RESULT": "Visualizza la scheda dettagliata di un utente con un semplice click sulla linea.", - "WOT_VIEW_CERTIFICATIONS": "La linea <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> mostra quanti membri hanno certificato questa identità.<br/><br/>Queste certificazioni dimostrano che il conto appartiene ad <b>una persona viva</b> e che questa persona non ha <b>nessun altro conto membro</b>.", - "WOT_VIEW_CERTIFICATIONS_COUNT": "Ci vogliono almeno <b>{{sigQty}} certificazioni</b> per diventare membro e co-produrre il <b>Dividendo Universale</b>.", - "WOT_VIEW_CERTIFICATIONS_CLICK": "Clicca qui per aprire <b>una lista di tutte le certificazioni</b> ricevute e date da questa identità.", - "WOT_VIEW_CERTIFY": "Il bottone <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permette di aggiungere tua certificazione a questa identità.", - "CERTIFY_RULES": "<b>Attenzione:</b> Certifichi <b> solo persone reali e vive</b> che non hanno nessun altro conto membro.<br/><br/>L'affidabilità della moneta dipende della vigilanza di ciascuno.", - "MENU_BTN_SETTINGS": "Les <b>{{'MENU.SETTINGS'|translate}}</b> ti permettono di configurare Cesium.<br/><br/>Per esempio, puoi <b>cambiare l'unità</b> in cui visualizzi la moneta.", - "HEADER_BAR_BTN_PROFILE": "Clicca qui per entrare nel <b>tuo profilo utente</b>", - "SETTINGS_CHANGE_UNIT": "Puoi cambiare <b>l'unità</b> della moneta cliccando qui.<br/><br/>- Disabilita questa opzione per vedere gli importi in {{currency|capitalize}}.<br/>- Abilita l'opzione per importi relativi in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divisi</b> dal attuale Dividendo Universale).", - "END_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Benvenuto nel <b>economia libera</b>!", - "END_NOT_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Web of Trust {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto.", - "END_READONLY": "Il tour guidato <b>è finito</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}." + "ERROR": { + "TRANSFER_FAILED": "Mancato pagamento" } }, - "API" :{ - "COMMON": { - "LINK_DOC": "documentazione API", - "LINK_DOC_HELP": "Documentazione dello sviluppatore", - "LINK_STANDARD_APP": "versione classica", - "LINK_STANDARD_APP_HELP": "Apri la versione classica di {{'COMMON.APP_NAME'|translate}}" - }, - "HOME": { - "TITLE": "Documentazione API {{'COMMON.APP_NAME'|translate}}", - "MESSAGE": "Bienvenue dans la <b>documentation de l'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connecter vos sites web à <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> très simplement !", - "MESSAGE_SHORT": "Connecter vos sites à <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> très simplement !", - "DOC_HEADER": "Services disponibles :" - }, - "TRANSFER": { - "TITLE": "{{'COMMON.APP_NAME'|translate}} - Paiement en ligne", - "TITLE_SHORT": "Pagamento online", - "SUMMARY": "Récapitulatif de la commande :", - "AMOUNT": "Montant :", - "NAME": "Nom :", - "PUBKEY": "Clé publique du destinaire :", - "COMMENT": "Référence de la commande :", - "DEMO": { - "SALT": "demo", - "PASSWORD": "demo", - "PUBKEY": "3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1", - "HELP": "<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>", - "BAD_CREDENTIALS": "Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}" - }, - "INFO": { - "SUCCESS_REDIRECTING_WITH_NAME": "Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...", - "SUCCESS_REDIRECTING": "Paiement envoyé.<br/>Redirection vers le site du vendeur...", - "CANCEL_REDIRECTING_WITH_NAME": "Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...", - "CANCEL_REDIRECTING": "Paiement annulé.<br/>Redirection vers le site du vendeur..." - }, - "ERROR": { - "TRANSFER_FAILED": "Mancato pagamento" - } - }, - "DOC": { - "DESCRIPTION_DIVIDER": "Descrizione", - "URL_DIVIDER": "Indirizzo chiamata", - "PARAMETERS_DIVIDER": "Impostazioni", - "AVAILABLE_PARAMETERS": "Ecco l'elenco dei parametri disponibili :", - "DEMO_DIVIDER": "Provare", - "DEMO_HELP": "Per provare questo servizio, clicca sul bottone qui a fianco. Il risultato apparirà qui sotto .", - "DEMO_RESULT": "Risultato della chiamata :", - "DEMO_SUCCEED": "<i class=\"icon ion-checkmark\"></i> Successo !", - "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Annulato dal utente", - "INTEGRATE_DIVIDER": "Integrare", - "INTEGRATE_CODE": "Codice :", - "INTEGRATE_RESULT": "Previsualizzare il risultato :", - "INTEGRATE_PARAMETERS": "Parametri", - "TRANSFER": { - "TITLE": "Pagamenti", - "DESCRIPTION": "Da un sito (per es. : un sito e-commerce) si può delegare il pagamento in moneta libera a Cesium API. Per invocare l'API, basta innescare l'apertura di una pagina con questo indirizzo:", - "PARAM_PUBKEY": "Chiave pubblica del destinatario", - "PARAM_PUBKEY_HELP": "Chiave pubblica del destinatario (obliggatoria)", - "PARAM_AMOUNT": "Importo", - "PARAM_AMOUNT_HELP": "Importo della transazione (obligatorio)", - "PARAM_COMMENT": "Riferimento (o commento)", - "PARAM_COMMENT_HELP": "Riferimento o commento. Ti può aiutare per esempio a trovare tuo pagamento nella blockchain.", - "PARAM_NAME": "Nome (de destinatario o del sito web)", - "PARAM_NAME_HELP": "Nom del sito web o del destinatario chiamando l'API. Può essere un nome leggibile (\"Mio sito\"), oppure l'indirizzo http del sito (\"MioSito.com\").", - "PARAM_REDIRECT_URL": "Indirizzo web di redirezione", - "PARAM_REDIRECT_URL_HELP": "Indirizzo web (URL) di redirezione, chiamato dopo aver inviato il pagamento. Può includere le seguenti stringe, che saranno sostituite con i valori della transazione : \"{tx}\", \"{hash}\", \"{comment}\", \"{amount}\" e {pubkey}.", - "PARAM_CANCEL_URL": "Indirizzo web della cancellazione", - "PARAM_CANCEL_URL_HELP": "Indirizzo web (URL) in caso dell'annullamento del pagamento dall'utente. Può includere le seguenti stringe, che saranno sostituite dinamicamente : \"{comment}\", \"{amount}\" e {pubkey}.", - "EXAMPLES_HELP": "Ecco esempi di integrazione :", - "EXAMPLE_BUTTON": "Bottone HTML", - "EXAMPLE_BUTTON_DEFAULT_TEXT": "Pagare in {{currency|currencySymbol}}", - "EXAMPLE_BUTTON_DEFAULT_STYLE": "Stile personnalizzato", - "EXAMPLE_BUTTON_TEXT_HELP": "Testo del bottone", - "EXAMPLE_BUTTON_BG_COLOR": "Colore del fondo", - "EXAMPLE_BUTTON_BG_COLOR_HELP": "Per esempio: #fbc14c, black, lightgrey, rgb(180,180,180)", - "EXAMPLE_BUTTON_FONT_COLOR": "Colore del testo", - "EXAMPLE_BUTTON_FONT_COLOR_HELP": "Esempio: black, orange, rgb(180,180,180)", - "EXAMPLE_BUTTON_TEXT_ICON": "Icona", - "EXAMPLE_BUTTON_TEXT_WIDTH": "Larghezza", - "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "Esempio: 200px, 50%", - "EXAMPLE_BUTTON_ICON_NONE": "Nessuna", - "EXAMPLE_BUTTON_ICON_DUNITER": "Logo Duniter", - "EXAMPLE_BUTTON_ICON_CESIUM": "Logo Cesium", - "EXAMPLE_BUTTON_ICON_G1_COLOR": "Logo Ğ1", - "EXAMPLE_BUTTON_ICON_G1_BLACK": "Logo Ğ1 (nero)" - } - } - } + "DOC": { + "DESCRIPTION_DIVIDER": "Descrizione", + "URL_DIVIDER": "Indirizzo chiamata", + "PARAMETERS_DIVIDER": "Impostazioni", + "AVAILABLE_PARAMETERS": "Ecco l'elenco dei parametri disponibili :", + "DEMO_DIVIDER": "Provare", + "DEMO_HELP": "Per provare questo servizio, clicca sul bottone qui a fianco. Il risultato apparirà qui sotto .", + "DEMO_RESULT": "Risultato della chiamata:", + "DEMO_RESULT_PEER": "Indirizzo del nodo usato:", + "DEMO_SUCCEED": "<i class=\"icon ion-checkmark\"></i> Successo!", + "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Annulato dall'utente", + "INTEGRATE_DIVIDER": "Integrare", + "INTEGRATE_CODE": "Codice:", + "INTEGRATE_RESULT": "Previsualizzare il risultato:", + "INTEGRATE_PARAMETERS": "Parametri", + "TRANSFER": { + "TITLE": "Pagamenti", + "DESCRIPTION": "Da un sito (per es.: un sito di e-commerce) si può delegare il pagamento in moneta libera a Cesium API. Per invocare l'API, basta innescare l'apertura di una pagina con questo indirizzo:", + "PARAM_PUBKEY": "Chiave pubblica del destinatario", + "PARAM_PUBKEY_HELP": "Chiave pubblica del destinatario (obbligatoria)", + "PARAM_AMOUNT": "Importo", + "PARAM_AMOUNT_HELP": "Importo della transazione (obbligatorio)", + "PARAM_COMMENT": "Riferimento (o commento)", + "PARAM_COMMENT_HELP": "Riferimento o commento. Ti può aiutare per esempio a trovare tuo pagamento nella blockchain.", + "PARAM_NAME": "Nome (del destinatario o del sito web)", + "PARAM_NAME_HELP": "Nome del sito web o del destinatario chiamando l'API. Può essere un nome leggibile (\"Mio sito\"), oppure l'indirizzo http del sito (\"MioSito.com\").", + "PARAM_REDIRECT_URL": "Indirizzo web di ridirezione", + "PARAM_REDIRECT_URL_HELP": "Indirizzo web (URL) di ridirezione, chiamato dopo aver inviato il pagamento. Può includere le seguenti stringe, che saranno sostituite con i valori della transazione : \"{tx}\", \"{hash}\", \"{comment}\", \"{amount}\" e {pubkey}.", + "PARAM_CANCEL_URL": "Indirizzo web della cancellazione", + "PARAM_CANCEL_URL_HELP": "Indirizzo web (URL) in caso dell'annullamento del pagamento dall'utente. Può includere le seguenti stringe, che saranno sostituite dinamicamente : \"{comment}\", \"{amount}\" e {pubkey}.", + "PARAM_PREFERRED_NODE": "Nodo Duniter preferito", + "PARAM_PREFERRED_NODE_HELP": "Indirizzo del nodo (URL) da usare preferibilmente (\"g1.domain.com:443\" or \"https://g1.domain.com\")", + "EXAMPLES_HELP": "Alcuni esempi di integrazione :", + "EXAMPLE_BUTTON": "Bottone HTML", + "EXAMPLE_BUTTON_DEFAULT_TEXT": "Pagare in {{currency|currencySymbol}}", + "EXAMPLE_BUTTON_DEFAULT_STYLE": "Stile personalizzato", + "EXAMPLE_BUTTON_TEXT_HELP": "Testo del bottone", + "EXAMPLE_BUTTON_BG_COLOR": "Colore del fondo", + "EXAMPLE_BUTTON_BG_COLOR_HELP": "Per esempio: #fbc14c, black, lightgrey, rgb(180,180,180)", + "EXAMPLE_BUTTON_FONT_COLOR": "Colore del testo", + "EXAMPLE_BUTTON_FONT_COLOR_HELP": "Esempio: black, orange, rgb(180,180,180)", + "EXAMPLE_BUTTON_TEXT_ICON": "Icona", + "EXAMPLE_BUTTON_TEXT_WIDTH": "Larghezza", + "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "Esempio: 200px, 50%", + "EXAMPLE_BUTTON_ICON_NONE": "Nessuna", + "EXAMPLE_BUTTON_ICON_DUNITER": "Logo Duniter", + "EXAMPLE_BUTTON_ICON_CESIUM": "Logo Cesium", + "EXAMPLE_BUTTON_ICON_G1_COLOR": "Logo Ğ1", + "EXAMPLE_BUTTON_ICON_G1_BLACK": "Logo Ğ1 (nero)" + } + } + } } diff --git a/www/i18n/locale-nl-NL.json b/www/i18n/locale-nl-NL.json index bc5a3a7131c5f6a54b8d605bf054bd850c22c585..977828b1077d78fa1bf80a5cc0cbf4ec242be28e 100644 --- a/www/i18n/locale-nl-NL.json +++ b/www/i18n/locale-nl-NL.json @@ -493,6 +493,7 @@ "EMPTY_TX_HISTORY": "Aucune operatie à exporteur" }, "CONFIRM": { + "CAN_CONTINUE": "<b>Weet je zeker</b> dat je door wil gaan?", "POPUP_TITLE": "<b>Bevestiging</b>", "POPUP_WARNING_TITLE": "<b>Waarschuwing</b>", "CERTIFY_RULES_TITLE_UID": "Certificeer {{uid}}", @@ -501,7 +502,7 @@ "MEMBERSHIP_OUT": "<b>Waarschuwing</b>:<br/>Je staat op het punt je lidmaatschap te beëindigen. Dit kan <b>niet ongedaan</b> worden gemaakt.<br/></br/><b>Weet je zeker dat je door wil gaan?</b>", "LOGIN_UNUSED_WALLET_TITLE": "Typefout?", "LOGIN_UNUSED_WALLET": "Je bent ingelogged op een rekening die <b>inactief</b> lijkt te zijn.<br/><br/>Als deze rekening niet met de jouwe overeenkomt, komt dat waarschijnlijk door een <b>typefout</b> bij het inloggen.<br/><br/><b>Wilt u toch doorgaan met deze rekening?</b>", - "FIX_IDENTITY": "De pseudoniem <b>{{uid}}</b> zal opnieuw gepubliceerd worden, waarmee de oude verlopen publicatie wordt vervangen.<br/></br/><bWeet je zeker</b> dat je door wil gaan?", + "FIX_IDENTITY": "De pseudoniem <b>{{uid}}</b> zal opnieuw gepubliceerd worden, waarmee de oude verlopen publicatie wordt vervangen.<br/></br/><b>Weet je zeker</b> dat je door wil gaan?", "FIX_MEMBERSHIP": "Je verzoek to lidmaatschap zal verstuurd worden.<br/></br/><b>Weet je het zeker?</b>", "RENEW_MEMBERSHIP": "Je lidmaatschap zal verlengd worden.<br/></br/><b>Weet je het zeker?</b>", "REVOKE_IDENTITY": "<b>Beveiligingswaarschuwing:</b><br/>You will <b>definitely revoke this identity</b>.<br/><br/>The public key and the associated nickname <b>will never be used again</b> (for a member account).<br/></br/><b>Are you sure</b> you want to continue?", diff --git a/www/img/flag-ca.png b/www/img/flag-ca.png new file mode 100644 index 0000000000000000000000000000000000000000..50ba903b2c94ce278ff0d9523251bf6ea7653684 Binary files /dev/null and b/www/img/flag-ca.png differ diff --git a/www/index.html b/www/index.html index 46371efd7619b330b10b4d6e1f6c2f9c6487083f..6531e759b0583f7185e908104b42c20e89398ca9 100644 --- a/www/index.html +++ b/www/index.html @@ -80,6 +80,8 @@ <script src="lib/socket.io-client/dist/socket.io.min.js"></script> <script src="lib/underscore/underscore-min.js"></script> <script src="lib/chart.js/dist/Chart.min.js"></script> + <script src="lib/jdenticon/dist/jdenticon.min.js"></script> + <!-- ionic/angular js --> <script src="lib/ionic/js/ionic.min.js"></script> @@ -233,6 +235,7 @@ <script src="dist/dist_js/plugins/es/js/controllers/subscription-controllers.js"></script> <script src="dist/dist_js/plugins/es/js/controllers/document-controllers.js"></script> <script src="dist/dist_js/plugins/es/js/controllers/like-controllers.js"></script> + <script src="dist/dist_js/plugins/es/js/controllers/admin-controllers.js"></script> <!-- Graph plugin --> <script src="dist/dist_js/plugins/graph/js/plugin.js"></script> diff --git a/www/js/config.js b/www/js/config.js index 0027636ef2017dcd29ec16061c4429d103dbd6b8..65cd59ff1997d67858b31ea980c4a3a2b4be9ec4 100644 --- a/www/js/config.js +++ b/www/js/config.js @@ -70,14 +70,6 @@ angular.module("cesium.config", []) "host": "g1.presles.fr", "port": 443 }, - { - "host": "g1.le-sou.org", - "port": 443 - }, - { - "host": "duniter.normandie-libre.fr", - "port": 443 - }, { "host": "g1.duniter.org", "port": 443 @@ -101,10 +93,6 @@ angular.module("cesium.config", []) "host": "g1.data.presles.fr", "port": 443 }, - { - "host": "g1.data.le-sou.org", - "port": 443 - }, { "host": "g1.data.mithril.re", "port": 443 @@ -119,8 +107,8 @@ angular.module("cesium.config", []) "defaultCountry": "France" } }, - "version": "1.6.12", - "build": "2021-03-03T20:44:36.248Z", + "version": "1.7.0-rc1", + "build": "2022-05-19T22:57:43.774Z", "newIssueUrl": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new" }) diff --git a/www/js/controllers/settings-controllers.js b/www/js/controllers/settings-controllers.js index 0239a70f41783582505d17b80b4a3610a53e0f51..2e7082d320823934a709cf34bdd4b77e1c334098 100644 --- a/www/js/controllers/settings-controllers.js +++ b/www/js/controllers/settings-controllers.js @@ -291,6 +291,9 @@ function SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $ti // Applying csSettings.apply($scope.formData); + // Applying UI effect + UIUtils.setEffects($scope.formData.uiEffects); + // Store return csSettings.store(); diff --git a/www/js/controllers/wallet-controllers.js b/www/js/controllers/wallet-controllers.js index 9f9efad676c8326808bf2e7f959701b58fcac998..40a5bcd7ffbddee5fcfdb8be7c03be76a56aecde 100644 --- a/www/js/controllers/wallet-controllers.js +++ b/www/js/controllers/wallet-controllers.js @@ -103,7 +103,7 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state, return wallet.login() .then(function(walletData) { $scope.formData = walletData; - $scope.loading=false; // very important, to avoid TX to be display before wallet.currentUd is loaded + $scope.loading = false; // very important, to avoid TX to be display before wallet.currentUd is loaded $scope.updateView(); $scope.addListeners(); diff --git a/www/js/controllers/wot-controllers.js b/www/js/controllers/wot-controllers.js index 4f109795863360d862e3fc27cc79ae9892c4fcfc..b7d9cd2c2b31cfbaa38f359d0c9eae164a11a8f6 100644 --- a/www/js/controllers/wot-controllers.js +++ b/www/js/controllers/wot-controllers.js @@ -162,7 +162,7 @@ angular.module('cesium.wot.controllers', ['cesium.services']) ; function WotLookupController($scope, $state, $q, $timeout, $focus, $location, $ionicPopover, $ionicHistory, - UIUtils, csConfig, csCurrency, csSettings, Device, BMA, csWallet, csWot) { + UIUtils, csConfig, csCurrency, csSettings, Device, BMA, csWallet, csWot, csCrypto) { 'ngInject'; var defaultSearchLimit = 10; @@ -204,13 +204,13 @@ function WotLookupController($scope, $state, $q, $timeout, $focus, $location, $i $scope.doGetPending(0, undefined, true/*skipLocationUpdate*/); } // get new comers - else if (params.type == 'newcomers' || (!csConfig.initPhase && !params.type)) { + else if (params.type === 'newcomers' || (!csConfig.initPhase && !params.type)) { $scope.doGetNewcomers(0, undefined, true/*skipLocationUpdate*/); } - else if (params.type == 'pending') { + else if (params.type === 'pending') { $scope.doGetPending(0, undefined, true/*skipLocationUpdate*/); } - else if (params.type == 'wallets') { + else if (params.type === 'wallets') { $scope.doGetWallets(0, undefined, true/*skipLocationUpdate*/); } @@ -263,7 +263,7 @@ function WotLookupController($scope, $state, $q, $timeout, $focus, $location, $i stateParams.q = text; } } - else if ($scope.search.type != 'last') { + else if ($scope.search.type !== 'last') { stateParams.type = $scope.search.type; } @@ -293,10 +293,28 @@ function WotLookupController($scope, $state, $q, $timeout, $focus, $location, $i $scope.search.loading = true; $scope.search.type = 'text'; + + // If checksum is correct, search on simple pubkey + let pubkeyWithCk; + if (BMA.regexp.PUBKEY_WITH_CHECKSUM.test(text)) { + console.debug("[wot] Validating pubkey checksum... "); + let matches = BMA.regexp.PUBKEY_WITH_CHECKSUM.exec(text); + console.log(matches) + pubkey = matches[1]; + let checksum = matches[2]; + let expectedChecksum = csCrypto.util.pkChecksum(pubkey); + if (checksum === expectedChecksum) { + console.debug("[wot] checksum {" + checksum + "} valid for pubkey {" + pubkey + "}") + text = pubkey + pubkeyWithCk = pubkey + ':' + checksum + } + } + return csWot.search(text) .then(function(idties){ - if ($scope.search.type != 'text') return; // could have change - if ($scope.search.text.trim() !== text) return; // search text has changed before received response + if ($scope.search.type !== 'text') return; // could have change + originText = $scope.search.text.trim(); + if (originText !== text && originText !== pubkeyWithCk) return; // search text has changed before received response if ((!idties || !idties.length) && (BMA.regexp.PUBKEY.test(text) || BMA.regexp.PUBKEY_WITH_CHECKSUM.test(text))) { return BMA.uri.parse(text) @@ -366,7 +384,7 @@ function WotLookupController($scope, $state, $q, $timeout, $focus, $location, $i return searchFunction(offset, size) .then(function(res){ - if ($scope.search.type != 'pending') return false; // could have change + if ($scope.search.type !== 'pending') return false; // could have change $scope.doDisplayResult(res && res.hits, offset, size, res && res.total); // Always disable "more" on initphase $scope.search.hasMore = !csCurrency.data.initPhase && $scope.search.hasMore; @@ -397,7 +415,7 @@ function WotLookupController($scope, $state, $q, $timeout, $focus, $location, $i return csWallet.children.all() .then(function(children) { - if (!children || $scope.search.type != 'wallets') return false; // could have change + if (!children || $scope.search.type !== 'wallets') return false; // could have change var res = [csWallet].concat(children).reduce(function(res, wallet, index) { var item = { id: index, diff --git a/www/js/directives.js b/www/js/directives.js index e207a9262476cf31b7af36f58f8e8f45f5f91ff6..8f53b911f9690481c7a8221944d258e3ec3bcd61 100644 --- a/www/js/directives.js +++ b/www/js/directives.js @@ -213,6 +213,7 @@ angular.module('cesium.directives', []) // All this does is allow the message // to be sent when you tap return .directive('input', function($timeout) { + 'ngInject'; return { restrict: 'E', scope: { @@ -250,7 +251,8 @@ angular.module('cesium.directives', []) }; }) - .directive('trustAsHtml', ['$sce', '$compile', '$parse', function($sce, $compile, $parse){ + .directive('trustAsHtml', function($sce, $compile, $parse){ + 'ngInject'; return { restrict: 'A', compile: function (tElement, tAttrs) { @@ -272,12 +274,14 @@ angular.module('cesium.directives', []) }; } }; - }]) + }) /** * Close the current modal */ - .directive('modalClose', ['$ionicHistory', '$timeout', function($ionicHistory, $timeout) { + .directive('modalClose', function($ionicHistory, $timeout) { + 'ngInject'; + return { restrict: 'AC', link: function($scope, $element) { @@ -302,12 +306,14 @@ angular.module('cesium.directives', []) }); } }; - }]) + }) /** * Plugin extension point (see services/plugin-services.js) */ .directive('csExtensionPoint', function ($state, $compile, $controller, $templateCache, PluginService) { + 'ngInject'; + var getTemplate = function(extensionPoint) { var template = extensionPoint.templateUrl ? $templateCache.get(extensionPoint.templateUrl) : extensionPoint.template; if (!template) { @@ -353,6 +359,8 @@ angular.module('cesium.directives', []) }) .directive('onReadFile', function ($parse) { + 'ngInject'; + return { restrict: 'A', scope: false, @@ -382,7 +390,8 @@ angular.module('cesium.directives', []) }; }) -.directive("dropZone", function($parse) { + .directive("dropZone", function($parse) { + 'ngInject'; return { restrict: 'A', scope: false, @@ -429,8 +438,8 @@ angular.module('cesium.directives', []) // See http://embed.plnkr.co/2vgnFe/ - .directive('fileSelect', function ($parse) { - 'use strict'; + .directive('fileSelect', function($parse) { + 'ngInject'; return { restrict: 'A', @@ -484,6 +493,8 @@ angular.module('cesium.directives', []) // Un-authenticate when window closed // see: https://stackoverflow.com/questions/28197316/javascript-or-angularjs-defer-browser-close-or-tab-close-between-refresh .directive('windowExitUnauth', function($window, csSettings, csWallet) { + 'ngInject'; + return { restrict: 'AE', link: function(element, attrs){ @@ -497,4 +508,34 @@ angular.module('cesium.directives', []) }); } }; + }) + + // Jdenticon directive (to generate icon from a string) + // see: + .directive('jdenticon', function($parse) { + 'ngInject'; + + return { + restrict: 'A', + scope: false, + template: '<canvas></canvas>', + transclude: false, + link: function (scope, element, attrs) { + var value = attrs.jdenticon; + var size = attrs.jdenticonSize || 54; + var canvas = element.children('canvas')[0]; + + if (!value) { + canvas.height = 0; + canvas.width = 0; + } + else { + canvas.height = size; + canvas.width = size; + + var ctx = canvas.getContext("2d"); + jdenticon.drawIcon(ctx, value, size); + } + } + }; }); diff --git a/www/js/filters.js b/www/js/filters.js index b38b0cc2b272db1874761a404512b8b0a8064097..e4310f818661bdeef426bbb70d99d45dc73cc2a1 100644 --- a/www/js/filters.js +++ b/www/js/filters.js @@ -80,6 +80,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('formatAmount', function(csConfig, csSettings, csCurrency, $filter) { + 'ngInject'; var pattern = '0,0.0' + Array(csConfig.decimalCount || 4).join('0'); var patternBigNumber = '0,0.000 a'; var currencySymbol = $filter('currencySymbol'); @@ -124,6 +125,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('formatAmountNoHtml', function(csConfig, csSettings, csCurrency, $filter) { + 'ngInject'; var minValue = 1 / Math.pow(10, csConfig.decimalCount || 4); var format = '0,0.0' + Array(csConfig.decimalCount || 4).join('0'); var currencySymbol = $filter('currencySymbolNoHtml'); @@ -164,6 +166,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('currencySymbol', function(filterTranslations, $filter, csSettings) { + 'ngInject'; return function(input, useRelative) { if (!input) return ''; return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ? @@ -173,6 +176,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('currencySymbolNoHtml', function(filterTranslations, $filter, csSettings) { + 'ngInject'; return function(input, useRelative) { if (!input) return ''; return (angular.isDefined(useRelative) ? useRelative : csSettings.data.useRelative) ? @@ -182,6 +186,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('formatDecimal', function(csConfig, csCurrency) { + 'ngInject'; var minValue = 1 / Math.pow(10, csConfig.decimalCount || 4); var format = '0,0.0' + Array(csConfig.decimalCount || 4).join('0'); @@ -209,24 +214,28 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('formatDate', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : ''; }; }) .filter('formatDateShort', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : ''; }; }) .filter('formatDateMonth', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_MONTH_YEAR_PATTERN || 'MMM YY') : ''; }; }) .filter('formatDateForFile', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input)).local().format(filterTranslations.DATE_FILE_PATTERN || 'YYYY-MM-DD') : ''; }; @@ -245,6 +254,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('formatFromNowAndDate', function(filterTranslations) { + 'ngInject'; return function(input, options) { var m = input && moment.unix(parseInt(input)); return m && (m.fromNow() + (options && options.separator || ' | ') + m.local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm')) || ''; @@ -265,6 +275,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre .filter('formatDurationTime', function(filterTranslations) { + 'ngInject'; return function(input) { if (!input) return ''; var sign = input && input < 0 ? '-' : '+'; @@ -305,12 +316,14 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre /* -- median time (apply currency offset)-- */ .filter('medianDate', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm') : ''; }; }) .filter('medianDateShort', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).local().format(filterTranslations.DATE_SHORT_PATTERN || 'YYYY-MM-DD') : ''; }; @@ -318,24 +331,28 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre .filter('medianTime', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET).local().format('HH:mm') : ''; }; }) .filter('medianFromNow', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input) + filterTranslations.MEDIAN_TIME_OFFSET).fromNow() : ''; }; }) .filter('medianFromNowShort', function(filterTranslations) { + 'ngInject'; return function(input) { return input ? moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET).fromNow(true) : ''; }; }) .filter('medianFromNowAndDate', function(filterTranslations) { + 'ngInject'; return function(input, options) { var m = input && moment.unix(parseInt(input)+filterTranslations.MEDIAN_TIME_OFFSET); return m && (m.fromNow() + (options && options.separator || ' | ') + m.local().format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm')) || ''; @@ -390,12 +407,36 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }; }) - .filter('formatPubkey', function() { - return function(input) { - return input ? input.substr(0,8) : ''; + .filter('formatPubkey', function(csCrypto) { + 'ngInject'; + return function(input, opts) { + if (!input || input.length < 43) return ''; + var result = (!opts || opts.full !== true) ? + // See RFC0016 + (input.substr(0,4) + '…' + input.substr(input.length - 4)) : input; + // If given (e.g. already computed) use the existing CHK + if (opts && opts.checksum) { + result += ':' + opts.checksum; + } + // Crypto libs can be not loaded yet + else if (csCrypto.isStarted()){ + result += ':' + csCrypto.util.pkChecksum(input); + } + return result; }; }) + .filter('pkChecksum', function(csCrypto) { + 'ngInject'; + return function(input, opts) { + if (!input || input.length < 43) return ''; + if (opts && opts.prefix) { + return ':' + csCrypto.util.pkChecksum(input); + } + return csCrypto.util.pkChecksum(input); + }; + }) + .filter('formatHash', function() { return function(input) { return input ? input.substr(0,4) + input.substr(input.length-4) : ''; @@ -444,6 +485,7 @@ angular.module('cesium.filters', ['cesium.config', 'cesium.platform', 'pascalpre }) .filter('trustAsHtml', function($sce) { + 'ngInject'; return function(html) { return $sce.trustAsHtml(html); }; diff --git a/www/js/platform.js b/www/js/platform.js index 950d1f6389408012a3cff94f69c99e81bb37d9af..cd26df7b1e3279974c936b97d2c8e62e0b631a56 100644 --- a/www/js/platform.js +++ b/www/js/platform.js @@ -416,9 +416,16 @@ angular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services'] ionic.Platform.exitApp(); }); }, 100); - - // Make sure platform is started - return csPlatform.ready(); + }) + // Make sure platform is started + .then(csPlatform.ready) + + // Applying some settings + .then(function(){ + // Applying UI effects, if now already disable (e.g. because of poor platform grade) + if (UIUtils.motion.enable) { + UIUtils.setEffects($rootScope.settings.uiEffects); + } }); }) ; diff --git a/www/js/services/crypto-services.js b/www/js/services/crypto-services.js index 044653204a68c72959ea20fd72c9c17e2fa2dd2d..a87d55bf3d85ff4ae230a28f216b2302c7a86466 100644 --- a/www/js/services/crypto-services.js +++ b/www/js/services/crypto-services.js @@ -405,7 +405,7 @@ angular.module('cesium.crypto.services', ['cesium.utils.services']) var naclOptions = {}; var scryptOptions = {}; if (ionic.Platform.grade.toLowerCase()!='a') { - console.info('Reduce NaCl memory to 16mb, because plateform grade is not [a] but [{0}]'.format(ionic.Platform.grade)); + console.info('Reduce NaCl memory to 16mb, because platform grade is not [a] but [{0}]'.format(ionic.Platform.grade)); naclOptions.requested_total_memory = 16 * 1048576; // 16 Mo } var loadedLib = 0; @@ -1007,6 +1007,15 @@ angular.module('cesium.crypto.services', ['cesium.utils.services']) BAD_CHECKSUM: 3002 }; + function ready() { + if (CryptoUtils.isLoaded()) return $q.when(); + return $timeout(ready, 100); + } + + function isStarted() { + return CryptoUtils.isLoaded(); + } + /* -- keyfile -- */ function readKeyFile(file, options) { @@ -1374,13 +1383,20 @@ angular.module('cesium.crypto.services', ['cesium.utils.services']) } } + /* -- Useful functions -- */ - - /* -- usefull methods -- */ - + /** + * Compute the pubkey checksum (see Duniter RFC0016) + */ function pkChecksum(pubkey) { - var signPk_int8 = CryptoUtils.util.decode_base58(pubkey); - return CryptoUtils.util.encode_base58(CryptoUtils.util.crypto_hash_sha256(CryptoUtils.util.crypto_hash_sha256(signPk_int8))).substring(0,3); + // Remove leading '1' (see https://forum.duniter.org/t/format-de-checksum/7616) + var signPk_int8 = pubkey && pubkey.length === 44 && pubkey.charAt(0) === '1' ? + CryptoUtils.util.decode_base58(pubkey.substr(1)) : + CryptoUtils.util.decode_base58(pubkey); + return CryptoUtils.util.encode_base58( + CryptoUtils.util.crypto_hash_sha256( + CryptoUtils.util.crypto_hash_sha256(signPk_int8)) + ).substring(0,3); } /* -- box (pack/unpack a record) -- */ @@ -1562,6 +1578,8 @@ angular.module('cesium.crypto.services', ['cesium.utils.services']) return { errorCodes: errorCodes, constants: constants, + ready: ready, + isStarted: isStarted, // copy CryptoUtils util: angular.extend({ pkChecksum: pkChecksum diff --git a/www/js/services/device-services.js b/www/js/services/device-services.js index a756a437d8d7cebc61b62fe65b6cd09aa61dc729..b5d21dd7c8993902552c3dfd63c8daf4b4361222 100644 --- a/www/js/services/device-services.js +++ b/www/js/services/device-services.js @@ -14,7 +14,6 @@ angular.module('cesium.device.services', ['cesium.utils.services', 'cesium.setti MAX_HEIGHT: 400, MAX_WIDTH: 400 }, - that = this, api = new Api(this, "Device"), exports = { // workaround to quickly no is device or not (even before the ready() event) @@ -230,14 +229,14 @@ angular.module('cesium.device.services', ['cesium.utils.services', 'cesium.setti } }; - exports.isIOS = function() { - return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || ionic.Platform.isIOS(); - }; - exports.isOSX = function() { return !!navigator.userAgent.match(/Macintosh/i) || ionic.Platform.is("osx"); }; + exports.isIOS = function() { + return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || (!!navigator.userAgent.match(/Mobile/i) && !!navigator.userAgent.match(/Macintosh/i)) || ionic.Platform.isIOS(); + }; + exports.isDesktop = function() { if (!angular.isDefined(cache.isDesktop)) { try { @@ -269,7 +268,7 @@ angular.module('cesium.device.services', ['cesium.utils.services', 'cesium.setti if (exports.enable){ exports.camera.enable = !!navigator.camera; exports.keyboard.enable = cordova && cordova.plugins && !!cordova.plugins.Keyboard; - exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && !exports.isOSX(); + exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && (!exports.isOSX() || exports.isIOS()); exports.clipboard.enable = cordova && cordova.plugins && !!cordova.plugins.clipboard; exports.intent.enable = window && !!window.plugins.launchmyapp; diff --git a/www/js/services/http-services.js b/www/js/services/http-services.js index 06ea8d0c8a4dab73284755acd5311a0cf0e91483..083136a43d8b16be1e8d2720404b58aad31816b5 100644 --- a/www/js/services/http-services.js +++ b/www/js/services/http-services.js @@ -78,14 +78,15 @@ angular.module('cesium.http.services', ['cesium.cache.services']) return $q.reject('[http] invalid URL from host: ' + host); } var url = getUrl(host, port, path, useSsl); - return function(params) { + return function(params, config) { return $q(function(resolve, reject) { - var config = { + var mergedConfig = { timeout: forcedTimeout || timeout, responseType: 'json' }; + if (typeof config === 'string') angular.merge(mergedConfig, config); - prepare(url, params, config, function(url, config) { + prepare(url, params, mergedConfig, function(url, config) { $http.get(url, config) .success(function(data, status, headers, config) { resolve(data); @@ -112,6 +113,7 @@ angular.module('cesium.http.services', ['cesium.cache.services']) timeout: forcedTimeout || timeout, responseType: 'json' }; + if (autoRefresh) { // redo the request if need config.cache = csCache.get(cachePrefix, maxAge, function (key, value, done) { console.debug('[http] Refreshing cache for {{0}} '.format(key)); @@ -141,14 +143,15 @@ angular.module('cesium.http.services', ['cesium.cache.services']) function postResource(host, port, path, useSsl, forcedTimeout) { var url = getUrl(host, port, path, useSsl); - return function(data, params) { + return function(data, params, config) { return $q(function(resolve, reject) { - var config = { + var mergedConfig = { timeout: forcedTimeout || timeout, headers : {'Content-Type' : 'application/json;charset=UTF-8'} }; + if (typeof config === 'object') angular.merge(mergedConfig, config); - prepare(url, params, config, function(url, config) { + prepare(url, params, mergedConfig, function(url, config) { $http.post(url, data, config) .success(function(data) { resolve(data); diff --git a/www/js/services/settings-services.js b/www/js/services/settings-services.js index 26d7199be78162690cf96ba7beaba81af8a629ab..2e3f6bb229f00e47c8c2aa2686275ee73ef93a30 100644 --- a/www/js/services/settings-services.js +++ b/www/js/services/settings-services.js @@ -12,6 +12,7 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config']) {id:'fr-FR', label:'Français', flag: 'fr'}, {id:'nl-NL', label:'Nederlands', flag: 'nl'}, {id:'es-ES', label:'Spanish', flag: 'es'}, + {id:'ca', label:'Català', flag: 'ca'}, {id:'it-IT', label:'Italiano', flag: 'it'} ]; var fallbackLocale = csConfig.fallbackLanguage ? fixLocale(csConfig.fallbackLanguage) : 'en'; @@ -163,7 +164,7 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config']) store = function() { if (!started) { - console.debug('[setting] Waiting start finished...'); + console.debug('[settings] Waiting start finished...'); return (startPromise || start()).then(store); } @@ -190,7 +191,7 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config']) return promise .then(function() { if (data.useLocalStorage) { - console.debug('[setting] Saved locally'); + console.debug('[settings] Saved locally'); } // Emit event on store @@ -232,7 +233,6 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config']) if (localeChanged) { $translate.use(data.locale.id); } - }, restore = function() { @@ -329,6 +329,8 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config']) startPromise = null; // Emit event (used by plugins) api.data.raise.ready(data); + + return data; }); return startPromise; diff --git a/www/js/services/utils-services.js b/www/js/services/utils-services.js index 8bad65342b71ae4840b4bb2e376e17c96dcb7e62..764fd5777af783efe4f3991a821fa99b8cd16a1b 100644 --- a/www/js/services/utils-services.js +++ b/www/js/services/utils-services.js @@ -47,7 +47,11 @@ angular.module('cesium.utils.services', ['angular-fullscreen-toggle']) } return $q(function(resolve) { - $translate([err, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'].concat(subtitle ? [subtitle] : [])) + $translate(['ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'] + // avoid error "translationId must be a not empty string" + .concat(typeof err === 'string' ? [err] : []) + .concat(subtitle ? [subtitle] : []) + ) .then(function (translations) { var message = err.message || translations[err]; return $ionicPopup.show({ @@ -109,6 +113,7 @@ angular.module('cesium.utils.services', ['angular-fullscreen-toggle']) } function askConfirm(message, title, options) { + message = message || 'CONFIRM.CAN_CONTINUE'; title = title || 'CONFIRM.POPUP_TITLE'; options = options || {}; @@ -678,7 +683,7 @@ angular.module('cesium.utils.services', ['angular-fullscreen-toggle']) // but many fabs can have the same id (many view could be loaded at the same time) var fabs = document.getElementsByClassName('button-fab'); _.forEach(fabs, function(fab){ - if (fab.id == id) { + if (fab.id === id) { fab.classList.toggle('on', false); } }); @@ -708,7 +713,7 @@ angular.module('cesium.utils.services', ['angular-fullscreen-toggle']) } function setEffects(enable) { - if (exports.motion.enable === enable) return; // same + if (exports.motion.enable === enable) return; // unchanged console.debug('[UI] [effects] ' + (enable ? 'Enable' : 'Disable')); exports.motion.enable = enable; @@ -719,7 +724,7 @@ angular.module('cesium.utils.services', ['angular-fullscreen-toggle']) else { $ionicConfig.views.transition('none'); var nothing = { - class: undefined, + ionListClass: '', show: function(){} }; angular.merge(exports.motion, { diff --git a/www/js/services/wallet-services.js b/www/js/services/wallet-services.js index 702c8f9d9033dec80fd9e56b500c2b50d7f60e4f..f392ccc0c94486484c70cd00edc5711790ae83d3 100644 --- a/www/js/services/wallet-services.js +++ b/www/js/services/wallet-services.js @@ -40,7 +40,8 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se resetData = function(init) { data.loaded = false; - data.pubkey= null; + data.pubkey = null; + data.checksum = null; data.qrcode=null; data.uid = null; @@ -566,12 +567,12 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se var seckey = res[0]; var pubkey = res[1]; var uid = res[2]; - if (!pubkey || pubkey == 'null') return; + if (!pubkey || pubkey === 'null') return; console.debug('[wallet] Restore {' + pubkey.substring(0, 8) + '} from local storage'); var keypair; - if (seckey && seckey.length && seckey != 'null') { + if (seckey && seckey.length && seckey !== 'null') { try { keypair = { signPk: CryptoUtils.util.decode_base58(pubkey), @@ -887,27 +888,32 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se loadPromise, // Create the QR code - loadQrCode() + loadQrCode(), + + // Compute the checksum (if need) + csCrypto.ready().then(function() { + data.checksum = data.checksum || csCrypto.util.pkChecksum(data.pubkey); + }) ]) - // Warn if wallet has been never used - see #167 .then(function() { - var unused = isNeverUsed(); + + // Warn if wallet has been never used - see #167 + var unused = alertIfUnusedWallet && isNeverUsed(); var showAlert = alertIfUnusedWallet && !isNew() && unused === true; if (!showAlert) return true; return UIUtils.loading.hide() - .then(function() { + .then(function () { return UIUtils.alert.confirm('CONFIRM.LOGIN_UNUSED_WALLET', 'CONFIRM.LOGIN_UNUSED_WALLET_TITLE', { cancelText: 'COMMON.BTN_CONTINUE', okText: 'COMMON.BTN_RETRY' }); }) - .then(function(retry) { + .then(function (retry) { if (retry) { - return logout().then(function() { + return logout().then(function () { throw 'RETRY'; }); - } - else { + } else { // Remembering to not ask for confirmation if (csSettings.data.wallet.alertIfUnusedWallet) { csSettings.data.wallet.alertIfUnusedWallet = false; @@ -924,8 +930,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se if (confirm) { return data; } - else { // cancel - + else { // user cancelled throw 'CANCELLED'; } }); @@ -2082,7 +2087,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se newChildInstance = function() { // Return max(id) + 1 - var walletId = (data.children || []).reduce(function(res, wallet) { + var walletId = (data.children || []).reduce(function(res, wallet) { return Math.max(res, wallet.id); }, 0) + 1; return service.instance(walletId, BMA); diff --git a/www/js/services/wot-services.js b/www/js/services/wot-services.js index 87faa4c2c8144447df266a31f8b50e3aca06435e..da5e8b73378c0826f302f3d5c5e44061f3023d14 100644 --- a/www/js/services/wot-services.js +++ b/www/js/services/wot-services.js @@ -856,6 +856,15 @@ angular.module('cesium.wot.services', ['ngApi', 'cesium.bma.services', 'cesium.c return api.data.raisePromise.search(text, idties, 'pubkey') .then(function() { + // remove CS+ ids that match pubkey regex (considered attacks) - fix #959 + idties = idties.filter(function(idty) { + if (BMA.regexp.PUBKEY.test(text) || BMA.regexp.PUBKEY_WITH_CHECKSUM.test(text)) { + text_pk = text.split(':')[0] + return idty.pubkey == text_pk + } + return true; + }) + // Make sure to add uid to new results - fix #488 if (idties.length > lookupResultCount) { var idtiesWithoutUid = _.filter(idties, function(idty) { diff --git a/www/js/vendor/base58.js b/www/js/vendor/base58.js index 906362e4de9213ac1ae4f479c9e46b1c9f9785f6..77d70031070e790b286b7af0822b289cb41121aa 100644 --- a/www/js/vendor/base58.js +++ b/www/js/vendor/base58.js @@ -61,6 +61,7 @@ while (i < string.length) { c = string[i]; if (!(c in Base58.alphabetMap)) { + console.error("Base58.decode received unacceptable input. Character '" + c + "' is not in the Base58 alphabet."); throw "Base58.decode received unacceptable input. Character '" + c + "' is not in the Base58 alphabet."; } j = 0; diff --git a/www/license/license_g1-es-ES.md b/www/license/license_g1-es-ES.md index 82f786d383d6908970e3e66e769c720c5fadf71c..c55bb73466987d7b55eff93a7a8ab1508a25b5e7 100644 --- a/www/license/license_g1-es-ES.md +++ b/www/license/license_g1-es-ES.md @@ -2,7 +2,7 @@ Licencia Ğ1 - v0.2.8 ==================== :fecha: 2017-04-04 12:59 -:modificada: 2019-04-16 22:30 +:modificada: 2022-03-21 19:15 **Licencia de la moneda y compromiso de responsabilidad.** @@ -34,7 +34,7 @@ Cuando eres miembro de la RdC Ğ1 y estás a punto de certificar una nueva cuent ** Estás seguro de: ** -1°) Conocer suficientemente bien (además de conocerla físicamente) a la persona que declara poseer esta llave pública (nueva cuenta). Lea los consejos fuertemente recomendados más arriba para asegurarte de que la "conoces bien". +1°) Conocer suficientemente bien (no solamente de vista) a la persona que declara poseer esta llave pública (nueva cuenta). Lea los consejos fuertemente recomendados más arriba para asegurarte de que la "conoces bien". 2°) Haber comprobado personalmente con ella de que se trata de esta llave pública que está a punto de certificar (lea las sugerencias anteriores). diff --git a/www/license/license_g1-pt-PT.md b/www/license/license_g1-pt-PT.md new file mode 100644 index 0000000000000000000000000000000000000000..059d8b09c714671636ee11bdcdf0aef136e70b27 --- /dev/null +++ b/www/license/license_g1-pt-PT.md @@ -0,0 +1,97 @@ +Licença Ğ1 - v0.2.9 +=================== + +:data: 2017-04-04 12:59 +:modificado: 2019-07-14 12:00 + +**Licença da moeda e compromisso de responsabilidade.** + +Qualquer operação de certificação dum novo membro da Ğ1 deve ser previamente acompanhada pela transmissão desta licença da moeda Ğ1, a qual o/a certificador/a deve garantir que foi estudada, compreendida e aceite pela pessoa que será certificada. + +Encoraja-se que qualquer evento de grupo relativo à Ğ1 seja acompanhado por uma transmissão desta licença, que poderá ser lida em voz alta, e transmitida por quaisquer meios. + +Rede de confiança Ğ1 (RdC Ğ1) +------------------------------ + +**Nota de precaução:** Certificarmos alguém não é apenas assegurar-mo-nos que encontrámos a pessoa, é assegurarmos à comunidade Ğ1 que conhecemos suficientemente bem a pessoa a certificar, de modo a conseguirmos contactar a pessoa facilmente, e de termos condições para localizar uma conta em duplicado feita pela pessoa que receberá a nossa certificação, ou outro tipo de problemas (desaparecimento da pessoa…) fazendo despistagens que eventualmente permitirão revelar um problema. + +**Conselhos altamente recomendados** + +Conhecermos bem uma pessoa pressupõe que seremos capazes de contactá-la por vários meios diferentes (físicos, electrónicos ou outros ...) mas também pressupõe que conhecemos várias pessoas que a conhecem tão bem quanto nós e, portanto, também serão capazes de contactá-la da mesma forma. Em particular, se não conhecermos bem nenhum dos outros certificadores dessa pessoa, há um forte indício de que não conhecemos bem essa pessoa, e uma certificação deste tipo aciona um alerta para toda a comunidade Ğ1. Em caso de conhecimento insuficiente, é fortemente aconselhável não certificarmos. + +Nunca certifique alguém sozinho, mas faça-se acompanhar pelo menos por outro membro da RdC Ğ1 para evitar qualquer erro de manipulação. Em caso de erro, avise imediatamente os outros membros da RdC Ğ1. + +Antes de qualquer certificação, assegure-se de verificar se a conta dessa pessoa já recebeu uma ou mais certificações (quer esteja em processo de validação ou já seja membro). Eventualmente, peça as informações para entrar em contacto com os outros certificadores, a fim de, juntos, verificarem que conhecem essa pessoa que quer abrir uma nova conta de membro, assim como a chave pública correspondente. + +Verifique se o futuro certificado domina a gestão da sua conta: uma boa forma para verificar isto é transferir algumas Ğ1 da sua conta de membro para a conta dessa pessoa, e de seguida, solicitar o retorno do montante para a sua conta de membro… isso garante que o futuro certificado possui um bom domínio da sua chave privada. + +Verifique que os seus contactos estudaram e compreenderam a licença Ğ1 em vigor. + +Se entender que um certificador real ou potencial de uma determinada conta não conhece a pessoa afecta a essa conta, alerte imediatamente especialistas no assunto dentro dos seus conhecidos na RdC Ğ1, para que o procedimento de validação seja verificado pela RdC Ğ1. + +Quando fizer parte dos membros da RdC Ğ1 e estiver prestes a certificar uma nova conta: + + +**Deverá assegurar-se que:** + +1°) Conhece suficientemente bem (não só "de vista") a pessoa que declara gerir a chave pública em questão (nova conta). Veja os conselhos altamente recomendados acima para garantir que “conhece bem a pessoa”. + +2°) Já verificou em particular com essa pessoa que a chave pública que está prestes a certificar lhe pertence realmente (veja os conselhos acima). + +3°) Já verificou em particular com essa pessoa que o seu documento Duniter de revogação da conta está criado, o que lhe permitirá eventualmente desactivar o seu estatuto de membro (no caso de roubo de uma conta, de uma mudança de identificação, de uma conta criada inadvertidamente, etc). + +4a°) Já se encontrou com essa pessoa fisicamente para se certificar de que é de facto a pessoa bem conhecida por si e que detém a chave pública correcta que será certificada por si. + +4b°) Ou então já verificou remotamente o conjunto pessoa / chave pública ao contactar essa pessoa por vários meios de comunicação diferentes, como o correio postal + rede social + fórum + email + videoconferência + telefone (reconhecendo a sua voz). Isto porque se eventualmente for possível piratear uma conta de e-mail ou uma conta de fórum, será muito mais difícil imaginar piratear quatro meios distintos de comunicação, de imitar a aparência da pessoa (vídeo), e além disso, de imitar a voz da pessoa. + +Todavia o 4a°) permanece preferencial em relação ao 4b°), enquanto os pontos 1°), 2°) e 3°) são previamente indispensáveis. + +**Regras abreviadas da RdC:** + +Cada membro poderá atribuir um stock de 100 certificações possíveis, e que não pode emitir a uma taxa superior a 1 certificação / cada 5 dias. + +Com uma validade de 2 meses, uma certificação para um novo membro só será definitivamente adoptada se no espaço desses 2 meses o membro certificado tiver obtido pelo menos 4 outras certificações, caso contrário, o processo de entrada terá de ser iniciado de novo. + +Por isso para se tornar um novo membro da RdC Ğ1, será necessário obter 5 certificações, e encontrar-se a uma distância <= 5 elos de relação com 80% dos membros referentes da RdC. + +Um membro da RdC Ğ1 torna-se membro referente a partir do momento em que ele terá recebido e emitido pelo menos Y [N] certificações, em que N é o número de membros da RdC e Y [N] = limite superior de N ^ (1/5). Exemplos: + +* Para 1024 <N ≤ 3125, temos Y [N] = 5 +* Para 7776 <N ≤ 16807, temos Y [N] = 7 +* Para 59049 <N ≤ 100.000 temos Y [N] = 10 + +Logo que o novo membro tome lugar na RdC Ğ1, as suas certificações permanecerão válidas durante 2 anos. + +Para permanecer como membro, será necessário renovar o seu acordo regularmente com a sua chave privada (a cada 12 meses) e certificar-se de que tem sempre pelo menos 5 certificações válidas após os 2 anos iniciais. + +Moeda Ğ1 +---------- + +A Ğ1 é criada por meio de um Dividendo Universal (DU) para qualquer ser humano membro da Rede de Confiança Ğ1 e que toma a seguinte forma: + +* 1 DU por pessoa por dia + +**Código monetário Ğ1** + +O valor em Ğ1 do DU é o mesmo a cada dia (com 1 dia = 86400 segundos) até ao dia de equinócio seguinte, onde o DU será então reavaliado de acordo com a fórmula: + +* DUdiário (até ao próximo equinócio) = DUdiário (no dia de equinócio) + c² (M / N) (no dia de equinócio) / (182,625 dias) + +Com os parâmetros: + +* c = 4,88% / cada intervalo de tempo correspondente a um equinócio +* DU(0) = 10,00 Ğ1 + +E onde as variáveis são: + +* *M* a massa monetária total no dia de equinócio +* *N* o número de membros no dia de equinócio + +Software Ğ1 e licença Ğ1 +-------------------------- + +Os programas informáticos Ğ1 que permitem aos utilizadores a gestão de utilização da Ğ1 devem transmitir esta licença com o programa informático, assim como o conjunto de parâmetros técnicos da moeda Ğ1 e da RdC Ğ1 que estão inscritos no bloco 0 da Ğ1. O programa informático que não cumpra estas obrigações da licença não é compatível com a Ğ1. + +Para melhor aprofundar os detalhes técnicos é possível consultar diretamente o código do Duniter, que é software livre, assim com consultar os dados da blockchain Ğ1, obtendo-os por meio de uma instância (ou nó) Duniter Ğ1. + +Mais informações no sítio internet da equipa Duniter https://www.duniter.org diff --git a/www/manifest.json b/www/manifest.json index df7030dbaac8dcc10a30a75d3e7f319cc80d3242..f2f83a7152014cba152a988d03a8bc49cbd52ad6 100644 --- a/www/manifest.json +++ b/www/manifest.json @@ -2,7 +2,7 @@ "short_name": "Cesium", "name": "Cesium", "manifest_version": 1, - "version": "1.6.12", + "version": "1.7.0-rc1", "default_locale": "fr", "description": "Cesium Wallet for Ğ1 libre currency", "icons": [ diff --git a/www/plugins/es/i18n/locale-ca.json b/www/plugins/es/i18n/locale-ca.json new file mode 100644 index 0000000000000000000000000000000000000000..b16606839813c87f82b5b6eef48480b7d43a3b5a --- /dev/null +++ b/www/plugins/es/i18n/locale-ca.json @@ -0,0 +1,610 @@ +{ + "COMMON": { + "ABUSES_TEXT": "{{total}} person{{total > 1 ? 'es' : 'a'}} {{total > 1 ? 'han' : 'ha'}} informat d'un problema", + "BTN_LIKE": "M'agrada", + "BTN_LIKE_REMOVE": "Ja no m'agrada", + "BTN_REMOVE_REPORTED_ABUSE": "Cancel·la el meu informe", + "BTN_REPORT_ABUSE_DOTS": "Informeu d'un problema o un abús...", + "COMMENT_HELP": "Comentari", + "LIKES_TEXT": "A {{total}} person{{total > 1 ? 'es' : 'a'}} {{total > 1 ? 'els' : 'li'}} agrada aquesta pàgina", + "NOTIFICATION": { + "HAS_UNREAD": "Hi ha {{count}} notificaci{{count>0?'ons':'ó'}} sense llegir", + "TITLE": "Notificació nova | {{'COMMON.APP_NAME'|translate}}" + }, + "REPORT_ABUSE": { + "ASK_DELETE": "Solicitud d'eliminació?", + "CONFIRM": { + "SENT": "Informe enviat. Gràcies!" + }, + "REASON_HELP": "Jo explico el problema...", + "SUB_TITLE": "Si us plau feu-nos cinc cèntims del problema:", + "TITLE": "Comuniqueu un problema" + }, + + "CATEGORY": "Categoria", + "CATEGORIES": "Categories", + "CATEGORY_SEARCH_HELP": "Cerca", + "LAST_MODIFICATION_DATE": "Actualitzat a", + "SUBMIT_BY": "Enviat per", + "BTN_PUBLISH": "Publica", + "BTN_PICTURE_DELETE": "Suprimeix", + "BTN_PICTURE_FAVORISE": "Principal", + "BTN_PICTURE_ROTATE": "Gira", + "BTN_ADD_PICTURE": "Afegeix una foto", + "NOTIFICATIONS": { + "TITLE": "Notificacions", + "MARK_ALL_AS_READ": "Marca-ho tot com a llegit", + "NO_RESULT": "Sense notificacions", + "SHOW_ALL": "Veure-ho tot", + "LOAD_NOTIFICATIONS_FAILED": "Ha fallat la càrrega de les notificacions" + } + }, + "DOCUMENT": { + "HASH": "Hash: ", + "LOOKUP": { + "BTN_COMPACT": "Compacta", + "HAS_CREATE_OR_UPDATE_PROFILE": "ha creat o modificat el seu perfil", + "LAST_DOCUMENTS_DOTS": "Últims documents :", + "TITLE": "Búsqueda de documents", + "BTN_ACTIONS": "Accions", + "SEARCH_HELP": "issuer:AAA*, time:1508406169", + "LAST_DOCUMENTS": "Últims documents", + "SHOW_QUERY": "Mostra la búsqueda", + "HIDE_QUERY": "Amaga la búsqueda", + "HEADER_TIME": "Data/Hora", + "HEADER_ISSUER": "Emissor", + "HEADER_RECIPIENT": "Destinatari", + "HEADER_AMOUNT": "Import", + "READ": "Llegit", + "BTN_REMOVE": "Sumpreix aquest document", + "POPOVER_ACTIONS": { + "TITLE": "Accions", + "REMOVE_ALL": "Suprimeix aquests documents..." + } + }, + "INFO": { + "REMOVED": "Document suprimit" + }, + "CONFIRM": { + "REMOVE": "Vol <b>suprimir aquest document</b>?", + "REMOVE_ALL": "Vol <b>suprimir aquests documents</b>?" + }, + "ERROR": { + "LOAD_DOCUMENTS_FAILED": "Error en buscar els documents", + "REMOVE_FAILED": "Error en suprimir el document", + "REMOVE_ALL_FAILED": "Error en suprimir els documents" + } + }, + "MENU": { + "REGISTRY": "Pàgines", + "USER_PROFILE": "El meu perfil", + "MESSAGES": "Missatges", + "NOTIFICATIONS": "Notificacions", + "INVITATIONS": "Invitacions" + }, + "ACCOUNT": { + "NEW": { + "ORGANIZATION_ACCOUNT": "Compte per a una organització", + "ORGANIZATION_ACCOUNT_HELP": "Si representeu una empresa, una associació, etc.<br/>Aquest compte no crearà cap divident universal." + }, + "EVENT": { + "MEMBER_WITHOUT_PROFILE": "Per aconseguir les vostres certificacions més ràpid, completi <a ui-sref=\"app.edit_profile\">el seu perfil d'usuari</a>. Els membres donaran la seva confiança més fàcilment a una identitat verificable." + }, + "ERROR": { + "WS_CONNECTION_FAILED": "Cesium no pot rebre les notificacions, degut a un error tècnic (connexió al node de dades Cesium+).<br/><br/>Si el problema persisteix, si us plau <b>trieu un altre node de dades</b> als ajustos de Cesium+." + } + }, + "WOT": { + "BTN_SUGGEST_CERTIFICATIONS_DOTS": "Suggeriu identidats a certificar...", + "BTN_ASK_CERTIFICATIONS_DOTS": "Demaneu a uns membres que us certifiquin...", + "BTN_ASK_CERTIFICATION": "Demaneu una certificació", + "SUGGEST_CERTIFICATIONS_MODAL": { + "TITLE": "Suggeriu certificacions", + "HELP": "Trieu els vostres suggeriments" + }, + "ASK_CERTIFICATIONS_MODAL": { + "TITLE": "Sol·liciteu certificacions", + "HELP": "Seleccioneu els destinataris" + }, + "SEARCH": { + "DIVIDER_PROFILE": "Comptes", + "DIVIDER_PAGE": "Pàgines", + "DIVIDER_GROUP": "Grups" + }, + "CONFIRM": { + "SUGGEST_CERTIFICATIONS": "¿Desea <b>enviar estas sugerencias de certificatión</b> ?", + "ASK_CERTIFICATION": "¿Desea <b>enviar una solicitud de certificación</b> ?", + "ASK_CERTIFICATIONS": "¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?" + } + }, + "INVITATION": { + "TITLE": "Invitaciones", + "NO_RESULT": "Ningúna invitación en espera", + "BTN_DELETE_ALL": "Suprimir todas las invitaciones", + "BTN_DELETE": "Suprimir la invitación", + "BTN_NEW_INVITATION": "Nueva invitación", + "ASK_CERTIFICATION": "<a href=\"#/app/wot/{{pubkey}}/{{::uid}}\">{{::name||uid}}</a> solicita su certificación", + "SUGGESTION_CERTIFICATION": "<a href=\"#/app/wot/{{::pubkey}}/{{::uid}}\">{{::name||uid}}</a> ha sido sugerido/a para certificación", + "SUGGESTED_BY": "Sugerencia mandada por <a class=\"positive\" href=\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\">{{::issuer.name||issuer.uid}}</a>", + "NOTIFICATIONS": { + "TITLE": "Invitaciones" + }, + "LIST": { + "TITLE": "Invitaciones" + }, + "NEW": { + "TITLE": "Nueva invitación", + "RECIPIENTS": "A", + "RECIPIENTS_HELP": "Destinatarios de la invitación", + "RECIPIENTS_MODAL_TITLE": "Destinatarios", + "RECIPIENTS_MODAL_HELP": "Por favor, elige los destinatarios :", + "SUGGESTION_IDENTITIES": "Sugerencia de certificación", + "SUGGESTION_IDENTITIES_HELP": "Certificaciones a sugerir", + "SUGGESTION_IDENTITIES_MODAL_TITLE": "Sugerencias", + "SUGGESTION_IDENTITIES_MODAL_HELP": "Por favor, elige sus sugerencias :" + }, + "CONFIRM": { + "DELETE_ALL_CONFIRMATION": "La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?", + "SEND_INVITATIONS_TO_CERTIFY": "¿ Desea <b>mandar esta invitación a certificar</b> ?" + }, + "INFO": { + "INVITATION_SENT": "Invitación mandada" + }, + "ERROR": { + "LOAD_INVITATIONS_FAILED": "Fallo en la carga de las invitaciones", + "REMOVE_INVITATION_FAILED": "Fallo durante la supresión de la invitación", + "REMOVE_ALL_INVITATIONS_FAILED": "Fallo durante la supresión de las invitaciones", + "SEND_INVITATION_FAILED": "Fallo durante el envío de la invitación", + "BAD_INVITATION_FORMAT": "<span class=\"assertive\"><i class=\"ion-close-circled\"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref=\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\">{{::name||uid}}</a>" + } + }, + "COMMENTS": { + "DIVIDER": "Comentarios", + "SHOW_MORE_COMMENTS": "Visualizar los comentarios anteriores", + "COMMENT_HELP": "Su comentario, preguntas, etc.", + "COMMENT_HELP_REPLY_TO": "Su repuesta…", + "BTN_SEND": "Mandar", + "POPOVER_SHARE_TITLE": "Mensaje #{{number}}", + "MODIFIED_ON": "modificado el {{time|formatDate}}", + "MODIFIED_PARENTHESIS": "(modificado entonces)", + "REPLY": "Responder", + "REPLY_TO": "Repuesta a :", + "REPLY_TO_LINK": "En repuesta a ", + "REPLY_TO_DELETED_COMMENT": "En repuesta a un comentario suprimido", + "REPLY_COUNT": "{{replyCount}} repuestas", + "DELETED_COMMENT": "Comentario suprimido", + "ERROR": { + "FAILED_SAVE_COMMENT": "Fallo durante el respaldo del comentario", + "FAILED_REMOVE_COMMENT": "Fallo durante la supresión del comentario" + } + }, + "MESSAGE": { + "REPLY_TITLE_PREFIX": "Rep: ", + "FORWARD_TITLE_PREFIX": "Tr: ", + "BTN_REPLY": "Responder", + "BTN_COMPOSE": "Nuevo mensaje", + "BTN_WRITE": "Escribir", + "NO_MESSAGE_INBOX": "Ningun mensaje recibido", + "NO_MESSAGE_OUTBOX": "Ningun mensaje mandado", + "NOTIFICATIONS": { + "TITLE": "Mensajes", + "MESSAGE_RECEIVED": "Ha <b>recibido un mensaje</b><br/>de" + }, + "LIST": { + "INBOX": "Bandeja de entrada", + "OUTBOX": "Mensajes enviados", + "LAST_INBOX": "Nuevos mensajes", + "LAST_OUTBOX": "Mensajes enviados", + "BTN_LAST_MESSAGES": "Mensajes recientes", + "TITLE": "Mensajes", + "SEARCH_HELP": "Buscar en mensajes", + "POPOVER_ACTIONS": { + "TITLE": "Opciones", + "DELETE_ALL": "Suprimir todos los mensajes" + } + }, + "COMPOSE": { + "TITLE": "Nuevo mensaje", + "TITLE_REPLY": "Responder", + "SUB_TITLE": "Nuevo mensaje", + "TO": "A", + "OBJECT": "Objeto", + "OBJECT_HELP": "Objeto", + "ENCRYPTED_HELP": "Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.", + "MESSAGE": "Mensaje", + "MESSAGE_HELP": "Contenido del mensaje", + "CONTENT_CONFIRMATION": "El contenido del mensaje está vacío.<br/><br/>¿ Sin embargo, quiere mandar el mensaje ?" + }, + "VIEW": { + "TITLE": "Mensaje", + "SENDER": "Enviado por", + "RECIPIENT": "Enviado a", + "NO_CONTENT": "Mensaje vacío", + "DELETE": "Eliminar el mensaje" + }, + "CONFIRM": { + "REMOVE": "¿ Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.", + "REMOVE_ALL" : "¿ Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.", + "MARK_ALL_AS_READ": "¿ Desea <b>marcar todos los mensajes como leído</b> ?", + "USER_HAS_NO_PROFILE": "Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <b>continuar</b> a pesar de todo ?" + }, + "INFO": { + "MESSAGE_REMOVED": "Mensaje suprimido", + "All_MESSAGE_REMOVED": "Todos los mensajes fueron suprimido", + "MESSAGE_SENT": "Mensaje mandado" + }, + "ERROR": { + "SEND_MSG_FAILED": "Fallo durante el envío del mensaje.", + "LOAD_MESSAGES_FAILED": "Fallo durante la recuperación de los mensajes.", + "LOAD_MESSAGE_FAILED": "Fallo durante la recuperación del mensaje.", + "MESSAGE_NOT_READABLE": "Lectura del mensaje imposible.", + "USER_NOT_RECIPIENT": "No está el destinatario de este mensaje : deciframiento imposible.", + "NOT_AUTHENTICATED_MESSAGE": "La autenticidad del mensaje es dudosa o su contenido está corrupto.", + "REMOVE_MESSAGE_FAILED": "Fallo en la supresión del mensaje", + "MESSAGE_CONTENT_TOO_LONG": "Valor demasiado largo ({{maxLength}} carácteres max).", + "MARK_AS_READ_FAILED": "Imposible marcar el mensaje como 'leído'.", + "LOAD_NOTIFICATIONS_FAILED": "Fallo durante la recuperación de las notificaciones de mensajes.", + "REMOVE_All_MESSAGES_FAILED": "Fallo durante la supresión de todos los mensajes.", + "MARK_ALL_AS_READ_FAILED": "Fallo durante el marcaje de los mensajes como leído.", + "RECIPIENT_IS_MANDATORY": "El destinatario es obligatorio." + } + }, + "BLOCKCHAIN": { + "LOOKUP": { + "SEARCH_HELP": "Número de bloque, hash, llave pública, etc.", + "POPOVER_FILTER_TITLE": "Filtros", + "HEADER_MEDIAN_TIME": "Fecha / Hora", + "HEADER_BLOCK": "Bloque #", + "HEADER_ISSUER": "Nodo emisor", + "BTN_LAST": "Últimos bloques", + "DISPLAY_QUERY": "Mostrar la consulta", + "HIDE_QUERY": "Ocultar la consulta", + "TX_SEARCH_FILTER": { + "MEMBER_FLOWS": "Entradas/salidas de miembros", + "EXISTING_TRANSACTION": "Con transacciones", + "PERIOD": "<b class=\"ion-clock\"></b> Entre el <b class=\"gray\">{{params[1]|medianDateShort}}</b> ({{params[1]|medianTime}}) y el <b class=\"gray\">{{params[2]|medianDateShort}}</b> ({{params[2]|medianTime}})", + "ISSUER": "<b class=\"ion-android-desktop\"></b> Calculado por <b class=\"ion-key\"></b> {{params[1]|formatPubkey}}", + "TX_PUBKEY": "<b class=\"ion-card\"></b> Transacciones que implican <b class=\"ion-key\"></b> {{params[1]|formatPubkey}}" + } + }, + "ERROR": { + "SEARCH_BLOCKS_FAILED": "Fallo en la búsqueda de los bloques." + } + }, + "GROUP": { + "GENERAL_DIVIDER": "Informaciones generales", + "LOCATION_DIVIDER": "Dirección", + "SOCIAL_NETWORKS_DIVIDER": "Redes sociales y página web", + "TECHNICAL_DIVIDER": "Informaciones técnicas", + "CREATED_TIME": "Creada {{creationTime|formatFromNow}}", + "NOTIFICATIONS": { + "TITLE": "Invitaciones" + }, + "LOOKUP": { + "TITLE": "Grupos", + "SEARCH_HELP": "Nombre de grupo, palabras , lugar, etc.", + "LAST_RESULTS_LIST": "Nuevos grupos :", + "OPEN_RESULTS_LIST": "Grupos abiertos :", + "MANAGED_RESULTS_LIST": "Grupos cerrados :", + "BTN_LAST": "Nuevos grupos", + "BTN_NEW": "Añado un grupo" + }, + "TYPE": { + "TITLE": "Nuevo grupo", + "SELECT_TYPE": "Tipo de grupo :", + "OPEN_GROUP": "Grupo abierto", + "OPEN_GROUP_HELP": "Un grupo abierto es accesible por cualquier miembro de la moneda.", + "MANAGED_GROUP": "Grupo administrado", + "MANAGED_GROUP_HELP": "Un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.", + "ENUM": { + "OPEN": "Grupo abierto", + "MANAGED": "Grupo administrado" + } + }, + "VIEW": { + "POPOVER_SHARE_TITLE": "{{title}}", + "MENU_TITLE": "Opciones", + "REMOVE_CONFIRMATION" : "¿Desea eliminar este grupo?<br/><br/>Esta operación es irreversible." + }, + "EDIT": { + "TITLE": "Grupo", + "TITLE_NEW": "Nuevo grupo", + "RECORD_TITLE": "Título", + "RECORD_TITLE_HELP": "Título", + "RECORD_DESCRIPTION": "Descripción", + "RECORD_DESCRIPTION_HELP": "Descripción" + }, + "ERROR": { + "SEARCH_GROUPS_FAILED": "Fallo en la búsqueda de grupos", + "REMOVE_RECORD_FAILED": "Error al eliminar el grupo" + }, + "INFO": { + "RECORD_REMOVED" : "Grupo eliminado" + } + }, + "REGISTRY": { + "CATEGORY": "Actividad principal", + "GENERAL_DIVIDER": "Informaciones generales", + "LOCATION_DIVIDER": "Dirección", + "SOCIAL_NETWORKS_DIVIDER": "Redes sociales y sitio web", + "TECHNICAL_DIVIDER": "Informaciones técnicas", + "BTN_SHOW_WOT": "Personas", + "BTN_SHOW_WOT_HELP": "Buscar personas", + "BTN_SHOW_PAGES": "Páginas", + "BTN_SHOW_PAGES_HELP": "Búsqueda de páginas", + "BTN_NEW": "Crear una página", + "MY_PAGES": "Mis páginas", + "NO_PAGE": "Sin páginas", + "SEARCH": { + "TITLE": "Páginas", + "SEARCH_HELP": "Qué, Quién, ej: peluquería, restaurante Sol.", + "BTN_ADD": "Nuevo", + "BTN_LAST_RECORDS": "Páginas recientes", + "BTN_ADVANCED_SEARCH": "búsqueda avanzada", + "BTN_OPTIONS": "Búsqueda avanzada", + "TYPE": "Tipo de página", + "LOCATION_HELP": "Ciudad", + "RESULTS": "Resultados", + "RESULT_COUNT_LOCATION": "{{count}} Resultado{{count>0?'s':''}}, cerca de {{location}}", + "RESULT_COUNT": "{{count}} resultado{{count>0?'s':''}}", + "LAST_RECORDS": "Páginas recientes", + "LAST_RECORD_COUNT_LOCATION": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}", + "LAST_RECORD_COUNT": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}", + "POPOVER_FILTERS": { + "BTN_ADVANCED_SEARCH": "Opciones avanzadas" + } + }, + "VIEW": { + "TITLE": "Anuario", + "CATEGORY": "Actividad principal :", + "LOCATION": "Dirección :", + "MENU_TITLE": "Opciones", + "POPOVER_SHARE_TITLE": "{{title}}", + "REMOVE_CONFIRMATION" : "¿ Desea suprimir esta página ?<br/><br/>Esta operación es ireversible." + }, + "TYPE": { + "TITLE": "Nueva página", + "SELECT_TYPE": "Tipo de página :", + "ENUM": { + "SHOP": "Comercio local", + "COMPANY": "Empresa", + "ASSOCIATION": "Asociación", + "INSTITUTION": "Institución" + } + }, + "EDIT": { + "TITLE": "Edición", + "TITLE_NEW": "Nueva página", + "RECORD_TYPE":"Tipo de página", + "RECORD_TITLE": "Nombre", + "RECORD_TITLE_HELP": "Nombre", + "RECORD_DESCRIPTION": "Descripción", + "RECORD_DESCRIPTION_HELP": "Descripción de la actividad", + "RECORD_ADDRESS": "Calle", + "RECORD_ADDRESS_HELP": "Calle, edificio…", + "RECORD_CITY": "Ciudad", + "RECORD_CITY_HELP": "Ciudad", + "RECORD_SOCIAL_NETWORKS": "Redes sociales y sitio web", + "RECORD_PUBKEY": "Llave pública", + "RECORD_PUBKEY_HELP": "Llave pública para recibir pagos" + }, + "WALLET": { + "PAGE_DIVIDER": "Páginas", + "PAGE_DIVIDER_HELP": "Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref=\"app.es_network\">la red Cesium+</a>." + }, + "ERROR": { + "LOAD_CATEGORY_FAILED": "Fallo en la carga de la lista de actividades", + "LOAD_RECORD_FAILED": "Fallo durante la carga de la página", + "LOOKUP_RECORDS_FAILED": "Fallo durante la ejecución de la búsqueda.", + "REMOVE_RECORD_FAILED": "Fallo en la supresión de la página", + "SAVE_RECORD_FAILED": "Fallo durante el respaldo", + "RECORD_NOT_EXISTS": "Página inexistente", + "GEO_LOCATION_NOT_FOUND": "Ciudad o código postal no encontrado" + }, + "INFO": { + "RECORD_REMOVED" : "Página suprimida", + "RECORD_SAVED": "Página guardada" + } + }, + "PROFILE": { + "PROFILE_DIVIDER": "Perfil Cesium+", + "PROFILE_DIVIDER_HELP": "Estos son datos auxiliares, almacenados fuera de la red monetaria", + "NO_PROFILE_DEFINED": "Ningún perfil Cesium+", + "BTN_ADD": "Ingresar mi perfil", + "BTN_EDIT": "Editar mi perfil", + "BTN_DELETE": "Eliminar mi perfil", + "BTN_REORDER": "Reordenar", + "UID": "Seudónimo", + "TITLE": "Nombre, Apellidos", + "TITLE_HELP": "Nombre, Apellidos", + "DESCRIPTION": "Sobre mí", + "DESCRIPTION_HELP": "Sobre mí…", + "SOCIAL_HELP": "http://...", + "GENERAL_DIVIDER": "Informaciones generales", + "SOCIAL_NETWORKS_DIVIDER": "Redes sociales, sitios web", + "TECHNICAL_DIVIDER": "Informaciones técnicas", + "MODAL_AVATAR": { + "TITLE": "Foto de perfil", + "SELECT_FILE_HELP": "Por favor, <b>elija una imagen</b>:", + "BTN_SELECT_FILE": "Eligir una imagen", + "RESIZE_HELP": "<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.", + "RESULT_HELP": "<b>Aquí está el resultado</b> tal como se verá sobre su perfil :" + }, + "CONFIRM": { + "DELETE": "¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible.", + "DELETE_BY_MODERATOR": "¿Desea <b>eliminar este perfil Cesium+?</b><br/><br/>Esta operación es irreversible." + }, + "ERROR": { + "DELETE_PROFILE_FAILED": "Error durante la eliminación del perfil", + "REMOVE_PROFILE_FAILED": "Error de eliminación del perfil", + "LOAD_PROFILE_FAILED": "Fallo en la carga del perfil usuario.", + "SAVE_PROFILE_FAILED": "Fallo durante el respaldo", + "INVALID_SOCIAL_NETWORK_FORMAT": "Formato inválido: por favor, indique una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección de correo (joe@dalton.com)</li></ul>", + "IMAGE_RESIZE_FAILED": "Falló el redimensionado de la imagen" + }, + "INFO": { + "PROFILE_REMOVED": "Perfil eliminado", + "PROFILE_SAVED": "Perfil guardado" + }, + "HELP": { + "WARNING_PUBLIC_DATA": "La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}" + } + }, + "LIKE": { + "ERROR": { + "FAILED_TOGGLE_LIKE": "Imposible ejecutar esta acción." + } + }, + "LOCATION": { + "BTN_GEOLOC_ADDRESS": "Actualizar desde la dirección", + "USE_GEO_POINT": "Aparecer en el mapa {{'COMMON.APP_NAME'|translate}}", + "LOADING_LOCATION": "Encontrar la dirección…", + "LOCATION_DIVIDER": "Dirección", + "ADDRESS": "Calle", + "ADDRESS_HELP": "Calle, número, etc…", + "CITY": "Ciudad", + "CITY_HELP": "Ciudad, País", + "DISTANCE": "Distancia máxima alrededor de la ciudad", + "DISTANCE_UNIT": "km", + "DISTANCE_OPTION": "{{value}} {{'LOCATION.DISTANCE_UNIT'|translate}}", + "SEARCH_HELP": "Ciudad, País", + "PROFILE_POSITION": "Posición del perfil", + "MODAL": { + "TITLE": "Búsqueda de dirección", + "SEARCH_HELP": "Ciudad, País", + "ALTERNATIVE_RESULT_DIVIDER": "Resultados alternativos para <b>{{address}}</b> :", + "POSITION": "Latitud/Longitud : {{lat}} / {{lon}}" + }, + "ERROR": { + "CITY_REQUIRED_IF_STREET": "Requerido si una calle ha sido llenada", + "REQUIRED_FOR_LOCATION": "Campo obligatorio para aparecer en el mapa", + "INVALID_FOR_LOCATION": "Dirección desconocida", + "GEO_LOCATION_FAILED": "No se puede recuperar su ubicación Por favor usa el botón de búsqueda.", + "ADDRESS_LOCATION_FAILED": "No se puede recuperar la posición de la dirección." + } + }, + "SUBSCRIPTION": { + "SUBSCRIPTION_DIVIDER": "Servicios en línea", + "SUBSCRIPTION_DIVIDER_HELP": "Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.", + "BTN_ADD": "Agregar un servicio", + "BTN_EDIT": "Administrar mis servicios", + "NO_SUBSCRIPTION": "Ningún servicio definido", + "SUBSCRIPTION_COUNT": "Servicios / Suscripción", + "EDIT": { + "TITLE": "Servicios en línea", + "HELP_TEXT": "Gestione sus suscripciones y otros servicios en línea aquí", + "PROVIDER": "Proveedor:" + }, + "TYPE": { + "ENUM": { + "EMAIL": "Recibir notificaciones por correo electrónico" + } + }, + "CONFIRM": { + "DELETE_SUBSCRIPTION": "¿ Deseas <b>eliminar</b> esta suscripción ?" + }, + "ERROR": { + "LOAD_SUBSCRIPTIONS_FAILED": "Error al cargar servicios en línea", + "ADD_SUBSCRIPTION_FAILED": "Error al agregar suscripción", + "UPDATE_SUBSCRIPTION_FAILED": "Error durante la actualización de la suscripción", + "DELETE_SUBSCRIPTION_FAILED": "Error al eliminar la suscripción" + }, + "MODAL_EMAIL": { + "TITLE" : "Notificación por correo electrónico", + "HELP" : "Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.", + "EMAIL_LABEL" : "Su correo electrónico :", + "EMAIL_HELP": "maria@dominio.com", + "FREQUENCY_LABEL": "Frecuencia de las notificaciones :", + "FREQUENCY_DAILY": "Diaria", + "FREQUENCY_WEEKLY": "Semanal", + "PROVIDER": "Proveedor de servicio :" + } + }, + "ES_PEER": { + "DOCUMENT_COUNT": "Número de documentos", + "DOCUMENTS": "Documentos", + "EMAIL_SUBSCRIPTION_COUNT": "{{emailSubscription}} suscrito/a{{emailSubscription ? 's' : ''}} a notificaciones por correo", + "NAME": "Nombre", + "SOFTWARE": "Software" + }, + "ES_SETTINGS": { + "PLUGIN_NAME": "Cesium+", + "PLUGIN_NAME_HELP": "Perfiles, notificaciones, mensajes privados", + "ENABLE_TOGGLE": "Activar la extensión", + "ENABLE_MESSAGE_TOGGLE": "Activar los mensajes privados", + "ENABLE_REMOTE_STORAGE": "Activar el almacenamiento remoto", + "ENABLE_REMOTE_STORAGE_HELP": "Permite almacenar (con cifrado) sus ajustes en los nodos Cesium+", + "PEER": "Dirección del nodo de datos", + "POPUP_PEER": { + "TITLE" : "Nodo de datos", + "HELP" : "Ingrese la dirección del nodo que quiere utilizar:", + "PEER_HELP": "servidor.dominio.com:puerto" + }, + "NOTIFICATIONS": { + "DIVIDER": "Notificaciones", + "HELP_TEXT": "Active los tipos de notificaciones que desea recibir:", + "ENABLE_TX_SENT": "Notificar la validación de los <b>pagos emitidos</b>", + "ENABLE_TX_RECEIVED": "Notificar la validación de los <b>pagos recibidos</b>", + "ENABLE_CERT_SENT": "Notificar la validación de las <b>certificaciones emitidas</b>", + "ENABLE_CERT_RECEIVED": "Notificar la validación de las <b>certificaciones recibidas</b>", + "ENABLE_HTML5_NOTIFICATION": "Avisar con cada nueva notificación", + "ENABLE_HTML5_NOTIFICATION_HELP": "Abre una pequeña ventana emergente con cada nueva notificación." + }, + "CONFIRM": { + "ASK_ENABLE_TITLE": "Otras funcionalidades", + "ASK_ENABLE": "La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li> <b><i class=\"icon ion-person\"></i> Perfiles de usuario/a</b>;<li> <b><i class=\"icon ion-android-notifications\"></i> Notificaciones</b>;<li> <b><i class=\"icon ion-email\"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?" + } + }, + "ES_WALLET": { + "ERROR": { + "RECIPIENT_IS_MANDATORY": "Un destinatario es obligatorio para el cifrado." + } + }, + "EVENT": { + "NODE_STARTED": "Su nodo ES API <b>{{params[0]}}</b> es comenzado", + "NODE_BMA_DOWN": "El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.", + "NODE_BMA_UP": "El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.", + "MEMBER_JOIN": "Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !", + "MEMBER_LEAVE": "No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!", + "MEMBER_EXCLUDE": "Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.", + "MEMBER_REVOKE": "Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.", + "MEMBER_ACTIVE": "Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.", + "TX_SENT": "Su <b>pago</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> fue efectuado.", + "TX_SENT_MULTI": "Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.", + "TX_RECEIVED": "Ha <b>recibido un pago</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.", + "TX_RECEIVED_MULTI": "Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.", + "CERT_SENT": "Su <b>certificación</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> fue efectuada.", + "CERT_RECEIVED": "Ha <b>recibido una certificación</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span>.", + "USER": { + "ABUSE_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha reportardo su perfil", + "DELETION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha reportado un perfil para suprimir : <b>{{params[2]}}</b>", + "FOLLOW_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> sigue la actividad de su perfil", + "LIKE_RECEIVED": "A <span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> le ha gustado su perfil</b>", + "MODERATION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> os pide moderación sobre el perfil : <b>{{params[2]}}</b><br/><b class=\"dark ion-quote\"> </b><span class=\"text-italic\">{{params[3]}}</span>", + "STAR_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> os ha puntuado con ({{params[3]}} <b class=\"ion-star\">)" + }, + "PAGE": { + "ABUSE_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha reportardo su página : <b>{{params[2]}}</b>", + "DELETION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha reportado una página para suprimir : <b>{{params[2]}}</b>", + "FOLLOW_CLOSE": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha cerrado la página : <b>{{params[2]}}</b>", + "FOLLOW_NEW": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha añadido la página : <b>{{params[2]}}</b>", + "FOLLOW_NEW_COMMENT": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha comentado la página : <b>{{params[2]}}</b>", + "FOLLOW_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> sigue su página : <b>{{params[2]}}</b>", + "FOLLOW_UPDATE": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha modificado la página : <b>{{params[2]}}</b>", + "FOLLOW_UPDATE_COMMENT": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> ha modificado su comentario en la página : <b>{{params[2]}}</b>", + "MODERATION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i> {{name||params[1]}}</span> os pide moderación sobre la página : <b>{{params[2]}}</b><br/><b class=\"dark ion-quote\"> </b><span class=\"text-italic\">{{params[3]}}</span>", + + "NEW_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>", + "UPDATE_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>", + "NEW_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>", + "UPDATE_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i> {{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>" + } + }, + "CONFIRM": { + "ES_USE_FALLBACK_NODE": "Nodo de datos <b>{{old}}</b> inalcanzable o dirección no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?" + }, + "ERROR": { + "ES_CONNECTION_ERROR": "Nodo de datos <b>{{server}}</b> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class=\"positive\" ng-click=\"doQuickFix('settings')\"> los ajustes de la extensión </a>.", + "ES_MAX_UPLOAD_BODY_SIZE": "El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos." + } +} diff --git a/www/plugins/es/i18n/locale-fr-FR.json b/www/plugins/es/i18n/locale-fr-FR.json index f58d502da92e0a21c8ba2a694c80c2a291c30f5f..189658064459883899fe120b2db598b6c2dffe0f 100644 --- a/www/plugins/es/i18n/locale-fr-FR.json +++ b/www/plugins/es/i18n/locale-fr-FR.json @@ -603,5 +603,22 @@ "ERROR": { "ES_CONNECTION_ERROR": "Nœud de données <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Cesium va continuer à fonctionner, <b>sans l'extension Cesium+</b> (profils utilisateur, messages privés, cartes et graphiques)<br/><br/>Vérifiez votre connexion Internet, ou changez de nœud de données dans les <a class=\"positive\" ng-click=\"doQuickFix('settings')\">paramètres de l'extension</a>.", "ES_MAX_UPLOAD_BODY_SIZE": "Le volume des données à envoyer dépasse la limite fixée par le serveur.<br/>Veuillez ré-essayer après avoir, par exemple, supprimer des photos." + }, + "ADMIN": { + "MESSAGE": { + "BTN_SEND_EMAIL": "Envoyer un email groupé" + }, + "LOG": { + "BTN_SHOW_LOG": "Logs des IP bloquées", + "VIEW": { + "TITLE": "Logs", + "LOG_REQUEST_DIVIDER": "Liste des requêtes bloquées" + } + }, + "ERROR": { + "NO_SSL_ACCESS": "Impossible d'accéder à cause des restriction SSL.", + "LOAD_LOG_FAILED": "Erreur de lecture des logs impossible.", + "AUTH_ERROR": "Erreur d'authentification au pod" + } } } diff --git a/www/plugins/es/js/controllers/admin-controllers.js b/www/plugins/es/js/controllers/admin-controllers.js new file mode 100644 index 0000000000000000000000000000000000000000..4431897bd667e57380046803dc32796dd4707f0c --- /dev/null +++ b/www/plugins/es/js/controllers/admin-controllers.js @@ -0,0 +1,159 @@ +angular.module('cesium.es.admin.controllers', ['cesium.es.services']) + + .config(function($stateProvider) { + 'ngInject'; + + $stateProvider + + .state('app.es_peer_log', { + url: "/network/data/peer/:server/log?ssl&tor", + cache: false, + views: { + 'menuContent': { + templateUrl: "plugins/es/templates/admin/view_log.html", + controller: 'ESAdminViewLogCtrl' + } + }, + data: { + silentLocationChange: true + } + }) + }) + + .controller('ESAdminViewLogCtrl', ESAdminViewLogController) + +; + +function ESAdminViewLogController($scope, $q, $window, $state, UIUtils, csWot, esHttp, csHttp) { + 'ngInject'; + + $scope.node = {}; + $scope.motion = UIUtils.motion.fadeSlideIn; + $scope.ionItemClass = 'item-border-large'; + $scope.isHttps = ($window.location.protocol === 'https:'); + $scope.defaultSizeLimit = $scope.defaultSizeLimit || (UIUtils.screen.isSmall() ? 50 : 100); + $scope.search = { + loading: true, + hasMore: false, + type: undefined, // 'text', 'last' + text: undefined, + results: [], + sort: 'time', + asc: false, + loadingMore: false + }; + + $scope.$on('$ionicView.enter', function(e, state) { + var isDefaultNode = !state.stateParams || !state.stateParams.server; + var server = state.stateParams && state.stateParams.server || esHttp.server; + var useSsl = state.stateParams && state.stateParams.ssl == "true" || (isDefaultNode ? esHttp.useSsl : false); + var useTor = state.stateParams.tor == "true" || (isDefaultNode ? esHttp.useTor : false); + + console.info('[ES] Starting log view...'); + $scope.init(server, useSsl, useTor); + + return $scope.load() + .then(function() { + return $scope.$broadcast('$csExtension.enter', e, state); + }) + .then(function(){ + $scope.search.loading = false; + }) + .catch(function(err) { + $scope.search.loading = false; + UIUtils.onError()(err); + }); + }); + + $scope.init = function(server, useSsl, useTor) { + if ($scope.isHttps && !useSsl) return $q.reject({message: 'ADMIN.ERROR.NO_SSL_ACCESS'}); + + var node = { + server: server, + host: server, + useSsl: useSsl, + useTor: useTor + }; + var serverParts = server.split(':'); + if (serverParts.length === 2) { + node.host = serverParts[0]; + node.port = serverParts[1]; + } + if (angular.isUndefined(node.port)) { + node.port = node.useSsl ? 443 : 80; + } + if (esHttp.node.same(node.host, node.port, node.useSsl)) { + $scope.node = esHttp; + } else { + node.url = csHttp.getUrl(node.host, node.port, undefined/*path*/, node.useSsl); + + $scope.node = angular.merge(useTor ? + // For TOR, use a web2tor to access the endpoint + esHttp.instance(node.host + ".to", 443, 443, true/*ssl*/, 60000 /*long timeout*/, true) : + esHttp.instance(node.host, node.port, node.useSsl, true), + node); + } + return $scope.node; + } + + $scope.load = function(from, size) { + + var options = {}; + options.from = from || 0; + options.size = size || $scope.defaultSizeLimit; + + options.text = $scope.search.type === 'text' && $scope.search.text && $scope.search.text.trim(); + + // add sort + if ($scope.search.sort) { + options.sort = {}; + options.sort[$scope.search.sort] = (!$scope.search.asc ? "desc" : "asc"); + } + else { // default sort + options.sort = {time:'desc'}; + } + + return $scope.node.log.request.search(options) + .then(function(items) { + items = items || []; + if (options.from === 0) { + $scope.search.results = items; + } + else { + $scope.search.results = $scope.search.results.concat(items); + } + $scope.search.fetchMore = items && items.length === options.size; + + // Set Motion + $scope.motion.show({ + selector: '.item', + ink: false + }); + }) + .catch(UIUtils.onError("ADMIN.ERROR.LOAD_LOG_FAILED")); + }; + + $scope.selectPeer = function(peer) { + // Skip offline + if (!peer.online ) return; + + var stateParams = {server: peer.getServer()}; + if (peer.isSsl()) { + stateParams.ssl = true; + } + if (peer.isTor()) { + stateParams.tor = true; + } + $state.go('app.view_es_peer', stateParams); + }; + + /* -- manage link to raw document -- */ + + $scope.openRawPeering = function(event) { + return $scope.openLink(event, $scope.node.url + '/network/peering?pretty'); + }; + + $scope.openRawCurrentBlock = function(event) { + return $scope.openLink(event, $scope.node.url + '/network/peering?pretty'); + }; +} diff --git a/www/plugins/es/js/controllers/network-controllers.js b/www/plugins/es/js/controllers/network-controllers.js index 949bb2cb77ed943a07c67f740b6a90ceadee840e..be23dfb6906443694aa86bea73a7b47f55ead331 100644 --- a/www/plugins/es/js/controllers/network-controllers.js +++ b/www/plugins/es/js/controllers/network-controllers.js @@ -502,7 +502,7 @@ function ESPeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, $scope.load(); } -function ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHttp, csHttp, csSettings) { +function ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHttp, csHttp, csSettings, csWallet) { 'ngInject'; $scope.node = {}; @@ -561,8 +561,9 @@ function ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHtt node); $scope.isReachable = !$scope.isHttps || useSsl; + + // If not reachable: workaround to get info from the default node if (!$scope.isReachable) { - // Get node from the default node return esHttp.network.peers() .then(function(res) { // find the current peer @@ -570,7 +571,7 @@ function ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHtt var peer = new EsPeer(json); if (!peer.hasEsEndpoint()) return res; var ep = esHttp.node.parseEndPoint(peer.getEsEndpoints()[0]); - if((ep.dns == node.host || ep.ipv4 == node.host || ep.ipv6 == node.host) && ( + if ((ep.dns === node.host || ep.ipv4 === node.host || ep.ipv6 === node.host) && ( ep.port == node.port)) { peer.ep = ep; return res.concat(peer); @@ -598,6 +599,10 @@ function ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHtt .then(function(json) { $scope.node.pubkey = json.pubkey; $scope.node.currency = json.currency; + $scope.admin = csWallet.isLogin() && json.pubkey === csWallet.data.pubkey; + if ($scope.admin) { + console.info("[ES] [peer] Wallet user is admin"); + } }), // Get node doc count @@ -640,6 +645,15 @@ function ESPeerViewController($scope, $q, $window, $state, UIUtils, csWot, esHtt $scope.node.blockchain.current() .then(function(json) { $scope.current = json; + }), + + // Load moderators + $scope.node.node.moderators() + .then(function(res) { + $scope.moderator = csWallet.isLogin() && _.contains(res && res.moderators, csWallet.data.pubkey); + if ($scope.moderator) console.info("[ES] [peer] Wallet user is a moderator"); + }).catch(function(err) { + console.error("[peer] Cannot load moderators. Too old Pod version ?"); }) ]) .catch(UIUtils.onError(useTor ? "PEER.VIEW.ERROR.LOADING_TOR_NODE_ERROR" : "PEER.VIEW.ERROR.LOADING_NODE_ERROR")); diff --git a/www/plugins/es/js/plugin.js b/www/plugins/es/js/plugin.js index 05a69ab169be59e629611595a90d1b7c20519d83..9d448551cb11c2652083ac5fd2bbd8c9a0451eed 100644 --- a/www/plugins/es/js/plugin.js +++ b/www/plugins/es/js/plugin.js @@ -19,6 +19,7 @@ angular.module('cesium.es.plugin', [ 'cesium.es.invitation.controllers', 'cesium.es.subscription.controllers', 'cesium.es.document.controllers', - 'cesium.es.like.controllers' + 'cesium.es.like.controllers', + 'cesium.es.admin.controllers' ]) ; diff --git a/www/plugins/es/js/services/http-services.js b/www/plugins/es/js/services/http-services.js index e8e3a1bf88d53109a7aeff602846cf195e201331..1b369887c57b2b04ff5cd9146de7295c1a8abc31 100644 --- a/www/plugins/es/js/services/http-services.js +++ b/www/plugins/es/js/services/http-services.js @@ -40,7 +40,8 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic truncUrlFilter = $filter('truncUrl'); that.data = { - isFallback: false + isFallback: false, + token: null// Used to store pod authentication token }; that.useCache = angular.isDefined(enableCache) ? enableCache : false; // need here because used in get() function that.raw = { @@ -195,14 +196,22 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic }; that.post = function(path) { - var postRequest = function(obj, params) { + var postRequest = function(obj, params, config) { + // Add auth token + if (that.data.token) { + config = angular.merge({ + headers: { + 'Authorization': 'token ' + that.data.token + } + }, config); + } if (!that.started) { if (!that._startPromise) { console.error('[ES] [http] Trying to post [{0}] before start()...'.format(path)); } return that.ready().then(function(start) { if (!start) return $q.reject('ERROR.ES_CONNECTION_ERROR'); - return postRequest(obj, params); // loop + return postRequest(obj, params, config); // loop }); } @@ -211,7 +220,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic request = csHttp.post(that.host, that.port, path, that.useSsl); that.raw.postByPath[path] = request; } - return request(obj, params); + return request(obj, params, config); }; return postRequest; }; @@ -767,6 +776,62 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic }); } + function isAuth() { + return that.data && !!that.data.token; + } + + function auth(options) { + options = options || {}; + console.info('[ES] Authenticate on server...'); + var nodePubkey = options.nodePubkey; + var wallet = options.wallet || options.walletId && csWallet.children.get(options.walletId) || csWallet; + return (wallet.isAuth() ? $q.when(wallet.data) : wallet.auth({silent: true, minData: true})) + .then(function(walletData) { + var keypair = options.keypair || walletData && walletData.keypair; + if (!keypair && !wallet) { + throw new Error('Missing wallet or keypair, to sign auth challenge'); + } + // Get challenge + return that.get('/auth')() + .then(function(json) { + var challenge = json && json.challenge; + return $q.all([ + CryptoUtils.verify(json.challenge, json.signature, nodePubkey || json.pubkey), + CryptoUtils.sign(challenge, keypair) + ]) + .then(function(res) { + var signature = res[1]; + return that.post('/auth')({challenge: challenge, signature: signature, pubkey: wallet.data.pubkey}) + }) + .then(function(token) { + console.info('[ES] Authentication to pod succeed. token: ' + token); + that.data.token = token; + return token; + }); + }); + }); + } + + function logSearch(options) { + if (!isAuth()) { + return auth().then(function() { + return logSearch(options); + }); + } + options = options || {}; + var request = { + from: options.from || 0, + size: options.size || 20, + sort: options.sort || {time: 'desc'} + } + return that.post('/log/request/_search')(request) + .then(function(res) { + return _(res && res.hits && res.hits.hits || []).reduce(function(res, hit) { + return res.concat(hit._source); + }, []); + }); + } + function addListeners() { // Watch some service events listeners = [ @@ -794,7 +859,13 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic parseEndPoint: parseEndPoint, same: isSameNode, sameAsSettings: isSameNodeAsSettings, - isFallback: isFallbackNode + isFallback: isFallbackNode, + auth: auth + }, + log: { + request: { + search: logSearch + } }, version: { latest: getLatestVersion @@ -842,6 +913,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic } + // Default instance var service = new EsHttp(undefined, undefined, undefined, true); service.instance = function(host, port, useSsl, enableCache) { @@ -875,7 +947,8 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic port: port, useSsl: useSsl, node: { - summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, timeout) + summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, timeout), + moderators: csHttp.get(host, port, '/node/moderators', useSsl, timeout) }, network: { peering: { diff --git a/www/plugins/es/js/services/message-services.js b/www/plugins/es/js/services/message-services.js index cc54982a56de7e73c03fb67f610254a60f4fec1a..ae4abacbed8300ed75e78aefd7de332a27a6c8ed 100644 --- a/www/plugins/es/js/services/message-services.js +++ b/www/plugins/es/js/services/message-services.js @@ -288,7 +288,7 @@ angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform', // Add avatar .then(function(messages){ - var avatarField = (options.type == 'inbox') ? 'issuer' : 'recipient'; + var avatarField = (options.type === 'inbox') ? 'issuer' : 'recipient'; return csWot.extendAll(messages, avatarField); }) diff --git a/www/plugins/es/templates/admin/view_log.html b/www/plugins/es/templates/admin/view_log.html new file mode 100644 index 0000000000000000000000000000000000000000..ac5ce7222f1c758f873b6fc41a3971c5dba146b9 --- /dev/null +++ b/www/plugins/es/templates/admin/view_log.html @@ -0,0 +1,58 @@ +<ion-view> + <ion-nav-title> + <span translate>ADMIN.LOG.VIEW.TITLE</span> + <span translate>ES_SETTINGS.PLUGIN_NAME</span> + </ion-nav-title> + + <ion-content> + + <div class="row no-padding"> + <div class="col col-20 hidden-xs hidden-sm"> + </div> + + <div class="col list"> + + <ion-item> + <h2 class="gray"> + <span translate>PEER.VIEW.TITLE</span> + <i class="gray icon ion-android-globe"></i> + {{node.ep.dns || node.server}} + <span class="gray" ng-if="!search.loading && node.useSsl"> + <i class="gray ion-locked"></i> <small>SSL</small> + </span> + <span class="gray" ng-if="!search.loading && node.useTor"> + <i class="gray ion-bma-tor-api"></i> + </span> + </h2> + + </ion-item> + + + <!-- Allow extension here --> + <cs-extension-point name="general"></cs-extension-point> + + <div class="item item-divider"translate> + ADMIN.LOG.VIEW.LOG_REQUEST_DIVIDER + </div> + + <div class="item center" ng-if="search.loading"> + <ion-spinner class="icon" icon="android"></ion-spinner> + </div> + + <div class="list no-padding" ng-class="::motion.ionListClass"> + + <div ng-repeat="item in search.results" + class="item item-peer item-icon-left ink" + ng-class="::ionItemClass"> + {{item.time|formatDate}} - {{item.host}} - {{item.path}} ({{item.method}}) + </div> + + </div> + </div> + + <div class="col col-20 hidden-xs hidden-sm"> + </div> + </div> + + </ion-content> +</ion-view> diff --git a/www/plugins/es/templates/common/edit_socials.html b/www/plugins/es/templates/common/edit_socials.html index bed22c7da2143a2b41f1c87d8915f45a99b9efb7..78bdc7458ca8266a7e2fc51f9ea515d3a64b9d43 100644 --- a/www/plugins/es/templates/common/edit_socials.html +++ b/www/plugins/es/templates/common/edit_socials.html @@ -1,4 +1,4 @@ -<div class="list no-padding {{::motion.ionListClass}}"> +<div class="list no-padding" ng-class="::motion.ionListClass"> <!-- divider --> <div class="item item-divider"> diff --git a/www/plugins/es/templates/common/modal_location.html b/www/plugins/es/templates/common/modal_location.html index 98bb4a174d988a839d6d977a3ab86a899b260370..732ee57de13b05934bbef03e6c96e52e7de9e232 100644 --- a/www/plugins/es/templates/common/modal_location.html +++ b/www/plugins/es/templates/common/modal_location.html @@ -48,7 +48,8 @@ </div> <ion-list ng-if="!search.loading" - class="padding-top {{::motion.ionListClass}}"> + class="padding-top" + ng-class="::motion.ionListClass"> <div ng-repeat="res in search.results" class="item item-border-large item-text-wrap ink" ng-class="::{'item-divider': !res.address, 'item-icon-left item-icon-right': res.address}" diff --git a/www/plugins/es/templates/group/edit_group.html b/www/plugins/es/templates/group/edit_group.html index 50f218a8ab59a82fd08ad4fe3aca4fd3386d5f8d..18c01d46807e53a72cf54d0fef23bddcfddbd346 100644 --- a/www/plugins/es/templates/group/edit_group.html +++ b/www/plugins/es/templates/group/edit_group.html @@ -26,7 +26,7 @@ <!-- --> <div class="list" - ng-class="motion.ionListClass" + ng-class="::motion.ionListClass" ng-init="setForm(recordForm)"> <div class="item hidden-xs"> diff --git a/www/plugins/es/templates/group/list.html b/www/plugins/es/templates/group/list.html index 95e49b6a9d35fa7230b1f97337c1f0ff7ff11b84..4a69811904ea8bd505f71226eb584aff3c272276 100644 --- a/www/plugins/es/templates/group/list.html +++ b/www/plugins/es/templates/group/list.html @@ -1,4 +1,4 @@ -<ion-list class="{{::motion.ionListClass}}"> +<ion-list ng-class="::motion.ionListClass"> <ion-item ng-repeat="notification in search.results" diff --git a/www/plugins/es/templates/group/lookup_form.html b/www/plugins/es/templates/group/lookup_form.html index 889b7216f35e8dccd874d54d86a18e896e938d7f..86afba48099f9b9af8209bbd7e1874a8f394ced4 100644 --- a/www/plugins/es/templates/group/lookup_form.html +++ b/www/plugins/es/templates/group/lookup_form.html @@ -71,8 +71,8 @@ </div> </div> - <div class="list {{::motion.ionListClass}}" ng-if="!$scope.search.loading"> - + <div ng-if="!$scope.search.loading" + class="list" ng-class="::motion.ionListClass"> <ng-include src="::'plugins/es/templates/group/items_groups.html'"></ng-include> </div> diff --git a/www/plugins/es/templates/invitation/list_invitation.html b/www/plugins/es/templates/invitation/list_invitation.html index 098d27a81a6acfb97b92ce4ebec745ece987bfdf..75803256f74ee1e9827266a77d79a4d57ca10fbb 100644 --- a/www/plugins/es/templates/invitation/list_invitation.html +++ b/www/plugins/es/templates/invitation/list_invitation.html @@ -1,4 +1,4 @@ -<ion-list class="{{::motion.ionListClass}}"> +<ion-list ng-class="::motion.ionListClass"> <ion-item ng-repeat="invitation in search.results" diff --git a/www/plugins/es/templates/message/list.html b/www/plugins/es/templates/message/list.html index c564a6e49202901bde89e749284751e5faed20f2..33e4c58fe48637ad5dc0c72f59ecb5db02d3ac73 100644 --- a/www/plugins/es/templates/message/list.html +++ b/www/plugins/es/templates/message/list.html @@ -3,7 +3,7 @@ <span ng-if="search.type=='text'" translate>COMMON.SEARCH_NO_RESULT</span> </div> -<ion-list class="{{::motion.ionListClass}}" +<ion-list ng-class="::motion.ionListClass" can-swipe="$root.device.enable"> <ion-item diff --git a/www/plugins/es/templates/message/view_message.html b/www/plugins/es/templates/message/view_message.html index 3ce1f164ef6aab08a79b7d5dd73190bd9e02ad75..1c37f7871c3092320b838236d6494889b3634095 100644 --- a/www/plugins/es/templates/message/view_message.html +++ b/www/plugins/es/templates/message/view_message.html @@ -21,7 +21,7 @@ <ion-spinner icon="android"></ion-spinner> </div> - <div class="list animate-fade-slide-in item-text-wrap"> + <div class="list item-text-wrap" ng-class="::motion.ionListClass"> <!-- Buttons bar--> <div class="item large-button-bar hidden-xs hidden-sm"> diff --git a/www/plugins/es/templates/network/view_es_peer.html b/www/plugins/es/templates/network/view_es_peer.html index 063954fb7a07f7fbf09e1ad803bd8f6330c9dbfd..34c6e2e3f5326f6cbd23636aaa611d0d1ef3c06b 100644 --- a/www/plugins/es/templates/network/view_es_peer.html +++ b/www/plugins/es/templates/network/view_es_peer.html @@ -106,6 +106,22 @@ <!-- Allow extension here --> <cs-extension-point name="general"></cs-extension-point> + <ion-item class="item item-icon-left item-icon-right item-text-wrap" + ui-sref="app.es_peer_log({server: node.server, ssl: node.useSsl, tor: node.useTor})" + ng-if="!loading && isReachable && (admin || moderator)"> + <i class="icon ion-document"></i> + <span translate>ADMIN.LOG.BTN_SHOW_LOG</span> + <i class="gray icon ion-ios-arrow-right"></i> + </ion-item> + + <ion-item class="item item-icon-left item-icon-right item-text-wrap" + ui-sref="app.user_new_message" + ng-if="!loading && isReachable && admin"> + <i class="icon ion-email"></i> + <span translate>ADMIN.MESSAGE.BTN_SEND_EMAIL</span> + <i class="gray icon ion-ios-arrow-right"></i> + </ion-item> + <div class="item item-divider" ng-hide="loading || !isReachable" translate> PEER.VIEW.KNOWN_PEERS </div> @@ -119,7 +135,8 @@ <ion-spinner class="icon" icon="android"></ion-spinner> </div> - <div class="list no-padding {{::motion.ionListClass}}" ng-if="isReachable"> + <div ng-if="isReachable" + class="list no-padding" ng-class="::motion.ionListClass"> <div ng-repeat="peer in :rebind:peers track by peer.id" class="item item-peer item-icon-left ink" diff --git a/www/plugins/es/templates/notification/list_notification.html b/www/plugins/es/templates/notification/list_notification.html index 6b98515553b16f4ecdb458e40b31f55e0fc44217..0ee96bf6714258c3be0141113dcd1487b5ef174b 100644 --- a/www/plugins/es/templates/notification/list_notification.html +++ b/www/plugins/es/templates/notification/list_notification.html @@ -1,4 +1,4 @@ -<ion-list class="{{::motion.ionListClass}}"> +<ion-list ng-class="::motion.ionListClass"> <ion-item ng-repeat="notification in search.results track by notification.id" diff --git a/www/plugins/es/templates/registry/edit_record.html b/www/plugins/es/templates/registry/edit_record.html index 565a813c9fb01b4fbef77655daf1d89e035679b9..44a3cb491d3ebd33e91461577e20655bb71f48ab 100644 --- a/www/plugins/es/templates/registry/edit_record.html +++ b/www/plugins/es/templates/registry/edit_record.html @@ -48,7 +48,7 @@ <div class="col no-padding-xs no-padding-sm"> <form name="recordForm" novalidate="" ng-submit="save()"> - <div class="list {{::motion.ionListClass}}" + <div class="list" ng-class="::motion.ionListClass" ng-init="setForm(recordForm)"> <div class="item" ng-if="id"> <h4 class="gray"> diff --git a/www/plugins/es/templates/registry/lookup_list.html b/www/plugins/es/templates/registry/lookup_list.html index 5b98cb48ebab7cbe4ab9ec0155bf952e2009a386..9618ed363626c429a58c35dcb7f3ed681af8d191 100644 --- a/www/plugins/es/templates/registry/lookup_list.html +++ b/www/plugins/es/templates/registry/lookup_list.html @@ -1,6 +1,6 @@ -<ion-list class="{{::motion.ionListClass}}" - ng-if="!search.loading && search.results"> +<ion-list ng-if="!search.loading && search.results" + ng-class="::motion.ionListClass"> <div class="item item-avatar item-icon-right item-border-large ink" ng-repeat="item in search.results" diff --git a/www/plugins/es/templates/registry/lookup_list_lg.html b/www/plugins/es/templates/registry/lookup_list_lg.html index a98685446e48cad2d8323ebe8f483f3b198b4d31..e2105612fe88b6d70f64afa1ffd0613e063fc0a3 100644 --- a/www/plugins/es/templates/registry/lookup_list_lg.html +++ b/www/plugins/es/templates/registry/lookup_list_lg.html @@ -1,7 +1,7 @@ -<div class="list {{::motion.ionListClass}}" - ng-if="!search.loading && search.results && search.results.length > 0"> +<div ng-if="!search.loading && search.results && search.results.length > 0" + class="list {{::motion.ionListClass}}" ng-class="::motion.ionListClass"> <a ng-repeat="item in search.results" class="item item-record item-border-large ink padding-xs" diff --git a/www/plugins/es/templates/registry/view_record.html b/www/plugins/es/templates/registry/view_record.html index 1c2e95c596eef00be53ecb5f49b8ee45697d72bc..9ee01722102f3f80c60512a8ffef512f3e4c9d49 100644 --- a/www/plugins/es/templates/registry/view_record.html +++ b/www/plugins/es/templates/registry/view_record.html @@ -51,7 +51,7 @@ <div class="col col-20 hidden-xs hidden-sm"> </div> - <div class="col list animate-fade-slide-in item-text-wrap no-padding-xs no-padding-sm"> + <div class="col list item-text-wrap no-padding-xs no-padding-sm" ng-class="::motion.ionListClass"> <div class="item"> <h2 class="gray"> diff --git a/www/plugins/es/templates/subscription/edit_subscriptions.html b/www/plugins/es/templates/subscription/edit_subscriptions.html index 5590006f7c3ee40c46cf6cfca2afaa8db4d3e55d..db1565ecc901162cb5ee2c50888b824c4d741bc4 100644 --- a/www/plugins/es/templates/subscription/edit_subscriptions.html +++ b/www/plugins/es/templates/subscription/edit_subscriptions.html @@ -39,7 +39,7 @@ <div class="row no-padding"> <div class="col col-20 hidden-xs hidden-sm"> </div> - <div class="col list {{::motion.ionListClass}} item-border-large"> + <div class="col list item-border-large" ng-class="::motion.ionListClass"> <!-- emails --> <ng-repeat ng-repeat="subscriptions in search.results | filter: { type: 'email' }" diff --git a/www/plugins/es/templates/user/edit_profile.html b/www/plugins/es/templates/user/edit_profile.html index 0efadbbaba066cc359dd0ee2c8c5322a72afb660..a9a16ba605898f61e42bb76a4ec7e1cc39a1fecb 100644 --- a/www/plugins/es/templates/user/edit_profile.html +++ b/www/plugins/es/templates/user/edit_profile.html @@ -64,7 +64,8 @@ <form name="profileForm" novalidate="" ng-submit="saveAndClose()"> - <div class="list item-text-wrap {{::motion.ionListClass}}" ng-init="setForm(profileForm)"> + <div class="list item-text-wrap" ng-class="::motion.ionListClass" + ng-init="setForm(profileForm)"> <!-- Public info --> <div class="item item-icon-left item-text-wrap"> @@ -118,7 +119,7 @@ <!-- social networks --> <ng-include src="::'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include> - <div class="list item-text-wrap {{::motion.ionListClass}}"> + <div class="list item-text-wrap" ng-class="::motion.ionListClass"> <div class="item item-divider" translate>PROFILE.TECHNICAL_DIVIDER</div> diff --git a/www/plugins/graph/i18n/locale-eo-EO.json b/www/plugins/graph/i18n/locale-eo-EO.json index e6bf39faccce0ab70e0e5de237fc71fc3adc112a..1ac1f83ad3c1da80043ea5e1da516326d4410fb7 100644 --- a/www/plugins/graph/i18n/locale-eo-EO.json +++ b/www/plugins/graph/i18n/locale-eo-EO.json @@ -15,6 +15,15 @@ "HOUR": "Horo", "DAY": "Tago", "MONTH": "Monato" + }, + "MAX_AGE": { + "DAY": "Depost 24h", + "WEEK": "Depost unu semajno", + "MONTH": "Depost unu monato", + "QUARTER": "Depost 3 monatoj", + "SEMESTER": "Depost 6 monatoj", + "YEAR": "Depost unu jaro", + "FOREVER": "Depost ĉiam" } }, "ACCOUNT": { @@ -50,7 +59,6 @@ "TX_COUNT_TITLE": "Nombro de spezoj skribitaj", "TX_COUNT_LABEL": "Nombro de spezoj", "TX_AVG_BY_BLOCK": "Meza nombro de spezoj / bloko" - }, "CURRENCY": { "MONETARY_MASS_TITLE": "Evoluo de la mona maso", @@ -58,7 +66,11 @@ "MONETARY_MASS_SHARE_LABEL": "Mezumo por membro", "UD_TITLE": "Evoluo de la universala dividendo", "MEMBERS_COUNT_TITLE": "Evoluo de la nombro de membroj", - "MEMBERS_COUNT_LABEL": "Nombro de membroj" + "MEMBERS_COUNT_LABEL": "Nombro de membroj", + "MEMBERS_DELTA_TITLE": "Variado de la nombro de membroj", + "IS_MEMBER_DELTA_LABEL": "Novaj aliĝoj", + "WAS_MEMBER_DELTA_LABEL": "Aliĝo-perdoj", + "PENDING_DELTA_LABEL": "Aliĝo-petoj" }, "PEER": { "VIEW": { @@ -106,13 +118,18 @@ }, "PEER": { "TITLE": "Nodoj informpetitaj", - "ES_USER_API": "Nodoj pri datenoj de uzantoj", - "ES_SUBSCRIPTION_API": "Nodoj pri retaj servoj" + "ES_USER_API": "Nodoj kun datenoj de uzantoj", + "ES_SUBSCRIPTION_API": "Nodoj kun retaj servoj" }, "PERFORMANCE": { "TITLE": "Efikecoj pri efektiviĝo", "DURATION": "Tempo por efektiviĝo (ms)" } + }, + "NETWORK": { + "TITLE": "Statistikoj pri la reto", + "ENDPOINT_COUNT_TITLE": "Nombro de alir-punktoj", + "ENDPOINT_DELTA_TITLE": "Variado de la nombro de alir-punktoj" } } } diff --git a/www/plugins/map/js/controllers/wot-controllers.js b/www/plugins/map/js/controllers/wot-controllers.js index 6dcf422e363ac14554f69950c2d83ecfe2de0e84..7e60ae2497b588de95da96002bc97f80e0637ca2 100644 --- a/www/plugins/map/js/controllers/wot-controllers.js +++ b/www/plugins/map/js/controllers/wot-controllers.js @@ -156,8 +156,10 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti $scope.map.center.zoom = parseInt(cPart[2]); } + var lastLocationUpdate = Date.now(); $scope.$watch("map.center", function() { - if (!$scope.loading) { + if (!$scope.loading && (Date.now() - lastLocationUpdate) > 5000) { + lastLocationUpdate = Date.now(); return $timeout(function() { $scope.updateLocationHref(); }, 300); @@ -279,22 +281,19 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti .then($scope.load); } + console.info('[map] Leaflet map is ready: starting loading data...'); $scope.loading = true; // Show loading indicator map.fire('dataloading'); + // add bounding box var options = { - fields: { - description: $scope.enableDescription - } + bounds: angular.copy($scope.map.bounds) }; + delete options.bounds.options; - // add bounding box - if ($scope.map.bounds) { - // FIXME - this is not working well - //options.bounds = angular.copy($scope.map.bounds); - //delete options.bounds.options; - } + var formatPubkey = $filter('formatPubkey'); + var markerTemplate = $templateCache.get('plugins/map/templates/wot/popup_marker.html'); // Load wot data, from service return mapWot.load(options) @@ -302,26 +301,24 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti .then(function(res) { var markers = {}; - if (res && res.length) { - var formatPubkey = $filter('formatPubkey'); - var markerTemplate = $templateCache.get('plugins/map/templates/wot/popup_marker.html'); - - _.forEach(res, function (hit) { var type = hit.pending ? 'pending' : (hit.uid ? 'member' : 'wallet'); var id = hit.index + '_' + (hit.id || (hit.uid ? (hit.uid + ':' + hit.pubkey) : hit.pubkey)).replace(/-/g, '_'); var title = hit.name + ' | ' + formatPubkey(hit.pubkey); var marker = { + id: id, + message: markerTemplate, + title: title, layer: type, icon: icons[type], opacity: hit.uid ? 1 : 0.7, - title: title, lat: hit.geoPoint.lat, lng: hit.geoPoint.lon, + focus: false, getMessageScope: function () { - //console.debug('[map] Loading marker ' + title + "..."); + console.debug('[map] Loading marker ' + title + "..."); var markerScope = $scope.$new(); markerScope.loadingMarker = true; markerScope.formData = {}; @@ -331,15 +328,12 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti uid: hit.uid, name: title, profile: hit, - isMember: type == 'member' + isMember: type === 'member' }; markerScope.loadingMarker = false; }); return markerScope; - }, - focus: false, - message: markerTemplate, - id: id + } }; markers[id] = marker; }); @@ -369,10 +363,10 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti $scope.updateLocationHref = function(centerHash) { // removeIf(device) var params = $location.search() || {}; - if (!params.c || !MapUtils.center.isDefault($scope.map.center)) { + /*if (!params.c || !MapUtils.center.isDefault($scope.map.center)) { centerHash = centerHash || '{0}:{1}:{2}'.format($scope.map.center.lat.toFixed(4), $scope.map.center.lng.toFixed(4), $scope.map.center.zoom); $location.search({c: centerHash}).replace(); - } + }*/ // endRemoveIf(device) }; diff --git a/www/plugins/map/js/services/utils-services.js b/www/plugins/map/js/services/utils-services.js index 1d95ce26e92bae30672a78c240b2824982dfcb50..3154eaabac76f607162ed883e98b4913d940793a 100644 --- a/www/plugins/map/js/services/utils-services.js +++ b/www/plugins/map/js/services/utils-services.js @@ -13,7 +13,7 @@ angular.module('cesium.map.utils.services', ['cesium.services', 'ui-leaflet']) lat: 46.5588603, lng: 4.229736328124999, zoom: 6 } }, - LOCALIZE_ZOOM: 15 + LOCALIZE_ZOOM: 16 }, data = { cache: {} diff --git a/www/plugins/map/js/services/wot-services.js b/www/plugins/map/js/services/wot-services.js index e34fa9e9ccf4c9b3a7698d5bf10f5721d5ae45aa..b25b4e224ffa1d6fce571dfce263489928e9d161 100644 --- a/www/plugins/map/js/services/wot-services.js +++ b/www/plugins/map/js/services/wot-services.js @@ -22,75 +22,92 @@ angular.module('cesium.map.wot.services', ['cesium.services']) } }; + /** + * Convert Leaflet BBox into ES BBox query + * see https://www.elastic.co/guide/en/elasticsearch/reference/2.4/geo-point.html + * @param bounds + */ function createFilterQuery(options) { - options = options || {}; - var query = { - bool: {} - }; + var bounds = options && options.bounds; + if (!bounds) throw new Error('Missing options.bounds!'); + + var minLon = Math.min(bounds.northEast.lng, bounds.southWest.lng), + minLat = Math.min(bounds.northEast.lat, bounds.southWest.lat), + maxLon = Math.max(bounds.northEast.lng, bounds.southWest.lng), + maxLat = Math.max(bounds.northEast.lat, bounds.southWest.lat); - // Limit to profile with geo point - if (options.searchAddress) { - query.bool.should = [ + return {constant_score: { + filter: [ {exists: {field: "geoPoint"}}, - {exists: {field: "city"}} - ]; - } - else { - query.bool.must= [ - {exists: {field: "geoPoint"}} - ]; - } + {geo_bounding_box: {geoPoint: { + top_left: { + lat: maxLat, + lon: minLon + }, + bottom_right: { + lat: minLat, + lon: maxLon + } + } + }} + ] + }}; + } - // Filter on bounding box - // see https://www.elastic.co/guide/en/elasticsearch/reference/2.4/geo-point.html - if (options.bounds && options.bounds.northEast && options.bounds.southWest) { - var boundingBox = { - "geoPoint" : { - "top_left" : { - "lat" : Math.max(Math.min(options.bounds.northEast.lat, 90), -90), - "lon" : Math.max(Math.min(options.bounds.southWest.lng, 180), -180) - }, - "bottom_right" : { - "lat" : Math.max(Math.min(options.bounds.southWest.lat, 90), -90), - "lon" : Math.max(Math.min(options.bounds.northEast.lng, 180), -180) - } - } - }; - console.debug("[map] [wot] Filtering on bounds: ", options.bounds); - query.bool.must = query.bool.must || []; - query.bool.must.push({geo_bounding_box: boundingBox}); + function createSliceQueries(options, total) { + var bounds = options && options.bounds; + if (!bounds) throw new Error('Missing options.bounds!'); + + var minLon = Math.min(bounds.northEast.lng, bounds.southWest.lng), + minLat = Math.min(bounds.northEast.lat, bounds.southWest.lat), + maxLon = Math.max(bounds.northEast.lng, bounds.southWest.lng), + maxLat = Math.max(bounds.northEast.lat, bounds.southWest.lat); + + var queries = []; + var lonStep = (maxLon - minLon) / 5; + var latStep = (maxLat - minLat) / 5; + for (var lon = minLon; lon < maxLon; lon += lonStep) { + for (var lat = minLat; lat < maxLat; lat += latStep) { + queries.push({constant_score: { + filter: [ + {exists: {field: "geoPoint"}}, + {geo_bounding_box: { + geoPoint: { + top_left: { + lat: lat + latStep, + lon: lon + }, + bottom_right: { + lat: lat, + lon: lon + lonStep + } + } + }} + ] + }}); + } } - return query; + return queries; } function load(options) { options = options || {}; options.from = options.from || 0; options.size = options.size || constants.DEFAULT_LOAD_SIZE; - options.searchAddress = esGeo.google.isEnable() && (angular.isDefined(options.searchAddress) ? options.searchAddress : true); options.fields = options.fields || {}; - options.fields.description = angular.isDefined(options.fields.description) ? options.fields.description : false; - var request = { + var countRequest = { query: createFilterQuery(options), - from: 0, - size: options.size, - _source: options.fields.description ? fields.profile.concat("description") : fields.profile + size: 0 }; var mixedSearch = false; - /*var mixedSearch = esSettings.wot.isMixedSearchEnable(); - if (mixedSearch) { - // add special fields for page and group - request._source = request._source.concat(["type", "pubkey", "issuer", "category"]); - console.debug("[ES] [map] Mixed search: enable"); - }*/ var search = mixedSearch ? that.raw.profile.mixedSearch : that.raw.profile.search; return $q.all([ - search(request), + search(countRequest), BMA.wot.member.uids(), BMA.wot.member.pending() .then(function(res) { @@ -98,14 +115,18 @@ angular.module('cesium.map.wot.services', ['cesium.services']) }) ]) .then(function(res) { + var total = res[0].hits && res[0].hits.total || 0; var uids = res[1]; var memberships = res[2]; - res = res[0]; - if (!res.hits || !res.hits.total) return []; + + if (!total) return []; // No data + + var now = Date.now(); + console.info('[map] [wot] Loading {0} profiles...'.format(total)); // Transform pending MS into a map by pubkey memberships = memberships.reduce(function(res, ms){ - if (ms.membership == 'IN' && !uids[ms.pubkey]) { + if (ms.membership === 'IN' && !uids[ms.pubkey]) { var idty = { uid: ms.uid, pubkey: ms.pubkey, @@ -122,26 +143,47 @@ angular.module('cesium.map.wot.services', ['cesium.services']) return res; }, {}); - var jobs = [ - processLoadHits(options, uids, memberships, res) - ]; - - // Additional slice requests - request.from += request.size; + var searchRecursive = function(request, result) { + request.from = request.from || 0; + request.size = request.size || constants.DEFAULT_LOAD_SIZE; + result = result || {hits: {hits: []}}; + + // DEBUG + //console.debug('Searching... ' + request.from); + + return search(request).then(function(res) { + if (!res.hits || !res.hits.hits.length) return result; + result.hits.total = res.hits.total; + result.hits.hits = result.hits.hits.concat(res.hits.hits); + if (result.hits.hits.length < result.hits.total) { + request.from += request.size; + if (request.from >= 10000) { + console.error("Cannot load more than 10000 profiles in a slice. Please reduce slice size!"); + return result; // Skip if too large + } + return searchRecursive(request, result); + } + return result; + }); + }; var processRequestResultFn = function(subRes) { if (!subRes.hits || !subRes.hits.hits.length) return []; return processLoadHits(options, uids, memberships, subRes); }; - while (request.from < res.hits.total) { - var searchRequest = search(angular.copy(request)).then(processRequestResultFn); - jobs.push(searchRequest); - request.from += request.size; - } - return $q.all(jobs) + + + return $q.all(createSliceQueries(options, total) + .reduce(function(res, query) { + var request = {query: query, _source: fields.profile}; + return res.concat(searchRecursive(request).then(processRequestResultFn)); + }, [])) .then(function(res){ - return res.reduce(function(res, items) { + var result = res.reduce(function(res, items) { return res.concat(items); }, []); + console.info('[map] [wot] Loaded {0} profiles in {1}ms'.format(result.length, Date.now() - now)); + + return result; }); }); } @@ -149,8 +191,7 @@ angular.module('cesium.map.wot.services', ['cesium.services']) function processLoadHits(options, uids, memberships, res) { // Transform profile hits - var commaRegexp = new RegExp('[,]'); - var searchAddressItems = []; + var commaRegexp = new RegExp(','); var items = res.hits.hits.reduce(function(res, hit) { var pubkey = hit._id; var uid = uids[pubkey]; @@ -164,19 +205,12 @@ angular.module('cesium.map.wot.services', ['cesium.services']) // Set geo point item.geoPoint = hit._source.geoPoint; - if (!item.geoPoint || !item.geoPoint.lat || !item.geoPoint.lon) { - if (!options.searchAddress || !item.city) return res; // no city: exclude this item - item.searchAddress = item.city && ((hit._source.address ? hit._source.address+ ', ' : '') + item.city); - searchAddressItems.push(item); + // Convert lat/lon to float (if need) + if (item.geoPoint.lat && typeof item.geoPoint.lat === 'string') { + item.geoPoint.lat = parseFloat(item.geoPoint.lat.replace(commaRegexp, '.')); } - else { - // Convert lat/lon to float (if need) - if (item.geoPoint.lat && typeof item.geoPoint.lat === 'string') { - item.geoPoint.lat = parseFloat(item.geoPoint.lat.replace(commaRegexp, '.')); - } - if (item.geoPoint.lon && typeof item.geoPoint.lon === 'string') { - item.geoPoint.lon = parseFloat(item.geoPoint.lon.replace(commaRegexp, '.')); - } + if (item.geoPoint.lon && typeof item.geoPoint.lon === 'string') { + item.geoPoint.lon = parseFloat(item.geoPoint.lon.replace(commaRegexp, '.')); } // Avatar @@ -190,39 +224,11 @@ angular.module('cesium.map.wot.services', ['cesium.services']) } // Description - item.description = hit._source.description && esHttp.util.parseAsHtml(hit._source.description); + //item.description = hit._source.description && esHttp.util.parseAsHtml(hit._source.description); return item.geoPoint ? res.concat(item) : res; }, []); - // Resolve missing positions by addresses (only if google API enable) - if (searchAddressItems.length) { - var now = Date.now(); - console.debug('[map] [wot] Search positions of {0} addresses...'.format(searchAddressItems.length)); - var counter = 0; - - return $q.all(searchAddressItems.reduce(function(res, item) { - return !item.city ? res : res.concat(esGeo.google.searchByAddress(item.searchAddress) - .then(function(res) { - if (!res || !res.length) return; - item.geoPoint = res[0]; - // If search on city, add a randomized delta to avoid superposition - if (item.city == item.searchAddress) { - item.geoPoint.lon += Math.random() / 1000; - item.geoPoint.lat += Math.random() / 1000; - } - delete item.searchAddress; // not need anymore - items.push(item); - counter++; - }) - .catch(function() {/*silent*/})); - }, [])) - .then(function(){ - console.debug('[map] [wot] Resolved {0}/{1} addresses in {2}ms'.format(counter, searchAddressItems.length, Date.now()-now)); - return items; - }); - } - return $q.when(items); } diff --git a/www/templates/common/qrcode.html b/www/templates/common/qrcode.html index b8c625a288ac6e4a5c06604ff3266a9375583015..a778b7f3a0db3265541405dfb82a1808b0fe5ffb 100644 --- a/www/templates/common/qrcode.html +++ b/www/templates/common/qrcode.html @@ -3,12 +3,17 @@ ng-class="{'active': toggleQRCode}" ng-click="toggleQRCode = !toggleQRCode"> <div class="content"></div> - <div class="footer item item-icon-left item-text-wrap ink" + <div class="footer item item-icon-left item-text-wrap item-icon-right ink" + ng-if="toggleQRCode" on-hold="copy(formData.pubkey)" - copy-on-click="{{:rebind:formData.pubkey}}" + copy-on-click="{{::formData.pubkey|formatPubkey:{full: true, checksum: formData.checksum} }}" ng-click="$event.stopPropagation()"> <i class="icon ion-key"></i> <span>{{:locale:'COMMON.PUBKEY'|translate}}</span> - <h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4> + + <h4 class="dark text-left">{{::formData.pubkey|formatPubkey: {full: true, checksum: formData.checksum} }}</h4> + + <!-- icon of the pubkey --> + <i class="icon" jdenticon="{{::formData.pubkey}}" jdenticon-size="32"></i> </div> </a> diff --git a/www/templates/login/popover_methods.html b/www/templates/login/popover_methods.html index 3c0a5dde79c1c95e5048dd3668c04c45a6a2ff21..15252f6bbba019b55984d56969459ff66d5e1cdc 100644 --- a/www/templates/login/popover_methods.html +++ b/www/templates/login/popover_methods.html @@ -1,5 +1,5 @@ <ion-popover-view class="fit has-header popover-login-methods" - ng-class="{'auth': isAuth}"> + ng-class="{'auth': isAuth, 'scan': $root.device.barcode.enable}"> <ion-header-bar> <h1 class="title" translate>LOGIN.METHOD_POPOVER_TITLE</h1> </ion-header-bar> diff --git a/www/templates/settings/settings.html b/www/templates/settings/settings.html index 85edf849b8b11865330abe3d3eac55d2e48bbb57..450db38b37d1d53d83540e27a98b10d7a0cab4cf 100644 --- a/www/templates/settings/settings.html +++ b/www/templates/settings/settings.html @@ -63,16 +63,18 @@ </label> </div> - <!--div class="item item-toggle dark item-text-wrap"> + <div class="item item-toggle dark item-text-wrap"> <div class="input-label" ng-bind-html="'SETTINGS.ENABLE_UI_EFFECTS' | translate"> </div> + <h4 class="gray" ng-bind-html="'SETTINGS.ENABLE_UI_EFFECTS_HELP' | translate"> + </h4> <label class="toggle toggle-royal"> <input type="checkbox" ng-model="formData.uiEffects" > <div class="track"> <div class="handle"></div> </div> </label> - </div--> + </div> <span class="item item-divider" translate>SETTINGS.STORAGE_DIVIDER</span> diff --git a/www/templates/wallet/view_wallet.html b/www/templates/wallet/view_wallet.html index 04135d8cf557f01e7ee1e8081b48be7eee13989b..46e73710ec8d83e5b3379ad2d1015354714f21e2 100644 --- a/www/templates/wallet/view_wallet.html +++ b/www/templates/wallet/view_wallet.html @@ -130,12 +130,17 @@ <!-- Public key --> <div id="helptip-wallet-pubkey" - class="item item-icon-left item-text-wrap ink" + class="item item-icon-left item-text-wrap item-icon-right ink" on-hold="copy(formData.pubkey)" - copy-on-click="{{:rebind:formData.pubkey}}"> + copy-on-click="{{:rebind:formData.pubkey|formatPubkey: {full: true, checksum: formData.checksum} }}"> <i class="icon ion-key"></i> <span>{{:locale:'COMMON.PUBKEY'|translate}}</span> - <h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4> + <h4 id="pubkey" class="dark"> + {{:rebind:formData.pubkey|formatPubkey: {full: true, checksum: formData.checksum} }} + </h4> + + <!-- icon of the pubkey --> + <i class="icon" ng-if=":rebind:formData.pubkey" jdenticon="{{:rebind:formData.pubkey}}" jdenticon-size="32"></i> </div> <!-- Uid + Registration date --> diff --git a/www/templates/wot/item_content_identity.html b/www/templates/wot/item_content_identity.html index 70b500fe41e24ae4421b563868f6bdaa9e3d3d49..02e29bcea0c447bd0719a1166adcf9e7fbac9cc7 100644 --- a/www/templates/wot/item_content_identity.html +++ b/www/templates/wot/item_content_identity.html @@ -10,13 +10,13 @@ ng-class="{'pull-right': !smallscreen}" ng-if="::item.sigDate"> <i class="ion-clock"></i> - {{::'WOT.LOOKUP.REGISTERED' | translate:item }} + {{:locale:'WOT.LOOKUP.REGISTERED' | translate:item }} </h4> <h4 class="gray" ng-class="{'pull-right': !smallscreen}" ng-if="item.memberDate"> <i class="ion-clock"></i> - {{::'WOT.LOOKUP.MEMBER_FROM' | translate:item}} + {{:locale:'WOT.LOOKUP.MEMBER_FROM' | translate:item}} </h4> <h4 class="gray"> <span class="positive" ng-if="::item.name && item.uid"> @@ -25,6 +25,7 @@ </span> <b class="ion-key"></b> {{::item.pubkey | formatPubkey}} + <span ng-if="::(!item.uid && !item.revoked)" class="assertive" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <span ng-if="::item.revoked" class="assertive" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</span> </h4> diff --git a/www/templates/wot/lookup_form.html b/www/templates/wot/lookup_form.html index 849b55fadb3235f69a72bcbdcea74d220a45652d..01a8005ffdc52851ee227c2c0905ecbc7ca3d1fe 100644 --- a/www/templates/wot/lookup_form.html +++ b/www/templates/wot/lookup_form.html @@ -1,4 +1,4 @@ -<div class="lookupForm"> +<div class="lookupForm" bind-notifier="{locale: $root.settings.locale.id}"> <div class="item no-padding"> @@ -22,7 +22,7 @@ <input type="text" class="visible-xs visible-sm" - placeholder="{{'WOT.SEARCH_HELP'|translate}}" + placeholder="{{:locale:'WOT.SEARCH_HELP'|translate}}" ng-model="search.text" ng-model-options="{ debounce: 650 }" ng-change="doSearch()" @@ -30,7 +30,7 @@ select-on-click> <input type="text" class="hidden-xs hidden-sm" - id="{{wotSearchTextId}}" placeholder="{{'WOT.SEARCH_HELP'|translate}}" + id="{{wotSearchTextId}}" placeholder="{{:locale:'WOT.SEARCH_HELP'|translate}}" ng-model="search.text" on-return="doSearchText()"> <div class="helptip-anchor-center"> @@ -43,7 +43,7 @@ ng-class="::{'hidden-xs hidden-sm': !showResultLabel}"> <div class="pull-left" ng-if="!search.loading && showResultLabel"> <ng-if ng-if="search.type=='newcomers'"> - <h4 translate>WOT.LOOKUP.NEWCOMERS</h4> + <h4>{{:locale:'WOT.LOOKUP.NEWCOMERS'|translate}}</h4> <small class="gray no-padding" ng-if="search.total">{{'WOT.LOOKUP.NEWCOMERS_COUNT'|translate:{count: search.total} }}</small> </ng-if> <ng-if ng-if="search.type=='pending'"> @@ -51,7 +51,7 @@ <small class="gray no-padding" ng-if="search.total">{{'WOT.LOOKUP.PENDING_COUNT'|translate:{count: search.total} }}</small> </ng-if> <h4 ng-if="search.type=='text'"> - <span translate>COMMON.RESULTS_LIST</span> + <span>{{:locale:'COMMON.RESULTS_LIST'|translate}}</span> <small class="gray" ng-if="search.total">({{search.total}})</small> </h4> </div> @@ -63,14 +63,14 @@ ng-class="{'button-text-positive': search.type=='newcomers'}" ng-click="doGetNewcomers()"> <i class="icon ion-person-stalker"></i> - {{'WOT.LOOKUP.BTN_NEWCOMERS' | translate}} + {{:locale:'WOT.LOOKUP.BTN_NEWCOMERS' | translate}} </a> <a ng-if="enableFilter" class="button button-text button-small ink" ng-class="{'button-text-positive': search.type=='pending'}" ng-click="doGetPending()" class="badge-balanced"> <i class="icon ion-clock"></i> - {{'WOT.LOOKUP.BTN_PENDING' | translate}} + {{:locale:'WOT.LOOKUP.BTN_PENDING' | translate}} </a> <a ng-if="enableWallets" class="button button-text button-small ink" @@ -78,7 +78,7 @@ ng-click="doGetWallets()" class="badge-balanced"> <i class="icon ion-card" style="left: -1px; top: 4px; position: relative; padding-left: 3px; padding-right: 3px;"></i> <b class="icon-secondary ion-card" style="left: 10px; top: -4px; font-size: 14px;"> </b> - {{'MENU.WALLETS' | translate}} + {{:locale:'MENU.WALLETS' | translate}} </a> <!-- Allow extension here --> @@ -86,14 +86,14 @@ <button class="button button-small button-stable ink" ng-click="doSearch()"> - {{'COMMON.BTN_SEARCH' | translate}} + {{:locale:'COMMON.BTN_SEARCH' | translate}} </button> <button class="button button-small button-positive {{parameters.okType}} ink" ng-if="::allowMultiple" ng-disabled="!selection.length" ng-click="next()"> - {{parameters.okText||'COMMON.BTN_NEXT' | translate}} + {{:locale:parameters.okText||'COMMON.BTN_NEXT' | translate}} </button> </div> </div> @@ -105,9 +105,9 @@ <ng-if ng-if="!search.loading"> <div class="assertive padding" ng-if="!search.results.length"> - <span ng-if="search.type=='text'" translate>COMMON.SEARCH_NO_RESULT</span> - <span ng-if="search.type=='pending'" translate>WOT.LOOKUP.NO_PENDING</span> - <span ng-if="search.type=='newcomers'" translate>WOT.LOOKUP.NO_NEWCOMERS</span> + <span ng-if="search.type=='text'">{{:locale:'COMMON.SEARCH_NO_RESULT'|translate}}</span> + <span ng-if="search.type=='pending'">{{:locale:'WOT.LOOKUP.NO_PENDING'|translate}}</span> + <span ng-if="search.type=='newcomers'">{{:locale:'WOT.LOOKUP.NO_NEWCOMERS'|translate}}</span> </div> <!-- simple selection + device --> @@ -120,14 +120,14 @@ <ng-repeat ng-repeat="item in search.results track by item.id"> <div ng-if="::item.divider" class="item item-divider" - id="helptip-wot-search-result-{{$index}}">{{::('WOT.SEARCH.DIVIDER_' + item.index)|upper|translate}}</div> + id="helptip-wot-search-result-{{$index}}">{{:locale:('WOT.SEARCH.DIVIDER_' + item.index)|upper|translate}}</div> <ion-item ng-if="::!item.divider" id="helptip-wot-search-result-{{$index}}" class="item item-border-large item-avatar item-icon-right ink" ng-click="::select(item)"> - <ng-include src="item.templateUrl || 'templates/wot/item_content_identity.html'"></ng-include> + <ng-include src="::item.templateUrl || 'templates/wot/item_content_identity.html'"></ng-include> <i class="icon ion-ios-arrow-right "></i> <ion-option-button diff --git a/www/templates/wot/view_certifications.html b/www/templates/wot/view_certifications.html index 2981a7d4b7fc5279b370938ed61c5cf5c4783338..2d3ae0a5b35a74dd3ba8cde8f27f95c87d446151 100644 --- a/www/templates/wot/view_certifications.html +++ b/www/templates/wot/view_certifications.html @@ -73,9 +73,14 @@ ng-class="{'positive': formData.isMember, 'gray': !formData.isMember}"> {{::formData.name||formData.uid}} </h4> - <h5 class="text-center gray"> - <i class="icon ion-key"></i> {{formData.pubkey|formatPubkey}} + <h5 class="text-center gray row no-padding"> + <div class="col"> + <i class="icon ion-key"></i> {{formData.pubkey|formatPubkey}} + </div> + <!-- icon of the pubkey --> + <div class="col" ng-if=":rebind:formData.pubkey" jdenticon="{{:rebind:formData.pubkey}}" jdenticon-size="32"></div> </h5> + <h5 class="assertive"> <span ng-if="::(formData.name || formData.uid) && !formData.isMember && !revoked" translate>WOT.NOT_MEMBER_PARENTHESIS</span> <b ng-if="::(formData.name || formData.uid) && !formData.isMember && revoked" translate>WOT.IDENTITY_REVOKED_PARENTHESIS</b> diff --git a/www/templates/wot/view_identity.html b/www/templates/wot/view_identity.html index 6c1b8328b19e3f9da305eb283e87cdb1fa802867..dd28c816f74e879273ae81df545c4b85d9203b21 100644 --- a/www/templates/wot/view_identity.html +++ b/www/templates/wot/view_identity.html @@ -89,12 +89,17 @@ <span class="item item-divider" translate>WOT.GENERAL_DIVIDER</span> <!-- Pubkey --> - <ion-item class="item-icon-left item-text-wrap ink" - copy-on-click="{{:rebind:formData.pubkey}}"> + <div class="item item-icon-left item-text-wrap item-icon-right ink" + ng-if=":rebind:formData.pubkey" + on-hold="copy(formData.pubkey)" + copy-on-click="{{:rebind:formData.pubkey|formatPubkey: {full: true } }}"> <i class="icon ion-key"></i> <span translate>COMMON.PUBKEY</span> - <h4 id="pubkey" class="dark text-left">{{:rebind:formData.pubkey}}</h4> - </ion-item> + <h4 id="pubkey" class="dark text-left">{{:rebind:formData.pubkey|formatPubkey: {full: true } }}</h4> + + <!-- icon of the pubkey --> + <i class="icon" jdenticon="{{::formData.pubkey}}" jdenticon-size="32"></i> + </div> <div class="item item-icon-left item-text-wrap" ng-if=":rebind:!formData.hasSelf"> diff --git a/yarn.lock b/yarn.lock index 17097a320af00a8e242ce6ac0943ad3b1c2e0ae5..6875d8ebfcf06935fe33de9c7462d73feef62786 100644 --- a/yarn.lock +++ b/yarn.lock @@ -198,6 +198,12 @@ version "0.0.0" resolved "https://codeload.github.com/driftyco/ionic-bower/tar.gz/816a8b26fae3e8305162eefe1114415503391be6" +"@bower_components/jdenticon@dmester/jdenticon#3.1.0": + version "3.1.0" + resolved "https://codeload.github.com/dmester/jdenticon/tar.gz/54fb9c1d1d66d5eb6849583cca219ae6ab986ee5" + dependencies: + canvas-renderer "~2.2.0" + "@bower_components/js-nacl@tonyg/js-nacl#1.3.2": version "1.3.2" resolved "https://codeload.github.com/tonyg/js-nacl/tar.gz/883f9d3cd9b6bbce84dc489ae4c2d87ffd653a18" @@ -1889,6 +1895,13 @@ camelcase@^3.0.0: resolved "https://nexus.e-is.pro/nexus/content/repositories/npmjs/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +canvas-renderer@~2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/canvas-renderer/-/canvas-renderer-2.2.0.tgz#512151f5494aaac5270802fba22599785114716d" + integrity sha512-Itdq9pwXcs4IbbkRCXc7reeGBk6i6tlDtZTjE1yc+KvYkx1Mt3WLf6tidZ/Ixbm7Vmi+jpWKG0dRBor67x9yGw== + dependencies: + "@types/node" "*" + caseless@~0.11.0: version "0.11.0" resolved "https://nexus.e-is.pro/nexus/content/repositories/npmjs/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"