Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • chrome-manifest-v3
  • develop
  • feat/force-migration-check
  • feat/improve-network-scan
  • feature/android_api_19
  • feature/encrypted_comment
  • feature/migrate-cordova-13
  • gitlab_migration_1
  • master
  • rml8
  • 0.0.1.ES.alpha1
  • 0.0.2
  • 0.1.13
  • 0.1.14
  • 0.1.15
  • 0.1.16
  • 0.1.17
  • 0.1.18
  • 0.1.19
  • 0.1.20
  • 0.1.21
  • 0.1.22
  • 0.1.23
  • 0.1.24
  • 0.1.25
  • 0.1.26
  • 0.1.27
  • 0.1.28
  • 0.1.4
  • 0.1.7
  • 0.1.8
  • 0.2.0
  • 0.2.1
  • v0.10.0
  • v0.10.1
  • v0.10.2
  • v0.11.0
  • v0.11.1
  • v0.11.2
  • v0.11.3
  • v0.11.4
  • v0.11.5
  • v0.11.6
  • v0.11.7
  • v0.11.8
  • v0.12.0
  • v0.12.1
  • v0.12.2
  • v0.12.3
  • v0.12.4
  • v0.12.5
  • v0.12.6
  • v0.12.7
  • v0.12.8
  • v0.12.9
  • v0.13.0
  • v0.14.0
  • v0.14.1
  • v0.15.0
  • v0.15.1
  • v0.15.2
  • v0.15.3
  • v0.15.4
  • v0.15.5
  • v0.15.6
  • v0.15.7
  • v0.16.0
  • v0.16.1
  • v0.17.0
  • v0.17.1
  • v0.17.2
  • v0.17.3
  • v0.17.4
  • v0.17.5
  • v0.17.6
  • v0.18.0
  • v0.18.1
  • v0.18.2
  • v0.18.3
  • v0.19.0
  • v0.19.1
  • v0.19.2
  • v0.19.3
  • v0.19.4
  • v0.19.5
  • v0.19.6
  • v0.2.10
  • v0.2.12
  • v0.2.13
  • v0.2.14
  • v0.2.3
  • v0.2.4
  • v0.2.5
  • v0.2.6
  • v0.2.7
  • v0.2.8
  • v0.2.9
  • v0.3.0
  • v0.3.1
  • v0.3.10
  • v0.3.11
  • v0.3.12
  • v0.3.13
  • v0.3.14
  • v0.3.15
  • v0.3.16
  • v0.3.17
  • v0.3.2
  • v0.3.3
  • v0.3.4
110 results

Target

Select target project
  • cordeliaze/cesium
  • pfouque06/cesium
  • wellno1/cesium
  • 1000i100/cesium
  • vincentux/cesium
  • calbasi/cesium
  • thomasbromehead/cesium
  • matograine/cesium
  • clients/cesium-grp/cesium
  • cedricmenec/cesium
  • Pamplemousse/cesium
  • etienneleba/cesium
  • tnntwister/cesium
  • scanlegentil/cesium
  • morvanc/cesium
  • yyy/cesium
  • Axce/cesium
  • Bertrandbenj/cesium
  • Lupus/cesium
  • elmau/cesium
  • MartinDelille/cesium
  • tykayn/cesium
  • numeropi/cesium
  • Vivakvo/cesium
  • pokapow/cesium
  • pini-gh/cesium
  • anam/cesium
  • RavanH/cesium
  • bpresles/cesium
  • am97/cesium
  • tuxmain/cesium
  • jytou/cesium
  • oliviermaurice/cesium
  • 666titi999/cesium
  • Yvv/cesium
35 results
Select Git revision
  • Vivakvo-master-patch-80805
  • Vivakvo-master-patch-99327
  • dev
  • gitlab_migration_1
  • issue_4
  • issue_780
  • master
  • patch-1
  • patch-10
  • patch-11
  • patch-12
  • patch-13
  • patch-14
  • patch-15
  • patch-16
  • patch-17
  • patch-18
  • patch-19
  • patch-2
  • patch-21
  • patch-22
  • patch-23
  • patch-24
  • patch-25
  • patch-26
  • patch-3
  • patch-4
  • patch-5
  • patch-6
  • patch-7
  • patch-8
  • patch-9
  • rml8
  • undefined
  • 0.0.1.ES.alpha1
  • 0.0.2
  • 0.1.13
  • 0.1.14
  • 0.1.15
  • 0.1.16
  • 0.1.17
  • 0.1.18
  • 0.1.19
  • 0.1.20
  • 0.1.21
  • 0.1.22
  • 0.1.23
  • 0.1.24
  • 0.1.25
  • 0.1.26
  • 0.1.27
  • 0.1.28
  • 0.1.4
  • 0.1.7
  • 0.1.8
  • 0.2.0
  • 0.2.1
  • v0.10.0
  • v0.10.1
  • v0.10.2
  • v0.11.0
  • v0.11.1
  • v0.11.2
  • v0.11.3
  • v0.11.4
  • v0.11.5
  • v0.11.6
  • v0.11.7
  • v0.11.8
  • v0.12.0
  • v0.12.1
  • v0.12.2
  • v0.12.3
  • v0.12.4
  • v0.12.5
  • v0.12.6
  • v0.12.7
  • v0.12.8
  • v0.12.9
  • v0.13.0
  • v0.14.0
  • v0.14.1
  • v0.15.0
  • v0.15.1
  • v0.15.2
  • v0.15.3
  • v0.15.4
  • v0.15.5
  • v0.15.6
  • v0.15.7
  • v0.16.0
  • v0.16.1
  • v0.17.0
  • v0.17.1
  • v0.17.2
  • v0.17.3
  • v0.17.4
  • v0.17.5
  • v0.17.6
  • v0.18.0
  • v0.18.1
  • v0.18.2
  • v0.18.3
  • v0.19.0
  • v0.19.1
  • v0.19.2
  • v0.19.3
  • v0.19.4
  • v0.19.5
  • v0.19.6
  • v0.2.10
  • v0.2.12
  • v0.2.13
  • v0.2.14
  • v0.2.3
  • v0.2.4
  • v0.2.5
  • v0.2.6
  • v0.2.7
  • v0.2.8
  • v0.2.9
  • v0.3.0
  • v0.3.1
  • v0.3.10
  • v0.3.11
  • v0.3.12
  • v0.3.13
  • v0.3.14
  • v0.3.15
  • v0.3.16
  • v0.3.17
  • v0.3.2
  • v0.3.3
  • v0.3.4
134 results
Show changes
Showing
with 2935 additions and 338 deletions
{ {
"name": "Cesium", "name": "Cesium",
"short_name": "Cesium", "short_name": "Cesium",
"version": "1.6.9", "version": "1.7.14",
"description": "Manage your Duniter Wallet on a libre currency, like Ğ1", "description": "Manage your Duniter Wallet on a libre currency, like Ğ1",
"background": { "background": {
"scripts": ["background.js"] "scripts": ["background.js"]
...@@ -13,14 +13,23 @@ ...@@ -13,14 +13,23 @@
"32": "img/logo_32px.png", "32": "img/logo_32px.png",
"60": "img/logo_60px.png", "60": "img/logo_60px.png",
"96": "img/logo_96px.png", "96": "img/logo_96px.png",
"128": "img/logo_128px.png" "128": "img/logo_128px.png",
"192": "img/logo.svg"
} }
}, },
"icons": { "icons": {
"32": "img/logo_32px.png", "32": "img/logo_32px.png",
"60": "img/logo_60px.png", "60": "img/logo_60px.png",
"96": "img/logo_96px.png", "96": "img/logo_96px.png",
"128": "img/logo_128px.png" "128": "img/logo_128px.png",
"192": "img/logo.svg"
}, },
"protocol_handlers": [
{
"protocol": "web+june",
"name": "web Ğ1",
"uriTemplate": "index.html#/app/home?uri=%s"
}
],
"manifest_version": 2 "manifest_version": 2
} }
...@@ -15,11 +15,16 @@ fi ...@@ -15,11 +15,16 @@ fi
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
if [[ ! -d "${ANDROID_SDK_CLI_ROOT}/bin" ]]; then
echo "Failed to find the Android SDK CLI. Please run first: \`scripts/install-android-sdk-tools.sh\`"
exit 1
fi
# Run the build # Run the build
echo "Cleaning previous android APK files..." echo "Cleaning previous android APK files..."
rm -rf ${ANDROID_OUTPUT_APK_DEBUG}/*.apk rm -f ${ANDROID_OUTPUT_APK_DEBUG}/*.apk
rm -rf ${ANDROID_OUTPUT_APK_RELEASE}/*.apk rm -f ${ANDROID_OUTPUT_APK_RELEASE}/*.apk*
echo "Running cordova build android..." echo "Running cordova build android..."
ionic cordova build android --warning-mode=none --color $* ionic cordova build android --warning-mode=none --color $* -- -- --packageType=apk
#ionic cordova build android --warning-mode=none --color --verbose #ionic cordova build android --warning-mode=none --color --verbose -- -- --packageType=apk
...@@ -9,16 +9,20 @@ export PROJECT_DIR ...@@ -9,16 +9,20 @@ export PROJECT_DIR
# Preparing environment # Preparing environment
. "${PROJECT_DIR}/scripts/env-global.sh" . "${PROJECT_DIR}/scripts/env-global.sh"
BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT}/build-tools/${ANDROID_SDK_VERSION}/"
if test -z "${CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL}"; then if test -z "${CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL}"; then
echo "ERROR: Missing Gradle distribution URL - please export env variable 'CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'" echo "ERROR: Missing Gradle distribution URL - please export env variable 'CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'"
fi fi
echo "Preparing Android environment:" echo "--- Preparing Android environment:"
echo " - using Android SDK: ${ANDROID_SDK_ROOT}" echo " Root: ${PROJECT_DIR}"
echo " - using Android SDK tools: ${ANDROID_SDK_TOOLS_ROOT}" echo " NodeJS: ${NODE_VERSION} with options: ${NODE_OPTIONS}"
echo " - using Gradle: ${GRADLE_HOME}" echo " Android SDK: ${ANDROID_SDK_ROOT}"
echo " - using Java: ${JAVA_HOME}" echo " Android CLI: ${ANDROID_SDK_CLI_ROOT}"
echo " - project dir: ${PROJECT_DIR}" echo " Build Tools: ${ANDROID_BUILD_TOOLS_ROOT}"
echo " Gradle: ${GRADLE_HOME} with options: ${GRADLE_OPTS}"
echo " Java: ${JAVA_HOME}"
# Make sure javac exists # Make sure javac exists
JAVAC_PATH=$(which javac) JAVAC_PATH=$(which javac)
...@@ -28,18 +32,20 @@ if test -z "${JAVAC_PATH}"; then ...@@ -28,18 +32,20 @@ if test -z "${JAVAC_PATH}"; then
fi fi
# Prepare Android SDK tools # Prepare Android SDK tools
if ! test -d "${ANDROID_SDK_TOOLS_ROOT}"; then if ! test -d "${ANDROID_SDK_CLI_ROOT}"; then
cd "${PROJECT_DIR}/scripts" . ${PROJECT_DIR}/scripts/install-android-sdk-tools.sh
./install-android-sdk-tools.sh
if test $? -ne 0; then if test $? -ne 0; then
echo "ERROR: Unable to install Android SDK Tools" echo "ERROR: Unable to install Android SDK Tools & CLI"
fi fi
else
# Add SDK CLI to path
export PATH=${ANDROID_SDK_CLI_ROOT}/bin:$PATH
fi fi
# Install Gradle # Install Gradle
if test -z "$(which gradle)" && ! test -d "${GRADLE_HOME}"; then if test -z "$(which gradle)" && ! test -d "${GRADLE_HOME}"; then
cd "${PROJECT_DIR}/scripts" cd "${PROJECT_DIR}/scripts"
echo "Installing gradle... ${GRADLE_HOME}" echo "--- Installing gradle... ${GRADLE_HOME}"
test -e "gradle-${GRADLE_VERSION}-all.zip" || wget -kL ${CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL} test -e "gradle-${GRADLE_VERSION}-all.zip" || wget -kL ${CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL}
GRADLE_PARENT=$(dirname $GRADLE_HOME) GRADLE_PARENT=$(dirname $GRADLE_HOME)
test -e "${GRADLE_PARENT}" || mkdir -p ${GRADLE_PARENT} test -e "${GRADLE_PARENT}" || mkdir -p ${GRADLE_PARENT}
...@@ -55,10 +61,9 @@ if test -z "$(which gradle)" && ! test -d "${GRADLE_HOME}"; then ...@@ -55,10 +61,9 @@ if test -z "$(which gradle)" && ! test -d "${GRADLE_HOME}"; then
fi fi
fi fi
# Prepare Android platform # Prepare Android platform
if ! test -d "${PROJECT_DIR}/platforms/android"; then if ! test -d "${PROJECT_DIR}/platforms/android"; then
echo "Adding Cordova Android platform..." echo "--- Adding Cordova Android platform..."
cd "${PROJECT_DIR}" cd "${PROJECT_DIR}"
ionic cordova prepare android --color --verbose ionic cordova prepare android --color --verbose
if test $? -ne 0; then if test $? -ne 0; then
...@@ -78,6 +83,18 @@ else ...@@ -78,6 +83,18 @@ else
echo "No directory '${ANDROID_OVERWRITE_DIR}' not found. Please create it, with a file 'release-signing.properties' for release signing" echo "No directory '${ANDROID_OVERWRITE_DIR}' not found. Please create it, with a file 'release-signing.properties' for release signing"
fi fi
export PATH=${GRADLE_HOME}/bin:${PATH} echo
echo "--- Checking Android requirements..."
cordova requirements android --verbose
if test $? -ne 0; then
echo "ERROR: Check Cordova requirements failed"
fi
# Add Gradle to path
PATH=${GRADLE_HOME}/bin:${PATH}
# Export useful variables
export PATH \
BUILD_TOOLS_DIR
echo "Android environment is ready!" echo "--- Android environment is ready!"
...@@ -20,30 +20,38 @@ REPO="duniter/cesium" ...@@ -20,30 +20,38 @@ REPO="duniter/cesium"
REPO_API_URL="https://api.github.com/repos/${REPO}" REPO_API_URL="https://api.github.com/repos/${REPO}"
REPO_PUBLIC_URL="https://github.com/${REPO}" REPO_PUBLIC_URL="https://github.com/${REPO}"
NODEJS_VERSION=12 NODE_VERSION=16
#NODE_OPTIONS=--max-old-space-size=4096
ANDROID_NDK_VERSION=r19c IONIC_CLI_VERSION=6.20.9
ANDROID_SDK_VERSION=r29.0.2
ANDROID_SDK_TOOLS_VERSION=4333796 ANDROID_NDK_VERSION=21.0.6113669 # Should be compatible with 'cordova-sqlite-storage' plugin
ANDROID_SDK_ROOT=/usr/lib/android-sdk ANDROID_SDK_VERSION=33.0.2
ANDROID_ALTERNATIVE_SDK_ROOT="${HOME}/Android/Sdk" ANDROID_SDK_CLI_VERSION=8512546 # See https://developer.android.com/studio#command-tools
ANDROID_SDK_TOOLS_ROOT=${ANDROID_SDK_ROOT}/build-tools ANDROID_SDK_ROOT="${HOME}/Android/Sdk"
ANDROID_OUTPUT_APK=${PROJECT_DIR}/platforms/android/app/build/outputs/apk ANDROID_ALTERNATIVE_SDK_ROOT=/usr/lib/android-sdk
ANDROID_SDK_CLI_ROOT=${ANDROID_SDK_ROOT}/cmdline-tools/${ANDROID_SDK_CLI_VERSION}
ANDROID_BUILD_TOOLS_ROOT="${ANDROID_SDK_ROOT}/build-tools/${ANDROID_SDK_VERSION}"
ANDROID_OUTPUT_APK_PREFIX=app
ANDROID_OUTPUT_APK=${PROJECT_DIR}/platforms/android/${ANDROID_OUTPUT_APK_PREFIX}/build/outputs/apk
ANDROID_OUTPUT_APK_DEBUG=${ANDROID_OUTPUT_APK}/debug ANDROID_OUTPUT_APK_DEBUG=${ANDROID_OUTPUT_APK}/debug
ANDROID_OUTPUT_APK_RELEASE=${ANDROID_OUTPUT_APK}/release ANDROID_OUTPUT_APK_RELEASE=${ANDROID_OUTPUT_APK}/release
ANDROID_OUTPUT_MIN_SDK_VERSION=22 # Used by release-android-sign.sh
ANDROID_OUTPUT_MAX_SDK_VERSION=34 # Used by release-android-sign.sh
DIST_WEB=${PROJECT_DIR}/dist/web/build DIST_WEB=${PROJECT_DIR}/dist/web/build
DIST_ANDROID=${PROJECT_DIR}/dist/android DIST_ANDROID=${PROJECT_DIR}/dist/android/build # Where APK are stored
SOURCES_ANDROID=${PROJECT_DIR}/dist/android/sources # Where git cesium-android is checkout
# Addons Mozilla Web extension ID # Addons Mozilla Web extension ID
WEB_EXT_ID="{6f9922f7-a054-4609-94ce-d269993246a5}" WEB_EXT_ID=${WEB_EXT_ID:-"{6f9922f7-a054-4609-94ce-d269993246a5}"}
# /!\ WARN can be define in your <project>/.local/env.sh file # /!\ WARN can be define in your <project>/.local/env.sh file
#JAVA_HOME= #JAVA_HOME=
GRADLE_VERSION=6.5.1 GRADLE_VERSION=6.7.1
GRADLE_HOME=${HOME}/.gradle/${GRADLE_VERSION} GRADLE_HOME=${HOME}/.gradle/${GRADLE_VERSION}
CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip
GRADLE_OPTS=-Dorg.gradle.jvmargs=-Xmx512m
# Override with a local file, if any # Override with a local file, if any
if test -f "${PROJECT_DIR}/.local/env.sh"; then if test -f "${PROJECT_DIR}/.local/env.sh"; then
...@@ -54,7 +62,7 @@ else ...@@ -54,7 +62,7 @@ else
fi fi
# Checking Java installed # Checking Java installed
if test -z "${JAVA_HOME}"; then if test -d "${JAVA_HOME}"; then
JAVA_CMD=`which java` JAVA_CMD=`which java`
if test -z "${JAVA_CMD}"; then if test -z "${JAVA_CMD}"; then
echo "ERROR: No Java installed. Please install java, or set env variable JAVA_HOME " echo "ERROR: No Java installed. Please install java, or set env variable JAVA_HOME "
...@@ -66,10 +74,12 @@ if test -z "${JAVA_HOME}"; then ...@@ -66,10 +74,12 @@ if test -z "${JAVA_HOME}"; then
if test $? -ne 0 || test -z "${JAVA_VERSION}"; then if test $? -ne 0 || test -z "${JAVA_VERSION}"; then
echo "No Java JRE 1.8 found in machine. This is required for Android artifacts." echo "No Java JRE 1.8 found in machine. This is required for Android artifacts."
else else
if ! test "${JAVA_VERSION}" -eq "11"; then
JAVA_MAJOR_VERSION=$(echo ${JAVA_VERSION} | awk '{split($0, array, ".")} END{print array[1]}') JAVA_MAJOR_VERSION=$(echo ${JAVA_VERSION} | awk '{split($0, array, ".")} END{print array[1]}')
JAVA_MINOR_VERSION=$(echo ${JAVA_VERSION} | awk '{split($0, array, ".")} END{print array[2]}') JAVA_MINOR_VERSION=$(echo ${JAVA_VERSION} | awk '{split($0, array, ".")} END{print array[2]}')
if ! test "${JAVA_MAJOR_VERSION}" == "1" || ! test "${JAVA_MINOR_VERSION}" == "8"; then if ! test "${JAVA_MAJOR_VERSION}" -eq "11" || ! test "${JAVA_MINOR_VERSION}" -eq "0"; then
echo "ERROR: Require a Java JRE in version 1.8, but found ${JAVA_VERSION}. You can override your default JAVA_HOME in '.local/env.sh'." echo "ERROR: Require a Java SDK in version 11, but found ${JAVA_VERSION}. You can override your default JAVA_HOME in '.local/env.sh'."
fi
fi fi
fi fi
fi fi
...@@ -83,18 +93,18 @@ if test -z "${ANDROID_SDK_ROOT}" || ! test -d "${ANDROID_SDK_ROOT}"; then ...@@ -83,18 +93,18 @@ if test -z "${ANDROID_SDK_ROOT}" || ! test -d "${ANDROID_SDK_ROOT}"; then
fi fi
fi fi
# Add Java, Android SDK tools to path # Add Java, Android SDK tools to path
PATH=${ANDROID_SDK_TOOLS_ROOT}/bin:${GRADLE_HOME}/bin:${JAVA_HOME}/bin$:$PATH PATH=${ANDROID_SDK_CLI_ROOT}/bin:${GRADLE_HOME}/bin:${JAVA_HOME}/bin$:$PATH
# Export useful variables # Export useful variables
export PATH \ export PATH \
PROJECT_DIR \ PROJECT_DIR \
JAVA_HOME \ JAVA_HOME \
ANDROID_SDK_ROOT \ ANDROID_SDK_ROOT \
ANDROID_SDK_TOOLS_ROOT \ ANDROID_SDK_CLI_ROOT \
CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL
# Node JS # Node JS
export NVM_DIR="$HOME/.nvm" export NVM_DIR="$HOME/.nvm"
if test -d "${NVM_DIR}"; then if test -d "${NVM_DIR}"; then
...@@ -103,26 +113,32 @@ if test -d "${NVM_DIR}"; then ...@@ -103,26 +113,32 @@ if test -d "${NVM_DIR}"; then
. "${NVM_DIR}/nvm.sh" . "${NVM_DIR}/nvm.sh"
# Switch to expected version # Switch to expected version
nvm use ${NODEJS_VERSION} nvm use ${NODE_VERSION}
# Or install it # Or install it
if test $? -ne 0; then if test $? -ne 0; then
nvm install ${NODEJS_VERSION} nvm install ${NODE_VERSION}
fi fi
else else
echo "nvm (Node version manager) not found (directory ${NVM_DIR} not found). Please install, and retry" echo "nvm (Node version manager) not found (directory ${NVM_DIR} not found). Please install, and retry"
fi fi
# Checking if some global dependencies are missing
GLOBAL_TOOLS="yarn gulp ionic cordova web-ext cordova-res native-run"
MISSING_GLOBAL_TOOLS=
for GLOBAL_TOOL in ${GLOBAL_TOOLS}
do
GLOBAL_TOOL_PATH=$(which ${GLOBAL_TOOL})
if test -z "${GLOBAL_TOOL_PATH}"; then
echo "- Missing global dependency: ${GLOBAL_TOOL}"
MISSING_GLOBAL_TOOLS="${GLOBAL_TOOL} ${MISSING_GLOBAL_TOOLS}"
fi
done
# Install global dependencies # Install global dependencies
YARN_PATH=`which yarn` if ! test -z "${MISSING_GLOBAL_TOOLS}"; then
IONIC_PATH=`which ionic`
CORDOVA_PATH=`which cordova`
CORDOVA_RES_PATH=`which cordova-res`
NATIVE_RUN_PATH=`which native-run`
WEB_EXT_PATH=`which web-ext`
if test -z "${YARN_PATH}" || test -z "${IONIC_PATH}" || test -z "${CORDOVA_PATH}" || test -z "${CORDOVA_RES_PATH}" || test -z "${NATIVE_RUN_PATH}" || test -z "${WEB_EXT_PATH}"; then
echo "Installing global dependencies..." echo "Installing global dependencies..."
npm install -g yarn cordova cordova-res @ionic/cli web-ext native-run npm install -g yarn gulp cordova @ionic/cli@$IONIC_CLI_VERSION web-ext cordova-res native-run
if ! test $? == 0; then if ! test $? == 0; then
echo "ERROR: Unable to install global dependencies" echo "ERROR: Unable to install global dependencies"
#exit 1 #exit 1
...@@ -134,26 +150,44 @@ fi ...@@ -134,26 +150,44 @@ fi
# Install project dependencies # Install project dependencies
if ! test -d "${PROJECT_DIR}/node_modules"; then if ! test -d "${PROJECT_DIR}/node_modules"; then
echo "Installing project dependencies..." echo "--- Installing project dependencies..."
cd "${PROJECT_DIR}" cd ${PROJECT_DIR}
yarn install yarn install
fi fi
# Install project submodules # Install platform Android
if ! test -d "${PROJECT_DIR}/platforms/android" || ! test -d "${PROJECT_DIR}/dist/desktop"; then if ! test -d "${PROJECT_DIR}/platforms/android"; then
#echo "Installing project submodules..." echo "-- Installing platform Android..."
#cd "${PROJECT_DIR}" cd ${PROJECT_DIR}
#git submodule init && git submodule sync && git submodule update --remote --merge ionic cordova platform add android
if ! test $? == 0; then
echo "ERROR: Unable to install Android platform. Will not be able to build Android artifacts!"
#exit 1
fi
fi
if ! test -d "${PROJECT_DIR}/dist/desktop"; then
echo "-- Checkout submodules (dist/desktop) ..."
cd "${PROJECT_DIR}"
git submodule init && git submodule sync && git submodule update --remote --merge
if ! test $? == 0; then if ! test $? == 0; then
echo "ERROR: Unable to sync git submodule. Will not be able to build android and desktop artifacts!" echo "ERROR: Unable to sync git submodule. Will not be able to build desktop artifacts!"
#exit 1 #exit 1
fi fi
fi fi
export PROJECT_DIR PROJECT_NAME REPO REPO_API_URL REPO_PUBLIC_URL NODEJS_VERSION \ export PATH \
ANDROID_NDK_VERSION ANDROID_SDK_VERSION ANDROID_SDK_TOOLS_VERSION ANDROID_SDK_ROOT ANDROID_ALTERNATIVE_SDK_ROOT \ PROJECT_DIR PROJECT_NAME \
ANDROID_SDK_TOOLS_ROOT ANDROID_OUTPUT_APK ANDROID_OUTPUT_APK_DEBUG ANDROID_OUTPUT_APK_RELEASE DIST_WEB \ REPO REPO_API_URL REPO_PUBLIC_URL \
DIST_ANDROID WEB_EXT_ID NODE_VERSION \
JAVA_HOME \
ANDROID_NDK_VERSION ANDROID_SDK_VERSION ANDROID_SDK_CLI_VERSION \
ANDROID_HOME ANDROID_SDK_ROOT ANDROID_ALTERNATIVE_SDK_ROOT ANDROID_SDK_CLI_ROOT \
ANDROID_OUTPUT_APK ANDROID_OUTPUT_APK_DEBUG ANDROID_OUTPUT_APK_RELEASE \
CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL \
GRADLE_HOME GRADLE_OPTS \
DIST_WEB DIST_ANDROID \
WEB_EXT_ID
echo "Project environment is ready!" echo "Project environment is ready!"
#!/bin/bash #!/bin/bash -e
# Load global variables # Load global variables
. "$(dirname $0)/env-global.sh" . "$(dirname $0)/env-global.sh"
...@@ -8,28 +8,34 @@ if [[ "_" == "_${ANDROID_SDK_ROOT}" ]]; then ...@@ -8,28 +8,34 @@ if [[ "_" == "_${ANDROID_SDK_ROOT}" ]]; then
echo "Please set env variable ANDROID_SDK_ROOT" echo "Please set env variable ANDROID_SDK_ROOT"
exit 1 exit 1
fi fi
if [[ "_" == "_${ANDROID_SDK_TOOLS_ROOT}" ]]; then if [[ "_" == "_${ANDROID_SDK_CLI_ROOT}" ]]; then
echo "Please set env variable ANDROID_SDK_TOOLS_ROOT" echo "Please set env variable ANDROID_SDK_CLI_ROOT"
exit 1 exit 1
fi fi
if [[ ! -d "${ANDROID_SDK_TOOLS_ROOT}/bin" ]]; then if [[ ! -d "${ANDROID_SDK_CLI_ROOT}/bin" ]]; then
echo "Installing Android SDK tools... ${ANDROID_SDK_TOOLS_ROOT}" echo "-------------------------------------------"
test -e "sdk-tools-linux-${ANDROID_SDK_TOOLS_VERSION}.zip" || wget -kL https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS_VERSION}.zip echo "Installing Android SDK CLI... ${ANDROID_SDK_CLI_ROOT}"
# Get parent folder mkdir -vp "${ANDROID_SDK_CLI_ROOT}"
ANDROID_SDK_TOOLS_PARENT=$(dirname $ANDROID_SDK_ROOT) ANDROID_SDK_CLI_FILE="commandlinetools-linux-${ANDROID_SDK_CLI_VERSION}_latest.zip"
test -e "${ANDROID_SDK_TOOLS_PARENT}" || mkdir -p "${ANDROID_SDK_TOOLS_PARENT}" test -e "${ANDROID_SDK_CLI_FILE}" || wget -kL https://dl.google.com/android/repository/${ANDROID_SDK_CLI_FILE}
test -e "${ANDROID_SDK_TOOLS_ROOT}" || unzip -qq sdk-tools-linux-${ANDROID_SDK_TOOLS_VERSION}.zip -d "${ANDROID_SDK_TOOLS_PARENT}" test -e "${ANDROID_SDK_CLI_ROOT}" || sudo mkdir -p "${ANDROID_SDK_CLI_ROOT}"
test -e "${ANDROID_SDK_TOOLS_ROOT}" && rm "sdk-tools-linux-${ANDROID_SDK_TOOLS_VERSION}.zip" test -e "/tmp/cmdline-tools" && sudo rm -rf /tmp/cmdline-tools
test -e "${ANDROID_SDK_CLI_ROOT}" && sudo unzip -qq ${ANDROID_SDK_CLI_FILE} -d /tmp
test -e "/tmp/cmdline-tools" && sudo mv /tmp/cmdline-tools/* "${ANDROID_SDK_CLI_ROOT}"
test -e "${ANDROID_SDK_CLI_FILE}" && sudo rm "${ANDROID_SDK_CLI_FILE}"
fi fi
export PATH=${ANDROID_SDK_TOOLS_ROOT}/bin:$PATH if [[ ! -d "${ANDROID_SDK_CLI_ROOT}/bin" ]]; then
echo "Failed to install Android SDK CLI. If you are not root, try with \`sudo -E ./install-android-sdk-tools.sh\`"
exit 1
fi
mkdir -p ${ANDROID_SDK_ROOT}/licenses mkdir -p ${ANDROID_SDK_ROOT}/licenses
echo 8933bad161af4178b1185d1a37fbf41ea5269c55 > ${ANDROID_SDK_ROOT}/licenses/android-sdk-license echo 8933bad161af4178b1185d1a37fbf41ea5269c55 > ${ANDROID_SDK_ROOT}/licenses/android-sdk-license
echo 601085b94cd77f0b54ff86406957099ebe79c4d6 > ${ANDROID_SDK_ROOT}/licenses/android-googletv-license echo 601085b94cd77f0b54ff86406957099ebe79c4d6 > ${ANDROID_SDK_ROOT}/licenses/android-googletv-license
echo 33b6a2b64607f11b759f320ef9dff4ae5c47d97a > ${ANDROID_SDK_ROOT}/licenses/google-gdk-license echo 33b6a2b64607f11b759f320ef9dff4ae5c47d97a > ${ANDROID_SDK_ROOT}/licenses/google-gdk-license
yes | sdkmanager --licenses yes | sdkmanager --licenses "--sdk_root=${ANDROID_SDK_ROOT}"
mkdir -p ~/.android mkdir -p ~/.android
touch ~/.android/repositories.cfg touch ~/.android/repositories.cfg
...@@ -37,21 +43,30 @@ touch ~/.android/repositories.cfg ...@@ -37,21 +43,30 @@ touch ~/.android/repositories.cfg
echo y | sdkmanager "platform-tools" "--sdk_root=${ANDROID_SDK_ROOT}" | tee sdkmanager.log echo y | sdkmanager "platform-tools" "--sdk_root=${ANDROID_SDK_ROOT}" | tee sdkmanager.log
echo y | sdkmanager "extras;android;m2repository" "--sdk_root=${ANDROID_SDK_ROOT}" | tee -a sdkmanager.log echo y | sdkmanager "extras;android;m2repository" "--sdk_root=${ANDROID_SDK_ROOT}" | tee -a sdkmanager.log
echo y | sdkmanager "extras;google;m2repository" "--sdk_root=${ANDROID_SDK_ROOT}" | tee -a sdkmanager.log echo y | sdkmanager "extras;google;m2repository" "--sdk_root=${ANDROID_SDK_ROOT}" | tee -a sdkmanager.log
echo y | sdkmanager "cmdline-tools;latest" "--sdk_root=${ANDROID_SDK_ROOT}" | tee sdkmanager.log
# Install build tools # Install build tools
echo y | sdkmanager "build-tools;23.0.2" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo ""
echo y | sdkmanager "build-tools;23.0.3" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo "-------------------------------------------"
echo y | sdkmanager "build-tools;25.0.2" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo "--- Installing Android build-tools ${ANDROID_SDK_VERSION}..."
echo y | sdkmanager "build-tools;27.0.3" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo y | sdkmanager "build-tools;${ANDROID_SDK_VERSION}" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log
echo y | sdkmanager "build-tools;28.0.3" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log [[ $? -ne 0 ]] && exit 1
echo y | sdkmanager "build-tools;29.0.2" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log
# Install platforms # Install platforms
echo y | sdkmanager "platforms;android-16" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log TARGET_VERSIONS="22 23 24 25 26 27 28 29 30 31 32 33"
echo y | sdkmanager "platforms;android-21" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log for TARGET_VERSION in $TARGET_VERSIONS
echo y | sdkmanager "platforms;android-23" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log do
echo y | sdkmanager "platforms;android-24" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo "-------------------------------------------"
echo y | sdkmanager "platforms;android-25" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo "--- Installing Android target ${TARGET_VERSION}..."
echo y | sdkmanager "platforms;android-27" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log echo y | sdkmanager "platforms;android-${TARGET_VERSION}" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log
echo y | sdkmanager "platforms;android-28" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log [[ $? -ne 0 ]] && exit 1
echo y | sdkmanager "platforms;android-29" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log done
# Install NDK
echo "-------------------------------------------"
echo "--- Installing Android NDK..."
echo y | sdkmanager "ndk;22.0.7026061" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log
#echo y | sdkmanager "ndk;25.2.9519653" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log
echo y | sdkmanager "ndk;${ANDROID_NDK_VERSION}" --sdk_root=${ANDROID_SDK_ROOT} | tee -a sdkmanager.log
echo "--- Installing Android [OK]"
## Chat GPT prompt for translations
I need translations for the following messages in a web application, in these languages/locales: en, en-GB, de-DE, eo-EO, es-CT, es-ES, it-IT, nl-NL, pt-PT. Please follow these constraints: maintain the input JSON format, indentation, and message keys; preserve HTML tags and case; and keep proper nouns untranslated (e.g., "Duniter" and "Cesium"). Here is the source message in French:
```json
"ORIGINAL_KEY_UNCHANGED": "<your_translation>"
```
Please provide the translations for each language/locale in this format:
- <language_code> (e.g., en, en-GB, ...):
```json
{
"ORIGINAL_KEY_UNCHANGED": "<your_translation>"
}
```
If you have any questions before starting, please ask for clarifications to avoid mistakes.
\ No newline at end of file
...@@ -7,54 +7,75 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then ...@@ -7,54 +7,75 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then
export PROJECT_DIR export PROJECT_DIR
fi; fi;
# Default env (can be override in file <PROJECT>/.local/env.sh) # Default env variables (can be override in '.local/env.sh' file)
KEYSTORE_FILE=${PROJECT_DIR}/.local/android/Cesium.keystore KEYSTORE_FILE=${PROJECT_DIR}/.local/android/Cesium.keystore
KEY_ALIAS=Cesium KEY_ALIAS=Cesium
KEYSTORE_PWD= KEYSTORE_PWD=
APK_RELEASE_DIR=${PROJECT_DIR}/platforms/android/app/build/outputs/apk/release
APK_UNSIGNED_FILE=${APK_RELEASE_DIR}/app-release-unsigned.apk
APK_SIGNED_FILE=${APK_RELEASE_DIR}/app-release.apk
# Preparing Android environment # Preparing Android environment
. ${PROJECT_DIR}/scripts/env-android.sh . ${PROJECT_DIR}/scripts/env-android.sh
[[ $? -ne 0 ]] && exit 1 [[ $? -ne 0 ]] && exit 1
APK_SIGNED_FILE=${APK_SIGNED_FILE:-"${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-signed.apk"}
APK_UNSIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-unsigned.apk
APK_UNSIGNED_FILE_ALTERNATIVE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release.apk
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
# Sign files
echo "Signing APK file..." # Checking files
if [[ ! -f "${APK_UNSIGNED_FILE}" ]]; then if [[ ! -f "${KEYSTORE_FILE}" ]]; then
echo "APK file not found: ${APK_UNSIGNED_FILE}" echo "ERROR: Keystore file not found: ${KEYSTORE_FILE}"
exit 1 exit 1
fi fi
if [[ ! -f "${KEYSTORE_FILE}" ]]; then if [[ ! -f "${APK_UNSIGNED_FILE}" ]]; then
echo "Keystore file not found: ${KEYSTORE_FILE}" # Check in an alternative path (e.g. Android default signed file)
if [[ ! -f "${APK_UNSIGNED_FILE_ALTERNATIVE}" ]]; then
echo "ERROR: Unsigned APK file not found: ${APK_UNSIGNED_FILE}"
exit 1 exit 1
fi fi
APK_UNSIGNED_FILE=${APK_UNSIGNED_FILE_ALTERNATIVE}
fi
echo "--- Signing Android APK..."
echo ""
# Remove previous version # Remove previous version (only if unsigned exists)
if [[ -f "${APK_SIGNED_FILE}" ]]; then if [[ -f "${APK_SIGNED_FILE}" ]]; then
echo "Delete previous signed APK file: ${APK_SIGNED_FILE}" echo "Delete previous signed APK file: ${APK_SIGNED_FILE}"
rm -f ${APK_SIGNED_FILE} rm -f ${APK_SIGNED_FILE}*
fi fi
echo "Executing jarsigner..." #echo "Executing jarsigner..."
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ${KEYSTORE_FILE} ${APK_UNSIGNED_FILE} Cesium #jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass ${KEYSTORE_PWD} -keystore ${KEYSTORE_FILE} ${APK_UNSIGNED_FILE} ${KEY_ALIAS}
[[ $? -ne 0 ]] && exit 1 #[[ $? -ne 0 ]] && exit 1
echo "Executing jarsigner [OK]" #echo "Executing jarsigner [OK]"
BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT}/build-tools/28.*/" cd ${ANDROID_BUILD_TOOLS_ROOT}
cd ${BUILD_TOOLS_DIR} [[ $? -ne 0 ]] && exit 1
echo "Executing zipalign..." echo "Executing zipalign..."
./zipalign -v 4 ${APK_UNSIGNED_FILE} ${APK_SIGNED_FILE} ./zipalign -v 4 ${APK_UNSIGNED_FILE} ${APK_SIGNED_FILE}
[[ $? -ne 0 ]] && exit 1 [[ $? -ne 0 ]] && exit 1
echo "Executing zipalign [OK]" echo "Executing zipalign [OK]"
echo ""
echo "Executing apksigner..."
./apksigner sign --ks ${KEYSTORE_FILE} --ks-pass "pass:${KEYSTORE_PWD}" --ks-key-alias ${KEY_ALIAS} \
--min-sdk-version ${ANDROID_OUTPUT_MIN_SDK_VERSION} \
--max-sdk-version ${ANDROID_OUTPUT_MAX_SDK_VERSION} \
${APK_SIGNED_FILE}
[[ $? -ne 0 ]] && exit 1
echo "Executing apksigner [OK]"
echo ""
echo "Verify APK signature..." echo "Verify APK signature..."
./apksigner verify ${APK_SIGNED_FILE} ./apksigner verify --verbose --print-certs ${APK_SIGNED_FILE}
[[ $? -ne 0 ]] && exit 1 [[ $? -ne 0 ]] && exit 1
echo "Verify APK signature [OK]" echo "Verify APK signature [OK]"
echo ""
echo "Successfully generated signed APK at: ${APK_SIGNED_FILE}" export APK_SIGNED_FILE
echo "--- Successfully generated signed APK at: ${APK_SIGNED_FILE}"
exit 0
...@@ -7,22 +7,58 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then ...@@ -7,22 +7,58 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then
export PROJECT_DIR export PROJECT_DIR
fi; fi;
### Get version to release
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
current=$(grep -m1 -P "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" package.json | grep -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
if [[ "_$current" == "_" ]]; then
echo " - Make sure the file 'package.json' exists and is readable."
echo " - Check version format is: x.y.z (x and y should be an integer)"
exit 1
fi
# Preparing the environment # Preparing the environment
source ${PROJECT_DIR}/scripts/env-global.sh source ${PROJECT_DIR}/scripts/env-global.sh
[[ $? -ne 0 ]] && exit 1 [[ $? -ne 0 ]] && exit 1
# Commit android project # Make sure to checkout the source project
cd ${PROJECT_DIR}/platforms/android || exit 1 if ! test -d "${SOURCES_ANDROID}"; then
git reset HEAD echo "-- Checkout submodules (dist/android/sources) ..."
cd "${PROJECT_DIR}"
git submodule init && git submodule sync && git submodule update --remote --merge
if ! test $? == 0; then
echo "ERROR: Unable to sync git submodule. Will not be able commit android sources !"
#exit 1
else
echo "-- Checkout submodules (dist/android/sources) [OK]"
fi
fi
if test -d "${SOURCES_ANDROID}"; then
# Revert changes in the Android sources project
cd ${SOURCES_ANDROID} || exit 1
git fetch && git reset --hard --merge HEAD
# Update sources, from platforms/android
echo "--- Copy Android sources from 'platforms/android' to '${SOURCES_ANDROID}' ..."
rsync -rlptgocq --exclude=.* --exclude=build --exclude=release-signing.* --exclude=*.keystore --delete --force "${PROJECT_DIR}/platforms/android/" "${SOURCES_ANDROID}/"
echo "--- Copy Android sources [OK] ..."
echo ""
echo "--- Git push Android sources, and tag as 'v$current'..."
cd ${SOURCES_ANDROID} || exit 1
git add -A git add -A
git commit -m "v$1" git commit -a -m "v$current"
git tag -f -a "v$1" -m "Release v$1" git tag -f -a "v$current" -m "Release v$current"
# Push the tag # Push the tag
git push -f origin "v$1" git push -f origin "v$current"
# Push the master branch # Push the master branch
git push -f origin git push -f origin
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
echo "ERROR: cannot push platform/android project ! Continue anyway..." echo "ERROR: cannot push Android sources at '${SOURCES_ANDROID}' ! Continue anyway..."
else
echo "--- Git push Android sources, and tag [OK]"
fi
fi fi
...@@ -7,58 +7,57 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then ...@@ -7,58 +7,57 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then
export PROJECT_DIR export PROJECT_DIR
fi; fi;
# Preparing Android environment # Default env variables (can be override in '.local/env.sh' file)
source ${PROJECT_DIR}/scripts/env-android.sh
[[ $? -ne 0 ]] && exit 1
cd ${PROJECT_DIR}
# Run the build
echo "Running cordova build..."
ionic cordova build android --warning-mode=none --color --prod --release
[[ $? -ne 0 ]] && exit 1
# Signature
KEYSTORE_FILE=${PROJECT_DIR}/.local/Cesium.keystore KEYSTORE_FILE=${PROJECT_DIR}/.local/Cesium.keystore
KEY_ALIAS=Cesium KEY_ALIAS=Cesium
KEY_PWD= KEY_PWD=
APK_DIR=${PROJECT_DIR}/platforms/android/build/outputs/apk/release
APK_UNSIGNED_FILE=${APK_DIR}/android-release.apk
BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT}/build-tools/28.*/"
if [[ ! -f "${APK_UNSIGNED_FILE}" ]]; then # Preparing Android environment
echo "APK file not found at: ${APK_UNSIGNED_FILE}" cd ${PROJECT_DIR}
exit 1 source scripts/env-android.sh
fi [[ $? -ne 0 ]] && exit 1
# Check if signed APK_SIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-signed.apk
cd ${BUILD_TOOLS_DIR} APK_UNSIGNED_FILE=${ANDROID_OUTPUT_APK_RELEASE}/${ANDROID_OUTPUT_APK_PREFIX}-release-unsigned.apk
./apksigner verify ${APK_UNSIGNED_FILE}
# Not signed ? Do it ! echo "--- Cleaning previous Android APK ..."
if [[ $? -ne 0 ]]; then rm -f ${ANDROID_OUTPUT_APK_RELEASE}/*.apk*
echo "It seems that the APK file ${APK_UNSIGNED_FILE} is not signed !" echo "--- Cleaning previous Android APK [OK]"
if [[ ! -f "${KEYSTORE_FILE}" ]]; then echo ""
echo "ERROR: Unable to sign: no keystore file found at ${KEYSTORE_FILE} !"
exit 1
fi
echo "Signing APK file ${APK_UNSIGNED_FILE}..." # Run the build
APK_SIGNED_FILE=${APK_DIR}/android-release-signed.apk echo "--- Building Android APK..."
echo ""
yarn run build:android
[[ $? -ne 0 ]] && exit 1
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ${KEYSTORE_FILE} ${APK_UNSIGNED_FILE} Cesium echo "--- Building Android APK [OK]"
echo ""
BUILD_TOOLS_DIR="${ANDROID_SDK_ROOT}/build-tools/28.*/" # Sign APK file
cd ${BUILD_TOOLS_DIR} cd ${PROJECT_DIR}/scripts
./zipalign -v 4 ${APK_UNSIGNED_FILE} ${APK_SIGNED_FILE} ./release-android-sign.sh
./apksigner verify ${APK_SIGNED_FILE} # Check signed APK exists
if [[ $? -ne 0 ]]; then if [[ ! -f "${APK_SIGNED_FILE}" ]]; then
echo "Signing failed !" echo "Missing signed APK file at: ${APK_SIGNED_FILE}"
exit 1 exit 1
fi fi
# Do file replacement # Get current version
rm ${APK_UNSIGNED_FILE} cd ${PROJECT_DIR}
mv ${APK_SIGNED_FILE} ${APK_UNSIGNED_FILE} current=$(grep -m 1 -oP "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" package.json | grep -m 1 -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
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;
fi fi
# Copy signed APK to 'dist/android/build'
echo ""
echo "--- Copying Android APK to '${APK_FINAL_FILE}'..."
APK_BASENAME="${PROJECT_NAME}-v${current}-android.apk"
APK_FINAL_FILE="${DIST_ANDROID}/${APK_BASENAME}"
mkdir -p "${DIST_ANDROID}"
cp -f "${APK_SIGNED_FILE}" "${APK_FINAL_FILE}"
echo "--- Copying Android APK [OK]"
echo ""
...@@ -22,7 +22,7 @@ then ...@@ -22,7 +22,7 @@ then
fi fi
### Get version to release ### 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+[-0-9]*)?\"" package.json | grep -m 1 -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
if [[ "_$current" == "_" ]]; then 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)." 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; exit 1;
...@@ -57,7 +57,8 @@ if [[ "${DESKTOP_ASSETS}" == "linux" ]]; then ...@@ -57,7 +57,8 @@ if [[ "${DESKTOP_ASSETS}" == "linux" ]]; then
echo "Skipping windows assets, because DESKTOP_ASSETS env was set to 'linux'." echo "Skipping windows assets, because DESKTOP_ASSETS env was set to 'linux'."
EXPECTED_ASSETS="${PROJECT_NAME}-desktop-v$current-linux-x64.deb EXPECTED_ASSETS="${PROJECT_NAME}-desktop-v$current-linux-x64.deb
${PROJECT_NAME}-desktop-v$current-linux-x64.tar.gz" ${PROJECT_NAME}-desktop-v$current-linux-x64.tar.gz
${PROJECT_NAME}-desktop-v$current-linux-x64.AppImage"
fi fi
# Build desktop assets # Build desktop assets
......
...@@ -9,12 +9,7 @@ fi; ...@@ -9,12 +9,7 @@ fi;
# Preparing Android environment # Preparing Android environment
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
source ${PROJECT_DIR}/scripts/env-global.sh source scripts/env-global.sh
XPI_BASENAME=${PROJECT_NAME}-$current-an+fx.xpi
XPI_FILE=${PROJECT_DIR}/dist/web/build/${XPI_BASENAME}
XPI_FINAL_BASENAME=${PROJECT_NAME}-v$current-extension-firefox.xpi
XPI_FINAL_FILE=${PROJECT_DIR}/dist/web/build/${XPI_FINAL_BASENAME}
### Control that the script is run on `dev` branch ### Control that the script is run on `dev` branch
branch=$(git rev-parse --abbrev-ref HEAD) branch=$(git rev-parse --abbrev-ref HEAD)
...@@ -25,16 +20,21 @@ then ...@@ -25,16 +20,21 @@ then
fi fi
### Get version to release ### Get version to release
current=$(grep -P "version\": \"\d+.\d+.\d+(\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(\w*)") current=$(grep -m 1 -oP "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" package.json | grep -m 1 -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
if [[ "_$current" == "_" ]]; then 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)." 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; exit 1;
fi fi
echo "Sending v$current extension for Mozilla..." echo "Sending v$current extension for Mozilla..."
XPI_BASENAME=${PROJECT_NAME}-$current-an+fx.xpi
XPI_FILE=${PROJECT_DIR}/dist/web/build/${XPI_BASENAME}
XPI_FINAL_BASENAME=${PROJECT_NAME}-v$current-extension-firefox.xpi
XPI_FINAL_FILE=${PROJECT_DIR}/dist/web/build/${XPI_FINAL_BASENAME}
### Check AMO account ### Check AMO account
if [[ "_" == "_${AMO_JWT_ISSUER}" || "_" == "_${AMO_JWT_SECRET}" ]]; then if [[ "_" == "_${AMO_JWT_ISSUER}" || "_" == "_${AMO_JWT_SECRET}" ]]; then
echo "ERROR: Unable to find Addons Modzilla account: " echo "ERROR: Unable to find Addons Mozilla account: "
echo " - Please add environment variables 'AMO_JWT_ISSUER' or 'AMO_JWT_SECRET', then retry." echo " - Please add environment variables 'AMO_JWT_ISSUER' or 'AMO_JWT_SECRET', then retry."
echo " - You can use the file './local/env.sh'." echo " - You can use the file './local/env.sh'."
exit 1 exit 1
...@@ -43,6 +43,7 @@ fi ...@@ -43,6 +43,7 @@ fi
### Sign extension ### Sign extension
case "$1" in case "$1" in
pre) pre)
echo "web-ext sign \"--api-key=${AMO_JWT_ISSUER}\" \"--api-secret=${AMO_JWT_SECRET}\" \"--source-dir=${PROJECT_DIR}/dist/web/ext\" \"--artifacts-dir=${PROJECT_DIR}/dist/web/build\" --id=${WEB_EXT_ID} --channel=unlisted"
web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=${PROJECT_DIR}/dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build" --id=${WEB_EXT_ID} --channel=unlisted web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=${PROJECT_DIR}/dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build" --id=${WEB_EXT_ID} --channel=unlisted
if [[ $? -ne 0 ]]; then if [[ $? -ne 0 ]]; then
if [[ -f "${XPI_FILE}" || -f "${XPI_FINAL_FILE}" ]]; then if [[ -f "${XPI_FILE}" || -f "${XPI_FINAL_FILE}" ]]; then
......
...@@ -20,21 +20,25 @@ then ...@@ -20,21 +20,25 @@ then
fi fi
### Get version to release ### Get version to release
current=$(grep -P "version\": \"\d+.\d+.\d+(\w*)" package.json | grep -m 1 -oP "\d+.\d+.\d+(\w*)") current=$(grep -m1 -P "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" package.json | grep -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
if [[ "_$current" == "_" ]]; then 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)." echo " - Make sure the file 'package.json' exists and is readable."
exit 1; echo " - Check version format is: x.y.z (x and y should be an integer)"
exit 1
fi fi
echo "Sending v$current extension to Github..."
### get auth token ### get auth token
if [[ "_${GITHUB_TOKEN}" == "_" ]]; then
# Get it from user config dir
GITHUB_TOKEN=$(cat ~/.config/${PROJECT_NAME}/.github) GITHUB_TOKEN=$(cat ~/.config/${PROJECT_NAME}/.github)
if [[ "_$GITHUB_TOKEN" != "_" ]]; then fi
GITHUT_AUTH="Authorization: token $GITHUB_TOKEN" if [[ "_${GITHUB_TOKEN}" != "_" ]]; then
GITHUT_AUTH="Authorization: token ${GITHUB_TOKEN}"
else else
echo "ERROR: Unable to find github authentication token file: " echo "ERROR: Unable to find github authentication token file: "
echo " - You can create such a token at https://github.com/settings/tokens > 'Generate a new token'." echo " - You can create such a token at https://github.com/settings/tokens > 'Generate a new token'."
echo " - Then copy the token and paste it in the file '~/.config/${PROJECT_NAME}/.github' using a valid token." echo " - [if CI] Add a pipeline variable named 'GITHUB_TOKEN';"
echo " - [else] Or copy/paste the token into the file '~/.config/${PROJECT_NAME}/.github'."
exit 1 exit 1
fi fi
...@@ -44,20 +48,20 @@ case "$1" in ...@@ -44,20 +48,20 @@ case "$1" in
result=$(curl -i "$REPO_API_URL/releases/tags/v$current") result=$(curl -i "$REPO_API_URL/releases/tags/v$current")
release_url=$(echo "$result" | grep -P "\"url\": \"[^\"]+" | grep -oP "$REPO_API_URL/releases/\d+") release_url=$(echo "$result" | grep -P "\"url\": \"[^\"]+" | grep -oP "$REPO_API_URL/releases/\d+")
if [[ $release_url != "" ]]; then if [[ $release_url != "" ]]; then
echo "Deleting existing release..." echo "--- Deleting existing release..."
curl -H 'Authorization: token $GITHUB_TOKEN' -XDELETE $release_url curl -H ''"$GITHUT_AUTH"'' -XDELETE $release_url
fi fi
exit 0; exit 0;
;; ;;
pre) pre)
prerelease="true" prerelease="true"
echo "Creating new pre-release v$current..." echo "--- Creating new pre-release v$current..."
;; ;;
rel) rel)
prerelease="false" prerelease="false"
echo "Creating new release v$current..." echo "--- Creating new release v$current..."
;; ;;
*) *)
echo "No task given, or wrong arguments" echo "No task given, or wrong arguments"
...@@ -79,7 +83,7 @@ fi ...@@ -79,7 +83,7 @@ fi
result=$(curl -s -H ''"$GITHUT_AUTH"'' "$REPO_API_URL/releases/tags/v$current") result=$(curl -s -H ''"$GITHUT_AUTH"'' "$REPO_API_URL/releases/tags/v$current")
release_url=$(echo "$result" | grep -P "\"url\": \"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+/releases/\d+") release_url=$(echo "$result" | grep -P "\"url\": \"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+/releases/\d+")
if [[ "_$release_url" != "_" ]]; then if [[ "_$release_url" != "_" ]]; then
echo "Deleting existing release... $release_url" echo "--- Deleting existing release... $release_url"
result=$(curl -H ''"$GITHUT_AUTH"'' -s -XDELETE $release_url) result=$(curl -H ''"$GITHUT_AUTH"'' -s -XDELETE $release_url)
if [[ "_$result" != "_" ]]; then if [[ "_$result" != "_" ]]; then
error_message=$(echo "$result" | grep -P "\"message\": \"[^\"]+" | grep -oP ": \"[^\"]+\"") error_message=$(echo "$result" | grep -P "\"message\": \"[^\"]+" | grep -oP ": \"[^\"]+\"")
...@@ -90,9 +94,14 @@ else ...@@ -90,9 +94,14 @@ else
echo "Release not exists yet on github." echo "Release not exists yet on github."
fi fi
### Create the release echo "--- Clean previous SHA256 files..."
result=$(curl -H ''"$GITHUT_AUTH"'' -s $REPO_API_URL/releases -d '{"tag_name": "v'"$current"'","target_commitish": "master","name": "'"$current"'","body": "'"$description"'","draft": false,"prerelease": '"$prerelease"'}') rm -rf ${PROJECT_DIR}/dist/**/*.sha256
#echo "DEBUG - $result" echo ""
echo "--- Creating new release..."
echo " - tag: v$current"
echo " - description: $description"
result=$(curl -X POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" -H ''"$GITHUT_AUTH"'' -s $REPO_API_URL/releases -d '{"tag_name": "v'"$current"'","target_commitish": "master","name": "'"$current"'","body": "'"$description"'","draft": false,"prerelease": '"$prerelease"'}')
upload_url=$(echo "$result" | grep -P "\"upload_url\": \"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") upload_url=$(echo "$result" | grep -P "\"upload_url\": \"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+")
if [[ "_$upload_url" = "_" ]]; then if [[ "_$upload_url" = "_" ]]; then
echo "Failed to create new release for repo $REPO." echo "Failed to create new release for repo $REPO."
...@@ -101,8 +110,8 @@ if [[ "_$upload_url" = "_" ]]; then ...@@ -101,8 +110,8 @@ if [[ "_$upload_url" = "_" ]]; then
exit 1 exit 1
fi fi
### Send files ### Sending files
echo "Uploading artifacts to ${upload_url} ..." echo "--- Uploading files to ${upload_url} ..."
# Upload web file # Upload web file
WEB_BASENAME="${PROJECT_NAME}-v$current-web.zip" WEB_BASENAME="${PROJECT_NAME}-v$current-web.zip"
...@@ -111,9 +120,12 @@ if [[ -f "${WEB_FILE}" ]]; then ...@@ -111,9 +120,12 @@ if [[ -f "${WEB_FILE}" ]]; then
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/zip' -T "${WEB_FILE}" "${upload_url}?name=${WEB_BASENAME}") result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/zip' -T "${WEB_FILE}" "${upload_url}?name=${WEB_BASENAME}")
browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+")
WEB_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_BASENAME}") WEB_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_BASENAME}")
echo " - ${browser_download_url} | Checksum: ${WEB_SHA256}" echo " - ${browser_download_url} | SHA256 Checksum: ${WEB_SHA256}"
echo "${WEB_SHA256} ${WEB_BASENAME}" > "${WEB_FILE}.sha256"
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${WEB_FILE}.sha256" "${upload_url}?name=${WEB_BASENAME}.sha256")
else else
echo " - ERROR: Web artifact (ZIP) not found! Skipping." echo " - ERROR: Web release (ZIP) not found! Skipping."
missing_file=true
fi fi
# Upload web extension (ZIP) file # Upload web extension (ZIP) file
...@@ -124,8 +136,11 @@ if [[ -f "${WEB_EXT_ZIP_FILE}" ]]; then ...@@ -124,8 +136,11 @@ if [[ -f "${WEB_EXT_ZIP_FILE}" ]]; then
browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+")
WEB_EXT_ZIP_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_EXT_ZIP_BASENAME}") WEB_EXT_ZIP_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_EXT_ZIP_BASENAME}")
echo " - ${browser_download_url} | Checksum: ${WEB_EXT_ZIP_SHA256}" echo " - ${browser_download_url} | Checksum: ${WEB_EXT_ZIP_SHA256}"
echo "${WEB_EXT_ZIP_SHA256} ${WEB_EXT_ZIP_BASENAME}" > "${WEB_EXT_ZIP_FILE}.sha256"
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${WEB_EXT_ZIP_FILE}.sha256" "${upload_url}?name=${WEB_EXT_ZIP_BASENAME}.sha256")
else else
echo " - ERROR: Web extension artifact (ZIP) not found! Skipping." echo " - ERROR: Web extension artifact (ZIP) not found! Skipping."
missing_file=true
fi fi
# Upload web extension (XPI) file # Upload web extension (XPI) file
...@@ -136,8 +151,11 @@ if [[ -f "${WEB_EXT_XPI_FILE}" ]]; then ...@@ -136,8 +151,11 @@ if [[ -f "${WEB_EXT_XPI_FILE}" ]]; then
browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+")
WEB_EXT_XPI_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_EXT_XPI_BASENAME}") WEB_EXT_XPI_SHA256=$(cd ${DIST_WEB} && sha256sum "${WEB_EXT_XPI_BASENAME}")
echo " - ${browser_download_url} | Checksum: ${WEB_EXT_XPI_SHA256}" echo " - ${browser_download_url} | Checksum: ${WEB_EXT_XPI_SHA256}"
echo "${WEB_EXT_XPI_SHA256} ${WEB_EXT_XPI_BASENAME}" > "${WEB_EXT_XPI_FILE}.sha256"
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${WEB_EXT_XPI_FILE}.sha256" "${upload_url}?name=${WEB_EXT_XPI_BASENAME}.sha256")
else else
echo " - ERROR: Web signed extension artifact (XPI) not found! Skipping." echo " - ERROR: Web signed extension artifact (XPI) not found! Skipping."
missing_file=true
fi fi
# Upload Android APK file # Upload Android APK file
...@@ -146,20 +164,24 @@ APK_FILE="${DIST_ANDROID}/${APK_BASENAME}" ...@@ -146,20 +164,24 @@ APK_FILE="${DIST_ANDROID}/${APK_BASENAME}"
if [[ -f "${APK_FILE}" ]]; then if [[ -f "${APK_FILE}" ]]; then
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/vnd.android.package-archive' -T "${APK_FILE}" "${upload_url}?name=${APK_BASENAME}") result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/vnd.android.package-archive' -T "${APK_FILE}" "${upload_url}?name=${APK_BASENAME}")
browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+") browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "https://[A-Za-z0-9/.-]+")
APK_SHA256=$(cd ${DIST_ANDROID} && sha256sum "${APK_BASENAME}") APK_SHA256=$(sha256sum "${APK_FILE}" | sed 's/ /\n/gi' | head -n 1)
echo " - ${browser_download_url} | Checksum: ${APK_SHA256}" echo " - ${browser_download_url} | SHA256 Checksum: ${APK_SHA256}"
echo "${APK_SHA256} ${APK_BASENAME}" > "${APK_FILE}.sha256"
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${APK_FILE}.sha256" "${upload_url}?name=${APK_BASENAME}.sha256")
else else
echo "- ERROR: Android artifact (APK) not found! Skipping." echo "- ERROR: Android release (APK) not found! Skipping."
missing_file=true
fi fi
# Upload sha256 file (checksum) echo ""
SHA_BASENAME=${PROJECT_NAME}-v$current.sha256 if [[ ${missing_file} == true ]]; then
SHA_FILE=${PROJECT_DIR}/dist/${SHA_BASENAME} echo "-------------------------------------------"
echo "${WEB_SHA256}" > ${SHA_FILE} echo "ERROR: missing some artifacts (see logs)"
echo "${WEB_EXT_ZIP_SHA256}" >> ${SHA_FILE} echo " -> Release url: ${REPO_PUBLIC_URL}/releases/tag/${version}"
echo "${APK_SHA256}" >> ${SHA_FILE} exit 1
echo "${WEB_EXT_XPI_SHA256}" >> ${SHA_FILE} else
result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: text/plain' -T "${SHA_FILE}" "${upload_url}?name=${SHA_BASENAME}") echo "-------------------------------------------"
echo "Successfully uploading files !"
### Success message echo " -> Release url: ${REPO_PUBLIC_URL}/releases/tag/${version}"
echo "Successfully uploaded files to: ${REPO_PUBLIC_URL}/releases/tag/v${current}" exit 0
fi
...@@ -9,7 +9,7 @@ fi; ...@@ -9,7 +9,7 @@ fi;
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
### Control that the script is run on `dev` branch ### Control that the script is run on `master` branch
branch=$(git rev-parse --abbrev-ref HEAD) branch=$(git rev-parse --abbrev-ref HEAD)
if [[ ! "$branch" == "master" ]]; if [[ ! "$branch" == "master" ]];
then then
...@@ -18,7 +18,7 @@ then ...@@ -18,7 +18,7 @@ then
fi fi
### Get current version (package.json) ### Get current version (package.json)
current=$(grep -oP "version\": \"\d+.\d+.\d+((a|b)[0-9]+)?" package.json | grep -m 1 -oP "\d+.\d+.\d+((a|b)[0-9]+)?") current=$(grep -m1 -P "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" package.json | grep -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
if [[ "_$current" == "_" ]]; then 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)." 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; exit 1;
...@@ -34,7 +34,7 @@ fi ...@@ -34,7 +34,7 @@ fi
echo "Current Android version: $currentAndroid" echo "Current Android version: $currentAndroid"
# Check version format # Check version format
if [[ ! $2 =~ ^[0-9]+.[0-9]+.[0-9]+(-(alpha|beta|rc)[-0-9]*)?$ || ! $3 =~ ^[0-9]+$ ]]; then if [[ ! $2 =~ ^[0-9]+.[0-9]+.[0-9]+(-[a-z]+[-0-9]*)?$ || ! $3 =~ ^[0-9]+$ ]]; then
echo "Wrong version format" echo "Wrong version format"
echo "Usage:" echo "Usage:"
echo " > ./release.sh [pre|rel] <version> <android-version> <release_description>" echo " > ./release.sh [pre|rel] <version> <android-version> <release_description>"
...@@ -53,16 +53,16 @@ case "$1" in ...@@ -53,16 +53,16 @@ case "$1" in
rel|pre) rel|pre)
# Change the version in files: 'package.json' and 'config.xml' # Change the version in files: 'package.json' and 'config.xml'
sed -i "s/version\": \"$current\"/version\": \"$2\"/g" package.json sed -i "s/version\": \"$current\"/version\": \"$2\"/g" package.json
currentConfigXmlVersion=$(grep -oP "version=\"\d+.\d+.\d+((a|b)[0-9]+)?\"" config.xml | grep -oP "\d+.\d+.\d+((a|b)[0-9]+)?") currentConfigXmlVersion=$(grep -m 1 -oP "version=\"\d+.\d+.\d+(-\w+[-0-9]*)?\"" config.xml | grep -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
sed -i "s/ version=\"$currentConfigXmlVersion\"/ version=\"$2\"/g" config.xml sed -i "s/ version=\"$currentConfigXmlVersion\"/ version=\"$2\"/g" config.xml
sed -i "s/ android-versionCode=\"$currentAndroid\"/ android-versionCode=\"$3\"/g" config.xml sed -i "s/ android-versionCode=\"$currentAndroid\"/ android-versionCode=\"$3\"/g" config.xml
# Change version in file: 'www/manifest.json' # Change version in file: 'www/manifest.json'
currentManifestJsonVersion=$(grep -oP "version\": \"\d+.\d+.\d+((a|b)[0-9]+)?\"" www/manifest.json | grep -oP "\d+.\d+.\d+((a|b)[0-9]+)?") currentManifestJsonVersion=$(grep -m 1 -oP "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" www/manifest.json | grep -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
sed -i "s/version\": \"$currentManifestJsonVersion\"/version\": \"$2\"/g" www/manifest.json sed -i "s/version\": \"$currentManifestJsonVersion\"/version\": \"$2\"/g" www/manifest.json
# Change version in file: 'resources/web-ext/manifest.json' # Change version in file: 'resources/web-ext/manifest.json'
currentExtManifestJsonVersion=$(grep -oP "version\": \"\d+.\d+.\d+((a|b)[0-9]+)?\"" resources/web-ext/manifest.json | grep -oP "\d+.\d+.\d+((a|b)[0-9]+)?") currentExtManifestJsonVersion=$(grep -m 1 -oP "version\": \"\d+.\d+.\d+(-\w+[-0-9]*)?\"" resources/web-ext/manifest.json | grep -oP "\d+.\d+.\d+(-\w+[-0-9]*)?")
sed -i "s/version\": \"$currentExtManifestJsonVersion\"/version\": \"$2\"/g" resources/web-ext/manifest.json sed -i "s/version\": \"$currentExtManifestJsonVersion\"/version\": \"$2\"/g" resources/web-ext/manifest.json
# Bump the install.sh # Bump the install.sh
...@@ -77,50 +77,29 @@ esac ...@@ -77,50 +77,29 @@ esac
# Preparing the environment # Preparing the environment
. ${PROJECT_DIR}/scripts/env-global.sh . ${PROJECT_DIR}/scripts/env-global.sh
if [[ $? -ne 0 ]]; then [[ $? -ne 0 ]] && exit 1
exit 1
fi
echo "----------------------------------" echo "----------------------------------"
echo "- Compiling sources..." echo "- Compiling sources..."
echo "----------------------------------" echo "----------------------------------"
cd ${PROJECT_DIR} || exit 1 cd ${PROJECT_DIR} || exit 1
gulp config build --env default_fr || exit 1 gulp config build --env default || exit 1
echo "Clean previous sha256 files..."
rm -rf ${PROJECT_DIR}/dist/*.sha256
echo "----------------------------------" echo "----------------------------------"
echo "- Building Android artifact..." echo "- Building Android artifact..."
echo "----------------------------------" echo "----------------------------------"
mkdir -p ${DIST_ANDROID} || exit 1 cd ${PROJECT_DIR}/scripts || exit 1
rm -rf ${DIST_ANDROID}/*.apk || exit 1 ./release-android.sh
rm -rf ${ANDROID_OUTPUT_APK_RELEASE}/*.apk || exit 1 #[[ $? -ne 0 ]] && exit 1
. scripts/build-android.sh --release
[[ $? -ne 0 ]] && exit 1
APK_RELEASE_FILE="${ANDROID_OUTPUT_APK_RELEASE}/app-release.apk"
APK_RELEASE_UNSIGNED_FILE="${ANDROID_OUTPUT_APK_RELEASE}/app-release-unsigned.apk"
if [[ ! -f "${APK_RELEASE_FILE}" ]]; then
if [[ ! -f "${APK_RELEASE_UNSIGNED_FILE}" ]]; then
echo "ERROR: Missing android artifact at ${APK_RELEASE_FILE}"
exit 1
else
. scripts/release-android-sign.sh
[[ $? -ne 0 ]] && exit 1
fi
fi
mkdir -p ${DIST_ANDROID} || exit 1
cp ${APK_RELEASE_FILE} "${DIST_ANDROID}/${PROJECT_NAME}-v$2-android.apk" || exit 1
echo "----------------------------------" echo "----------------------------------"
echo "- Building web and extension artifacts..." echo "- Building web and extension artifacts..."
echo "----------------------------------" echo "----------------------------------"
cd ${PROJECT_DIR} || exit 1
# Gnerate config (only once, to keep same config if web and web-extension artifacts) # Generate config (only once, to keep same config if web and web-extension artifacts)
cd ${PROJECT_DIR} || exit 1
gulp config --env default gulp config --env default
# Run web build # Run web build
...@@ -166,8 +145,9 @@ git push -f origin ...@@ -166,8 +145,9 @@ git push -f origin
echo "----------------------------------" echo "----------------------------------"
echo "- Uploading web extension to Mozilla ..." echo "- Uploading web extension to Mozilla ..."
echo "----------------------------------" echo "----------------------------------"
. ${PROJECT_DIR}/scripts/release-sign-extension.sh $1 cd ${PROJECT_DIR}/scripts || exit 1
# FIXME: always failed: but continue ./release-sign-extension.sh $1 ''"$description"''
# FIXME: always failed, but continue
#[[ $? -ne 0 ]] && exit 1 #[[ $? -ne 0 ]] && exit 1
echo "----------------------------------" echo "----------------------------------"
...@@ -198,5 +178,5 @@ echo "**********************************" ...@@ -198,5 +178,5 @@ echo "**********************************"
cd ${PROJECT_DIR} cd ${PROJECT_DIR}
# Back to nodejs project version # Back to nodejs project version
nvm use ${NODEJS_VERSION} nvm use ${NODE_VERSION}
...@@ -491,7 +491,7 @@ $screen-menu: $screen-sm; ...@@ -491,7 +491,7 @@ $screen-menu: $screen-sm;
} }
.bar-header { .bar-header {
background-color: $positive-900-bg; background-color: $positive;
color: #fff; color: #fff;
height: 150px; height: 150px;
padding-right: 0 !important; padding-right: 0 !important;
...@@ -938,13 +938,20 @@ html, body { ...@@ -938,13 +938,20 @@ html, body {
display: inline-block !important; display: inline-block !important;
vertical-align: bottom; vertical-align: bottom;
} }
.loader {
zoom: unset;
top: 49px;
width: 100%;
}
.loader .logo,
#home .logo { #home .logo {
margin-top: 15px; margin-top: 15px;
width: 100%; width: 100%;
background-position: center center; background-position: center center;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.loader .center,
#home .center { #home .center {
float: none; float: none;
text-align: center; text-align: center;
...@@ -955,7 +962,8 @@ html, body { ...@@ -955,7 +962,8 @@ html, body {
display: inline-block; display: inline-block;
} }
@media screen and (max-width: $screen-xs-max) { @media screen and (max-width: $screen-xxs-max) {
.loader .logo,
#home .logo { #home .logo {
height: 96px; height: 96px;
background-image: url('../img/logo_96px.png'); background-image: url('../img/logo_96px.png');
...@@ -966,7 +974,9 @@ html, body { ...@@ -966,7 +974,9 @@ html, body {
} }
} }
@media screen and (min-width: $screen-sm) and (max-width: $screen-sm-max) {
@media screen and (min-width: $screen-xs) and (max-width: $screen-sm-max) {
.loader .logo,
#home .logo { #home .logo {
height: 144px; height: 144px;
background-image: url('../img/logo_144px.png'); background-image: url('../img/logo_144px.png');
...@@ -979,6 +989,7 @@ html, body { ...@@ -979,6 +989,7 @@ html, body {
} }
@media screen and (min-width: $screen-md) { @media screen and (min-width: $screen-md) {
.loader .logo,
#home .logo { #home .logo {
height: 200px; height: 200px;
background-image: url('../img/logo_200px.png'); background-image: url('../img/logo_200px.png');
...@@ -991,9 +1002,6 @@ html, body { ...@@ -991,9 +1002,6 @@ html, body {
} }
} }
@media screen and (min-width: $screen-md) {
.circle-bg-dark { .circle-bg-dark {
background-image: url('../../resources/logo/svg/white/logo.large.empty.transparent.svg'); background-image: url('../../resources/logo/svg/white/logo.large.empty.transparent.svg');
background-repeat: no-repeat; background-repeat: no-repeat;
...@@ -1001,6 +1009,16 @@ html, body { ...@@ -1001,6 +1009,16 @@ html, body {
background-size: 1024px 1024px; background-size: 1024px 1024px;
} }
@media screen and (max-width: $screen-sm-max) {
.circle-bg-dark {
background-blend-mode: soft-light;
}
}
@media screen and (min-width: $screen-md) {
.circle-bg-dark {
background-blend-mode: hard-light;
}
} }
.gray { .gray {
...@@ -1282,10 +1300,11 @@ html, body { ...@@ -1282,10 +1300,11 @@ html, body {
} }
} }
.stable-100-bg { .popover-wallet-tx-actions {
background-color: $stable-100-bg !important; height: 120px;
} }
/****** /******
* TX view (wallet or identity) * TX view (wallet or identity)
*******/ *******/
...@@ -1296,7 +1315,6 @@ html, body { ...@@ -1296,7 +1315,6 @@ html, body {
padding-top: 8px; padding-top: 8px;
margin: 0 !important; margin: 0 !important;
.badge-energized { .badge-energized {
background-color: rgba(255, 201, 0, 0.3); background-color: rgba(255, 201, 0, 0.3);
color: #888 !important; color: #888 !important;
...@@ -1309,18 +1327,6 @@ html, body { ...@@ -1309,18 +1327,6 @@ html, body {
background-color: white; // Fix issue #847 background-color: white; // Fix issue #847
} }
.vertical-center{
position: absolute;
top: 30%;
width: 40%;
}
p.comment{
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
}
p.text-wrap { p.text-wrap {
white-space: normal; white-space: normal;
a { a {
...@@ -1328,17 +1334,38 @@ html, body { ...@@ -1328,17 +1334,38 @@ html, body {
} }
} }
p.comment {
margin: 8px 0;
padding-left: 16px; // For icon
i.ion-ios-chatbubble-outline {
margin-left: -16px;
position: absolute;
}
}
.col-pubkey { .col-pubkey {
max-width: 80%; max-width: 80%;
.pubkeys {
display: block;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
a {
display: block;
overflow: hidden;
text-overflow: ellipsis;
}
.pubkeys {
display: block;
max-height: 130px; max-height: 130px;
overflow: hidden; overflow: hidden;
} }
} }
.col-comment {
white-space: normal;
}
} }
...@@ -1386,6 +1413,7 @@ html, body { ...@@ -1386,6 +1413,7 @@ html, body {
filter: alpha(opacity=80); filter: alpha(opacity=80);
} }
.card.stable-900-bg, .card.stable-900-bg,
.card .stable-900-bg, .card .stable-900-bg,
.item.stable-900-bg, .item.stable-900-bg,
...@@ -1936,11 +1964,20 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0"; ...@@ -1936,11 +1964,20 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
} }
} }
/**********
About modal
**********/
.modal.about .bar.bar-header .button + .title { .modal.about .bar.bar-header .button + .title {
left: 0 !important; /* avoid title offset on large screens, if button are 'visible-xs')'*/ left: 0 !important; /* avoid title offset on large screens, if button are 'visible-xs')'*/
} }
.modal.about {
.ion-telegram:before {
content: url('../img/logo_telegram.svg');
}
}
/********** /**********
Item buttons Item buttons
**********/ **********/
...@@ -1983,7 +2020,7 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0"; ...@@ -1983,7 +2020,7 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
} }
.item.item-thumbnail-left, .item-thumbnail-left { .item.item-thumbnail-left, .item-thumbnail-left {
min-height: 100px !important; min-height: 100px;
} }
.item-thumbnail-left > i:first-child, .item-thumbnail-left > i:first-child,
...@@ -2419,6 +2456,10 @@ body.demo { ...@@ -2419,6 +2456,10 @@ body.demo {
height: 204px; height: 204px;
} }
.popover.popover-login-methods.auth.scan {
height: 252px;
}
@media (max-width: $screen-xs-max) { @media (max-width: $screen-xs-max) {
.popover.popover-login-methods { .popover.popover-login-methods {
height: 256px; height: 256px;
...@@ -2558,6 +2599,11 @@ div[drop-zone]:hover { ...@@ -2558,6 +2599,11 @@ div[drop-zone]:hover {
/********** /**********
Wot identity Wot identity
**********/ **********/
.stable-100-bg {
background-color: $stable-100-bg !important;
}
.hero.dark-100-bg { .hero.dark-100-bg {
background-color: $dark-100-bg; background-color: $dark-100-bg;
} }
...@@ -2657,6 +2703,11 @@ div[drop-zone]:hover { ...@@ -2657,6 +2703,11 @@ div[drop-zone]:hover {
overflow: hidden; overflow: hidden;
} }
} }
.icon-eye-toggle:before {
font-size: 24px;
padding-top: 8px;
}
} }
/********** /**********
...@@ -2747,6 +2798,19 @@ div[drop-zone]:hover { ...@@ -2747,6 +2798,19 @@ div[drop-zone]:hover {
color: white !important; color: white !important;
} }
h1, .h1 {
font-size: 18pt;
}
h2, .h2 {
font-size: 16pt;
}
h3, .h3 {
font-size: 14pt;
}
h4, .h4 {
font-size: 12pt;
}
ul { ul {
list-style: unset; list-style: unset;
padding-left: 40px; padding-left: 40px;
...@@ -2770,24 +2834,63 @@ div[drop-zone]:hover { ...@@ -2770,24 +2834,63 @@ div[drop-zone]:hover {
border: 1px solid $positive; border: 1px solid $positive;
} }
.avatar-left-padding { .avatar-left-padding {
padding-left: 30px; padding-inline-start: 30px;
} }
} }
.feed-title, .feed-title,
.card .title { .card .title {
margin-top: 5px; margin-top: 5px;
font-size: 18pt;
a { a {
color: white !important;; color: white !important;;
} }
} }
.tags {
font-size: small;
color: grey !important;
}
.feed-content, .feed-content,
.card .content { .card .content {
text-align: start; text-align: start;
color: lightgrey !important; color: lightgrey !important;
img.emoji {
display: unset;
max-width: 12px;
max-height: 12px;
}
blockquote p {
font-weight: unset;
font-size: unset;
line-height: unset;
}
blockquote, .quote .title {
padding: 5px 10px;
border-left: 5px solid gray;
margin: 0 0 10px 0;
font-size: 10pt;
}
.quote .title {
margin: 0;
font-size: 10pt;
padding-left: 32px;
.avatar {
position: absolute;
margin-top: -1px;
margin-left: -3px;
height: 20px;
width: 20px;
border: 1px solid $positive;
}
}
} }
.feed-footer, .feed-footer,
.card .footer { .card .footer {
a:hover { a:hover {
......
...@@ -27,6 +27,30 @@ ...@@ -27,6 +27,30 @@
color: grey; color: grey;
} }
#home .progress-bar {
display: inline-block;
width: 50vw;
max-width: 300px;
position: relative;
height: 12px;
border-radius: 5px;
border: 1px solid gray;
}
#home .progress-fill {
height: 100%;
background-color: currentColor;
position: absolute;
left: 0;
top: 0;
border-radius: 5px;
transition: width 0.2s ease;
}
#home .progress-text {
font-size: 12px;
color: currentColor !important;
opacity: 0.7;
}
#modal-license { #modal-license {
color:rgb(0, 0, 0); color:rgb(0, 0, 0);
} }
...@@ -173,7 +197,9 @@ ...@@ -173,7 +197,9 @@
padding-top: 9px; padding-top: 9px;
padding-bottom: 3px; padding-bottom: 3px;
} }
.list .item-peer .col h3 {
margin-bottom: 0 !important;
}
.list .item-peer .badge { .list .item-peer .badge {
top: 14px; top: 14px;
right: 6%; right: 6%;
...@@ -202,8 +228,54 @@ ...@@ -202,8 +228,54 @@
.list .item-peer.compacted > * { .list .item-peer.compacted > * {
display: none; display: none;
} }
.list .item-peer .col-server {
overflow: hidden;
text-overflow: ellipsis;
}
.list .item-peer .col-api {
vertical-align: center;
}
.list .item-peer .col-api h4 {
min-width: 50px;
height: 100%;
white-space: normal;
padding-top: 5px;
}
.list .item-peer .col-api h4 span {
white-space: nowrap;
font-size: 14px;
line-height: 12px;
}
.list .item-peer .col-api h4 span small {
font-size: 85%;
}
.list .item-peer .col-sandboxes h3 {
display: block;
color: gray;
padding: 0;
}
.list .item-peer .col-sandboxes .progress-bar {
display: inline-block;
width: 50px;
position: relative;
height: 12px;
border-radius: 5px;
border: 1px solid gray;
}
.list .item-peer .col-sandboxes .progress-fill {
height: 100%;
background-color: currentColor;
position: absolute;
left: 0;
top: 0;
border-radius: 5px;
transition: width 0.2s ease;
}
.list .item-peer .col-sandboxes .progress-text {
width: 100%;
font-size: 10px;
text-align: center;
}
/********** /**********
Block items Block items
**********/ **********/
......
This diff is collapsed.
This diff is collapsed.
...@@ -49,8 +49,9 @@ ...@@ -49,8 +49,9 @@
"NO_ACCOUNT_QUESTION": "Not a member yet? Register now!", "NO_ACCOUNT_QUESTION": "Not a member yet? Register now!",
"SEARCH_NO_RESULT": "No result found", "SEARCH_NO_RESULT": "No result found",
"LOADING": "Loading...", "LOADING": "Loading...",
"LOADING_WAIT": "Loading...<br/><small>(Waiting for node availability)</small>", "LOADING_WAIT": "Loading...<br/><small>(Cesium is querying the Duniter peer)</small>",
"SEARCHING": "Searching...", "SEARCHING": "Searching...",
"DOWNLOADING_DOTS": "Downloading...",
"FROM": "From", "FROM": "From",
"TO": "To", "TO": "To",
"COPY": "Copy", "COPY": "Copy",
...@@ -110,7 +111,11 @@ ...@@ -110,7 +111,11 @@
"CODE": "Source code:", "CODE": "Source code:",
"OFFICIAL_WEB_SITE": "Official web site:", "OFFICIAL_WEB_SITE": "Official web site:",
"DEVELOPERS": "Developers:", "DEVELOPERS": "Developers:",
"FORUM": "Forum:", "USER_FORUM": "User forum:",
"TECH_FORUM": "Technical forum:",
"TELEGRAM": "Telegram group:",
"USER_HELP_DIVIDER": "Community",
"CONTRIBUTE_DIVIDER": "Contribute",
"PLEASE_REPORT_ISSUE": "Please report any issue to us!", "PLEASE_REPORT_ISSUE": "Please report any issue to us!",
"REPORT_ISSUE": "Report an issue", "REPORT_ISSUE": "Report an issue",
"BTN_OPEN_DEV_WINDOW": "Open the debug window" "BTN_OPEN_DEV_WINDOW": "Open the debug window"
...@@ -131,19 +136,24 @@ ...@@ -131,19 +136,24 @@
"REPORT_ISSUE": "Report an issue", "REPORT_ISSUE": "Report an issue",
"NOT_YOUR_ACCOUNT_QUESTION" : "You do not own the account <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?", "NOT_YOUR_ACCOUNT_QUESTION" : "You do not own the account <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?",
"BTN_CHANGE_ACCOUNT": "Disconnect this account", "BTN_CHANGE_ACCOUNT": "Disconnect this account",
"CONNECTION_ERROR": "Peer <b>{{server}}</b> unreachable or invalid address.<br/><br/>Check your Internet connection, or change node <a class=\"positive\" ng-click=\"doQuickFix('settings')\">in the settings</a>.", "PEER_CONNECTION_ERROR": "Peer <b>{{server}}</b> is unreachable or address is invalid.<br/><br/>Check your Internet connection, or change the peer <a class=\"positive\" ng-click=\"doQuickFix('settings')\">in the settings</a>.",
"NETWORK_CONNECTION_ERROR": "Network is unreachable.<br/><br/>Check your Internet connection, or select a peer manually <a class=\"positive\" ng-click=\"doQuickFix('settings')\">in the settings</a>.",
"SHOW_ALL_FEED": "Show all", "SHOW_ALL_FEED": "Show all",
"READ_MORE": "Read more", "READ_MORE": "Read more",
"FEED_SOURCE": "Source" "FEED_SOURCE": "Source",
"FEEDS_TITLE": "News"
}, },
"SETTINGS": { "SETTINGS": {
"TITLE": "Settings", "TITLE": "Settings",
"DISPLAY_DIVIDER": "Display", "DISPLAY_DIVIDER": "Display",
"STORAGE_DIVIDER": "Storage", "STORAGE_DIVIDER": "Storage",
"NETWORK_SETTINGS": "Network", "NETWORK_SETTINGS": "Network",
"PEER": "Duniter peer address", "PEER": "Duniter peer",
"PEER_SHORT": "Peer address",
"PEER_CHANGED_TEMPORARY": "Address used temporarily", "PEER_CHANGED_TEMPORARY": "Address used temporarily",
"PEER_SELECTED_AUTOMATICALLY": "Peer selected automatically at startup",
"NETWORK_ANALYZE_TIMEOUT": "Maximum waiting time (timeout)",
"NETWORK_ANALYZE_TIMEOUT_HELP": "Maximum waiting time for network analysis",
"NETWORK_ANALYZE_TIMEOUT_AUTO": "Auto",
"PERSIST_CACHE": "Keep navigation data (experimental)", "PERSIST_CACHE": "Keep navigation data (experimental)",
"PERSIST_CACHE_HELP": "Allows faster navigation, locally retaining the data received, for use from one session to another.", "PERSIST_CACHE_HELP": "Allows faster navigation, locally retaining the data received, for use from one session to another.",
"USE_LOCAL_STORAGE": "Enable local storage", "USE_LOCAL_STORAGE": "Enable local storage",
...@@ -154,6 +164,7 @@ ...@@ -154,6 +164,7 @@
"ENABLE_HELPTIP": "Enable contextual help tips", "ENABLE_HELPTIP": "Enable contextual help tips",
"DISABLE_HELPTIP": "Disable contextual help tips", "DISABLE_HELPTIP": "Disable contextual help tips",
"ENABLE_UI_EFFECTS": "Enable visual effects", "ENABLE_UI_EFFECTS": "Enable visual effects",
"ENABLE_UI_EFFECTS_HELP": "Transition between pages, animation of list",
"HISTORY_SETTINGS": "Account operations", "HISTORY_SETTINGS": "Account operations",
"DISPLAY_UD_HISTORY": "Display produced dividends?", "DISPLAY_UD_HISTORY": "Display produced dividends?",
"TX_HISTORY_AUTO_REFRESH": "Enable automatic refresh?", "TX_HISTORY_AUTO_REFRESH": "Enable automatic refresh?",
...@@ -190,7 +201,7 @@ ...@@ -190,7 +201,7 @@
"HOST" : "Address", "HOST" : "Address",
"HOST_HELP": "Address: server:port", "HOST_HELP": "Address: server:port",
"USE_SSL" : "Secured?", "USE_SSL" : "Secured?",
"USE_SSL_HELP" : "(SSL Encryption)", "USE_SSL_HELP" : "SSL Encryption",
"BTN_SHOW_LIST" : "Peer's list" "BTN_SHOW_LIST" : "Peer's list"
} }
}, },
...@@ -312,7 +323,9 @@ ...@@ -312,7 +323,9 @@
} }
}, },
"INFO": { "INFO": {
"ONLY_SSL_PEERS": "Non-SSL nodes have a degraded display because Cesium works in HTTPS mode." "CONNECTING_TO_NETWORK": "Connecting to the network...",
"ANALYZING_NETWORK": "Analyzing the {{currency|abbreviate}} network...",
"ONLY_SSL_PEERS": "Non-SSL peers have a degraded display because Cesium works in HTTPS mode."
} }
}, },
"PEER": { "PEER": {
...@@ -327,6 +340,9 @@ ...@@ -327,6 +340,9 @@
"ALL_PEERS" : "All peers", "ALL_PEERS" : "All peers",
"DIFFICULTY" : "Difficulty", "DIFFICULTY" : "Difficulty",
"API" : "API", "API" : "API",
"SANDBOXES": "Queue",
"PENDING_TX": "{{count}} transaction(s) / {{size}} max, {{free}} space(s) remaining",
"PENDING_MEMBERSHIPS": "{{count}} pending membership(s) / {{size}} max, {{free}} space(s) remaining",
"CURRENT_BLOCK" : "Block #", "CURRENT_BLOCK" : "Block #",
"POPOVER_FILTER_TITLE": "Filter", "POPOVER_FILTER_TITLE": "Filter",
"OFFLINE": "Offline", "OFFLINE": "Offline",
...@@ -523,15 +539,15 @@ ...@@ -523,15 +539,15 @@
"INTRO_WARNING_SECURITY": "Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.", "INTRO_WARNING_SECURITY": "Check that the hardware you are currently using (computer, tablet, phone) <b>is secure and trustworthy </b>.",
"INTRO_WARNING_SECURITY_HELP": "Up-to-date anti-virus, firewall enabled, session protected by password or pin code...", "INTRO_WARNING_SECURITY_HELP": "Up-to-date anti-virus, firewall enabled, session protected by password or pin code...",
"INTRO_HELP": "Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.", "INTRO_HELP": "Click <b> {{'COMMON.BTN_START'|translate}}</b> to begin creating an account. You will be guided step by step.",
"REGISTRATION_NODE": "Your registration will be registered via the Duniter peer <b>{{server}}</b> node, which will then be distributed to the rest of the currency network.", "REGISTRATION_NODE": "Your registration will be registered via the Duniter peer <b>{{server}}</b>, which will then be distributed to the rest of the currency network.",
"REGISTRATION_NODE_HELP": "If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.", "REGISTRATION_NODE_HELP": "If you do not trust this peer, please change <a ng-click=\"doQuickFix('settings')\">in the settings</a> of Cesium.",
"SELECT_ACCOUNT_TYPE": "Choose the type of account to create:", "SELECT_ACCOUNT_TYPE": "Choose the type of account to create:",
"MEMBER_ACCOUNT": "Member account", "MEMBER_ACCOUNT": "Member account",
"MEMBER_ACCOUNT_TITLE": "Create a 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": "Simple wallet",
"WALLET_ACCOUNT_TITLE": "Create a 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!", "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!", "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>", "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>",
...@@ -564,6 +580,24 @@ ...@@ -564,6 +580,24 @@
"SELECT_WALLET_MODAL": { "SELECT_WALLET_MODAL": {
"TITLE": "Wallet selection" "TITLE": "Wallet selection"
}, },
"CERTIFICATION_MODAL": {
"CHECKLIST_TITLE": "Certification check list",
"INFOS": "Each member is responsible for the security of Ğ1 currency. Before certifying this person's identity, you should have performed few checks. Please answer following questions:",
"BTN_ALL_CHECK": "Certify",
"CHECKLIST_CONDITIONS_NOT_MET": "The certification has not been sent. All answers are not right. Please recheck each point with the person to be certified.",
"QUESTIONS": {
"WELL_KNOWN": "Do you know <b>well</b> the person you are about to certify? Do you know other people who also know this person well?",
"REVOCATION": "Has this person downloaded their <b>revocation document</b> and do they know where to find it?",
"CONTACT": "Have you <b>had contact</b> with this person by many means, and did they answer?",
"DOUBLE_IDENTITY": "The person should own <b>only one active member identity</b>. Do you think they own another one?",
"MASTER_ACCOUNT": "Does this person own their accounts secrets? Have they already <b>sent money from their account</b> at least once?",
"LICENSE": "Has this person <b>understood the Duniter license</b>? Do they agree to comply with it for future certifications?",
"CREDENTIALS": "Was the account created with <b>long and complex secret identifier and password</b> (ex. passphrases)? Did the person understand that both secret identifier and password must remain secret ? Are they <b>sure to remember them</b> or to be able to find them?",
"PUBLIC_KEY_DIFFERENT": "The <b>public key</b> that is shown must be <b>identical</b> to the one the person gave you. The public keys are they <b>different</b>?"
},
"REMINDER_TITLE": "Reminder",
"SHORT_LICENSE_REMINDER": "You may remind the person to certify different certification parameters:<br/><br/><ul><li> - Each member can certify 100 other identities at most.</li><li> - The certifications are saved with a 5 days interval.</li><li> - A new identity must gather at least 5 certifications in less than 2 months.</li><li>- A member must renew its membership at least once a year.</li><li> - Certifications have a lifespan of two years.</li></ul>"
},
"WALLET_LIST": { "WALLET_LIST": {
"TITLE": "My wallets", "TITLE": "My wallets",
"BTN_NEW": "Add a wallet", "BTN_NEW": "Add a wallet",
...@@ -572,7 +606,7 @@ ...@@ -572,7 +606,7 @@
"NO_WALLET": "No secondary wallet", "NO_WALLET": "No secondary wallet",
"BTN_DELETE": "Remove a secondary wallet...", "BTN_DELETE": "Remove a secondary wallet...",
"BTN_RENAME": "Rename the wallet", "BTN_RENAME": "Rename the wallet",
"EXPORT_FILENAME": "my_wallets-{{pubkey|formatPubkey}}-{{currency}}.csv", "EXPORT_FILENAME": "{{currency}}-my_wallets-{{pubkey}}.csv",
"TOTAL_DOTS": "Total: ", "TOTAL_DOTS": "Total: ",
"EDIT_POPOVER": { "EDIT_POPOVER": {
"TITLE": "Rename the wallet", "TITLE": "Rename the wallet",
...@@ -594,7 +628,7 @@ ...@@ -594,7 +628,7 @@
"DOWNLOAD_REVOKE_HELP" : "Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.", "DOWNLOAD_REVOKE_HELP" : "Having a revocation file is important, for example in case of loss of identifiers. It allows you to <b>get this account out of the Web Of Trust</b>, thus becoming a simple wallet.",
"GENERATE_KEYFILE": "Generate my keychain file ...", "GENERATE_KEYFILE": "Generate my keychain file ...",
"GENERATE_KEYFILE_HELP": "Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!", "GENERATE_KEYFILE_HELP": "Generate a file allowing you to authenticate without entering your identifiers.<br/><b>Warning:</b> this file will contain your secret key; It is therefore very important to put it in a safe place!",
"KEYFILE_FILENAME": "keychain-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey", "KEYFILE_FILENAME": "{{currency}}-keychain-{{pubkey}}-{{format}}.dunikey",
"MEMBERSHIP_IN": "Register as member...", "MEMBERSHIP_IN": "Register as member...",
"MEMBERSHIP_IN_HELP": "Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.", "MEMBERSHIP_IN_HELP": "Allows you to <b>transform </b> a simple wallet account <b>into a member account</b>, by sending a membership request. Useful only if you do not already have another member account.",
"SEND_IDENTITY": "Publish identity...", "SEND_IDENTITY": "Publish identity...",
...@@ -630,7 +664,7 @@ ...@@ -630,7 +664,7 @@
"REVOCATION_WITH_FILE_HELP": "To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.", "REVOCATION_WITH_FILE_HELP": "To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.",
"REVOCATION_WALLET": "Revoke this account immediately", "REVOCATION_WALLET": "Revoke this account immediately",
"REVOCATION_WALLET_HELP": "Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.", "REVOCATION_WALLET_HELP": "Requesting revocation of your identity causes <b>will revoke your membership</ b> (definitely for the associated pseudonym and public key). The account will no longer be able to produce a Universal Dividend.<br/>However, you can still use it as a simple wallet.",
"REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt", "REVOCATION_FILENAME": "{{currency}}-revocation-{{uid}}-{{pubkey}}.txt",
"SAVE_ID": "Save my credentials...", "SAVE_ID": "Save my credentials...",
"SAVE_ID_HELP": "Creating a backup file, to <b>retrieve your password</b> (and the secret identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.", "SAVE_ID_HELP": "Creating a backup file, to <b>retrieve your password</b> (and the secret identifier) <b> in case of forgetting</b>. The file is <b>secured</ b> (encrypted) using personal questions.",
"STRONG_LEVEL": "Strong <span class=\"hidden-xs \">(6 questions minimum)</span>", "STRONG_LEVEL": "Strong <span class=\"hidden-xs \">(6 questions minimum)</span>",
...@@ -684,6 +718,8 @@ ...@@ -684,6 +718,8 @@
"PUBKEY_INVALID_CHECKSUM": "Invalid public key (bad checksum).", "PUBKEY_INVALID_CHECKSUM": "Invalid public key (bad checksum).",
"POPUP_TITLE": "Error", "POPUP_TITLE": "Error",
"UNKNOWN_ERROR": "Unknown error", "UNKNOWN_ERROR": "Unknown error",
"TIMEOUT_REACHED": "Peer timeout exceeded ({{timeout|formatDurationMs}}).<br/><br/><small>{{url}}</small>",
"TOO_MANY_REQUESTS": "You have made too many requests in a short period of time. Please wait a while before trying again.<br/><br/><small>{{url}}</small>",
"CRYPTO_UNKNOWN_ERROR": "Your browser is not compatible with cryptographic features.", "CRYPTO_UNKNOWN_ERROR": "Your browser is not compatible with cryptographic features.",
"DOWNLOAD_KEYFILE_FAILED": "Failed to generate the keychain file.", "DOWNLOAD_KEYFILE_FAILED": "Failed to generate the keychain file.",
"EQUALS_TO_PSEUDO": "Must be different from pseudonym", "EQUALS_TO_PSEUDO": "Must be different from pseudonym",
...@@ -740,7 +776,7 @@ ...@@ -740,7 +776,7 @@
"IDENTITY_PENDING_REVOCATION": "The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.", "IDENTITY_PENDING_REVOCATION": "The <b>revocation of this identity</b> has been requested and is awaiting processing. Certification is therefore disabled.",
"IDENTITY_INVALID_BLOCK_HASH": "This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.", "IDENTITY_INVALID_BLOCK_HASH": "This membership application is no longer valid (because it references a block that network peers are cancelled): the person must renew its application for membership <b>before</b> being certified.",
"IDENTITY_EXPIRED": "This identity has expired: this person must re-apply <b>before</b> being certified.", "IDENTITY_EXPIRED": "This identity has expired: this person must re-apply <b>before</b> being certified.",
"IDENTITY_SANDBOX_FULL": "Could not register, because peer's sandbox is full.<br/><br/>Please retry later or choose another Duniter peer (in <b>Settings</b>).", "IDENTITY_SANDBOX_FULL": "Could not register, because Duniter peer's sandbox is full.<br/><br/>Please retry later or choose another peer (in the <b>settings</b>).",
"IDENTITY_NOT_FOUND": "Identity not found", "IDENTITY_NOT_FOUND": "Identity not found",
"IDENTITY_TX_FAILED": "Error while getting identity's transactions", "IDENTITY_TX_FAILED": "Error while getting identity's transactions",
"WOT_PENDING_INVALID_BLOCK_HASH": "Membership not valid.", "WOT_PENDING_INVALID_BLOCK_HASH": "Membership not valid.",
...@@ -764,6 +800,7 @@ ...@@ -764,6 +800,7 @@
"GET_BLOCK_FAILED": "Error while getting block", "GET_BLOCK_FAILED": "Error while getting block",
"INVALID_BLOCK_HASH": "Block not found (incorrect hash)", "INVALID_BLOCK_HASH": "Block not found (incorrect hash)",
"DOWNLOAD_REVOCATION_FAILED": "Error while downloading revocation file.", "DOWNLOAD_REVOCATION_FAILED": "Error while downloading revocation file.",
"DOWNLOAD_SAVE_ID_FAILED": "Failed to download the credentials backup file.",
"REVOCATION_FAILED": "Error while trying to revoke the identity.", "REVOCATION_FAILED": "Error while trying to revoke the identity.",
"SALT_OR_PASSWORD_NOT_CONFIRMED": "Wrong secret identifier or password ", "SALT_OR_PASSWORD_NOT_CONFIRMED": "Wrong secret identifier or password ",
"RECOVER_ID_FAILED": "Could not recover password", "RECOVER_ID_FAILED": "Could not recover password",
...@@ -786,7 +823,10 @@ ...@@ -786,7 +823,10 @@
"UNKNOWN_WALLET_ID": "Unknown secondary wallet.", "UNKNOWN_WALLET_ID": "Unknown secondary wallet.",
"RESTORE_WALLET_LIST_FAILED": "Unable to restore the list of wallets.", "RESTORE_WALLET_LIST_FAILED": "Unable to restore the list of wallets.",
"INVALID_FILE_FORMAT": "Invalid file format.", "INVALID_FILE_FORMAT": "Invalid file format.",
"SAME_TX_RECIPIENT": "The recipient must be different from the issuer." "SAME_TX_RECIPIENT": "The recipient must be different from the issuer.",
"SELF_CERTIFICATION": "You cannot certify your own identity.",
"TX_SANDBOX_FULL": "The Duniter peer used by Cesium can no longer process new transfers, as its queue is full.<br/><br/>Please try again later or change the peer (in the <b>Settings</b>).",
"DOWNLOAD_TX_HISTORY_FAILED": "Error downloading the account statement"
}, },
"INFO": { "INFO": {
"POPUP_TITLE": "Information", "POPUP_TITLE": "Information",
...@@ -802,9 +842,12 @@ ...@@ -802,9 +842,12 @@
"REVOCATION_SENT": "Revocation sent successfully", "REVOCATION_SENT": "Revocation sent successfully",
"REVOCATION_SENT_WAITING_PROCESS": "Revocation <b>has been sent successfully</b>. It is awaiting processing.", "REVOCATION_SENT_WAITING_PROCESS": "Revocation <b>has been sent successfully</b>. It is awaiting processing.",
"FEATURES_NOT_IMPLEMENTED": "This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)", "FEATURES_NOT_IMPLEMENTED": "This features is not implemented yet.<br/><br/>Why not to contribute to get it faster? ;)",
"EMPTY_TX_HISTORY": "No operations to export" "EMPTY_TX_HISTORY": "No operations to export",
"LOADING_PENDING_TX": "Please wait...<br/><small>(Retrieving pending operations)</small>",
"FILE_DOWNLOADED": "File downloaded"
}, },
"CONFIRM": { "CONFIRM": {
"CAN_CONTINUE": "<b>Are you sure</b> you want to continue?",
"POPUP_TITLE": "<b>Confirmation</b>", "POPUP_TITLE": "<b>Confirmation</b>",
"POPUP_WARNING_TITLE": "<b>Warning</b>", "POPUP_WARNING_TITLE": "<b>Warning</b>",
"POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Security warning</b>", "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Security warning</b>",
...@@ -828,8 +871,10 @@ ...@@ -828,8 +871,10 @@
"SAVE_BEFORE_LEAVE": "Do you want to <b>save your changes</b> before leaving the page?", "SAVE_BEFORE_LEAVE": "Do you want to <b>save your changes</b> before leaving the page?",
"SAVE_BEFORE_LEAVE_TITLE": "Changes not saved", "SAVE_BEFORE_LEAVE_TITLE": "Changes not saved",
"LOGOUT": "Are you sure you want to logout?", "LOGOUT": "Are you sure you want to logout?",
"USE_FALLBACK_NODE": "Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?", "USE_FALLBACK_NODE": "Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> peer?",
"ISSUE_524_SEND_LOG": "The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>" "USE_SYNC_FALLBACK_NODE": "Peer <b>{{old}}</b> seems to be out of sync.<br/><br/>Do you want to temporarily use the synchronized peer <b>{{new}}</b>?",
"ISSUE_524_SEND_LOG": "The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>",
"ENABLE_EXPERT_MODE_TO_CHANGE_NODE": "<b class=\"assertive\">Warning:</b> Do you want to <b>manually change</b> the Duniter peer?<br/><br/>If you continue:<ul><li> - <b>Expert mode</b> will be activated;</li><li> - You can return to automatic peer selection by simply <b>deactivating expert mode</b>.</li></ul>"
}, },
"MODE": { "MODE": {
"DEMO": { "DEMO": {
......
This diff is collapsed.
...@@ -49,8 +49,9 @@ ...@@ -49,8 +49,9 @@
"NO_ACCOUNT_QUESTION": "Ankoraŭ sen konto? Kreu ĝin senpage!", "NO_ACCOUNT_QUESTION": "Ankoraŭ sen konto? Kreu ĝin senpage!",
"SEARCH_NO_RESULT": "Neniu rezulto trovita", "SEARCH_NO_RESULT": "Neniu rezulto trovita",
"LOADING": "Bonvolu pacienci...", "LOADING": "Bonvolu pacienci...",
"LOADING_WAIT": "Bonvolu pacienci...<br/><small>(Atendado pri disponebleco de la nodo)</small>", "LOADING_WAIT": "Bonvolu pacienci...<br/><small>(Cesium demandas la Duniter-nodon)</small>",
"SEARCHING": "Serĉanta...", "SEARCHING": "Serĉanta...",
"DOWNLOADING_DOTS": "Elŝutanta...",
"FROM": "De", "FROM": "De",
"TO": "Al", "TO": "Al",
"COPY": "Kopii", "COPY": "Kopii",
...@@ -110,7 +111,11 @@ ...@@ -110,7 +111,11 @@
"CODE": "Fonto-kodo:", "CODE": "Fonto-kodo:",
"OFFICIAL_WEB_SITE": "Oficiala retejo:", "OFFICIAL_WEB_SITE": "Oficiala retejo:",
"DEVELOPERS": "Programita de:", "DEVELOPERS": "Programita de:",
"FORUM": "Forumo:", "USER_FORUM": "Uzant-Forumo:",
"TECH_FORUM": "Teknika Forumo:",
"TELEGRAM": "Telegram-Grupo:",
"USER_HELP_DIVIDER": "Komunumo",
"CONTRIBUTE_DIVIDER": "Kontribui",
"PLEASE_REPORT_ISSUE": "Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn", "PLEASE_REPORT_ISSUE": "Ne hezitu sciigi al ni la renkontitajn fuŝaĵojn",
"REPORT_ISSUE": "Sciigi problemon", "REPORT_ISSUE": "Sciigi problemon",
"BTN_OPEN_DEV_WINDOW": "Malfermi la fenestron pri malfuŝigado" "BTN_OPEN_DEV_WINDOW": "Malfermi la fenestron pri malfuŝigado"
...@@ -131,21 +136,26 @@ ...@@ -131,21 +136,26 @@
"REPORT_ISSUE": "fuŝaĵo", "REPORT_ISSUE": "fuŝaĵo",
"NOT_YOUR_ACCOUNT_QUESTION" : "Vi ne posedas la konton <b class=\"ion-key\"> {{pubkey|formatPubkey}}</b>&nbsp;?", "NOT_YOUR_ACCOUNT_QUESTION" : "Vi ne posedas la konton <b class=\"ion-key\"> {{pubkey|formatPubkey}}</b>&nbsp;?",
"BTN_CHANGE_ACCOUNT": "Malkonektu tiun ĉi konton", "BTN_CHANGE_ACCOUNT": "Malkonektu tiun ĉi konton",
"CONNECTION_ERROR": "Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ elektu alian nodon <a class=\"positive\" ng-click=\"doQuickFix('settings')\">ĉe la parametroj</a>.", "PEER_CONNECTION_ERROR": "Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ elektu alian nodon <a class=\"positive\" ng-click=\"doQuickFix('settings')\">ĉe la parametroj</a>.",
"NETWORK_CONNECTION_ERROR": "Reto neatingeblas.<br/><br/>Kontrolu vian interreta konekto, aŭ selektu nodon permane <a class=\"positive\" ng-click=\"doQuickFix('settings')\">en la agordoj</a>.",
"SHOW_ALL_FEED": "Vidi ĉion", "SHOW_ALL_FEED": "Vidi ĉion",
"READ_MORE": "Legi la sekvon", "READ_MORE": "Legi la sekvon",
"FEED_SOURCE": "Fonto" "FEED_SOURCE": "Fonto",
"FEEDS_TITLE": "Novaĵoj"
}, },
"SETTINGS": { "SETTINGS": {
"TITLE": "Parametroj", "TITLE": "Parametroj",
"DISPLAY_DIVIDER": "Afiŝado", "DISPLAY_DIVIDER": "Afiŝado",
"STORAGE_DIVIDER": "Stokado", "STORAGE_DIVIDER": "Stokado",
"NETWORK_SETTINGS": "Reto", "NETWORK_SETTINGS": "Reto",
"PEER": "Adreso de la nodo Duniter", "PEER": "Nodo Duniter",
"PEER_SHORT": "Adreso de la nodo",
"PEER_CHANGED_TEMPORARY": "Adreso provizore uzata", "PEER_CHANGED_TEMPORARY": "Adreso provizore uzata",
"PEER_SELECTED_AUTOMATICALLY": "Nodo aŭtomate elektita ĉe starto",
"NETWORK_ANALYZE_TIMEOUT": "Maksimuma atendotempo (eltempigo)",
"NETWORK_ANALYZE_TIMEOUT_HELP": "Maksimuma atendotempo por reto analizo",
"NETWORK_ANALYZE_TIMEOUT_AUTO": "Auto",
"PERSIST_CACHE": "Konservi la datenojn pri retumado (provaĵo)", "PERSIST_CACHE": "Konservi la datenojn pri retumado (provaĵo)",
"PERSIST_CACHE_HELP": "Ebligas pli rapidan retumadon, loke konservante la ricevitajn datenojn, por uzi ilin de sesio al alia.", "PERSIST_CACHE_HELP": "Ebligas pli rapidan retumadon, loke konservante la ricevitajn datenojn, por uzi ilin de seanco al alia.",
"USE_LOCAL_STORAGE": "Aktivigi lokan stokadon", "USE_LOCAL_STORAGE": "Aktivigi lokan stokadon",
"USE_LOCAL_STORAGE_HELP": "Ebligas konservi viajn parametrojn", "USE_LOCAL_STORAGE_HELP": "Ebligas konservi viajn parametrojn",
"WALLETS_SETTINGS": "Miaj monujoj", "WALLETS_SETTINGS": "Miaj monujoj",
...@@ -190,7 +200,7 @@ ...@@ -190,7 +200,7 @@
"HOST": "Adreso", "HOST": "Adreso",
"HOST_HELP": "Adreso: servilo: konektujo", "HOST_HELP": "Adreso: servilo: konektujo",
"USE_SSL": "Sekurigita?", "USE_SSL": "Sekurigita?",
"USE_SSL_HELP": "(SSL-ĉifrado)", "USE_SSL_HELP": "SSL-ĉifrado",
"BTN_SHOW_LIST": "Listo de la nodoj" "BTN_SHOW_LIST": "Listo de la nodoj"
} }
}, },
...@@ -312,6 +322,8 @@ ...@@ -312,6 +322,8 @@
} }
}, },
"INFO": { "INFO": {
"CONNECTING_TO_NETWORK": "Konektiĝo al la reto...",
"ANALYZING_NETWORK": "Analizo de la {{currency|abbreviate}} reto...",
"ONLY_SSL_PEERS": "La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS." "ONLY_SSL_PEERS": "La nodoj ne-SSL estas mis-afiŝitaj, ĉar Cesium funkcias laŭ moduso HTTPS."
} }
}, },
...@@ -327,6 +339,9 @@ ...@@ -327,6 +339,9 @@
"ALL_PEERS" : "Ĉiuj nodoj", "ALL_PEERS" : "Ĉiuj nodoj",
"DIFFICULTY" : "Malfacileco", "DIFFICULTY" : "Malfacileco",
"API" : "API", "API" : "API",
"SANDBOXES": "Atendovico",
"PENDING_TX": "{{count}} transakcio(j) / {{size}} maksimume, {{free}} lokoj restantaj",
"PENDING_MEMBERSHIPS": "{{count}} membreco(j) atendantaj / {{size}} maksimume, {{free}} lokoj restantaj",
"CURRENT_BLOCK" : "Bloko #", "CURRENT_BLOCK" : "Bloko #",
"POPOVER_FILTER_TITLE": "Filtrilo", "POPOVER_FILTER_TITLE": "Filtrilo",
"OFFLINE": "Nekonektita", "OFFLINE": "Nekonektita",
...@@ -564,6 +579,24 @@ ...@@ -564,6 +579,24 @@
"SELECT_WALLET_MODAL": { "SELECT_WALLET_MODAL": {
"TITLE": "Elekto de la monujo" "TITLE": "Elekto de la monujo"
}, },
"CERTIFICATION_MODAL": {
"CHECKLIST_TITLE": "Kontrolisto antaŭ atesto",
"INFOS": "La sekureco de la monero Ğ1 dependas de ĉiu membro. Antaŭ atesti la identon de tiu ĉi persono, vi devus fari kelkajn kontroladetojn. Bonvolu respondi la jenajn demandojn:",
"BTN_ALL_CHECK": "Atesti",
"CHECKLIST_CONDITIONS_NOT_MET": "La atesto ne estis sendita. La kontrolado ŝajnas nesufiĉa. Bonvolu rekontroli ĉiun punkton kun la persono, kiun vi volas atesti.",
"QUESTIONS": {
"WELL_KNOWN": "<b>Ĉu vi bone konas</b> la personon, kiun vi volas atesti, kaj ĉu vi konas aliajn homojn, kiuj ankaŭ bone konas tiun personon?",
"REVOCATION": "Ĉu tiu ĉi persono elŝutis sian <b>malkonfirmadon dokumenton</b> kaj ĉu ŝi scias, kie trovi ĝin?",
"CONTACT": "Ĉu vi <b>kontaktis</b> kun tiu ĉi persono per diversaj metodoj, kaj ĉu ŝi respondis?",
"DOUBLE_IDENTITY": "La persono devus havi <b>nur unu aktivan membro-identon</b>. Ĉu vi pensas, ke ŝi posedas alian?",
"MASTER_ACCOUNT": "Ĉu tiu ĉi persono posedas siajn kontosekretojn? Ĉu ŝi jam <b>sendis monon de sia konto</b> almenaŭ unufoje?",
"LICENSE": "Ĉu tiu ĉi persono <b>komprenis la permesilon</b> de Duniter, kaj ĉu ŝi konsentas konformiĝi al ĝi por estontaj atestoj?",
"CREDENTIALS": "Ĉu la konto estis kreita kun <b>longa kaj kompleksa identigilo/pasvorto</b> (ekz. pasfrazoj)? Ĉu la persono komprenis, ke ambaŭ la identigilo kaj la pasvorto devas resti sekretaj? Ĉu ŝi estas <b>certa, ke ŝi memoros ilin</b> aŭ povos retrovi ilin?",
"PUBLIC_KEY_DIFFERENT": "La montrata <b>publika ŝlosilo</b> devas esti <b>identa</b> al tiu, kiun la persono donis al vi. Ĉu la publika ŝlosiloj estas <b>malsamaj</b>?"
},
"REMINDER_TITLE": "Memorigo",
"SHORT_LICENSE_REMINDER": "Vi povas rememorigi al la atestota persono diversajn parametrojn pri atestoj:<br/><br/><ul><li> - Ĉiu membro povas atesti maksimume 100 aliajn identecojn.</li><li> - La atestoj estas konservataj kun intervolo de 5 tagoj.</li><li> - Nova membro devas kolekti minimume 5 atestojn en malpli ol 2 monatoj.</li><li> - Membro devas renovigi sian membrecon minimume unufoje jare.</li><li> - Atestoj estas validaj dum du jaroj.</li></ul>"
},
"WALLET_LIST": { "WALLET_LIST": {
"TITLE": "Miaj monujoj", "TITLE": "Miaj monujoj",
"BTN_NEW": "Aldoni monujon", "BTN_NEW": "Aldoni monujon",
...@@ -572,7 +605,7 @@ ...@@ -572,7 +605,7 @@
"NO_WALLET": "Neniu kroma monujo", "NO_WALLET": "Neniu kroma monujo",
"BTN_DELETE": "Forigi kroman monujon...", "BTN_DELETE": "Forigi kroman monujon...",
"BTN_RENAME": "Renomi la monujon", "BTN_RENAME": "Renomi la monujon",
"EXPORT_FILENAME": "miaj_monujoj-{{pubkey|formatPubkey}}-{{currency}}.csv", "EXPORT_FILENAME": "{{currency}}-miaj_monujoj-{{pubkey}}.csv",
"TOTAL_DOTS": "Sumo: ", "TOTAL_DOTS": "Sumo: ",
"EDIT_POPOVER": { "EDIT_POPOVER": {
"TITLE": "Renomi la monujon", "TITLE": "Renomi la monujon",
...@@ -594,7 +627,7 @@ ...@@ -594,7 +627,7 @@
"DOWNLOAD_REVOKE_HELP": "Disponi dosieron pri nuligo estas grave, ekzemple kaze de perdo de viaj identigiloj. Ĝi ebligas al vi <b>elirigi tiun konton el la reto de fido</b>, tiel ke ĝi refariĝu simpla monujo.", "DOWNLOAD_REVOKE_HELP": "Disponi dosieron pri nuligo estas grave, ekzemple kaze de perdo de viaj identigiloj. Ĝi ebligas al vi <b>elirigi tiun konton el la reto de fido</b>, tiel ke ĝi refariĝu simpla monujo.",
"GENERATE_KEYFILE": "Krei mian dosieron pri ŝlosilaro...", "GENERATE_KEYFILE": "Krei mian dosieron pri ŝlosilaro...",
"GENERATE_KEYFILE_HELP": "Kreas dosieron, kiu ebligas al vi aŭtentiĝi sen tajpi viajn identigilojn.<br/><b>Atenton:</b> tiu dosiero entenos vian konto-ŝlosilaron (publikan kaj sekretan ŝlosilojn); do tre gravas meti ĝin en sekuran lokon!", "GENERATE_KEYFILE_HELP": "Kreas dosieron, kiu ebligas al vi aŭtentiĝi sen tajpi viajn identigilojn.<br/><b>Atenton:</b> tiu dosiero entenos vian konto-ŝlosilaron (publikan kaj sekretan ŝlosilojn); do tre gravas meti ĝin en sekuran lokon!",
"KEYFILE_FILENAME": "ŝlosilaro-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey", "KEYFILE_FILENAME": "{{currency}}-ŝlosilaro-{{pubkey}}-{{format}}.dunikey",
"MEMBERSHIP_IN": "Transformi en membro-konton...", "MEMBERSHIP_IN": "Transformi en membro-konton...",
"MEMBERSHIP_IN_HELP": "Ebligas <b>transformi</b> simplan monujo-konton <b>en membro-konton</b>, sendante aliĝo-peton. Utilas nur se vi ne havas jam alian membro-konton.", "MEMBERSHIP_IN_HELP": "Ebligas <b>transformi</b> simplan monujo-konton <b>en membro-konton</b>, sendante aliĝo-peton. Utilas nur se vi ne havas jam alian membro-konton.",
"SEND_IDENTITY": "Publikigi sian identecon...", "SEND_IDENTITY": "Publikigi sian identecon...",
...@@ -630,9 +663,10 @@ ...@@ -630,9 +663,10 @@
"REVOCATION_WITH_FILE_HELP": "Por <b>definitive nuligi</b> membro-konton, bonvolu glitigi en la ĉi-suban zonon vian dosieron pri nuligo, aŭ alklaki la zonon por serĉadi dosieron.", "REVOCATION_WITH_FILE_HELP": "Por <b>definitive nuligi</b> membro-konton, bonvolu glitigi en la ĉi-suban zonon vian dosieron pri nuligo, aŭ alklaki la zonon por serĉadi dosieron.",
"REVOCATION_WALLET": "Nuligi tiun ĉi konton tuj", "REVOCATION_WALLET": "Nuligi tiun ĉi konton tuj",
"REVOCATION_WALLET_HELP": "Peti la nuligon de via identeco estigas la <b>eliradon el la reto de fido</b> (definitivan por la pseŭdonimo kaj la publika ŝlosilo kunligitaj). La konto ne plu povos produkti Universalan Dividendon.<br/>Vi tamen daŭre povos konektiĝi al ĝi, kiel al simpla monujo.", "REVOCATION_WALLET_HELP": "Peti la nuligon de via identeco estigas la <b>eliradon el la reto de fido</b> (definitivan por la pseŭdonimo kaj la publika ŝlosilo kunligitaj). La konto ne plu povos produkti Universalan Dividendon.<br/>Vi tamen daŭre povos konektiĝi al ĝi, kiel al simpla monujo.",
"REVOCATION_FILENAME": "nuligo-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt", "REVOCATION_FILENAME": "{{currency}}-nuligo-{{uid}}-{{pubkey}}.txt",
"SAVE_ID": "Konservi miajn identigilojn...", "SAVE_ID": "Konservi miajn identigilojn...",
"SAVE_ID_HELP": "Kreado de konserv-dosiero, por <b>retrovi vian pasvorton</b> (kaj la sekretan identigilon) <b>kaze de forgeso</b>. La dosiero estas <b>sekurigita</b> (ĉifrita) dank'al personaj demandoj.", "SAVE_ID_HELP": "Kreado de konserv-dosiero, por <b>retrovi vian pasvorton</b> (kaj la sekretan identigilon) <b>kaze de forgeso</b>. La dosiero estas <b>sekurigita</b> (ĉifrita) dank'al personaj demandoj.",
"SAVE_ID_FILENAME": "{{currency}}-ensalutigiloj-{{pubkey}}.txt",
"STRONG_LEVEL": "Forta <span class=\"hidden-xs \">(6 demandoj minimume)</span>", "STRONG_LEVEL": "Forta <span class=\"hidden-xs \">(6 demandoj minimume)</span>",
"TITLE": "Konto kaj sekureco", "TITLE": "Konto kaj sekureco",
"KEYFILE": { "KEYFILE": {
...@@ -684,6 +718,8 @@ ...@@ -684,6 +718,8 @@
"PUBKEY_INVALID_CHECKSUM": "Publika ŝlosilo nevalida (bad checksum).", "PUBKEY_INVALID_CHECKSUM": "Publika ŝlosilo nevalida (bad checksum).",
"POPUP_TITLE": "Eraro", "POPUP_TITLE": "Eraro",
"UNKNOWN_ERROR": "Eraro nekonata", "UNKNOWN_ERROR": "Eraro nekonata",
"TIMEOUT_REACHED": "La atendo de la nodo superis la tempon ({{timeout|formatDurationMs}}).<br/><br/><small>{{url}}</small>",
"TOO_MANY_REQUESTS": "Vi sendis tro da petojn en mallonga tempodaŭro. Bonvolu atendi iomete antaŭ ol reprovu.<br/><br/><small>{{url}}</small>",
"CRYPTO_UNKNOWN_ERROR": "Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.", "CRYPTO_UNKNOWN_ERROR": "Via retumilo ŝajnas ne kongrua kun la kriptografiaj funkcioj.",
"DOWNLOAD_KEYFILE_FAILED": "Malsukceso por la kreado de la dosiero pri ŝlosilaro.", "DOWNLOAD_KEYFILE_FAILED": "Malsukceso por la kreado de la dosiero pri ŝlosilaro.",
"EQUALS_TO_PSEUDO": "Devas esti malsama ol la pseŭdonimo", "EQUALS_TO_PSEUDO": "Devas esti malsama ol la pseŭdonimo",
...@@ -740,7 +776,7 @@ ...@@ -740,7 +776,7 @@
"IDENTITY_PENDING_REVOCATION": "La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.", "IDENTITY_PENDING_REVOCATION": "La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon. La atestado estas do malaktivigita.",
"IDENTITY_INVALID_BLOCK_HASH": "Tiu ĉi aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto): tiu persono devas refari sian aliĝo-peton <b>antaŭ ol</b> esti atestita.", "IDENTITY_INVALID_BLOCK_HASH": "Tiu ĉi aliĝo-peto ne plu validas (ĉar ĝi rilatas al bloko, kiun nuligis la nodoj de la reto): tiu persono devas refari sian aliĝo-peton <b>antaŭ ol</b> esti atestita.",
"IDENTITY_EXPIRED": "La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.", "IDENTITY_EXPIRED": "La publikigo de tiu ĉi identeco finiĝis: tiu persono devas fari novan aliĝo-peton <b>antaŭ ol</b> esti atestita.",
"IDENTITY_SANDBOX_FULL": "La nodo Duniter uzata de Cesium ne plu povas ricevi novajn identecojn, ĉar ĝia atendo-vico estas plena.<br/><br/>Bonvolu reprovi poste aŭ ŝanĝi la nodon (per la menuo <b>Parametroj</b>).", "IDENTITY_SANDBOX_FULL": "La nodo Duniter uzata de Cesium ne plu povas ricevi novajn identecojn, ĉar ĝia atendovico estas plena.<br/><br/>Bonvolu reprovi poste aŭ ŝanĝi la nodon (per la menuo <b>Parametroj</b>).",
"IDENTITY_NOT_FOUND": "Identeco ne trovita.", "IDENTITY_NOT_FOUND": "Identeco ne trovita.",
"IDENTITY_TX_FAILED": "Malsukceso por ŝarĝi la spezojn.", "IDENTITY_TX_FAILED": "Malsukceso por ŝarĝi la spezojn.",
"WOT_PENDING_INVALID_BLOCK_HASH": "Aliĝo ne valida.", "WOT_PENDING_INVALID_BLOCK_HASH": "Aliĝo ne valida.",
...@@ -764,6 +800,7 @@ ...@@ -764,6 +800,7 @@
"GET_BLOCK_FAILED": "Malsukceso por ricevi la blokon.", "GET_BLOCK_FAILED": "Malsukceso por ricevi la blokon.",
"INVALID_BLOCK_HASH": "Bloko ne trovita (haketo malsama)", "INVALID_BLOCK_HASH": "Bloko ne trovita (haketo malsama)",
"DOWNLOAD_REVOCATION_FAILED": "Malsukceso por elŝuti la dosieron pri nuligo.", "DOWNLOAD_REVOCATION_FAILED": "Malsukceso por elŝuti la dosieron pri nuligo.",
"DOWNLOAD_SAVE_ID_FAILED": "Malsukcesis elŝuti la dosieron por konservi la ensalutigilojn.",
"REVOCATION_FAILED": "Malsukceso pri nuligo.", "REVOCATION_FAILED": "Malsukceso pri nuligo.",
"SALT_OR_PASSWORD_NOT_CONFIRMED": "Sekreta identigilo aŭ pasvorto malĝusta.", "SALT_OR_PASSWORD_NOT_CONFIRMED": "Sekreta identigilo aŭ pasvorto malĝusta.",
"RECOVER_ID_FAILED": "Malsukceso por ricevi la identigilojn", "RECOVER_ID_FAILED": "Malsukceso por ricevi la identigilojn",
...@@ -786,7 +823,10 @@ ...@@ -786,7 +823,10 @@
"UNKNOWN_WALLET_ID": "Kroma monujo nekonata.", "UNKNOWN_WALLET_ID": "Kroma monujo nekonata.",
"RESTORE_WALLET_LIST_FAILED": "Malsukceso por restarigi la kromajn monujojn.", "RESTORE_WALLET_LIST_FAILED": "Malsukceso por restarigi la kromajn monujojn.",
"INVALID_FILE_FORMAT": "Strukturo de dosiero nevalida.", "INVALID_FILE_FORMAT": "Strukturo de dosiero nevalida.",
"SAME_TX_RECIPIENT": "La adresito devas malsami ol la sendanto." "SAME_TX_RECIPIENT": "La adresito devas malsami ol la sendanto.",
"SELF_CERTIFICATION": "Vi ne povas certigi vian propran identecon.",
"TX_SANDBOX_FULL": "La nodo Duniter uzata de Cesium ne plu povas prilabori novajn elspezojn, ĉar ĝia atendovico estas plena.<br/><br/>Bonvolu provi denove poste aŭ ŝanĝi la nodon (en la <b>Agordoj</b>).",
"DOWNLOAD_TX_HISTORY_FAILED": "Eraro dum la elŝuto de la konta raporto"
}, },
"INFO": { "INFO": {
"POPUP_TITLE": "Informo", "POPUP_TITLE": "Informo",
...@@ -802,9 +842,12 @@ ...@@ -802,9 +842,12 @@
"REVOCATION_SENT": "Nuligo sendita", "REVOCATION_SENT": "Nuligo sendita",
"REVOCATION_SENT_WAITING_PROCESS": "La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.", "REVOCATION_SENT_WAITING_PROCESS": "La <b>nuligo de tiu ĉi identeco</b> estis petita kaj atendas traktadon.",
"FEATURES_NOT_IMPLEMENTED": "Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)", "FEATURES_NOT_IMPLEMENTED": "Tiu ĉi funkciaro ankoraŭ estas programiĝanta.<br/>Kial ne <b>kontribui al Cesium</b>, por ekhavi ĝin pli rapide? ;)",
"EMPTY_TX_HISTORY": "Neniu spezo elportota" "EMPTY_TX_HISTORY": "Neniu spezo elportota",
"LOADING_PENDING_TX": "Bonvolu pacienci...<br/><small>(Prenado de pendaj operacioj)</small>",
"FILE_DOWNLOADED": "Dosiero elŝutita"
}, },
"CONFIRM": { "CONFIRM": {
"CAN_CONTINUE": "<b>Ĉu vi certas</b>, ke vi volas daŭrigi?",
"POPUP_TITLE": "<b>Konfirmo</b>", "POPUP_TITLE": "<b>Konfirmo</b>",
"POPUP_WARNING_TITLE": "<b>Averto</b>", "POPUP_WARNING_TITLE": "<b>Averto</b>",
"POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Averto pri sekureco</b>", "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Averto pri sekureco</b>",
...@@ -829,7 +872,9 @@ ...@@ -829,7 +872,9 @@
"SAVE_BEFORE_LEAVE_TITLE": "Modifoj ne registritaj", "SAVE_BEFORE_LEAVE_TITLE": "Modifoj ne registritaj",
"LOGOUT": "Ĉu vi certas, ke vi volas malkonektiĝi?", "LOGOUT": "Ĉu vi certas, ke vi volas malkonektiĝi?",
"USE_FALLBACK_NODE": "Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?", "USE_FALLBACK_NODE": "Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?",
"ISSUE_524_SEND_LOG": "La spezo estis forĵetita, pro konata anomalio (petslipo #524) sed <b>ne ripetita</b>.<br/><br/>Por helpi la programistojn korekti tiun eraron, <b>ĉu vi akceptas la sendadon de viaj protokolaj dosieroj</b> per mesaĝo?<br/><small>(neniu konfidenca dateno estas sendita)</small>." "USE_SYNC_FALLBACK_NODE": "Ŝajnas, ke nodo <b>{{old}}</b> ne estas sinkronigita.<br/><br/>Ĉu vi volas provizore uzi la sinkronigitan nodon <b>{{new}}</b>?",
"ISSUE_524_SEND_LOG": "La spezo estis forĵetita, pro konata anomalio (petslipo #524) sed <b>ne ripetita</b>.<br/><br/>Por helpi la programistojn korekti tiun eraron, <b>ĉu vi akceptas la sendadon de viaj protokolaj dosieroj</b> per mesaĝo?<br/><small>(neniu konfidenca dateno estas sendita)</small>.",
"ENABLE_EXPERT_MODE_TO_CHANGE_NODE": "<b class=\"assertive\">Averto:</b> Ĉu vi volas <b>mane ŝanĝi</b> la nodon?<br/><br/>Se vi daŭrigas:<ul><li> - La <b>eksperta reĝimo</b> estos aktivigita;</li><li> - Vi povos reveni al aŭtomata nodo-selekto simple <b>malaktivigante la ekspertan reĝimon</b>.</li></ul>"
}, },
"MODE": { "MODE": {
"DEMO": { "DEMO": {
......